tx · DN6pFarRWG22R2a5FbPz6NQy1LGqhq9erTw4vUVoH8Q8 3MzAWQ22mQziCccLvSL9L1AF6pAJYUw11wd: -0.00200000 Waves 2022.08.17 13:14 [2188337] smart account 3MzAWQ22mQziCccLvSL9L1AF6pAJYUw11wd > SELF 0.00000000 Waves
{ "type": 13, "id": "DN6pFarRWG22R2a5FbPz6NQy1LGqhq9erTw4vUVoH8Q8", "fee": 200000, "feeAssetId": null, "timestamp": 1660731297264, "version": 2, "chainId": 84, "sender": "3MzAWQ22mQziCccLvSL9L1AF6pAJYUw11wd", "senderPublicKey": "7agfcapo6mD729yLQ4TcktCAiVWjYDf9p4E85DNvkcdd", "proofs": [ "eExrWHveBJcxecN495dw9nRe9Gifd8qheXMhokDuLNayRwV39fLthU6dgEYg8JJ3mUzvY4PdK2eTeazYRV583iS" ], "script": "base64:BgIHCAISAwoBCAgAA1NFUAICX18ABU1VTFQ4AIDC1y8BFWtleUJlbmVmaWNpYXJ5QWRkcmVzcwACHSVzJXNfX2NmZ19fYmVuZWZpY2lhcnlBZGRyZXNzARZrZXlDb25zdHJ1Y3RvckludGVydmFsAAIhJXMlc19fY2ZnX19ub2RlQ29udHJ1Y3RvckludGVydmFsARNrZXlMYXN0VXBkYXRlSGVpZ2h0AAIVJXNfX2xhc3RVcGRhdGVkSGVpZ2h0ARNrZXlTY3JpcHRVcGRhdGVIYXNoAAIdJXMlc19fbWluZXJfX3NjcmlwdFVwZGF0ZUhhc2gBGGtleVNjcmlwdFVwZGF0ZUFsbG93YW5jZQACIiVzJXNfX21pbmVyX19zY3JpcHRVcGRhdGVBbGxvd2FuY2UADG5vZGVSZWdpc3RyeQkBEUBleHRyTmF0aXZlKDEwNjIpAQIAAQFpAQtjb25zdHJ1Y3RvcgEXYmVuZWZpY2lhcnlBZGRyZXNzU3RyNTgDCQECIT0CBQR0aGlzCAUBaQZjYWxsZXIJAAIBAhJwZXJtaXNzaW9ucyBkZW5pZWQEEmJlbmVmaWNpYXJ5QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUXYmVuZWZpY2lhcnlBZGRyZXNzU3RyNTgDCQAAAgUSYmVuZWZpY2lhcnlBZGRyZXNzBQR0aGlzCQACAQI6bWluaW5nIG5vZGUgYWRkcmVzcyBpcyBub3QgYWxsb3dlZCBhcyBhIGJlbmVmaWNpYXJ5QWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCCQEVa2V5QmVuZWZpY2lhcnlBZGRyZXNzAAkApQgBBRJiZW5lZmljaWFyeUFkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQIJARNrZXlMYXN0VXBkYXRlSGVpZ2h0AAUGaGVpZ2h0BQNuaWwBAnR4AQZ2ZXJpZnkABAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwAwkBCWlzRGVmaW5lZAEIBQNpbnYKZmVlQXNzZXRJZAkAAgECPUludm9rZVNjcmlwdFRyYW5zYWN0aW9uIC0gb25seSBXQVZFUyBpcyBhbGxvd2VkIGFzIGZlZUFzc2V0SWQDCQAAAgkApAgBCAUDaW52BGRBcHAFDG5vZGVSZWdpc3RyeQYDCQAAAgkApAgBCAUDaW52BGRBcHAFBHRoaXMEEWxhc3RVcGRhdGVkSGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARNrZXlMYXN0VXBkYXRlSGVpZ2h0AAAABA5jb25zdHJJbnRlcnZhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQxub2RlUmVnaXN0cnkJARZrZXlDb25zdHJ1Y3RvckludGVydmFsAAABAwkAZgIFDmNvbnN0ckludGVydmFsCQBlAgUGaGVpZ2h0BRFsYXN0VXBkYXRlZEhlaWdodAkAAgECQ0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uIC0gaW1wb3NzaWJsZSB0byBjYWxsIGNvbnN0cnVjdG9yIHZlcnkgb2Z0ZW4JAMYTAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAAIBAi5JbnZva2VTY3JpcHRUcmFuc2FjdGlvbiAtIGludmFsaWQgZGFwcCBhZGRyZXNzAwkAAQIFByRtYXRjaDACFFNldFNjcmlwdFRyYW5zYWN0aW9uBANzdHgFByRtYXRjaDAEC3NjcmlwdEJ5dGVzCQEFdmFsdWUBCAUDc3R4BnNjcmlwdAQEaGFzaAkA2AQBCQDxFQEFC3NjcmlwdEJ5dGVzBAthbGxvd2VkSGFzaAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQxub2RlUmVnaXN0cnkJARNrZXlTY3JpcHRVcGRhdGVIYXNoAAIABAt2YWxpZEJ5SGFzaAMJAQIhPQIFC2FsbG93ZWRIYXNoAgAJAAACBQthbGxvd2VkSGFzaAUEaGFzaAcEDWFsbG93VG9VcGRhdGUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUMbm9kZVJlZ2lzdHJ5CQEYa2V5U2NyaXB0VXBkYXRlQWxsb3dhbmNlAAcDBQ1hbGxvd1RvVXBkYXRlBQt2YWxpZEJ5SGFzaAcJAAIBAgtub3QgYWxsb3dlZGW7kqY=", "height": 2188337, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 6 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let SEP = "__" | |
5 | + | ||
6 | + | let MULT8 = 100000000 | |
7 | + | ||
8 | + | func keyBeneficiaryAddress () = "%s%s__cfg__beneficiaryAddress" | |
9 | + | ||
10 | + | ||
11 | + | func keyConstructorInterval () = "%s%s__cfg__nodeContructorInterval" | |
12 | + | ||
13 | + | ||
14 | + | func keyLastUpdateHeight () = "%s__lastUpdatedHeight" | |
15 | + | ||
16 | + | ||
17 | + | func keyScriptUpdateHash () = "%s%s__miner__scriptUpdateHash" | |
18 | + | ||
19 | + | ||
20 | + | func keyScriptUpdateAllowance () = "%s%s__miner__scriptUpdateAllowance" | |
21 | + | ||
22 | + | ||
23 | + | let nodeRegistry = addressFromStringValue("") | |
24 | + | ||
25 | + | @Callable(i) | |
26 | + | func constructor (beneficiaryAddressStr58) = if ((this != i.caller)) | |
27 | + | then throw("permissions denied") | |
28 | + | else { | |
29 | + | let beneficiaryAddress = addressFromStringValue(beneficiaryAddressStr58) | |
30 | + | if ((beneficiaryAddress == this)) | |
31 | + | then throw("mining node address is not allowed as a beneficiaryAddress") | |
32 | + | else [StringEntry(keyBeneficiaryAddress(), toString(beneficiaryAddress)), IntegerEntry(keyLastUpdateHeight(), height)] | |
33 | + | } | |
34 | + | ||
35 | + | ||
36 | + | @Verifier(tx) | |
37 | + | func verify () = match tx { | |
38 | + | case inv: InvokeScriptTransaction => | |
39 | + | if (isDefined(inv.feeAssetId)) | |
40 | + | then throw("InvokeScriptTransaction - only WAVES is allowed as feeAssetId") | |
41 | + | else if ((addressFromRecipient(inv.dApp) == nodeRegistry)) | |
42 | + | then true | |
43 | + | else if ((addressFromRecipient(inv.dApp) == this)) | |
44 | + | then { | |
45 | + | let lastUpdatedHeight = valueOrElse(getInteger(this, keyLastUpdateHeight()), 0) | |
46 | + | let constrInterval = valueOrElse(getInteger(nodeRegistry, keyConstructorInterval()), 1) | |
47 | + | if ((constrInterval > (height - lastUpdatedHeight))) | |
48 | + | then throw("InvokeScriptTransaction - impossible to call constructor very often") | |
49 | + | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
50 | + | } | |
51 | + | else throw("InvokeScriptTransaction - invalid dapp address") | |
52 | + | case stx: SetScriptTransaction => | |
53 | + | let scriptBytes = value(stx.script) | |
54 | + | let hash = toBase58String(blake2b256_32Kb(scriptBytes)) | |
55 | + | let allowedHash = valueOrElse(getString(nodeRegistry, keyScriptUpdateHash()), "") | |
56 | + | let validByHash = if ((allowedHash != "")) | |
57 | + | then (allowedHash == hash) | |
58 | + | else false | |
59 | + | let allowToUpdate = valueOrElse(getBoolean(nodeRegistry, keyScriptUpdateAllowance()), false) | |
60 | + | if (allowToUpdate) | |
61 | + | then validByHash | |
62 | + | else false | |
63 | + | case _ => | |
64 | + | throw("not allowed") | |
65 | + | } | |
66 | + |
github/deemru/w8io/c3f4982 12.47 ms ◑