tx · EeiwDbw1odPborAi1gtmUENo9cFXe6bUPB7koFf7bAdc

3M7uzD8rT54fKQcP4s417if1VKU8yromEP2:  -0.05500000 Waves

2025.10.15 13:57 [471715] smart account 3M7uzD8rT54fKQcP4s417if1VKU8yromEP2 > SELF 0.00000000 Waves

{ "type": 13, "id": "EeiwDbw1odPborAi1gtmUENo9cFXe6bUPB7koFf7bAdc", "fee": 5500000, "feeAssetId": null, "timestamp": 1760525870833, "version": 2, "chainId": 82, "sender": "3M7uzD8rT54fKQcP4s417if1VKU8yromEP2", "senderPublicKey": "2eFPamS5zez1159HEFEJaxs2XPq3AupPbNApNGffRjqf", "proofs": [ "2crkeB7nEpqyvtm5qpdmNp9dNm7tTZ7FwQZVuD4wRbUn5PdcuJckguZtHPmiedkwkogYBGaGNg5Q6yp5Jgymy3Vi" ], "script": "base64:BgJNCAISBAoCGAESAwoBCBIDCgEIEgMKAQgSAwoBCBIHCgUICAgICBIDCgEIEgMKAQgSCQoHCAgIAQgICBIDCgEIEgMKAQgSAwoBARIAEgANAAdWRVJTSU9OAgUxLjAuMAAFTElNSVQAAgAIa19BRE1JTlMCC0FETUlOU19QQktTAAprX01BTkFHRVJTAg1NQU5BR0VSU19QQktTAAdrX0xJTUlUAgxWT1RFU19RVU9SVU0ADmtfU0NSSVBUX1RZUEVTAgxTQ1JJUFRfVFlQRVMBDF92YWxpZGF0ZVBiawEDcGJrBAdhZGRyZXNzCQCnCAEJANkEAQUDcGJrAwkAAAIFB2FkZHJlc3MFB2FkZHJlc3MECmFkZHJlc3NTdHIJAKUIAQUHYWRkcmVzcwMJAAACBQphZGRyZXNzU3RyBQphZGRyZXNzU3RyBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEQX3ZhbGlkYXRlQWRkcmVzcwEHYWRkcmVzcwQEYWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUHYWRkcmVzcwMJAAACBQRhZGRyBQRhZGRyBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEJX2dldExpbWl0AAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFB2tfTElNSVQCGFF1b3J1bSBsaW1pdCBub3QgZGVmaW5lZAEIX2lzQWRtaW4BA3BiawQJYWRtaW5zU3RyCQELdmFsdWVPckVsc2UCCQCiCAEFCGtfQURNSU5TAgAEBmFkbWlucwkAtQkCBQlhZG1pbnNTdHICASwJAQIhPQIJAM8IAgUGYWRtaW5zBQNwYmsFBHVuaXQBCl9pc01hbmFnZXIBA3BiawQLbWFuYWdlcnNTdHIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUKa19NQU5BR0VSUwIABAhtYW5hZ2VycwkAtQkCBQttYW5hZ2Vyc1N0cgIBLAkBAiE9AgkAzwgCBQhtYW5hZ2VycwUDcGJrBQR1bml0ARBfaXNWYWxpZE9wZXJhdG9yAQNwYmsEC21hbmFnZXJzU3RyCQELdmFsdWVPckVsc2UCCQCiCAEFCmtfTUFOQUdFUlMCAAQIbWFuYWdlcnMJALUJAgULbWFuYWdlcnNTdHICASwEB2lzQWRtaW4JAQhfaXNBZG1pbgEFA3BiawQJaXNNYW5hZ2VyCQEKX2lzTWFuYWdlcgEFA3BiawMFB2lzQWRtaW4GBQlpc01hbmFnZXIBCnNhdmVUeERhdGECBnRhc2tJZARkYXRhBAdpbmRpY2VzCQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgUDbmlsBAhkYXRhU2l6ZQkAsQIBBQRkYXRhBAppc05vdEVtcHR5AwkBAiE9AgUIZGF0YVNpemUAAAYJAAIBAh1zYXZlVHhEYXRhOiBFbXB0eSBkYXRhIHBhc3NlZAMJAAACBQppc05vdEVtcHR5BQppc05vdEVtcHR5BAljaHVua1NpemUAsOoBBAtjaHVua3NDb3VudAMJAAACCQBqAgUIZGF0YVNpemUFCWNodW5rU2l6ZQAACQBpAgUIZGF0YVNpemUFCWNodW5rU2l6ZQkAZAIJAGkCBQhkYXRhU2l6ZQUJY2h1bmtTaXplAAEKAQptYWtlQ2h1bmtzAgVhY2N1bQVpbmRleAQFY2h1bmsJAK8CAggFBWFjY3VtAl8xBQljaHVua1NpemUDCQAAAgkAsQIBBQVjaHVuawAABQVhY2N1bQQIbmV4dERhdGEJALACAggFBWFjY3VtAl8xBQljaHVua1NpemUJAJQKAgUIbmV4dERhdGEJAM0IAggFBWFjY3VtAl8yCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUGdGFza0lkAglfX3R4ZGF0YV8JAKQDAQUFaW5kZXgFBWNodW5rBAdlbnRyaWVzCgACJGwFB2luZGljZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFBGRhdGEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCD19fdHhkYXRhX2NodW5rcwkApAMBBQtjaHVua3NDb3VudAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQptYWtlQ2h1bmtzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCAUHZW50cmllcwJfMgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLg4BaQEEaW5pdAILYWRtaW5zX3Bia3MFbGltaXQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg5TZWxmIGNhbGwgb25seQQLc2l6ZV9hZG1pbnMDCQECIT0CCQCQAwEFC2FkbWluc19wYmtzAAAGCQACAQInQXQgbGVhc3Qgb25lIGFkbWluIHBiayBzaG91bGQgYmUgcGFzc2VkAwkAAAIFC3NpemVfYWRtaW5zBQtzaXplX2FkbWlucwQMY2hlY2tfYWRtaW5zAwkBASEBCQEJaXNEZWZpbmVkAQkAoggBBQhrX0FETUlOUwYJAAIBAg5BbHJlYWR5IGluaXRlZAMJAAACBQxjaGVja19hZG1pbnMFDGNoZWNrX2FkbWlucwQJemVyb0xpbWl0AwkAZgIFBWxpbWl0AAAGCQACAQITTGltaXQgc2hvdWxkIGJlID4gMAMJAAACBQl6ZXJvTGltaXQFCXplcm9MaW1pdAQIbGltaXRfb2sDCQBnAgUFbGltaXQJAJADAQULYWRtaW5zX3Bia3MGCQACAQkArAICCQCsAgIJAKwCAgI5TGltaXQgcXVvcnVtIHNob3VsZCBiZSA8PSBzaXplIG9mIGxpc3Qgb2YgYWRtaW5zLCBsaW1pdDogCQCkAwEFBWxpbWl0AhAsIGN1cnJlbnQgc2l6ZTogCQCkAwEJAJADAQULYWRtaW5zX3Bia3MDCQAAAgUIbGltaXRfb2sFCGxpbWl0X29rCgEIdmFsaWRhdGUCBWFjY3VtBG5leHQJAQxfdmFsaWRhdGVQYmsBBQRuZXh0BAh2YWxpZFJlcwoAAiRsBQthZG1pbnNfcGJrcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIdmFsaWRhdGUCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoDCQAAAgUIdmFsaWRSZXMFCHZhbGlkUmVzBAlhZG1pbnNTdHIJALkJAgULYWRtaW5zX3Bia3MCASwJAMwIAgkBC1N0cmluZ0VudHJ5AgUIa19BRE1JTlMFCWFkbWluc1N0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgUHa19MSU1JVAUFbGltaXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhhZGRBZG1pbgEDcGJrBAljYWxsZXJQYmsJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5BAdpc0FkbWluAwkBCF9pc0FkbWluAQUJY2FsbGVyUGJrBgkAAgECGU9ubHkgYWRtaW5zIGNhbiBhZGQgYWRtaW4DCQAAAgUHaXNBZG1pbgUHaXNBZG1pbgQHaXNWYWxpZAMJAQxfdmFsaWRhdGVQYmsBBQNwYmsGCQACAQIRSW52YWxpZCBhZG1pbiBwYmsDCQAAAgUHaXNWYWxpZAUHaXNWYWxpZAQMbmV3QWRtaW5zU3RyCQCsAgIJAKwCAgkBEUBleHRyTmF0aXZlKDEwNTgpAQUIa19BRE1JTlMCASwFA3BiawkAzAgCCQELU3RyaW5nRW50cnkCBQhrX0FETUlOUwUMbmV3QWRtaW5zU3RyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELcmVtb3ZlQWRtaW4BA3BiawQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQQHaXNBZG1pbgMJAQhfaXNBZG1pbgEFCWNhbGxlclBiawYJAAIBAhlPbmx5IGFkbWlucyBjYW4gYWRkIGFkbWluAwkAAAIFB2lzQWRtaW4FB2lzQWRtaW4EB2lzVmFsaWQDCQEMX3ZhbGlkYXRlUGJrAQUDcGJrBgkAAgECEUludmFsaWQgYWRtaW4gcGJrAwkAAAIFB2lzVmFsaWQFB2lzVmFsaWQEDG9sZEFkbWluc1N0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQUIa19BRE1JTlMECW9sZEFkbWlucwkAtQkCBQxvbGRBZG1pbnNTdHICASwECmNoZWNrQ291bnQDCQBnAgABCQCQAwEFCW9sZEFkbWlucwkAAgECL0Nhbm5vdCByZW1vdmUsIGF0IGxlYXN0IG9uZSBhZG1pbiBzaG91bGQgcmVtYWluBgMJAAACBQpjaGVja0NvdW50BQpjaGVja0NvdW50BAVpbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCW9sZEFkbWlucwUDcGJrAhhUaGlzIHBiayBpcyBub3QgYW4gYWRtaW4ECW5ld0FkbWlucwkA0QgCBQlvbGRBZG1pbnMFBWluZGV4BAxuZXdBZG1pbnNTdHIJALkJAgUJbmV3QWRtaW5zAgEsCQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtfQURNSU5TBQxuZXdBZG1pbnNTdHIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1hZGRTY3JpcHRUeXBlAQpzY3JpcHRUeXBlBAljYWxsZXJQYmsJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5AwkBASEBCQEIX2lzQWRtaW4BBQljYWxsZXJQYmsJAAIBAgtOb3QgYWxsb3dlZAQKY2hlY2tFbXB0eQMJAAACCQCxAgEFCnNjcmlwdFR5cGUAAAkAAgECHFNjcmlwdCB0eXBlIGNhbiBub3QgYmUgZW1wdHkGAwkAAAIFCmNoZWNrRW1wdHkFCmNoZWNrRW1wdHkEDnNjcmlwdFR5cGVzU3RyCQELdmFsdWVPckVsc2UCCQCiCAEFDmtfU0NSSVBUX1RZUEVTAgAEC3NjcmlwdFR5cGVzCQC8CQIFDnNjcmlwdFR5cGVzU3RyAgEsBAtjaGVja0V4aXN0cwMJAQIhPQIJAM8IAgULc2NyaXB0VHlwZXMFCnNjcmlwdFR5cGUFBHVuaXQJAAIBCQCsAgIJAKwCAgINU2NyaXB0IHR5cGUgPAUKc2NyaXB0VHlwZQIPPiBhbHJlYWR5IGFkZGVkBgMJAAACBQtjaGVja0V4aXN0cwULY2hlY2tFeGlzdHMEDm5ld1NjcmlwdFR5cGVzAwkBAiE9AgUOc2NyaXB0VHlwZXNTdHICAAkAzQgCBQtzY3JpcHRUeXBlcwUKc2NyaXB0VHlwZQkAzAgCBQpzY3JpcHRUeXBlBQNuaWwEEW5ld1NjcmlwdFR5cGVzU3RyCQC5CQIFDm5ld1NjcmlwdFR5cGVzAgEsCQDMCAIJAQtTdHJpbmdFbnRyeQIFDmtfU0NSSVBUX1RZUEVTBRFuZXdTY3JpcHRUeXBlc1N0cgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEHJlbW92ZVNjcmlwdFR5cGUBCnNjcmlwdFR5cGUECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDCQEBIQEJAQhfaXNBZG1pbgEFCWNhbGxlclBiawkAAgECC05vdCBhbGxvd2VkBA5zY3JpcHRUeXBlc1N0cgkBC3ZhbHVlT3JFbHNlAgkAoggBBQ5rX1NDUklQVF9UWVBFUwIABAtzY3JpcHRUeXBlcwkAvAkCBQ5zY3JpcHRUeXBlc1N0cgIBLAQFaW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQtzY3JpcHRUeXBlcwUKc2NyaXB0VHlwZQkArAICCQCsAgICDVNjcmlwdCB0eXBlIDwFCnNjcmlwdFR5cGUCED4gaXMgbm90IHByZXNlbnQEDm5ld1NjcmlwdFR5cGVzCQDRCAIFC3NjcmlwdFR5cGVzBQVpbmRleAQRbmV3U2NyaXB0VHlwZXNTdHIJALkJAgUObmV3U2NyaXB0VHlwZXMCASwJAMwIAgkBC1N0cmluZ0VudHJ5AgUOa19TQ1JJUFRfVFlQRVMFEW5ld1NjcmlwdFR5cGVzU3RyBQNuaWwBaQEJYWRkU2NyaXB0BQpzY3JpcHRUeXBlDnN0b3JhZ2VBZGRyZXNzCnNjcmlwdEhhc2gEZGVzYwxpbml0aWF0b3JBZHIECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDCQEBIQEJARBfaXNWYWxpZE9wZXJhdG9yAQUJY2FsbGVyUGJrCQACAQILTm90IGFsbG93ZWQEEXN0b3JhZ2VTY3JpcHRIYXNoCQDYBAEJAQV2YWx1ZQEJAPEHAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUOc3RvcmFnZUFkZHJlc3MECWhhc2hDaGVjawMJAQIhPQIFEXN0b3JhZ2VTY3JpcHRIYXNoBQpzY3JpcHRIYXNoCQACAQI0U3RvcmVkIGFuZCBwYXNzZWQgYXMgYXJndW1lbnQgc2NyaXB0SGFzaGVzIG5vdCBtYXRjaAYDCQAAAgUJaGFzaENoZWNrBQloYXNoQ2hlY2sECHNjcmlwdElkCQCsAgIJAKwCAgkArAICAgdzY3JpcHRfBQpzY3JpcHRUeXBlAgFfBQpzY3JpcHRIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUIc2NyaXB0SWQCDF9fc2NyaXB0VHlwZQUKc2NyaXB0VHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCHNjcmlwdElkAhBfX3N0b3JhZ2VBZGRyZXNzBQ5zdG9yYWdlQWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCHNjcmlwdElkAgxfX3NjcmlwdEhhc2gFEXN0b3JhZ2VTY3JpcHRIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUIc2NyaXB0SWQCBl9fZGVzYwUEZGVzYwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCHNjcmlwdElkAgtfX2luaXRpYXRvcgUMaW5pdGlhdG9yQWRyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMcmVtb3ZlU2NyaXB0AQhzY3JpcHRJZAQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQMJAQEhAQkBEF9pc1ZhbGlkT3BlcmF0b3IBBQljYWxsZXJQYmsJAAIBAgtOb3QgYWxsb3dlZAQMaW5pdGlhdG9yQWRyCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIFCHNjcmlwdElkAgtfX2luaXRpYXRvcgMJAQIhPQIFDGluaXRpYXRvckFkcgkApQgBCQCnCAEIBQFpD2NhbGxlclB1YmxpY0tleQkAAgECF09ubHkgY3JlYXRvciBjYW4gcmVtb3ZlCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUIc2NyaXB0SWQCDF9fc2NyaXB0VHlwZQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFCHNjcmlwdElkAhBfX3N0b3JhZ2VBZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUIc2NyaXB0SWQCDF9fc2NyaXB0SGFzaAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFCHNjcmlwdElkAgZfX2Rlc2MJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQhzY3JpcHRJZAILX19pbml0aWF0b3IJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQhzY3JpcHRJZAIPX19jb25maXJtYXRpb25zCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUIc2NyaXB0SWQCCl9fYXBwcm92ZWQFA25pbAFpARVhZGRDb25maXJtYXRpb25TY3JpcHQBCHNjcmlwdElkBAljYWxsZXJQYmsJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5BAVsaW1pdAkBCV9nZXRMaW1pdAADCQEBIQEJAQhfaXNBZG1pbgEFCWNhbGxlclBiawkAAgECF09ubHkgYWRtaW5zIGNhbiBjb25maXJtBAtfc2NyaXB0SGFzaAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgUIc2NyaXB0SWQCDF9fc2NyaXB0SGFzaAIPSXZhbGlkIHNjcmlwdElkAwkAAAIFC19zY3JpcHRIYXNoBQtfc2NyaXB0SGFzaAQKc2NyaXB0VHlwZQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQhzY3JpcHRJZAIMX19zY3JpcHRUeXBlBBBjb25maXJtYXRpb25zU3RyCQELdmFsdWVPckVsc2UCCQCiCAEJAKwCAgUIc2NyaXB0SWQCD19fY29uZmlybWF0aW9ucwIABA1jb25maXJtYXRpb25zCQC1CQIFEGNvbmZpcm1hdGlvbnNTdHICASwDCQECIT0CCQDPCAIFDWNvbmZpcm1hdGlvbnMFCWNhbGxlclBiawUEdW5pdAkAAgECIVlvdSBhbHJlYWR5IGNvbmZpcm1lZCB0aGlzIHNjcmlwdAQHbmV3TGlzdAMJAQIhPQIFEGNvbmZpcm1hdGlvbnNTdHICAAkAzQgCBQ1jb25maXJtYXRpb25zBQljYWxsZXJQYmsJAMwIAgUJY2FsbGVyUGJrBQNuaWwECm5ld0xpc3RTdHIJALkJAgUHbmV3TGlzdAIBLAQIYXBwcm92ZWQJAGcCCQCQAwEFB25ld0xpc3QFBWxpbWl0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUIc2NyaXB0SWQCD19fY29uZmlybWF0aW9ucwUKbmV3TGlzdFN0cgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgIJAKwCAgUKc2NyaXB0VHlwZQIBXwULX3NjcmlwdEhhc2gCCl9fYXBwcm92ZWQFCGFwcHJvdmVkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHYWRkVGFzawcEbmFtZQRkYXBwBHR4aWQJZXhlY3V0ZVRzBGRlc2MMaW5pdGlhdG9yQWRyBnR4ZGF0YQQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQMJAQEhAQkBEF9pc1ZhbGlkT3BlcmF0b3IBBQljYWxsZXJQYmsJAAIBAgtOb3QgYWxsb3dlZAQKX25hbWVDaGVjawMJAAACCQCxAgEFBG5hbWUAAAkAAgECE05hbWUgY2FuJ3QgYmUgZW1wdHkGAwkAAAIFCl9uYW1lQ2hlY2sFCl9uYW1lQ2hlY2sECl9kYXBwQ2hlY2sDCQEBIQEJARBfdmFsaWRhdGVBZGRyZXNzAQUEZGFwcAkAAgECDkluY29ycmVjdCBkYXBwBgMJAAACBQpfZGFwcENoZWNrBQpfZGFwcENoZWNrBApfdHhpZENoZWNrAwkAAAIJALECAQUEdHhpZAAACQACAQITdHhpZCBjYW4ndCBiZSBlbXB0eQYDCQAAAgUKX3R4aWRDaGVjawUKX3R4aWRDaGVjawQGdGFza0lkCQCsAgIJAKwCAgkArAICAgN0eF8FBGRhcHACAV8FBHR4aWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCBl9fbmFtZQUEbmFtZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBnRhc2tJZAIGX19kYXBwBQRkYXBwCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGdGFza0lkAgZfX3R4SWQFBHR4aWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCBl9fZGVzYwUEZGVzYwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBnRhc2tJZAIIX190eGRhdGEFBnR4ZGF0YQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBnRhc2tJZAILX19pbml0aWF0b3IFDGluaXRpYXRvckFkcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQZ0YXNrSWQCBF9fdHMFCWV4ZWN1dGVUcwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCnJlbW92ZVRhc2sBBnRhc2tJZAQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQMJAQEhAQkBEF9pc1ZhbGlkT3BlcmF0b3IBBQljYWxsZXJQYmsJAAIBAgtOb3QgYWxsb3dlZAQMaW5pdGlhdG9yQWRyCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIFBnRhc2tJZAILX19pbml0aWF0b3IDCQECIT0CBQxpbml0aWF0b3JBZHIJAKUIAQkApwgBCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAAIBAhdPbmx5IGNyZWF0b3IgY2FuIHJlbW92ZQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAIGX19uYW1lCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAgZfX2RhcHAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCBl9fdHhJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAIGX19kZXNjCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAghfX3R4ZGF0YQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAILX19pbml0aWF0b3IJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCBF9fdHMJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCD19fY29uZmlybWF0aW9ucwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAIKX19hcHByb3ZlZAUDbmlsAWkBD2FkZENvbmZpcm1hdGlvbgEGdGFza0lkBAljYWxsZXJQYmsJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5BAVsaW1pdAkBCV9nZXRMaW1pdAADCQEBIQEJAQhfaXNBZG1pbgEFCWNhbGxlclBiawkAAgECF09ubHkgYWRtaW5zIGNhbiBjb25maXJtBAR0eElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkArAICBQZ0YXNrSWQCBl9fdHhJZAILSXZhbGlkIHRhc2sDCQAAAgUEdHhJZAUEdHhJZAQEZGFwcAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQZ0YXNrSWQCBl9fZGFwcAQQY29uZmlybWF0aW9uc1N0cgkBC3ZhbHVlT3JFbHNlAgkAoggBCQCsAgIFBnRhc2tJZAIPX19jb25maXJtYXRpb25zAgAEDWNvbmZpcm1hdGlvbnMJALUJAgUQY29uZmlybWF0aW9uc1N0cgIBLAMJAQIhPQIJAM8IAgUNY29uZmlybWF0aW9ucwUJY2FsbGVyUGJrBQR1bml0CQACAQIfWW91IGFscmVhZHkgY29uZmlybWVkIHRoaXMgdGFzawQHbmV3TGlzdAMJAQIhPQIFEGNvbmZpcm1hdGlvbnNTdHICAAkAzQgCBQ1jb25maXJtYXRpb25zBQljYWxsZXJQYmsJAMwIAgUJY2FsbGVyUGJrBQNuaWwECm5ld0xpc3RTdHIJALkJAgUHbmV3TGlzdAIBLAQIYXBwcm92ZWQJAGcCCQCQAwEFB25ld0xpc3QFBWxpbWl0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGdGFza0lkAg9fX2NvbmZpcm1hdGlvbnMFCm5ld0xpc3RTdHIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICCQCsAgIFBGRhcHACAV8FBHR4SWQCCl9fYXBwcm92ZWQFCGFwcHJvdmVkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIc2V0TGltaXQBBWxpbWl0BAljYWxsZXJQYmsJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5AwkBASEBCQEIX2lzQWRtaW4BBQljYWxsZXJQYmsJAAIBAh5Pbmx5IHdoaXRlbGlzdGVkIGNhbiBzZXQgbGltaXQECXplcm9MaW1pdAMJAGYCBQVsaW1pdAAABgkAAgECE0xpbWl0IHNob3VsZCBiZSA+IDADCQAAAgUJemVyb0xpbWl0BQl6ZXJvTGltaXQEBmFkbWlucwkBEUBleHRyTmF0aXZlKDEwNTgpAQUIa19BRE1JTlMDCQBmAgUFbGltaXQJALECAQUGYWRtaW5zCQACAQkArAICCQCsAgIJAKwCAgI5TGltaXQgcXVvcnVtIHNob3VsZCBiZSA8PSBzaXplIG9mIGxpc3Qgb2YgYWRtaW5zLCBsaW1pdDogCQCkAwEFBWxpbWl0AhAsIGN1cnJlbnQgc2l6ZTogCQCkAwEJALECAQUGYWRtaW5zCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQdrX0xJTUlUBQVsaW1pdAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBHRlc3QABAF4BAckbWF0Y2gwCQDtBwEFBmhlaWdodAMJAAECBQckbWF0Y2gwAglCbG9ja0luZm8EBWJsb2NrBQckbWF0Y2gwCQACAQkApAMBCAUFYmxvY2sJdGltZXN0YW1wCQACAQIQQ2FuJ3QgZmluZCBibG9jawMJAAACBQF4BQF4BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKY2xlYXJfdGVzdAAEB2luZGljZXMJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKBQNuaWwKAQxyZW1vdmVDaHVua3MCBWFjY3VtBWluZGV4CQDNCAIFBWFjY3VtCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIIdGVzdHRhc2sCCV9fdHhkYXRhXwkApAMBBQVpbmRleAQHZW50cmllcwoAAiRsBQdpbmRpY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgICCHRlc3R0YXNrAg9fX3R4ZGF0YV9jaHVua3MFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMcmVtb3ZlQ2h1bmtzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBQdlbnRyaWVzAG/OANI=", "height": 471715, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AYkn12axefTFFN1YpXRJhpvQqEBP71V9Vdph9F6nGRHu Next: GhKTKbGv1dQa15HXNo1Y9SpKqYCxLAwXesyKrf9J8d2R Diff:
OldNewDifferences
443443 case _ =>
444444 throw("Can't find block")
445445 }
446- nil
446+ if ((x == x))
447+ then nil
448+ else throw("Strict value is not equal to itself.")
447449 }
448450
449451
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 func _validatePbk (pbk) = {
1717 let address = addressFromPublicKey(fromBase58String(pbk))
1818 if ((address == address))
1919 then {
2020 let addressStr = toString(address)
2121 if ((addressStr == addressStr))
2222 then true
2323 else throw("Strict value is not equal to itself.")
2424 }
2525 else throw("Strict value is not equal to itself.")
2626 }
2727
2828
2929 func _validateAddress (address) = {
3030 let addr = addressFromStringValue(address)
3131 if ((addr == addr))
3232 then true
3333 else throw("Strict value is not equal to itself.")
3434 }
3535
3636
3737 func _getLimit () = valueOrErrorMessage(getInteger(k_LIMIT), "Quorum limit not defined")
3838
3939
4040 func _isAdmin (pbk) = {
4141 let adminsStr = valueOrElse(getString(k_ADMINS), "")
4242 let admins = split(adminsStr, ",")
4343 (indexOf(admins, pbk) != unit)
4444 }
4545
4646
4747 func _isManager (pbk) = {
4848 let managersStr = valueOrElse(getString(k_MANAGERS), "")
4949 let managers = split(managersStr, ",")
5050 (indexOf(managers, pbk) != unit)
5151 }
5252
5353
5454 func _isValidOperator (pbk) = {
5555 let managersStr = valueOrElse(getString(k_MANAGERS), "")
5656 let managers = split(managersStr, ",")
5757 let isAdmin = _isAdmin(pbk)
5858 let isManager = _isManager(pbk)
5959 if (isAdmin)
6060 then true
6161 else isManager
6262 }
6363
6464
6565 func saveTxData (taskId,data) = {
6666 let indices = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
6767 let dataSize = size(data)
6868 let isNotEmpty = if ((dataSize != 0))
6969 then true
7070 else throw("saveTxData: Empty data passed")
7171 if ((isNotEmpty == isNotEmpty))
7272 then {
7373 let chunkSize = 30000
7474 let chunksCount = if (((dataSize % chunkSize) == 0))
7575 then (dataSize / chunkSize)
7676 else ((dataSize / chunkSize) + 1)
7777 func makeChunks (accum,index) = {
7878 let chunk = take(accum._1, chunkSize)
7979 if ((size(chunk) == 0))
8080 then accum
8181 else {
8282 let nextData = drop(accum._1, chunkSize)
8383 $Tuple2(nextData, (accum._2 :+ StringEntry(((taskId + "__txdata_") + toString(index)), chunk)))
8484 }
8585 }
8686
8787 let entries = {
8888 let $l = indices
8989 let $s = size($l)
9090 let $acc0 = $Tuple2(data, [StringEntry((taskId + "__txdata_chunks"), toString(chunksCount))])
9191 func $f0_1 ($a,$i) = if (($i >= $s))
9292 then $a
9393 else makeChunks($a, $l[$i])
9494
9595 func $f0_2 ($a,$i) = if (($i >= $s))
9696 then $a
9797 else throw("List size exceeds 10")
9898
9999 $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)
100100 }
101101 entries._2
102102 }
103103 else throw("Strict value is not equal to itself.")
104104 }
105105
106106
107107 @Callable(i)
108108 func init (admins_pbks,limit) = if ((i.caller != this))
109109 then throw("Self call only")
110110 else {
111111 let size_admins = if ((size(admins_pbks) != 0))
112112 then true
113113 else throw("At least one admin pbk should be passed")
114114 if ((size_admins == size_admins))
115115 then {
116116 let check_admins = if (!(isDefined(getString(k_ADMINS))))
117117 then true
118118 else throw("Already inited")
119119 if ((check_admins == check_admins))
120120 then {
121121 let zeroLimit = if ((limit > 0))
122122 then true
123123 else throw("Limit should be > 0")
124124 if ((zeroLimit == zeroLimit))
125125 then {
126126 let limit_ok = if ((limit >= size(admins_pbks)))
127127 then true
128128 else throw(((("Limit quorum should be <= size of list of admins, limit: " + toString(limit)) + ", current size: ") + toString(size(admins_pbks))))
129129 if ((limit_ok == limit_ok))
130130 then {
131131 func validate (accum,next) = _validatePbk(next)
132132
133133 let validRes = {
134134 let $l = admins_pbks
135135 let $s = size($l)
136136 let $acc0 = ""
137137 func $f0_1 ($a,$i) = if (($i >= $s))
138138 then $a
139139 else validate($a, $l[$i])
140140
141141 func $f0_2 ($a,$i) = if (($i >= $s))
142142 then $a
143143 else throw("List size exceeds 10")
144144
145145 $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)
146146 }
147147 if ((validRes == validRes))
148148 then {
149149 let adminsStr = makeString(admins_pbks, ",")
150150 [StringEntry(k_ADMINS, adminsStr), IntegerEntry(k_LIMIT, limit)]
151151 }
152152 else throw("Strict value is not equal to itself.")
153153 }
154154 else throw("Strict value is not equal to itself.")
155155 }
156156 else throw("Strict value is not equal to itself.")
157157 }
158158 else throw("Strict value is not equal to itself.")
159159 }
160160 else throw("Strict value is not equal to itself.")
161161 }
162162
163163
164164
165165 @Callable(i)
166166 func addAdmin (pbk) = {
167167 let callerPbk = toBase58String(i.callerPublicKey)
168168 let isAdmin = if (_isAdmin(callerPbk))
169169 then true
170170 else throw("Only admins can add admin")
171171 if ((isAdmin == isAdmin))
172172 then {
173173 let isValid = if (_validatePbk(pbk))
174174 then true
175175 else throw("Invalid admin pbk")
176176 if ((isValid == isValid))
177177 then {
178178 let newAdminsStr = ((getStringValue(k_ADMINS) + ",") + pbk)
179179 [StringEntry(k_ADMINS, newAdminsStr)]
180180 }
181181 else throw("Strict value is not equal to itself.")
182182 }
183183 else throw("Strict value is not equal to itself.")
184184 }
185185
186186
187187
188188 @Callable(i)
189189 func removeAdmin (pbk) = {
190190 let callerPbk = toBase58String(i.callerPublicKey)
191191 let isAdmin = if (_isAdmin(callerPbk))
192192 then true
193193 else throw("Only admins can add admin")
194194 if ((isAdmin == isAdmin))
195195 then {
196196 let isValid = if (_validatePbk(pbk))
197197 then true
198198 else throw("Invalid admin pbk")
199199 if ((isValid == isValid))
200200 then {
201201 let oldAdminsStr = getStringValue(k_ADMINS)
202202 let oldAdmins = split(oldAdminsStr, ",")
203203 let checkCount = if ((1 >= size(oldAdmins)))
204204 then throw("Cannot remove, at least one admin should remain")
205205 else true
206206 if ((checkCount == checkCount))
207207 then {
208208 let index = valueOrErrorMessage(indexOf(oldAdmins, pbk), "This pbk is not an admin")
209209 let newAdmins = removeByIndex(oldAdmins, index)
210210 let newAdminsStr = makeString(newAdmins, ",")
211211 [StringEntry(k_ADMINS, newAdminsStr)]
212212 }
213213 else throw("Strict value is not equal to itself.")
214214 }
215215 else throw("Strict value is not equal to itself.")
216216 }
217217 else throw("Strict value is not equal to itself.")
218218 }
219219
220220
221221
222222 @Callable(i)
223223 func addScriptType (scriptType) = {
224224 let callerPbk = toBase58String(i.callerPublicKey)
225225 if (!(_isAdmin(callerPbk)))
226226 then throw("Not allowed")
227227 else {
228228 let checkEmpty = if ((size(scriptType) == 0))
229229 then throw("Script type can not be empty")
230230 else true
231231 if ((checkEmpty == checkEmpty))
232232 then {
233233 let scriptTypesStr = valueOrElse(getString(k_SCRIPT_TYPES), "")
234234 let scriptTypes = split_4C(scriptTypesStr, ",")
235235 let checkExists = if ((indexOf(scriptTypes, scriptType) != unit))
236236 then throw((("Script type <" + scriptType) + "> already added"))
237237 else true
238238 if ((checkExists == checkExists))
239239 then {
240240 let newScriptTypes = if ((scriptTypesStr != ""))
241241 then (scriptTypes :+ scriptType)
242242 else [scriptType]
243243 let newScriptTypesStr = makeString(newScriptTypes, ",")
244244 [StringEntry(k_SCRIPT_TYPES, newScriptTypesStr)]
245245 }
246246 else throw("Strict value is not equal to itself.")
247247 }
248248 else throw("Strict value is not equal to itself.")
249249 }
250250 }
251251
252252
253253
254254 @Callable(i)
255255 func removeScriptType (scriptType) = {
256256 let callerPbk = toBase58String(i.callerPublicKey)
257257 if (!(_isAdmin(callerPbk)))
258258 then throw("Not allowed")
259259 else {
260260 let scriptTypesStr = valueOrElse(getString(k_SCRIPT_TYPES), "")
261261 let scriptTypes = split_4C(scriptTypesStr, ",")
262262 let index = valueOrErrorMessage(indexOf(scriptTypes, scriptType), (("Script type <" + scriptType) + "> is not present"))
263263 let newScriptTypes = removeByIndex(scriptTypes, index)
264264 let newScriptTypesStr = makeString(newScriptTypes, ",")
265265 [StringEntry(k_SCRIPT_TYPES, newScriptTypesStr)]
266266 }
267267 }
268268
269269
270270
271271 @Callable(i)
272272 func addScript (scriptType,storageAddress,scriptHash,desc,initiatorAdr) = {
273273 let callerPbk = toBase58String(i.callerPublicKey)
274274 if (!(_isValidOperator(callerPbk)))
275275 then throw("Not allowed")
276276 else {
277277 let storageScriptHash = toBase58String(value(scriptHash(addressFromStringValue(storageAddress))))
278278 let hashCheck = if ((storageScriptHash != scriptHash))
279279 then throw("Stored and passed as argument scriptHashes not match")
280280 else true
281281 if ((hashCheck == hashCheck))
282282 then {
283283 let scriptId = ((("script_" + scriptType) + "_") + scriptHash)
284284 [StringEntry((scriptId + "__scriptType"), scriptType), StringEntry((scriptId + "__storageAddress"), storageAddress), StringEntry((scriptId + "__scriptHash"), storageScriptHash), StringEntry((scriptId + "__desc"), desc), StringEntry((scriptId + "__initiator"), initiatorAdr)]
285285 }
286286 else throw("Strict value is not equal to itself.")
287287 }
288288 }
289289
290290
291291
292292 @Callable(i)
293293 func removeScript (scriptId) = {
294294 let callerPbk = toBase58String(i.callerPublicKey)
295295 if (!(_isValidOperator(callerPbk)))
296296 then throw("Not allowed")
297297 else {
298298 let initiatorAdr = getStringValue((scriptId + "__initiator"))
299299 if ((initiatorAdr != toString(addressFromPublicKey(i.callerPublicKey))))
300300 then throw("Only creator can remove")
301301 else [DeleteEntry((scriptId + "__scriptType")), DeleteEntry((scriptId + "__storageAddress")), DeleteEntry((scriptId + "__scriptHash")), DeleteEntry((scriptId + "__desc")), DeleteEntry((scriptId + "__initiator")), DeleteEntry((scriptId + "__confirmations")), DeleteEntry((scriptId + "__approved"))]
302302 }
303303 }
304304
305305
306306
307307 @Callable(i)
308308 func addConfirmationScript (scriptId) = {
309309 let callerPbk = toBase58String(i.callerPublicKey)
310310 let limit = _getLimit()
311311 if (!(_isAdmin(callerPbk)))
312312 then throw("Only admins can confirm")
313313 else {
314314 let _scriptHash = valueOrErrorMessage(getString((scriptId + "__scriptHash")), "Ivalid scriptId")
315315 if ((_scriptHash == _scriptHash))
316316 then {
317317 let scriptType = getStringValue((scriptId + "__scriptType"))
318318 let confirmationsStr = valueOrElse(getString((scriptId + "__confirmations")), "")
319319 let confirmations = split(confirmationsStr, ",")
320320 if ((indexOf(confirmations, callerPbk) != unit))
321321 then throw("You already confirmed this script")
322322 else {
323323 let newList = if ((confirmationsStr != ""))
324324 then (confirmations :+ callerPbk)
325325 else [callerPbk]
326326 let newListStr = makeString(newList, ",")
327327 let approved = (size(newList) >= limit)
328328 [StringEntry((scriptId + "__confirmations"), newListStr), BooleanEntry((((scriptType + "_") + _scriptHash) + "__approved"), approved)]
329329 }
330330 }
331331 else throw("Strict value is not equal to itself.")
332332 }
333333 }
334334
335335
336336
337337 @Callable(i)
338338 func addTask (name,dapp,txid,executeTs,desc,initiatorAdr,txdata) = {
339339 let callerPbk = toBase58String(i.callerPublicKey)
340340 if (!(_isValidOperator(callerPbk)))
341341 then throw("Not allowed")
342342 else {
343343 let _nameCheck = if ((size(name) == 0))
344344 then throw("Name can't be empty")
345345 else true
346346 if ((_nameCheck == _nameCheck))
347347 then {
348348 let _dappCheck = if (!(_validateAddress(dapp)))
349349 then throw("Incorrect dapp")
350350 else true
351351 if ((_dappCheck == _dappCheck))
352352 then {
353353 let _txidCheck = if ((size(txid) == 0))
354354 then throw("txid can't be empty")
355355 else true
356356 if ((_txidCheck == _txidCheck))
357357 then {
358358 let taskId = ((("tx_" + dapp) + "_") + txid)
359359 [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)]
360360 }
361361 else throw("Strict value is not equal to itself.")
362362 }
363363 else throw("Strict value is not equal to itself.")
364364 }
365365 else throw("Strict value is not equal to itself.")
366366 }
367367 }
368368
369369
370370
371371 @Callable(i)
372372 func removeTask (taskId) = {
373373 let callerPbk = toBase58String(i.callerPublicKey)
374374 if (!(_isValidOperator(callerPbk)))
375375 then throw("Not allowed")
376376 else {
377377 let initiatorAdr = getStringValue((taskId + "__initiator"))
378378 if ((initiatorAdr != toString(addressFromPublicKey(i.callerPublicKey))))
379379 then throw("Only creator can remove")
380380 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"))]
381381 }
382382 }
383383
384384
385385
386386 @Callable(i)
387387 func addConfirmation (taskId) = {
388388 let callerPbk = toBase58String(i.callerPublicKey)
389389 let limit = _getLimit()
390390 if (!(_isAdmin(callerPbk)))
391391 then throw("Only admins can confirm")
392392 else {
393393 let txId = valueOrErrorMessage(getString((taskId + "__txId")), "Ivalid task")
394394 if ((txId == txId))
395395 then {
396396 let dapp = getStringValue((taskId + "__dapp"))
397397 let confirmationsStr = valueOrElse(getString((taskId + "__confirmations")), "")
398398 let confirmations = split(confirmationsStr, ",")
399399 if ((indexOf(confirmations, callerPbk) != unit))
400400 then throw("You already confirmed this task")
401401 else {
402402 let newList = if ((confirmationsStr != ""))
403403 then (confirmations :+ callerPbk)
404404 else [callerPbk]
405405 let newListStr = makeString(newList, ",")
406406 let approved = (size(newList) >= limit)
407407 [StringEntry((taskId + "__confirmations"), newListStr), BooleanEntry((((dapp + "_") + txId) + "__approved"), approved)]
408408 }
409409 }
410410 else throw("Strict value is not equal to itself.")
411411 }
412412 }
413413
414414
415415
416416 @Callable(i)
417417 func setLimit (limit) = {
418418 let callerPbk = toBase58String(i.callerPublicKey)
419419 if (!(_isAdmin(callerPbk)))
420420 then throw("Only whitelisted can set limit")
421421 else {
422422 let zeroLimit = if ((limit > 0))
423423 then true
424424 else throw("Limit should be > 0")
425425 if ((zeroLimit == zeroLimit))
426426 then {
427427 let admins = getStringValue(k_ADMINS)
428428 if ((limit > size(admins)))
429429 then throw(((("Limit quorum should be <= size of list of admins, limit: " + toString(limit)) + ", current size: ") + toString(size(admins))))
430430 else [IntegerEntry(k_LIMIT, limit)]
431431 }
432432 else throw("Strict value is not equal to itself.")
433433 }
434434 }
435435
436436
437437
438438 @Callable(i)
439439 func test () = {
440440 let x = match blockInfoByHeight(height) {
441441 case block: BlockInfo =>
442442 throw(toString(block.timestamp))
443443 case _ =>
444444 throw("Can't find block")
445445 }
446- nil
446+ if ((x == x))
447+ then nil
448+ else throw("Strict value is not equal to itself.")
447449 }
448450
449451
450452
451453 @Callable(i)
452454 func clear_test () = {
453455 let indices = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
454456 func removeChunks (accum,index) = (accum :+ DeleteEntry((("testtask" + "__txdata_") + toString(index))))
455457
456458 let entries = {
457459 let $l = indices
458460 let $s = size($l)
459461 let $acc0 = [DeleteEntry(("testtask" + "__txdata_chunks"))]
460462 func $f0_1 ($a,$i) = if (($i >= $s))
461463 then $a
462464 else removeChunks($a, $l[$i])
463465
464466 func $f0_2 ($a,$i) = if (($i >= $s))
465467 then $a
466468 else throw("List size exceeds 10")
467469
468470 $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)
469471 }
470472 entries
471473 }
472474
473475

github/deemru/w8io
37.24 ms