tx · H2gj8zVDn1KJSbgJtZTJivuHsRany5dwvfSFyZSjEg8a 3N3dmyiBdj7pmjnQrzTTvmfzKSqndSzCMmk: -0.00300000 Waves 2022.07.11 23:51 [2135580] smart account 3N3dmyiBdj7pmjnQrzTTvmfzKSqndSzCMmk > SELF 0.00000000 Waves
{ "type": 13, "id": "H2gj8zVDn1KJSbgJtZTJivuHsRany5dwvfSFyZSjEg8a", "fee": 300000, "feeAssetId": null, "timestamp": 1657572720822, "version": 2, "chainId": 84, "sender": "3N3dmyiBdj7pmjnQrzTTvmfzKSqndSzCMmk", "senderPublicKey": "AR4BeE6hYADMvKxgRQs4ADN3krEqb2j8WE3WfJxzL3zE", "proofs": [ "4o69wfq9vjdTXHrnAA3Nvp2PJH3XKxkYXoRiZRwGs3sJhTT8MKiiecUipyr9qda7ubdVTsY4tuj8ZZGPgg7afmHr" ], "script": "base64:BgINCAISBQoDCAgIEgASAAsABXdhdmVzAIDC1y8ADnRpY2tldFByaWNlSW50AMCEPQALdGlja2V0UHJpY2UFDnRpY2tldFByaWNlSW50AAZpbnZGZWUA0IYDABJ3aXRoZHJhd0ZlZVBlcmNlbnQACgENdHJ5R2V0SW50ZWdlcgEDa2V5BAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAESZ2V0VGlja2V0c0NvdW50S2V5AQ1hZGRyZXNzU3RyaW5nCQCsAgIFDWFkZHJlc3NTdHJpbmcCDV90aWNrZXRzQ291bnQBDWdhbWVXaW5uZXJLZXkBBmdhbWVJZAkArAICBQZnYW1lSWQCB193aW5uZXIBGmFkZHJlc3NBdmFpbGFibGVSZXdhcmRzS2V5AQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCEV9hdmFpbGFibGVSZXdhcmRzAQ9nZXRUaWNrZXRzQ291bnQBDWFkZHJlc3NTdHJpbmcJAQ10cnlHZXRJbnRlZ2VyAQkBEmdldFRpY2tldHNDb3VudEtleQEFDWFkZHJlc3NTdHJpbmcBDWNvbnN1bWVUaWNrZXQBCnBsYXllckFkZHIEEmN1cnJlbnRUaWNrZXRDb3VudAkBD2dldFRpY2tldHNDb3VudAEFCnBsYXllckFkZHIEFW5ld0N1cnJlbnRUaWNrZXRDb3VudAkAZQIFEmN1cnJlbnRUaWNrZXRDb3VudAABAwkAZgIAAAUVbmV3Q3VycmVudFRpY2tldENvdW50AAAFFW5ld0N1cnJlbnRUaWNrZXRDb3VudAMBaQEQc2V0V2lubmVySGVhZHNVcAMGZ2FtZUlkDXdpbm5lckFkZHJTdHIPb3RoZXJQbGF5ZXJBZGRyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKQWRtaW4gT25seQQTYXZhaWxhYmxlUmV3YXJkc0tleQkBGmFkZHJlc3NBdmFpbGFibGVSZXdhcmRzS2V5AQUNd2lubmVyQWRkclN0cgQXY3VycmVudEF2YWlsYWJsZVJld2FyZHMJAQ10cnlHZXRJbnRlZ2VyAQUTYXZhaWxhYmxlUmV3YXJkc0tleQQUbmV3VGlja2V0Q291bnRXaW5uZXIJAQ1jb25zdW1lVGlja2V0AQUNd2lubmVyQWRkclN0cgQZbmV3VGlja2V0Q291bnRPdGhlclBsYXllcgkBDWNvbnN1bWVUaWNrZXQBBQ9vdGhlclBsYXllckFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWdhbWVXaW5uZXJLZXkBBQZnYW1lSWQFDXdpbm5lckFkZHJTdHIJAMwIAgkBDEludGVnZXJFbnRyeQIFE2F2YWlsYWJsZVJld2FyZHNLZXkJAGQCBRdjdXJyZW50QXZhaWxhYmxlUmV3YXJkcwkAaAIFC3RpY2tldFByaWNlAAIJAMwIAgkBDEludGVnZXJFbnRyeQIJARJnZXRUaWNrZXRzQ291bnRLZXkBBQ13aW5uZXJBZGRyU3RyBRRuZXdUaWNrZXRDb3VudFdpbm5lcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmdldFRpY2tldHNDb3VudEtleQEFD290aGVyUGxheWVyQWRkcgUZbmV3VGlja2V0Q291bnRPdGhlclBsYXllcgUDbmlsAWkBD3dpdGhkcmF3UmV3YXJkcwAEDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQXY3VycmVudEF2YWlsYWJsZVJld2FyZHMJAQ10cnlHZXRJbnRlZ2VyAQkBGmFkZHJlc3NBdmFpbGFibGVSZXdhcmRzS2V5AQUNY2FsbGVyQWRkclN0cgQWYWN0dWFsQXZhaWxhYmxlUmV3YXJkcwkAZQIJAGUCBRdjdXJyZW50QXZhaWxhYmxlUmV3YXJkcwUGaW52RmVlCQBrAwUXY3VycmVudEF2YWlsYWJsZVJld2FyZHMFEndpdGhkcmF3RmVlUGVyY2VudABkAwkAZwIAAAUXY3VycmVudEF2YWlsYWJsZVJld2FyZHMJAAIBAiBObyBhdmFpbGFibGUgcmV3YXJkcyB0byB3aXRoZHJhdwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGmFkZHJlc3NBdmFpbGFibGVSZXdhcmRzS2V5AQUNY2FsbGVyQWRkclN0cgAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUWYWN0dWFsQXZhaWxhYmxlUmV3YXJkcwUEdW5pdAUDbmlsAWkBCmJ1eVRpY2tldHMABANwbXQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQCRAwIIBQFpCHBheW1lbnRzAAAJAAIBAiFQbGVhc2UgYXR0YWNoIGV4YWN0bHkgb25lIHBheW1lbnQDCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkCQACAQInVGlja2V0cyBjYW4gb25seSBpYmUgcHVyY2hhc2VkIGluIFdhdmVzAwkBAiE9AggFA3BtdAZhbW91bnQFC3RpY2tldFByaWNlCQACAQkArAICCQCsAgICH1RoZSBwYXltZW50IG11c3QgYmUgb2YgZXhhY3RseSAJAKQDAQUOdGlja2V0UHJpY2VJbnQCBiB3YXZlcwQNY2FsbGVyQWRkclN0cgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBBNjdXJyZW50VGlja2V0c0NvdW50CQENdHJ5R2V0SW50ZWdlcgEJARJnZXRUaWNrZXRzQ291bnRLZXkBBQ1jYWxsZXJBZGRyU3RyCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJARJnZXRUaWNrZXRzQ291bnRLZXkBBQ1jYWxsZXJBZGRyU3RyCQBkAgUTY3VycmVudFRpY2tldHNDb3VudAABBQNuaWwAAQECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXlS9NXI", "height": 2135580, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DkKY6DeRDq5gBNS5gbUauEVEbVvhYx6cW5XCeVDQnic8 Next: DxnMfjvnroe6WCyLmeEwXi3LxxsJdTAgcoUW9vay7pWu Diff:
Old | New | Differences | |
---|---|---|---|
6 | 6 | let ticketPriceInt = 1000000 | |
7 | 7 | ||
8 | 8 | let ticketPrice = ticketPriceInt | |
9 | + | ||
10 | + | let invFee = 50000 | |
11 | + | ||
12 | + | let withdrawFeePercent = 10 | |
9 | 13 | ||
10 | 14 | func tryGetInteger (key) = match getInteger(this, key) { | |
11 | 15 | case b: Int => | |
53 | 57 | func withdrawRewards () = { | |
54 | 58 | let callerAddrStr = toBase58String(i.caller.bytes) | |
55 | 59 | let currentAvailableRewards = tryGetInteger(addressAvailableRewardsKey(callerAddrStr)) | |
60 | + | let actualAvailableRewards = ((currentAvailableRewards - invFee) - fraction(currentAvailableRewards, withdrawFeePercent, 100)) | |
56 | 61 | if ((0 >= currentAvailableRewards)) | |
57 | 62 | then throw("No available rewards to withdraw") | |
58 | - | else [IntegerEntry(addressAvailableRewardsKey(callerAddrStr), 0), ScriptTransfer(i.caller, | |
63 | + | else [IntegerEntry(addressAvailableRewardsKey(callerAddrStr), 0), ScriptTransfer(i.caller, actualAvailableRewards, unit)] | |
59 | 64 | } | |
60 | 65 | ||
61 | 66 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let waves = 100000000 | |
5 | 5 | ||
6 | 6 | let ticketPriceInt = 1000000 | |
7 | 7 | ||
8 | 8 | let ticketPrice = ticketPriceInt | |
9 | + | ||
10 | + | let invFee = 50000 | |
11 | + | ||
12 | + | let withdrawFeePercent = 10 | |
9 | 13 | ||
10 | 14 | func tryGetInteger (key) = match getInteger(this, key) { | |
11 | 15 | case b: Int => | |
12 | 16 | b | |
13 | 17 | case _ => | |
14 | 18 | 0 | |
15 | 19 | } | |
16 | 20 | ||
17 | 21 | ||
18 | 22 | func getTicketsCountKey (addressString) = (addressString + "_ticketsCount") | |
19 | 23 | ||
20 | 24 | ||
21 | 25 | func gameWinnerKey (gameId) = (gameId + "_winner") | |
22 | 26 | ||
23 | 27 | ||
24 | 28 | func addressAvailableRewardsKey (address) = (address + "_availableRewards") | |
25 | 29 | ||
26 | 30 | ||
27 | 31 | func getTicketsCount (addressString) = tryGetInteger(getTicketsCountKey(addressString)) | |
28 | 32 | ||
29 | 33 | ||
30 | 34 | func consumeTicket (playerAddr) = { | |
31 | 35 | let currentTicketCount = getTicketsCount(playerAddr) | |
32 | 36 | let newCurrentTicketCount = (currentTicketCount - 1) | |
33 | 37 | if ((0 > newCurrentTicketCount)) | |
34 | 38 | then 0 | |
35 | 39 | else newCurrentTicketCount | |
36 | 40 | } | |
37 | 41 | ||
38 | 42 | ||
39 | 43 | @Callable(i) | |
40 | 44 | func setWinnerHeadsUp (gameId,winnerAddrStr,otherPlayerAddr) = if ((i.caller != this)) | |
41 | 45 | then throw("Admin Only") | |
42 | 46 | else { | |
43 | 47 | let availableRewardsKey = addressAvailableRewardsKey(winnerAddrStr) | |
44 | 48 | let currentAvailableRewards = tryGetInteger(availableRewardsKey) | |
45 | 49 | let newTicketCountWinner = consumeTicket(winnerAddrStr) | |
46 | 50 | let newTicketCountOtherPlayer = consumeTicket(otherPlayerAddr) | |
47 | 51 | [StringEntry(gameWinnerKey(gameId), winnerAddrStr), IntegerEntry(availableRewardsKey, (currentAvailableRewards + (ticketPrice * 2))), IntegerEntry(getTicketsCountKey(winnerAddrStr), newTicketCountWinner), IntegerEntry(getTicketsCountKey(otherPlayerAddr), newTicketCountOtherPlayer)] | |
48 | 52 | } | |
49 | 53 | ||
50 | 54 | ||
51 | 55 | ||
52 | 56 | @Callable(i) | |
53 | 57 | func withdrawRewards () = { | |
54 | 58 | let callerAddrStr = toBase58String(i.caller.bytes) | |
55 | 59 | let currentAvailableRewards = tryGetInteger(addressAvailableRewardsKey(callerAddrStr)) | |
60 | + | let actualAvailableRewards = ((currentAvailableRewards - invFee) - fraction(currentAvailableRewards, withdrawFeePercent, 100)) | |
56 | 61 | if ((0 >= currentAvailableRewards)) | |
57 | 62 | then throw("No available rewards to withdraw") | |
58 | - | else [IntegerEntry(addressAvailableRewardsKey(callerAddrStr), 0), ScriptTransfer(i.caller, | |
63 | + | else [IntegerEntry(addressAvailableRewardsKey(callerAddrStr), 0), ScriptTransfer(i.caller, actualAvailableRewards, unit)] | |
59 | 64 | } | |
60 | 65 | ||
61 | 66 | ||
62 | 67 | ||
63 | 68 | @Callable(i) | |
64 | 69 | func buyTickets () = { | |
65 | 70 | let pmt = if ((size(i.payments) == 1)) | |
66 | 71 | then i.payments[0] | |
67 | 72 | else throw("Please attach exactly one payment") | |
68 | 73 | if (isDefined(pmt.assetId)) | |
69 | 74 | then throw("Tickets can only ibe purchased in Waves") | |
70 | 75 | else if ((pmt.amount != ticketPrice)) | |
71 | 76 | then throw((("The payment must be of exactly " + toString(ticketPriceInt)) + " waves")) | |
72 | 77 | else { | |
73 | 78 | let callerAddrStr = toBase58String(i.caller.bytes) | |
74 | 79 | let currentTicketsCount = tryGetInteger(getTicketsCountKey(callerAddrStr)) | |
75 | 80 | $Tuple2([IntegerEntry(getTicketsCountKey(callerAddrStr), (currentTicketsCount + 1))], 1) | |
76 | 81 | } | |
77 | 82 | } | |
78 | 83 | ||
79 | 84 | ||
80 | 85 | @Verifier(tx) | |
81 | 86 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
82 | 87 |
github/deemru/w8io/169f3d6 41.00 ms ◑