2024.04.24 09:45 [3076571] smart account 3MqsDXvFU9WM8hEzCcrw2aVGtVimCgbNeXD > SELF 0.00000000 Waves

{ "type": 13, "id": "76P5DacsbzZJgyU8699u2EDCk99F6FiquQyANm7cDgMC", "fee": 700000, "feeAssetId": null, "timestamp": 1713941131400, "version": 1, "sender": "3MqsDXvFU9WM8hEzCcrw2aVGtVimCgbNeXD", "senderPublicKey": "4dNR2Up6mpwUEcy9WQuE2wAzR7HRURa6Pk9jrFKgcHqB", "proofs": [ "kiNtSZNpqAXrDEM8Ngyuueh4pbU9auGTuznsWeVNJE6BP8mno2varurGVZc1c2xWyFQVWkF7pJGZSTXqevJHQVA" ], "script": "base64:BgISCAISBAoCCAQSAwoBCBIDCgEIDgAQY29udHJhY3RGaWxlbmFtZQIOZm9yY2VzdG9wLnJpZGUAA1NFUAICX18BB3dyYXBFcnIBA21zZwkAuQkCCQDMCAIFEGNvbnRyYWN0RmlsZW5hbWUJAMwIAgICOiAJAMwIAgUDbXNnBQNuaWwCAAEIdGhyb3dFcnIBA21zZwkAAgEJAQd3cmFwRXJyAQUDbXNnARZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICE21hbmFnZXJWYXVsdEFkZHJlc3MFA25pbAUDU0VQARNrZXlNYW5hZ2VyUHVibGljS2V5AAkAuQkCCQDMCAICAiVzCQDMCAICEG1hbmFnZXJQdWJsaWNLZXkFA25pbAUDU0VQARFrZXlQZXJtaXNzaW9uTGlzdAAJALkJAgkAzAgCAgIlcwkAzAgCAhNmb3JjZVN0b3BQZXJtaXNzaW9uBQNuaWwFA1NFUAEMa2V5Rm9yY2VTdG9wAQdhZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgRzdG9wCQDMCAIFB2FkZHJlc3MFA25pbAUDU0VQAA5wZXJtaXNzaW9uTGlzdAkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJARFrZXlQZXJtaXNzaW9uTGlzdAACAAUDU0VQABVwZXJtaXNzaW9uRGVuaWVkRXJyb3IJAQh0aHJvd0VycgECEVBlcm1pc3Npb24gZGVuaWVkARxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzAAQHJG1hdGNoMAkAoggBCQEWa2V5TWFuYWdlclZhdWx0QWRkcmVzcwADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFzBQR0aGlzARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAQTbWFuYWdlclZhdWx0QWRkcmVzcwkBHGdldE1hbmFnZXJWYXVsdEFkZHJlc3NPclRoaXMABAckbWF0Y2gwCQCdCAIFE21hbmFnZXJWYXVsdEFkZHJlc3MJARNrZXlNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBCG11c3RUaGlzAQFpAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYFFXBlcm1pc3Npb25EZW5pZWRFcnJvcgELbXVzdE1hbmFnZXIBAWkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrBgUVcGVybWlzc2lvbkRlbmllZEVycm9yAwkAAQIFByRtYXRjaDACBFVuaXQJAQhtdXN0VGhpcwEFAWkJAAIBAgtNYXRjaCBlcnJvcgMBaQERZm9yY2VTdG9wQ29udHJhY3QCB2FkZHJlc3MEc3RvcAQTY2FsbGVyQWRkcmVzc1N0cmluZwkApQgBCAUBaQZjYWxsZXIEBWNoZWNrCQDMCAIDCQEPY29udGFpbnNFbGVtZW50AgUOcGVybWlzc2lvbkxpc3QFE2NhbGxlckFkZHJlc3NTdHJpbmcGCQELbXVzdE1hbmFnZXIBBQFpBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQDMCAIJAQxCb29sZWFuRW50cnkCCQEMa2V5Rm9yY2VTdG9wAQUHYWRkcmVzcwUEc3RvcAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWFkZFBlcm1pc3Npb24BB2FkZHJlc3MEBWNoZWNrCQDMCAIJAQttdXN0TWFuYWdlcgEFAWkJAMwIAgMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFDnBlcm1pc3Npb25MaXN0BQdhZGRyZXNzBgkBCHRocm93RXJyAQIaYWxyZWFkeSBpbiBwZXJtaXNzaW9uIGxpc3QFA25pbAMJAAACBQVjaGVjawUFY2hlY2sEB25ld0xpc3QJAM0IAgUOcGVybWlzc2lvbkxpc3QFB2FkZHJlc3MEDW5ld0xpc3RTdHJpbmcJALkJAgUHbmV3TGlzdAUDU0VQCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlQZXJtaXNzaW9uTGlzdAAFDW5ld0xpc3RTdHJpbmcFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARByZW1vdmVQZXJtaXNzaW9uAQdhZGRyZXNzBAVjaGVjawkAzAgCCQELbXVzdE1hbmFnZXIBBQFpCQDMCAIDCQEPY29udGFpbnNFbGVtZW50AgUOcGVybWlzc2lvbkxpc3QFB2FkZHJlc3MGCQEIdGhyb3dFcnIBAhZub3QgaW4gcGVybWlzc2lvbiBsaXN0BQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrBAdyX2luZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUOcGVybWlzc2lvbkxpc3QFB2FkZHJlc3MJAKwCAgUHYWRkcmVzcwkBB3dyYXBFcnIBAgtub3QgaW4gbGlzdAQHbmV3TGlzdAkA0QgCBQ5wZXJtaXNzaW9uTGlzdAUHcl9pbmRleAQNbmV3TGlzdFN0cmluZwkAuQkCBQduZXdMaXN0BQNTRVAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleVBlcm1pc3Npb25MaXN0AAUNbmV3TGlzdFN0cmluZwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQPdGFyZ2V0UHVibGljS2V5BAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDAFAnBrAwkAAQIFByRtYXRjaDACBFVuaXQIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUPdGFyZ2V0UHVibGljS2V5kgnKWQ==", "chainId": 84, "height": 3076571, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HDCymHAoH3TDBuY6dM1xoUBTBURcxip5hR8ssJA7uzJa Next: 8Cx1HAbJUpWtxcSnu3NHbsMp3tVyZoAU9PEpbRpLugcm Diff:
OldNewDifferences
7777 }
7878
7979
80+
81+@Callable(i)
82+func addPermission (address) = {
83+ let check = [mustManager(i), if (!(containsElement(permissionList, address)))
84+ then true
85+ else throwErr("already in permission list")]
86+ if ((check == check))
87+ then {
88+ let newList = (permissionList :+ address)
89+ let newListString = makeString(newList, SEP)
90+[StringEntry(keyPermissionList(), newListString)]
91+ }
92+ else throw("Strict value is not equal to itself.")
93+ }
94+
95+
96+
97+@Callable(i)
98+func removePermission (address) = {
99+ let check = [mustManager(i), if (containsElement(permissionList, address))
100+ then true
101+ else throwErr("not in permission list")]
102+ if ((check == check))
103+ then {
104+ let r_index = valueOrErrorMessage(indexOf(permissionList, address), (address + wrapErr("not in list")))
105+ let newList = removeByIndex(permissionList, r_index)
106+ let newListString = makeString(newList, SEP)
107+[StringEntry(keyPermissionList(), newListString)]
108+ }
109+ else throw("Strict value is not equal to itself.")
110+ }
111+
112+
80113 @Verifier(tx)
81114 func verify () = {
82115 let targetPublicKey = match managerPublicKeyOrUnit() {
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", "stop", 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 @Callable(i)
6969 func forceStopContract (address,stop) = {
7070 let callerAddressString = toString(i.caller)
7171 let check = [if (containsElement(permissionList, callerAddressString))
7272 then true
7373 else mustManager(i)]
7474 if ((check == check))
7575 then [BooleanEntry(keyForceStop(address), stop)]
7676 else throw("Strict value is not equal to itself.")
7777 }
7878
7979
80+
81+@Callable(i)
82+func addPermission (address) = {
83+ let check = [mustManager(i), if (!(containsElement(permissionList, address)))
84+ then true
85+ else throwErr("already in permission list")]
86+ if ((check == check))
87+ then {
88+ let newList = (permissionList :+ address)
89+ let newListString = makeString(newList, SEP)
90+[StringEntry(keyPermissionList(), newListString)]
91+ }
92+ else throw("Strict value is not equal to itself.")
93+ }
94+
95+
96+
97+@Callable(i)
98+func removePermission (address) = {
99+ let check = [mustManager(i), if (containsElement(permissionList, address))
100+ then true
101+ else throwErr("not in permission list")]
102+ if ((check == check))
103+ then {
104+ let r_index = valueOrErrorMessage(indexOf(permissionList, address), (address + wrapErr("not in list")))
105+ let newList = removeByIndex(permissionList, r_index)
106+ let newListString = makeString(newList, SEP)
107+[StringEntry(keyPermissionList(), newListString)]
108+ }
109+ else throw("Strict value is not equal to itself.")
110+ }
111+
112+
80113 @Verifier(tx)
81114 func verify () = {
82115 let targetPublicKey = match managerPublicKeyOrUnit() {
83116 case pk: ByteVector =>
84117 pk
85118 case _: Unit =>
86119 tx.senderPublicKey
87120 case _ =>
88121 throw("Match error")
89122 }
90123 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
91124 }
92125

github/deemru/w8io/786bc32 
19.98 ms