tx · FkybFb4hu6bKNc8RSp2JnDswEzAtdDmb9Bekv6P953ET

3M7uzD8rT54fKQcP4s417if1VKU8yromEP2:  -0.05500000 Waves

2025.10.16 00:21 [475366] smart account 3M7uzD8rT54fKQcP4s417if1VKU8yromEP2 > SELF 0.00000000 Waves

{ "type": 13, "id": "FkybFb4hu6bKNc8RSp2JnDswEzAtdDmb9Bekv6P953ET", "fee": 5500000, "feeAssetId": null, "timestamp": 1760563319124, "version": 2, "chainId": 82, "sender": "3M7uzD8rT54fKQcP4s417if1VKU8yromEP2", "senderPublicKey": "2eFPamS5zez1159HEFEJaxs2XPq3AupPbNApNGffRjqf", "proofs": [ "3SBZkma139Gt58rmW1otVVznHhLbijY8CTQeAjfQcLKLcFLRUCxBQpCQa45u17nsELdcgCihenmjAEZk5io6bVJX" ], "script": "base64:BgJNCAISBAoCGAESAwoBCBIDCgEIEgMKAQgSAwoBCBIHCgUICAgICBIDCgEIEgMKAQgSCQoHCAgIAQgICBIDCgEIEgMKAQgSAwoBARIAEgAPAAdWRVJTSU9OAgUxLjAuMAAFTElNSVQAAgAIa19BRE1JTlMCC0FETUlOU19QQktTAAprX01BTkFHRVJTAg1NQU5BR0VSU19QQktTAAdrX0xJTUlUAgxWT1RFU19RVU9SVU0ADmtfU0NSSVBUX1RZUEVTAgxTQ1JJUFRfVFlQRVMAC2tfSVRFUkFUSU9OAglJVEVSQVRJT04BDF92YWxpZGF0ZVBiawEDcGJrBAdhZGRyZXNzCQCnCAEJANkEAQUDcGJrAwkAAAIFB2FkZHJlc3MFB2FkZHJlc3MECmFkZHJlc3NTdHIJAKUIAQUHYWRkcmVzcwMJAAACBQphZGRyZXNzU3RyBQphZGRyZXNzU3RyBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEQX3ZhbGlkYXRlQWRkcmVzcwEHYWRkcmVzcwQEYWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUHYWRkcmVzcwMJAAACBQRhZGRyBQRhZGRyBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgELX3ZhbGlkYXRlVHMBAnRzBAZjdXJyVHMEByRtYXRjaDAJAO0HAQUGaGVpZ2h0AwkAAQIFByRtYXRjaDACCUJsb2NrSW5mbwQFYmxvY2sFByRtYXRjaDAIBQVibG9jawl0aW1lc3RhbXAJAAIBAhBDYW4ndCBmaW5kIGJsb2NrCQBmAgUCdHMFBmN1cnJUcwEJX2dldExpbWl0AAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFB2tfTElNSVQCGFF1b3J1bSBsaW1pdCBub3QgZGVmaW5lZAEIX2lzQWRtaW4BA3BiawQJYWRtaW5zU3RyCQELdmFsdWVPckVsc2UCCQCiCAEFCGtfQURNSU5TAgAEBmFkbWlucwkAtQkCBQlhZG1pbnNTdHICASwJAQIhPQIJAM8IAgUGYWRtaW5zBQNwYmsFBHVuaXQBCl9pc01hbmFnZXIBA3BiawQLbWFuYWdlcnNTdHIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUKa19NQU5BR0VSUwIABAhtYW5hZ2VycwkAtQkCBQttYW5hZ2Vyc1N0cgIBLAkBAiE9AgkAzwgCBQhtYW5hZ2VycwUDcGJrBQR1bml0ARBfaXNWYWxpZE9wZXJhdG9yAQNwYmsEC21hbmFnZXJzU3RyCQELdmFsdWVPckVsc2UCCQCiCAEFCmtfTUFOQUdFUlMCAAQIbWFuYWdlcnMJALUJAgULbWFuYWdlcnNTdHICASwEB2lzQWRtaW4JAQhfaXNBZG1pbgEFA3BiawQJaXNNYW5hZ2VyCQEKX2lzTWFuYWdlcgEFA3BiawMFB2lzQWRtaW4GBQlpc01hbmFnZXIBCnNhdmVUeERhdGECBnRhc2tJZARkYXRhBAdpbmRpY2VzCQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgUDbmlsBAhkYXRhU2l6ZQkAsQIBBQRkYXRhBAppc05vdEVtcHR5AwkBAiE9AgUIZGF0YVNpemUAAAYJAAIBAh1zYXZlVHhEYXRhOiBFbXB0eSBkYXRhIHBhc3NlZAMJAAACBQppc05vdEVtcHR5BQppc05vdEVtcHR5BAljaHVua1NpemUAsOoBBAtjaHVua3NDb3VudAMJAAACCQBqAgUIZGF0YVNpemUFCWNodW5rU2l6ZQAACQBpAgUIZGF0YVNpemUFCWNodW5rU2l6ZQkAZAIJAGkCBQhkYXRhU2l6ZQUJY2h1bmtTaXplAAEKAQptYWtlQ2h1bmtzAgVhY2N1bQVpbmRleAQFY2h1bmsJAK8CAggFBWFjY3VtAl8xBQljaHVua1NpemUDCQAAAgkAsQIBBQVjaHVuawAABQVhY2N1bQQIbmV4dERhdGEJALACAggFBWFjY3VtAl8xBQljaHVua1NpemUJAJQKAgUIbmV4dERhdGEJAM0IAggFBWFjY3VtAl8yCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUGdGFza0lkAglfX3R4ZGF0YV8JAKQDAQUFaW5kZXgFBWNodW5rBAdlbnRyaWVzCgACJGwFB2luZGljZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFBGRhdGEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCD19fdHhkYXRhX2NodW5rcwkApAMBBQtjaHVua3NDb3VudAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQptYWtlQ2h1bmtzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCAUHZW50cmllcwJfMgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLg4BaQEEaW5pdAILYWRtaW5zX3Bia3MFbGltaXQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg5TZWxmIGNhbGwgb25seQQLc2l6ZV9hZG1pbnMDCQECIT0CCQCQAwEFC2FkbWluc19wYmtzAAAGCQACAQInQXQgbGVhc3Qgb25lIGFkbWluIHBiayBzaG91bGQgYmUgcGFzc2VkAwkAAAIFC3NpemVfYWRtaW5zBQtzaXplX2FkbWlucwQMY2hlY2tfYWRtaW5zAwkBASEBCQEJaXNEZWZpbmVkAQkAoggBBQhrX0FETUlOUwYJAAIBAg5BbHJlYWR5IGluaXRlZAMJAAACBQxjaGVja19hZG1pbnMFDGNoZWNrX2FkbWlucwQJemVyb0xpbWl0AwkAZgIFBWxpbWl0AAAGCQACAQITTGltaXQgc2hvdWxkIGJlID4gMAMJAAACBQl6ZXJvTGltaXQFCXplcm9MaW1pdAQIbGltaXRfb2sDCQBmAgkAkAMBBQthZG1pbnNfcGJrcwUFbGltaXQGCQACAQkArAICCQCsAgIJAKwCAgI5TGltaXQgcXVvcnVtIHNob3VsZCBiZSA8PSBzaXplIG9mIGxpc3Qgb2YgYWRtaW5zLCBsaW1pdDogCQCkAwEFBWxpbWl0AhAsIGN1cnJlbnQgc2l6ZTogCQCkAwEJAJADAQULYWRtaW5zX3Bia3MDCQAAAgUIbGltaXRfb2sFCGxpbWl0X29rCgEIdmFsaWRhdGUCBWFjY3VtBG5leHQJAQxfdmFsaWRhdGVQYmsBBQRuZXh0BAh2YWxpZFJlcwoAAiRsBQthZG1pbnNfcGJrcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIdmFsaWRhdGUCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoDCQAAAgUIdmFsaWRSZXMFCHZhbGlkUmVzBAlhZG1pbnNTdHIJALkJAgULYWRtaW5zX3Bia3MCASwJAMwIAgkBC1N0cmluZ0VudHJ5AgUIa19BRE1JTlMFCWFkbWluc1N0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgUHa19MSU1JVAUFbGltaXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhhZGRBZG1pbgEDcGJrBAljYWxsZXJQYmsJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5BAdpc0FkbWluAwkBCF9pc0FkbWluAQUJY2FsbGVyUGJrBgkAAgECGU9ubHkgYWRtaW5zIGNhbiBhZGQgYWRtaW4DCQAAAgUHaXNBZG1pbgUHaXNBZG1pbgQHaXNWYWxpZAMJAQxfdmFsaWRhdGVQYmsBBQNwYmsGCQACAQIRSW52YWxpZCBhZG1pbiBwYmsDCQAAAgUHaXNWYWxpZAUHaXNWYWxpZAQMbmV3QWRtaW5zU3RyCQCsAgIJAKwCAgkBEUBleHRyTmF0aXZlKDEwNTgpAQUIa19BRE1JTlMCASwFA3BiawkAzAgCCQELU3RyaW5nRW50cnkCBQhrX0FETUlOUwUMbmV3QWRtaW5zU3RyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELcmVtb3ZlQWRtaW4BA3BiawQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQQHaXNBZG1pbgMJAQhfaXNBZG1pbgEFCWNhbGxlclBiawYJAAIBAhlPbmx5IGFkbWlucyBjYW4gYWRkIGFkbWluAwkAAAIFB2lzQWRtaW4FB2lzQWRtaW4EB2lzVmFsaWQDCQEMX3ZhbGlkYXRlUGJrAQUDcGJrBgkAAgECEUludmFsaWQgYWRtaW4gcGJrAwkAAAIFB2lzVmFsaWQFB2lzVmFsaWQEDG9sZEFkbWluc1N0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQUIa19BRE1JTlMECW9sZEFkbWlucwkAtQkCBQxvbGRBZG1pbnNTdHICASwECmNoZWNrQ291bnQDCQBnAgABCQCQAwEFCW9sZEFkbWlucwkAAgECL0Nhbm5vdCByZW1vdmUsIGF0IGxlYXN0IG9uZSBhZG1pbiBzaG91bGQgcmVtYWluBgMJAAACBQpjaGVja0NvdW50BQpjaGVja0NvdW50BAVpbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCW9sZEFkbWlucwUDcGJrAhhUaGlzIHBiayBpcyBub3QgYW4gYWRtaW4ECW5ld0FkbWlucwkA0QgCBQlvbGRBZG1pbnMFBWluZGV4BAxuZXdBZG1pbnNTdHIJALkJAgUJbmV3QWRtaW5zAgEsCQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtfQURNSU5TBQxuZXdBZG1pbnNTdHIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1hZGRTY3JpcHRUeXBlAQpzY3JpcHRUeXBlBAljYWxsZXJQYmsJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5AwkBASEBCQEIX2lzQWRtaW4BBQljYWxsZXJQYmsJAAIBAgtOb3QgYWxsb3dlZAQKY2hlY2tFbXB0eQMJAAACCQCxAgEFCnNjcmlwdFR5cGUAAAkAAgECHFNjcmlwdCB0eXBlIGNhbiBub3QgYmUgZW1wdHkGAwkAAAIFCmNoZWNrRW1wdHkFCmNoZWNrRW1wdHkEDnNjcmlwdFR5cGVzU3RyCQELdmFsdWVPckVsc2UCCQCiCAEFDmtfU0NSSVBUX1RZUEVTAgAEC3NjcmlwdFR5cGVzCQC8CQIFDnNjcmlwdFR5cGVzU3RyAgEsBAtjaGVja0V4aXN0cwMJAQIhPQIJAM8IAgULc2NyaXB0VHlwZXMFCnNjcmlwdFR5cGUFBHVuaXQJAAIBCQCsAgIJAKwCAgINU2NyaXB0IHR5cGUgPAUKc2NyaXB0VHlwZQIPPiBhbHJlYWR5IGFkZGVkBgMJAAACBQtjaGVja0V4aXN0cwULY2hlY2tFeGlzdHMEDm5ld1NjcmlwdFR5cGVzAwkBAiE9AgUOc2NyaXB0VHlwZXNTdHICAAkAzQgCBQtzY3JpcHRUeXBlcwUKc2NyaXB0VHlwZQkAzAgCBQpzY3JpcHRUeXBlBQNuaWwEEW5ld1NjcmlwdFR5cGVzU3RyCQC5CQIFDm5ld1NjcmlwdFR5cGVzAgEsCQDMCAIJAQtTdHJpbmdFbnRyeQIFDmtfU0NSSVBUX1RZUEVTBRFuZXdTY3JpcHRUeXBlc1N0cgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEHJlbW92ZVNjcmlwdFR5cGUBCnNjcmlwdFR5cGUECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDCQEBIQEJAQhfaXNBZG1pbgEFCWNhbGxlclBiawkAAgECC05vdCBhbGxvd2VkBA5zY3JpcHRUeXBlc1N0cgkBC3ZhbHVlT3JFbHNlAgkAoggBBQ5rX1NDUklQVF9UWVBFUwIABAtzY3JpcHRUeXBlcwkAvAkCBQ5zY3JpcHRUeXBlc1N0cgIBLAQFaW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQtzY3JpcHRUeXBlcwUKc2NyaXB0VHlwZQkArAICCQCsAgICDVNjcmlwdCB0eXBlIDwFCnNjcmlwdFR5cGUCED4gaXMgbm90IHByZXNlbnQEDm5ld1NjcmlwdFR5cGVzCQDRCAIFC3NjcmlwdFR5cGVzBQVpbmRleAQRbmV3U2NyaXB0VHlwZXNTdHIJALkJAgUObmV3U2NyaXB0VHlwZXMCASwJAMwIAgkBC1N0cmluZ0VudHJ5AgUOa19TQ1JJUFRfVFlQRVMFEW5ld1NjcmlwdFR5cGVzU3RyBQNuaWwBaQEJYWRkU2NyaXB0BQpzY3JpcHRUeXBlDnN0b3JhZ2VBZGRyZXNzCnNjcmlwdEhhc2gEZGVzYwxpbml0aWF0b3JBZHIECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDCQEBIQEJARBfaXNWYWxpZE9wZXJhdG9yAQUJY2FsbGVyUGJrCQACAQILTm90IGFsbG93ZWQEEXN0b3JhZ2VTY3JpcHRIYXNoCQDYBAEJAQV2YWx1ZQEJAPEHAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUOc3RvcmFnZUFkZHJlc3MEDnNjcmlwdFR5cGVzU3RyCQERQGV4dHJOYXRpdmUoMTA1OCkBBQ5rX1NDUklQVF9UWVBFUwQRX2NoZWNrU2NyaXB0VHlwZXMDCQAAAgkAswkCBQ5zY3JpcHRUeXBlc1N0cgUKc2NyaXB0VHlwZQUEdW5pdAkAAgEJAKwCAgI1aW52YWxpZCBzY3JpcHQgdHlwZSBvciBpdCBpcyBub3QgcHJlc2VudCBpbiBzdG9yYWdlOiAFCnNjcmlwdFR5cGUGAwkAAAIFEV9jaGVja1NjcmlwdFR5cGVzBRFfY2hlY2tTY3JpcHRUeXBlcwQQX3NjcmlwdFR5cGVDaGVjawMJAQIhPQIFEXN0b3JhZ2VTY3JpcHRIYXNoBQpzY3JpcHRIYXNoCQACAQI0U3RvcmVkIGFuZCBwYXNzZWQgYXMgYXJndW1lbnQgc2NyaXB0SGFzaGVzIG5vdCBtYXRjaAYDCQAAAgUQX3NjcmlwdFR5cGVDaGVjawUQX3NjcmlwdFR5cGVDaGVjawQKX2Rlc2NDaGVjawMJAAACCQCxAgEFBGRlc2MAAAkAAgECGkRlc2NyaXB0aW9uIGNhbid0IGJlIGVtcHR5BgMJAAACBQpfZGVzY0NoZWNrBQpfZGVzY0NoZWNrBA9faW5pdGlhdG9yQ2hlY2sDCQECIT0CCQClCAEJAKcIAQgFAWkPY2FsbGVyUHVibGljS2V5BQxpbml0aWF0b3JBZHIJAAIBAiZJbml0aWF0b3IgYWRkcmVzcyBkb2Vzbid0IG1hdGNoIGNhbGxlcgYDCQAAAgUPX2luaXRpYXRvckNoZWNrBQ9faW5pdGlhdG9yQ2hlY2sECWl0ZXJhdGlvbgkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkArAICCQCsAgIFC2tfSVRFUkFUSU9OAgFfBQpzY3JpcHRUeXBlAAAAAQQIc2NyaXB0SWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAghzY3JpcHQlJQUKc2NyaXB0VHlwZQICJSUJAKQDAQUJaXRlcmF0aW9uAgIlJQUKc2NyaXB0SGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCHNjcmlwdElkAgxfX3NjcmlwdFR5cGUFCnNjcmlwdFR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQhzY3JpcHRJZAIQX19zdG9yYWdlQWRkcmVzcwUOc3RvcmFnZUFkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQhzY3JpcHRJZAIMX19zY3JpcHRIYXNoBRFzdG9yYWdlU2NyaXB0SGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCHNjcmlwdElkAgZfX2Rlc2MFBGRlc2MJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQhzY3JpcHRJZAILX19pbml0aWF0b3IFDGluaXRpYXRvckFkcgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHJlbW92ZVNjcmlwdAEIc2NyaXB0SWQECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDCQEBIQEJARBfaXNWYWxpZE9wZXJhdG9yAQUJY2FsbGVyUGJrCQACAQILTm90IGFsbG93ZWQEDGluaXRpYXRvckFkcgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQhzY3JpcHRJZAILX19pbml0aWF0b3IDCQECIT0CBQxpbml0aWF0b3JBZHIJAKUIAQkApwgBCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAAIBAhdPbmx5IGNyZWF0b3IgY2FuIHJlbW92ZQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFCHNjcmlwdElkAgxfX3NjcmlwdFR5cGUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQhzY3JpcHRJZAIQX19zdG9yYWdlQWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFCHNjcmlwdElkAgxfX3NjcmlwdEhhc2gJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQhzY3JpcHRJZAIGX19kZXNjCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUIc2NyaXB0SWQCC19faW5pdGlhdG9yCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUIc2NyaXB0SWQCD19fY29uZmlybWF0aW9ucwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFCHNjcmlwdElkAgpfX2FwcHJvdmVkBQNuaWwBaQEVYWRkQ29uZmlybWF0aW9uU2NyaXB0AQhzY3JpcHRJZAQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQQFbGltaXQJAQlfZ2V0TGltaXQAAwkBASEBCQEIX2lzQWRtaW4BBQljYWxsZXJQYmsJAAIBAhdPbmx5IGFkbWlucyBjYW4gY29uZmlybQQLX3NjcmlwdEhhc2gJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIFCHNjcmlwdElkAgxfX3NjcmlwdEhhc2gCD0l2YWxpZCBzY3JpcHRJZAMJAAACBQtfc2NyaXB0SGFzaAULX3NjcmlwdEhhc2gECnNjcmlwdFR5cGUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgUIc2NyaXB0SWQCDF9fc2NyaXB0VHlwZQQJaXRlcmF0aW9uCQELdmFsdWVPckVsc2UCCQCfCAEJAKwCAgkArAICBQtrX0lURVJBVElPTgIBXwUKc2NyaXB0VHlwZQAABBBjb25maXJtYXRpb25zU3RyCQELdmFsdWVPckVsc2UCCQCiCAEJAKwCAgUIc2NyaXB0SWQCD19fY29uZmlybWF0aW9ucwIABA1jb25maXJtYXRpb25zCQC1CQIFEGNvbmZpcm1hdGlvbnNTdHICASwDCQECIT0CCQDPCAIFDWNvbmZpcm1hdGlvbnMFCWNhbGxlclBiawUEdW5pdAkAAgECIVlvdSBhbHJlYWR5IGNvbmZpcm1lZCB0aGlzIHNjcmlwdAQHbmV3TGlzdAMJAQIhPQIFEGNvbmZpcm1hdGlvbnNTdHICAAkAzQgCBQ1jb25maXJtYXRpb25zBQljYWxsZXJQYmsJAMwIAgUJY2FsbGVyUGJrBQNuaWwECm5ld0xpc3RTdHIJALkJAgUHbmV3TGlzdAIBLAQIYXBwcm92ZWQJAGcCCQCQAwEFB25ld0xpc3QFBWxpbWl0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUIc2NyaXB0SWQCD19fY29uZmlybWF0aW9ucwUKbmV3TGlzdFN0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIFC2tfSVRFUkFUSU9OAgFfBQpzY3JpcHRUeXBlCQBkAgUJaXRlcmF0aW9uAAEJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICCQCsAgIFCnNjcmlwdFR5cGUCAV8FC19zY3JpcHRIYXNoAgpfX2FwcHJvdmVkBQhhcHByb3ZlZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB2FkZFRhc2sHBG5hbWUEZGFwcAR0eGlkCWV4ZWN1dGVUcwRkZXNjDGluaXRpYXRvckFkcgZ0eGRhdGEECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDCQEBIQEJARBfaXNWYWxpZE9wZXJhdG9yAQUJY2FsbGVyUGJrCQACAQILTm90IGFsbG93ZWQECl9uYW1lQ2hlY2sDCQAAAgkAsQIBBQRuYW1lAAAJAAIBAhNOYW1lIGNhbid0IGJlIGVtcHR5BgMJAAACBQpfbmFtZUNoZWNrBQpfbmFtZUNoZWNrBApfZGFwcENoZWNrAwkBASEBCQEQX3ZhbGlkYXRlQWRkcmVzcwEFBGRhcHAJAAIBAg5JbmNvcnJlY3QgZGFwcAYDCQAAAgUKX2RhcHBDaGVjawUKX2RhcHBDaGVjawQKX3R4aWRDaGVjawMJAAACCQCxAgEFBHR4aWQAAAkAAgECE3R4aWQgY2FuJ3QgYmUgZW1wdHkGAwkAAAIFCl90eGlkQ2hlY2sFCl90eGlkQ2hlY2sED190aW1lc3RhbXBDaGVjawMJAQEhAQkBC192YWxpZGF0ZVRzAQUJZXhlY3V0ZVRzCQACAQITdHhpZCBjYW4ndCBiZSBlbXB0eQYDCQAAAgUPX3RpbWVzdGFtcENoZWNrBQ9fdGltZXN0YW1wQ2hlY2sECl9kZXNjQ2hlY2sDCQAAAgkAsQIBBQRkZXNjAAAJAAIBAhpEZXNjcmlwdGlvbiBjYW4ndCBiZSBlbXB0eQYDCQAAAgUKX2Rlc2NDaGVjawUKX2Rlc2NDaGVjawQPX2luaXRpYXRvckNoZWNrAwkBAiE9AgkApQgBCQCnCAEIBQFpD2NhbGxlclB1YmxpY0tleQUMaW5pdGlhdG9yQWRyCQACAQImSW5pdGlhdG9yIGFkZHJlc3MgZG9lc24ndCBtYXRjaCBjYWxsZXIGAwkAAAIFD19pbml0aWF0b3JDaGVjawUPX2luaXRpYXRvckNoZWNrBAxfdHhkYXRhQ2hlY2sDCQAAAgkAsQIBBQZ0eGRhdGEAAAkAAgECFlR4IGRhdGEgY2FuJ3QgYmUgZW1wdHkGAwkAAAIFDF90eGRhdGFDaGVjawUMX3R4ZGF0YUNoZWNrBAZ0YXNrSWQJAKwCAgkArAICCQCsAgICA3R4XwUEZGFwcAIBXwUEdHhpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBnRhc2tJZAIGX19uYW1lBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGdGFza0lkAgZfX2RhcHAFBGRhcHAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCBl9fdHhJZAUEdHhpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBnRhc2tJZAIGX19kZXNjBQRkZXNjCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGdGFza0lkAghfX3R4ZGF0YQUGdHhkYXRhCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGdGFza0lkAgtfX2luaXRpYXRvcgUMaW5pdGlhdG9yQWRyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBnRhc2tJZAIEX190cwUJZXhlY3V0ZVRzBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKcmVtb3ZlVGFzawEGdGFza0lkBAljYWxsZXJQYmsJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5AwkBASEBCQEQX2lzVmFsaWRPcGVyYXRvcgEFCWNhbGxlclBiawkAAgECC05vdCBhbGxvd2VkBAxpbml0aWF0b3JBZHIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgUGdGFza0lkAgtfX2luaXRpYXRvcgMJAQIhPQIFDGluaXRpYXRvckFkcgkApQgBCQCnCAEIBQFpD2NhbGxlclB1YmxpY0tleQkAAgECF09ubHkgY3JlYXRvciBjYW4gcmVtb3ZlCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAgZfX25hbWUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCBl9fZGFwcAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAIGX190eElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAgZfX2Rlc2MJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCCF9fdHhkYXRhCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAgtfX2luaXRpYXRvcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAIEX190cwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAIPX19jb25maXJtYXRpb25zCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAgpfX2FwcHJvdmVkBQNuaWwBaQEPYWRkQ29uZmlybWF0aW9uAQZ0YXNrSWQECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkEBWxpbWl0CQEJX2dldExpbWl0AAMJAQEhAQkBCF9pc0FkbWluAQUJY2FsbGVyUGJrCQACAQIXT25seSBhZG1pbnMgY2FuIGNvbmZpcm0EBHR4SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIFBnRhc2tJZAIGX190eElkAgtJdmFsaWQgdGFzawMJAAACBQR0eElkBQR0eElkBARkYXBwCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIFBnRhc2tJZAIGX19kYXBwBBBjb25maXJtYXRpb25zU3RyCQELdmFsdWVPckVsc2UCCQCiCAEJAKwCAgUGdGFza0lkAg9fX2NvbmZpcm1hdGlvbnMCAAQNY29uZmlybWF0aW9ucwkAtQkCBRBjb25maXJtYXRpb25zU3RyAgEsAwkBAiE9AgkAzwgCBQ1jb25maXJtYXRpb25zBQljYWxsZXJQYmsFBHVuaXQJAAIBAh9Zb3UgYWxyZWFkeSBjb25maXJtZWQgdGhpcyB0YXNrBAduZXdMaXN0AwkBAiE9AgUQY29uZmlybWF0aW9uc1N0cgIACQDNCAIFDWNvbmZpcm1hdGlvbnMFCWNhbGxlclBiawkAzAgCBQljYWxsZXJQYmsFA25pbAQKbmV3TGlzdFN0cgkAuQkCBQduZXdMaXN0AgEsBAhhcHByb3ZlZAkAZwIJAJADAQUHbmV3TGlzdAUFbGltaXQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCD19fY29uZmlybWF0aW9ucwUKbmV3TGlzdFN0cgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgIJAKwCAgUEZGFwcAIBXwUEdHhJZAIKX19hcHByb3ZlZAUIYXBwcm92ZWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhzZXRMaW1pdAEFbGltaXQECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDCQEBIQEJAQhfaXNBZG1pbgEFCWNhbGxlclBiawkAAgECHk9ubHkgd2hpdGVsaXN0ZWQgY2FuIHNldCBsaW1pdAQJemVyb0xpbWl0AwkAZgIFBWxpbWl0AAAGCQACAQITTGltaXQgc2hvdWxkIGJlID4gMAMJAAACBQl6ZXJvTGltaXQFCXplcm9MaW1pdAQGYWRtaW5zCQERQGV4dHJOYXRpdmUoMTA1OCkBBQhrX0FETUlOUwMJAGYCBQVsaW1pdAkAsQIBBQZhZG1pbnMJAAIBCQCsAgIJAKwCAgkArAICAjlMaW1pdCBxdW9ydW0gc2hvdWxkIGJlIDw9IHNpemUgb2YgbGlzdCBvZiBhZG1pbnMsIGxpbWl0OiAJAKQDAQUFbGltaXQCECwgY3VycmVudCBzaXplOiAJAKQDAQkAsQIBBQZhZG1pbnMJAMwIAgkBDEludGVnZXJFbnRyeQIFB2tfTElNSVQFBWxpbWl0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEEdGVzdAAEAXgEByRtYXRjaDAJAO0HAQUGaGVpZ2h0AwkAAQIFByRtYXRjaDACCUJsb2NrSW5mbwQFYmxvY2sFByRtYXRjaDAJAAIBCQCkAwEIBQVibG9jawl0aW1lc3RhbXAJAAIBAhBDYW4ndCBmaW5kIGJsb2NrAwkAAAIFAXgFAXgFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpjbGVhcl90ZXN0AAQHaW5kaWNlcwkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoFA25pbAoBDHJlbW92ZUNodW5rcwIFYWNjdW0FaW5kZXgJAM0IAgUFYWNjdW0JAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgh0ZXN0dGFzawIJX190eGRhdGFfCQCkAwEFBWluZGV4BAdlbnRyaWVzCgACJGwFB2luZGljZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgIIdGVzdHRhc2sCD19fdHhkYXRhX2NodW5rcwUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxyZW1vdmVDaHVua3MCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoFB2VudHJpZXMAm4CSXg==", "height": 475366, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CoAGwPp5c52zN1rcTc7CGuGRaVbXugebmpnscVYi3c2T Next: BTTzVbgx9PWa6FXXfQAf6PrY7MDXCPS1mSiefUWJPsky Diff:
OldNewDifferences
351351 if ((_scriptHash == _scriptHash))
352352 then {
353353 let scriptType = getStringValue((scriptId + "__scriptType"))
354- let scriptIdItems = split(scriptId, "%%")
355- let iteration = scriptIdItems[2]
354+ let iteration = valueOrElse(getInteger(((k_ITERATION + "_") + scriptType)), 0)
356355 let confirmationsStr = valueOrElse(getString((scriptId + "__confirmations")), "")
357356 let confirmations = split(confirmationsStr, ",")
358357 if ((indexOf(confirmations, callerPbk) != unit))
363362 else [callerPbk]
364363 let newListStr = makeString(newList, ",")
365364 let approved = (size(newList) >= limit)
366-[StringEntry((scriptId + "__confirmations"), newListStr), IntegerEntry(((k_ITERATION + "_") + scriptType), (parseIntValue(iteration) + 1)), BooleanEntry((((scriptType + "_") + _scriptHash) + "__approved"), approved)]
365+[StringEntry((scriptId + "__confirmations"), newListStr), IntegerEntry(((k_ITERATION + "_") + scriptType), (iteration + 1)), BooleanEntry((((scriptType + "_") + _scriptHash) + "__approved"), approved)]
367366 }
368367 }
369368 else throw("Strict value is not equal to itself.")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let VERSION = "1.0.0"
55
66 let LIMIT = 2
77
88 let k_ADMINS = "ADMINS_PBKS"
99
1010 let k_MANAGERS = "MANAGERS_PBKS"
1111
1212 let k_LIMIT = "VOTES_QUORUM"
1313
1414 let k_SCRIPT_TYPES = "SCRIPT_TYPES"
1515
1616 let k_ITERATION = "ITERATION"
1717
1818 func _validatePbk (pbk) = {
1919 let address = addressFromPublicKey(fromBase58String(pbk))
2020 if ((address == address))
2121 then {
2222 let addressStr = toString(address)
2323 if ((addressStr == addressStr))
2424 then true
2525 else throw("Strict value is not equal to itself.")
2626 }
2727 else throw("Strict value is not equal to itself.")
2828 }
2929
3030
3131 func _validateAddress (address) = {
3232 let addr = addressFromStringValue(address)
3333 if ((addr == addr))
3434 then true
3535 else throw("Strict value is not equal to itself.")
3636 }
3737
3838
3939 func _validateTs (ts) = {
4040 let currTs = match blockInfoByHeight(height) {
4141 case block: BlockInfo =>
4242 block.timestamp
4343 case _ =>
4444 throw("Can't find block")
4545 }
4646 (ts > currTs)
4747 }
4848
4949
5050 func _getLimit () = valueOrErrorMessage(getInteger(k_LIMIT), "Quorum limit not defined")
5151
5252
5353 func _isAdmin (pbk) = {
5454 let adminsStr = valueOrElse(getString(k_ADMINS), "")
5555 let admins = split(adminsStr, ",")
5656 (indexOf(admins, pbk) != unit)
5757 }
5858
5959
6060 func _isManager (pbk) = {
6161 let managersStr = valueOrElse(getString(k_MANAGERS), "")
6262 let managers = split(managersStr, ",")
6363 (indexOf(managers, pbk) != unit)
6464 }
6565
6666
6767 func _isValidOperator (pbk) = {
6868 let managersStr = valueOrElse(getString(k_MANAGERS), "")
6969 let managers = split(managersStr, ",")
7070 let isAdmin = _isAdmin(pbk)
7171 let isManager = _isManager(pbk)
7272 if (isAdmin)
7373 then true
7474 else isManager
7575 }
7676
7777
7878 func saveTxData (taskId,data) = {
7979 let indices = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
8080 let dataSize = size(data)
8181 let isNotEmpty = if ((dataSize != 0))
8282 then true
8383 else throw("saveTxData: Empty data passed")
8484 if ((isNotEmpty == isNotEmpty))
8585 then {
8686 let chunkSize = 30000
8787 let chunksCount = if (((dataSize % chunkSize) == 0))
8888 then (dataSize / chunkSize)
8989 else ((dataSize / chunkSize) + 1)
9090 func makeChunks (accum,index) = {
9191 let chunk = take(accum._1, chunkSize)
9292 if ((size(chunk) == 0))
9393 then accum
9494 else {
9595 let nextData = drop(accum._1, chunkSize)
9696 $Tuple2(nextData, (accum._2 :+ StringEntry(((taskId + "__txdata_") + toString(index)), chunk)))
9797 }
9898 }
9999
100100 let entries = {
101101 let $l = indices
102102 let $s = size($l)
103103 let $acc0 = $Tuple2(data, [StringEntry((taskId + "__txdata_chunks"), toString(chunksCount))])
104104 func $f0_1 ($a,$i) = if (($i >= $s))
105105 then $a
106106 else makeChunks($a, $l[$i])
107107
108108 func $f0_2 ($a,$i) = if (($i >= $s))
109109 then $a
110110 else throw("List size exceeds 10")
111111
112112 $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)
113113 }
114114 entries._2
115115 }
116116 else throw("Strict value is not equal to itself.")
117117 }
118118
119119
120120 @Callable(i)
121121 func init (admins_pbks,limit) = if ((i.caller != this))
122122 then throw("Self call only")
123123 else {
124124 let size_admins = if ((size(admins_pbks) != 0))
125125 then true
126126 else throw("At least one admin pbk should be passed")
127127 if ((size_admins == size_admins))
128128 then {
129129 let check_admins = if (!(isDefined(getString(k_ADMINS))))
130130 then true
131131 else throw("Already inited")
132132 if ((check_admins == check_admins))
133133 then {
134134 let zeroLimit = if ((limit > 0))
135135 then true
136136 else throw("Limit should be > 0")
137137 if ((zeroLimit == zeroLimit))
138138 then {
139139 let limit_ok = if ((size(admins_pbks) > limit))
140140 then true
141141 else throw(((("Limit quorum should be <= size of list of admins, limit: " + toString(limit)) + ", current size: ") + toString(size(admins_pbks))))
142142 if ((limit_ok == limit_ok))
143143 then {
144144 func validate (accum,next) = _validatePbk(next)
145145
146146 let validRes = {
147147 let $l = admins_pbks
148148 let $s = size($l)
149149 let $acc0 = ""
150150 func $f0_1 ($a,$i) = if (($i >= $s))
151151 then $a
152152 else validate($a, $l[$i])
153153
154154 func $f0_2 ($a,$i) = if (($i >= $s))
155155 then $a
156156 else throw("List size exceeds 10")
157157
158158 $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)
159159 }
160160 if ((validRes == validRes))
161161 then {
162162 let adminsStr = makeString(admins_pbks, ",")
163163 [StringEntry(k_ADMINS, adminsStr), IntegerEntry(k_LIMIT, limit)]
164164 }
165165 else throw("Strict value is not equal to itself.")
166166 }
167167 else throw("Strict value is not equal to itself.")
168168 }
169169 else throw("Strict value is not equal to itself.")
170170 }
171171 else throw("Strict value is not equal to itself.")
172172 }
173173 else throw("Strict value is not equal to itself.")
174174 }
175175
176176
177177
178178 @Callable(i)
179179 func addAdmin (pbk) = {
180180 let callerPbk = toBase58String(i.callerPublicKey)
181181 let isAdmin = if (_isAdmin(callerPbk))
182182 then true
183183 else throw("Only admins can add admin")
184184 if ((isAdmin == isAdmin))
185185 then {
186186 let isValid = if (_validatePbk(pbk))
187187 then true
188188 else throw("Invalid admin pbk")
189189 if ((isValid == isValid))
190190 then {
191191 let newAdminsStr = ((getStringValue(k_ADMINS) + ",") + pbk)
192192 [StringEntry(k_ADMINS, newAdminsStr)]
193193 }
194194 else throw("Strict value is not equal to itself.")
195195 }
196196 else throw("Strict value is not equal to itself.")
197197 }
198198
199199
200200
201201 @Callable(i)
202202 func removeAdmin (pbk) = {
203203 let callerPbk = toBase58String(i.callerPublicKey)
204204 let isAdmin = if (_isAdmin(callerPbk))
205205 then true
206206 else throw("Only admins can add admin")
207207 if ((isAdmin == isAdmin))
208208 then {
209209 let isValid = if (_validatePbk(pbk))
210210 then true
211211 else throw("Invalid admin pbk")
212212 if ((isValid == isValid))
213213 then {
214214 let oldAdminsStr = getStringValue(k_ADMINS)
215215 let oldAdmins = split(oldAdminsStr, ",")
216216 let checkCount = if ((1 >= size(oldAdmins)))
217217 then throw("Cannot remove, at least one admin should remain")
218218 else true
219219 if ((checkCount == checkCount))
220220 then {
221221 let index = valueOrErrorMessage(indexOf(oldAdmins, pbk), "This pbk is not an admin")
222222 let newAdmins = removeByIndex(oldAdmins, index)
223223 let newAdminsStr = makeString(newAdmins, ",")
224224 [StringEntry(k_ADMINS, newAdminsStr)]
225225 }
226226 else throw("Strict value is not equal to itself.")
227227 }
228228 else throw("Strict value is not equal to itself.")
229229 }
230230 else throw("Strict value is not equal to itself.")
231231 }
232232
233233
234234
235235 @Callable(i)
236236 func addScriptType (scriptType) = {
237237 let callerPbk = toBase58String(i.callerPublicKey)
238238 if (!(_isAdmin(callerPbk)))
239239 then throw("Not allowed")
240240 else {
241241 let checkEmpty = if ((size(scriptType) == 0))
242242 then throw("Script type can not be empty")
243243 else true
244244 if ((checkEmpty == checkEmpty))
245245 then {
246246 let scriptTypesStr = valueOrElse(getString(k_SCRIPT_TYPES), "")
247247 let scriptTypes = split_4C(scriptTypesStr, ",")
248248 let checkExists = if ((indexOf(scriptTypes, scriptType) != unit))
249249 then throw((("Script type <" + scriptType) + "> already added"))
250250 else true
251251 if ((checkExists == checkExists))
252252 then {
253253 let newScriptTypes = if ((scriptTypesStr != ""))
254254 then (scriptTypes :+ scriptType)
255255 else [scriptType]
256256 let newScriptTypesStr = makeString(newScriptTypes, ",")
257257 [StringEntry(k_SCRIPT_TYPES, newScriptTypesStr)]
258258 }
259259 else throw("Strict value is not equal to itself.")
260260 }
261261 else throw("Strict value is not equal to itself.")
262262 }
263263 }
264264
265265
266266
267267 @Callable(i)
268268 func removeScriptType (scriptType) = {
269269 let callerPbk = toBase58String(i.callerPublicKey)
270270 if (!(_isAdmin(callerPbk)))
271271 then throw("Not allowed")
272272 else {
273273 let scriptTypesStr = valueOrElse(getString(k_SCRIPT_TYPES), "")
274274 let scriptTypes = split_4C(scriptTypesStr, ",")
275275 let index = valueOrErrorMessage(indexOf(scriptTypes, scriptType), (("Script type <" + scriptType) + "> is not present"))
276276 let newScriptTypes = removeByIndex(scriptTypes, index)
277277 let newScriptTypesStr = makeString(newScriptTypes, ",")
278278 [StringEntry(k_SCRIPT_TYPES, newScriptTypesStr)]
279279 }
280280 }
281281
282282
283283
284284 @Callable(i)
285285 func addScript (scriptType,storageAddress,scriptHash,desc,initiatorAdr) = {
286286 let callerPbk = toBase58String(i.callerPublicKey)
287287 if (!(_isValidOperator(callerPbk)))
288288 then throw("Not allowed")
289289 else {
290290 let storageScriptHash = toBase58String(value(scriptHash(addressFromStringValue(storageAddress))))
291291 let scriptTypesStr = getStringValue(k_SCRIPT_TYPES)
292292 let _checkScriptTypes = if ((indexOf(scriptTypesStr, scriptType) == unit))
293293 then throw(("invalid script type or it is not present in storage: " + scriptType))
294294 else true
295295 if ((_checkScriptTypes == _checkScriptTypes))
296296 then {
297297 let _scriptTypeCheck = if ((storageScriptHash != scriptHash))
298298 then throw("Stored and passed as argument scriptHashes not match")
299299 else true
300300 if ((_scriptTypeCheck == _scriptTypeCheck))
301301 then {
302302 let _descCheck = if ((size(desc) == 0))
303303 then throw("Description can't be empty")
304304 else true
305305 if ((_descCheck == _descCheck))
306306 then {
307307 let _initiatorCheck = if ((toString(addressFromPublicKey(i.callerPublicKey)) != initiatorAdr))
308308 then throw("Initiator address doesn't match caller")
309309 else true
310310 if ((_initiatorCheck == _initiatorCheck))
311311 then {
312312 let iteration = (valueOrElse(getInteger(((k_ITERATION + "_") + scriptType)), 0) + 1)
313313 let scriptId = ((((("script%%" + scriptType) + "%%") + toString(iteration)) + "%%") + scriptHash)
314314 [StringEntry((scriptId + "__scriptType"), scriptType), StringEntry((scriptId + "__storageAddress"), storageAddress), StringEntry((scriptId + "__scriptHash"), storageScriptHash), StringEntry((scriptId + "__desc"), desc), StringEntry((scriptId + "__initiator"), initiatorAdr)]
315315 }
316316 else throw("Strict value is not equal to itself.")
317317 }
318318 else throw("Strict value is not equal to itself.")
319319 }
320320 else throw("Strict value is not equal to itself.")
321321 }
322322 else throw("Strict value is not equal to itself.")
323323 }
324324 }
325325
326326
327327
328328 @Callable(i)
329329 func removeScript (scriptId) = {
330330 let callerPbk = toBase58String(i.callerPublicKey)
331331 if (!(_isValidOperator(callerPbk)))
332332 then throw("Not allowed")
333333 else {
334334 let initiatorAdr = getStringValue((scriptId + "__initiator"))
335335 if ((initiatorAdr != toString(addressFromPublicKey(i.callerPublicKey))))
336336 then throw("Only creator can remove")
337337 else [DeleteEntry((scriptId + "__scriptType")), DeleteEntry((scriptId + "__storageAddress")), DeleteEntry((scriptId + "__scriptHash")), DeleteEntry((scriptId + "__desc")), DeleteEntry((scriptId + "__initiator")), DeleteEntry((scriptId + "__confirmations")), DeleteEntry((scriptId + "__approved"))]
338338 }
339339 }
340340
341341
342342
343343 @Callable(i)
344344 func addConfirmationScript (scriptId) = {
345345 let callerPbk = toBase58String(i.callerPublicKey)
346346 let limit = _getLimit()
347347 if (!(_isAdmin(callerPbk)))
348348 then throw("Only admins can confirm")
349349 else {
350350 let _scriptHash = valueOrErrorMessage(getString((scriptId + "__scriptHash")), "Ivalid scriptId")
351351 if ((_scriptHash == _scriptHash))
352352 then {
353353 let scriptType = getStringValue((scriptId + "__scriptType"))
354- let scriptIdItems = split(scriptId, "%%")
355- let iteration = scriptIdItems[2]
354+ let iteration = valueOrElse(getInteger(((k_ITERATION + "_") + scriptType)), 0)
356355 let confirmationsStr = valueOrElse(getString((scriptId + "__confirmations")), "")
357356 let confirmations = split(confirmationsStr, ",")
358357 if ((indexOf(confirmations, callerPbk) != unit))
359358 then throw("You already confirmed this script")
360359 else {
361360 let newList = if ((confirmationsStr != ""))
362361 then (confirmations :+ callerPbk)
363362 else [callerPbk]
364363 let newListStr = makeString(newList, ",")
365364 let approved = (size(newList) >= limit)
366-[StringEntry((scriptId + "__confirmations"), newListStr), IntegerEntry(((k_ITERATION + "_") + scriptType), (parseIntValue(iteration) + 1)), BooleanEntry((((scriptType + "_") + _scriptHash) + "__approved"), approved)]
365+[StringEntry((scriptId + "__confirmations"), newListStr), IntegerEntry(((k_ITERATION + "_") + scriptType), (iteration + 1)), BooleanEntry((((scriptType + "_") + _scriptHash) + "__approved"), approved)]
367366 }
368367 }
369368 else throw("Strict value is not equal to itself.")
370369 }
371370 }
372371
373372
374373
375374 @Callable(i)
376375 func addTask (name,dapp,txid,executeTs,desc,initiatorAdr,txdata) = {
377376 let callerPbk = toBase58String(i.callerPublicKey)
378377 if (!(_isValidOperator(callerPbk)))
379378 then throw("Not allowed")
380379 else {
381380 let _nameCheck = if ((size(name) == 0))
382381 then throw("Name can't be empty")
383382 else true
384383 if ((_nameCheck == _nameCheck))
385384 then {
386385 let _dappCheck = if (!(_validateAddress(dapp)))
387386 then throw("Incorrect dapp")
388387 else true
389388 if ((_dappCheck == _dappCheck))
390389 then {
391390 let _txidCheck = if ((size(txid) == 0))
392391 then throw("txid can't be empty")
393392 else true
394393 if ((_txidCheck == _txidCheck))
395394 then {
396395 let _timestampCheck = if (!(_validateTs(executeTs)))
397396 then throw("txid can't be empty")
398397 else true
399398 if ((_timestampCheck == _timestampCheck))
400399 then {
401400 let _descCheck = if ((size(desc) == 0))
402401 then throw("Description can't be empty")
403402 else true
404403 if ((_descCheck == _descCheck))
405404 then {
406405 let _initiatorCheck = if ((toString(addressFromPublicKey(i.callerPublicKey)) != initiatorAdr))
407406 then throw("Initiator address doesn't match caller")
408407 else true
409408 if ((_initiatorCheck == _initiatorCheck))
410409 then {
411410 let _txdataCheck = if ((size(txdata) == 0))
412411 then throw("Tx data can't be empty")
413412 else true
414413 if ((_txdataCheck == _txdataCheck))
415414 then {
416415 let taskId = ((("tx_" + dapp) + "_") + txid)
417416 [StringEntry((taskId + "__name"), name), StringEntry((taskId + "__dapp"), dapp), StringEntry((taskId + "__txId"), txid), StringEntry((taskId + "__desc"), desc), StringEntry((taskId + "__txdata"), txdata), StringEntry((taskId + "__initiator"), initiatorAdr), IntegerEntry((taskId + "__ts"), executeTs)]
418417 }
419418 else throw("Strict value is not equal to itself.")
420419 }
421420 else throw("Strict value is not equal to itself.")
422421 }
423422 else throw("Strict value is not equal to itself.")
424423 }
425424 else throw("Strict value is not equal to itself.")
426425 }
427426 else throw("Strict value is not equal to itself.")
428427 }
429428 else throw("Strict value is not equal to itself.")
430429 }
431430 else throw("Strict value is not equal to itself.")
432431 }
433432 }
434433
435434
436435
437436 @Callable(i)
438437 func removeTask (taskId) = {
439438 let callerPbk = toBase58String(i.callerPublicKey)
440439 if (!(_isValidOperator(callerPbk)))
441440 then throw("Not allowed")
442441 else {
443442 let initiatorAdr = getStringValue((taskId + "__initiator"))
444443 if ((initiatorAdr != toString(addressFromPublicKey(i.callerPublicKey))))
445444 then throw("Only creator can remove")
446445 else [DeleteEntry((taskId + "__name")), DeleteEntry((taskId + "__dapp")), DeleteEntry((taskId + "__txId")), DeleteEntry((taskId + "__desc")), DeleteEntry((taskId + "__txdata")), DeleteEntry((taskId + "__initiator")), DeleteEntry((taskId + "__ts")), DeleteEntry((taskId + "__confirmations")), DeleteEntry((taskId + "__approved"))]
447446 }
448447 }
449448
450449
451450
452451 @Callable(i)
453452 func addConfirmation (taskId) = {
454453 let callerPbk = toBase58String(i.callerPublicKey)
455454 let limit = _getLimit()
456455 if (!(_isAdmin(callerPbk)))
457456 then throw("Only admins can confirm")
458457 else {
459458 let txId = valueOrErrorMessage(getString((taskId + "__txId")), "Ivalid task")
460459 if ((txId == txId))
461460 then {
462461 let dapp = getStringValue((taskId + "__dapp"))
463462 let confirmationsStr = valueOrElse(getString((taskId + "__confirmations")), "")
464463 let confirmations = split(confirmationsStr, ",")
465464 if ((indexOf(confirmations, callerPbk) != unit))
466465 then throw("You already confirmed this task")
467466 else {
468467 let newList = if ((confirmationsStr != ""))
469468 then (confirmations :+ callerPbk)
470469 else [callerPbk]
471470 let newListStr = makeString(newList, ",")
472471 let approved = (size(newList) >= limit)
473472 [StringEntry((taskId + "__confirmations"), newListStr), BooleanEntry((((dapp + "_") + txId) + "__approved"), approved)]
474473 }
475474 }
476475 else throw("Strict value is not equal to itself.")
477476 }
478477 }
479478
480479
481480
482481 @Callable(i)
483482 func setLimit (limit) = {
484483 let callerPbk = toBase58String(i.callerPublicKey)
485484 if (!(_isAdmin(callerPbk)))
486485 then throw("Only whitelisted can set limit")
487486 else {
488487 let zeroLimit = if ((limit > 0))
489488 then true
490489 else throw("Limit should be > 0")
491490 if ((zeroLimit == zeroLimit))
492491 then {
493492 let admins = getStringValue(k_ADMINS)
494493 if ((limit > size(admins)))
495494 then throw(((("Limit quorum should be <= size of list of admins, limit: " + toString(limit)) + ", current size: ") + toString(size(admins))))
496495 else [IntegerEntry(k_LIMIT, limit)]
497496 }
498497 else throw("Strict value is not equal to itself.")
499498 }
500499 }
501500
502501
503502
504503 @Callable(i)
505504 func test () = {
506505 let x = match blockInfoByHeight(height) {
507506 case block: BlockInfo =>
508507 throw(toString(block.timestamp))
509508 case _ =>
510509 throw("Can't find block")
511510 }
512511 if ((x == x))
513512 then nil
514513 else throw("Strict value is not equal to itself.")
515514 }
516515
517516
518517
519518 @Callable(i)
520519 func clear_test () = {
521520 let indices = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
522521 func removeChunks (accum,index) = (accum :+ DeleteEntry((("testtask" + "__txdata_") + toString(index))))
523522
524523 let entries = {
525524 let $l = indices
526525 let $s = size($l)
527526 let $acc0 = [DeleteEntry(("testtask" + "__txdata_chunks"))]
528527 func $f0_1 ($a,$i) = if (($i >= $s))
529528 then $a
530529 else removeChunks($a, $l[$i])
531530
532531 func $f0_2 ($a,$i) = if (($i >= $s))
533532 then $a
534533 else throw("List size exceeds 10")
535534
536535 $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)
537536 }
538537 entries
539538 }
540539
541540

github/deemru/w8io
53.28 ms