tx · 9JYKWaPS6XB8LUzaGmP2oLMuA42DSvexEXnczxrtBWmF

3N3dmyiBdj7pmjnQrzTTvmfzKSqndSzCMmk:  -0.00500000 Waves

2022.07.31 01:39 [2163167] smart account 3N3dmyiBdj7pmjnQrzTTvmfzKSqndSzCMmk > SELF 0.00000000 Waves

{ "type": 13, "id": "9JYKWaPS6XB8LUzaGmP2oLMuA42DSvexEXnczxrtBWmF", "fee": 500000, "feeAssetId": null, "timestamp": 1659220877337, "version": 2, "chainId": 84, "sender": "3N3dmyiBdj7pmjnQrzTTvmfzKSqndSzCMmk", "senderPublicKey": "AR4BeE6hYADMvKxgRQs4ADN3krEqb2j8WE3WfJxzL3zE", "proofs": [ "4ko88WWLkQBTXk14mPczLaGerW6Eos6cY4GBJorLqctHB8Lox7vkAw7szMzvqdxDhv45TKn6xMzEQVYWnnNQp4Nj" ], "script": "base64:BgIcCAISAwoBCBIAEgQKAggBEgASBQoDCAgIEgASAA8ABXdhdmVzAIDC1y8ADnRpY2tldFByaWNlSW50AMCEPQALdGlja2V0UHJpY2UFDnRpY2tldFByaWNlSW50AAZpbnZGZWUAoMIeABJ3aXRoZHJhd0ZlZVBlcmNlbnQABQAWZmVlQ29sbGVjdG9yQWRkcmVzc0tleQITZmVlQ29sbGVjdG9yQWRkcmVzcwENdHJ5R2V0SW50ZWdlcgEDa2V5BAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAESZ2V0VGlja2V0c0NvdW50S2V5AQ1hZGRyZXNzU3RyaW5nCQCsAgIFDWFkZHJlc3NTdHJpbmcCDV90aWNrZXRzQ291bnQBDWdhbWVXaW5uZXJLZXkBBmdhbWVJZAkArAICBQZnYW1lSWQCB193aW5uZXIBGGFkZHJlc3NBdmFpbGFibGVGdW5kc0tleQEHYWRkcmVzcwkArAICBQdhZGRyZXNzAg9fYXZhaWxhYmxlRnVuZHMBGmFkZHJlc3NUb3RhbExvY2tlZEZ1bmRzS2V5AQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCEV90b3RhbExvY2tlZEZ1bmRzARlhZGRyZXNzTG9ja2VkRnVuZHNGb3JHYW1lAgdhZGRyZXNzBmdhbWVJZAkArAICCQCsAgIFB2FkZHJlc3MCDV9Mb2NrZWRGdW5kc18FBmdhbWVJZAEaYWRkcmVzc0F2YWlsYWJsZVJld2FyZHNLZXkBB2FkZHJlc3MJAKwCAgUHYWRkcmVzcwIRX2F2YWlsYWJsZVJld2FyZHMBD2dldFRpY2tldHNDb3VudAENYWRkcmVzc1N0cmluZwkBDXRyeUdldEludGVnZXIBCQESZ2V0VGlja2V0c0NvdW50S2V5AQUNYWRkcmVzc1N0cmluZwENY29uc3VtZVRpY2tldAEKcGxheWVyQWRkcgQSY3VycmVudFRpY2tldENvdW50CQEPZ2V0VGlja2V0c0NvdW50AQUKcGxheWVyQWRkcgQVbmV3Q3VycmVudFRpY2tldENvdW50CQBlAgUSY3VycmVudFRpY2tldENvdW50AAEDCQBmAgAABRVuZXdDdXJyZW50VGlja2V0Q291bnQAAAUVbmV3Q3VycmVudFRpY2tldENvdW50BwFpARZzZXRGZWVDb2xsZWN0b3JBZGRyZXNzAQ1jb2xsZWN0b3JBZGRyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKQWRtaW4gT25seQkAzAgCCQELU3RyaW5nRW50cnkCBRZmZWVDb2xsZWN0b3JBZGRyZXNzS2V5BQ1jb2xsZWN0b3JBZGRyBQNuaWwBaQEMZGVwb3NpdEZ1bmRzAAQDcG10AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAACQACAQIhUGxlYXNlIGF0dGFjaCBleGFjdGx5IG9uZSBwYXltZW50AwkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAkAAgECGVlvdSBjYW4gb25seSBkZXBvc2l0IFVTRE4EDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYYWRkcmVzc0F2YWlsYWJsZUZ1bmRzS2V5AQUNY2FsbGVyQWRkclN0cggFA3BtdAZhbW91bnQFA25pbAABAWkBEGxvY2tGdW5kc0ZvckdhbWUCBmdhbWVJZAxhbW91bnRUb0xvY2sEDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQVY3VycmVudEF2YWlsYWJsZUZ1bmRzCQENdHJ5R2V0SW50ZWdlcgEJARhhZGRyZXNzQXZhaWxhYmxlRnVuZHNLZXkBBQ1jYWxsZXJBZGRyU3RyBBdjdXJyZW50VG90YWxMb2NrZWRGdW5kcwkBDXRyeUdldEludGVnZXIBCQEaYWRkcmVzc1RvdGFsTG9ja2VkRnVuZHNLZXkBBQ1jYWxsZXJBZGRyU3RyAwkAZgIFDGFtb3VudFRvTG9jawUVY3VycmVudEF2YWlsYWJsZUZ1bmRzCQACAQIiTm90IGVub3VnaCBhdmFpbGFibGUgZnVuZHMgdG8gbG9jawkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYYWRkcmVzc0F2YWlsYWJsZUZ1bmRzS2V5AQUNY2FsbGVyQWRkclN0cgkAZQIFFWN1cnJlbnRBdmFpbGFibGVGdW5kcwUMYW1vdW50VG9Mb2NrCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEaYWRkcmVzc1RvdGFsTG9ja2VkRnVuZHNLZXkBBQ1jYWxsZXJBZGRyU3RyCQBkAgUXY3VycmVudFRvdGFsTG9ja2VkRnVuZHMFDGFtb3VudFRvTG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGWFkZHJlc3NMb2NrZWRGdW5kc0ZvckdhbWUCBQ1jYWxsZXJBZGRyU3RyBQZnYW1lSWQFDGFtb3VudFRvTG9jawUDbmlsAAEBaQENd2l0aGRyYXdGdW5kcwAEDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQQZmVlQ29sbGVjdG9yQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQUWZmVlQ29sbGVjdG9yQWRkcmVzc0tleQQVY3VycmVudEF2YWlsYWJsZUZ1bmRzCQENdHJ5R2V0SW50ZWdlcgEJARhhZGRyZXNzQXZhaWxhYmxlRnVuZHNLZXkBBQ1jYWxsZXJBZGRyU3RyBAt3aXRoZHJhd0ZlZQkAawMFFWN1cnJlbnRBdmFpbGFibGVGdW5kcwUSd2l0aGRyYXdGZWVQZXJjZW50AGQEFGFjdHVhbEF2YWlsYWJsZUZ1bmRzCQBlAgUVY3VycmVudEF2YWlsYWJsZUZ1bmRzBQt3aXRoZHJhd0ZlZQMJAGcCAAAFFGFjdHVhbEF2YWlsYWJsZUZ1bmRzCQACAQIeTm8gYXZhaWxhYmxlIGZ1bmRzIHRvIHdpdGhkcmF3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYYWRkcmVzc0F2YWlsYWJsZUZ1bmRzS2V5AQUNY2FsbGVyQWRkclN0cgAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUUYWN0dWFsQXZhaWxhYmxlRnVuZHMFBHVuaXQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUQZmVlQ29sbGVjdG9yQWRkcgULd2l0aGRyYXdGZWUFBHVuaXQFA25pbAFpARBzZXRXaW5uZXJIZWFkc1VwAwZnYW1lSWQNd2lubmVyQWRkclN0cg9vdGhlclBsYXllckFkZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgpBZG1pbiBPbmx5BBNhdmFpbGFibGVSZXdhcmRzS2V5CQEaYWRkcmVzc0F2YWlsYWJsZVJld2FyZHNLZXkBBQ13aW5uZXJBZGRyU3RyBBdjdXJyZW50QXZhaWxhYmxlUmV3YXJkcwkBDXRyeUdldEludGVnZXIBBRNhdmFpbGFibGVSZXdhcmRzS2V5BBRuZXdUaWNrZXRDb3VudFdpbm5lcgkBDWNvbnN1bWVUaWNrZXQBBQ13aW5uZXJBZGRyU3RyBBluZXdUaWNrZXRDb3VudE90aGVyUGxheWVyCQENY29uc3VtZVRpY2tldAEFD290aGVyUGxheWVyQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCCQENZ2FtZVdpbm5lcktleQEFBmdhbWVJZAUNd2lubmVyQWRkclN0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgUTYXZhaWxhYmxlUmV3YXJkc0tleQkAZAIFF2N1cnJlbnRBdmFpbGFibGVSZXdhcmRzCQBoAgULdGlja2V0UHJpY2UAAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmdldFRpY2tldHNDb3VudEtleQEFDXdpbm5lckFkZHJTdHIFFG5ld1RpY2tldENvdW50V2lubmVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESZ2V0VGlja2V0c0NvdW50S2V5AQUPb3RoZXJQbGF5ZXJBZGRyBRluZXdUaWNrZXRDb3VudE90aGVyUGxheWVyBQNuaWwBaQEPd2l0aGRyYXdSZXdhcmRzAAQNY2FsbGVyQWRkclN0cgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBBBmZWVDb2xsZWN0b3JBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1OCkBBRZmZWVDb2xsZWN0b3JBZGRyZXNzS2V5BBdjdXJyZW50QXZhaWxhYmxlUmV3YXJkcwkBDXRyeUdldEludGVnZXIBCQEaYWRkcmVzc0F2YWlsYWJsZVJld2FyZHNLZXkBBQ1jYWxsZXJBZGRyU3RyBAt3aXRoZHJhd0ZlZQkAawMFF2N1cnJlbnRBdmFpbGFibGVSZXdhcmRzBRJ3aXRoZHJhd0ZlZVBlcmNlbnQAZAQWYWN0dWFsQXZhaWxhYmxlUmV3YXJkcwkAZQIJAGUCBRdjdXJyZW50QXZhaWxhYmxlUmV3YXJkcwUGaW52RmVlBQt3aXRoZHJhd0ZlZQMJAGcCAAAFF2N1cnJlbnRBdmFpbGFibGVSZXdhcmRzCQACAQIgTm8gYXZhaWxhYmxlIHJld2FyZHMgdG8gd2l0aGRyYXcJAMwIAgkBDEludGVnZXJFbnRyeQIJARphZGRyZXNzQXZhaWxhYmxlUmV3YXJkc0tleQEFDWNhbGxlckFkZHJTdHIAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFFmFjdHVhbEF2YWlsYWJsZVJld2FyZHMFBHVuaXQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUQZmVlQ29sbGVjdG9yQWRkcgULd2l0aGRyYXdGZWUFBHVuaXQFA25pbAFpAQpidXlUaWNrZXRzAAQDcG10AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAACQACAQIhUGxlYXNlIGF0dGFjaCBleGFjdGx5IG9uZSBwYXltZW50AwkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAkAAgECJ1RpY2tldHMgY2FuIG9ubHkgaWJlIHB1cmNoYXNlZCBpbiBXYXZlcwMJAQIhPQIIBQNwbXQGYW1vdW50BQt0aWNrZXRQcmljZQkAAgEJAKwCAgkArAICAh9UaGUgcGF5bWVudCBtdXN0IGJlIG9mIGV4YWN0bHkgCQCkAwEFDnRpY2tldFByaWNlSW50AgYgd2F2ZXMEDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQTY3VycmVudFRpY2tldHNDb3VudAkBDXRyeUdldEludGVnZXIBCQESZ2V0VGlja2V0c0NvdW50S2V5AQUNY2FsbGVyQWRkclN0cgkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESZ2V0VGlja2V0c0NvdW50S2V5AQUNY2FsbGVyQWRkclN0cgkAZAIFE2N1cnJlbnRUaWNrZXRzQ291bnQAAQUDbmlsAAEBAnR4AQZ2ZXJpZnkACQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5cRk3ng==", "height": 2163167, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BFPQYPEHQ8S5prJqM48KBJEP3QA8RbTaLGvvgH46qqEp Next: D7jnBhUFhJ2cbCEEHRXR6wcBdVX587wXSiaQ2B1URxSW Diff:
OldNewDifferences
2828
2929
3030 func addressAvailableFundsKey (address) = (address + "_availableFunds")
31+
32+
33+func addressTotalLockedFundsKey (address) = (address + "_totalLockedFunds")
34+
35+
36+func addressLockedFundsForGame (address,gameId) = ((address + "_LockedFunds_") + gameId)
3137
3238
3339 func addressAvailableRewardsKey (address) = (address + "_availableRewards")
6369 let callerAddrStr = toBase58String(i.caller.bytes)
6470 $Tuple2([IntegerEntry(addressAvailableFundsKey(callerAddrStr), pmt.amount)], 1)
6571 }
72+ }
73+
74+
75+
76+@Callable(i)
77+func lockFundsForGame (gameId,amountToLock) = {
78+ let callerAddrStr = toBase58String(i.caller.bytes)
79+ let currentAvailableFunds = tryGetInteger(addressAvailableFundsKey(callerAddrStr))
80+ let currentTotalLockedFunds = tryGetInteger(addressTotalLockedFundsKey(callerAddrStr))
81+ if ((amountToLock > currentAvailableFunds))
82+ then throw("Not enough available funds to lock")
83+ else $Tuple2([IntegerEntry(addressAvailableFundsKey(callerAddrStr), (currentAvailableFunds - amountToLock)), IntegerEntry(addressTotalLockedFundsKey(callerAddrStr), (currentTotalLockedFunds + amountToLock)), IntegerEntry(addressLockedFundsForGame(callerAddrStr, gameId), amountToLock)], 1)
6684 }
6785
6886
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let waves = 100000000
55
66 let ticketPriceInt = 1000000
77
88 let ticketPrice = ticketPriceInt
99
1010 let invFee = 500000
1111
1212 let withdrawFeePercent = 5
1313
1414 let feeCollectorAddressKey = "feeCollectorAddress"
1515
1616 func tryGetInteger (key) = match getInteger(this, key) {
1717 case b: Int =>
1818 b
1919 case _ =>
2020 0
2121 }
2222
2323
2424 func getTicketsCountKey (addressString) = (addressString + "_ticketsCount")
2525
2626
2727 func gameWinnerKey (gameId) = (gameId + "_winner")
2828
2929
3030 func addressAvailableFundsKey (address) = (address + "_availableFunds")
31+
32+
33+func addressTotalLockedFundsKey (address) = (address + "_totalLockedFunds")
34+
35+
36+func addressLockedFundsForGame (address,gameId) = ((address + "_LockedFunds_") + gameId)
3137
3238
3339 func addressAvailableRewardsKey (address) = (address + "_availableRewards")
3440
3541
3642 func getTicketsCount (addressString) = tryGetInteger(getTicketsCountKey(addressString))
3743
3844
3945 func consumeTicket (playerAddr) = {
4046 let currentTicketCount = getTicketsCount(playerAddr)
4147 let newCurrentTicketCount = (currentTicketCount - 1)
4248 if ((0 > newCurrentTicketCount))
4349 then 0
4450 else newCurrentTicketCount
4551 }
4652
4753
4854 @Callable(i)
4955 func setFeeCollectorAddress (collectorAddr) = if ((i.caller != this))
5056 then throw("Admin Only")
5157 else [StringEntry(feeCollectorAddressKey, collectorAddr)]
5258
5359
5460
5561 @Callable(i)
5662 func depositFunds () = {
5763 let pmt = if ((size(i.payments) == 1))
5864 then i.payments[0]
5965 else throw("Please attach exactly one payment")
6066 if (isDefined(pmt.assetId))
6167 then throw("You can only deposit USDN")
6268 else {
6369 let callerAddrStr = toBase58String(i.caller.bytes)
6470 $Tuple2([IntegerEntry(addressAvailableFundsKey(callerAddrStr), pmt.amount)], 1)
6571 }
72+ }
73+
74+
75+
76+@Callable(i)
77+func lockFundsForGame (gameId,amountToLock) = {
78+ let callerAddrStr = toBase58String(i.caller.bytes)
79+ let currentAvailableFunds = tryGetInteger(addressAvailableFundsKey(callerAddrStr))
80+ let currentTotalLockedFunds = tryGetInteger(addressTotalLockedFundsKey(callerAddrStr))
81+ if ((amountToLock > currentAvailableFunds))
82+ then throw("Not enough available funds to lock")
83+ else $Tuple2([IntegerEntry(addressAvailableFundsKey(callerAddrStr), (currentAvailableFunds - amountToLock)), IntegerEntry(addressTotalLockedFundsKey(callerAddrStr), (currentTotalLockedFunds + amountToLock)), IntegerEntry(addressLockedFundsForGame(callerAddrStr, gameId), amountToLock)], 1)
6684 }
6785
6886
6987
7088 @Callable(i)
7189 func withdrawFunds () = {
7290 let callerAddrStr = toBase58String(i.caller.bytes)
7391 let feeCollectorAddr = addressFromStringValue(getStringValue(feeCollectorAddressKey))
7492 let currentAvailableFunds = tryGetInteger(addressAvailableFundsKey(callerAddrStr))
7593 let withdrawFee = fraction(currentAvailableFunds, withdrawFeePercent, 100)
7694 let actualAvailableFunds = (currentAvailableFunds - withdrawFee)
7795 if ((0 >= actualAvailableFunds))
7896 then throw("No available funds to withdraw")
7997 else [IntegerEntry(addressAvailableFundsKey(callerAddrStr), 0), ScriptTransfer(i.caller, actualAvailableFunds, unit), ScriptTransfer(feeCollectorAddr, withdrawFee, unit)]
8098 }
8199
82100
83101
84102 @Callable(i)
85103 func setWinnerHeadsUp (gameId,winnerAddrStr,otherPlayerAddr) = if ((i.caller != this))
86104 then throw("Admin Only")
87105 else {
88106 let availableRewardsKey = addressAvailableRewardsKey(winnerAddrStr)
89107 let currentAvailableRewards = tryGetInteger(availableRewardsKey)
90108 let newTicketCountWinner = consumeTicket(winnerAddrStr)
91109 let newTicketCountOtherPlayer = consumeTicket(otherPlayerAddr)
92110 [StringEntry(gameWinnerKey(gameId), winnerAddrStr), IntegerEntry(availableRewardsKey, (currentAvailableRewards + (ticketPrice * 2))), IntegerEntry(getTicketsCountKey(winnerAddrStr), newTicketCountWinner), IntegerEntry(getTicketsCountKey(otherPlayerAddr), newTicketCountOtherPlayer)]
93111 }
94112
95113
96114
97115 @Callable(i)
98116 func withdrawRewards () = {
99117 let callerAddrStr = toBase58String(i.caller.bytes)
100118 let feeCollectorAddr = addressFromStringValue(getStringValue(feeCollectorAddressKey))
101119 let currentAvailableRewards = tryGetInteger(addressAvailableRewardsKey(callerAddrStr))
102120 let withdrawFee = fraction(currentAvailableRewards, withdrawFeePercent, 100)
103121 let actualAvailableRewards = ((currentAvailableRewards - invFee) - withdrawFee)
104122 if ((0 >= currentAvailableRewards))
105123 then throw("No available rewards to withdraw")
106124 else [IntegerEntry(addressAvailableRewardsKey(callerAddrStr), 0), ScriptTransfer(i.caller, actualAvailableRewards, unit), ScriptTransfer(feeCollectorAddr, withdrawFee, unit)]
107125 }
108126
109127
110128
111129 @Callable(i)
112130 func buyTickets () = {
113131 let pmt = if ((size(i.payments) == 1))
114132 then i.payments[0]
115133 else throw("Please attach exactly one payment")
116134 if (isDefined(pmt.assetId))
117135 then throw("Tickets can only ibe purchased in Waves")
118136 else if ((pmt.amount != ticketPrice))
119137 then throw((("The payment must be of exactly " + toString(ticketPriceInt)) + " waves"))
120138 else {
121139 let callerAddrStr = toBase58String(i.caller.bytes)
122140 let currentTicketsCount = tryGetInteger(getTicketsCountKey(callerAddrStr))
123141 $Tuple2([IntegerEntry(getTicketsCountKey(callerAddrStr), (currentTicketsCount + 1))], 1)
124142 }
125143 }
126144
127145
128146 @Verifier(tx)
129147 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
130148

github/deemru/w8io/169f3d6 
27.81 ms