tx · 5QnrPNj3XpWY6MobQruy1WQfvxywGkTr6UXPTN6mM4ot 3PEwRcYNAUtoFvKpBhKoiwajnZfdoDR6h4h: -0.00700000 Waves 2023.07.12 18:16 [3728472] smart account 3PEwRcYNAUtoFvKpBhKoiwajnZfdoDR6h4h > SELF 0.00000000 Waves
{ "type": 13, "id": "5QnrPNj3XpWY6MobQruy1WQfvxywGkTr6UXPTN6mM4ot", "fee": 700000, "feeAssetId": null, "timestamp": 1689175079023, "version": 1, "sender": "3PEwRcYNAUtoFvKpBhKoiwajnZfdoDR6h4h", "senderPublicKey": "GDPfYHA6NUZCmin3J7LWZhCvSjBcna8HebyvQyrw17v", "proofs": [ "4Eqr729SPxTxH9K3AwYfUxGa2WsDbLpY3U3y9GrtwrAYSyQjsB5p5Z4oAthBDkAqTPxsXa1XsTVX26HeopBqNdmv" ], "script": "base64:BgIKCAISBAoCAQgSAAUBFXdhdmVsZXRzUGVyQmxvY2tTdG9yZQEHYWRkcmVzcwkArAICBQdhZGRyZXNzAhNfd2F2ZWxldHNfcGVyX2Jsb2NrARBzdGFydEhlaWdodFN0b3JlAQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCDV9zdGFydF9oZWlnaHQBDGNsYWltZWRTdG9yZQEHYWRkcmVzcwkArAICBQdhZGRyZXNzAhB3YXZlbGV0c19jbGFpbWVkAAhzdW1TdG9yZQIWd2F2ZWxldHNfcGVyX2Jsb2NrX3N1bQAHbWF4aW11bQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAhZ3YXZlbGV0c19wZXJfYmxvY2tfbWF4AICEr18CAWkBCnNldFNjZWR1bGUCEHdhdmVsZXRzUGVyQmxvY2sHYWRkcmVzcwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECDmludmFsaWQgY2FsbGVyAwkAZgIAAAUQd2F2ZWxldHNQZXJCbG9jawkAAgECH3dhdmVsZXRzUGVyQmxvY2sgc2hvdWxkIGJlID49IDAEDXBlckJsb2NrU3RvcmUJARV3YXZlbGV0c1BlckJsb2NrU3RvcmUBBQdhZGRyZXNzBAtvbGRQZXJCbG9jawkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ1wZXJCbG9ja1N0b3JlAAAEA3N1bQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQhzdW1TdG9yZQAABAZuZXdTdW0JAGQCCQBlAgUDc3VtBQtvbGRQZXJCbG9jawUQd2F2ZWxldHNQZXJCbG9jawMJAGYCBQZuZXdTdW0FB21heGltdW0JAAIBAhBtYXhpbXVtIGV4Y2VlZGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1wZXJCbG9ja1N0b3JlBRB3YXZlbGV0c1BlckJsb2NrCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQc3RhcnRIZWlnaHRTdG9yZQEFB2FkZHJlc3MFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDGNsYWltZWRTdG9yZQEFB2FkZHJlc3MAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUIc3VtU3RvcmUFBm5ld1N1bQUDbmlsAWkBBWNsYWltAAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIECHBlckJsb2NrCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkBFXdhdmVsZXRzUGVyQmxvY2tTdG9yZQEFB2FkZHJlc3MCG2FkZHJlc3MgcGVyIGJsb2NrIG5vdCBmb3VuZAQLc3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQEQc3RhcnRIZWlnaHRTdG9yZQEFB2FkZHJlc3MCHmFkZHJlc3Mgc3RhcnQgaGVpZ2h0IG5vdCBmb3VuZAQHY2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEMY2xhaW1lZFN0b3JlAQUHYWRkcmVzcwAABAZibG9ja3MJAGUCBQZoZWlnaHQFC3N0YXJ0SGVpZ2h0BAZhbW91bnQJAGUCCQBoAgUIcGVyQmxvY2sFBmJsb2NrcwUHY2xhaW1lZAQHcGF5bWVudAkAlwMBCQDMCAIICQDvBwEFBHRoaXMHcmVndWxhcgkAzAgCBQZhbW91bnQFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB3BheW1lbnQFBHVuaXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxjbGFpbWVkU3RvcmUBBQdhZGRyZXNzCQBkAgUHY2xhaW1lZAUHcGF5bWVudAUDbmlsAQJ0eAEGdmVyaWZ5AAQIYnlWb3RpbmcEDWNvbmZpZ0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQECIzNQR1dodHZDU3oxVFJKaGUzQkpTcnZRaWdydEt1eVhzZ21hBA12b3RpbmdSZXN1bHRzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCFmNvbnRyYWN0X3ZvdGluZ19yZXN1bHQCGW5vIGNvbnRyYWN0X3ZvdGluZ19yZXN1bHQCHmludmFsaWQgY29udHJhY3Rfdm90aW5nX3Jlc3VsdAoBDm9wQWxsb3dlZFN0b3JlAQJvcAkArAICCQCsAgICA29wXwUCb3ACCF9hbGxvd2VkBAdlbmFibGVkCQELdmFsdWVPckVsc2UCCQCbCAIFDWNvbmZpZ0FkZHJlc3MJAQ5vcEFsbG93ZWRTdG9yZQECGWNoaWxkX2dvdmVybmFuY2VfYXBwbHlfdHgGAwkBASEBBQdlbmFibGVkCQACAQIrdHggYXBwbGljYXRpb24gdGhyb3cgZ292ZXJuYW5jZSBub3QgZW5hYmxlZAkAZwIFBmhlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgUNdm90aW5nUmVzdWx0cwkArAICCQCsAgIJAKwCAgIZcHJvcG9zYWxfYWxsb3dfYnJvYWRjYXN0XwkApQgBBQR0aGlzAgFfCQDYBAEIBQJ0eAJpZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkGBQhieVZvdGluZ+cSjDU=", "chainId": 87, "height": 3728472, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DxzVZ5pnMYtAv2eyHinXwgtexsFg7bFGFaxMB7jxYSRi Next: 54eLdMmLT8BDDcDsNuey9HsP7aGVgFPZiBEgRAgutQaB Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | + | func waveletsPerBlockStore (address) = (address + "_wavelets_per_block") | |
4 | 5 | ||
6 | + | ||
7 | + | func startHeightStore (address) = (address + "_start_height") | |
8 | + | ||
9 | + | ||
10 | + | func claimedStore (address) = (address + "wavelets_claimed") | |
11 | + | ||
12 | + | ||
13 | + | let sumStore = "wavelets_per_block_sum" | |
14 | + | ||
15 | + | let maximum = valueOrElse(getInteger(this, "wavelets_per_block_max"), 200000000) | |
16 | + | ||
17 | + | @Callable(i) | |
18 | + | func setScedule (waveletsPerBlock,address) = if ((i.caller != this)) | |
19 | + | then throw("invalid caller") | |
20 | + | else if ((0 > waveletsPerBlock)) | |
21 | + | then throw("waveletsPerBlock should be >= 0") | |
22 | + | else { | |
23 | + | let perBlockStore = waveletsPerBlockStore(address) | |
24 | + | let oldPerBlock = valueOrElse(getInteger(perBlockStore), 0) | |
25 | + | let sum = valueOrElse(getInteger(sumStore), 0) | |
26 | + | let newSum = ((sum - oldPerBlock) + waveletsPerBlock) | |
27 | + | if ((newSum > maximum)) | |
28 | + | then throw("maximum exceeded") | |
29 | + | else [IntegerEntry(perBlockStore, waveletsPerBlock), IntegerEntry(startHeightStore(address), height), IntegerEntry(claimedStore(address), 0), IntegerEntry(sumStore, newSum)] | |
30 | + | } | |
31 | + | ||
32 | + | ||
33 | + | ||
34 | + | @Callable(i) | |
35 | + | func claim () = { | |
36 | + | let address = toString(i.caller) | |
37 | + | let perBlock = valueOrErrorMessage(getInteger(this, waveletsPerBlockStore(address)), "address per block not found") | |
38 | + | let startHeight = valueOrErrorMessage(getInteger(this, startHeightStore(address)), "address start height not found") | |
39 | + | let claimed = valueOrElse(getInteger(this, claimedStore(address)), 0) | |
40 | + | let blocks = (height - startHeight) | |
41 | + | let amount = ((perBlock * blocks) - claimed) | |
42 | + | let payment = min([wavesBalance(this).regular, amount]) | |
43 | + | [ScriptTransfer(i.caller, payment, unit), IntegerEntry(claimedStore(address), (claimed + payment))] | |
44 | + | } | |
5 | 45 | ||
6 | 46 | ||
7 | 47 | @Verifier(tx) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | + | func waveletsPerBlockStore (address) = (address + "_wavelets_per_block") | |
4 | 5 | ||
6 | + | ||
7 | + | func startHeightStore (address) = (address + "_start_height") | |
8 | + | ||
9 | + | ||
10 | + | func claimedStore (address) = (address + "wavelets_claimed") | |
11 | + | ||
12 | + | ||
13 | + | let sumStore = "wavelets_per_block_sum" | |
14 | + | ||
15 | + | let maximum = valueOrElse(getInteger(this, "wavelets_per_block_max"), 200000000) | |
16 | + | ||
17 | + | @Callable(i) | |
18 | + | func setScedule (waveletsPerBlock,address) = if ((i.caller != this)) | |
19 | + | then throw("invalid caller") | |
20 | + | else if ((0 > waveletsPerBlock)) | |
21 | + | then throw("waveletsPerBlock should be >= 0") | |
22 | + | else { | |
23 | + | let perBlockStore = waveletsPerBlockStore(address) | |
24 | + | let oldPerBlock = valueOrElse(getInteger(perBlockStore), 0) | |
25 | + | let sum = valueOrElse(getInteger(sumStore), 0) | |
26 | + | let newSum = ((sum - oldPerBlock) + waveletsPerBlock) | |
27 | + | if ((newSum > maximum)) | |
28 | + | then throw("maximum exceeded") | |
29 | + | else [IntegerEntry(perBlockStore, waveletsPerBlock), IntegerEntry(startHeightStore(address), height), IntegerEntry(claimedStore(address), 0), IntegerEntry(sumStore, newSum)] | |
30 | + | } | |
31 | + | ||
32 | + | ||
33 | + | ||
34 | + | @Callable(i) | |
35 | + | func claim () = { | |
36 | + | let address = toString(i.caller) | |
37 | + | let perBlock = valueOrErrorMessage(getInteger(this, waveletsPerBlockStore(address)), "address per block not found") | |
38 | + | let startHeight = valueOrErrorMessage(getInteger(this, startHeightStore(address)), "address start height not found") | |
39 | + | let claimed = valueOrElse(getInteger(this, claimedStore(address)), 0) | |
40 | + | let blocks = (height - startHeight) | |
41 | + | let amount = ((perBlock * blocks) - claimed) | |
42 | + | let payment = min([wavesBalance(this).regular, amount]) | |
43 | + | [ScriptTransfer(i.caller, payment, unit), IntegerEntry(claimedStore(address), (claimed + payment))] | |
44 | + | } | |
5 | 45 | ||
6 | 46 | ||
7 | 47 | @Verifier(tx) | |
8 | 48 | func verify () = { | |
9 | 49 | let byVoting = { | |
10 | 50 | let configAddress = addressFromStringValue("3PGWhtvCSz1TRJhe3BJSrvQigrtKuyXsgma") | |
11 | 51 | let votingResults = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_voting_result"), "no contract_voting_result")), "invalid contract_voting_result") | |
12 | 52 | func opAllowedStore (op) = (("op_" + op) + "_allowed") | |
13 | 53 | ||
14 | 54 | let enabled = valueOrElse(getBoolean(configAddress, opAllowedStore("child_governance_apply_tx")), true) | |
15 | 55 | if (!(enabled)) | |
16 | 56 | then throw("tx application throw governance not enabled") | |
17 | 57 | else (height >= getIntegerValue(votingResults, ((("proposal_allow_broadcast_" + toString(this)) + "_") + toBase58String(tx.id)))) | |
18 | 58 | } | |
19 | 59 | if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)) | |
20 | 60 | then true | |
21 | 61 | else byVoting | |
22 | 62 | } | |
23 | 63 |
github/deemru/w8io/3ef1775 23.70 ms ◑