tx · 32RbsB3sDm6igTDkyjU39FDcKzFmod5wWwbeKKdns4D4

3N7LYefWk1WhvCsY5A9nTq244SbVPmhCypi:  -0.04000000 Waves

2022.07.29 14:05 [2161025] smart account 3N7LYefWk1WhvCsY5A9nTq244SbVPmhCypi > SELF 0.00000000 Waves

{ "type": 13, "id": "32RbsB3sDm6igTDkyjU39FDcKzFmod5wWwbeKKdns4D4", "fee": 4000000, "feeAssetId": null, "timestamp": 1659092779638, "version": 1, "sender": "3N7LYefWk1WhvCsY5A9nTq244SbVPmhCypi", "senderPublicKey": "4qGVXRFATZNzo2RZZ5UYHXojGyJgSRBwtgJcCU8rJe5A", "proofs": [ "Lw3t7JCUFggWvCrMg9ZM7CnbBqAMLbdDUWG8UbUUZNQ6vQd4B9P9rbJ6aSGy97BStEqDXSAAAjFgrBV2L3yPZ5j", "5C1rPDJeAR1swov9DLh2wCWoGue4dhCDT4Qo2XFuenBhUiKivAgNjJuSxDyFo5qSMLRnxsYhGn6SdUFysd1KXiG9", "3zwQwR3WB15SG1DiT9cujikPkX1nzp62YkN9AnJQJiqnp3bBtqWWPWnxCLab3rAiDQ9pbmCogHCU2cP6anN8KD1" ], "script": "base64:AAIFAAAAAAAAADkIAhIFCgMICAESAwoBARIHCgUBAQEBARIDCgEBEgQKAgECEgMKAQESABIFCgMBAQESBwoFAQEBAQEAAABOAAAAAAtyZXZpc2lvbk51bQIAAAAAAAAAAAlNVUxUU0NBTEUAAAAAAAAAAAgAAAAAB1NDQUxFMTYAAAAAAAAAABAAAAAAA1NFUAIAAAACX18AAAAABUhBTEY4AAAAAAAC+vCAAAAAAAhFVUxFUlgxNgkAATYAAAABAABgkqET2NV0AAAAAARUV09YCQABNgAAAAEAAAAAAAAAAAIAAAAABU1VTFQ2AAAAAAAAD0JAAAAAAAZNVUxUWDYJAAE2AAAAAQAAAAAAAA9CQAAAAAAFTVVMVDgAAAAAAAX14QAAAAAABk1VTFRYOAkAATYAAAABAAAAAAAF9eEAAAAAAAdNVUxUWDEwCQABNgAAAAEAAAAAAlQL5AAAAAAAB01VTFRYMTYJAAE2AAAAAQAAI4byb8EAAAAAAAAHV0FWRVNJRAkAAlkAAAABAgAAAAVXQVZFUwAAAAALa1Jlc3VsdElkeEEAAAAAAAAAAAAAAAAAD2tSZXN1bHRJZHhQYXVsQgAAAAAAAAAAAQAAAAAZa1Jlc3VsdElkeFdSZXNlcnZlc0luVXNkbgAAAAAAAAAAAgAAAAAQa1Jlc3VsdElkeE11bHRCUgAAAAAAAAAAAwAAAAATa1Jlc3VsdElkeE11bHRQb3dlcgAAAAAAAAAABAAAAAAba1Jlc3VsdElkeE11bHRFeHBJblBvd2VyU3RyAAAAAAAAAAAFAAAAABJrUmVzdWx0SWR4TXVsdEtTdHIAAAAAAAAAAAYAAAAAD25NZXRyaWNJZHhQcmljZQAAAAAAAAAAAAAAAAAbbk1ldHJpY0lkeFVzZG5Mb2NrZWRCYWxhbmNlAAAAAAAAAAABAAAAABxuTWV0cmljSWR4V2F2ZXNMb2NrZWRCYWxhbmNlAAAAAAAAAAACAAAAABFuTWV0cmljSWR4UmVzZXJ2ZQAAAAAAAAAAAwAAAAAXbk1ldHJpY0lkeFJlc2VydmVJblVzZG4AAAAAAAAAAAQAAAAAFG5NZXRyaWNJZHhVc2RuU3VwcGx5AAAAAAAAAAAFAAAAABFuTWV0cmljSWR4U3VycGx1cwAAAAAAAAAABgAAAAAYbk1ldHJpY0lkeFN1cnBsdXNQZXJjZW50AAAAAAAAAAAHAAAAAAxuTWV0cmljSWR4QlIAAAAAAAAAAAgAAAAAFG5NZXRyaWNJZHhOc2J0U3VwcGx5AAAAAAAAAAAJAAAAABduTWV0cmljSWR4TWF4TnNidFN1cHBseQAAAAAAAAAACgAAAAAUbk1ldHJpY0lkeFN1cmZTdXBwbHkAAAAAAAAAAAsBAAAAEmtleU5ldXRyaW5vQWRkcmVzcwAAAAACAAAAHSVzJXNfX2NvbmZpZ19fbmV1dHJpbm9BZGRyZXNzAQAAABNrZXlTd2FwQW1vdW50QVBhcmFtAAAAAAIAAAAYJXMlc19fY29uZmlnX19zd2FwQVBhcmFtAQAAABNrZXlTd2FwQW1vdW50QlBhcmFtAAAAAAIAAAAYJXMlc19fY29uZmlnX19zd2FwQlBhcmFtAQAAABJrZXlOZXV0cmlub0Fzc2V0SWQAAAAAAgAAABFuZXV0cmlub19hc3NldF9pZAEAAAAOa2V5TnNidEFzc2V0SWQAAAAAAgAAAA1ib25kX2Fzc2V0X2lkAQAAAA5rZXlTdXJmQXNzZXRJZAAAAAACAAAADXN1cmZfYXNzZXRfaWQBAAAAEGtleUJhbGFuY2VMb2NrZWQAAAAAAgAAAA1iYWxhbmNlX2xvY2tfAQAAABVrZXlXYXZlc0xvY2tlZEJhbGFuY2UAAAAACQABLAAAAAIJAQAAABBrZXlCYWxhbmNlTG9ja2VkAAAAAAIAAAAFd2F2ZXMBAAAAGGtleU5ldXRyaW5vTG9ja2VkQmFsYW5jZQAAAAAJAAEsAAAAAgkBAAAAEGtleUJhbGFuY2VMb2NrZWQAAAAAAgAAAAhuZXV0cmlubwEAAAARc3dhcHNUaW1lZnJhbWVLRVkAAAAAAgAAAA9zd2Fwc190aW1lZnJhbWUBAAAAGmtleVVzZXJMYXN0UXVpY2tTd2FwSGVpZ2h0AAAAAQAAAAt1c2VyQWRkcmVzcwkABLkAAAACCQAETAAAAAICAAAABCVzJXMJAARMAAAAAgIAAAAXdXNlckxhc3RRdWlja1N3YXBIZWlnaHQJAARMAAAAAgUAAAALdXNlckFkZHJlc3MFAAAAA25pbAUAAAADU0VQAQAAAB1rZXlRdWlja1N3YXBVc2VyU3BlbnRJblBlcmlvZAAAAAEAAAALdXNlckFk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SWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwAAAAAAAAAAACAAAAABRJZHhDb250cm9sQ2ZnUnBkRGFwcAAAAAAAAAAAAwAAAAAVSWR4Q29udHJvbENmZ01hdGhEYXBwAAAAAAAAAAAEAAAAABxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAAAAAAAAAAFAAAAABVJZHhDb250cm9sQ2ZnUmVzdERhcHAAAAAAAAAAAAYAAAAAHUlkeENvbnRyb2xDZmdOb2RlUmVnaXN0cnlEYXBwAAAAAAAAAAAHAAAAABxJZHhDb250cm9sQ2ZnTnNidFN0YWtpbmdEYXBwAAAAAAAAAAAIAAAAABlJZHhDb250cm9sQ2ZnTWVkaWF0b3JEYXBwAAAAAAAAAAAJAQAAABFrZXlDb250cm9sQWRkcmVzcwAAAAACAAAAHCVzJXNfX2NvbmZpZ19fY29udHJvbEFkZHJlc3MBAAAADWtleUNvbnRyb2xDZmcAAAAAAgAAABElc19fY29udHJvbENvbmZpZwEAAAAUcmVhZENvbnRyb2xDZmdPckZhaWwAAAABAAAAB2NvbnRyb2wJAAS1AAAAAgkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAAB2NvbnRyb2wJAQAAAA1rZXlDb250cm9sQ2ZnAAAAAAUAAAADU0VQAQAAABhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwAAAACAAAACmNvbnRyb2xDZmcAAAADaWR4CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkAAZEAAAACBQAAAApjb250cm9sQ2ZnBQAAAANpZHgJAAEsAAAAAgIAAAAtQ29udHJvbCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQABpAAAAAEFAAAAA2lkeAAAAAAPY29udHJvbENvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMJAQAAABFrZXlDb250cm9sQWRkcmVzcwAAAAACAAAAIzNONE5TN2Q0Sm85YTZGMTRMaUZVS0tZVmRVa2tmMmVQNFp4AAAAAApjb250cm9sQ2ZnCQEAAAAUcmVhZENvbnRyb2xDZmdPckZhaWwAAAABBQAAAA9jb250cm9sQ29udHJhY3QAAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwAAAACBQAAAApjb250cm9sQ2ZnBQAAABlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAAAAAA9hdWN0aW9uQ29udHJhY3QJAQAAABhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwAAAACBQAAAApjb250cm9sQ2ZnBQAAABhJZHhDb250cm9sQ2ZnQXVjdGlvbkRhcHAAAAAAE2xpcXVpZGF0aW9uQ29udHJhY3QJAQAAABhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwAAAACBQAAAApjb250cm9sQ2ZnBQAAABxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAAAAA9uZXV0cmlub0Fzc2V0SWQJAAJZAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABJrZXlOZXV0cmlub0Fzc2V0SWQAAAAAAAAAAAtuc2J0QXNzZXRJZAkAAlkAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAOa2V5TnNidEFzc2V0SWQAAAAAAAAAAAtzdXJmQXNzZXRJZAkAAlkAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAA9hdWN0aW9uQ29udHJhY3QJAQAAAA5rZXlTdXJmQXNzZXRJZAAAAAAAAAAJAAAAAWkBAAAAC2NvbnN0cnVjdG9yAAAAAwAAAA9uZXV0cmlub0FkZHJlc3MAAAAPbnNidExvY2tBZGRyZXNzAAAAEHN3YXBBbW91bnRBUGFyYW0DCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAAObm90IGF1dGhvcml6ZWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmtleU5ldXRyaW5vQWRkcmVzcwAAAAAFAAAAD25ldXRyaW5vQWRkcmVzcwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAE2tleVN3YXBBbW91bnRBUGFyYW0AAAAABQAAABBzd2FwQW1vdW50QVBhcmFtBQAAAANuaWwAAAABaQEAAAAVY2FsY1N3YXBMaW1pdFJFQURPTkxZAAAAAQAAAAtnTnNidEFtb3VudAQAAAALbGltaXRQYXJhbUEJAAE2AAAAAQkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMJAQAAABNrZXlTd2FwQW1vdW50QVBhcmFtAAAAAAQAAAALbGltaXRQYXJhbUIJAAE2AAAAAQkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMJAQAAABNrZXlTd2FwQW1vdW50QlBhcmFtAAAAAAQAAAASZ05zYnRBbW91bnRTY2FsZTE2CQEAAAAFdG9YMTYAAAACBQAAAAtnTnNidEFtb3VudAUAAAAFTVVMVDYEAAAADGxpbWl0UG93UGFydAkAAHYAAAAGBQAAABJnTnNidEFtb3VudFNjYWxlMTYAAAAAAAAAABAFAAAAC2xpbWl0UGFyYW1CAAAAAAAAAAAQAAAAAAAAAAAIBQAAAAdDRUlMSU5HBAAAAAVsaW1pdAkAATwAAAADBQAAAAtsaW1pdFBhcmFtQQUAAAAMbGltaXRQb3dQYXJ0BQAAAAdNVUxUWDEwCQAFFAAAAAIFAAAAA25pbAkAAaAAAAABBQAAAAVsaW1pdAAAAAFpAQAAABJjYWxjdWxhdGVLUkVBRE9OTFkAAAAFAAAABHdSYXcAAAAEdVJhdwAAAAVwcmljZQAAAARtUmF3AAAABHNSYXcEAAAAA0VYUAkAATYAAAABAAAAAAAAKXpJBAAAAAhFWFBTQ0FMRQAAAAAAAAAABgQAAAABYQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAA9hdWN0aW9uQ29udHJhY3QCAAAAEG5zYnRDdXJ2ZVBhcmFtX2EAAAAAAAAAAAMEAAAABXBhdWxCCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAAD2F1Y3Rpb25Db250cmFjdAIAAAAQbnNidEN1cnZlUGFyYW1fYgkAAGkAAAACCQAAaAAAAAIAAAAAAAAAAAMFAAAABU1VTFQ2AAAAAAAAAAAKBAAAAA93UmVzZXJ2ZXNJblVzZG4JAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAEd1JhdwUAAAAFcHJpY2UEAAAABm11bHRCUgkAAGsAAAADBQAAAA93UmVzZXJ2ZXNJblVzZG4FAAAABU1VTFQ4BQAAAAR1UmF3AwkAAGYAAAACBQAAAAZtdWx0QlIAAAAAAnx999AJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAA0JSPQkAAaQAAAABBQAAAAZtdWx0QlICAAAAJyA+IDEwNjc4LjU2NDgxNiUgd2lsbCBvdmVyZmxvdyBleHBvbmVudAQAAAAJbXVsdFBvd2VyCQAAaAAAAAIFAAAAAWEJAABlAAAAAgUAAAAGbXVsdEJSBQAAAAVNVUxUOAQAAAAObXVsdEV4cEluUG93ZXIJAAB2AAAABgUAAAADRVhQBQAAAAhFWFBTQ0FMRQkAATYAAAABBQAAAAltdWx0UG93ZXIFAAAACU1VTFRTQ0FMRQUAAAAHU0NBTEUxNgUAAAAERE9XTgQAAAAFbXVsdEsJAAE8AAAAAwkAATYAAAABBQAAAAVwYXVsQgUAAAAObXVsdEV4cEluUG93ZXIFAAAABk1VTFRYNgkABRQAAAACBQAAAANuaWwJAARMAAAAAgUAAAABYQkABEwAAAACBQAAAAVwYXVsQgkABEwAAAACBQAAAA93UmVzZXJ2ZXNJblVzZG4JAARMAAAAAgUAAAAGbXVsdEJSCQAETAAAAAIFAAAACW11bHRQb3dlcgkABEwAAAACCQABpgAAAAEFAAAADm11bHRFeHBJblBvd2VyCQAETAAAAAIJAAGmAAAAAQUAAAAFbXVsdEsFAAAAA25pbAAAAAFpAQAAABVjdXJ2ZUZ1bmN0aW9uUkVBRE9OTFkAAAABAAAAC3dhdmVzUGF5UmF3BAAAAA9uZXV0cmlub01ldHJpY3MJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAABHRoaXMCAAAAGmNhbGNOZXV0aW5vTWV0cmljc1JFQURPTkxZBQAAAANuaWwFAAAAA25pbAQAAAAFcHJpY2UJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAAA9uTWV0cmljSWR4UHJpY2UEAAAABHdSYXcJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABFuTWV0cmljSWR4UmVzZXJ2ZQQAAAAEdVJhdwkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAFG5NZXRyaWNJZHhVc2RuU3VwcGx5BAAAAARzUmF3CQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAD25ldXRyaW5vTWV0cmljcwUAAAAUbk1ldHJpY0lkeE5zYnRTdXBwbHkEAAAABG1SYXcJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABduTWV0cmljSWR4TWF4TnNidFN1cHBseQQAAAAKa0NhbGNBcnJheQkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAAEdGhpcwIAAAASY2FsY3VsYXRlS1JFQURPTkxZCQAETAAAAAIFAAAABHdSYXcJAARMAAAAAgUAAAAEdVJhdwkABEwAAAACBQAAAAVwcmljZQkABEwAAAACBQAAAARtUmF3CQAETAAAAAIFAAAABHNSYXcFAAAAA25pbAUAAAADbmlsBAAAAAVtdWx0SwkAAacAAAABCQEAAAAIYXNTdHJpbmcAAAABCQABkQAAAAIFAAAACmtDYWxjQXJyYXkFAAAAEmtSZXN1bHRJZHhNdWx0S1N0cgQAAAAHdXNkblBheQkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACBQAAAAt3YXZlc1BheVJhdwUAAAAFcHJpY2UEAAAAEGJpZ01heE5zYnRTdXBwbHkJAAE2AAAAAQUAAAAEbVJhdwQAAAANYmlnTnNidFN1cHBseQkAATYAAAABCQAAZQAAAAIFAAAABG1SYXcFAAAABHNSYXcEAAAABXN0ZXAxCQABPAAAAAMJAAE2AAAAAQUAAAAHdXNkblBheQUAAAAHTVVMVFgxNgUAAAAFbXVsdEsEAAAABXN0ZXAyCQABPAAAAAMFAAAABXN0ZXAxBQAAAA1iaWdOc2J0U3VwcGx5BQAAABBiaWdNYXhOc2J0U3VwcGx5BAAAAAVzdGVwMwkAAaAAAAABCQABPAAAAAMFAAAADWJpZ05zYnRTdXBwbHkFAAAAEGJpZ01heE5zYnRTdXBwbHkJAAE3AAAAAgUAAAAFc3RlcDIFAAAAEGJpZ01h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BEwAAAACBQAAAAZzdXBwbHkJAARMAAAAAgUAAAACQlIJAARMAAAAAgkAAGQAAAACBQAAAAdyZXNlcnZlBQAAAAl1c2VBbW91bnQJAARMAAAAAgUAAAAGc3VwcGx5CQAETAAAAAIJAABrAAAAAwkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACCQAAZAAAAAIFAAAAB3Jlc2VydmUFAAAACXVzZUFtb3VudAUAAAAFcHJpY2UFAAAABU1VTFQ2BQAAAAZzdXBwbHkJAARMAAAAAgkAAGUAAAACBQAAAAZhbW91bnQFAAAACXVzZUFtb3VudAkABEwAAAACBQAAAAVwcmljZQUAAAADbmlsCQAAAgAAAAECAAAAEVVuc3VwcG9ydGVkIGFzc2V0AAAAAWkBAAAAIGNhbGNDb250cmFjdE5zYnRQcmljZVNZU1JFQURPTkxZAAAAAQAAAA9uc2J0U3VwcGx5REVMVEEEAAAAD25ldXRyaW5vTWV0cmljcwkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAAEdGhpcwIAAAAaY2FsY05ldXRpbm9NZXRyaWNzUkVBRE9OTFkFAAAAA25pbAUAAAADbmlsBAAAAAVwcmljZQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAD25NZXRyaWNJZHhQcmljZQQAAAAEd1JhdwkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAEW5NZXRyaWNJZHhSZXNlcnZlBAAAAAR1UmF3CQAAZQAAAAIJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABRuTWV0cmljSWR4VXNkblN1cHBseQUAAAAPbnNidFN1cHBseURFTFRBBAAAAARzUmF3CQAAZAAAAAIJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABRuTWV0cmljSWR4TnNidFN1cHBseQUAAAAPbnNidFN1cHBseURFTFRBBAAAAARtUmF3CQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAD25ldXRyaW5vTWV0cmljcwUAAAAXbk1ldHJpY0lkeE1heE5zYnRTdXBwbHkEAAAACmtDYWxjQXJyYXkJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAABHRoaXMCAAAAEmNhbGN1bGF0ZUtSRUFET05MWQkABEwAAAACBQAAAAR3UmF3CQAETAAAAAIFAAAABHVSYXcJAARMAAAAAgUAAAAFcHJpY2UJAARMAAAAAgUAAAAEbVJhdwkABEwAAAACBQAAAARzUmF3BQAAAANuaWwFAAAAA25pbAQAAAAIbXVsdEtYMTYJAAGnAAAAAQkBAAAACGFzU3RyaW5nAAAAAQkAAZEAAAACBQAAAAprQ2FsY0FycmF5BQAAABJrUmVzdWx0SWR4TXVsdEtTdHIEAAAADG11bHRTdGVwMVgxNgkAATwAAAADCQABNgAAAAEFAAAABG1SYXcFAAAAB01VTFRYMTYJAAE2AAAAAQkAAGUAAAACBQAAAARtUmF3BQAAAARzUmF3BAAAAAxtdWx0U3RlcDJYMTYJAAE8AAAAAwUAAAAMbXVsdFN0ZXAxWDE2BQAAAAxtdWx0U3RlcDFYMTYFAAAAB01VTFRYMTYEAAAAFW11bHROc2J0MnVzZG5QcmljZVgxNgkAATwAAAADBQAAAAhtdWx0S1gxNgUAAAAMbXVsdFN0ZXAyWDE2BQAAAAdNVUxUWDE2BAAAAA5uc2J0MnVzZG5QcmljZQkAAaAAAAABCQABPAAAAAMFAAAAFW11bHROc2J0MnVzZG5QcmljZVgxNgkAATYAAAABBQAAAAVNVUxUNgUAAAAHTVVMVFgxNgQAAAAPbnNidDJ3YXZlc1ByaWNlCQAAawAAAAMFAAAADm5zYnQydXNkblByaWNlBQAAAAVNVUxUNgUAAAAFcHJpY2UJAAUUAAAAAgUAAAADbmlsCQAETAAAAAIFAAAADm5zYnQydXNkblByaWNlCQAETAAAAAIFAAAAD25zYnQyd2F2ZXNQcmljZQUAAAADbmlsAAAAAWkBAAAAGmNhbGNOZXV0aW5vTWV0cmljc1JFQURPTkxZAAAAAAQAAAAMY3VycmVudFByaWNlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAA9jb250cm9sQ29udHJhY3QJAQAAAAhrZXlQcmljZQAAAAAEAAAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAYa2V5TmV1dHJpbm9Mb2NrZWRCYWxhbmNlAAAAAAAAAAAAAAAAAAQAAAASd2F2ZXNMb2NrZWRCYWxhbmNlCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABVrZXlXYXZlc0xvY2tlZEJhbGFuY2UAAAAAAAAAAAAAAAAABAAAAAdyZXNlcnZlCQAAZQAAAAIICQAD7wAAAAEFAAAAEG5ldXRyaW5vQ29udHJhY3QAAAAHcmVndWxhcgUAAAASd2F2ZXNMb2NrZWRCYWxhbmNlBAAAAA5yZXNlcnZlc0luVXNkbgkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACBQAAAAdyZXNlcnZlBQAAAAxjdXJyZW50UHJpY2UEAAAADm5ldXRyaW5vU3VwcGx5CQAAZQAAAAIJAABlAAAAAgkAAGQAAAACBQAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAAD25ldXRyaW5vQXNzZXRJZAAAAAhxdWFudGl0eQkAA/AAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAAA9uZXV0cmlub0Fzc2V0SWQJAAPwAAAAAgUAAAATbGlxdWlkYXRpb25Db250cmFjdAUAAAAPbmV1dHJpbm9Bc3NldElkBAAAAAdzdXJwbHVzCQAAZQAAAAIFAAAADnJlc2VydmVzSW5Vc2RuBQAAAA5uZXV0cmlub1N1cHBseQQAAAAHZGVmaWNpdAkAAGUAAAACBQAAAA5uZXV0cmlub1N1cHBseQUAAAAOcmVzZXJ2ZXNJblVzZG4EAAAADnN1cnBsdXNQZXJjZW50AwkAAAAAAAACBQAAAA5uZXV0cmlub1N1cHBseQAAAAAAAAAAAAAAAAAAAAAAAAkAAGgAAAACCQAAawAAAAMFAAAAB3N1cnBsdXMFAAAABU1VTFQ2BQAAAA5uZXV0cmlub1N1cHBseQAAAAAAAAAAZAQAAAACQlIDCQAAAAAAAAIFAAAADm5ldXRyaW5vU3VwcGx5AAAAAAAAAAAAAAAAAAAAAAAACQAAawAAAAMFAAAADnJl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", "chainId": 84, "height": 2161025, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5s3GhKTTrHxDhaSRzxDtkSrN7LvTeiwxTtxqK9rRqfG5 Next: 99ggbwBHuSHeyEVwqq8W3s6EfyfRP9ncwEccvc6eY1TW Diff:
OldNewDifferences
7979 func keyNeutrinoAssetId () = "neutrino_asset_id"
8080
8181
82-func keyLiquidationContractAddress () = "liquidation_contract"
83-
84-
85-func keyAuctionContract () = "auction_contract"
86-
87-
88-func keyContolContract () = "control_contract"
89-
90-
9182 func keyNsbtAssetId () = "bond_asset_id"
9283
9384
163154 }
164155
165156
166-let neutrinoContract = addressFromStringValue(getStringOrFail(this, keyNeutrinoAddress()))
157+let IdxControlCfgNeutrinoDapp = 1
167158
168-let controlContract = addressFromStringValue(getStringOrFail(neutrinoContract, keyContolContract()))
159+let IdxControlCfgAuctionDapp = 2
169160
170-let auctionContract = addressFromStringValue(getStringOrFail(neutrinoContract, keyAuctionContract()))
161+let IdxControlCfgRpdDapp = 3
171162
172-let liquidationContract = addressFromStringValue(getStringOrFail(neutrinoContract, keyLiquidationContractAddress()))
163+let IdxControlCfgMathDapp = 4
164+
165+let IdxControlCfgLiquidationDapp = 5
166+
167+let IdxControlCfgRestDapp = 6
168+
169+let IdxControlCfgNodeRegistryDapp = 7
170+
171+let IdxControlCfgNsbtStakingDapp = 8
172+
173+let IdxControlCfgMediatorDapp = 9
174+
175+func keyControlAddress () = "%s%s__config__controlAddress"
176+
177+
178+func keyControlCfg () = "%s__controlConfig"
179+
180+
181+func readControlCfgOrFail (control) = split(getStringOrFail(control, keyControlCfg()), SEP)
182+
183+
184+func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
185+
186+
187+let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx"))
188+
189+let controlCfg = readControlCfgOrFail(controlContract)
190+
191+let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
192+
193+let auctionContract = getContractAddressOrFail(controlCfg, IdxControlCfgAuctionDapp)
194+
195+let liquidationContract = getContractAddressOrFail(controlCfg, IdxControlCfgLiquidationDapp)
173196
174197 let neutrinoAssetId = fromBase58String(getStringOrFail(neutrinoContract, keyNeutrinoAssetId()))
175198
205228 let wReservesInUsdn = convertWavesToNeutrino(wRaw, price)
206229 let multBR = fraction(wReservesInUsdn, MULT8, uRaw)
207230 if ((multBR > 10678564816))
208- then throw("BR > 10678.564816% will overflow exponent")
231+ then throw((("BR=" + toString(multBR)) + " > 10678.564816% will overflow exponent"))
209232 else {
210233 let multPower = (a * (multBR - MULT8))
211234 let multExpInPower = pow(EXP, EXPSCALE, toBigInt(multPower), MULTSCALE, SCALE16, DOWN)
334357
335358 @Verifier(tx)
336359 func verify () = {
337- let pubKeyAdminsListStr = makeString(["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"], SEP)
360+ let pubKeyAdminsListStr = makeString(["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR"], SEP)
338361 let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
339362 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
340363 then 1
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let revisionNum = ""
55
66 let MULTSCALE = 8
77
88 let SCALE16 = 16
99
1010 let SEP = "__"
1111
1212 let HALF8 = 50000000
1313
1414 let EULERX16 = toBigInt(27182818284590452)
1515
1616 let TWOX = toBigInt(2)
1717
1818 let MULT6 = 1000000
1919
2020 let MULTX6 = toBigInt(1000000)
2121
2222 let MULT8 = 100000000
2323
2424 let MULTX8 = toBigInt(100000000)
2525
2626 let MULTX10 = toBigInt(10000000000)
2727
2828 let MULTX16 = toBigInt(10000000000000000)
2929
3030 let WAVESID = fromBase58String("WAVES")
3131
3232 let kResultIdxA = 0
3333
3434 let kResultIdxPaulB = 1
3535
3636 let kResultIdxWReservesInUsdn = 2
3737
3838 let kResultIdxMultBR = 3
3939
4040 let kResultIdxMultPower = 4
4141
4242 let kResultIdxMultExpInPowerStr = 5
4343
4444 let kResultIdxMultKStr = 6
4545
4646 let nMetricIdxPrice = 0
4747
4848 let nMetricIdxUsdnLockedBalance = 1
4949
5050 let nMetricIdxWavesLockedBalance = 2
5151
5252 let nMetricIdxReserve = 3
5353
5454 let nMetricIdxReserveInUsdn = 4
5555
5656 let nMetricIdxUsdnSupply = 5
5757
5858 let nMetricIdxSurplus = 6
5959
6060 let nMetricIdxSurplusPercent = 7
6161
6262 let nMetricIdxBR = 8
6363
6464 let nMetricIdxNsbtSupply = 9
6565
6666 let nMetricIdxMaxNsbtSupply = 10
6767
6868 let nMetricIdxSurfSupply = 11
6969
7070 func keyNeutrinoAddress () = "%s%s__config__neutrinoAddress"
7171
7272
7373 func keySwapAmountAParam () = "%s%s__config__swapAParam"
7474
7575
7676 func keySwapAmountBParam () = "%s%s__config__swapBParam"
7777
7878
7979 func keyNeutrinoAssetId () = "neutrino_asset_id"
8080
8181
82-func keyLiquidationContractAddress () = "liquidation_contract"
83-
84-
85-func keyAuctionContract () = "auction_contract"
86-
87-
88-func keyContolContract () = "control_contract"
89-
90-
9182 func keyNsbtAssetId () = "bond_asset_id"
9283
9384
9485 func keySurfAssetId () = "surf_asset_id"
9586
9687
9788 func keyBalanceLocked () = "balance_lock_"
9889
9990
10091 func keyWavesLockedBalance () = (keyBalanceLocked() + "waves")
10192
10293
10394 func keyNeutrinoLockedBalance () = (keyBalanceLocked() + "neutrino")
10495
10596
10697 func swapsTimeframeKEY () = "swaps_timeframe"
10798
10899
109100 func keyUserLastQuickSwapHeight (userAddress) = makeString(["%s%s", "userLastQuickSwapHeight", userAddress], SEP)
110101
111102
112103 func keyQuickSwapUserSpentInPeriod (userAddress) = makeString(["%s%s", "quickSwapUserSpentInPeriod", userAddress], SEP)
113104
114105
115106 func keyPrice () = "price"
116107
117108
118109 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
119110
120111
121112 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
122113
123114
124115 func getNumberByKey (address,key) = valueOrElse(getInteger(address, key), 0)
125116
126117
127118 func getBoolOrFail (address,key) = valueOrErrorMessage(getBoolean(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
128119
129120
130121 func convertNeutrinoToWaves (amount,price) = fraction(amount, MULT8, price)
131122
132123
133124 func convertWavesToNeutrino (amount,price) = fraction(amount, price, MULT8)
134125
135126
136127 func toX16 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULTX16, toBigInt(origScaleMult))
137128
138129
139130 func fromX16 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULTX16))
140131
141132
142133 func asAnyList (val) = match val {
143134 case valAnyLyst: List[Any] =>
144135 valAnyLyst
145136 case _ =>
146137 throw("fail to cast into List[Any]")
147138 }
148139
149140
150141 func asInt (val) = match val {
151142 case valInt: Int =>
152143 valInt
153144 case _ =>
154145 throw("fail to cast into Int")
155146 }
156147
157148
158149 func asString (val) = match val {
159150 case valStr: String =>
160151 valStr
161152 case _ =>
162153 throw("fail to cast into String")
163154 }
164155
165156
166-let neutrinoContract = addressFromStringValue(getStringOrFail(this, keyNeutrinoAddress()))
157+let IdxControlCfgNeutrinoDapp = 1
167158
168-let controlContract = addressFromStringValue(getStringOrFail(neutrinoContract, keyContolContract()))
159+let IdxControlCfgAuctionDapp = 2
169160
170-let auctionContract = addressFromStringValue(getStringOrFail(neutrinoContract, keyAuctionContract()))
161+let IdxControlCfgRpdDapp = 3
171162
172-let liquidationContract = addressFromStringValue(getStringOrFail(neutrinoContract, keyLiquidationContractAddress()))
163+let IdxControlCfgMathDapp = 4
164+
165+let IdxControlCfgLiquidationDapp = 5
166+
167+let IdxControlCfgRestDapp = 6
168+
169+let IdxControlCfgNodeRegistryDapp = 7
170+
171+let IdxControlCfgNsbtStakingDapp = 8
172+
173+let IdxControlCfgMediatorDapp = 9
174+
175+func keyControlAddress () = "%s%s__config__controlAddress"
176+
177+
178+func keyControlCfg () = "%s__controlConfig"
179+
180+
181+func readControlCfgOrFail (control) = split(getStringOrFail(control, keyControlCfg()), SEP)
182+
183+
184+func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
185+
186+
187+let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx"))
188+
189+let controlCfg = readControlCfgOrFail(controlContract)
190+
191+let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
192+
193+let auctionContract = getContractAddressOrFail(controlCfg, IdxControlCfgAuctionDapp)
194+
195+let liquidationContract = getContractAddressOrFail(controlCfg, IdxControlCfgLiquidationDapp)
173196
174197 let neutrinoAssetId = fromBase58String(getStringOrFail(neutrinoContract, keyNeutrinoAssetId()))
175198
176199 let nsbtAssetId = fromBase58String(getStringValue(neutrinoContract, keyNsbtAssetId()))
177200
178201 let surfAssetId = fromBase58String(getStringValue(auctionContract, keySurfAssetId()))
179202
180203 @Callable(i)
181204 func constructor (neutrinoAddress,nsbtLockAddress,swapAmountAParam) = if ((i.caller != this))
182205 then throw("not authorized")
183206 else [StringEntry(keyNeutrinoAddress(), neutrinoAddress), IntegerEntry(keySwapAmountAParam(), swapAmountAParam)]
184207
185208
186209
187210 @Callable(i)
188211 func calcSwapLimitREADONLY (gNsbtAmount) = {
189212 let limitParamA = toBigInt(getIntOrFail(this, keySwapAmountAParam()))
190213 let limitParamB = toBigInt(getIntOrFail(this, keySwapAmountBParam()))
191214 let gNsbtAmountScale16 = toX16(gNsbtAmount, MULT6)
192215 let limitPowPart = pow(gNsbtAmountScale16, 16, limitParamB, 16, 8, CEILING)
193216 let limit = fraction(limitParamA, limitPowPart, MULTX10)
194217 $Tuple2(nil, toInt(limit))
195218 }
196219
197220
198221
199222 @Callable(i)
200223 func calculateKREADONLY (wRaw,uRaw,price,mRaw,sRaw) = {
201224 let EXP = toBigInt(2718281)
202225 let EXPSCALE = 6
203226 let a = valueOrElse(getInteger(auctionContract, "nsbtCurveParam_a"), 3)
204227 let paulB = valueOrElse(getInteger(auctionContract, "nsbtCurveParam_b"), ((3 * MULT6) / 10))
205228 let wReservesInUsdn = convertWavesToNeutrino(wRaw, price)
206229 let multBR = fraction(wReservesInUsdn, MULT8, uRaw)
207230 if ((multBR > 10678564816))
208- then throw("BR > 10678.564816% will overflow exponent")
231+ then throw((("BR=" + toString(multBR)) + " > 10678.564816% will overflow exponent"))
209232 else {
210233 let multPower = (a * (multBR - MULT8))
211234 let multExpInPower = pow(EXP, EXPSCALE, toBigInt(multPower), MULTSCALE, SCALE16, DOWN)
212235 let multK = fraction(toBigInt(paulB), multExpInPower, MULTX6)
213236 $Tuple2(nil, [a, paulB, wReservesInUsdn, multBR, multPower, toString(multExpInPower), toString(multK)])
214237 }
215238 }
216239
217240
218241
219242 @Callable(i)
220243 func curveFunctionREADONLY (wavesPayRaw) = {
221244 let neutrinoMetrics = asAnyList(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
222245 let price = asInt(neutrinoMetrics[nMetricIdxPrice])
223246 let wRaw = asInt(neutrinoMetrics[nMetricIdxReserve])
224247 let uRaw = asInt(neutrinoMetrics[nMetricIdxUsdnSupply])
225248 let sRaw = asInt(neutrinoMetrics[nMetricIdxNsbtSupply])
226249 let mRaw = asInt(neutrinoMetrics[nMetricIdxMaxNsbtSupply])
227250 let kCalcArray = asAnyList(invoke(this, "calculateKREADONLY", [wRaw, uRaw, price, mRaw, sRaw], nil))
228251 let multK = parseBigIntValue(asString(kCalcArray[kResultIdxMultKStr]))
229252 let usdnPay = convertWavesToNeutrino(wavesPayRaw, price)
230253 let bigMaxNsbtSupply = toBigInt(mRaw)
231254 let bigNsbtSupply = toBigInt((mRaw - sRaw))
232255 let step1 = fraction(toBigInt(usdnPay), MULTX16, multK)
233256 let step2 = fraction(step1, bigNsbtSupply, bigMaxNsbtSupply)
234257 let step3 = toInt(fraction(bigNsbtSupply, bigMaxNsbtSupply, (step2 + bigMaxNsbtSupply)))
235258 let nsbtAmountRaw = ((mRaw - sRaw) - step3)
236259 $Tuple2(nil, [nsbtAmountRaw, usdnPay, wRaw, uRaw, mRaw, sRaw, asInt(kCalcArray[kResultIdxA]), asInt(kCalcArray[kResultIdxPaulB]), asInt(kCalcArray[kResultIdxWReservesInUsdn]), price, asInt(kCalcArray[kResultIdxMultBR]), asInt(kCalcArray[kResultIdxMultPower]), kCalcArray[kResultIdxMultExpInPowerStr], kCalcArray[kResultIdxMultKStr], toString(step1), toString(step2), step3])
237260 }
238261
239262
240263
241264 @Callable(i)
242265 func surfFunctionREADONLY (amount,assetId) = if ((0 > amount))
243266 then throw("amount should be positive")
244267 else {
245268 let neutrinoMetrics = asAnyList(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
246269 let price = asInt(neutrinoMetrics[nMetricIdxPrice])
247270 let priceBig = toBigInt(price)
248271 let reserve = asInt(neutrinoMetrics[nMetricIdxReserve])
249272 let reserveBig = toBigInt(reserve)
250273 let supply = asInt(neutrinoMetrics[nMetricIdxUsdnSupply])
251274 let supplyBig = toBigInt(supply)
252275 let BR = asInt(neutrinoMetrics[nMetricIdxBR])
253276 if ((BR >= MULT6))
254277 then throw((("BR = " + toString(BR)) + ", cannot buy SURF"))
255278 else {
256279 let maxWavesPay = (fraction(supply, MULT8, price) - reserve)
257280 let maxUsdnPay = (supply - fraction(reserve, price, MULT8))
258281 let useAmount = if ((assetId == neutrinoAssetId))
259282 then if ((amount > maxUsdnPay))
260283 then maxUsdnPay
261284 else amount
262285 else if ((assetId == WAVESID))
263286 then if ((amount > maxWavesPay))
264287 then maxWavesPay
265288 else amount
266289 else 0
267290 let amountBig = toBigInt(useAmount)
268291 if ((assetId == neutrinoAssetId))
269292 then $Tuple2(nil, [toInt(fraction(fraction(amountBig, MULTX8, priceBig), (supplyBig - (amountBig / TWOX)), reserveBig)), 0, useAmount, reserve, supply, BR, reserve, (supply - useAmount), fraction(convertWavesToNeutrino(reserve, price), MULT6, (supply - useAmount)), (amount - useAmount), price])
270293 else if ((assetId == WAVESID))
271294 then $Tuple2(nil, [toInt(fraction(supplyBig, log(fraction((reserveBig + amountBig), MULTX16, reserveBig), 16, EULERX16, 16, 16, HALFUP), MULTX16)), useAmount, 0, reserve, supply, BR, (reserve + useAmount), supply, fraction(convertWavesToNeutrino((reserve + useAmount), price), MULT6, supply), (amount - useAmount), price])
272295 else throw("Unsupported asset")
273296 }
274297 }
275298
276299
277300
278301 @Callable(i)
279302 func calcContractNsbtPriceSYSREADONLY (nsbtSupplyDELTA) = {
280303 let neutrinoMetrics = asAnyList(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
281304 let price = asInt(neutrinoMetrics[nMetricIdxPrice])
282305 let wRaw = asInt(neutrinoMetrics[nMetricIdxReserve])
283306 let uRaw = (asInt(neutrinoMetrics[nMetricIdxUsdnSupply]) - nsbtSupplyDELTA)
284307 let sRaw = (asInt(neutrinoMetrics[nMetricIdxNsbtSupply]) + nsbtSupplyDELTA)
285308 let mRaw = asInt(neutrinoMetrics[nMetricIdxMaxNsbtSupply])
286309 let kCalcArray = asAnyList(invoke(this, "calculateKREADONLY", [wRaw, uRaw, price, mRaw, sRaw], nil))
287310 let multKX16 = parseBigIntValue(asString(kCalcArray[kResultIdxMultKStr]))
288311 let multStep1X16 = fraction(toBigInt(mRaw), MULTX16, toBigInt((mRaw - sRaw)))
289312 let multStep2X16 = fraction(multStep1X16, multStep1X16, MULTX16)
290313 let multNsbt2usdnPriceX16 = fraction(multKX16, multStep2X16, MULTX16)
291314 let nsbt2usdnPrice = toInt(fraction(multNsbt2usdnPriceX16, toBigInt(MULT6), MULTX16))
292315 let nsbt2wavesPrice = fraction(nsbt2usdnPrice, MULT6, price)
293316 $Tuple2(nil, [nsbt2usdnPrice, nsbt2wavesPrice])
294317 }
295318
296319
297320
298321 @Callable(i)
299322 func calcNeutinoMetricsREADONLY () = {
300323 let currentPrice = getIntegerValue(controlContract, keyPrice())
301324 let neutrinoLockedBalance = valueOrElse(getInteger(neutrinoContract, keyNeutrinoLockedBalance()), 0)
302325 let wavesLockedBalance = valueOrElse(getInteger(neutrinoContract, keyWavesLockedBalance()), 0)
303326 let reserve = (wavesBalance(neutrinoContract).regular - wavesLockedBalance)
304327 let reservesInUsdn = convertWavesToNeutrino(reserve, currentPrice)
305328 let neutrinoSupply = (((neutrinoLockedBalance + value(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(liquidationContract, neutrinoAssetId))
306329 let surplus = (reservesInUsdn - neutrinoSupply)
307330 let deficit = (neutrinoSupply - reservesInUsdn)
308331 let surplusPercent = if ((neutrinoSupply == 0))
309332 then 0
310333 else (fraction(surplus, MULT6, neutrinoSupply) * 100)
311334 let BR = if ((neutrinoSupply == 0))
312335 then 0
313336 else fraction(reservesInUsdn, MULT6, neutrinoSupply)
314337 let nsbtSupplyMAX = value(assetInfo(nsbtAssetId)).quantity
315338 let nsbtSupply = (nsbtSupplyMAX - assetBalance(auctionContract, nsbtAssetId))
316339 let surfSupply = value(assetInfo(surfAssetId)).quantity
317340 $Tuple2(nil, [currentPrice, neutrinoLockedBalance, wavesLockedBalance, reserve, reservesInUsdn, neutrinoSupply, surplus, surplusPercent, BR, nsbtSupply, nsbtSupplyMAX, surfSupply])
318341 }
319342
320343
321344
322345 @Callable(i)
323346 func getUnstakeComissionAmountREADONLY (amount,startHeight,halfLife) = $Tuple2(nil, fraction(amount, pow(2, 0, fraction(-((height - startHeight)), MULT8, halfLife), 8, 8, HALFUP), MULT8))
324347
325348
326349
327350 @Callable(i)
328351 func mergeStakesREADONLY (amount1,height1,amount2,height2,halfLife) = {
329352 let w = fraction(amount2, pow(2, 0, fraction((height2 - height1), MULT8, halfLife), 8, 8, HALFUP), MULT8)
330353 let v = fraction((amount1 + amount2), MULT8, (amount1 + w))
331354 $Tuple2(nil, (height1 + ((HALF8 - (halfLife * log(v, 8, 2, 0, 8, HALFUP))) / MULT8)))
332355 }
333356
334357
335358 @Verifier(tx)
336359 func verify () = {
337- let pubKeyAdminsListStr = makeString(["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"], SEP)
360+ let pubKeyAdminsListStr = makeString(["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR"], SEP)
338361 let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
339362 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
340363 then 1
341364 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
342365 then 1
343366 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
344367 then 1
345368 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
346369 then 2
347370 else 0))
348371 (count >= 3)
349372 }
350373

github/deemru/w8io/3ef1775 
110.18 ms