tx · GzTi56tZmnqnJGUXAt5H7xCPFYXWxkqLY6UJrDuKydnb

3N1MvShcUgGjWDvcRYZN4cp1Sh9rAsj8Z77:  -0.10000000 Waves

2023.01.24 11:59 [2418832] smart account 3N1MvShcUgGjWDvcRYZN4cp1Sh9rAsj8Z77 > SELF 0.00000000 Waves

{ "type": 13, "id": "GzTi56tZmnqnJGUXAt5H7xCPFYXWxkqLY6UJrDuKydnb", "fee": 10000000, "feeAssetId": null, "timestamp": 1674550826040, "version": 2, "chainId": 84, "sender": "3N1MvShcUgGjWDvcRYZN4cp1Sh9rAsj8Z77", "senderPublicKey": "CbEqmUJa3RTP3dRGztuPxb5k45ikmHMijSeVYzUDgSr4", "proofs": [ "4Ps1MwvLuW3UnpdmpBEXA4orrR1XMau3MAb5WXYhUiNjCcxCpimKgHkvfdPcVY2FjT2ywNNHvDaqPcBHSpX6FrvW", "5dm2pNAkK27V84ZZVyA6fvPqhgzWrH5ic1J2vFhA5qDxx99XPxwgMgmC5HjbfpFQeLgLYzTvTqsp6DtZqisw5STV" ], "script": "base64:BgImCAISBAoCCBgSABIAEgUKAwQBCBIAEgMKAQESAwoBARIAEgMKAQEpAAdrQWN0aXZlAgZhY3RpdmUAC2tBY3RpdmVHbG9iAhRhY3RpdmVfYWxsX2NvbnRyYWN0cwAGa0NhdXNlAg5zaHV0ZG93bl9jYXVzZQAMa1VTRE5BZGRyZXNzAhhzdGFraW5nX3VzZG5uc2J0X2FkZHJlc3MADGtFVVJOQWRkcmVzcwIUc3Rha2luZ19ldXJuX2FkZHJlc3MADGtMZWFzaW5nUG9vbAIPbGVhc2luZ19hZGRyZXNzAA5rTGVhc2luZ0Ftb3VudAIObGVhc2luZ19hbW91bnQACmtMZWFzaW5nSWQCCmxlYXNpbmdfaWQADWtBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA1rQWRtaW5QdWJLZXkyAgthZG1pbl9wdWJfMgANa0FkbWluUHViS2V5MwILYWRtaW5fcHViXzMAEmtBZG1pbkludm9rZVB1YktleQIQYWRtaW5faW52b2tlX3B1YgANa0NwbW1Db250cmFjdAINY3BtbV9jb250cmFjdAAMa1VTRE5Bc3NldElkAg11c2RuX2Fzc2V0X2lkAAxrRVVSTkFzc2V0SWQCDWV1cm5fYXNzZXRfaWQADmtTdGFraW5nQXNzZXRzAg5zdGFraW5nX2Fzc2V0cwANa1NoYXJlQXNzZXRJZAIOc2hhcmVfYXNzZXRfaWQABm9yYWNsZQkBB0FkZHJlc3MBARoBVEgTlwzA0zPMJTKAtin3p2RogKvjzHtLmQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEDa2V5BAckbWF0Y2gwCQCdCAIFBm9yYWNsZQUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgEJAKwCAgUDa2V5AghpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MwARYWRtaW5QdWJLZXlJbnZva2UJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUSa0FkbWluSW52b2tlUHViS2V5ABJzdGFraW5nVVNETkFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrVVNETkFkZHJlc3MAEnN0YWtpbmdFVVJOQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtFVVJOQWRkcmVzcwAMY3BtbUNvbnRyYWN0CQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0NwbW1Db250cmFjdAAEVVNETgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrVVNETkFzc2V0SWQABEVVUk4JARNnZXRCYXNlNThGcm9tT3JhY2xlAQUMa0VVUk5Bc3NldElkAA1zdGFraW5nQXNzZXRzCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFDmtTdGFraW5nQXNzZXRzAAphY3RpdmVHbG9iCQELdmFsdWVPckVsc2UCCQCbCAIFBm9yYWNsZQULa0FjdGl2ZUdsb2IGAAZhY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYBCGlzQWN0aXZlAAMDBQZhY3RpdmUFCmFjdGl2ZUdsb2IHBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAEOaXNHbG9iYWxDYWxsZXIBBmNhbGxlcgMJAAACBQZjYWxsZXIFDGNwbW1Db250cmFjdAUEdW5pdAkAAgECLU9ubHkgZ2xvYmFsIENvbnRyYWN0IGNhbiBpbnZva2UgdGhpcyBmdW5jdGlvbgELaXNBZG1pbkNhbGwBDGNhbGxlclB1YktleQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwFDGNhbGxlclB1YktleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEHc3VzcGVuZAEFY2F1c2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtDYXVzZQUFY2F1c2UFA25pbAEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgVzdGFrZQdhc3NldElkAwUFc3Rha2UDCQAAAgUHYXNzZXRJZAUEVVNETgkAlAoCAgxsb2NrTmV1dHJpbm8FEnN0YWtpbmdVU0ROQWRkcmVzcwkAlAoCAgxzdGFydFN0YWtpbmcFEnN0YWtpbmdFVVJOQWRkcmVzcwMJAAACBQdhc3NldElkBQRVU0ROCQCUCgICDnVubG9ja05ldXRyaW5vBRJzdGFraW5nVVNETkFkZHJlc3MJAJQKAgILc3RvcFN0YWtpbmcFEnN0YWtpbmdFVVJOQWRkcmVzcwERY2FsY1N0YWtpbmdQYXJhbXMDBXN0YWtlBmFtb3VudAdhc3NldElkAwUFc3Rha2UECyR0MDI1OTMyNjU5CQEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgUFc3Rha2UFB2Fzc2V0SWQEBGNhbGwIBQskdDAyNTkzMjY1OQJfMQQLc3Rha2luZ0FkZHIIBQskdDAyNTkzMjY1OQJfMgkAlgoEBQRjYWxsBQtzdGFraW5nQWRkcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQdhc3NldElkBQZhbW91bnQFA25pbAQLJHQwMjc0NTI4MTEJARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBQVzdGFrZQUHYXNzZXRJZAQEY2FsbAgFCyR0MDI3NDUyODExAl8xBAtzdGFraW5nQWRkcggFCyR0MDI3NDUyODExAl8yCQCWCgQFBGNhbGwFC3N0YWtpbmdBZGRyCQDMCAIFBmFtb3VudAkAzAgCCQDYBAEFB2Fzc2V0SWQFA25pbAUDbmlsAQ9jb2xsZWN0UGF5bWVudHMCA2FjYwdwYXltZW50BAskdDAyOTczMzAxNgUDYWNjBA5wYXltZW50QW1vdW50cwgFCyR0MDI5NzMzMDE2Al8xBA9wYXltZW50QXNzZXRJZHMIBQskdDAyOTczMzAxNgJfMgkAlAoCCQDNCAIFDnBheW1lbnRBbW91bnRzCAUHcGF5bWVudAZhbW91bnQJAM0IAgUPcGF5bWVudEFzc2V0SWRzAwkAAAIIBQdwYXltZW50B2Fzc2V0SWQFBHVuaXQBAAgFB3BheW1lbnQHYXNzZXRJZAEMY29sbGVjdFN0YXRlAgZyZXN1bHQGc291cmNlBAckbWF0Y2gwBQZzb3VyY2UDAwkAAQIFByRtYXRjaDACBUlzc3VlBgMJAAECBQckbWF0Y2gwAgRCdXJuBgMJAAECBQckbWF0Y2gwAgdSZWlzc3VlBgMJAAECBQckbWF0Y2gwAg5TY3JpcHRUcmFuc2ZlcgYDCQABAgUHJG1hdGNoMAILQmluYXJ5RW50cnkGAwkAAQIFByRtYXRjaDACDEJvb2xlYW5FbnRyeQYDCQABAgUHJG1hdGNoMAILU3RyaW5nRW50cnkGCQABAgUHJG1hdGNoMAIMSW50ZWdlckVudHJ5BAFlBQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBZQUGcmVzdWx0AQtjb2xsZWN0RGF0YQIGcmVzdWx0BnNvdXJjZQQHJG1hdGNoMAUGc291cmNlAwkAAQIFByRtYXRjaDACBlN0cmluZwQBdgUHJG1hdGNoMAkAzQgCBQZyZXN1bHQFAXYDCQABAgUHJG1hdGNoMAIDSW50BAF2BQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBdgMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAF2BQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBdgMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAF2BQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBdgMJAAECBQckbWF0Y2gwAgRVbml0BAF2BQckbWF0Y2gwCQDNCAIFBnJlc3VsdAUBdgkBBXRocm93AAEKY2FsbENvbW1vbgQIZnVuY05hbWUGY2FsbGVyBGFyZ3MIcGF5bWVudHMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAECyR0MDM5MzY0MDIwCgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPY29sbGVjdFBheW1lbnRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBA5wYXltZW50QW1vdW50cwgFCyR0MDM5MzY0MDIwAl8xBA9wYXltZW50QXNzZXRJZHMIBQskdDAzOTM2NDAyMAJfMgQLbG9ja1BheW1lbnQDAwkAAAIFCGZ1bmNOYW1lAhZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zCQAAAgkAkAMBBQhwYXltZW50cwADBwkAzAgCCQCRAwIFCHBheW1lbnRzAAIFA25pbAMDCQAAAgUIZnVuY05hbWUCFXJlcGxlbmlzaFdpdGhPbmVUb2tlbgkAAAIJAJADAQUIcGF5bWVudHMAAgcJAMwIAgkAkQMCBQhwYXltZW50cwABBQNuaWwFA25pbAQLJHQwNDI0OTQ0MDYKAAFACQD9BwQFDGNwbW1Db250cmFjdAUIZnVuY05hbWUJAMwIAgUGY2FsbGVyCQDMCAIFBGFyZ3MJAMwIAgUOcGF5bWVudEFtb3VudHMJAMwIAgUPcGF5bWVudEFzc2V0SWRzBQNuaWwFC2xvY2tQYXltZW50AwkAAQIFAUACFihMaXN0W0FueV0sIExpc3RbQW55XSkFAUAJAAIBCQCsAgIJAAMBBQFAAisgY291bGRuJ3QgYmUgY2FzdCB0byAoTGlzdFtBbnldLCBMaXN0W0FueV0pAwkAAAIFCyR0MDQyNDk0NDA2BQskdDA0MjQ5NDQwNgQEZGF0YQgFCyR0MDQyNDk0NDA2Al8yBAdhY3Rpb25zCAULJHQwNDI0OTQ0MDYCXzEECm1hcHBlZERhdGEKAAIkbAUEZGF0YQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQELY29sbGVjdERhdGECBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEDW1hcHBlZEFjdGlvbnMKAAIkbAUHYWN0aW9ucwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMl8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMY29sbGVjdFN0YXRlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYyXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMl8yAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwkAlAoCBQ1tYXBwZWRBY3Rpb25zBQptYXBwZWREYXRhCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQFpAQxjYWxsRnVuY3Rpb24CCGZ1bmNOYW1lBGFyZ3MJAQpjYWxsQ29tbW9uBAUIZnVuY05hbWUICAUBaQZjYWxsZXIFYnl0ZXMFBGFyZ3MIBQFpCHBheW1lbnRzAWkBCHNodXRkb3duAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQgFAWkPY2FsbGVyUHVibGljS2V5AwkBASEBBQZhY3RpdmUJAAIBCQCsAgICIkRBcHAgaXMgYWxyZWFkeSBzdXNwZW5kZWQuIENhdXNlOiAJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUGa0NhdXNlAhp0aGUgY2F1c2Ugd2Fzbid0IHNwZWNpZmllZAkBB3N1c3BlbmQBAg9QYXVzZWQgYnkgYWRtaW4BaQEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDBQZhY3RpdmUJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCCQELRGVsZXRlRW50cnkBBQZrQ2F1c2UFA25pbAFpAQxzdGFrZVVuc3Rha2UDBXN0YWtlBmFtb3VudA1hc3NldElkU3RyaW5nCQELdmFsdWVPckVsc2UCCQEOaXNHbG9iYWxDYWxsZXIBCAUBaQZjYWxsZXIJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQAAAgUNYXNzZXRJZFN0cmluZwIFV0FWRVMEBHBvb2wJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQZvcmFjbGUFDGtMZWFzaW5nUG9vbAIZTm8gbGVhc2luZyBwb29sIGluIG9yYWNsZQQJbGVhc2luZ0lkCQCcCAIFBHRoaXMFCmtMZWFzaW5nSWQEDWxlYXNpbmdBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUOa0xlYXNpbmdBbW91bnQAAAQObmV3TGVhc2VBbW91bnQDBQVzdGFrZQkAZAIFDWxlYXNpbmdBbW91bnQFBmFtb3VudAkAZQIFDWxlYXNpbmdBbW91bnQFBmFtb3VudAQIbmV3TGVhc2UJAMQIAgUEcG9vbAUObmV3TGVhc2VBbW91bnQECm5ld0xlYXNlSWQJALkIAQUIbmV3TGVhc2UECGJhc2VFdHJ5CQDMCAIFCG5ld0xlYXNlCQDMCAIJAQtCaW5hcnlFbnRyeQIFCmtMZWFzaW5nSWQFCm5ld0xlYXNlSWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtMZWFzaW5nQW1vdW50BQ5uZXdMZWFzZUFtb3VudAUDbmlsBAckbWF0Y2gwBQlsZWFzaW5nSWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQDbElkBQckbWF0Y2gwCQDOCAIJAMwIAgkBC0xlYXNlQ2FuY2VsAQUDbElkBQNuaWwFCGJhc2VFdHJ5BQhiYXNlRXRyeQQLJHQwNjMyNDY0MjcJARFjYWxjU3Rha2luZ1BhcmFtcwMFBXN0YWtlBQZhbW91bnQJANkEAQUNYXNzZXRJZFN0cmluZwQEY2FsbAgFCyR0MDYzMjQ2NDI3Al8xBARhZGRyCAULJHQwNjMyNDY0MjcCXzIEBnBhcmFtcwgFCyR0MDYzMjQ2NDI3Al8zBAhwYXltZW50cwgFCyR0MDYzMjQ2NDI3Al80BANpbnYJAPwHBAUEYWRkcgUEY2FsbAUGcGFyYW1zBQhwYXltZW50cwMJAAACBQNpbnYFA2ludgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE2NsYWltTmV0cmlub1Jld2FyZHMACQELdmFsdWVPckVsc2UCCQEOaXNHbG9iYWxDYWxsZXIBCAUBaQZjYWxsZXIJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEA2ludgkA/AcEBRJzdGFraW5nVVNETkFkZHJlc3MCDGNsYWltUmV3YXJkcwUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYJAJQKAgUDbmlsBQNpbnYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERcmVpc3N1ZVNoYXJlVG9rZW4BBmFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBDmlzR2xvYmFsQ2FsbGVyAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAxzaGFyZUFzc2V0SWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUNa1NoYXJlQXNzZXRJZAkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAUGYW1vdW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmFtb3VudAUMc2hhcmVBc3NldElkBQNuaWwBaQEWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwERc2xpcHBhZ2VUb2xlcmFuY2UJAQpjYWxsQ29tbW9uBAIWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwgIBQFpBmNhbGxlcgVieXRlcwkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwIBQFpCHBheW1lbnRzAWkBCHdpdGhkcmF3AAkBCmNhbGxDb21tb24EAgh3aXRoZHJhdwgIBQFpBmNhbGxlcgVieXRlcwkAzAgCAgEwBQNuaWwIBQFpCHBheW1lbnRzAWkBCGV4Y2hhbmdlARJtaW5BbW91bnRUb1JlY2VpdmUJAQpjYWxsQ29tbW9uBAIIZXhjaGFuZ2UICAUBaQZjYWxsZXIFYnl0ZXMJAMwIAgkApAMBBRJtaW5BbW91bnRUb1JlY2VpdmUFA25pbAgFAWkIcGF5bWVudHMBAnR4AQZ2ZXJpZnkABBNtdWx0aVNpZ25lZEJ5QWRtaW5zBBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQxhZG1pblB1YktleTIAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQxhZG1pblB1YktleTMAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIFE211bHRpU2lnbmVkQnlBZG1pbnOCFYaH", "height": 2418832, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5fzpwRTRw119f6ejAPzb3viUvukvXJD8DqYxaQcQuYQm Next: DZe1WpN96w3cKvReQAZPPt5uRDnsNtM4FghMRXxUBpgS Diff:
OldNewDifferences
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let kActive = "active"
5+
6+let kActiveGlob = "active_all_contracts"
57
68 let kCause = "shutdown_cause"
79
6365
6466 let stakingAssets = getStringValue(oracle, kStakingAssets)
6567
68+let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
69+
6670 let active = valueOrElse(getBoolean(this, kActive), true)
6771
68-func isActive () = if (active)
72+func isActive () = if (if (active)
73+ then activeGlob
74+ else false)
6975 then unit
7076 else throw("DApp is inactive at this moment")
7177
94100
95101 func calcStakingParams (stake,amount,assetId) = if (stake)
96102 then {
97- let $t024732539 = calcStakingFuncAndAddres(stake, assetId)
98- let call = $t024732539._1
99- let stakingAddr = $t024732539._2
103+ let $t025932659 = calcStakingFuncAndAddres(stake, assetId)
104+ let call = $t025932659._1
105+ let stakingAddr = $t025932659._2
100106 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
101107 }
102108 else {
103- let $t026252691 = calcStakingFuncAndAddres(stake, assetId)
104- let call = $t026252691._1
105- let stakingAddr = $t026252691._2
109+ let $t027452811 = calcStakingFuncAndAddres(stake, assetId)
110+ let call = $t027452811._1
111+ let stakingAddr = $t027452811._2
106112 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
107113 }
108114
109115
110116 func collectPayments (acc,payment) = {
111- let $t028532896 = acc
112- let paymentAmounts = $t028532896._1
113- let paymentAssetIds = $t028532896._2
117+ let $t029733016 = acc
118+ let paymentAmounts = $t029733016._1
119+ let paymentAssetIds = $t029733016._2
114120 $Tuple2((paymentAmounts :+ payment.amount), (paymentAssetIds :+ (if ((payment.assetId == unit))
115121 then base58''
116122 else payment.assetId)))
134140 (result :+ v)
135141 case v: ByteVector =>
136142 (result :+ v)
143+ case v: Unit =>
144+ (result :+ v)
137145 case _ =>
138146 throw()
139147 }
140148
141149
142-@Callable(i)
143-func callFunction (funcName,args) = valueOrElse(isActive(), {
144- let $t037383824 = {
145- let $l = i.payments
150+func callCommon (funcName,caller,args,payments) = valueOrElse(isActive(), {
151+ let $t039364020 = {
152+ let $l = payments
146153 let $s = size($l)
147154 let $acc0 = $Tuple2(nil, nil)
148155 func $f0_1 ($a,$i) = if (($i >= $s))
155162
156163 $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)
157164 }
158- let paymentAmounts = $t037383824._1
159- let paymentAssetIds = $t037383824._2
160- let $t038273983 = {
161- let @ = reentrantInvoke(cpmmContract, funcName, [i.caller.bytes, args, paymentAmounts, paymentAssetIds], nil)
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)
162178 if ($isInstanceOf(@, "(List[Any], List[Any])"))
163179 then @
164180 else throw(($getType(@) + " couldn't be cast to (List[Any], List[Any])"))
165181 }
166- if (($t038273983 == $t038273983))
182+ if (($t042494406 == $t042494406))
167183 then {
168- let data = $t038273983._2
169- let actions = $t038273983._1
184+ let data = $t042494406._2
185+ let actions = $t042494406._1
170186 let mappedData = {
171187 let $l = data
172188 let $s = size($l)
201217 })
202218
203219
220+@Callable(i)
221+func callFunction (funcName,args) = callCommon(funcName, i.caller.bytes, args, i.payments)
222+
223+
204224
205225 @Callable(i)
206226 func shutdown () = valueOrElse(isAdminCall(i.callerPublicKey), if (!(active))
217237
218238
219239 @Callable(i)
220-func stakeUnstake (stake,amount,assetIdString) = valueOrElse(isGlobalCaller(i.caller), valueOrElse(isActive(), if ((i.caller != cpmmContract))
221- then throw("Only global Contract can invoke this function")
222- else if ((assetIdString == "WAVES"))
223- then {
224- let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, kLeasingPool), "No leasing pool in oracle"))
225- let leasingId = getBinary(this, kLeasingId)
226- let leasingAmount = valueOrElse(getInteger(this, kLeasingAmount), 0)
227- let newLeaseAmount = if (stake)
228- then (leasingAmount + amount)
229- else (leasingAmount - amount)
230- let newLease = Lease(pool, newLeaseAmount)
231- let newLeaseId = calculateLeaseId(newLease)
232- let baseEtry = [newLease, BinaryEntry(kLeasingId, newLeaseId), IntegerEntry(kLeasingAmount, newLeaseAmount)]
233- match leasingId {
234- case lId: ByteVector =>
235- ([LeaseCancel(lId)] ++ baseEtry)
236- case _ =>
237- baseEtry
238- }
239- }
240- else {
241- let $t059776080 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
242- let call = $t059776080._1
243- let addr = $t059776080._2
244- let params = $t059776080._3
245- let payments = $t059776080._4
246- let inv = invoke(addr, call, params, payments)
247- if ((inv == inv))
248- then nil
249- else throw("Strict value is not equal to itself.")
250- }))
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+ }))
251279
252280
253281
256284 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
257285 [Reissue(shareAssetId, amount, true), ScriptTransfer(i.caller, amount, shareAssetId)]
258286 }))
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)
259302
260303
261304 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let kActive = "active"
5+
6+let kActiveGlob = "active_all_contracts"
57
68 let kCause = "shutdown_cause"
79
810 let kUSDNAddress = "staking_usdnnsbt_address"
911
1012 let kEURNAddress = "staking_eurn_address"
1113
1214 let kLeasingPool = "leasing_address"
1315
1416 let kLeasingAmount = "leasing_amount"
1517
1618 let kLeasingId = "leasing_id"
1719
1820 let kAdminPubKey1 = "admin_pub_1"
1921
2022 let kAdminPubKey2 = "admin_pub_2"
2123
2224 let kAdminPubKey3 = "admin_pub_3"
2325
2426 let kAdminInvokePubKey = "admin_invoke_pub"
2527
2628 let kCpmmContract = "cpmm_contract"
2729
2830 let kUSDNAssetId = "usdn_asset_id"
2931
3032 let kEURNAssetId = "eurn_asset_id"
3133
3234 let kStakingAssets = "staking_assets"
3335
3436 let kShareAssetId = "share_asset_id"
3537
3638 let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
3739
3840 func getBase58FromOracle (key) = match getString(oracle, key) {
3941 case string: String =>
4042 fromBase58String(string)
4143 case nothing =>
4244 throw((key + "is empty"))
4345 }
4446
4547
4648 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
4749
4850 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
4951
5052 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
5153
5254 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
5355
5456 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
5557
5658 let stakingEURNAddress = Address(getBase58FromOracle(kEURNAddress))
5759
5860 let cpmmContract = Address(getBase58FromOracle(kCpmmContract))
5961
6062 let USDN = getBase58FromOracle(kUSDNAssetId)
6163
6264 let EURN = getBase58FromOracle(kEURNAssetId)
6365
6466 let stakingAssets = getStringValue(oracle, kStakingAssets)
6567
68+let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
69+
6670 let active = valueOrElse(getBoolean(this, kActive), true)
6771
68-func isActive () = if (active)
72+func isActive () = if (if (active)
73+ then activeGlob
74+ else false)
6975 then unit
7076 else throw("DApp is inactive at this moment")
7177
7278
7379 func isGlobalCaller (caller) = if ((caller == cpmmContract))
7480 then unit
7581 else throw("Only global Contract can invoke this function")
7682
7783
7884 func isAdminCall (callerPubKey) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], callerPubKey))
7985 then unit
8086 else throw("Only admin can call this function")
8187
8288
8389 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
8490
8591
8692 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
8793 then if ((assetId == USDN))
8894 then $Tuple2("lockNeutrino", stakingUSDNAddress)
8995 else $Tuple2("startStaking", stakingEURNAddress)
9096 else if ((assetId == USDN))
9197 then $Tuple2("unlockNeutrino", stakingUSDNAddress)
9298 else $Tuple2("stopStaking", stakingEURNAddress)
9399
94100
95101 func calcStakingParams (stake,amount,assetId) = if (stake)
96102 then {
97- let $t024732539 = calcStakingFuncAndAddres(stake, assetId)
98- let call = $t024732539._1
99- let stakingAddr = $t024732539._2
103+ let $t025932659 = calcStakingFuncAndAddres(stake, assetId)
104+ let call = $t025932659._1
105+ let stakingAddr = $t025932659._2
100106 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
101107 }
102108 else {
103- let $t026252691 = calcStakingFuncAndAddres(stake, assetId)
104- let call = $t026252691._1
105- let stakingAddr = $t026252691._2
109+ let $t027452811 = calcStakingFuncAndAddres(stake, assetId)
110+ let call = $t027452811._1
111+ let stakingAddr = $t027452811._2
106112 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
107113 }
108114
109115
110116 func collectPayments (acc,payment) = {
111- let $t028532896 = acc
112- let paymentAmounts = $t028532896._1
113- let paymentAssetIds = $t028532896._2
117+ let $t029733016 = acc
118+ let paymentAmounts = $t029733016._1
119+ let paymentAssetIds = $t029733016._2
114120 $Tuple2((paymentAmounts :+ payment.amount), (paymentAssetIds :+ (if ((payment.assetId == unit))
115121 then base58''
116122 else payment.assetId)))
117123 }
118124
119125
120126 func collectState (result,source) = match source {
121127 case e: Issue|Burn|Reissue|ScriptTransfer|BinaryEntry|BooleanEntry|StringEntry|IntegerEntry =>
122128 (result :+ e)
123129 case _ =>
124130 result
125131 }
126132
127133
128134 func collectData (result,source) = match source {
129135 case v: String =>
130136 (result :+ v)
131137 case v: Int =>
132138 (result :+ v)
133139 case v: Boolean =>
134140 (result :+ v)
135141 case v: ByteVector =>
136142 (result :+ v)
143+ case v: Unit =>
144+ (result :+ v)
137145 case _ =>
138146 throw()
139147 }
140148
141149
142-@Callable(i)
143-func callFunction (funcName,args) = valueOrElse(isActive(), {
144- let $t037383824 = {
145- let $l = i.payments
150+func callCommon (funcName,caller,args,payments) = valueOrElse(isActive(), {
151+ let $t039364020 = {
152+ let $l = payments
146153 let $s = size($l)
147154 let $acc0 = $Tuple2(nil, nil)
148155 func $f0_1 ($a,$i) = if (($i >= $s))
149156 then $a
150157 else collectPayments($a, $l[$i])
151158
152159 func $f0_2 ($a,$i) = if (($i >= $s))
153160 then $a
154161 else throw("List size exceeds 10")
155162
156163 $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)
157164 }
158- let paymentAmounts = $t037383824._1
159- let paymentAssetIds = $t037383824._2
160- let $t038273983 = {
161- let @ = reentrantInvoke(cpmmContract, funcName, [i.caller.bytes, args, paymentAmounts, paymentAssetIds], nil)
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)
162178 if ($isInstanceOf(@, "(List[Any], List[Any])"))
163179 then @
164180 else throw(($getType(@) + " couldn't be cast to (List[Any], List[Any])"))
165181 }
166- if (($t038273983 == $t038273983))
182+ if (($t042494406 == $t042494406))
167183 then {
168- let data = $t038273983._2
169- let actions = $t038273983._1
184+ let data = $t042494406._2
185+ let actions = $t042494406._1
170186 let mappedData = {
171187 let $l = data
172188 let $s = size($l)
173189 let $acc0 = nil
174190 func $f1_1 ($a,$i) = if (($i >= $s))
175191 then $a
176192 else collectData($a, $l[$i])
177193
178194 func $f1_2 ($a,$i) = if (($i >= $s))
179195 then $a
180196 else throw("List size exceeds 10")
181197
182198 $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)
183199 }
184200 let mappedActions = {
185201 let $l = actions
186202 let $s = size($l)
187203 let $acc0 = nil
188204 func $f2_1 ($a,$i) = if (($i >= $s))
189205 then $a
190206 else collectState($a, $l[$i])
191207
192208 func $f2_2 ($a,$i) = if (($i >= $s))
193209 then $a
194210 else throw("List size exceeds 15")
195211
196212 $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)
197213 }
198214 $Tuple2(mappedActions, mappedData)
199215 }
200216 else throw("Strict value is not equal to itself.")
201217 })
202218
203219
220+@Callable(i)
221+func callFunction (funcName,args) = callCommon(funcName, i.caller.bytes, args, i.payments)
222+
223+
204224
205225 @Callable(i)
206226 func shutdown () = valueOrElse(isAdminCall(i.callerPublicKey), if (!(active))
207227 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
208228 else suspend("Paused by admin"))
209229
210230
211231
212232 @Callable(i)
213233 func activate () = valueOrElse(isAdminCall(i.callerPublicKey), if (active)
214234 then throw("DApp is already active")
215235 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
216236
217237
218238
219239 @Callable(i)
220-func stakeUnstake (stake,amount,assetIdString) = valueOrElse(isGlobalCaller(i.caller), valueOrElse(isActive(), if ((i.caller != cpmmContract))
221- then throw("Only global Contract can invoke this function")
222- else if ((assetIdString == "WAVES"))
223- then {
224- let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, kLeasingPool), "No leasing pool in oracle"))
225- let leasingId = getBinary(this, kLeasingId)
226- let leasingAmount = valueOrElse(getInteger(this, kLeasingAmount), 0)
227- let newLeaseAmount = if (stake)
228- then (leasingAmount + amount)
229- else (leasingAmount - amount)
230- let newLease = Lease(pool, newLeaseAmount)
231- let newLeaseId = calculateLeaseId(newLease)
232- let baseEtry = [newLease, BinaryEntry(kLeasingId, newLeaseId), IntegerEntry(kLeasingAmount, newLeaseAmount)]
233- match leasingId {
234- case lId: ByteVector =>
235- ([LeaseCancel(lId)] ++ baseEtry)
236- case _ =>
237- baseEtry
238- }
239- }
240- else {
241- let $t059776080 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
242- let call = $t059776080._1
243- let addr = $t059776080._2
244- let params = $t059776080._3
245- let payments = $t059776080._4
246- let inv = invoke(addr, call, params, payments)
247- if ((inv == inv))
248- then nil
249- else throw("Strict value is not equal to itself.")
250- }))
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+ }))
251279
252280
253281
254282 @Callable(i)
255283 func reissueShareToken (amount) = valueOrElse(isGlobalCaller(i.caller), valueOrElse(isActive(), {
256284 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
257285 [Reissue(shareAssetId, amount, true), ScriptTransfer(i.caller, amount, shareAssetId)]
258286 }))
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)
259302
260303
261304 @Verifier(tx)
262305 func verify () = {
263306 let multiSignedByAdmins = {
264307 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
265308 then 1
266309 else 0
267310 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
268311 then 1
269312 else 0
270313 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
271314 then 1
272315 else 0
273316 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
274317 }
275318 multiSignedByAdmins
276319 }
277320

github/deemru/w8io/873ac7e 
47.72 ms