2024.04.24 10:14 [3076605] smart account 3MqsDXvFU9WM8hEzCcrw2aVGtVimCgbNeXD > SELF 0.00000000 Waves

{ "type": 13, "id": "FHYFLmkHqRqTdg8UpWLdYW8e1enY5wE9muSELuEjBNmP", "fee": 700000, "feeAssetId": null, "timestamp": 1713942938864, "version": 1, "sender": "3MqsDXvFU9WM8hEzCcrw2aVGtVimCgbNeXD", "senderPublicKey": "4dNR2Up6mpwUEcy9WQuE2wAzR7HRURa6Pk9jrFKgcHqB", "proofs": [ "2qn9qgUPbdUzTHvjCLQybLr4CwZHDuRz8yenShgnk9gvTobTmytc8K3gvTLSk8kf8X5YbZ7m8xvkmwg9uGX92iCW" ], "script": "base64:BgISCAISBAoCCAQSAwoBCBIDCgEIDwAQY29udHJhY3RGaWxlbmFtZQIOZm9yY2VzdG9wLnJpZGUAA1NFUAICX18BB3dyYXBFcnIBA21zZwkAuQkCCQDMCAIFEGNvbnRyYWN0RmlsZW5hbWUJAMwIAgICOiAJAMwIAgUDbXNnBQNuaWwCAAEIdGhyb3dFcnIBA21zZwkAAgEJAQd3cmFwRXJyAQUDbXNnARZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICE21hbmFnZXJWYXVsdEFkZHJlc3MFA25pbAUDU0VQARNrZXlNYW5hZ2VyUHVibGljS2V5AAkAuQkCCQDMCAICAiVzCQDMCAICEG1hbmFnZXJQdWJsaWNLZXkFA25pbAUDU0VQARFrZXlQZXJtaXNzaW9uTGlzdAAJALkJAgkAzAgCAgIlcwkAzAgCAhNmb3JjZVN0b3BQZXJtaXNzaW9uBQNuaWwFA1NFUAEMa2V5Rm9yY2VTdG9wAQdhZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghkaXNhYmxlZAkAzAgCBQdhZGRyZXNzBQNuaWwFA1NFUAAOcGVybWlzc2lvbkxpc3QJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQERa2V5UGVybWlzc2lvbkxpc3QAAgAFA1NFUAAVcGVybWlzc2lvbkRlbmllZEVycm9yCQEIdGhyb3dFcnIBAhFQZXJtaXNzaW9uIGRlbmllZAEcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcwAEByRtYXRjaDAJAKIIAQkBFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBcwUEdGhpcwEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAEE21hbmFnZXJWYXVsdEFkZHJlc3MJARxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzAAQHJG1hdGNoMAkAnQgCBRNtYW5hZ2VyVmF1bHRBZGRyZXNzCQETa2V5TWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQhtdXN0VGhpcwEBaQMJAAACCAUBaQZjYWxsZXIFBHRoaXMGBRVwZXJtaXNzaW9uRGVuaWVkRXJyb3IBC211c3RNYW5hZ2VyAQFpBAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDADCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQJwawYFFXBlcm1pc3Npb25EZW5pZWRFcnJvcgMJAAECBQckbWF0Y2gwAgRVbml0CQEIbXVzdFRoaXMBBQFpCQACAQILTWF0Y2ggZXJyb3IBDmlzVmFsaWRBZGRyZXNzAQdhZGRyZXNzBAckbWF0Y2gwCQCmCAEFB2FkZHJlc3MDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYHAwFpARFmb3JjZVN0b3BDb250cmFjdAIHYWRkcmVzcwRzdG9wBBNjYWxsZXJBZGRyZXNzU3RyaW5nCQClCAEIBQFpBmNhbGxlcgQFY2hlY2sJAMwIAgMJAQ9jb250YWluc0VsZW1lbnQCBQ5wZXJtaXNzaW9uTGlzdAUTY2FsbGVyQWRkcmVzc1N0cmluZwYJAQttdXN0TWFuYWdlcgEFAWkJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFB2FkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIBWwkAzAgCBQdhZGRyZXNzCQDMCAICEF0gbm90IGFuIGFkZHJlc3MFA25pbAIABQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQDMCAIJAQxCb29sZWFuRW50cnkCCQEMa2V5Rm9yY2VTdG9wAQUHYWRkcmVzcwUEc3RvcAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWFkZFBlcm1pc3Npb24BB2FkZHJlc3MEBWNoZWNrCQDMCAIJAQttdXN0TWFuYWdlcgEFAWkJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFB2FkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIBWwkAzAgCBQdhZGRyZXNzCQDMCAICEF0gbm90IGFuIGFkZHJlc3MFA25pbAIACQDMCAIDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQ5wZXJtaXNzaW9uTGlzdAUHYWRkcmVzcwYJAQh0aHJvd0VycgECGmFscmVhZHkgaW4gcGVybWlzc2lvbiBsaXN0BQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrBAduZXdMaXN0CQDNCAIFDnBlcm1pc3Npb25MaXN0BQdhZGRyZXNzBA1uZXdMaXN0U3RyaW5nCQC5CQIFB25ld0xpc3QFA1NFUAkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5UGVybWlzc2lvbkxpc3QABQ1uZXdMaXN0U3RyaW5nBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQcmVtb3ZlUGVybWlzc2lvbgEHYWRkcmVzcwQFY2hlY2sJAMwIAgkBC211c3RNYW5hZ2VyAQUBaQkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQUHYWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAgFbCQDMCAIFB2FkZHJlc3MJAMwIAgIQXSBub3QgYW4gYWRkcmVzcwUDbmlsAgAJAMwIAgMJAQ9jb250YWluc0VsZW1lbnQCBQ5wZXJtaXNzaW9uTGlzdAUHYWRkcmVzcwYJAQh0aHJvd0VycgECFm5vdCBpbiBwZXJtaXNzaW9uIGxpc3QFA25pbAMJAAACBQVjaGVjawUFY2hlY2sEB3JfaW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQ5wZXJtaXNzaW9uTGlzdAUHYWRkcmVzcwkArAICBQdhZGRyZXNzCQEHd3JhcEVycgECC25vdCBpbiBsaXN0BAduZXdMaXN0CQDRCAIFDnBlcm1pc3Npb25MaXN0BQdyX2luZGV4BA1uZXdMaXN0U3RyaW5nCQC5CQIFB25ld0xpc3QFA1NFUAkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5UGVybWlzc2lvbkxpc3QABQ1uZXdMaXN0U3RyaW5nBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABA90YXJnZXRQdWJsaWNLZXkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAgFAnR4D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ90YXJnZXRQdWJsaWNLZXnLeqa2", "chainId": 84, "height": 3076605, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EJ2n5W4ojcrQFpNA5Tk8LhNzb14NWrMdYwfT4r1nLX2H Next: none Diff:
OldNewDifferences
8080 then true
8181 else mustManager(i), if (isValidAddress(address))
8282 then true
83- else (("[" + address) + throwErr("] not an address"))]
83+ else throwErr(makeString(["[", address, "] not an address"], ""))]
8484 if ((check == check))
8585 then [BooleanEntry(keyForceStop(address), stop)]
8686 else throw("Strict value is not equal to itself.")
9292 func addPermission (address) = {
9393 let check = [mustManager(i), if (isValidAddress(address))
9494 then true
95- else (("[" + address) + throwErr("] not an address")), if (!(containsElement(permissionList, address)))
95+ else throwErr(makeString(["[", address, "] not an address"], "")), if (!(containsElement(permissionList, address)))
9696 then true
9797 else throwErr("already in permission list")]
9898 if ((check == check))
110110 func removePermission (address) = {
111111 let check = [mustManager(i), if (isValidAddress(address))
112112 then true
113- else (("[" + address) + throwErr("] not an address")), if (containsElement(permissionList, address))
113+ else throwErr(makeString(["[", address, "] not an address"], "")), if (containsElement(permissionList, address))
114114 then true
115115 else throwErr("not in permission list")]
116116 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
6868 func isValidAddress (address) = match addressFromString(address) {
6969 case a: Address =>
7070 true
7171 case _ =>
7272 false
7373 }
7474
7575
7676 @Callable(i)
7777 func forceStopContract (address,stop) = {
7878 let callerAddressString = toString(i.caller)
7979 let check = [if (containsElement(permissionList, callerAddressString))
8080 then true
8181 else mustManager(i), if (isValidAddress(address))
8282 then true
83- else (("[" + address) + throwErr("] not an address"))]
83+ else throwErr(makeString(["[", address, "] not an address"], ""))]
8484 if ((check == check))
8585 then [BooleanEntry(keyForceStop(address), stop)]
8686 else throw("Strict value is not equal to itself.")
8787 }
8888
8989
9090
9191 @Callable(i)
9292 func addPermission (address) = {
9393 let check = [mustManager(i), if (isValidAddress(address))
9494 then true
95- else (("[" + address) + throwErr("] not an address")), if (!(containsElement(permissionList, address)))
95+ else throwErr(makeString(["[", address, "] not an address"], "")), if (!(containsElement(permissionList, address)))
9696 then true
9797 else throwErr("already in permission list")]
9898 if ((check == check))
9999 then {
100100 let newList = (permissionList :+ address)
101101 let newListString = makeString(newList, SEP)
102102 [StringEntry(keyPermissionList(), newListString)]
103103 }
104104 else throw("Strict value is not equal to itself.")
105105 }
106106
107107
108108
109109 @Callable(i)
110110 func removePermission (address) = {
111111 let check = [mustManager(i), if (isValidAddress(address))
112112 then true
113- else (("[" + address) + throwErr("] not an address")), if (containsElement(permissionList, address))
113+ else throwErr(makeString(["[", address, "] not an address"], "")), if (containsElement(permissionList, address))
114114 then true
115115 else throwErr("not in permission list")]
116116 if ((check == check))
117117 then {
118118 let r_index = valueOrErrorMessage(indexOf(permissionList, address), (address + wrapErr("not in list")))
119119 let newList = removeByIndex(permissionList, r_index)
120120 let newListString = makeString(newList, SEP)
121121 [StringEntry(keyPermissionList(), newListString)]
122122 }
123123 else throw("Strict value is not equal to itself.")
124124 }
125125
126126
127127 @Verifier(tx)
128128 func verify () = {
129129 let targetPublicKey = match managerPublicKeyOrUnit() {
130130 case pk: ByteVector =>
131131 pk
132132 case _: Unit =>
133133 tx.senderPublicKey
134134 case _ =>
135135 throw("Match error")
136136 }
137137 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
138138 }
139139

github/deemru/w8io/786bc32 
22.50 ms