2022.12.16 14:37 [3428279] smart account 3PNVFWopwCD9CgGXkpYWEY94oQ5XCAEXBmQ > SELF 0.00000000 Waves

{ "type": 13, "id": "GwbyhZuhnAfqguA8CfKvUmCppemSdv5c1VpMo8SADqjj", "fee": 1200000, "feeAssetId": null, "timestamp": 1671190362862, "version": 2, "chainId": 87, "sender": "3PNVFWopwCD9CgGXkpYWEY94oQ5XCAEXBmQ", "senderPublicKey": "4DPL6q4zXX76yLqAjsQwFsruX4hUF8eKzqRdTkfprQgu", "proofs": [ "", "2TZcWazWDgW3mNMSxh4pLtL8DGHJT9Lhsxz9QGYiAa6yLLfKuDV7zpkp5VQTr9pficdWHMjqs7hR5gEXssg886BZ", "32KdUeUKt819yv9f7M95aGnCzRxc9MEBNHEQBhpT2xCsfNupHj6JYkwzzB6UnTjz7zP8nsQQGPxSRvWoupTYx4Tp" ], "script": "base64:BgImCAISBAoCCBgSABIAEgUKAwQBCBIAEgMKAQESAwoBARIAEgMKAQEpAAdrQWN0aXZlAgZhY3RpdmUAC2tBY3RpdmVHbG9iAhRhY3RpdmVfYWxsX2NvbnRyYWN0cwAGa0NhdXNlAg5zaHV0ZG93bl9jYXVzZQAMa1VTRE5BZGRyZXNzAhhzdGFraW5nX3VzZG5uc2J0X2FkZHJlc3MADGtFVVJOQWRkcmVzcwIUc3Rha2luZ19ldXJuX2FkZHJlc3MADGtMZWFzaW5nUG9vbAIPbGVhc2luZ19hZGRyZXNzAA5rTGVhc2luZ0Ftb3VudAIObGVhc2luZ19hbW91bnQACmtMZWFzaW5nSWQCCmxlYXNpbmdfaWQADWtBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA1rQWRtaW5QdWJLZXkyAgthZG1pbl9wdWJfMgANa0FkbWluUHViS2V5MwILYWRtaW5fcHViXzMAEmtBZG1pbkludm9rZVB1YktleQIQYWRtaW5faW52b2tlX3B1YgANa0NwbW1Db250cmFjdAINY3BtbV9jb250cmFjdAAMa1VTRE5Bc3NldElkAg11c2RuX2Fzc2V0X2lkAAxrRVVSTkFzc2V0SWQCDWV1cm5fYXNzZXRfaWQADmtTdGFraW5nQXNzZXRzAg5zdGFraW5nX2Fzc2V0cwANa1NoYXJlQXNzZXRJZAIOc2hhcmVfYXNzZXRfaWQABm9yYWNsZQkBB0FkZHJlc3MBARoBV4r/CGiaNbpAzWF08hI33qY38Po4zugeOAETZ2V0QmFzZTU4RnJvbU9yYWNsZQEDa2V5BAckbWF0Y2gwCQCdCAIFBm9yYWNsZQUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgEJAKwCAgUDa2V5AghpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MwARYWRtaW5QdWJLZXlJbnZva2UJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUSa0FkbWluSW52b2tlUHViS2V5ABJzdGFraW5nVVNETkFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrVVNETkFkZHJlc3MAEnN0YWtpbmdFVVJOQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtFVVJOQWRkcmVzcwAMY3BtbUNvbnRyYWN0CQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0NwbW1Db250cmFjdAAEVVNETgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrVVNETkFzc2V0SWQABEVVUk4JARNnZXRCYXNlNThGcm9tT3JhY2xlAQUMa0VVUk5Bc3NldElkAA1zdGFraW5nQXNzZXRzCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFDmtTdGFraW5nQXNzZXRzAAphY3RpdmVHbG9iCQELdmFsdWVPckVsc2UCCQCbCAIFBm9yYWNsZQULa0FjdGl2ZUdsb2IGAAZhY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYBCGlzQWN0aXZlAAMDBQZhY3RpdmUFCmFjdGl2ZUdsb2IHBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAEOaXNHbG9iYWxDYWxsZXIBBmNhbGxlcgMJAAACBQZjYWxsZXIFDGNwbW1Db250cmFjdAUEdW5pdAkAAgECLU9ubHkgZ2xvYmFsIENvbnRyYWN0IGNhbiBpbnZva2UgdGhpcyBmdW5jdGlvbgELaXNBZG1pbkNhbGwBDGNhbGxlclB1YktleQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwFDGNhbGxlclB1YktleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEHc3VzcGVuZAEFY2F1c2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtDYXVzZQUFY2F1c2UFA25pbAEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgVzdGFrZQdhc3NldElkAwUFc3Rha2UDCQAAAgUHYXNzZXRJZAUEVVNETgkAlAoCAgxsb2NrTmV1dHJpbm8FEnN0YWtpbmdVU0ROQWRkcmVzcwkAlAoCAgxzdGFydFN0YWtpbmcFEnN0YWtpbmdFVVJOQWRkcmVzcwMJAAACBQdhc3NldElkBQRVU0ROCQCUCgICDnVubG9ja05ldXRyaW5vBRJzdGFraW5nVVNETkFkZHJlc3MJAJQKAgILc3RvcFN0YWtpbmcFEnN0YWtpbmdFVVJOQWRkcmVzcwERY2FsY1N0YWtpbmdQYXJhbXMDBXN0YWtlBmFtb3VudAdhc3NldElkAwUFc3Rha2UECyR0MDI1OTMyNjU5CQEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgUFc3Rha2UFB2Fzc2V0SWQEBGNhbGwIBQskdDAyNTkzMjY1OQJfMQQLc3Rha2luZ0FkZHIIBQskdDAyNTkzMjY1OQJfMgkAlgoEBQRjYWxsBQtzdGFraW5nQWRkcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQdhc3NldElkBQZhbW91bnQFA25pbAQLJHQwMjc0NTI4MTEJARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBQVzdGFrZQUHYXNzZXRJZAQEY2FsbAgFCyR0MDI3NDUyODExAl8xBAtzdGFraW5nQWRkcggFCyR0MDI3NDUyODExAl8yCQCWCgQFBGNhbGwFC3N0YWtpbmdBZGRyCQDMCAIFBmFtb3VudAkAzAgCCQDYBAEFB2Fzc2V0SWQFA25pbAUDbmlsAQ9jb2xsZWN0UGF5bWVudHMCA2FjYwdwYXltZW50BAskdDAyOTczMzAxNgUDYWNjBA5wYXltZW50QW1vdW50cwgFCyR0MDI5NzMzMDE2Al8xBA9wYXltZW50QXNzZXRJZHMIBQskdDAyOTczMzAxNgJfMgkAlAoCCQDNCAIFDnBheW1lbnRBbW91bnRzCAUHcGF5bWVudAZhbW91bnQJAM0IAgUPcGF5bWVudEFzc2V0SWRzAwkAAAIIBQdwYXltZW50B2Fzc2V0SWQFBHVuaXQBAAgFB3BheW1lbnQHYXNzZXRJZAEMY29sbGVjdFN0YXRlAgZyZXN1bHQGc291cmNlBAckbWF0Y2gwBQZzb3VyY2UDAwkAAQIFByRtYXRjaDACBUlzc3VlBgMJAAECBQckbWF0Y2gwAgRCdXJuBgMJAAECBQckbWF0Y2gwAgdSZWlzc3VlBgMJAAECBQckbWF0Y2gwAg5TY3JpcHRUcmFuc2ZlcgYDCQABAgUHJG1hdGNoMAILQmluYXJ5RW50cnkGAwkAAQIFByRtYXRjaDACDEJvb2xlYW5FbnRyeQYDCQABAgUHJG1hdGNoMAILU3RyaW5nRW50cnkGCQABAgUHJG1hdGNoMAIMSW50ZWdlckVudHJ5BAFlBQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBZQUGcmVzdWx0AQtjb2xsZWN0RGF0YQIGcmVzdWx0BnNvdXJjZQQHJG1hdGNoMAUGc291cmNlAwkAAQIFByRtYXRjaDACBlN0cmluZwQBdgUHJG1hdGNoMAkAzQgCBQZyZXN1bHQFAXYDCQABAgUHJG1hdGNoMAIDSW50BAF2BQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBdgMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAF2BQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBdgMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAF2BQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBdgMJAAECBQckbWF0Y2gwAgRVbml0BAF2BQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBdgkBBXRocm93AAEKY2FsbENvbW1vbgQIZnVuY05hbWUGY2FsbGVyBGFyZ3MIcGF5bWVudHMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAECyR0MDM5MzY0MDIwCgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPY29sbGVjdFBheW1lbnRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBA5wYXltZW50QW1vdW50cwgFCyR0MDM5MzY0MDIwAl8xBA9wYXltZW50QXNzZXRJZHMIBQskdDAzOTM2NDAyMAJfMgQLbG9ja1BheW1lbnQDAwkAAAIFCGZ1bmNOYW1lAhZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zCQAAAgkAkAMBBQhwYXltZW50cwADBwkAzAgCCQCRAwIFCHBheW1lbnRzAAIFA25pbAMDCQAAAgUIZnVuY05hbWUCFXJlcGxlbmlzaFdpdGhPbmVUb2tlbgkAAAIJAJADAQUIcGF5bWVudHMAAgcJAMwIAgkAkQMCBQhwYXltZW50cwABBQNuaWwFA25pbAQLJHQwNDI0OTQ0MDYKAAFACQD9BwQFDGNwbW1Db250cmFjdAUIZnVuY05hbWUJAMwIAgUGY2FsbGVyCQDMCAIFBGFyZ3MJAMwIAgUOcGF5bWVudEFtb3VudHMJAMwIAgUPcGF5bWVudEFzc2V0SWRzBQNuaWwFC2xvY2tQYXltZW50AwkAAQIFAUACFihMaXN0W0FueV0sIExpc3RbQW55XSkFAUAJAAIBCQCsAgIJAAMBBQFAAisgY291bGRuJ3QgYmUgY2FzdCB0byAoTGlzdFtBbnldLCBMaXN0W0FueV0pAwkAAAIFCyR0MDQyNDk0NDA2BQskdDA0MjQ5NDQwNgQEZGF0YQgFCyR0MDQyNDk0NDA2Al8yBAdhY3Rpb25zCAULJHQwNDI0OTQ0MDYCXzEECm1hcHBlZERhdGEKAAIkbAUEZGF0YQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQELY29sbGVjdERhdGECBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEDW1hcHBlZEFjdGlvbnMKAAIkbAUHYWN0aW9ucwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMl8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMY29sbGVjdFN0YXRlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYyXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMl8yAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwkAlAoCBQ1tYXBwZWRBY3Rpb25zBQptYXBwZWREYXRhCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQFpAQxjYWxsRnVuY3Rpb24CCGZ1bmNOYW1lBGFyZ3MJAQpjYWxsQ29tbW9uBAUIZnVuY05hbWUICAUBaQZjYWxsZXIFYnl0ZXMFBGFyZ3MIBQFpCHBheW1lbnRzAWkBCHNodXRkb3duAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQgFAWkPY2FsbGVyUHVibGljS2V5AwkBASEBBQZhY3RpdmUJAAIBCQCsAgICIkRBcHAgaXMgYWxyZWFkeSBzdXNwZW5kZWQuIENhdXNlOiAJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUGa0NhdXNlAhp0aGUgY2F1c2Ugd2Fzbid0IHNwZWNpZmllZAkBB3N1c3BlbmQBAg9QYXVzZWQgYnkgYWRtaW4BaQEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDBQZhY3RpdmUJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCCQELRGVsZXRlRW50cnkBBQZrQ2F1c2UFA25pbAFpAQxzdGFrZVVuc3Rha2UDBXN0YWtlBmFtb3VudA1hc3NldElkU3RyaW5nCQELdmFsdWVPckVsc2UCCQEOaXNHbG9iYWxDYWxsZXIBCAUBaQZjYWxsZXIJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQAAAgUNYXNzZXRJZFN0cmluZwIFV0FWRVMEBHBvb2wJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQZvcmFjbGUFDGtMZWFzaW5nUG9vbAIZTm8gbGVhc2luZyBwb29sIGluIG9yYWNsZQQJbGVhc2luZ0lkCQCcCAIFBHRoaXMFCmtMZWFzaW5nSWQEDWxlYXNpbmdBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUOa0xlYXNpbmdBbW91bnQAAAQObmV3TGVhc2VBbW91bnQDBQVzdGFrZQkAZAIFDWxlYXNpbmdBbW91bnQFBmFtb3VudAkAZQIFDWxlYXNpbmdBbW91bnQFBmFtb3VudAQIbmV3TGVhc2UJAMQIAgUEcG9vbAUObmV3TGVhc2VBbW91bnQECm5ld0xlYXNlSWQJALkIAQUIbmV3TGVhc2UECGJhc2VFdHJ5CQDMCAIFCG5ld0xlYXNlCQDMCAIJAQtCaW5hcnlFbnRyeQIFCmtMZWFzaW5nSWQFCm5ld0xlYXNlSWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtMZWFzaW5nQW1vdW50BQ5uZXdMZWFzZUFtb3VudAUDbmlsBAckbWF0Y2gwBQlsZWFzaW5nSWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQDbElkBQckbWF0Y2gwCQDOCAIJAMwIAgkBC0xlYXNlQ2FuY2VsAQUDbElkBQNuaWwFCGJhc2VFdHJ5BQhiYXNlRXRyeQQLJHQwNjMyNDY0MjcJARFjYWxjU3Rha2luZ1BhcmFtcwMFBXN0YWtlBQZhbW91bnQJANkEAQUNYXNzZXRJZFN0cmluZwQEY2FsbAgFCyR0MDYzMjQ2NDI3Al8xBARhZGRyCAULJHQwNjMyNDY0MjcCXzIEBnBhcmFtcwgFCyR0MDYzMjQ2NDI3Al8zBAhwYXltZW50cwgFCyR0MDYzMjQ2NDI3Al80BANpbnYJAPwHBAUEYWRkcgUEY2FsbAUGcGFyYW1zBQhwYXltZW50cwMJAAACBQNpbnYFA2ludgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE2NsYWltTmV0cmlub1Jld2FyZHMACQELdmFsdWVPckVsc2UCCQEOaXNHbG9iYWxDYWxsZXIBCAUBaQZjYWxsZXIJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEA2ludgkA/AcEBRJzdGFraW5nVVNETkFkZHJlc3MCDGNsYWltUmV3YXJkcwUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYJAJQKAgUDbmlsBQNpbnYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERcmVpc3N1ZVNoYXJlVG9rZW4BBmFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBDmlzR2xvYmFsQ2FsbGVyAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAxzaGFyZUFzc2V0SWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUNa1NoYXJlQXNzZXRJZAkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAUGYW1vdW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmFtb3VudAUMc2hhcmVBc3NldElkBQNuaWwBaQEWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwERc2xpcHBhZ2VUb2xlcmFuY2UJAQpjYWxsQ29tbW9uBAIWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwgIBQFpBmNhbGxlcgVieXRlcwkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwIBQFpCHBheW1lbnRzAWkBCHdpdGhkcmF3AAkBCmNhbGxDb21tb24EAgh3aXRoZHJhdwgIBQFpBmNhbGxlcgVieXRlcwkAzAgCAgEwBQNuaWwIBQFpCHBheW1lbnRzAWkBCGV4Y2hhbmdlARJtaW5BbW91bnRUb1JlY2VpdmUJAQpjYWxsQ29tbW9uBAIIZXhjaGFuZ2UICAUBaQZjYWxsZXIFYnl0ZXMJAMwIAgkApAMBBRJtaW5BbW91bnRUb1JlY2VpdmUFA25pbAgFAWkIcGF5bWVudHMBAnR4AQZ2ZXJpZnkABBNtdWx0aVNpZ25lZEJ5QWRtaW5zBBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQxhZG1pblB1YktleTIAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQxhZG1pblB1YktleTMAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIFE211bHRpU2lnbmVkQnlBZG1pbnPa7dko", "height": 3428279, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7szt7Sik5VqXKuFviR9GN61EmPg15poYhx4V43jS9tCi Next: none Diff:
OldNewDifferences
173173 else false)
174174 then [payments[1]]
175175 else nil
176- let $t042504407 = {
176+ let $t042494406 = {
177177 let @ = reentrantInvoke(cpmmContract, funcName, [caller, args, paymentAmounts, paymentAssetIds], lockPayment)
178178 if ($isInstanceOf(@, "(List[Any], List[Any])"))
179179 then @
180180 else throw(($getType(@) + " couldn't be cast to (List[Any], List[Any])"))
181181 }
182- if (($t042504407 == $t042504407))
182+ if (($t042494406 == $t042494406))
183183 then {
184- let data = $t042504407._2
185- let actions = $t042504407._1
184+ let data = $t042494406._2
185+ let actions = $t042494406._1
186186 let mappedData = {
187187 let $l = data
188188 let $s = size($l)
237237
238238
239239 @Callable(i)
240-func stakeUnstake (stake,amount,assetIdString) = valueOrElse(isActive(), if ((i.caller != cpmmContract))
241- then throw("Only global Contract can invoke this function")
242- else if ((assetIdString == "WAVES"))
243- then {
244- let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, kLeasingPool), "No leasing pool in oracle"))
245- let leasingId = getBinary(this, kLeasingId)
246- let leasingAmount = valueOrElse(getInteger(this, kLeasingAmount), 0)
247- let newLeaseAmount = if (stake)
248- then (leasingAmount + amount)
249- else (leasingAmount - amount)
250- let newLease = Lease(pool, newLeaseAmount)
251- let newLeaseId = calculateLeaseId(newLease)
252- let baseEtry = [newLease, BinaryEntry(kLeasingId, newLeaseId), IntegerEntry(kLeasingAmount, newLeaseAmount)]
253- match leasingId {
254- case lId: ByteVector =>
255- ([LeaseCancel(lId)] ++ baseEtry)
256- case _ =>
257- baseEtry
258- }
259- }
260- else {
261- let $t064036506 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
262- let call = $t064036506._1
263- let addr = $t064036506._2
264- let params = $t064036506._3
265- let payments = $t064036506._4
266- let inv = invoke(addr, call, params, payments)
267- if ((inv == inv))
268- then nil
269- else throw("Strict value is not equal to itself.")
270- })
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+ }))
271279
272280
273281
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let kActive = "active"
55
66 let kActiveGlob = "active_all_contracts"
77
88 let kCause = "shutdown_cause"
99
1010 let kUSDNAddress = "staking_usdnnsbt_address"
1111
1212 let kEURNAddress = "staking_eurn_address"
1313
1414 let kLeasingPool = "leasing_address"
1515
1616 let kLeasingAmount = "leasing_amount"
1717
1818 let kLeasingId = "leasing_id"
1919
2020 let kAdminPubKey1 = "admin_pub_1"
2121
2222 let kAdminPubKey2 = "admin_pub_2"
2323
2424 let kAdminPubKey3 = "admin_pub_3"
2525
2626 let kAdminInvokePubKey = "admin_invoke_pub"
2727
2828 let kCpmmContract = "cpmm_contract"
2929
3030 let kUSDNAssetId = "usdn_asset_id"
3131
3232 let kEURNAssetId = "eurn_asset_id"
3333
3434 let kStakingAssets = "staking_assets"
3535
3636 let kShareAssetId = "share_asset_id"
3737
3838 let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
3939
4040 func getBase58FromOracle (key) = match getString(oracle, key) {
4141 case string: String =>
4242 fromBase58String(string)
4343 case nothing =>
4444 throw((key + "is empty"))
4545 }
4646
4747
4848 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
4949
5050 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
5151
5252 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
5353
5454 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
5555
5656 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
5757
5858 let stakingEURNAddress = Address(getBase58FromOracle(kEURNAddress))
5959
6060 let cpmmContract = Address(getBase58FromOracle(kCpmmContract))
6161
6262 let USDN = getBase58FromOracle(kUSDNAssetId)
6363
6464 let EURN = getBase58FromOracle(kEURNAssetId)
6565
6666 let stakingAssets = getStringValue(oracle, kStakingAssets)
6767
6868 let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
6969
7070 let active = valueOrElse(getBoolean(this, kActive), true)
7171
7272 func isActive () = if (if (active)
7373 then activeGlob
7474 else false)
7575 then unit
7676 else throw("DApp is inactive at this moment")
7777
7878
7979 func isGlobalCaller (caller) = if ((caller == cpmmContract))
8080 then unit
8181 else throw("Only global Contract can invoke this function")
8282
8383
8484 func isAdminCall (callerPubKey) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], callerPubKey))
8585 then unit
8686 else throw("Only admin can call this function")
8787
8888
8989 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
9090
9191
9292 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
9393 then if ((assetId == USDN))
9494 then $Tuple2("lockNeutrino", stakingUSDNAddress)
9595 else $Tuple2("startStaking", stakingEURNAddress)
9696 else if ((assetId == USDN))
9797 then $Tuple2("unlockNeutrino", stakingUSDNAddress)
9898 else $Tuple2("stopStaking", stakingEURNAddress)
9999
100100
101101 func calcStakingParams (stake,amount,assetId) = if (stake)
102102 then {
103103 let $t025932659 = calcStakingFuncAndAddres(stake, assetId)
104104 let call = $t025932659._1
105105 let stakingAddr = $t025932659._2
106106 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
107107 }
108108 else {
109109 let $t027452811 = calcStakingFuncAndAddres(stake, assetId)
110110 let call = $t027452811._1
111111 let stakingAddr = $t027452811._2
112112 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
113113 }
114114
115115
116116 func collectPayments (acc,payment) = {
117117 let $t029733016 = acc
118118 let paymentAmounts = $t029733016._1
119119 let paymentAssetIds = $t029733016._2
120120 $Tuple2((paymentAmounts :+ payment.amount), (paymentAssetIds :+ (if ((payment.assetId == unit))
121121 then base58''
122122 else payment.assetId)))
123123 }
124124
125125
126126 func collectState (result,source) = match source {
127127 case e: Issue|Burn|Reissue|ScriptTransfer|BinaryEntry|BooleanEntry|StringEntry|IntegerEntry =>
128128 (result :+ e)
129129 case _ =>
130130 result
131131 }
132132
133133
134134 func collectData (result,source) = match source {
135135 case v: String =>
136136 (result :+ v)
137137 case v: Int =>
138138 (result :+ v)
139139 case v: Boolean =>
140140 (result :+ v)
141141 case v: ByteVector =>
142142 (result :+ v)
143143 case v: Unit =>
144144 (result :+ v)
145145 case _ =>
146146 throw()
147147 }
148148
149149
150150 func callCommon (funcName,caller,args,payments) = valueOrElse(isActive(), {
151151 let $t039364020 = {
152152 let $l = payments
153153 let $s = size($l)
154154 let $acc0 = $Tuple2(nil, nil)
155155 func $f0_1 ($a,$i) = if (($i >= $s))
156156 then $a
157157 else collectPayments($a, $l[$i])
158158
159159 func $f0_2 ($a,$i) = if (($i >= $s))
160160 then $a
161161 else throw("List size exceeds 10")
162162
163163 $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)
164164 }
165165 let paymentAmounts = $t039364020._1
166166 let paymentAssetIds = $t039364020._2
167167 let lockPayment = if (if ((funcName == "replenishWithTwoTokens"))
168168 then (size(payments) == 3)
169169 else false)
170170 then [payments[2]]
171171 else if (if ((funcName == "replenishWithOneToken"))
172172 then (size(payments) == 2)
173173 else false)
174174 then [payments[1]]
175175 else nil
176- let $t042504407 = {
176+ let $t042494406 = {
177177 let @ = reentrantInvoke(cpmmContract, funcName, [caller, args, paymentAmounts, paymentAssetIds], lockPayment)
178178 if ($isInstanceOf(@, "(List[Any], List[Any])"))
179179 then @
180180 else throw(($getType(@) + " couldn't be cast to (List[Any], List[Any])"))
181181 }
182- if (($t042504407 == $t042504407))
182+ if (($t042494406 == $t042494406))
183183 then {
184- let data = $t042504407._2
185- let actions = $t042504407._1
184+ let data = $t042494406._2
185+ let actions = $t042494406._1
186186 let mappedData = {
187187 let $l = data
188188 let $s = size($l)
189189 let $acc0 = nil
190190 func $f1_1 ($a,$i) = if (($i >= $s))
191191 then $a
192192 else collectData($a, $l[$i])
193193
194194 func $f1_2 ($a,$i) = if (($i >= $s))
195195 then $a
196196 else throw("List size exceeds 10")
197197
198198 $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)
199199 }
200200 let mappedActions = {
201201 let $l = actions
202202 let $s = size($l)
203203 let $acc0 = nil
204204 func $f2_1 ($a,$i) = if (($i >= $s))
205205 then $a
206206 else collectState($a, $l[$i])
207207
208208 func $f2_2 ($a,$i) = if (($i >= $s))
209209 then $a
210210 else throw("List size exceeds 15")
211211
212212 $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)
213213 }
214214 $Tuple2(mappedActions, mappedData)
215215 }
216216 else throw("Strict value is not equal to itself.")
217217 })
218218
219219
220220 @Callable(i)
221221 func callFunction (funcName,args) = callCommon(funcName, i.caller.bytes, args, i.payments)
222222
223223
224224
225225 @Callable(i)
226226 func shutdown () = valueOrElse(isAdminCall(i.callerPublicKey), if (!(active))
227227 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
228228 else suspend("Paused by admin"))
229229
230230
231231
232232 @Callable(i)
233233 func activate () = valueOrElse(isAdminCall(i.callerPublicKey), if (active)
234234 then throw("DApp is already active")
235235 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
236236
237237
238238
239239 @Callable(i)
240-func stakeUnstake (stake,amount,assetIdString) = valueOrElse(isActive(), if ((i.caller != cpmmContract))
241- then throw("Only global Contract can invoke this function")
242- else if ((assetIdString == "WAVES"))
243- then {
244- let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, kLeasingPool), "No leasing pool in oracle"))
245- let leasingId = getBinary(this, kLeasingId)
246- let leasingAmount = valueOrElse(getInteger(this, kLeasingAmount), 0)
247- let newLeaseAmount = if (stake)
248- then (leasingAmount + amount)
249- else (leasingAmount - amount)
250- let newLease = Lease(pool, newLeaseAmount)
251- let newLeaseId = calculateLeaseId(newLease)
252- let baseEtry = [newLease, BinaryEntry(kLeasingId, newLeaseId), IntegerEntry(kLeasingAmount, newLeaseAmount)]
253- match leasingId {
254- case lId: ByteVector =>
255- ([LeaseCancel(lId)] ++ baseEtry)
256- case _ =>
257- baseEtry
258- }
259- }
260- else {
261- let $t064036506 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
262- let call = $t064036506._1
263- let addr = $t064036506._2
264- let params = $t064036506._3
265- let payments = $t064036506._4
266- let inv = invoke(addr, call, params, payments)
267- if ((inv == inv))
268- then nil
269- else throw("Strict value is not equal to itself.")
270- })
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+ }))
271279
272280
273281
274282 @Callable(i)
275283 func reissueShareToken (amount) = valueOrElse(isGlobalCaller(i.caller), valueOrElse(isActive(), {
276284 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
277285 [Reissue(shareAssetId, amount, true), ScriptTransfer(i.caller, amount, shareAssetId)]
278286 }))
279287
280288
281289
282290 @Callable(i)
283291 func replenishWithTwoTokens (slippageTolerance) = callCommon("replenishWithTwoTokens", i.caller.bytes, ["false", "0"], i.payments)
284292
285293
286294
287295 @Callable(i)
288296 func withdraw () = callCommon("withdraw", i.caller.bytes, ["0"], i.payments)
289297
290298
291299
292300 @Callable(i)
293301 func exchange (minAmountToReceive) = callCommon("exchange", i.caller.bytes, [toString(minAmountToReceive)], i.payments)
294302
295303
296304 @Verifier(tx)
297305 func verify () = {
298306 let multiSignedByAdmins = {
299307 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
300308 then 1
301309 else 0
302310 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
303311 then 1
304312 else 0
305313 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
306314 then 1
307315 else 0
308316 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
309317 }
310318 multiSignedByAdmins
311319 }
312320

github/deemru/w8io/786bc32 
44.81 ms