2024.04.24 10:13 [3076604] smart account 3MqsDXvFU9WM8hEzCcrw2aVGtVimCgbNeXD > SELF 0.00000000 Waves

{ "type": 13, "id": "EJ2n5W4ojcrQFpNA5Tk8LhNzb14NWrMdYwfT4r1nLX2H", "fee": 700000, "feeAssetId": null, "timestamp": 1713942817266, "version": 1, "sender": "3MqsDXvFU9WM8hEzCcrw2aVGtVimCgbNeXD", "senderPublicKey": "4dNR2Up6mpwUEcy9WQuE2wAzR7HRURa6Pk9jrFKgcHqB", "proofs": [ "3XUH8GxRtDeNAmeeW3JcaK4PYCaRr9cP7ZqGvqCbkhYekKKHb5wQe8h8nkycao2tpfcETjLvkLAgTbSB3uMwi7Bk" ], "script": "base64:BgISCAISBAoCCAQSAwoBCBIDCgEIDwAQY29udHJhY3RGaWxlbmFtZQIOZm9yY2VzdG9wLnJpZGUAA1NFUAICX18BB3dyYXBFcnIBA21zZwkAuQkCCQDMCAIFEGNvbnRyYWN0RmlsZW5hbWUJAMwIAgICOiAJAMwIAgUDbXNnBQNuaWwCAAEIdGhyb3dFcnIBA21zZwkAAgEJAQd3cmFwRXJyAQUDbXNnARZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICE21hbmFnZXJWYXVsdEFkZHJlc3MFA25pbAUDU0VQARNrZXlNYW5hZ2VyUHVibGljS2V5AAkAuQkCCQDMCAICAiVzCQDMCAICEG1hbmFnZXJQdWJsaWNLZXkFA25pbAUDU0VQARFrZXlQZXJtaXNzaW9uTGlzdAAJALkJAgkAzAgCAgIlcwkAzAgCAhNmb3JjZVN0b3BQZXJtaXNzaW9uBQNuaWwFA1NFUAEMa2V5Rm9yY2VTdG9wAQdhZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghkaXNhYmxlZAkAzAgCBQdhZGRyZXNzBQNuaWwFA1NFUAAOcGVybWlzc2lvbkxpc3QJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQERa2V5UGVybWlzc2lvbkxpc3QAAgAFA1NFUAAVcGVybWlzc2lvbkRlbmllZEVycm9yCQEIdGhyb3dFcnIBAhFQZXJtaXNzaW9uIGRlbmllZAEcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcwAEByRtYXRjaDAJAKIIAQkBFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBcwUEdGhpcwEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAEE21hbmFnZXJWYXVsdEFkZHJlc3MJARxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzAAQHJG1hdGNoMAkAnQgCBRNtYW5hZ2VyVmF1bHRBZGRyZXNzCQETa2V5TWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQhtdXN0VGhpcwEBaQMJAAACCAUBaQZjYWxsZXIFBHRoaXMGBRVwZXJtaXNzaW9uRGVuaWVkRXJyb3IBC211c3RNYW5hZ2VyAQFpBAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDADCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQJwawYFFXBlcm1pc3Npb25EZW5pZWRFcnJvcgMJAAECBQckbWF0Y2gwAgRVbml0CQEIbXVzdFRoaXMBBQFpCQACAQILTWF0Y2ggZXJyb3IBDmlzVmFsaWRBZGRyZXNzAQdhZGRyZXNzBAckbWF0Y2gwCQCmCAEFB2FkZHJlc3MDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYHAwFpARFmb3JjZVN0b3BDb250cmFjdAIHYWRkcmVzcwRzdG9wBBNjYWxsZXJBZGRyZXNzU3RyaW5nCQClCAEIBQFpBmNhbGxlcgQFY2hlY2sJAMwIAgMJAQ9jb250YWluc0VsZW1lbnQCBQ5wZXJtaXNzaW9uTGlzdAUTY2FsbGVyQWRkcmVzc1N0cmluZwYJAQttdXN0TWFuYWdlcgEFAWkJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFB2FkZHJlc3MGCQCsAgIJAKwCAgIBWwUHYWRkcmVzcwkBCHRocm93RXJyAQIQXSBub3QgYW4gYWRkcmVzcwUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBDGtleUZvcmNlU3RvcAEFB2FkZHJlc3MFBHN0b3AFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1hZGRQZXJtaXNzaW9uAQdhZGRyZXNzBAVjaGVjawkAzAgCCQELbXVzdE1hbmFnZXIBBQFpCQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQdhZGRyZXNzBgkArAICCQCsAgICAVsFB2FkZHJlc3MJAQh0aHJvd0VycgECEF0gbm90IGFuIGFkZHJlc3MJAMwIAgMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFDnBlcm1pc3Npb25MaXN0BQdhZGRyZXNzBgkBCHRocm93RXJyAQIaYWxyZWFkeSBpbiBwZXJtaXNzaW9uIGxpc3QFA25pbAMJAAACBQVjaGVjawUFY2hlY2sEB25ld0xpc3QJAM0IAgUOcGVybWlzc2lvbkxpc3QFB2FkZHJlc3MEDW5ld0xpc3RTdHJpbmcJALkJAgUHbmV3TGlzdAUDU0VQCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlQZXJtaXNzaW9uTGlzdAAFDW5ld0xpc3RTdHJpbmcFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARByZW1vdmVQZXJtaXNzaW9uAQdhZGRyZXNzBAVjaGVjawkAzAgCCQELbXVzdE1hbmFnZXIBBQFpCQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQdhZGRyZXNzBgkArAICCQCsAgICAVsFB2FkZHJlc3MJAQh0aHJvd0VycgECEF0gbm90IGFuIGFkZHJlc3MJAMwIAgMJAQ9jb250YWluc0VsZW1lbnQCBQ5wZXJtaXNzaW9uTGlzdAUHYWRkcmVzcwYJAQh0aHJvd0VycgECFm5vdCBpbiBwZXJtaXNzaW9uIGxpc3QFA25pbAMJAAACBQVjaGVjawUFY2hlY2sEB3JfaW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQ5wZXJtaXNzaW9uTGlzdAUHYWRkcmVzcwkArAICBQdhZGRyZXNzCQEHd3JhcEVycgECC25vdCBpbiBsaXN0BAduZXdMaXN0CQDRCAIFDnBlcm1pc3Npb25MaXN0BQdyX2luZGV4BA1uZXdMaXN0U3RyaW5nCQC5CQIFB25ld0xpc3QFA1NFUAkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5UGVybWlzc2lvbkxpc3QABQ1uZXdMaXN0U3RyaW5nBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABA90YXJnZXRQdWJsaWNLZXkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAgFAnR4D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ90YXJnZXRQdWJsaWNLZXnXQGat", "chainId": 84, "height": 3076604, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8Cx1HAbJUpWtxcSnu3NHbsMp3tVyZoAU9PEpbRpLugcm Next: FHYFLmkHqRqTdg8UpWLdYW8e1enY5wE9muSELuEjBNmP Diff:
OldNewDifferences
6565 }
6666
6767
68+func isValidAddress (address) = match addressFromString(address) {
69+ case a: Address =>
70+ true
71+ case _ =>
72+ false
73+}
74+
75+
6876 @Callable(i)
6977 func forceStopContract (address,stop) = {
7078 let callerAddressString = toString(i.caller)
7179 let check = [if (containsElement(permissionList, callerAddressString))
7280 then true
73- else mustManager(i)]
81+ else mustManager(i), if (isValidAddress(address))
82+ then true
83+ else (("[" + address) + throwErr("] not an address"))]
7484 if ((check == check))
7585 then [BooleanEntry(keyForceStop(address), stop)]
7686 else throw("Strict value is not equal to itself.")
8090
8191 @Callable(i)
8292 func addPermission (address) = {
83- let check = [mustManager(i), if (!(containsElement(permissionList, address)))
93+ let check = [mustManager(i), if (isValidAddress(address))
94+ then true
95+ else (("[" + address) + throwErr("] not an address")), if (!(containsElement(permissionList, address)))
8496 then true
8597 else throwErr("already in permission list")]
8698 if ((check == check))
96108
97109 @Callable(i)
98110 func removePermission (address) = {
99- let check = [mustManager(i), if (containsElement(permissionList, address))
111+ let check = [mustManager(i), if (isValidAddress(address))
112+ then true
113+ else (("[" + address) + throwErr("] not an address")), if (containsElement(permissionList, address))
100114 then true
101115 else throwErr("not in permission list")]
102116 if ((check == check))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let contractFilename = "forcestop.ride"
55
66 let SEP = "__"
77
88 func wrapErr (msg) = makeString([contractFilename, ": ", msg], "")
99
1010
1111 func throwErr (msg) = throw(wrapErr(msg))
1212
1313
1414 func keyManagerVaultAddress () = makeString(["%s", "managerVaultAddress"], SEP)
1515
1616
1717 func keyManagerPublicKey () = makeString(["%s", "managerPublicKey"], SEP)
1818
1919
2020 func keyPermissionList () = makeString(["%s", "forceStopPermission"], SEP)
2121
2222
2323 func keyForceStop (address) = makeString(["%s%s", "disabled", address], SEP)
2424
2525
2626 let permissionList = split(valueOrElse(getString(this, keyPermissionList()), ""), SEP)
2727
2828 let permissionDeniedError = throwErr("Permission denied")
2929
3030 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
3131 case s: String =>
3232 addressFromStringValue(s)
3333 case _ =>
3434 this
3535 }
3636
3737
3838 func managerPublicKeyOrUnit () = {
3939 let managerVaultAddress = getManagerVaultAddressOrThis()
4040 match getString(managerVaultAddress, keyManagerPublicKey()) {
4141 case s: String =>
4242 fromBase58String(s)
4343 case _: Unit =>
4444 unit
4545 case _ =>
4646 throw("Match error")
4747 }
4848 }
4949
5050
5151 func mustThis (i) = if ((i.caller == this))
5252 then true
5353 else permissionDeniedError
5454
5555
5656 func mustManager (i) = match managerPublicKeyOrUnit() {
5757 case pk: ByteVector =>
5858 if ((i.callerPublicKey == pk))
5959 then true
6060 else permissionDeniedError
6161 case _: Unit =>
6262 mustThis(i)
6363 case _ =>
6464 throw("Match error")
6565 }
6666
6767
68+func isValidAddress (address) = match addressFromString(address) {
69+ case a: Address =>
70+ true
71+ case _ =>
72+ false
73+}
74+
75+
6876 @Callable(i)
6977 func forceStopContract (address,stop) = {
7078 let callerAddressString = toString(i.caller)
7179 let check = [if (containsElement(permissionList, callerAddressString))
7280 then true
73- else mustManager(i)]
81+ else mustManager(i), if (isValidAddress(address))
82+ then true
83+ else (("[" + address) + throwErr("] not an address"))]
7484 if ((check == check))
7585 then [BooleanEntry(keyForceStop(address), stop)]
7686 else throw("Strict value is not equal to itself.")
7787 }
7888
7989
8090
8191 @Callable(i)
8292 func addPermission (address) = {
83- let check = [mustManager(i), if (!(containsElement(permissionList, address)))
93+ let check = [mustManager(i), if (isValidAddress(address))
94+ then true
95+ else (("[" + address) + throwErr("] not an address")), if (!(containsElement(permissionList, address)))
8496 then true
8597 else throwErr("already in permission list")]
8698 if ((check == check))
8799 then {
88100 let newList = (permissionList :+ address)
89101 let newListString = makeString(newList, SEP)
90102 [StringEntry(keyPermissionList(), newListString)]
91103 }
92104 else throw("Strict value is not equal to itself.")
93105 }
94106
95107
96108
97109 @Callable(i)
98110 func removePermission (address) = {
99- let check = [mustManager(i), if (containsElement(permissionList, address))
111+ let check = [mustManager(i), if (isValidAddress(address))
112+ then true
113+ else (("[" + address) + throwErr("] not an address")), if (containsElement(permissionList, address))
100114 then true
101115 else throwErr("not in permission list")]
102116 if ((check == check))
103117 then {
104118 let r_index = valueOrErrorMessage(indexOf(permissionList, address), (address + wrapErr("not in list")))
105119 let newList = removeByIndex(permissionList, r_index)
106120 let newListString = makeString(newList, SEP)
107121 [StringEntry(keyPermissionList(), newListString)]
108122 }
109123 else throw("Strict value is not equal to itself.")
110124 }
111125
112126
113127 @Verifier(tx)
114128 func verify () = {
115129 let targetPublicKey = match managerPublicKeyOrUnit() {
116130 case pk: ByteVector =>
117131 pk
118132 case _: Unit =>
119133 tx.senderPublicKey
120134 case _ =>
121135 throw("Match error")
122136 }
123137 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
124138 }
125139

github/deemru/w8io/786bc32 
20.72 ms