tx · 5f43RuZjxJFWaAxf4jxXm3e7DMQpxnnVcw9WsX9mp3Mh 3PMBij4wQPn749nmy9SvDNNZ6rDik4eMMXV: -0.01000000 Waves 2022.07.14 08:04 [3204516] smart account 3PMBij4wQPn749nmy9SvDNNZ6rDik4eMMXV > SELF 0.00000000 Waves
{ "type": 13, "id": "5f43RuZjxJFWaAxf4jxXm3e7DMQpxnnVcw9WsX9mp3Mh", "fee": 1000000, "feeAssetId": null, "timestamp": 1657775097240, "version": 1, "sender": "3PMBij4wQPn749nmy9SvDNNZ6rDik4eMMXV", "senderPublicKey": "C4qJsVGvkogai9Dc93bCYUpBRXD6aAVLjY7TEUHb4rVP", "proofs": [ "3H48MnqHeTV5jirUKEPSqBkhypVdgpdzJ1uYNPKFa4seNdsKnfUEwQaDNYqBRpdiRSRJstmv8gSq3YzoxquYwJDE" ], "script": "base64:BgIHCAISAwoBCAgAA1NFUAICX18ABU1VTFQ4AIDC1y8BFWtleUJlbmVmaWNpYXJ5QWRkcmVzcwACHSVzJXNfX2NmZ19fYmVuZWZpY2lhcnlBZGRyZXNzARZrZXlDb25zdHJ1Y3RvckludGVydmFsAAIhJXMlc19fY2ZnX19ub2RlQ29udHJ1Y3RvckludGVydmFsARNrZXlMYXN0VXBkYXRlSGVpZ2h0AAIVJXNfX2xhc3RVcGRhdGVkSGVpZ2h0ARNrZXlTY3JpcHRVcGRhdGVIYXNoAAIdJXMlc19fbWluZXJfX3NjcmlwdFVwZGF0ZUhhc2gBGGtleVNjcmlwdFVwZGF0ZUFsbG93YW5jZQACIiVzJXNfX21pbmVyX19zY3JpcHRVcGRhdGVBbGxvd2FuY2UADG5vZGVSZWdpc3RyeQkBEUBleHRyTmF0aXZlKDEwNjIpAQIjM1A5dktxUUtqVWRtcFhBZmlXYXU4a3JSRVlBWTFYcjY5cEUBAWkBC2NvbnN0cnVjdG9yARdiZW5lZmljaWFyeUFkZHJlc3NTdHI1OAMJAQIhPQIFBHRoaXMIBQFpBmNhbGxlcgkAAgECEnBlcm1pc3Npb25zIGRlbmllZAQSYmVuZWZpY2lhcnlBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBRdiZW5lZmljaWFyeUFkZHJlc3NTdHI1OAMJAAACBRJiZW5lZmljaWFyeUFkZHJlc3MFBHRoaXMJAAIBAjptaW5pbmcgbm9kZSBhZGRyZXNzIGlzIG5vdCBhbGxvd2VkIGFzIGEgYmVuZWZpY2lhcnlBZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJARVrZXlCZW5lZmljaWFyeUFkZHJlc3MACQClCAEFEmJlbmVmaWNpYXJ5QWRkcmVzcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBE2tleUxhc3RVcGRhdGVIZWlnaHQABQZoZWlnaHQFA25pbAECdHgBBnZlcmlmeQAEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDADCQBmAggFA2ludgNmZWUJAGkCCQBoAgAFBQVNVUxUOADoBwkAAgEJAKwCAgJCSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24gLSBmZWUgYW1vdW50IGlzIGdyZWF0ZXIgdGhhbiBtYXggYWxsb3dlZDogCQCkAwEIBQNpbnYDZmVlAwkBCWlzRGVmaW5lZAEIBQNpbnYKZmVlQXNzZXRJZAkAAgECPUludm9rZVNjcmlwdFRyYW5zYWN0aW9uIC0gb25seSBXQVZFUyBpcyBhbGxvd2VkIGFzIGZlZUFzc2V0SWQDCQAAAgkApAgBCAUDaW52BGRBcHAFDG5vZGVSZWdpc3RyeQYDCQAAAgkApAgBCAUDaW52BGRBcHAFBHRoaXMEEWxhc3RVcGRhdGVkSGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARNrZXlMYXN0VXBkYXRlSGVpZ2h0AAAABA5jb25zdHJJbnRlcnZhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQxub2RlUmVnaXN0cnkJARZrZXlDb25zdHJ1Y3RvckludGVydmFsAADgTgMJAGYCBQ5jb25zdHJJbnRlcnZhbAkAZQIFBmhlaWdodAURbGFzdFVwZGF0ZWRIZWlnaHQJAAIBAkNJbnZva2VTY3JpcHRUcmFuc2FjdGlvbiAtIGltcG9zc2libGUgdG8gY2FsbCBjb25zdHJ1Y3RvciB2ZXJ5IG9mdGVuCQDGEwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5CQACAQIuSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24gLSBpbnZhbGlkIGRhcHAgYWRkcmVzcwMJAAECBQckbWF0Y2gwAhRTZXRTY3JpcHRUcmFuc2FjdGlvbgQDc3R4BQckbWF0Y2gwAwkAZgIIBQNzdHgDZmVlCQBpAgkAaAIAAgUFTVVMVDgAZAkAAgEJAKwCAgI/U2V0U2NyaXB0VHJhbnNhY3Rpb24gLSBmZWUgYW1vdW50IGlzIGdyZWF0ZXIgdGhhbiBtYXggYWxsb3dlZDogCQCkAwEIBQNzdHgDZmVlBAtzY3JpcHRCeXRlcwkBBXZhbHVlAQgFA3N0eAZzY3JpcHQEBGhhc2gJANgEAQkA8RUBBQtzY3JpcHRCeXRlcwQLYWxsb3dlZEhhc2gJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUMbm9kZVJlZ2lzdHJ5CQETa2V5U2NyaXB0VXBkYXRlSGFzaAACAAQLdmFsaWRCeUhhc2gDCQECIT0CBQthbGxvd2VkSGFzaAIACQAAAgULYWxsb3dlZEhhc2gFBGhhc2gHBA1hbGxvd1RvVXBkYXRlCQELdmFsdWVPckVsc2UCCQCbCAIFDG5vZGVSZWdpc3RyeQkBGGtleVNjcmlwdFVwZGF0ZUFsbG93YW5jZQAHAwUNYWxsb3dUb1VwZGF0ZQULdmFsaWRCeUhhc2gHCQACAQILbm90IGFsbG93ZWTcf3jp", "chainId": 87, "height": 3204516, "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("3P9vKqQKjUdmpXAfiWau8krREYAY1Xr69pE") | |
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 ((inv.fee > ((5 * MULT8) / 1000))) | |
40 | + | then throw(("InvokeScriptTransaction - fee amount is greater than max allowed: " + toString(inv.fee))) | |
41 | + | else if (isDefined(inv.feeAssetId)) | |
42 | + | then throw("InvokeScriptTransaction - only WAVES is allowed as feeAssetId") | |
43 | + | else if ((addressFromRecipient(inv.dApp) == nodeRegistry)) | |
44 | + | then true | |
45 | + | else if ((addressFromRecipient(inv.dApp) == this)) | |
46 | + | then { | |
47 | + | let lastUpdatedHeight = valueOrElse(getInteger(this, keyLastUpdateHeight()), 0) | |
48 | + | let constrInterval = valueOrElse(getInteger(nodeRegistry, keyConstructorInterval()), 10080) | |
49 | + | if ((constrInterval > (height - lastUpdatedHeight))) | |
50 | + | then throw("InvokeScriptTransaction - impossible to call constructor very often") | |
51 | + | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
52 | + | } | |
53 | + | else throw("InvokeScriptTransaction - invalid dapp address") | |
54 | + | case stx: SetScriptTransaction => | |
55 | + | if ((stx.fee > ((2 * MULT8) / 100))) | |
56 | + | then throw(("SetScriptTransaction - fee amount is greater than max allowed: " + toString(stx.fee))) | |
57 | + | else { | |
58 | + | let scriptBytes = value(stx.script) | |
59 | + | let hash = toBase58String(blake2b256_32Kb(scriptBytes)) | |
60 | + | let allowedHash = valueOrElse(getString(nodeRegistry, keyScriptUpdateHash()), "") | |
61 | + | let validByHash = if ((allowedHash != "")) | |
62 | + | then (allowedHash == hash) | |
63 | + | else false | |
64 | + | let allowToUpdate = valueOrElse(getBoolean(nodeRegistry, keyScriptUpdateAllowance()), false) | |
65 | + | if (allowToUpdate) | |
66 | + | then validByHash | |
67 | + | else false | |
68 | + | } | |
69 | + | case _ => | |
70 | + | throw("not allowed") | |
71 | + | } | |
72 | + |
github/deemru/w8io/0e76f2f 23.97 ms ◑