tx · 66ZEkRUrY1ExfLKdxoapcqLbQajvCo3zLgXvXvKzzyem

3N4uGx1TxqnDvwwkWrMRGt8QLndoXfv94XA:  -0.01000000 Waves

2023.08.17 13:36 [2714487] smart account 3N4uGx1TxqnDvwwkWrMRGt8QLndoXfv94XA > SELF 0.00000000 Waves

{ "type": 13, "id": "66ZEkRUrY1ExfLKdxoapcqLbQajvCo3zLgXvXvKzzyem", "fee": 1000000, "feeAssetId": null, "timestamp": 1692268584418, "version": 2, "chainId": 84, "sender": "3N4uGx1TxqnDvwwkWrMRGt8QLndoXfv94XA", "senderPublicKey": "89h538b3VAkKVKQ3w7MYC23LAheeX7scdu4WQwEEHGGr", "proofs": [ "RHSojYiQWxMPWyStVFnx8XZHBVD9XSppZNY95FomLmu8A6DLLnsDEUJKqfWgbm9G9qkLKQF1YAENy3rrBkvebyQ" ], "script": "base64:BgImCAISBAoCCBgSABIAEgUKAwQBCBIAEgMKAQESAwoBARIAEgMKAQEpAAdrQWN0aXZlAgZhY3RpdmUAC2tBY3RpdmVHbG9iAhRhY3RpdmVfYWxsX2NvbnRyYWN0cwAGa0NhdXNlAg5zaHV0ZG93bl9jYXVzZQAMa1VTRE5BZGRyZXNzAhhzdGFraW5nX3VzZG5uc2J0X2FkZHJlc3MADGtFVVJOQWRkcmVzcwIUc3Rha2luZ19ldXJuX2FkZHJlc3MADGtMZWFzaW5nUG9vbAIPbGVhc2luZ19hZGRyZXNzAA5rTGVhc2luZ0Ftb3VudAIObGVhc2luZ19hbW91bnQACmtMZWFzaW5nSWQCCmxlYXNpbmdfaWQADWtBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA1rQWRtaW5QdWJLZXkyAgthZG1pbl9wdWJfMgANa0FkbWluUHViS2V5MwILYWRtaW5fcHViXzMAEmtBZG1pbkludm9rZVB1YktleQIQYWRtaW5faW52b2tlX3B1YgANa0NwbW1Db250cmFjdAINY3BtbV9jb250cmFjdAAMa1VTRE5Bc3NldElkAg11c2RuX2Fzc2V0X2lkAAxrRVVSTkFzc2V0SWQCDWV1cm5fYXNzZXRfaWQADmtTdGFraW5nQXNzZXRzAg5zdGFraW5nX2Fzc2V0cwANa1NoYXJlQXNzZXRJZAIOc2hhcmVfYXNzZXRfaWQABm9yYWNsZQkBB0FkZHJlc3MBARoBVEgTlwzA0zPMJTKAtin3p2RogKvjzHtLmQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEDa2V5BAckbWF0Y2gwCQCdCAIFBm9yYWNsZQUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgEJAKwCAgUDa2V5AghpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MwARYWRtaW5QdWJLZXlJbnZva2UJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUSa0FkbWluSW52b2tlUHViS2V5ABJzdGFraW5nVVNETkFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrVVNETkFkZHJlc3MAEnN0YWtpbmdFVVJOQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtFVVJOQWRkcmVzcwAMY3BtbUNvbnRyYWN0CQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0NwbW1Db250cmFjdAAEVVNETgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrVVNETkFzc2V0SWQABEVVUk4JARNnZXRCYXNlNThGcm9tT3JhY2xlAQUMa0VVUk5Bc3NldElkAA1zdGFraW5nQXNzZXRzCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFDmtTdGFraW5nQXNzZXRzAAphY3RpdmVHbG9iCQELdmFsdWVPckVsc2UCCQCbCAIFBm9yYWNsZQULa0FjdGl2ZUdsb2IGAAZhY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYBCGlzQWN0aXZlAAMDBQZhY3RpdmUFCmFjdGl2ZUdsb2IHBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAEOaXNHbG9iYWxDYWxsZXIBBmNhbGxlcgMJAAACBQZjYWxsZXIFDGNwbW1Db250cmFjdAUEdW5pdAkAAgECLU9ubHkgZ2xvYmFsIENvbnRyYWN0IGNhbiBpbnZva2UgdGhpcyBmdW5jdGlvbgELaXNBZG1pbkNhbGwBDGNhbGxlclB1YktleQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwFDGNhbGxlclB1YktleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEHc3VzcGVuZAEFY2F1c2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtDYXVzZQUFY2F1c2UFA25pbAEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgVzdGFrZQdhc3NldElkAwUFc3Rha2UDCQAAAgUHYXNzZXRJZAUEVVNETgkAlAoCAgxsb2NrTmV1dHJpbm8FEnN0YWtpbmdVU0ROQWRkcmVzcwkAlAoCAgxzdGFydFN0YWtpbmcFEnN0YWtpbmdFVVJOQWRkcmVzcwMJAAACBQdhc3NldElkBQRVU0ROCQCUCgICDnVubG9ja05ldXRyaW5vBRJzdGFraW5nVVNETkFkZHJlc3MJAJQKAgILc3RvcFN0YWtpbmcFEnN0YWtpbmdFVVJOQWRkcmVzcwERY2FsY1N0YWtpbmdQYXJhbXMDBXN0YWtlBmFtb3VudAdhc3NldElkAwUFc3Rha2UECyR0MDI1OTMyNjU5CQEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgUFc3Rha2UFB2Fzc2V0SWQEBGNhbGwIBQskdDAyNTkzMjY1OQJfMQQLc3Rha2luZ0FkZHIIBQskdDAyNTkzMjY1OQJfMgkAlgoEBQRjYWxsBQtzdGFraW5nQWRkcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQdhc3NldElkBQZhbW91bnQFA25pbAQLJHQwMjc0NTI4MTEJARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBQVzdGFrZQUHYXNzZXRJZAQEY2FsbAgFCyR0MDI3NDUyODExAl8xBAtzdGFraW5nQWRkcggFCyR0MDI3NDUyODExAl8yCQCWCgQFBGNhbGwFC3N0YWtpbmdBZGRyCQDMCAIFBmFtb3VudAkAzAgCCQDYBAEFB2Fzc2V0SWQFA25pbAUDbmlsAQ9jb2xsZWN0UGF5bWVudHMCA2FjYwdwYXltZW50BAskdDAyOTczMzAxNgUDYWNjBA5wYXltZW50QW1vdW50cwgFCyR0MDI5NzMzMDE2Al8xBA9wYXltZW50QXNzZXRJZHMIBQskdDAyOTczMzAxNgJfMgkAlAoCCQDNCAIFDnBheW1lbnRBbW91bnRzCAUHcGF5bWVudAZhbW91bnQJAM0IAgUPcGF5bWVudEFzc2V0SWRzAwkAAAIIBQdwYXltZW50B2Fzc2V0SWQFBHVuaXQBAAgFB3BheW1lbnQHYXNzZXRJZAEMY29sbGVjdFN0YXRlAgZyZXN1bHQGc291cmNlBAckbWF0Y2gwBQZzb3VyY2UDAwkAAQIFByRtYXRjaDACBUlzc3VlBgMJAAECBQckbWF0Y2gwAgRCdXJuBgMJAAECBQckbWF0Y2gwAgdSZWlzc3VlBgMJAAECBQckbWF0Y2gwAg5TY3JpcHRUcmFuc2ZlcgYDCQABAgUHJG1hdGNoMAILQmluYXJ5RW50cnkGAwkAAQIFByRtYXRjaDACDEJvb2xlYW5FbnRyeQYDCQABAgUHJG1hdGNoMAILU3RyaW5nRW50cnkGCQABAgUHJG1hdGNoMAIMSW50ZWdlckVudHJ5BAFlBQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBZQUGcmVzdWx0AQtjb2xsZWN0RGF0YQIGcmVzdWx0BnNvdXJjZQQHJG1hdGNoMAUGc291cmNlAwkAAQIFByRtYXRjaDACBlN0cmluZwQBdgUHJG1hdGNoMAkAzQgCBQZyZXN1bHQFAXYDCQABAgUHJG1hdGNoMAIDSW50BAF2BQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBdgMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAF2BQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBdgMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAF2BQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBdgMJAAECBQckbWF0Y2gwAgRVbml0BAF2BQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBdgkBBXRocm93AAEKY2FsbENvbW1vbgQIZnVuY05hbWUGY2FsbGVyBGFyZ3MIcGF5bWVudHMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAECyR0MDM5MzY0MDIwCgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPY29sbGVjdFBheW1lbnRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBA5wYXltZW50QW1vdW50cwgFCyR0MDM5MzY0MDIwAl8xBA9wYXltZW50QXNzZXRJZHMIBQskdDAzOTM2NDAyMAJfMgQLbG9ja1BheW1lbnQDAwkAAAIFCGZ1bmNOYW1lAhZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zCQAAAgkAkAMBBQhwYXltZW50cwADBwkAzAgCCQCRAwIFCHBheW1lbnRzAAIFA25pbAMDCQAAAgUIZnVuY05hbWUCFXJlcGxlbmlzaFdpdGhPbmVUb2tlbgkAAAIJAJADAQUIcGF5bWVudHMAAgcJAMwIAgkAkQMCBQhwYXltZW50cwABBQNuaWwFA25pbAQLJHQwNDI0OTQ0MDYKAAFACQD9BwQFDGNwbW1Db250cmFjdAUIZnVuY05hbWUJAMwIAgUGY2FsbGVyCQDMCAIFBGFyZ3MJAMwIAgUOcGF5bWVudEFtb3VudHMJAMwIAgUPcGF5bWVudEFzc2V0SWRzBQNuaWwFC2xvY2tQYXltZW50AwkAAQIFAUACFihMaXN0W0FueV0sIExpc3RbQW55XSkFAUAJAAIBCQCsAgIJAAMBBQFAAisgY291bGRuJ3QgYmUgY2FzdCB0byAoTGlzdFtBbnldLCBMaXN0W0FueV0pAwkAAAIFCyR0MDQyNDk0NDA2BQskdDA0MjQ5NDQwNgQEZGF0YQgFCyR0MDQyNDk0NDA2Al8yBAdhY3Rpb25zCAULJHQwNDI0OTQ0MDYCXzEECm1hcHBlZERhdGEKAAIkbAUEZGF0YQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQELY29sbGVjdERhdGECBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEDW1hcHBlZEFjdGlvbnMKAAIkbAUHYWN0aW9ucwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMl8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMY29sbGVjdFN0YXRlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYyXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMl8yAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwkAlAoCBQ1tYXBwZWRBY3Rpb25zBQptYXBwZWREYXRhCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQFpAQxjYWxsRnVuY3Rpb24CCGZ1bmNOYW1lBGFyZ3MJAQpjYWxsQ29tbW9uBAUIZnVuY05hbWUICAUBaQZjYWxsZXIFYnl0ZXMFBGFyZ3MIBQFpCHBheW1lbnRzAWkBCHNodXRkb3duAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQgFAWkPY2FsbGVyUHVibGljS2V5AwkBASEBBQZhY3RpdmUJAAIBCQCsAgICIkRBcHAgaXMgYWxyZWFkeSBzdXNwZW5kZWQuIENhdXNlOiAJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUGa0NhdXNlAhp0aGUgY2F1c2Ugd2Fzbid0IHNwZWNpZmllZAkBB3N1c3BlbmQBAg9QYXVzZWQgYnkgYWRtaW4BaQEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDBQZhY3RpdmUJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCCQELRGVsZXRlRW50cnkBBQZrQ2F1c2UFA25pbAFpAQxzdGFrZVVuc3Rha2UDBXN0YWtlBmFtb3VudA1hc3NldElkU3RyaW5nCQELdmFsdWVPckVsc2UCCQEOaXNHbG9iYWxDYWxsZXIBCAUBaQZjYWxsZXIJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQAAAgUNYXNzZXRJZFN0cmluZwIFV0FWRVMEBHBvb2wJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQZvcmFjbGUFDGtMZWFzaW5nUG9vbAIZTm8gbGVhc2luZyBwb29sIGluIG9yYWNsZQQJbGVhc2luZ0lkCQCcCAIFBHRoaXMFCmtMZWFzaW5nSWQEDWxlYXNpbmdBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUOa0xlYXNpbmdBbW91bnQAAAQObmV3TGVhc2VBbW91bnQDBQVzdGFrZQkAZAIFDWxlYXNpbmdBbW91bnQFBmFtb3VudAkAZQIFDWxlYXNpbmdBbW91bnQFBmFtb3VudAQIbmV3TGVhc2UJAMQIAgUEcG9vbAUObmV3TGVhc2VBbW91bnQECm5ld0xlYXNlSWQJALkIAQUIbmV3TGVhc2UECGJhc2VFdHJ5CQDMCAIFCG5ld0xlYXNlCQDMCAIJAQtCaW5hcnlFbnRyeQIFCmtMZWFzaW5nSWQFCm5ld0xlYXNlSWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtMZWFzaW5nQW1vdW50BQ5uZXdMZWFzZUFtb3VudAUDbmlsBAckbWF0Y2gwBQlsZWFzaW5nSWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQDbElkBQckbWF0Y2gwCQDOCAIJAMwIAgkBC0xlYXNlQ2FuY2VsAQUDbElkBQNuaWwFCGJhc2VFdHJ5BQhiYXNlRXRyeQQLJHQwNjMyNDY0MjcJARFjYWxjU3Rha2luZ1BhcmFtcwMFBXN0YWtlBQZhbW91bnQJANkEAQUNYXNzZXRJZFN0cmluZwQEY2FsbAgFCyR0MDYzMjQ2NDI3Al8xBARhZGRyCAULJHQwNjMyNDY0MjcCXzIEBnBhcmFtcwgFCyR0MDYzMjQ2NDI3Al8zBAhwYXltZW50cwgFCyR0MDYzMjQ2NDI3Al80BANpbnYJAPwHBAUEYWRkcgUEY2FsbAUGcGFyYW1zBQhwYXltZW50cwMJAAACBQNpbnYFA2ludgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE2NsYWltTmV0cmlub1Jld2FyZHMACQELdmFsdWVPckVsc2UCCQEOaXNHbG9iYWxDYWxsZXIBCAUBaQZjYWxsZXIJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEA2ludgkA/AcEBRJzdGFraW5nVVNETkFkZHJlc3MCDGNsYWltUmV3YXJkcwUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYJAJQKAgUDbmlsBQNpbnYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERcmVpc3N1ZVNoYXJlVG9rZW4BBmFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBDmlzR2xvYmFsQ2FsbGVyAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAxzaGFyZUFzc2V0SWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUNa1NoYXJlQXNzZXRJZAkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAUGYW1vdW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmFtb3VudAUMc2hhcmVBc3NldElkBQNuaWwBaQEWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwERc2xpcHBhZ2VUb2xlcmFuY2UJAQpjYWxsQ29tbW9uBAIWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwgIBQFpBmNhbGxlcgVieXRlcwkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwIBQFpCHBheW1lbnRzAWkBCHdpdGhkcmF3AAkBCmNhbGxDb21tb24EAgh3aXRoZHJhdwgIBQFpBmNhbGxlcgVieXRlcwkAzAgCAgEwBQNuaWwIBQFpCHBheW1lbnRzAWkBCGV4Y2hhbmdlARJtaW5BbW91bnRUb1JlY2VpdmUJAQpjYWxsQ29tbW9uBAIIZXhjaGFuZ2UICAUBaQZjYWxsZXIFYnl0ZXMJAMwIAgkApAMBBRJtaW5BbW91bnRUb1JlY2VpdmUFA25pbAgFAWkIcGF5bWVudHMBAnR4AQZ2ZXJpZnkABBNtdWx0aVNpZ25lZEJ5QWRtaW5zBBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQxhZG1pblB1YktleTIAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQxhZG1pblB1YktleTMAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIFE211bHRpU2lnbmVkQnlBZG1pbnOCFYaH", "height": 2714487, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let kActive = "active"
5+
6+let kActiveGlob = "active_all_contracts"
7+
8+let kCause = "shutdown_cause"
9+
10+let kUSDNAddress = "staking_usdnnsbt_address"
11+
12+let kEURNAddress = "staking_eurn_address"
13+
14+let kLeasingPool = "leasing_address"
15+
16+let kLeasingAmount = "leasing_amount"
17+
18+let kLeasingId = "leasing_id"
19+
20+let kAdminPubKey1 = "admin_pub_1"
21+
22+let kAdminPubKey2 = "admin_pub_2"
23+
24+let kAdminPubKey3 = "admin_pub_3"
25+
26+let kAdminInvokePubKey = "admin_invoke_pub"
27+
28+let kCpmmContract = "cpmm_contract"
29+
30+let kUSDNAssetId = "usdn_asset_id"
31+
32+let kEURNAssetId = "eurn_asset_id"
33+
34+let kStakingAssets = "staking_assets"
35+
36+let kShareAssetId = "share_asset_id"
37+
38+let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
39+
40+func getBase58FromOracle (key) = match getString(oracle, key) {
41+ case string: String =>
42+ fromBase58String(string)
43+ case nothing =>
44+ throw((key + "is empty"))
45+}
46+
47+
48+let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
49+
50+let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
51+
52+let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
53+
54+let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
55+
56+let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
57+
58+let stakingEURNAddress = Address(getBase58FromOracle(kEURNAddress))
59+
60+let cpmmContract = Address(getBase58FromOracle(kCpmmContract))
61+
62+let USDN = getBase58FromOracle(kUSDNAssetId)
63+
64+let EURN = getBase58FromOracle(kEURNAssetId)
65+
66+let stakingAssets = getStringValue(oracle, kStakingAssets)
67+
68+let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
69+
70+let active = valueOrElse(getBoolean(this, kActive), true)
71+
72+func isActive () = if (if (active)
73+ then activeGlob
74+ else false)
75+ then unit
76+ else throw("DApp is inactive at this moment")
77+
78+
79+func isGlobalCaller (caller) = if ((caller == cpmmContract))
80+ then unit
81+ else throw("Only global Contract can invoke this function")
82+
83+
84+func isAdminCall (callerPubKey) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], callerPubKey))
85+ then unit
86+ else throw("Only admin can call this function")
87+
88+
89+func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
90+
91+
92+func calcStakingFuncAndAddres (stake,assetId) = if (stake)
93+ then if ((assetId == USDN))
94+ then $Tuple2("lockNeutrino", stakingUSDNAddress)
95+ else $Tuple2("startStaking", stakingEURNAddress)
96+ else if ((assetId == USDN))
97+ then $Tuple2("unlockNeutrino", stakingUSDNAddress)
98+ else $Tuple2("stopStaking", stakingEURNAddress)
99+
100+
101+func calcStakingParams (stake,amount,assetId) = if (stake)
102+ then {
103+ let $t025932659 = calcStakingFuncAndAddres(stake, assetId)
104+ let call = $t025932659._1
105+ let stakingAddr = $t025932659._2
106+ $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
107+ }
108+ else {
109+ let $t027452811 = calcStakingFuncAndAddres(stake, assetId)
110+ let call = $t027452811._1
111+ let stakingAddr = $t027452811._2
112+ $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
113+ }
114+
115+
116+func collectPayments (acc,payment) = {
117+ let $t029733016 = acc
118+ let paymentAmounts = $t029733016._1
119+ let paymentAssetIds = $t029733016._2
120+ $Tuple2((paymentAmounts :+ payment.amount), (paymentAssetIds :+ (if ((payment.assetId == unit))
121+ then base58''
122+ else payment.assetId)))
123+ }
124+
125+
126+func collectState (result,source) = match source {
127+ case e: Issue|Burn|Reissue|ScriptTransfer|BinaryEntry|BooleanEntry|StringEntry|IntegerEntry =>
128+ (result :+ e)
129+ case _ =>
130+ result
131+}
132+
133+
134+func collectData (result,source) = match source {
135+ case v: String =>
136+ (result :+ v)
137+ case v: Int =>
138+ (result :+ v)
139+ case v: Boolean =>
140+ (result :+ v)
141+ case v: ByteVector =>
142+ (result :+ v)
143+ case v: Unit =>
144+ (result :+ v)
145+ case _ =>
146+ throw()
147+}
148+
149+
150+func callCommon (funcName,caller,args,payments) = valueOrElse(isActive(), {
151+ let $t039364020 = {
152+ let $l = payments
153+ let $s = size($l)
154+ let $acc0 = $Tuple2(nil, nil)
155+ func $f0_1 ($a,$i) = if (($i >= $s))
156+ then $a
157+ else collectPayments($a, $l[$i])
158+
159+ func $f0_2 ($a,$i) = if (($i >= $s))
160+ then $a
161+ else throw("List size exceeds 10")
162+
163+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
164+ }
165+ let paymentAmounts = $t039364020._1
166+ let paymentAssetIds = $t039364020._2
167+ let lockPayment = if (if ((funcName == "replenishWithTwoTokens"))
168+ then (size(payments) == 3)
169+ else false)
170+ then [payments[2]]
171+ else if (if ((funcName == "replenishWithOneToken"))
172+ then (size(payments) == 2)
173+ else false)
174+ then [payments[1]]
175+ else nil
176+ let $t042494406 = {
177+ let @ = reentrantInvoke(cpmmContract, funcName, [caller, args, paymentAmounts, paymentAssetIds], lockPayment)
178+ if ($isInstanceOf(@, "(List[Any], List[Any])"))
179+ then @
180+ else throw(($getType(@) + " couldn't be cast to (List[Any], List[Any])"))
181+ }
182+ if (($t042494406 == $t042494406))
183+ then {
184+ let data = $t042494406._2
185+ let actions = $t042494406._1
186+ let mappedData = {
187+ let $l = data
188+ let $s = size($l)
189+ let $acc0 = nil
190+ func $f1_1 ($a,$i) = if (($i >= $s))
191+ then $a
192+ else collectData($a, $l[$i])
193+
194+ func $f1_2 ($a,$i) = if (($i >= $s))
195+ then $a
196+ else throw("List size exceeds 10")
197+
198+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
199+ }
200+ let mappedActions = {
201+ let $l = actions
202+ let $s = size($l)
203+ let $acc0 = nil
204+ func $f2_1 ($a,$i) = if (($i >= $s))
205+ then $a
206+ else collectState($a, $l[$i])
207+
208+ func $f2_2 ($a,$i) = if (($i >= $s))
209+ then $a
210+ else throw("List size exceeds 15")
211+
212+ $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
213+ }
214+ $Tuple2(mappedActions, mappedData)
215+ }
216+ else throw("Strict value is not equal to itself.")
217+ })
218+
219+
220+@Callable(i)
221+func callFunction (funcName,args) = callCommon(funcName, i.caller.bytes, args, i.payments)
222+
223+
224+
225+@Callable(i)
226+func shutdown () = valueOrElse(isAdminCall(i.callerPublicKey), if (!(active))
227+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
228+ else suspend("Paused by admin"))
229+
230+
231+
232+@Callable(i)
233+func activate () = valueOrElse(isAdminCall(i.callerPublicKey), if (active)
234+ then throw("DApp is already active")
235+ else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
236+
237+
238+
239+@Callable(i)
240+func stakeUnstake (stake,amount,assetIdString) = valueOrElse(isGlobalCaller(i.caller), valueOrElse(isActive(), if ((assetIdString == "WAVES"))
241+ then {
242+ let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, kLeasingPool), "No leasing pool in oracle"))
243+ let leasingId = getBinary(this, kLeasingId)
244+ let leasingAmount = valueOrElse(getInteger(this, kLeasingAmount), 0)
245+ let newLeaseAmount = if (stake)
246+ then (leasingAmount + amount)
247+ else (leasingAmount - amount)
248+ let newLease = Lease(pool, newLeaseAmount)
249+ let newLeaseId = calculateLeaseId(newLease)
250+ let baseEtry = [newLease, BinaryEntry(kLeasingId, newLeaseId), IntegerEntry(kLeasingAmount, newLeaseAmount)]
251+ match leasingId {
252+ case lId: ByteVector =>
253+ ([LeaseCancel(lId)] ++ baseEtry)
254+ case _ =>
255+ baseEtry
256+ }
257+ }
258+ else {
259+ let $t063246427 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
260+ let call = $t063246427._1
261+ let addr = $t063246427._2
262+ let params = $t063246427._3
263+ let payments = $t063246427._4
264+ let inv = invoke(addr, call, params, payments)
265+ if ((inv == inv))
266+ then nil
267+ else throw("Strict value is not equal to itself.")
268+ }))
269+
270+
271+
272+@Callable(i)
273+func claimNetrinoRewards () = valueOrElse(isGlobalCaller(i.caller), valueOrElse(isActive(), {
274+ let inv = invoke(stakingUSDNAddress, "claimRewards", nil, nil)
275+ if ((inv == inv))
276+ then $Tuple2(nil, inv)
277+ else throw("Strict value is not equal to itself.")
278+ }))
279+
280+
281+
282+@Callable(i)
283+func reissueShareToken (amount) = valueOrElse(isGlobalCaller(i.caller), valueOrElse(isActive(), {
284+ let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
285+[Reissue(shareAssetId, amount, true), ScriptTransfer(i.caller, amount, shareAssetId)]
286+ }))
287+
288+
289+
290+@Callable(i)
291+func replenishWithTwoTokens (slippageTolerance) = callCommon("replenishWithTwoTokens", i.caller.bytes, ["false", "0"], i.payments)
292+
293+
294+
295+@Callable(i)
296+func withdraw () = callCommon("withdraw", i.caller.bytes, ["0"], i.payments)
297+
298+
299+
300+@Callable(i)
301+func exchange (minAmountToReceive) = callCommon("exchange", i.caller.bytes, [toString(minAmountToReceive)], i.payments)
302+
303+
304+@Verifier(tx)
305+func verify () = {
306+ let multiSignedByAdmins = {
307+ let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
308+ then 1
309+ else 0
310+ let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
311+ then 1
312+ else 0
313+ let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
314+ then 1
315+ else 0
316+ (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
317+ }
318+ multiSignedByAdmins
319+ }
320+

github/deemru/w8io/026f985 
19.64 ms