tx · 6WuF3ag5yXQd1AcMMoPy4Y6abASgcYt5ii2LxGFn1J6y

3M7uzD8rT54fKQcP4s417if1VKU8yromEP2:  -0.05500000 Waves

2025.10.15 22:31 [474722] smart account 3M7uzD8rT54fKQcP4s417if1VKU8yromEP2 > SELF 0.00000000 Waves

{ "type": 13, "id": "6WuF3ag5yXQd1AcMMoPy4Y6abASgcYt5ii2LxGFn1J6y", "fee": 5500000, "feeAssetId": null, "timestamp": 1760556719907, "version": 2, "chainId": 82, "sender": "3M7uzD8rT54fKQcP4s417if1VKU8yromEP2", "senderPublicKey": "2eFPamS5zez1159HEFEJaxs2XPq3AupPbNApNGffRjqf", "proofs": [ "4cTq5GMYprFmaWV1tiv7x89Xi66EyHEV43GcSpweuU4cEG17XnLyEymhKxnojpVaDKkzfsTwwRq2FuDa8GXbj3xM" ], "script": "base64:BgJNCAISBAoCGAESAwoBCBIDCgEIEgMKAQgSAwoBCBIHCgUICAgICBIDCgEIEgMKAQgSCQoHCAgIAQgICBIDCgEIEgMKAQgSAwoBARIAEgAPAAdWRVJTSU9OAgUxLjAuMAAFTElNSVQAAgAIa19BRE1JTlMCC0FETUlOU19QQktTAAprX01BTkFHRVJTAg1NQU5BR0VSU19QQktTAAdrX0xJTUlUAgxWT1RFU19RVU9SVU0ADmtfU0NSSVBUX1RZUEVTAgxTQ1JJUFRfVFlQRVMAC2tfSVRFUkFUSU9OAglJVEVSQVRJT04BDF92YWxpZGF0ZVBiawEDcGJrBAdhZGRyZXNzCQCnCAEJANkEAQUDcGJrAwkAAAIFB2FkZHJlc3MFB2FkZHJlc3MECmFkZHJlc3NTdHIJAKUIAQUHYWRkcmVzcwMJAAACBQphZGRyZXNzU3RyBQphZGRyZXNzU3RyBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEQX3ZhbGlkYXRlQWRkcmVzcwEHYWRkcmVzcwQEYWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUHYWRkcmVzcwMJAAACBQRhZGRyBQRhZGRyBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgELX3ZhbGlkYXRlVHMBAnRzBAZjdXJyVHMEByRtYXRjaDAJAO0HAQUGaGVpZ2h0AwkAAQIFByRtYXRjaDACCUJsb2NrSW5mbwQFYmxvY2sFByRtYXRjaDAIBQVibG9jawl0aW1lc3RhbXAJAAIBAhBDYW4ndCBmaW5kIGJsb2NrCQBmAgUCdHMFBmN1cnJUcwEJX2dldExpbWl0AAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFB2tfTElNSVQCGFF1b3J1bSBsaW1pdCBub3QgZGVmaW5lZAEIX2lzQWRtaW4BA3BiawQJYWRtaW5zU3RyCQELdmFsdWVPckVsc2UCCQCiCAEFCGtfQURNSU5TAgAEBmFkbWlucwkAtQkCBQlhZG1pbnNTdHICASwJAQIhPQIJAM8IAgUGYWRtaW5zBQNwYmsFBHVuaXQBCl9pc01hbmFnZXIBA3BiawQLbWFuYWdlcnNTdHIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUKa19NQU5BR0VSUwIABAhtYW5hZ2VycwkAtQkCBQttYW5hZ2Vyc1N0cgIBLAkBAiE9AgkAzwgCBQhtYW5hZ2VycwUDcGJrBQR1bml0ARBfaXNWYWxpZE9wZXJhdG9yAQNwYmsEC21hbmFnZXJzU3RyCQELdmFsdWVPckVsc2UCCQCiCAEFCmtfTUFOQUdFUlMCAAQIbWFuYWdlcnMJALUJAgULbWFuYWdlcnNTdHICASwEB2lzQWRtaW4JAQhfaXNBZG1pbgEFA3BiawQJaXNNYW5hZ2VyCQEKX2lzTWFuYWdlcgEFA3BiawMFB2lzQWRtaW4GBQlpc01hbmFnZXIBCnNhdmVUeERhdGECBnRhc2tJZARkYXRhBAdpbmRpY2VzCQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgUDbmlsBAhkYXRhU2l6ZQkAsQIBBQRkYXRhBAppc05vdEVtcHR5AwkBAiE9AgUIZGF0YVNpemUAAAYJAAIBAh1zYXZlVHhEYXRhOiBFbXB0eSBkYXRhIHBhc3NlZAMJAAACBQppc05vdEVtcHR5BQppc05vdEVtcHR5BAljaHVua1NpemUAsOoBBAtjaHVua3NDb3VudAMJAAACCQBqAgUIZGF0YVNpemUFCWNodW5rU2l6ZQAACQBpAgUIZGF0YVNpemUFCWNodW5rU2l6ZQkAZAIJAGkCBQhkYXRhU2l6ZQUJY2h1bmtTaXplAAEKAQptYWtlQ2h1bmtzAgVhY2N1bQVpbmRleAQFY2h1bmsJAK8CAggFBWFjY3VtAl8xBQljaHVua1NpemUDCQAAAgkAsQIBBQVjaHVuawAABQVhY2N1bQQIbmV4dERhdGEJALACAggFBWFjY3VtAl8xBQljaHVua1NpemUJAJQKAgUIbmV4dERhdGEJAM0IAggFBWFjY3VtAl8yCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUGdGFza0lkAglfX3R4ZGF0YV8JAKQDAQUFaW5kZXgFBWNodW5rBAdlbnRyaWVzCgACJGwFB2luZGljZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFBGRhdGEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCD19fdHhkYXRhX2NodW5rcwkApAMBBQtjaHVua3NDb3VudAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQptYWtlQ2h1bmtzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCAUHZW50cmllcwJfMgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLg4BaQEEaW5pdAILYWRtaW5zX3Bia3MFbGltaXQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg5TZWxmIGNhbGwgb25seQQLc2l6ZV9hZG1pbnMDCQECIT0CCQCQAwEFC2FkbWluc19wYmtzAAAGCQACAQInQXQgbGVhc3Qgb25lIGFkbWluIHBiayBzaG91bGQgYmUgcGFzc2VkAwkAAAIFC3NpemVfYWRtaW5zBQtzaXplX2FkbWlucwQMY2hlY2tfYWRtaW5zAwkBASEBCQEJaXNEZWZpbmVkAQkAoggBBQhrX0FETUlOUwYJAAIBAg5BbHJlYWR5IGluaXRlZAMJAAACBQxjaGVja19hZG1pbnMFDGNoZWNrX2FkbWlucwQJemVyb0xpbWl0AwkAZgIFBWxpbWl0AAAGCQACAQITTGltaXQgc2hvdWxkIGJlID4gMAMJAAACBQl6ZXJvTGltaXQFCXplcm9MaW1pdAQIbGltaXRfb2sDCQBmAgkAkAMBBQthZG1pbnNfcGJrcwUFbGltaXQGCQACAQkArAICCQCsAgIJAKwCAgI5TGltaXQgcXVvcnVtIHNob3VsZCBiZSA8PSBzaXplIG9mIGxpc3Qgb2YgYWRtaW5zLCBsaW1pdDogCQCkAwEFBWxpbWl0AhAsIGN1cnJlbnQgc2l6ZTogCQCkAwEJAJADAQULYWRtaW5zX3Bia3MDCQAAAgUIbGltaXRfb2sFCGxpbWl0X29rCgEIdmFsaWRhdGUCBWFjY3VtBG5leHQJAQxfdmFsaWRhdGVQYmsBBQRuZXh0BAh2YWxpZFJlcwoAAiRsBQthZG1pbnNfcGJrcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIdmFsaWRhdGUCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoDCQAAAgUIdmFsaWRSZXMFCHZhbGlkUmVzBAlhZG1pbnNTdHIJALkJAgULYWRtaW5zX3Bia3MCASwJAMwIAgkBC1N0cmluZ0VudHJ5AgUIa19BRE1JTlMFCWFkbWluc1N0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgUHa19MSU1JVAUFbGltaXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhhZGRBZG1pbgEDcGJrBAljYWxsZXJQYmsJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5BAdpc0FkbWluAwkBCF9pc0FkbWluAQUJY2FsbGVyUGJrBgkAAgECGU9ubHkgYWRtaW5zIGNhbiBhZGQgYWRtaW4DCQAAAgUHaXNBZG1pbgUHaXNBZG1pbgQHaXNWYWxpZAMJAQxfdmFsaWRhdGVQYmsBBQNwYmsGCQACAQIRSW52YWxpZCBhZG1pbiBwYmsDCQAAAgUHaXNWYWxpZAUHaXNWYWxpZAQMbmV3QWRtaW5zU3RyCQCsAgIJAKwCAgkBEUBleHRyTmF0aXZlKDEwNTgpAQUIa19BRE1JTlMCASwFA3BiawkAzAgCCQELU3RyaW5nRW50cnkCBQhrX0FETUlOUwUMbmV3QWRtaW5zU3RyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELcmVtb3ZlQWRtaW4BA3BiawQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQQHaXNBZG1pbgMJAQhfaXNBZG1pbgEFCWNhbGxlclBiawYJAAIBAhlPbmx5IGFkbWlucyBjYW4gYWRkIGFkbWluAwkAAAIFB2lzQWRtaW4FB2lzQWRtaW4EB2lzVmFsaWQDCQEMX3ZhbGlkYXRlUGJrAQUDcGJrBgkAAgECEUludmFsaWQgYWRtaW4gcGJrAwkAAAIFB2lzVmFsaWQFB2lzVmFsaWQEDG9sZEFkbWluc1N0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQUIa19BRE1JTlMECW9sZEFkbWlucwkAtQkCBQxvbGRBZG1pbnNTdHICASwECmNoZWNrQ291bnQDCQBnAgABCQCQAwEFCW9sZEFkbWlucwkAAgECL0Nhbm5vdCByZW1vdmUsIGF0IGxlYXN0IG9uZSBhZG1pbiBzaG91bGQgcmVtYWluBgMJAAACBQpjaGVja0NvdW50BQpjaGVja0NvdW50BAVpbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCW9sZEFkbWlucwUDcGJrAhhUaGlzIHBiayBpcyBub3QgYW4gYWRtaW4ECW5ld0FkbWlucwkA0QgCBQlvbGRBZG1pbnMFBWluZGV4BAxuZXdBZG1pbnNTdHIJALkJAgUJbmV3QWRtaW5zAgEsCQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtfQURNSU5TBQxuZXdBZG1pbnNTdHIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1hZGRTY3JpcHRUeXBlAQpzY3JpcHRUeXBlBAljYWxsZXJQYmsJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5AwkBASEBCQEIX2lzQWRtaW4BBQljYWxsZXJQYmsJAAIBAgtOb3QgYWxsb3dlZAQKY2hlY2tFbXB0eQMJAAACCQCxAgEFCnNjcmlwdFR5cGUAAAkAAgECHFNjcmlwdCB0eXBlIGNhbiBub3QgYmUgZW1wdHkGAwkAAAIFCmNoZWNrRW1wdHkFCmNoZWNrRW1wdHkEDnNjcmlwdFR5cGVzU3RyCQELdmFsdWVPckVsc2UCCQCiCAEFDmtfU0NSSVBUX1RZUEVTAgAEC3NjcmlwdFR5cGVzCQC8CQIFDnNjcmlwdFR5cGVzU3RyAgEsBAtjaGVja0V4aXN0cwMJAQIhPQIJAM8IAgULc2NyaXB0VHlwZXMFCnNjcmlwdFR5cGUFBHVuaXQJAAIBCQCsAgIJAKwCAgINU2NyaXB0IHR5cGUgPAUKc2NyaXB0VHlwZQIPPiBhbHJlYWR5IGFkZGVkBgMJAAACBQtjaGVja0V4aXN0cwULY2hlY2tFeGlzdHMEDm5ld1NjcmlwdFR5cGVzAwkBAiE9AgUOc2NyaXB0VHlwZXNTdHICAAkAzQgCBQtzY3JpcHRUeXBlcwUKc2NyaXB0VHlwZQkAzAgCBQpzY3JpcHRUeXBlBQNuaWwEEW5ld1NjcmlwdFR5cGVzU3RyCQC5CQIFDm5ld1NjcmlwdFR5cGVzAgEsCQDMCAIJAQtTdHJpbmdFbnRyeQIFDmtfU0NSSVBUX1RZUEVTBRFuZXdTY3JpcHRUeXBlc1N0cgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEHJlbW92ZVNjcmlwdFR5cGUBCnNjcmlwdFR5cGUECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDCQEBIQEJAQhfaXNBZG1pbgEFCWNhbGxlclBiawkAAgECC05vdCBhbGxvd2VkBA5zY3JpcHRUeXBlc1N0cgkBC3ZhbHVlT3JFbHNlAgkAoggBBQ5rX1NDUklQVF9UWVBFUwIABAtzY3JpcHRUeXBlcwkAvAkCBQ5zY3JpcHRUeXBlc1N0cgIBLAQFaW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQtzY3JpcHRUeXBlcwUKc2NyaXB0VHlwZQkArAICCQCsAgICDVNjcmlwdCB0eXBlIDwFCnNjcmlwdFR5cGUCED4gaXMgbm90IHByZXNlbnQEDm5ld1NjcmlwdFR5cGVzCQDRCAIFC3NjcmlwdFR5cGVzBQVpbmRleAQRbmV3U2NyaXB0VHlwZXNTdHIJALkJAgUObmV3U2NyaXB0VHlwZXMCASwJAMwIAgkBC1N0cmluZ0VudHJ5AgUOa19TQ1JJUFRfVFlQRVMFEW5ld1NjcmlwdFR5cGVzU3RyBQNuaWwBaQEJYWRkU2NyaXB0BQpzY3JpcHRUeXBlDnN0b3JhZ2VBZGRyZXNzCnNjcmlwdEhhc2gEZGVzYwxpbml0aWF0b3JBZHIECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDCQEBIQEJARBfaXNWYWxpZE9wZXJhdG9yAQUJY2FsbGVyUGJrCQACAQILTm90IGFsbG93ZWQEEXN0b3JhZ2VTY3JpcHRIYXNoCQDYBAEJAQV2YWx1ZQEJAPEHAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUOc3RvcmFnZUFkZHJlc3MEDnNjcmlwdFR5cGVzU3RyCQERQGV4dHJOYXRpdmUoMTA1OCkBBQ5rX1NDUklQVF9UWVBFUwQRX2NoZWNrU2NyaXB0VHlwZXMDCQAAAgkAswkCBQ5zY3JpcHRUeXBlc1N0cgUKc2NyaXB0VHlwZQUEdW5pdAkAAgEJAKwCAgI1aW52YWxpZCBzY3JpcHQgdHlwZSBvciBpdCBpcyBub3QgcHJlc2VudCBpbiBzdG9yYWdlOiAFCnNjcmlwdFR5cGUGAwkAAAIFEV9jaGVja1NjcmlwdFR5cGVzBRFfY2hlY2tTY3JpcHRUeXBlcwQQX3NjcmlwdFR5cGVDaGVjawMJAQIhPQIFEXN0b3JhZ2VTY3JpcHRIYXNoBQpzY3JpcHRIYXNoCQACAQI0U3RvcmVkIGFuZCBwYXNzZWQgYXMgYXJndW1lbnQgc2NyaXB0SGFzaGVzIG5vdCBtYXRjaAYDCQAAAgUQX3NjcmlwdFR5cGVDaGVjawUQX3NjcmlwdFR5cGVDaGVjawQKX2Rlc2NDaGVjawMJAAACCQCxAgEFBGRlc2MAAAkAAgECGkRlc2NyaXB0aW9uIGNhbid0IGJlIGVtcHR5BgMJAAACBQpfZGVzY0NoZWNrBQpfZGVzY0NoZWNrBA9faW5pdGlhdG9yQ2hlY2sDCQECIT0CCQClCAEJAKcIAQgFAWkPY2FsbGVyUHVibGljS2V5BQxpbml0aWF0b3JBZHIJAAIBAiZJbml0aWF0b3IgYWRkcmVzcyBkb2Vzbid0IG1hdGNoIGNhbGxlcgYDCQAAAgUPX2luaXRpYXRvckNoZWNrBQ9faW5pdGlhdG9yQ2hlY2sECWl0ZXJhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQCsAgIJAKwCAgULa19JVEVSQVRJT04CAV8FCnNjcmlwdFR5cGUAAAQIc2NyaXB0SWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAghzY3JpcHQlJQUKc2NyaXB0VHlwZQICJSUJAKQDAQUJaXRlcmF0aW9uAgIlJQUKc2NyaXB0SGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCHNjcmlwdElkAgxfX3NjcmlwdFR5cGUFCnNjcmlwdFR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQhzY3JpcHRJZAIQX19zdG9yYWdlQWRkcmVzcwUOc3RvcmFnZUFkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQhzY3JpcHRJZAIMX19zY3JpcHRIYXNoBRFzdG9yYWdlU2NyaXB0SGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCHNjcmlwdElkAgZfX2Rlc2MFBGRlc2MJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQhzY3JpcHRJZAILX19pbml0aWF0b3IFDGluaXRpYXRvckFkcgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHJlbW92ZVNjcmlwdAEIc2NyaXB0SWQECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDCQEBIQEJARBfaXNWYWxpZE9wZXJhdG9yAQUJY2FsbGVyUGJrCQACAQILTm90IGFsbG93ZWQEDGluaXRpYXRvckFkcgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQhzY3JpcHRJZAILX19pbml0aWF0b3IDCQECIT0CBQxpbml0aWF0b3JBZHIJAKUIAQkApwgBCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAAIBAhdPbmx5IGNyZWF0b3IgY2FuIHJlbW92ZQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFCHNjcmlwdElkAgxfX3NjcmlwdFR5cGUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQhzY3JpcHRJZAIQX19zdG9yYWdlQWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFCHNjcmlwdElkAgxfX3NjcmlwdEhhc2gJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQhzY3JpcHRJZAIGX19kZXNjCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUIc2NyaXB0SWQCC19faW5pdGlhdG9yCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUIc2NyaXB0SWQCD19fY29uZmlybWF0aW9ucwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFCHNjcmlwdElkAgpfX2FwcHJvdmVkBQNuaWwBaQEVYWRkQ29uZmlybWF0aW9uU2NyaXB0AQhzY3JpcHRJZAQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQQFbGltaXQJAQlfZ2V0TGltaXQAAwkBASEBCQEIX2lzQWRtaW4BBQljYWxsZXJQYmsJAAIBAhdPbmx5IGFkbWlucyBjYW4gY29uZmlybQQLX3NjcmlwdEhhc2gJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIFCHNjcmlwdElkAgxfX3NjcmlwdEhhc2gCD0l2YWxpZCBzY3JpcHRJZAMJAAACBQtfc2NyaXB0SGFzaAULX3NjcmlwdEhhc2gECnNjcmlwdFR5cGUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgUIc2NyaXB0SWQCDF9fc2NyaXB0VHlwZQQNc2NyaXB0SWRJdGVtcwkAtQkCBQhzY3JpcHRJZAICJSUECWl0ZXJhdGlvbgkAkQMCBQ1zY3JpcHRJZEl0ZW1zAAIEEGNvbmZpcm1hdGlvbnNTdHIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkArAICBQhzY3JpcHRJZAIPX19jb25maXJtYXRpb25zAgAEDWNvbmZpcm1hdGlvbnMJALUJAgUQY29uZmlybWF0aW9uc1N0cgIBLAMJAQIhPQIJAM8IAgUNY29uZmlybWF0aW9ucwUJY2FsbGVyUGJrBQR1bml0CQACAQIhWW91IGFscmVhZHkgY29uZmlybWVkIHRoaXMgc2NyaXB0BAduZXdMaXN0AwkBAiE9AgUQY29uZmlybWF0aW9uc1N0cgIACQDNCAIFDWNvbmZpcm1hdGlvbnMFCWNhbGxlclBiawkAzAgCBQljYWxsZXJQYmsFA25pbAQKbmV3TGlzdFN0cgkAuQkCBQduZXdMaXN0AgEsBAhhcHByb3ZlZAkAZwIJAJADAQUHbmV3TGlzdAUFbGltaXQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQhzY3JpcHRJZAIPX19jb25maXJtYXRpb25zBQpuZXdMaXN0U3RyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFC2tfSVRFUkFUSU9OBQpzY3JpcHRUeXBlCQENcGFyc2VJbnRWYWx1ZQEFCWl0ZXJhdGlvbgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgIJAKwCAgUKc2NyaXB0VHlwZQIBXwULX3NjcmlwdEhhc2gCCl9fYXBwcm92ZWQFCGFwcHJvdmVkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHYWRkVGFzawcEbmFtZQRkYXBwBHR4aWQJZXhlY3V0ZVRzBGRlc2MMaW5pdGlhdG9yQWRyBnR4ZGF0YQQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQMJAQEhAQkBEF9pc1ZhbGlkT3BlcmF0b3IBBQljYWxsZXJQYmsJAAIBAgtOb3QgYWxsb3dlZAQKX25hbWVDaGVjawMJAAACCQCxAgEFBG5hbWUAAAkAAgECE05hbWUgY2FuJ3QgYmUgZW1wdHkGAwkAAAIFCl9uYW1lQ2hlY2sFCl9uYW1lQ2hlY2sECl9kYXBwQ2hlY2sDCQEBIQEJARBfdmFsaWRhdGVBZGRyZXNzAQUEZGFwcAkAAgECDkluY29ycmVjdCBkYXBwBgMJAAACBQpfZGFwcENoZWNrBQpfZGFwcENoZWNrBApfdHhpZENoZWNrAwkAAAIJALECAQUEdHhpZAAACQACAQITdHhpZCBjYW4ndCBiZSBlbXB0eQYDCQAAAgUKX3R4aWRDaGVjawUKX3R4aWRDaGVjawQPX3RpbWVzdGFtcENoZWNrAwkBASEBCQELX3ZhbGlkYXRlVHMBBQlleGVjdXRlVHMJAAIBAhN0eGlkIGNhbid0IGJlIGVtcHR5BgMJAAACBQ9fdGltZXN0YW1wQ2hlY2sFD190aW1lc3RhbXBDaGVjawQKX2Rlc2NDaGVjawMJAAACCQCxAgEFBGRlc2MAAAkAAgECGkRlc2NyaXB0aW9uIGNhbid0IGJlIGVtcHR5BgMJAAACBQpfZGVzY0NoZWNrBQpfZGVzY0NoZWNrBA9faW5pdGlhdG9yQ2hlY2sDCQECIT0CCQClCAEJAKcIAQgFAWkPY2FsbGVyUHVibGljS2V5BQxpbml0aWF0b3JBZHIJAAIBAiZJbml0aWF0b3IgYWRkcmVzcyBkb2Vzbid0IG1hdGNoIGNhbGxlcgYDCQAAAgUPX2luaXRpYXRvckNoZWNrBQ9faW5pdGlhdG9yQ2hlY2sEDF90eGRhdGFDaGVjawMJAAACCQCxAgEFBnR4ZGF0YQAACQACAQIWVHggZGF0YSBjYW4ndCBiZSBlbXB0eQYDCQAAAgUMX3R4ZGF0YUNoZWNrBQxfdHhkYXRhQ2hlY2sEBnRhc2tJZAkArAICCQCsAgIJAKwCAgIDdHhfBQRkYXBwAgFfBQR0eGlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGdGFza0lkAgZfX25hbWUFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCBl9fZGFwcAUEZGFwcAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBnRhc2tJZAIGX190eElkBQR0eGlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGdGFza0lkAgZfX2Rlc2MFBGRlc2MJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCCF9fdHhkYXRhBQZ0eGRhdGEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCC19faW5pdGlhdG9yBQxpbml0aWF0b3JBZHIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUGdGFza0lkAgRfX3RzBQlleGVjdXRlVHMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpyZW1vdmVUYXNrAQZ0YXNrSWQECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDCQEBIQEJARBfaXNWYWxpZE9wZXJhdG9yAQUJY2FsbGVyUGJrCQACAQILTm90IGFsbG93ZWQEDGluaXRpYXRvckFkcgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQZ0YXNrSWQCC19faW5pdGlhdG9yAwkBAiE9AgUMaW5pdGlhdG9yQWRyCQClCAEJAKcIAQgFAWkPY2FsbGVyUHVibGljS2V5CQACAQIXT25seSBjcmVhdG9yIGNhbiByZW1vdmUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCBl9fbmFtZQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAIGX19kYXBwCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAgZfX3R4SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCBl9fZGVzYwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAIIX190eGRhdGEJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCC19faW5pdGlhdG9yCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAgRfX3RzCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAg9fX2NvbmZpcm1hdGlvbnMJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCCl9fYXBwcm92ZWQFA25pbAFpAQ9hZGRDb25maXJtYXRpb24BBnRhc2tJZAQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQQFbGltaXQJAQlfZ2V0TGltaXQAAwkBASEBCQEIX2lzQWRtaW4BBQljYWxsZXJQYmsJAAIBAhdPbmx5IGFkbWlucyBjYW4gY29uZmlybQQEdHhJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgUGdGFza0lkAgZfX3R4SWQCC0l2YWxpZCB0YXNrAwkAAAIFBHR4SWQFBHR4SWQEBGRhcHAJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgUGdGFza0lkAgZfX2RhcHAEEGNvbmZpcm1hdGlvbnNTdHIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkArAICBQZ0YXNrSWQCD19fY29uZmlybWF0aW9ucwIABA1jb25maXJtYXRpb25zCQC1CQIFEGNvbmZpcm1hdGlvbnNTdHICASwDCQECIT0CCQDPCAIFDWNvbmZpcm1hdGlvbnMFCWNhbGxlclBiawUEdW5pdAkAAgECH1lvdSBhbHJlYWR5IGNvbmZpcm1lZCB0aGlzIHRhc2sEB25ld0xpc3QDCQECIT0CBRBjb25maXJtYXRpb25zU3RyAgAJAM0IAgUNY29uZmlybWF0aW9ucwUJY2FsbGVyUGJrCQDMCAIFCWNhbGxlclBiawUDbmlsBApuZXdMaXN0U3RyCQC5CQIFB25ld0xpc3QCASwECGFwcHJvdmVkCQBnAgkAkAMBBQduZXdMaXN0BQVsaW1pdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBnRhc2tJZAIPX19jb25maXJtYXRpb25zBQpuZXdMaXN0U3RyCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIJAKwCAgkArAICBQRkYXBwAgFfBQR0eElkAgpfX2FwcHJvdmVkBQhhcHByb3ZlZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHNldExpbWl0AQVsaW1pdAQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQMJAQEhAQkBCF9pc0FkbWluAQUJY2FsbGVyUGJrCQACAQIeT25seSB3aGl0ZWxpc3RlZCBjYW4gc2V0IGxpbWl0BAl6ZXJvTGltaXQDCQBmAgUFbGltaXQAAAYJAAIBAhNMaW1pdCBzaG91bGQgYmUgPiAwAwkAAAIFCXplcm9MaW1pdAUJemVyb0xpbWl0BAZhZG1pbnMJARFAZXh0ck5hdGl2ZSgxMDU4KQEFCGtfQURNSU5TAwkAZgIFBWxpbWl0CQCxAgEFBmFkbWlucwkAAgEJAKwCAgkArAICCQCsAgICOUxpbWl0IHF1b3J1bSBzaG91bGQgYmUgPD0gc2l6ZSBvZiBsaXN0IG9mIGFkbWlucywgbGltaXQ6IAkApAMBBQVsaW1pdAIQLCBjdXJyZW50IHNpemU6IAkApAMBCQCxAgEFBmFkbWlucwkAzAgCCQEMSW50ZWdlckVudHJ5AgUHa19MSU1JVAUFbGltaXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQR0ZXN0AAQBeAQHJG1hdGNoMAkA7QcBBQZoZWlnaHQDCQABAgUHJG1hdGNoMAIJQmxvY2tJbmZvBAVibG9jawUHJG1hdGNoMAkAAgEJAKQDAQgFBWJsb2NrCXRpbWVzdGFtcAkAAgECEENhbid0IGZpbmQgYmxvY2sDCQAAAgUBeAUBeAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmNsZWFyX3Rlc3QABAdpbmRpY2VzCQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgUDbmlsCgEMcmVtb3ZlQ2h1bmtzAgVhY2N1bQVpbmRleAkAzQgCBQVhY2N1bQkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICCHRlc3R0YXNrAglfX3R4ZGF0YV8JAKQDAQUFaW5kZXgEB2VudHJpZXMKAAIkbAUHaW5kaWNlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICAgh0ZXN0dGFzawIPX190eGRhdGFfY2h1bmtzBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDHJlbW92ZUNodW5rcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgUHZW50cmllcwD4zQP8", "height": 474722, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Bi3kdTGE1C5QRK6SAydW3K7rCWKBH3df4UiTwkBpJq8d Next: 7Ciet9bpe5HdPpwC5y9dhvz166ZVYxofXikEei3qC1ea Diff:
OldNewDifferences
352352 then {
353353 let scriptType = getStringValue((scriptId + "__scriptType"))
354354 let scriptIdItems = split(scriptId, "%%")
355- let iteration = scriptIdItems[1]
355+ let iteration = scriptIdItems[2]
356356 let confirmationsStr = valueOrElse(getString((scriptId + "__confirmations")), "")
357357 let confirmations = split(confirmationsStr, ",")
358358 if ((indexOf(confirmations, callerPbk) != unit))
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)
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"))
354354 let scriptIdItems = split(scriptId, "%%")
355- let iteration = scriptIdItems[1]
355+ let iteration = scriptIdItems[2]
356356 let confirmationsStr = valueOrElse(getString((scriptId + "__confirmations")), "")
357357 let confirmations = split(confirmationsStr, ",")
358358 if ((indexOf(confirmations, callerPbk) != unit))
359359 then throw("You already confirmed this script")
360360 else {
361361 let newList = if ((confirmationsStr != ""))
362362 then (confirmations :+ callerPbk)
363363 else [callerPbk]
364364 let newListStr = makeString(newList, ",")
365365 let approved = (size(newList) >= limit)
366366 [StringEntry((scriptId + "__confirmations"), newListStr), IntegerEntry((k_ITERATION + scriptType), parseIntValue(iteration)), BooleanEntry((((scriptType + "_") + _scriptHash) + "__approved"), approved)]
367367 }
368368 }
369369 else throw("Strict value is not equal to itself.")
370370 }
371371 }
372372
373373
374374
375375 @Callable(i)
376376 func addTask (name,dapp,txid,executeTs,desc,initiatorAdr,txdata) = {
377377 let callerPbk = toBase58String(i.callerPublicKey)
378378 if (!(_isValidOperator(callerPbk)))
379379 then throw("Not allowed")
380380 else {
381381 let _nameCheck = if ((size(name) == 0))
382382 then throw("Name can't be empty")
383383 else true
384384 if ((_nameCheck == _nameCheck))
385385 then {
386386 let _dappCheck = if (!(_validateAddress(dapp)))
387387 then throw("Incorrect dapp")
388388 else true
389389 if ((_dappCheck == _dappCheck))
390390 then {
391391 let _txidCheck = if ((size(txid) == 0))
392392 then throw("txid can't be empty")
393393 else true
394394 if ((_txidCheck == _txidCheck))
395395 then {
396396 let _timestampCheck = if (!(_validateTs(executeTs)))
397397 then throw("txid can't be empty")
398398 else true
399399 if ((_timestampCheck == _timestampCheck))
400400 then {
401401 let _descCheck = if ((size(desc) == 0))
402402 then throw("Description can't be empty")
403403 else true
404404 if ((_descCheck == _descCheck))
405405 then {
406406 let _initiatorCheck = if ((toString(addressFromPublicKey(i.callerPublicKey)) != initiatorAdr))
407407 then throw("Initiator address doesn't match caller")
408408 else true
409409 if ((_initiatorCheck == _initiatorCheck))
410410 then {
411411 let _txdataCheck = if ((size(txdata) == 0))
412412 then throw("Tx data can't be empty")
413413 else true
414414 if ((_txdataCheck == _txdataCheck))
415415 then {
416416 let taskId = ((("tx_" + dapp) + "_") + txid)
417417 [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)]
418418 }
419419 else throw("Strict value is not equal to itself.")
420420 }
421421 else throw("Strict value is not equal to itself.")
422422 }
423423 else throw("Strict value is not equal to itself.")
424424 }
425425 else throw("Strict value is not equal to itself.")
426426 }
427427 else throw("Strict value is not equal to itself.")
428428 }
429429 else throw("Strict value is not equal to itself.")
430430 }
431431 else throw("Strict value is not equal to itself.")
432432 }
433433 }
434434
435435
436436
437437 @Callable(i)
438438 func removeTask (taskId) = {
439439 let callerPbk = toBase58String(i.callerPublicKey)
440440 if (!(_isValidOperator(callerPbk)))
441441 then throw("Not allowed")
442442 else {
443443 let initiatorAdr = getStringValue((taskId + "__initiator"))
444444 if ((initiatorAdr != toString(addressFromPublicKey(i.callerPublicKey))))
445445 then throw("Only creator can remove")
446446 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"))]
447447 }
448448 }
449449
450450
451451
452452 @Callable(i)
453453 func addConfirmation (taskId) = {
454454 let callerPbk = toBase58String(i.callerPublicKey)
455455 let limit = _getLimit()
456456 if (!(_isAdmin(callerPbk)))
457457 then throw("Only admins can confirm")
458458 else {
459459 let txId = valueOrErrorMessage(getString((taskId + "__txId")), "Ivalid task")
460460 if ((txId == txId))
461461 then {
462462 let dapp = getStringValue((taskId + "__dapp"))
463463 let confirmationsStr = valueOrElse(getString((taskId + "__confirmations")), "")
464464 let confirmations = split(confirmationsStr, ",")
465465 if ((indexOf(confirmations, callerPbk) != unit))
466466 then throw("You already confirmed this task")
467467 else {
468468 let newList = if ((confirmationsStr != ""))
469469 then (confirmations :+ callerPbk)
470470 else [callerPbk]
471471 let newListStr = makeString(newList, ",")
472472 let approved = (size(newList) >= limit)
473473 [StringEntry((taskId + "__confirmations"), newListStr), BooleanEntry((((dapp + "_") + txId) + "__approved"), approved)]
474474 }
475475 }
476476 else throw("Strict value is not equal to itself.")
477477 }
478478 }
479479
480480
481481
482482 @Callable(i)
483483 func setLimit (limit) = {
484484 let callerPbk = toBase58String(i.callerPublicKey)
485485 if (!(_isAdmin(callerPbk)))
486486 then throw("Only whitelisted can set limit")
487487 else {
488488 let zeroLimit = if ((limit > 0))
489489 then true
490490 else throw("Limit should be > 0")
491491 if ((zeroLimit == zeroLimit))
492492 then {
493493 let admins = getStringValue(k_ADMINS)
494494 if ((limit > size(admins)))
495495 then throw(((("Limit quorum should be <= size of list of admins, limit: " + toString(limit)) + ", current size: ") + toString(size(admins))))
496496 else [IntegerEntry(k_LIMIT, limit)]
497497 }
498498 else throw("Strict value is not equal to itself.")
499499 }
500500 }
501501
502502
503503
504504 @Callable(i)
505505 func test () = {
506506 let x = match blockInfoByHeight(height) {
507507 case block: BlockInfo =>
508508 throw(toString(block.timestamp))
509509 case _ =>
510510 throw("Can't find block")
511511 }
512512 if ((x == x))
513513 then nil
514514 else throw("Strict value is not equal to itself.")
515515 }
516516
517517
518518
519519 @Callable(i)
520520 func clear_test () = {
521521 let indices = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
522522 func removeChunks (accum,index) = (accum :+ DeleteEntry((("testtask" + "__txdata_") + toString(index))))
523523
524524 let entries = {
525525 let $l = indices
526526 let $s = size($l)
527527 let $acc0 = [DeleteEntry(("testtask" + "__txdata_chunks"))]
528528 func $f0_1 ($a,$i) = if (($i >= $s))
529529 then $a
530530 else removeChunks($a, $l[$i])
531531
532532 func $f0_2 ($a,$i) = if (($i >= $s))
533533 then $a
534534 else throw("List size exceeds 10")
535535
536536 $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)
537537 }
538538 entries
539539 }
540540
541541

github/deemru/w8io
53.24 ms