tx · EkecdvUDH7fh4Ch433jQT1NyYdfyTVhNcTSXTSuzLSGp

3M7uzD8rT54fKQcP4s417if1VKU8yromEP2:  -0.05500000 Waves

2025.10.10 17:26 [430594] smart account 3M7uzD8rT54fKQcP4s417if1VKU8yromEP2 > SELF 0.00000000 Waves

{ "type": 13, "id": "EkecdvUDH7fh4Ch433jQT1NyYdfyTVhNcTSXTSuzLSGp", "fee": 5500000, "feeAssetId": null, "timestamp": 1760106379613, "version": 2, "chainId": 82, "sender": "3M7uzD8rT54fKQcP4s417if1VKU8yromEP2", "senderPublicKey": "2eFPamS5zez1159HEFEJaxs2XPq3AupPbNApNGffRjqf", "proofs": [ "5grrMWuWrUPUPM4aRL1rmRzSc2T7J9p3VUULNkXU6V5VisyKri6WtjU3GVCXkWmTDApkbHNoApZ6h37m55sKA7gR" ], "script": "base64:BgIzCAISBAoCGAESAwoBCBIDCgEIEgkKBwgICAEICAgSAwoBCBIDCgEIEgMKAQESAwoBCBIACwAHVkVSU0lPTgIFMS4wLjAABUxJTUlUAAIACGtfQURNSU5TAgtBRE1JTlNfUEJLUwAKa19NQU5BR0VSUwINTUFOQUdFUlNfUEJLUwAHa19MSU1JVAIMVk9URVNfUVVPUlVNAQxfdmFsaWRhdGVQYmsBA3BiawQHYWRkcmVzcwkApwgBCQDZBAEFA3BiawQKYWRkcmVzc1N0cgkApQgBBQdhZGRyZXNzBgEJX2dldExpbWl0AAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFB2tfTElNSVQCGFF1b3J1bSBsaW1pdCBub3QgZGVmaW5lZAEIX2lzQWRtaW4BA3BiawQJYWRtaW5zU3RyCQELdmFsdWVPckVsc2UCCQCiCAEFCGtfQURNSU5TAgAEBmFkbWlucwkAtQkCBQlhZG1pbnNTdHICASwJAQIhPQIJAM8IAgUGYWRtaW5zBQNwYmsFBHVuaXQBCl9pc01hbmFnZXIBA3BiawQLbWFuYWdlcnNTdHIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUKa19NQU5BR0VSUwIABAhtYW5hZ2VycwkAtQkCBQttYW5hZ2Vyc1N0cgIBLAkBAiE9AgkAzwgCBQhtYW5hZ2VycwUDcGJrBQR1bml0ARBfaXNWYWxpZE9wZXJhdG9yAQNwYmsEC21hbmFnZXJzU3RyCQELdmFsdWVPckVsc2UCCQCiCAEFCmtfTUFOQUdFUlMCAAQIbWFuYWdlcnMJALUJAgULbWFuYWdlcnNTdHICASwEB2lzQWRtaW4JAQhfaXNBZG1pbgEFA3BiawQJaXNNYW5hZ2VyCQEKX2lzTWFuYWdlcgEFA3BiawMFB2lzQWRtaW4GBQlpc01hbmFnZXIBCnNhdmVUeERhdGECBnRhc2tJZARkYXRhBAdpbmRpY2VzCQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgUDbmlsBAhkYXRhU2l6ZQkAsQIBBQRkYXRhBAppc05vdEVtcHR5AwkBAiE9AgUIZGF0YVNpemUAAAYJAAIBAh1zYXZlVHhEYXRhOiBFbXB0eSBkYXRhIHBhc3NlZAMJAAACBQppc05vdEVtcHR5BQppc05vdEVtcHR5BAljaHVua1NpemUAsOoBBAtjaHVua3NDb3VudAMJAAACCQBqAgUIZGF0YVNpemUFCWNodW5rU2l6ZQAACQBpAgUIZGF0YVNpemUFCWNodW5rU2l6ZQkAZAIJAGkCBQhkYXRhU2l6ZQUJY2h1bmtTaXplAAEKAQptYWtlQ2h1bmtzAgVhY2N1bQVpbmRleAQFY2h1bmsJAK8CAggFBWFjY3VtAl8xBQljaHVua1NpemUDCQAAAgkAsQIBBQVjaHVuawAABQVhY2N1bQQIbmV4dERhdGEJALACAggFBWFjY3VtAl8xBQljaHVua1NpemUJAJQKAgUIbmV4dERhdGEJAM0IAggFBWFjY3VtAl8yCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUGdGFza0lkAglfX3R4ZGF0YV8JAKQDAQUFaW5kZXgFBWNodW5rBAdlbnRyaWVzCgACJGwFB2luZGljZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFBGRhdGEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCD19fdHhkYXRhX2NodW5rcwkApAMBBQtjaHVua3NDb3VudAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQptYWtlQ2h1bmtzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCAUHZW50cmllcwJfMgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBaQEEaW5pdAILYWRtaW5zX3Bia3MFbGltaXQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg5TZWxmIGNhbGwgb25seQQLc2l6ZV9hZG1pbnMDCQECIT0CCQCQAwEFC2FkbWluc19wYmtzAAAGCQACAQInQXQgbGVhc3Qgb25lIGFkbWluIHBiayBzaG91bGQgYmUgcGFzc2VkAwkAAAIFC3NpemVfYWRtaW5zBQtzaXplX2FkbWlucwQMY2hlY2tfYWRtaW5zAwkBASEBCQEJaXNEZWZpbmVkAQkAoggBBQhrX0FETUlOUwYJAAIBAg5BbHJlYWR5IGluaXRlZAMJAAACBQxjaGVja19hZG1pbnMFDGNoZWNrX2FkbWlucwQJemVyb0xpbWl0AwkAZgIFBWxpbWl0AAAGCQACAQITTGltaXQgc2hvdWxkIGJlID4gMAMJAAACBQl6ZXJvTGltaXQFCXplcm9MaW1pdAQIbGltaXRfb2sDCQBnAgUFbGltaXQJAJADAQULYWRtaW5zX3Bia3MGCQACAQkArAICCQCsAgIJAKwCAgI5TGltaXQgcXVvcnVtIHNob3VsZCBiZSA8PSBzaXplIG9mIGxpc3Qgb2YgYWRtaW5zLCBsaW1pdDogCQCkAwEFBWxpbWl0AhAsIGN1cnJlbnQgc2l6ZTogCQCkAwEJAJADAQULYWRtaW5zX3Bia3MDCQAAAgUIbGltaXRfb2sFCGxpbWl0X29rCgEIdmFsaWRhdGUCBWFjY3VtBG5leHQJAQxfdmFsaWRhdGVQYmsBBQRuZXh0BAh2YWxpZFJlcwoAAiRsBQthZG1pbnNfcGJrcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIdmFsaWRhdGUCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoDCQAAAgUIdmFsaWRSZXMFCHZhbGlkUmVzBAlhZG1pbnNTdHIJALkJAgULYWRtaW5zX3Bia3MCASwJAMwIAgkBC1N0cmluZ0VudHJ5AgUIa19BRE1JTlMFCWFkbWluc1N0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgUHa19MSU1JVAUFbGltaXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhhZGRBZG1pbgEDcGJrBAljYWxsZXJQYmsJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5BAdpc0FkbWluAwkBCF9pc0FkbWluAQUJY2FsbGVyUGJrBgkAAgECGU9ubHkgYWRtaW5zIGNhbiBhZGQgYWRtaW4DCQAAAgUHaXNBZG1pbgUHaXNBZG1pbgQHaXNWYWxpZAMJAQxfdmFsaWRhdGVQYmsBBQNwYmsGCQACAQIRSW52YWxpZCBhZG1pbiBwYmsDCQAAAgUHaXNWYWxpZAUHaXNWYWxpZAQMbmV3QWRtaW5zU3RyCQCsAgIJAKwCAgkBEUBleHRyTmF0aXZlKDEwNTgpAQUIa19BRE1JTlMCASwFA3BiawkAzAgCCQELU3RyaW5nRW50cnkCBQhrX0FETUlOUwUMbmV3QWRtaW5zU3RyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELcmVtb3ZlQWRtaW4BA3BiawQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQQHaXNBZG1pbgMJAQhfaXNBZG1pbgEFCWNhbGxlclBiawYJAAIBAhlPbmx5IGFkbWlucyBjYW4gYWRkIGFkbWluAwkAAAIFB2lzQWRtaW4FB2lzQWRtaW4EB2lzVmFsaWQDCQEMX3ZhbGlkYXRlUGJrAQUDcGJrBgkAAgECEUludmFsaWQgYWRtaW4gcGJrAwkAAAIFB2lzVmFsaWQFB2lzVmFsaWQEDG9sZEFkbWluc1N0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQUIa19BRE1JTlMECW9sZEFkbWlucwkAtQkCBQxvbGRBZG1pbnNTdHICASwEBWluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUJb2xkQWRtaW5zBQNwYmsCGFRoaXMgcGJrIGlzIG5vdCBhbiBhZG1pbgQJbmV3QWRtaW5zCQDRCAIFCW9sZEFkbWlucwUFaW5kZXgEDG5ld0FkbWluc1N0cgkAuQkCBQluZXdBZG1pbnMCASwJAMwIAgkBC1N0cmluZ0VudHJ5AgUIa19BRE1JTlMFDG5ld0FkbWluc1N0cgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB2FkZFRhc2sHBG5hbWUEZGFwcAR0eGlkCWV4ZWN1dGVUcwRkZXNjDGluaXRpYXRvckFkcgZ0eGRhdGEECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDCQEBIQEJARBfaXNWYWxpZE9wZXJhdG9yAQUJY2FsbGVyUGJrCQACAQILTm90IGFsbG93ZWQEBnRhc2tJZAkArAICCQCsAgIFBGRhcHACAV8FBHR4aWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCBl9fbmFtZQUEbmFtZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBnRhc2tJZAIGX19kYXBwBQRkYXBwCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGdGFza0lkAgZfX3R4SWQFBHR4aWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCBl9fZGVzYwUEZGVzYwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBnRhc2tJZAIIX190eGRhdGEFBnR4ZGF0YQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBnRhc2tJZAILX19pbml0aWF0b3IFDGluaXRpYXRvckFkcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQZ0YXNrSWQCBF9fdHMFCWV4ZWN1dGVUcwUDbmlsAWkBCnJlbW92ZVRhc2sBBnRhc2tJZAQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQMJAQEhAQkBEF9pc1ZhbGlkT3BlcmF0b3IBBQljYWxsZXJQYmsJAAIBAgtOb3QgYWxsb3dlZAQMaW5pdGlhdG9yQWRyCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIFBnRhc2tJZAILX19pbml0aWF0b3IDCQECIT0CBQxpbml0aWF0b3JBZHIJAKUIAQkApwgBCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAAIBAhdPbmx5IGNyZWF0b3IgY2FuIHJlbW92ZQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAIGX19uYW1lCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAgZfX2RhcHAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCBl9fdHhJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAIGX19kZXNjCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAghfX3R4ZGF0YQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAILX19pbml0aWF0b3IJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCBF9fdHMJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCD19fY29uZmlybWF0aW9ucwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAIKX19hcHByb3ZlZAUDbmlsAWkBD2FkZENvbmZpcm1hdGlvbgEGdGFza0lkBAljYWxsZXJQYmsJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5BAVsaW1pdAkBCV9nZXRMaW1pdAADCQEBIQEJAQhfaXNBZG1pbgEFCWNhbGxlclBiawkAAgECF09ubHkgYWRtaW5zIGNhbiBjb25maXJtBAR0eElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkArAICBQZ0YXNrSWQCBl9fdHhJZAILSXZhbGlkIHRhc2sDCQAAAgUEdHhJZAUEdHhJZAQEZGFwcAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQZ0YXNrSWQCBl9fZGFwcAQQY29uZmlybWF0aW9uc1N0cgkBC3ZhbHVlT3JFbHNlAgkAoggBCQCsAgIFBnRhc2tJZAIPX19jb25maXJtYXRpb25zAgAEDWNvbmZpcm1hdGlvbnMJALUJAgUQY29uZmlybWF0aW9uc1N0cgIBLAMJAQIhPQIJAM8IAgUNY29uZmlybWF0aW9ucwUJY2FsbGVyUGJrBQR1bml0CQACAQIRQWxyZWFkeSBjb25maXJtZWQEB25ld0xpc3QDCQECIT0CBRBjb25maXJtYXRpb25zU3RyAgAJAM0IAgUNY29uZmlybWF0aW9ucwUJY2FsbGVyUGJrCQDMCAIFCWNhbGxlclBiawUDbmlsBApuZXdMaXN0U3RyCQC5CQIFB25ld0xpc3QCASwECGFwcHJvdmVkCQBnAgkAkAMBBQduZXdMaXN0BQVsaW1pdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBnRhc2tJZAIPX19jb25maXJtYXRpb25zBQpuZXdMaXN0U3RyCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIJAKwCAgkArAICBQRkYXBwAgFfBQR0eElkAgpfX2FwcHJvdmVkBQhhcHByb3ZlZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHNldExpbWl0AQVsaW1pdAQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQMJAQEhAQkBCF9pc0FkbWluAQUJY2FsbGVyUGJrCQACAQIeT25seSB3aGl0ZWxpc3RlZCBjYW4gc2V0IGxpbWl0BAl6ZXJvTGltaXQDCQBmAgUFbGltaXQAAAYJAAIBAhNMaW1pdCBzaG91bGQgYmUgPiAwAwkAAAIFCXplcm9MaW1pdAUJemVyb0xpbWl0BAZhZG1pbnMJARFAZXh0ck5hdGl2ZSgxMDU4KQEFCGtfQURNSU5TAwkAZgIFBWxpbWl0CQCxAgEFBmFkbWlucwkAAgEJAKwCAgkArAICCQCsAgICOUxpbWl0IHF1b3J1bSBzaG91bGQgYmUgPD0gc2l6ZSBvZiBsaXN0IG9mIGFkbWlucywgbGltaXQ6IAkApAMBBQVsaW1pdAIQLCBjdXJyZW50IHNpemU6IAkApAMBCQCxAgEFBmFkbWlucwkAzAgCCQEMSW50ZWdlckVudHJ5AgUHa19MSU1JVAUFbGltaXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQR0ZXN0AQNwYmsEB2VudHJpZXMJAQpzYXZlVHhEYXRhAgIIdGVzdHRhc2sFA3BiawUHZW50cmllcwFpAQpjbGVhcl90ZXN0AAQHaW5kaWNlcwkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoFA25pbAoBDHJlbW92ZUNodW5rcwIFYWNjdW0FaW5kZXgJAM0IAgUFYWNjdW0JAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgh0ZXN0dGFzawIJX190eGRhdGFfCQCkAwEFBWluZGV4BAdlbnRyaWVzCgACJGwFB2luZGljZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgIIdGVzdHRhc2sCD19fdHhkYXRhX2NodW5rcwUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxyZW1vdmVDaHVua3MCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoFB2VudHJpZXMAeKzIEA==", "height": 430594, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FQC55gLNXqKkYy8dRNqmAfAQnu8GAD1zqPe5M4PyYE3F Next: 9n3qA6oxwPa9MWgccxT6WApc38sUJkfNtsxZaV9fh1mW Diff:
OldNewDifferences
5454 else throw("saveTxData: Empty data passed")
5555 if ((isNotEmpty == isNotEmpty))
5656 then {
57- let chunkSize = 3
57+ let chunkSize = 30000
5858 let chunksCount = if (((dataSize % chunkSize) == 0))
5959 then (dataSize / chunkSize)
6060 else ((dataSize / chunkSize) + 1)
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 func _validatePbk (pbk) = {
1515 let address = addressFromPublicKey(fromBase58String(pbk))
1616 let addressStr = toString(address)
1717 true
1818 }
1919
2020
2121 func _getLimit () = valueOrErrorMessage(getInteger(k_LIMIT), "Quorum limit not defined")
2222
2323
2424 func _isAdmin (pbk) = {
2525 let adminsStr = valueOrElse(getString(k_ADMINS), "")
2626 let admins = split(adminsStr, ",")
2727 (indexOf(admins, pbk) != unit)
2828 }
2929
3030
3131 func _isManager (pbk) = {
3232 let managersStr = valueOrElse(getString(k_MANAGERS), "")
3333 let managers = split(managersStr, ",")
3434 (indexOf(managers, pbk) != unit)
3535 }
3636
3737
3838 func _isValidOperator (pbk) = {
3939 let managersStr = valueOrElse(getString(k_MANAGERS), "")
4040 let managers = split(managersStr, ",")
4141 let isAdmin = _isAdmin(pbk)
4242 let isManager = _isManager(pbk)
4343 if (isAdmin)
4444 then true
4545 else isManager
4646 }
4747
4848
4949 func saveTxData (taskId,data) = {
5050 let indices = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
5151 let dataSize = size(data)
5252 let isNotEmpty = if ((dataSize != 0))
5353 then true
5454 else throw("saveTxData: Empty data passed")
5555 if ((isNotEmpty == isNotEmpty))
5656 then {
57- let chunkSize = 3
57+ let chunkSize = 30000
5858 let chunksCount = if (((dataSize % chunkSize) == 0))
5959 then (dataSize / chunkSize)
6060 else ((dataSize / chunkSize) + 1)
6161 func makeChunks (accum,index) = {
6262 let chunk = take(accum._1, chunkSize)
6363 if ((size(chunk) == 0))
6464 then accum
6565 else {
6666 let nextData = drop(accum._1, chunkSize)
6767 $Tuple2(nextData, (accum._2 :+ StringEntry(((taskId + "__txdata_") + toString(index)), chunk)))
6868 }
6969 }
7070
7171 let entries = {
7272 let $l = indices
7373 let $s = size($l)
7474 let $acc0 = $Tuple2(data, [StringEntry((taskId + "__txdata_chunks"), toString(chunksCount))])
7575 func $f0_1 ($a,$i) = if (($i >= $s))
7676 then $a
7777 else makeChunks($a, $l[$i])
7878
7979 func $f0_2 ($a,$i) = if (($i >= $s))
8080 then $a
8181 else throw("List size exceeds 10")
8282
8383 $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)
8484 }
8585 entries._2
8686 }
8787 else throw("Strict value is not equal to itself.")
8888 }
8989
9090
9191 @Callable(i)
9292 func init (admins_pbks,limit) = if ((i.caller != this))
9393 then throw("Self call only")
9494 else {
9595 let size_admins = if ((size(admins_pbks) != 0))
9696 then true
9797 else throw("At least one admin pbk should be passed")
9898 if ((size_admins == size_admins))
9999 then {
100100 let check_admins = if (!(isDefined(getString(k_ADMINS))))
101101 then true
102102 else throw("Already inited")
103103 if ((check_admins == check_admins))
104104 then {
105105 let zeroLimit = if ((limit > 0))
106106 then true
107107 else throw("Limit should be > 0")
108108 if ((zeroLimit == zeroLimit))
109109 then {
110110 let limit_ok = if ((limit >= size(admins_pbks)))
111111 then true
112112 else throw(((("Limit quorum should be <= size of list of admins, limit: " + toString(limit)) + ", current size: ") + toString(size(admins_pbks))))
113113 if ((limit_ok == limit_ok))
114114 then {
115115 func validate (accum,next) = _validatePbk(next)
116116
117117 let validRes = {
118118 let $l = admins_pbks
119119 let $s = size($l)
120120 let $acc0 = ""
121121 func $f0_1 ($a,$i) = if (($i >= $s))
122122 then $a
123123 else validate($a, $l[$i])
124124
125125 func $f0_2 ($a,$i) = if (($i >= $s))
126126 then $a
127127 else throw("List size exceeds 10")
128128
129129 $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)
130130 }
131131 if ((validRes == validRes))
132132 then {
133133 let adminsStr = makeString(admins_pbks, ",")
134134 [StringEntry(k_ADMINS, adminsStr), IntegerEntry(k_LIMIT, limit)]
135135 }
136136 else throw("Strict value is not equal to itself.")
137137 }
138138 else throw("Strict value is not equal to itself.")
139139 }
140140 else throw("Strict value is not equal to itself.")
141141 }
142142 else throw("Strict value is not equal to itself.")
143143 }
144144 else throw("Strict value is not equal to itself.")
145145 }
146146
147147
148148
149149 @Callable(i)
150150 func addAdmin (pbk) = {
151151 let callerPbk = toBase58String(i.callerPublicKey)
152152 let isAdmin = if (_isAdmin(callerPbk))
153153 then true
154154 else throw("Only admins can add admin")
155155 if ((isAdmin == isAdmin))
156156 then {
157157 let isValid = if (_validatePbk(pbk))
158158 then true
159159 else throw("Invalid admin pbk")
160160 if ((isValid == isValid))
161161 then {
162162 let newAdminsStr = ((getStringValue(k_ADMINS) + ",") + pbk)
163163 [StringEntry(k_ADMINS, newAdminsStr)]
164164 }
165165 else throw("Strict value is not equal to itself.")
166166 }
167167 else throw("Strict value is not equal to itself.")
168168 }
169169
170170
171171
172172 @Callable(i)
173173 func removeAdmin (pbk) = {
174174 let callerPbk = toBase58String(i.callerPublicKey)
175175 let isAdmin = if (_isAdmin(callerPbk))
176176 then true
177177 else throw("Only admins can add admin")
178178 if ((isAdmin == isAdmin))
179179 then {
180180 let isValid = if (_validatePbk(pbk))
181181 then true
182182 else throw("Invalid admin pbk")
183183 if ((isValid == isValid))
184184 then {
185185 let oldAdminsStr = getStringValue(k_ADMINS)
186186 let oldAdmins = split(oldAdminsStr, ",")
187187 let index = valueOrErrorMessage(indexOf(oldAdmins, pbk), "This pbk is not an admin")
188188 let newAdmins = removeByIndex(oldAdmins, index)
189189 let newAdminsStr = makeString(newAdmins, ",")
190190 [StringEntry(k_ADMINS, newAdminsStr)]
191191 }
192192 else throw("Strict value is not equal to itself.")
193193 }
194194 else throw("Strict value is not equal to itself.")
195195 }
196196
197197
198198
199199 @Callable(i)
200200 func addTask (name,dapp,txid,executeTs,desc,initiatorAdr,txdata) = {
201201 let callerPbk = toBase58String(i.callerPublicKey)
202202 if (!(_isValidOperator(callerPbk)))
203203 then throw("Not allowed")
204204 else {
205205 let taskId = ((dapp + "_") + txid)
206206 [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)]
207207 }
208208 }
209209
210210
211211
212212 @Callable(i)
213213 func removeTask (taskId) = {
214214 let callerPbk = toBase58String(i.callerPublicKey)
215215 if (!(_isValidOperator(callerPbk)))
216216 then throw("Not allowed")
217217 else {
218218 let initiatorAdr = getStringValue((taskId + "__initiator"))
219219 if ((initiatorAdr != toString(addressFromPublicKey(i.callerPublicKey))))
220220 then throw("Only creator can remove")
221221 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"))]
222222 }
223223 }
224224
225225
226226
227227 @Callable(i)
228228 func addConfirmation (taskId) = {
229229 let callerPbk = toBase58String(i.callerPublicKey)
230230 let limit = _getLimit()
231231 if (!(_isAdmin(callerPbk)))
232232 then throw("Only admins can confirm")
233233 else {
234234 let txId = valueOrErrorMessage(getString((taskId + "__txId")), "Ivalid task")
235235 if ((txId == txId))
236236 then {
237237 let dapp = getStringValue((taskId + "__dapp"))
238238 let confirmationsStr = valueOrElse(getString((taskId + "__confirmations")), "")
239239 let confirmations = split(confirmationsStr, ",")
240240 if ((indexOf(confirmations, callerPbk) != unit))
241241 then throw("Already confirmed")
242242 else {
243243 let newList = if ((confirmationsStr != ""))
244244 then (confirmations :+ callerPbk)
245245 else [callerPbk]
246246 let newListStr = makeString(newList, ",")
247247 let approved = (size(newList) >= limit)
248248 [StringEntry((taskId + "__confirmations"), newListStr), BooleanEntry((((dapp + "_") + txId) + "__approved"), approved)]
249249 }
250250 }
251251 else throw("Strict value is not equal to itself.")
252252 }
253253 }
254254
255255
256256
257257 @Callable(i)
258258 func setLimit (limit) = {
259259 let callerPbk = toBase58String(i.callerPublicKey)
260260 if (!(_isAdmin(callerPbk)))
261261 then throw("Only whitelisted can set limit")
262262 else {
263263 let zeroLimit = if ((limit > 0))
264264 then true
265265 else throw("Limit should be > 0")
266266 if ((zeroLimit == zeroLimit))
267267 then {
268268 let admins = getStringValue(k_ADMINS)
269269 if ((limit > size(admins)))
270270 then throw(((("Limit quorum should be <= size of list of admins, limit: " + toString(limit)) + ", current size: ") + toString(size(admins))))
271271 else [IntegerEntry(k_LIMIT, limit)]
272272 }
273273 else throw("Strict value is not equal to itself.")
274274 }
275275 }
276276
277277
278278
279279 @Callable(i)
280280 func test (pbk) = {
281281 let entries = saveTxData("testtask", pbk)
282282 entries
283283 }
284284
285285
286286
287287 @Callable(i)
288288 func clear_test () = {
289289 let indices = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
290290 func removeChunks (accum,index) = (accum :+ DeleteEntry((("testtask" + "__txdata_") + toString(index))))
291291
292292 let entries = {
293293 let $l = indices
294294 let $s = size($l)
295295 let $acc0 = [DeleteEntry(("testtask" + "__txdata_chunks"))]
296296 func $f0_1 ($a,$i) = if (($i >= $s))
297297 then $a
298298 else removeChunks($a, $l[$i])
299299
300300 func $f0_2 ($a,$i) = if (($i >= $s))
301301 then $a
302302 else throw("List size exceeds 10")
303303
304304 $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)
305305 }
306306 entries
307307 }
308308
309309

github/deemru/w8io
51.85 ms