tx · C4VSBLXTRKiK1gQK4H5g2TdZv43s5uDnuPZ19vGjiqyE

3M46d3ne3Nm8TzFPDM5BviW82rfD8n4x7z4:  -0.01400000 Waves

2025.10.15 00:00 [466714] smart account 3M46d3ne3Nm8TzFPDM5BviW82rfD8n4x7z4 > SELF 0.00000000 Waves

{ "type": 13, "id": "C4VSBLXTRKiK1gQK4H5g2TdZv43s5uDnuPZ19vGjiqyE", "fee": 1400000, "feeAssetId": null, "timestamp": 1760475655008, "version": 2, "chainId": 82, "sender": "3M46d3ne3Nm8TzFPDM5BviW82rfD8n4x7z4", "senderPublicKey": "DCbjS1NJUSE4K18pvsWcjiXs86UqJc4QCNKo7UNUQv4D", "proofs": [ "5ssWJBu5q6en6HijCe4ayJX1rshV6tGw8rfzgF6fsrvVPnGb1B7Jqusz7NByfCeVqZs6n5Na2yETJMwHqS1bsYJb" ], "script": "base64:BgJQCAISBAoCGAESAwoBCBIDCgEIEgMKAQgSAwoBCBIHCgUICAgICBIDCgEIEgMKAQgSCQoHCAgIAQgICBIDCgEIEgMKAQgSAwoBARIDCgEIEgAMAAdWRVJTSU9OAgUxLjAuMAAFTElNSVQAAgAIa19BRE1JTlMCC0FETUlOU19QQktTAAprX01BTkFHRVJTAg1NQU5BR0VSU19QQktTAAdrX0xJTUlUAgxWT1RFU19RVU9SVU0ADmtfU0NSSVBUX1RZUEVTAgxTQ1JJUFRfVFlQRVMBDF92YWxpZGF0ZVBiawEDcGJrBAdhZGRyZXNzCQCnCAEJANkEAQUDcGJrBAphZGRyZXNzU3RyCQClCAEFB2FkZHJlc3MGAQlfZ2V0TGltaXQACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUHa19MSU1JVAIYUXVvcnVtIGxpbWl0IG5vdCBkZWZpbmVkAQhfaXNBZG1pbgEDcGJrBAlhZG1pbnNTdHIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUIa19BRE1JTlMCAAQGYWRtaW5zCQC1CQIFCWFkbWluc1N0cgIBLAkBAiE9AgkAzwgCBQZhZG1pbnMFA3BiawUEdW5pdAEKX2lzTWFuYWdlcgEDcGJrBAttYW5hZ2Vyc1N0cgkBC3ZhbHVlT3JFbHNlAgkAoggBBQprX01BTkFHRVJTAgAECG1hbmFnZXJzCQC1CQIFC21hbmFnZXJzU3RyAgEsCQECIT0CCQDPCAIFCG1hbmFnZXJzBQNwYmsFBHVuaXQBEF9pc1ZhbGlkT3BlcmF0b3IBA3BiawQLbWFuYWdlcnNTdHIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUKa19NQU5BR0VSUwIABAhtYW5hZ2VycwkAtQkCBQttYW5hZ2Vyc1N0cgIBLAQHaXNBZG1pbgkBCF9pc0FkbWluAQUDcGJrBAlpc01hbmFnZXIJAQpfaXNNYW5hZ2VyAQUDcGJrAwUHaXNBZG1pbgYFCWlzTWFuYWdlcgEKc2F2ZVR4RGF0YQIGdGFza0lkBGRhdGEEB2luZGljZXMJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKBQNuaWwECGRhdGFTaXplCQCxAgEFBGRhdGEECmlzTm90RW1wdHkDCQECIT0CBQhkYXRhU2l6ZQAABgkAAgECHXNhdmVUeERhdGE6IEVtcHR5IGRhdGEgcGFzc2VkAwkAAAIFCmlzTm90RW1wdHkFCmlzTm90RW1wdHkECWNodW5rU2l6ZQCw6gEEC2NodW5rc0NvdW50AwkAAAIJAGoCBQhkYXRhU2l6ZQUJY2h1bmtTaXplAAAJAGkCBQhkYXRhU2l6ZQUJY2h1bmtTaXplCQBkAgkAaQIFCGRhdGFTaXplBQljaHVua1NpemUAAQoBCm1ha2VDaHVua3MCBWFjY3VtBWluZGV4BAVjaHVuawkArwICCAUFYWNjdW0CXzEFCWNodW5rU2l6ZQMJAAACCQCxAgEFBWNodW5rAAAFBWFjY3VtBAhuZXh0RGF0YQkAsAICCAUFYWNjdW0CXzEFCWNodW5rU2l6ZQkAlAoCBQhuZXh0RGF0YQkAzQgCCAUFYWNjdW0CXzIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQZ0YXNrSWQCCV9fdHhkYXRhXwkApAMBBQVpbmRleAUFY2h1bmsEB2VudHJpZXMKAAIkbAUHaW5kaWNlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUEZGF0YQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBnRhc2tJZAIPX190eGRhdGFfY2h1bmtzCQCkAwEFC2NodW5rc0NvdW50BQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCm1ha2VDaHVua3MCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoIBQdlbnRyaWVzAl8yCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuDgFpAQRpbml0AgthZG1pbnNfcGJrcwVsaW1pdAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECDlNlbGYgY2FsbCBvbmx5BAtzaXplX2FkbWlucwMJAQIhPQIJAJADAQULYWRtaW5zX3Bia3MAAAYJAAIBAidBdCBsZWFzdCBvbmUgYWRtaW4gcGJrIHNob3VsZCBiZSBwYXNzZWQDCQAAAgULc2l6ZV9hZG1pbnMFC3NpemVfYWRtaW5zBAxjaGVja19hZG1pbnMDCQEBIQEJAQlpc0RlZmluZWQBCQCiCAEFCGtfQURNSU5TBgkAAgECDkFscmVhZHkgaW5pdGVkAwkAAAIFDGNoZWNrX2FkbWlucwUMY2hlY2tfYWRtaW5zBAl6ZXJvTGltaXQDCQBmAgUFbGltaXQAAAYJAAIBAhNMaW1pdCBzaG91bGQgYmUgPiAwAwkAAAIFCXplcm9MaW1pdAUJemVyb0xpbWl0BAhsaW1pdF9vawMJAGcCBQVsaW1pdAkAkAMBBQthZG1pbnNfcGJrcwYJAAIBCQCsAgIJAKwCAgkArAICAjlMaW1pdCBxdW9ydW0gc2hvdWxkIGJlIDw9IHNpemUgb2YgbGlzdCBvZiBhZG1pbnMsIGxpbWl0OiAJAKQDAQUFbGltaXQCECwgY3VycmVudCBzaXplOiAJAKQDAQkAkAMBBQthZG1pbnNfcGJrcwMJAAACBQhsaW1pdF9vawUIbGltaXRfb2sKAQh2YWxpZGF0ZQIFYWNjdW0EbmV4dAkBDF92YWxpZGF0ZVBiawEFBG5leHQECHZhbGlkUmVzCgACJGwFC2FkbWluc19wYmtzCgACJHMJAJADAQUCJGwKAAUkYWNjMAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQh2YWxpZGF0ZQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgMJAAACBQh2YWxpZFJlcwUIdmFsaWRSZXMECWFkbWluc1N0cgkAuQkCBQthZG1pbnNfcGJrcwIBLAkAzAgCCQELU3RyaW5nRW50cnkCBQhrX0FETUlOUwUJYWRtaW5zU3RyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQdrX0xJTUlUBQVsaW1pdAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGFkZEFkbWluAQNwYmsECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkEB2lzQWRtaW4DCQEIX2lzQWRtaW4BBQljYWxsZXJQYmsGCQACAQIZT25seSBhZG1pbnMgY2FuIGFkZCBhZG1pbgMJAAACBQdpc0FkbWluBQdpc0FkbWluBAdpc1ZhbGlkAwkBDF92YWxpZGF0ZVBiawEFA3BiawYJAAIBAhFJbnZhbGlkIGFkbWluIHBiawMJAAACBQdpc1ZhbGlkBQdpc1ZhbGlkBAxuZXdBZG1pbnNTdHIJAKwCAgkArAICCQERQGV4dHJOYXRpdmUoMTA1OCkBBQhrX0FETUlOUwIBLAUDcGJrCQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtfQURNSU5TBQxuZXdBZG1pbnNTdHIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtyZW1vdmVBZG1pbgEDcGJrBAljYWxsZXJQYmsJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5BAdpc0FkbWluAwkBCF9pc0FkbWluAQUJY2FsbGVyUGJrBgkAAgECGU9ubHkgYWRtaW5zIGNhbiBhZGQgYWRtaW4DCQAAAgUHaXNBZG1pbgUHaXNBZG1pbgQHaXNWYWxpZAMJAQxfdmFsaWRhdGVQYmsBBQNwYmsGCQACAQIRSW52YWxpZCBhZG1pbiBwYmsDCQAAAgUHaXNWYWxpZAUHaXNWYWxpZAQMb2xkQWRtaW5zU3RyCQERQGV4dHJOYXRpdmUoMTA1OCkBBQhrX0FETUlOUwQJb2xkQWRtaW5zCQC1CQIFDG9sZEFkbWluc1N0cgIBLAQKY2hlY2tDb3VudAMJAGcCAAEJAJADAQUJb2xkQWRtaW5zCQACAQIvQ2Fubm90IHJlbW92ZSwgYXQgbGVhc3Qgb25lIGFkbWluIHNob3VsZCByZW1haW4GAwkAAAIFCmNoZWNrQ291bnQFCmNoZWNrQ291bnQEBWluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUJb2xkQWRtaW5zBQNwYmsCGFRoaXMgcGJrIGlzIG5vdCBhbiBhZG1pbgQJbmV3QWRtaW5zCQDRCAIFCW9sZEFkbWlucwUFaW5kZXgEDG5ld0FkbWluc1N0cgkAuQkCBQluZXdBZG1pbnMCASwJAMwIAgkBC1N0cmluZ0VudHJ5AgUIa19BRE1JTlMFDG5ld0FkbWluc1N0cgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWFkZFNjcmlwdFR5cGUBCnNjcmlwdFR5cGUECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDCQEBIQEJAQhfaXNBZG1pbgEFCWNhbGxlclBiawkAAgECC05vdCBhbGxvd2VkBApjaGVja0VtcHR5AwkAAAIJALECAQUKc2NyaXB0VHlwZQAACQACAQIcU2NyaXB0IHR5cGUgY2FuIG5vdCBiZSBlbXB0eQYDCQAAAgUKY2hlY2tFbXB0eQUKY2hlY2tFbXB0eQQOc2NyaXB0VHlwZXNTdHIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUOa19TQ1JJUFRfVFlQRVMCAAQLc2NyaXB0VHlwZXMJALwJAgUOc2NyaXB0VHlwZXNTdHICASwEC2NoZWNrRXhpc3RzAwkBAiE9AgkAzwgCBQtzY3JpcHRUeXBlcwUKc2NyaXB0VHlwZQUEdW5pdAkAAgEJAKwCAgkArAICAg1TY3JpcHQgdHlwZSA8BQpzY3JpcHRUeXBlAg8+IGFscmVhZHkgYWRkZWQGAwkAAAIFC2NoZWNrRXhpc3RzBQtjaGVja0V4aXN0cwQObmV3U2NyaXB0VHlwZXMDCQECIT0CBQ5zY3JpcHRUeXBlc1N0cgIACQDNCAIFC3NjcmlwdFR5cGVzBQpzY3JpcHRUeXBlCQDMCAIFCnNjcmlwdFR5cGUFA25pbAQRbmV3U2NyaXB0VHlwZXNTdHIJALkJAgUObmV3U2NyaXB0VHlwZXMCASwJAMwIAgkBC1N0cmluZ0VudHJ5AgUOa19TQ1JJUFRfVFlQRVMFEW5ld1NjcmlwdFR5cGVzU3RyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQcmVtb3ZlU2NyaXB0VHlwZQEKc2NyaXB0VHlwZQQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQMJAQEhAQkBCF9pc0FkbWluAQUJY2FsbGVyUGJrCQACAQILTm90IGFsbG93ZWQEDnNjcmlwdFR5cGVzU3RyCQELdmFsdWVPckVsc2UCCQCiCAEFDmtfU0NSSVBUX1RZUEVTAgAEC3NjcmlwdFR5cGVzCQC8CQIFDnNjcmlwdFR5cGVzU3RyAgEsBAVpbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFC3NjcmlwdFR5cGVzBQpzY3JpcHRUeXBlCQCsAgIJAKwCAgINU2NyaXB0IHR5cGUgPAUKc2NyaXB0VHlwZQIQPiBpcyBub3QgcHJlc2VudAQObmV3U2NyaXB0VHlwZXMJANEIAgULc2NyaXB0VHlwZXMFBWluZGV4BBFuZXdTY3JpcHRUeXBlc1N0cgkAuQkCBQ5uZXdTY3JpcHRUeXBlcwIBLAkAzAgCCQELU3RyaW5nRW50cnkCBQ5rX1NDUklQVF9UWVBFUwURbmV3U2NyaXB0VHlwZXNTdHIFA25pbAFpAQlhZGRTY3JpcHQFCnNjcmlwdFR5cGUOc3RvcmFnZUFkZHJlc3MKc2NyaXB0SGFzaARkZXNjDGluaXRpYXRvckFkcgQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQMJAQEhAQkBEF9pc1ZhbGlkT3BlcmF0b3IBBQljYWxsZXJQYmsJAAIBAgtOb3QgYWxsb3dlZAQRc3RvcmFnZVNjcmlwdEhhc2gJANgEAQkBBXZhbHVlAQkA8QcBCQERQGV4dHJOYXRpdmUoMTA2MikBBQ5zdG9yYWdlQWRkcmVzcwQJaGFzaENoZWNrAwkBAiE9AgURc3RvcmFnZVNjcmlwdEhhc2gFCnNjcmlwdEhhc2gJAAIBAjRTdG9yZWQgYW5kIHBhc3NlZCBhcyBhcmd1bWVudCBzY3JpcHRIYXNoZXMgbm90IG1hdGNoBgMJAAACBQloYXNoQ2hlY2sFCWhhc2hDaGVjawQIc2NyaXB0SWQJAKwCAgkArAICCQCsAgICB3NjcmlwdF8FCnNjcmlwdFR5cGUCAV8FCnNjcmlwdEhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQhzY3JpcHRJZAIMX19zY3JpcHRUeXBlBQpzY3JpcHRUeXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUIc2NyaXB0SWQCEF9fc3RvcmFnZUFkZHJlc3MFDnN0b3JhZ2VBZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUIc2NyaXB0SWQCDF9fc2NyaXB0SGFzaAURc3RvcmFnZVNjcmlwdEhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQhzY3JpcHRJZAIGX19kZXNjBQRkZXNjCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUIc2NyaXB0SWQCC19faW5pdGlhdG9yBQxpbml0aWF0b3JBZHIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxyZW1vdmVTY3JpcHQBCHNjcmlwdElkBAljYWxsZXJQYmsJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5AwkBASEBCQEQX2lzVmFsaWRPcGVyYXRvcgEFCWNhbGxlclBiawkAAgECC05vdCBhbGxvd2VkBAxpbml0aWF0b3JBZHIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgUIc2NyaXB0SWQCC19faW5pdGlhdG9yAwkBAiE9AgUMaW5pdGlhdG9yQWRyCQClCAEJAKcIAQgFAWkPY2FsbGVyUHVibGljS2V5CQACAQIXT25seSBjcmVhdG9yIGNhbiByZW1vdmUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQhzY3JpcHRJZAIMX19zY3JpcHRUeXBlCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUIc2NyaXB0SWQCEF9fc3RvcmFnZUFkZHJlc3MJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQhzY3JpcHRJZAIMX19zY3JpcHRIYXNoCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUIc2NyaXB0SWQCBl9fZGVzYwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFCHNjcmlwdElkAgtfX2luaXRpYXRvcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFCHNjcmlwdElkAg9fX2NvbmZpcm1hdGlvbnMJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQhzY3JpcHRJZAIKX19hcHByb3ZlZAUDbmlsAWkBFWFkZENvbmZpcm1hdGlvblNjcmlwdAEIc2NyaXB0SWQECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkEBWxpbWl0CQEJX2dldExpbWl0AAMJAQEhAQkBCF9pc0FkbWluAQUJY2FsbGVyUGJrCQACAQIXT25seSBhZG1pbnMgY2FuIGNvbmZpcm0EC19zY3JpcHRIYXNoCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkArAICBQhzY3JpcHRJZAIMX19zY3JpcHRIYXNoAg9JdmFsaWQgc2NyaXB0SWQDCQAAAgULX3NjcmlwdEhhc2gFC19zY3JpcHRIYXNoBApzY3JpcHRUeXBlCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIFCHNjcmlwdElkAgxfX3NjcmlwdFR5cGUEEGNvbmZpcm1hdGlvbnNTdHIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkArAICBQhzY3JpcHRJZAIPX19jb25maXJtYXRpb25zAgAEDWNvbmZpcm1hdGlvbnMJALUJAgUQY29uZmlybWF0aW9uc1N0cgIBLAMJAQIhPQIJAM8IAgUNY29uZmlybWF0aW9ucwUJY2FsbGVyUGJrBQR1bml0CQACAQIhWW91IGFscmVhZHkgY29uZmlybWVkIHRoaXMgc2NyaXB0BAduZXdMaXN0AwkBAiE9AgUQY29uZmlybWF0aW9uc1N0cgIACQDNCAIFDWNvbmZpcm1hdGlvbnMFCWNhbGxlclBiawkAzAgCBQljYWxsZXJQYmsFA25pbAQKbmV3TGlzdFN0cgkAuQkCBQduZXdMaXN0AgEsBAhhcHByb3ZlZAkAZwIJAJADAQUHbmV3TGlzdAUFbGltaXQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQhzY3JpcHRJZAIPX19jb25maXJtYXRpb25zBQpuZXdMaXN0U3RyCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIJAKwCAgkArAICBQpzY3JpcHRUeXBlAgFfBQtfc2NyaXB0SGFzaAIKX19hcHByb3ZlZAUIYXBwcm92ZWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdhZGRUYXNrBwRuYW1lBGRhcHAEdHhpZAlleGVjdXRlVHMEZGVzYwxpbml0aWF0b3JBZHIGdHhkYXRhBAljYWxsZXJQYmsJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5AwkBASEBCQEQX2lzVmFsaWRPcGVyYXRvcgEFCWNhbGxlclBiawkAAgECC05vdCBhbGxvd2VkBAZ0YXNrSWQJAKwCAgkArAICCQCsAgICA3R4XwUEZGFwcAIBXwUEdHhpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBnRhc2tJZAIGX19uYW1lBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGdGFza0lkAgZfX2RhcHAFBGRhcHAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCBl9fdHhJZAUEdHhpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBnRhc2tJZAIGX19kZXNjBQRkZXNjCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGdGFza0lkAghfX3R4ZGF0YQUGdHhkYXRhCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGdGFza0lkAgtfX2luaXRpYXRvcgUMaW5pdGlhdG9yQWRyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBnRhc2tJZAIEX190cwUJZXhlY3V0ZVRzBQNuaWwBaQEKcmVtb3ZlVGFzawEGdGFza0lkBAljYWxsZXJQYmsJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5AwkBASEBCQEQX2lzVmFsaWRPcGVyYXRvcgEFCWNhbGxlclBiawkAAgECC05vdCBhbGxvd2VkBAxpbml0aWF0b3JBZHIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgUGdGFza0lkAgtfX2luaXRpYXRvcgMJAQIhPQIFDGluaXRpYXRvckFkcgkApQgBCQCnCAEIBQFpD2NhbGxlclB1YmxpY0tleQkAAgECF09ubHkgY3JlYXRvciBjYW4gcmVtb3ZlCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAgZfX25hbWUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCBl9fZGFwcAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAIGX190eElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAgZfX2Rlc2MJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCCF9fdHhkYXRhCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAgtfX2luaXRpYXRvcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAIEX190cwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAIPX19jb25maXJtYXRpb25zCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAgpfX2FwcHJvdmVkBQNuaWwBaQEPYWRkQ29uZmlybWF0aW9uAQZ0YXNrSWQECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkEBWxpbWl0CQEJX2dldExpbWl0AAMJAQEhAQkBCF9pc0FkbWluAQUJY2FsbGVyUGJrCQACAQIXT25seSBhZG1pbnMgY2FuIGNvbmZpcm0EBHR4SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIFBnRhc2tJZAIGX190eElkAgtJdmFsaWQgdGFzawMJAAACBQR0eElkBQR0eElkBARkYXBwCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIFBnRhc2tJZAIGX19kYXBwBBBjb25maXJtYXRpb25zU3RyCQELdmFsdWVPckVsc2UCCQCiCAEJAKwCAgUGdGFza0lkAg9fX2NvbmZpcm1hdGlvbnMCAAQNY29uZmlybWF0aW9ucwkAtQkCBRBjb25maXJtYXRpb25zU3RyAgEsAwkBAiE9AgkAzwgCBQ1jb25maXJtYXRpb25zBQljYWxsZXJQYmsFBHVuaXQJAAIBAh9Zb3UgYWxyZWFkeSBjb25maXJtZWQgdGhpcyB0YXNrBAduZXdMaXN0AwkBAiE9AgUQY29uZmlybWF0aW9uc1N0cgIACQDNCAIFDWNvbmZpcm1hdGlvbnMFCWNhbGxlclBiawkAzAgCBQljYWxsZXJQYmsFA25pbAQKbmV3TGlzdFN0cgkAuQkCBQduZXdMaXN0AgEsBAhhcHByb3ZlZAkAZwIJAJADAQUHbmV3TGlzdAUFbGltaXQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCD19fY29uZmlybWF0aW9ucwUKbmV3TGlzdFN0cgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgIJAKwCAgUEZGFwcAIBXwUEdHhJZAIKX19hcHByb3ZlZAUIYXBwcm92ZWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhzZXRMaW1pdAEFbGltaXQECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDCQEBIQEJAQhfaXNBZG1pbgEFCWNhbGxlclBiawkAAgECHk9ubHkgd2hpdGVsaXN0ZWQgY2FuIHNldCBsaW1pdAQJemVyb0xpbWl0AwkAZgIFBWxpbWl0AAAGCQACAQITTGltaXQgc2hvdWxkIGJlID4gMAMJAAACBQl6ZXJvTGltaXQFCXplcm9MaW1pdAQGYWRtaW5zCQERQGV4dHJOYXRpdmUoMTA1OCkBBQhrX0FETUlOUwMJAGYCBQVsaW1pdAkAsQIBBQZhZG1pbnMJAAIBCQCsAgIJAKwCAgkArAICAjlMaW1pdCBxdW9ydW0gc2hvdWxkIGJlIDw9IHNpemUgb2YgbGlzdCBvZiBhZG1pbnMsIGxpbWl0OiAJAKQDAQUFbGltaXQCECwgY3VycmVudCBzaXplOiAJAKQDAQkAsQIBBQZhZG1pbnMJAMwIAgkBDEludGVnZXJFbnRyeQIFB2tfTElNSVQFBWxpbWl0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEEdGVzdAEDcGJrBAdlbnRyaWVzCQEKc2F2ZVR4RGF0YQICCHRlc3R0YXNrBQNwYmsFB2VudHJpZXMBaQEKY2xlYXJfdGVzdAAEB2luZGljZXMJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKBQNuaWwKAQxyZW1vdmVDaHVua3MCBWFjY3VtBWluZGV4CQDNCAIFBWFjY3VtCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIIdGVzdHRhc2sCCV9fdHhkYXRhXwkApAMBBQVpbmRleAQHZW50cmllcwoAAiRsBQdpbmRpY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgICCHRlc3R0YXNrAg9fX3R4ZGF0YV9jaHVua3MFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMcmVtb3ZlQ2h1bmtzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBQdlbnRyaWVzAIvJL6o=", "height": 466714, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let VERSION = "1.0.0"
5+
6+let LIMIT = 2
7+
8+let k_ADMINS = "ADMINS_PBKS"
9+
10+let k_MANAGERS = "MANAGERS_PBKS"
11+
12+let k_LIMIT = "VOTES_QUORUM"
13+
14+let k_SCRIPT_TYPES = "SCRIPT_TYPES"
15+
16+func _validatePbk (pbk) = {
17+ let address = addressFromPublicKey(fromBase58String(pbk))
18+ let addressStr = toString(address)
19+ true
20+ }
21+
22+
23+func _getLimit () = valueOrErrorMessage(getInteger(k_LIMIT), "Quorum limit not defined")
24+
25+
26+func _isAdmin (pbk) = {
27+ let adminsStr = valueOrElse(getString(k_ADMINS), "")
28+ let admins = split(adminsStr, ",")
29+ (indexOf(admins, pbk) != unit)
30+ }
31+
32+
33+func _isManager (pbk) = {
34+ let managersStr = valueOrElse(getString(k_MANAGERS), "")
35+ let managers = split(managersStr, ",")
36+ (indexOf(managers, pbk) != unit)
37+ }
38+
39+
40+func _isValidOperator (pbk) = {
41+ let managersStr = valueOrElse(getString(k_MANAGERS), "")
42+ let managers = split(managersStr, ",")
43+ let isAdmin = _isAdmin(pbk)
44+ let isManager = _isManager(pbk)
45+ if (isAdmin)
46+ then true
47+ else isManager
48+ }
49+
50+
51+func saveTxData (taskId,data) = {
52+ let indices = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
53+ let dataSize = size(data)
54+ let isNotEmpty = if ((dataSize != 0))
55+ then true
56+ else throw("saveTxData: Empty data passed")
57+ if ((isNotEmpty == isNotEmpty))
58+ then {
59+ let chunkSize = 30000
60+ let chunksCount = if (((dataSize % chunkSize) == 0))
61+ then (dataSize / chunkSize)
62+ else ((dataSize / chunkSize) + 1)
63+ func makeChunks (accum,index) = {
64+ let chunk = take(accum._1, chunkSize)
65+ if ((size(chunk) == 0))
66+ then accum
67+ else {
68+ let nextData = drop(accum._1, chunkSize)
69+ $Tuple2(nextData, (accum._2 :+ StringEntry(((taskId + "__txdata_") + toString(index)), chunk)))
70+ }
71+ }
72+
73+ let entries = {
74+ let $l = indices
75+ let $s = size($l)
76+ let $acc0 = $Tuple2(data, [StringEntry((taskId + "__txdata_chunks"), toString(chunksCount))])
77+ func $f0_1 ($a,$i) = if (($i >= $s))
78+ then $a
79+ else makeChunks($a, $l[$i])
80+
81+ func $f0_2 ($a,$i) = if (($i >= $s))
82+ then $a
83+ else throw("List size exceeds 10")
84+
85+ $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)
86+ }
87+ entries._2
88+ }
89+ else throw("Strict value is not equal to itself.")
90+ }
91+
92+
93+@Callable(i)
94+func init (admins_pbks,limit) = if ((i.caller != this))
95+ then throw("Self call only")
96+ else {
97+ let size_admins = if ((size(admins_pbks) != 0))
98+ then true
99+ else throw("At least one admin pbk should be passed")
100+ if ((size_admins == size_admins))
101+ then {
102+ let check_admins = if (!(isDefined(getString(k_ADMINS))))
103+ then true
104+ else throw("Already inited")
105+ if ((check_admins == check_admins))
106+ then {
107+ let zeroLimit = if ((limit > 0))
108+ then true
109+ else throw("Limit should be > 0")
110+ if ((zeroLimit == zeroLimit))
111+ then {
112+ let limit_ok = if ((limit >= size(admins_pbks)))
113+ then true
114+ else throw(((("Limit quorum should be <= size of list of admins, limit: " + toString(limit)) + ", current size: ") + toString(size(admins_pbks))))
115+ if ((limit_ok == limit_ok))
116+ then {
117+ func validate (accum,next) = _validatePbk(next)
118+
119+ let validRes = {
120+ let $l = admins_pbks
121+ let $s = size($l)
122+ let $acc0 = ""
123+ func $f0_1 ($a,$i) = if (($i >= $s))
124+ then $a
125+ else validate($a, $l[$i])
126+
127+ func $f0_2 ($a,$i) = if (($i >= $s))
128+ then $a
129+ else throw("List size exceeds 10")
130+
131+ $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)
132+ }
133+ if ((validRes == validRes))
134+ then {
135+ let adminsStr = makeString(admins_pbks, ",")
136+[StringEntry(k_ADMINS, adminsStr), IntegerEntry(k_LIMIT, limit)]
137+ }
138+ else throw("Strict value is not equal to itself.")
139+ }
140+ else throw("Strict value is not equal to itself.")
141+ }
142+ else throw("Strict value is not equal to itself.")
143+ }
144+ else throw("Strict value is not equal to itself.")
145+ }
146+ else throw("Strict value is not equal to itself.")
147+ }
148+
149+
150+
151+@Callable(i)
152+func addAdmin (pbk) = {
153+ let callerPbk = toBase58String(i.callerPublicKey)
154+ let isAdmin = if (_isAdmin(callerPbk))
155+ then true
156+ else throw("Only admins can add admin")
157+ if ((isAdmin == isAdmin))
158+ then {
159+ let isValid = if (_validatePbk(pbk))
160+ then true
161+ else throw("Invalid admin pbk")
162+ if ((isValid == isValid))
163+ then {
164+ let newAdminsStr = ((getStringValue(k_ADMINS) + ",") + pbk)
165+[StringEntry(k_ADMINS, newAdminsStr)]
166+ }
167+ else throw("Strict value is not equal to itself.")
168+ }
169+ else throw("Strict value is not equal to itself.")
170+ }
171+
172+
173+
174+@Callable(i)
175+func removeAdmin (pbk) = {
176+ let callerPbk = toBase58String(i.callerPublicKey)
177+ let isAdmin = if (_isAdmin(callerPbk))
178+ then true
179+ else throw("Only admins can add admin")
180+ if ((isAdmin == isAdmin))
181+ then {
182+ let isValid = if (_validatePbk(pbk))
183+ then true
184+ else throw("Invalid admin pbk")
185+ if ((isValid == isValid))
186+ then {
187+ let oldAdminsStr = getStringValue(k_ADMINS)
188+ let oldAdmins = split(oldAdminsStr, ",")
189+ let checkCount = if ((1 >= size(oldAdmins)))
190+ then throw("Cannot remove, at least one admin should remain")
191+ else true
192+ if ((checkCount == checkCount))
193+ then {
194+ let index = valueOrErrorMessage(indexOf(oldAdmins, pbk), "This pbk is not an admin")
195+ let newAdmins = removeByIndex(oldAdmins, index)
196+ let newAdminsStr = makeString(newAdmins, ",")
197+[StringEntry(k_ADMINS, newAdminsStr)]
198+ }
199+ else throw("Strict value is not equal to itself.")
200+ }
201+ else throw("Strict value is not equal to itself.")
202+ }
203+ else throw("Strict value is not equal to itself.")
204+ }
205+
206+
207+
208+@Callable(i)
209+func addScriptType (scriptType) = {
210+ let callerPbk = toBase58String(i.callerPublicKey)
211+ if (!(_isAdmin(callerPbk)))
212+ then throw("Not allowed")
213+ else {
214+ let checkEmpty = if ((size(scriptType) == 0))
215+ then throw("Script type can not be empty")
216+ else true
217+ if ((checkEmpty == checkEmpty))
218+ then {
219+ let scriptTypesStr = valueOrElse(getString(k_SCRIPT_TYPES), "")
220+ let scriptTypes = split_4C(scriptTypesStr, ",")
221+ let checkExists = if ((indexOf(scriptTypes, scriptType) != unit))
222+ then throw((("Script type <" + scriptType) + "> already added"))
223+ else true
224+ if ((checkExists == checkExists))
225+ then {
226+ let newScriptTypes = if ((scriptTypesStr != ""))
227+ then (scriptTypes :+ scriptType)
228+ else [scriptType]
229+ let newScriptTypesStr = makeString(newScriptTypes, ",")
230+[StringEntry(k_SCRIPT_TYPES, newScriptTypesStr)]
231+ }
232+ else throw("Strict value is not equal to itself.")
233+ }
234+ else throw("Strict value is not equal to itself.")
235+ }
236+ }
237+
238+
239+
240+@Callable(i)
241+func removeScriptType (scriptType) = {
242+ let callerPbk = toBase58String(i.callerPublicKey)
243+ if (!(_isAdmin(callerPbk)))
244+ then throw("Not allowed")
245+ else {
246+ let scriptTypesStr = valueOrElse(getString(k_SCRIPT_TYPES), "")
247+ let scriptTypes = split_4C(scriptTypesStr, ",")
248+ let index = valueOrErrorMessage(indexOf(scriptTypes, scriptType), (("Script type <" + scriptType) + "> is not present"))
249+ let newScriptTypes = removeByIndex(scriptTypes, index)
250+ let newScriptTypesStr = makeString(newScriptTypes, ",")
251+[StringEntry(k_SCRIPT_TYPES, newScriptTypesStr)]
252+ }
253+ }
254+
255+
256+
257+@Callable(i)
258+func addScript (scriptType,storageAddress,scriptHash,desc,initiatorAdr) = {
259+ let callerPbk = toBase58String(i.callerPublicKey)
260+ if (!(_isValidOperator(callerPbk)))
261+ then throw("Not allowed")
262+ else {
263+ let storageScriptHash = toBase58String(value(scriptHash(addressFromStringValue(storageAddress))))
264+ let hashCheck = if ((storageScriptHash != scriptHash))
265+ then throw("Stored and passed as argument scriptHashes not match")
266+ else true
267+ if ((hashCheck == hashCheck))
268+ then {
269+ let scriptId = ((("script_" + scriptType) + "_") + scriptHash)
270+[StringEntry((scriptId + "__scriptType"), scriptType), StringEntry((scriptId + "__storageAddress"), storageAddress), StringEntry((scriptId + "__scriptHash"), storageScriptHash), StringEntry((scriptId + "__desc"), desc), StringEntry((scriptId + "__initiator"), initiatorAdr)]
271+ }
272+ else throw("Strict value is not equal to itself.")
273+ }
274+ }
275+
276+
277+
278+@Callable(i)
279+func removeScript (scriptId) = {
280+ let callerPbk = toBase58String(i.callerPublicKey)
281+ if (!(_isValidOperator(callerPbk)))
282+ then throw("Not allowed")
283+ else {
284+ let initiatorAdr = getStringValue((scriptId + "__initiator"))
285+ if ((initiatorAdr != toString(addressFromPublicKey(i.callerPublicKey))))
286+ then throw("Only creator can remove")
287+ else [DeleteEntry((scriptId + "__scriptType")), DeleteEntry((scriptId + "__storageAddress")), DeleteEntry((scriptId + "__scriptHash")), DeleteEntry((scriptId + "__desc")), DeleteEntry((scriptId + "__initiator")), DeleteEntry((scriptId + "__confirmations")), DeleteEntry((scriptId + "__approved"))]
288+ }
289+ }
290+
291+
292+
293+@Callable(i)
294+func addConfirmationScript (scriptId) = {
295+ let callerPbk = toBase58String(i.callerPublicKey)
296+ let limit = _getLimit()
297+ if (!(_isAdmin(callerPbk)))
298+ then throw("Only admins can confirm")
299+ else {
300+ let _scriptHash = valueOrErrorMessage(getString((scriptId + "__scriptHash")), "Ivalid scriptId")
301+ if ((_scriptHash == _scriptHash))
302+ then {
303+ let scriptType = getStringValue((scriptId + "__scriptType"))
304+ let confirmationsStr = valueOrElse(getString((scriptId + "__confirmations")), "")
305+ let confirmations = split(confirmationsStr, ",")
306+ if ((indexOf(confirmations, callerPbk) != unit))
307+ then throw("You already confirmed this script")
308+ else {
309+ let newList = if ((confirmationsStr != ""))
310+ then (confirmations :+ callerPbk)
311+ else [callerPbk]
312+ let newListStr = makeString(newList, ",")
313+ let approved = (size(newList) >= limit)
314+[StringEntry((scriptId + "__confirmations"), newListStr), BooleanEntry((((scriptType + "_") + _scriptHash) + "__approved"), approved)]
315+ }
316+ }
317+ else throw("Strict value is not equal to itself.")
318+ }
319+ }
320+
321+
322+
323+@Callable(i)
324+func addTask (name,dapp,txid,executeTs,desc,initiatorAdr,txdata) = {
325+ let callerPbk = toBase58String(i.callerPublicKey)
326+ if (!(_isValidOperator(callerPbk)))
327+ then throw("Not allowed")
328+ else {
329+ let taskId = ((("tx_" + dapp) + "_") + txid)
330+[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)]
331+ }
332+ }
333+
334+
335+
336+@Callable(i)
337+func removeTask (taskId) = {
338+ let callerPbk = toBase58String(i.callerPublicKey)
339+ if (!(_isValidOperator(callerPbk)))
340+ then throw("Not allowed")
341+ else {
342+ let initiatorAdr = getStringValue((taskId + "__initiator"))
343+ if ((initiatorAdr != toString(addressFromPublicKey(i.callerPublicKey))))
344+ then throw("Only creator can remove")
345+ 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"))]
346+ }
347+ }
348+
349+
350+
351+@Callable(i)
352+func addConfirmation (taskId) = {
353+ let callerPbk = toBase58String(i.callerPublicKey)
354+ let limit = _getLimit()
355+ if (!(_isAdmin(callerPbk)))
356+ then throw("Only admins can confirm")
357+ else {
358+ let txId = valueOrErrorMessage(getString((taskId + "__txId")), "Ivalid task")
359+ if ((txId == txId))
360+ then {
361+ let dapp = getStringValue((taskId + "__dapp"))
362+ let confirmationsStr = valueOrElse(getString((taskId + "__confirmations")), "")
363+ let confirmations = split(confirmationsStr, ",")
364+ if ((indexOf(confirmations, callerPbk) != unit))
365+ then throw("You already confirmed this task")
366+ else {
367+ let newList = if ((confirmationsStr != ""))
368+ then (confirmations :+ callerPbk)
369+ else [callerPbk]
370+ let newListStr = makeString(newList, ",")
371+ let approved = (size(newList) >= limit)
372+[StringEntry((taskId + "__confirmations"), newListStr), BooleanEntry((((dapp + "_") + txId) + "__approved"), approved)]
373+ }
374+ }
375+ else throw("Strict value is not equal to itself.")
376+ }
377+ }
378+
379+
380+
381+@Callable(i)
382+func setLimit (limit) = {
383+ let callerPbk = toBase58String(i.callerPublicKey)
384+ if (!(_isAdmin(callerPbk)))
385+ then throw("Only whitelisted can set limit")
386+ else {
387+ let zeroLimit = if ((limit > 0))
388+ then true
389+ else throw("Limit should be > 0")
390+ if ((zeroLimit == zeroLimit))
391+ then {
392+ let admins = getStringValue(k_ADMINS)
393+ if ((limit > size(admins)))
394+ then throw(((("Limit quorum should be <= size of list of admins, limit: " + toString(limit)) + ", current size: ") + toString(size(admins))))
395+ else [IntegerEntry(k_LIMIT, limit)]
396+ }
397+ else throw("Strict value is not equal to itself.")
398+ }
399+ }
400+
401+
402+
403+@Callable(i)
404+func test (pbk) = {
405+ let entries = saveTxData("testtask", pbk)
406+ entries
407+ }
408+
409+
410+
411+@Callable(i)
412+func clear_test () = {
413+ let indices = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
414+ func removeChunks (accum,index) = (accum :+ DeleteEntry((("testtask" + "__txdata_") + toString(index))))
415+
416+ let entries = {
417+ let $l = indices
418+ let $s = size($l)
419+ let $acc0 = [DeleteEntry(("testtask" + "__txdata_chunks"))]
420+ func $f0_1 ($a,$i) = if (($i >= $s))
421+ then $a
422+ else removeChunks($a, $l[$i])
423+
424+ func $f0_2 ($a,$i) = if (($i >= $s))
425+ then $a
426+ else throw("List size exceeds 10")
427+
428+ $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)
429+ }
430+ entries
431+ }
432+
433+

github/deemru/w8io
28.50 ms