tx · FvRCpvxFVPkUS1qEde7n1wBYyenqEG6JutZTF7gPxi9n

3M7uzD8rT54fKQcP4s417if1VKU8yromEP2:  -0.05500000 Waves

2025.10.10 03:30 [425579] smart account 3M7uzD8rT54fKQcP4s417if1VKU8yromEP2 > SELF 0.00000000 Waves

{ "type": 13, "id": "FvRCpvxFVPkUS1qEde7n1wBYyenqEG6JutZTF7gPxi9n", "fee": 5500000, "feeAssetId": null, "timestamp": 1760056225212, "version": 2, "chainId": 82, "sender": "3M7uzD8rT54fKQcP4s417if1VKU8yromEP2", "senderPublicKey": "2eFPamS5zez1159HEFEJaxs2XPq3AupPbNApNGffRjqf", "proofs": [ "4GqETufWS5guJMhdyCcJWPuiEEyJsfBSosD2zdWXcs1CppzrupPznXfvSuGE6tnyQGfKAom83qX6sYpBoGkbTic5" ], "script": "base64:BgIxCAISBAoCGAESAwoBCBIDCgEIEgkKBwgICAEICAgSAwoBCBIDCgEIEgMKAQESAwoBCAsAB1ZFUlNJT04CBTEuMC4wAAVMSU1JVAACAAhrX0FETUlOUwILQURNSU5TX1BCS1MACmtfTUFOQUdFUlMCDU1BTkFHRVJTX1BCS1MAB2tfTElNSVQCDFZPVEVTX1FVT1JVTQEMX3ZhbGlkYXRlUGJrAQNwYmsEB2FkZHJlc3MJAKcIAQkA2QQBBQNwYmsECmFkZHJlc3NTdHIJAKUIAQUHYWRkcmVzcwYBCV9nZXRMaW1pdAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQdrX0xJTUlUAhhRdW9ydW0gbGltaXQgbm90IGRlZmluZWQBCF9pc0FkbWluAQNwYmsECWFkbWluc1N0cgkBC3ZhbHVlT3JFbHNlAgkAoggBBQhrX0FETUlOUwIABAZhZG1pbnMJALUJAgUJYWRtaW5zU3RyAgEsCQECIT0CCQDPCAIFBmFkbWlucwUDcGJrBQR1bml0AQpfaXNNYW5hZ2VyAQNwYmsEC21hbmFnZXJzU3RyCQELdmFsdWVPckVsc2UCCQCiCAEFCmtfTUFOQUdFUlMCAAQIbWFuYWdlcnMJALUJAgULbWFuYWdlcnNTdHICASwJAQIhPQIJAM8IAgUIbWFuYWdlcnMFA3BiawUEdW5pdAEQX2lzVmFsaWRPcGVyYXRvcgEDcGJrBAttYW5hZ2Vyc1N0cgkBC3ZhbHVlT3JFbHNlAgkAoggBBQprX01BTkFHRVJTAgAECG1hbmFnZXJzCQC1CQIFC21hbmFnZXJzU3RyAgEsBAdpc0FkbWluCQEIX2lzQWRtaW4BBQNwYmsECWlzTWFuYWdlcgkBCl9pc01hbmFnZXIBBQNwYmsDBQdpc0FkbWluBgUJaXNNYW5hZ2VyAQpzYXZlVHhEYXRhAQRkYXRhCQACAQkApAMBCQCxAgEFBGRhdGEIAWkBBGluaXQCC2FkbWluc19wYmtzBWxpbWl0AwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIOU2VsZiBjYWxsIG9ubHkEC3NpemVfYWRtaW5zAwkBAiE9AgkAkAMBBQthZG1pbnNfcGJrcwAABgkAAgECJ0F0IGxlYXN0IG9uZSBhZG1pbiBwYmsgc2hvdWxkIGJlIHBhc3NlZAMJAAACBQtzaXplX2FkbWlucwULc2l6ZV9hZG1pbnMEDGNoZWNrX2FkbWlucwMJAQEhAQkBCWlzRGVmaW5lZAEJAKIIAQUIa19BRE1JTlMGCQACAQIOQWxyZWFkeSBpbml0ZWQDCQAAAgUMY2hlY2tfYWRtaW5zBQxjaGVja19hZG1pbnMECXplcm9MaW1pdAMJAGYCBQVsaW1pdAAABgkAAgECE0xpbWl0IHNob3VsZCBiZSA+IDADCQAAAgUJemVyb0xpbWl0BQl6ZXJvTGltaXQECGxpbWl0X29rAwkAZwIFBWxpbWl0CQCQAwEFC2FkbWluc19wYmtzBgkAAgEJAKwCAgkArAICCQCsAgICOUxpbWl0IHF1b3J1bSBzaG91bGQgYmUgPD0gc2l6ZSBvZiBsaXN0IG9mIGFkbWlucywgbGltaXQ6IAkApAMBBQVsaW1pdAIQLCBjdXJyZW50IHNpemU6IAkApAMBCQCQAwEFC2FkbWluc19wYmtzAwkAAAIFCGxpbWl0X29rBQhsaW1pdF9vawoBCHZhbGlkYXRlAgVhY2N1bQRuZXh0CQEMX3ZhbGlkYXRlUGJrAQUEbmV4dAQIdmFsaWRSZXMKAAIkbAULYWRtaW5zX3Bia3MKAAIkcwkAkAMBBQIkbAoABSRhY2MwAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCHZhbGlkYXRlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAwkAAAIFCHZhbGlkUmVzBQh2YWxpZFJlcwQJYWRtaW5zU3RyCQC5CQIFC2FkbWluc19wYmtzAgEsCQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtfQURNSU5TBQlhZG1pbnNTdHIJAMwIAgkBDEludGVnZXJFbnRyeQIFB2tfTElNSVQFBWxpbWl0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIYWRkQWRtaW4BA3BiawQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQQHaXNBZG1pbgMJAQhfaXNBZG1pbgEFCWNhbGxlclBiawYJAAIBAhlPbmx5IGFkbWlucyBjYW4gYWRkIGFkbWluAwkAAAIFB2lzQWRtaW4FB2lzQWRtaW4EB2lzVmFsaWQDCQEMX3ZhbGlkYXRlUGJrAQUDcGJrBgkAAgECEUludmFsaWQgYWRtaW4gcGJrAwkAAAIFB2lzVmFsaWQFB2lzVmFsaWQEDG5ld0FkbWluc1N0cgkArAICCQCsAgIJARFAZXh0ck5hdGl2ZSgxMDU4KQEFCGtfQURNSU5TAgEsBQNwYmsJAMwIAgkBC1N0cmluZ0VudHJ5AgUIa19BRE1JTlMFDG5ld0FkbWluc1N0cgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3JlbW92ZUFkbWluAQNwYmsECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkEB2lzQWRtaW4DCQEIX2lzQWRtaW4BBQljYWxsZXJQYmsGCQACAQIZT25seSBhZG1pbnMgY2FuIGFkZCBhZG1pbgMJAAACBQdpc0FkbWluBQdpc0FkbWluBAdpc1ZhbGlkAwkBDF92YWxpZGF0ZVBiawEFA3BiawYJAAIBAhFJbnZhbGlkIGFkbWluIHBiawMJAAACBQdpc1ZhbGlkBQdpc1ZhbGlkBAxvbGRBZG1pbnNTdHIJARFAZXh0ck5hdGl2ZSgxMDU4KQEFCGtfQURNSU5TBAlvbGRBZG1pbnMJALUJAgUMb2xkQWRtaW5zU3RyAgEsBAVpbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCW9sZEFkbWlucwUDcGJrAhhUaGlzIHBiayBpcyBub3QgYW4gYWRtaW4ECW5ld0FkbWlucwkA0QgCBQlvbGRBZG1pbnMFBWluZGV4BAxuZXdBZG1pbnNTdHIJALkJAgUJbmV3QWRtaW5zAgEsCQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtfQURNSU5TBQxuZXdBZG1pbnNTdHIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdhZGRUYXNrBwRuYW1lBGRhcHAEdHhpZAlleGVjdXRlVHMEZGVzYwxpbml0aWF0b3JBZHIGdHhkYXRhBAljYWxsZXJQYmsJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5AwkBASEBCQEQX2lzVmFsaWRPcGVyYXRvcgEFCWNhbGxlclBiawkAAgECC05vdCBhbGxvd2VkBAZ0YXNrSWQJAKwCAgkArAICBQRkYXBwAgFfBQR0eGlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGdGFza0lkAgZfX25hbWUFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCBl9fZGFwcAUEZGFwcAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBnRhc2tJZAIGX190eElkBQR0eGlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUGdGFza0lkAgZfX2Rlc2MFBGRlc2MJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCCF9fdHhkYXRhBQZ0eGRhdGEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCC19faW5pdGlhdG9yBQxpbml0aWF0b3JBZHIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUGdGFza0lkAgRfX3RzBQlleGVjdXRlVHMFA25pbAFpAQpyZW1vdmVUYXNrAQZ0YXNrSWQECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDCQEBIQEJARBfaXNWYWxpZE9wZXJhdG9yAQUJY2FsbGVyUGJrCQACAQILTm90IGFsbG93ZWQEDGluaXRpYXRvckFkcgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICBQZ0YXNrSWQCC19faW5pdGlhdG9yAwkBAiE9AgUMaW5pdGlhdG9yQWRyCQClCAEJAKcIAQgFAWkPY2FsbGVyUHVibGljS2V5CQACAQIXT25seSBjcmVhdG9yIGNhbiByZW1vdmUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCBl9fbmFtZQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAIGX19kYXBwCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAgZfX3R4SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCBl9fZGVzYwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFBnRhc2tJZAIIX190eGRhdGEJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCC19faW5pdGlhdG9yCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAgRfX3RzCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUGdGFza0lkAg9fX2NvbmZpcm1hdGlvbnMJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQZ0YXNrSWQCCl9fYXBwcm92ZWQFA25pbAFpAQ9hZGRDb25maXJtYXRpb24BBnRhc2tJZAQJY2FsbGVyUGJrCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQQFbGltaXQJAQlfZ2V0TGltaXQAAwkBASEBCQEIX2lzQWRtaW4BBQljYWxsZXJQYmsJAAIBAhdPbmx5IGFkbWlucyBjYW4gY29uZmlybQQEdHhJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgUGdGFza0lkAgZfX3R4SWQCC0l2YWxpZCB0YXNrAwkAAAIFBHR4SWQFBHR4SWQEBGRhcHAJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgUGdGFza0lkAgZfX2RhcHAEEGNvbmZpcm1hdGlvbnNTdHIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkArAICBQZ0YXNrSWQCD19fY29uZmlybWF0aW9ucwIABA1jb25maXJtYXRpb25zCQC1CQIFEGNvbmZpcm1hdGlvbnNTdHICASwDCQECIT0CCQDPCAIFDWNvbmZpcm1hdGlvbnMFCWNhbGxlclBiawUEdW5pdAkAAgECEUFscmVhZHkgY29uZmlybWVkBAduZXdMaXN0AwkBAiE9AgUQY29uZmlybWF0aW9uc1N0cgIACQDNCAIFDWNvbmZpcm1hdGlvbnMFCWNhbGxlclBiawkAzAgCBQljYWxsZXJQYmsFA25pbAQKbmV3TGlzdFN0cgkAuQkCBQduZXdMaXN0AgEsBAhhcHByb3ZlZAkAZwIJAJADAQUHbmV3TGlzdAUFbGltaXQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZ0YXNrSWQCD19fY29uZmlybWF0aW9ucwUKbmV3TGlzdFN0cgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgIJAKwCAgUEZGFwcAIBXwUEdHhJZAIKX19hcHByb3ZlZAUIYXBwcm92ZWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhzZXRMaW1pdAEFbGltaXQECWNhbGxlclBiawkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkDCQEBIQEJAQhfaXNBZG1pbgEFCWNhbGxlclBiawkAAgECHk9ubHkgd2hpdGVsaXN0ZWQgY2FuIHNldCBsaW1pdAQJemVyb0xpbWl0AwkAZgIFBWxpbWl0AAAGCQACAQITTGltaXQgc2hvdWxkIGJlID4gMAMJAAACBQl6ZXJvTGltaXQFCXplcm9MaW1pdAQGYWRtaW5zCQERQGV4dHJOYXRpdmUoMTA1OCkBBQhrX0FETUlOUwMJAGYCBQVsaW1pdAkAsQIBBQZhZG1pbnMJAAIBCQCsAgIJAKwCAgkArAICAjlMaW1pdCBxdW9ydW0gc2hvdWxkIGJlIDw9IHNpemUgb2YgbGlzdCBvZiBhZG1pbnMsIGxpbWl0OiAJAKQDAQUFbGltaXQCECwgY3VycmVudCBzaXplOiAJAKQDAQkAsQIBBQZhZG1pbnMJAMwIAgkBDEludGVnZXJFbnRyeQIFB2tfTElNSVQFBWxpbWl0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEEdGVzdAEDcGJrCQEKc2F2ZVR4RGF0YQEFA3BiawAwBvdz", "height": 425579, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9r99Ene4wVXKwqx7LzhD33Vbr7Ein3qwuLVVS7SdkS2h Next: oKsM4MXjhp8TnN56LKsC6QxjeZqEqU6Z1VEc8dzkHt7 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 (data) = throw(toString(size(data)))
5050
5151
5252 @Callable(i)
5353 func init (admins_pbks,limit) = if ((i.caller != this))
5454 then throw("Self call only")
5555 else {
5656 let size_admins = if ((size(admins_pbks) != 0))
5757 then true
5858 else throw("At least one admin pbk should be passed")
5959 if ((size_admins == size_admins))
6060 then {
6161 let check_admins = if (!(isDefined(getString(k_ADMINS))))
6262 then true
6363 else throw("Already inited")
6464 if ((check_admins == check_admins))
6565 then {
6666 let zeroLimit = if ((limit > 0))
6767 then true
6868 else throw("Limit should be > 0")
6969 if ((zeroLimit == zeroLimit))
7070 then {
7171 let limit_ok = if ((limit >= size(admins_pbks)))
7272 then true
7373 else throw(((("Limit quorum should be <= size of list of admins, limit: " + toString(limit)) + ", current size: ") + toString(size(admins_pbks))))
7474 if ((limit_ok == limit_ok))
7575 then {
7676 func validate (accum,next) = _validatePbk(next)
7777
7878 let validRes = {
7979 let $l = admins_pbks
8080 let $s = size($l)
8181 let $acc0 = ""
8282 func $f0_1 ($a,$i) = if (($i >= $s))
8383 then $a
8484 else validate($a, $l[$i])
8585
8686 func $f0_2 ($a,$i) = if (($i >= $s))
8787 then $a
8888 else throw("List size exceeds 10")
8989
9090 $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)
9191 }
9292 if ((validRes == validRes))
9393 then {
9494 let adminsStr = makeString(admins_pbks, ",")
9595 [StringEntry(k_ADMINS, adminsStr), IntegerEntry(k_LIMIT, limit)]
9696 }
9797 else throw("Strict value is not equal to itself.")
9898 }
9999 else throw("Strict value is not equal to itself.")
100100 }
101101 else throw("Strict value is not equal to itself.")
102102 }
103103 else throw("Strict value is not equal to itself.")
104104 }
105105 else throw("Strict value is not equal to itself.")
106106 }
107107
108108
109109
110110 @Callable(i)
111111 func addAdmin (pbk) = {
112112 let callerPbk = toBase58String(i.callerPublicKey)
113113 let isAdmin = if (_isAdmin(callerPbk))
114114 then true
115115 else throw("Only admins can add admin")
116116 if ((isAdmin == isAdmin))
117117 then {
118118 let isValid = if (_validatePbk(pbk))
119119 then true
120120 else throw("Invalid admin pbk")
121121 if ((isValid == isValid))
122122 then {
123123 let newAdminsStr = ((getStringValue(k_ADMINS) + ",") + pbk)
124124 [StringEntry(k_ADMINS, newAdminsStr)]
125125 }
126126 else throw("Strict value is not equal to itself.")
127127 }
128128 else throw("Strict value is not equal to itself.")
129129 }
130130
131131
132132
133133 @Callable(i)
134134 func removeAdmin (pbk) = {
135135 let callerPbk = toBase58String(i.callerPublicKey)
136136 let isAdmin = if (_isAdmin(callerPbk))
137137 then true
138138 else throw("Only admins can add admin")
139139 if ((isAdmin == isAdmin))
140140 then {
141141 let isValid = if (_validatePbk(pbk))
142142 then true
143143 else throw("Invalid admin pbk")
144144 if ((isValid == isValid))
145145 then {
146146 let oldAdminsStr = getStringValue(k_ADMINS)
147147 let oldAdmins = split(oldAdminsStr, ",")
148148 let index = valueOrErrorMessage(indexOf(oldAdmins, pbk), "This pbk is not an admin")
149149 let newAdmins = removeByIndex(oldAdmins, index)
150150 let newAdminsStr = makeString(newAdmins, ",")
151151 [StringEntry(k_ADMINS, newAdminsStr)]
152152 }
153153 else throw("Strict value is not equal to itself.")
154154 }
155155 else throw("Strict value is not equal to itself.")
156156 }
157157
158158
159159
160160 @Callable(i)
161161 func addTask (name,dapp,txid,executeTs,desc,initiatorAdr,txdata) = {
162162 let callerPbk = toBase58String(i.callerPublicKey)
163163 if (!(_isValidOperator(callerPbk)))
164164 then throw("Not allowed")
165165 else {
166166 let taskId = ((dapp + "_") + txid)
167167 [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)]
168168 }
169169 }
170170
171171
172172
173173 @Callable(i)
174174 func removeTask (taskId) = {
175175 let callerPbk = toBase58String(i.callerPublicKey)
176176 if (!(_isValidOperator(callerPbk)))
177177 then throw("Not allowed")
178178 else {
179179 let initiatorAdr = getStringValue((taskId + "__initiator"))
180180 if ((initiatorAdr != toString(addressFromPublicKey(i.callerPublicKey))))
181181 then throw("Only creator can remove")
182182 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"))]
183183 }
184184 }
185185
186186
187187
188188 @Callable(i)
189189 func addConfirmation (taskId) = {
190190 let callerPbk = toBase58String(i.callerPublicKey)
191191 let limit = _getLimit()
192192 if (!(_isAdmin(callerPbk)))
193193 then throw("Only admins can confirm")
194194 else {
195195 let txId = valueOrErrorMessage(getString((taskId + "__txId")), "Ivalid task")
196196 if ((txId == txId))
197197 then {
198198 let dapp = getStringValue((taskId + "__dapp"))
199199 let confirmationsStr = valueOrElse(getString((taskId + "__confirmations")), "")
200200 let confirmations = split(confirmationsStr, ",")
201201 if ((indexOf(confirmations, callerPbk) != unit))
202202 then throw("Already confirmed")
203203 else {
204204 let newList = if ((confirmationsStr != ""))
205205 then (confirmations :+ callerPbk)
206206 else [callerPbk]
207207 let newListStr = makeString(newList, ",")
208208 let approved = (size(newList) >= limit)
209209 [StringEntry((taskId + "__confirmations"), newListStr), BooleanEntry((((dapp + "_") + txId) + "__approved"), approved)]
210210 }
211211 }
212212 else throw("Strict value is not equal to itself.")
213213 }
214214 }
215215
216216
217217
218218 @Callable(i)
219219 func setLimit (limit) = {
220220 let callerPbk = toBase58String(i.callerPublicKey)
221221 if (!(_isAdmin(callerPbk)))
222222 then throw("Only whitelisted can set limit")
223223 else {
224224 let zeroLimit = if ((limit > 0))
225225 then true
226226 else throw("Limit should be > 0")
227227 if ((zeroLimit == zeroLimit))
228228 then {
229229 let admins = getStringValue(k_ADMINS)
230230 if ((limit > size(admins)))
231231 then throw(((("Limit quorum should be <= size of list of admins, limit: " + toString(limit)) + ", current size: ") + toString(size(admins))))
232232 else [IntegerEntry(k_LIMIT, limit)]
233233 }
234234 else throw("Strict value is not equal to itself.")
235235 }
236236 }
237237
238238
239239
240240 @Callable(i)
241241 func test (pbk) = saveTxData(pbk)
242242
243243

github/deemru/w8io
42.06 ms