tx · DJJFE6k83nSDLzHbsbHfStV2aCsxg92EUc3aAjKENj7u

3MvCLdwRiQSNrhgumfFunsbyUJUw6ViTMwB:  -0.05000000 Waves

2021.08.21 17:16 [1668199] smart account 3MvCLdwRiQSNrhgumfFunsbyUJUw6ViTMwB > SELF 0.00000000 Waves

{ "type": 13, "id": "DJJFE6k83nSDLzHbsbHfStV2aCsxg92EUc3aAjKENj7u", "fee": 5000000, "feeAssetId": null, "timestamp": 1629555418390, "version": 2, "chainId": 84, "sender": "3MvCLdwRiQSNrhgumfFunsbyUJUw6ViTMwB", "senderPublicKey": "9Vbnf3b9hhuCerzPXf38mLo8mUGTPNVW3jtQRbymjaSw", "proofs": [ "XGDsBPGJ9WwQ97Z37AzupwGk43m9fCZcV6M9Qy2zKZa9UC1nreAho5Qzweah9J6uQVKA1ZrWotVkp8F97Svjjop" ], "script": "base64:AAIFAAAAAAAAADoIAhIGCgQBAQEBEgMKAQESAwoBARIDCgEBEgMKAQESAwoBARIECgIBCBIFCgMBCAgSAwoBARIDCgEBAAAALAAAAAAQaW5jdWJhdG9yQWRkcmVzcwEAAAAaAVQu1YzRxAHn1ekAzs1AJJ6xFAc06V7PK6oAAAAADmJyZWVkZXJBZGRyZXNzAQAAABoBVC7VjNHEAefV6QDOzUAknrEUBzTpXs8rqgAAAAAOZmFybWluZ0FkZHJlc3MBAAAAGgFU8jY5wCvKx9IdZ1jq9byeNi+peiAgajPTAAAAAAtlZ2dzQXNzZXRJZAEAAAAgJQJlzPcEaMi+AVmReOVYWjhmFBOtSkxKt/4FF0gXFoMAAAAACG1ha2VyRmVlAAAAAAAAAAABAAAAAAh0YWtlckZlZQAAAAAAAAAAAQAAAAAFU0xPVFMAAAAAAAAAAAoAAAAAB1dBSVRJTkcAAAAAAAAAAAUAAAAADHN0ZXBEdXJhdGlvbgAAAAAAAAAAAwEAAAANdHJ5R2V0SW50ZWdlcgAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFiBQAAAAckbWF0Y2gwBQAAAAFiAAAAAAAAAAAAAQAAAAx0cnlHZXRTdHJpbmcAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQIAAAAAAQAAAA10cnlHZXRCb29sZWFuAAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQbAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAdCb29sZWFuBAAAAAFiBQAAAAckbWF0Y2gwBQAAAAFiBwEAAAANZ2V0TmV4dEdhbWVJZAAAAAAEAAAABm5leHRJZAkBAAAADXRyeUdldEludGVnZXIAAAABAgAAAApuZXh0R2FtZUlkAwkAAAAAAAACBQAAAAZuZXh0SWQAAAAAAAAAAAAAAAAAAAAAAAEFAAAABm5leHRJZAEAAAAXZ2V0UGxheWVyQ3VycmVudEdhbWVLZXkAAAABAAAAB2FkZHJlc3MJAAEsAAAAAgIAAAAMY3VycmVudEdhbWVfBQAAAAdhZGRyZXNzAQAAABRnZXRQbGF5ZXJDdXJyZW50R2FtZQAAAAEAAAAHYWRkcmVzcwkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAXZ2V0UGxheWVyQ3VycmVudEdhbWVLZXkAAAABBQAAAAdhZGRyZXNzAQAAAApnZXRTbG90S2V5AAAAAQAAAARzbG90CQABLAAAAAICAAAABXNsb3RfCQABpAAAAAEFAAAABHNsb3QBAAAAB2dldFNsb3QAAAABAAAABHNsb3QJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAACmdldFNsb3RLZXkAAAABBQAAAARzbG90AQAAAAtnZXRNYWtlcktleQAAAAEAAAAGZ2FtZUlkCQABLAAAAAIJAAEsAAAAAgIAAAAFZ2FtZV8JAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAZfbWFrZXIBAAAACGdldE1ha2VyAAAAAQAAAAZnYW1lSWQJAQAAAAx0cnlHZXRTdHJpbmcAAAABCQEAAAALZ2V0TWFrZXJLZXkAAAABBQAAAAZnYW1lSWQBAAAAC2dldFRha2VyS2V5AAAAAQAAAAZnYW1lSWQJAAEsAAAAAgkAASwAAAACAgAAAAVnYW1lXwkAAaQAAAABBQAAAAZnYW1lSWQCAAAABl90YWtlcgEAAAAIZ2V0VGFrZXIAAAABAAAABmdhbWVJZAkBAAAADHRyeUdldFN0cmluZwAAAAEJAQAAAAtnZXRUYWtlcktleQAAAAEFAAAABmdhbWVJZAEAAAANZ2V0QmV0RWdnc0tleQAAAAEAAAAGZ2FtZUlkCQABLAAAAAIJAAEsAAAAAgIAAAAFZ2FtZV8JAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAhfYmV0RWdncwEAAAAKZ2V0QmV0RWdncwAAAAEAAAAGZ2FtZUlkCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAAA1nZXRCZXRFZ2dzS2V5AAAAAQUAAAAGZ2FtZUlkAQAAAB1nZXRXYWl0aW5nRXhwaXJhdGlvbkhlaWdodEtleQAAAAEAAAAGZ2FtZUlkCQABLAAAAAIJAAEsAAAAAgIAAAAFZ2FtZV8JAAGkAAAAAQUAAAAGZ2FtZUlkAgAAABhfd2FpdGluZ0V4cGlyYXRpb25IZWlnaHQBAAAAGmdldFdhaXRpbmdFeHBpcmF0aW9uSGVpZ2h0AAAAAQAAAAZnYW1lSWQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAAHWdldFdhaXRpbmdFeHBpcmF0aW9uSGVpZ2h0S2V5AAAAAQUAAAAGZ2FtZUlkAQAAABZnZXRFeHBpcmF0aW9uSGVpZ2h0S2V5AAAAAQAAAAZnYW1lSWQJAAEsAAAAAgkAASwAAAACAgAAAAVnYW1lXwkAAaQAAAABBQAAAAZnYW1lSWQCAAAAEV9leHBpcmF0aW9uSGVpZ2h0AQAAABNnZXRFeHBpcmF0aW9uSGVpZ2h0AAAAAQAAAAZnYW1lSWQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAAFmdldEV4cGlyYXRpb25IZWlnaHRLZXkAAAABBQAAAAZnYW1lSWQBAAAAEWdldFJhcml0eVJhbmdlS2V5AAAAAgAAAAZnYW1lSWQAAAANcmFuZ2VQb3NpdGlvbgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAFZ2FtZV8JAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAA1fcmFyaXR5UmFuZ2VfBQAAAA1yYW5nZVBvc2l0aW9uAQAAAA5nZXRSYXJpdHlSYW5nZQAAAAIAAAAGZ2FtZUlkAAAADXJhbmdlUG9zaXRpb24JAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAAEWdldFJhcml0eVJhbmdlS2V5AAAAAgUAAAAGZ2FtZUlkBQAAAA1yYW5nZVBvc2l0aW9uAQAAAApnZXRTdGVwS2V5AAAAAQAAAAZnYW1lSWQJAAEsAAAAAgkAASwAAAACAgAAAAVnYW1lXwkAAaQAAAABBQAAAAZnYW1lSWQCAAAABV9zdGVwAQAAAAdnZXRTdGVwAAAAAQAAAAZnYW1lSWQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAACmdldFN0ZXBLZXkAAAABBQAAAAZnYW1lSWQBAAAADGdldFJhcml0eUtleQAAAAMAAAAGZ2FtZUlkAAAABnBsYXllcgAAAA1yYW5nZVBvc2l0aW9uCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJ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SW50ZWdlckVudHJ5AAAAAgkBAAAAF2dldFBsYXllckN1cnJlbnRHYW1lS2V5AAAAAQUAAAAMbWFrZXJBZGRyZXNzAAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAXZ2V0UGxheWVyQ3VycmVudEdhbWVLZXkAAAABBQAAAAx0YWtlckFkZHJlc3MAAAAAAAAAAAAJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIJAQAAAA9nZXRQcml6ZVNlbnRLZXkAAAACBQAAAAZnYW1lSWQFAAAACnBsYXllclJvbGUGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAADXBsYXllckFkZHJlc3MJAABoAAAAAgkBAAAACmdldEJldEVnZ3MAAAABBQAAAAZnYW1lSWQAAAAAAAAAAAIFAAAAC2VnZ3NBc3NldElkBQAAAANuaWwDCQAAAAAAAAIFAAAABndpbm5lcgIAAAAEZHJhdwMJAAAAAAAAAgUAAAAKcGxheWVyUm9sZQIAAAAFbWFrZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABdnZXRQbGF5ZXJDdXJyZW50R2FtZUtleQAAAAEFAAAADG1ha2VyQWRkcmVzcwAAAAAAAAAAAAkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgkBAAAAD2dldFByaXplU2VudEtleQAAAAIFAAAABmdhbWVJZAUAAAAKcGxheWVyUm9sZQYJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAANcGxheWVyQWRkcmVzcwkBAAAACmdldEJldEVnZ3MAAAABBQAAAAZnYW1lSWQFAAAAC2VnZ3NBc3NldElkBQAAAANuaWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABdnZXRQbGF5ZXJDdXJyZW50R2FtZUtleQAAAAEFAAAADHRha2VyQWRkcmVzcwAAAAAAAAAAAAkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgkBAAAAD2dldFByaXplU2VudEtleQAAAAIFAAAABmdhbWVJZAUAAAAKcGxheWVyUm9sZQYJAARMAAAAAgkBAAAADlNjcmlwdFRy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", "height": 1668199, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: H8fveYRAvpgVBoWD9KnHuWeMZiDoQfVWno5VgwDQNYsi Next: Ae39177fymDncqfQLMk3ihgcN2fJaKWWCXHhfkfuM9v8 Diff:
OldNewDifferences
4444
4545
4646 func getNextGameId () = {
47- let nextId = tryGetInteger("next_game_id")
47+ let nextId = tryGetInteger("nextGameId")
4848 if ((nextId == 0))
4949 then 1
5050 else nextId
5151 }
5252
5353
54-func getUserCurrentGameKey (address) = ("current_game_" + address)
54+func getPlayerCurrentGameKey (address) = ("currentGame_" + address)
5555
5656
57-func getUserCurrentGame (address) = tryGetInteger(getUserCurrentGameKey(address))
57+func getPlayerCurrentGame (address) = tryGetInteger(getPlayerCurrentGameKey(address))
5858
5959
6060 func getSlotKey (slot) = ("slot_" + toString(slot))
6363 func getSlot (slot) = tryGetInteger(getSlotKey(slot))
6464
6565
66-func getGameMakerKey (gameId) = (("game_" + toString(gameId)) + "_maker")
66+func getMakerKey (gameId) = (("game_" + toString(gameId)) + "_maker")
6767
6868
69-func getGameMaker (gameId) = tryGetString(getGameMakerKey(gameId))
69+func getMaker (gameId) = tryGetString(getMakerKey(gameId))
7070
7171
72-func getGameTakerKey (gameId) = (("game_" + toString(gameId)) + "_taker")
72+func getTakerKey (gameId) = (("game_" + toString(gameId)) + "_taker")
7373
7474
75-func getGameTaker (gameId) = tryGetString(getGameTakerKey(gameId))
75+func getTaker (gameId) = tryGetString(getTakerKey(gameId))
7676
7777
78-func getBetEggsKey (gameId) = (("game_" + toString(gameId)) + "_bet_eggs")
78+func getBetEggsKey (gameId) = (("game_" + toString(gameId)) + "_betEggs")
7979
8080
8181 func getBetEggs (gameId) = tryGetInteger(getBetEggsKey(gameId))
8282
8383
84-func getGameWaitingEndHeightKey (gameId) = (("game_" + toString(gameId)) + "_waiting_end_height")
84+func getWaitingExpirationHeightKey (gameId) = (("game_" + toString(gameId)) + "_waitingExpirationHeight")
8585
8686
87-func getGameWaitingEndHeight (gameId) = tryGetInteger(getGameWaitingEndHeightKey(gameId))
87+func getWaitingExpirationHeight (gameId) = tryGetInteger(getWaitingExpirationHeightKey(gameId))
8888
8989
90-func getGameOverHeightKey (gameId) = (("game_" + toString(gameId)) + "_over_height")
90+func getExpirationHeightKey (gameId) = (("game_" + toString(gameId)) + "_expirationHeight")
9191
9292
93-func getGameOverHeight (gameId) = tryGetInteger(getGameWaitingEndHeightKey(gameId))
93+func getExpirationHeight (gameId) = tryGetInteger(getExpirationHeightKey(gameId))
9494
9595
96-func getGameRarityRangeKey (gameId,rangePosition) = ((("game_" + toString(gameId)) + "_rarityRange_") + rangePosition)
96+func getRarityRangeKey (gameId,rangePosition) = ((("game_" + toString(gameId)) + "_rarityRange_") + rangePosition)
9797
9898
99-func getGameRarityRange (gameId,rangePosition) = tryGetInteger(getGameRarityRangeKey(gameId, rangePosition))
99+func getRarityRange (gameId,rangePosition) = tryGetInteger(getRarityRangeKey(gameId, rangePosition))
100100
101101
102-func getGameStepKey (gameId) = (("game_" + toString(gameId)) + "_step")
102+func getStepKey (gameId) = (("game_" + toString(gameId)) + "_step")
103103
104104
105-func getGameStep (gameId) = tryGetInteger(getGameStepKey(gameId))
105+func getStep (gameId) = tryGetInteger(getStepKey(gameId))
106106
107107
108108 func getRarityKey (gameId,player,rangePosition) = (((((("game_" + toString(gameId)) + "_") + player) + "_") + rangePosition) + "Rarity")
117117 func getCommit (gameId,player) = tryGetString(getCommitKey(gameId, player))
118118
119119
120-func getDuckOrderKey (gameId,player) = (((("game_" + toString(gameId)) + "_") + player) + "_duckOrder")
120+func getDuckOrderKey (gameId,playerRole) = (((("game_" + toString(gameId)) + "_") + playerRole) + "_duckOrder")
121121
122122
123-func getDuckOrder (gameId,player) = tryGetString(getDuckOrderKey(gameId, player))
123+func getDuckOrder (gameId,playerRole) = tryGetString(getDuckOrderKey(gameId, playerRole))
124124
125125
126-func getPrizeSentKey (gameId,player) = (((("game_" + toString(gameId)) + "_") + player) + "_withdrawStatus")
126+func getPrizeSentKey (gameId,playerRole) = (((("game_" + toString(gameId)) + "_") + playerRole) + "_withdrawStatus")
127127
128128
129-func getPrizeSent (gameId,player) = tryGetBoolean(getPrizeSentKey(gameId, player))
129+func getPrizeSent (gameId,playerRole) = tryGetBoolean(getPrizeSentKey(gameId, playerRole))
130130
131131
132132 func pickDuck (gameId,playerRole,playerAddress,assetId,rarity,rangePosition,step) = {
133- let rarityRange = getGameRarityRange(gameId, rangePosition)
133+ let rarityRange = getRarityRange(gameId, rangePosition)
134134 if (if (if (if ((rarityRange == 5))
135135 then (40 > rarity)
136136 else false)
139139 then true
140140 else (((rarityRange - 1) * 10) > rarity))
141141 then throw("This duck doesn't fit the rarity range")
142- else [IntegerEntry(getRarityKey(gameId, playerRole, rangePosition), rarity), IntegerEntry(getGameStepKey(gameId), (step + 1)), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration)), ScriptTransfer(playerAddress, 1, assetId)]
142+ else [IntegerEntry(getRarityKey(gameId, playerRole, rangePosition), rarity), IntegerEntry(getStepKey(gameId), (step + 1)), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration)), ScriptTransfer(playerAddress, 1, assetId)]
143143 }
144144
145145
192192
193193
194194 func sendPrize (gameId,playerAddress,playerRole,winner) = {
195- let makerAddress = getGameMaker(gameId)
196- let takerAddress = getGameTaker(gameId)
195+ let makerAddress = getMaker(gameId)
196+ let takerAddress = getTaker(gameId)
197197 if (getPrizeSent(gameId, playerRole))
198198 then throw("You have already got the prize")
199199 else if ((winner == playerRole))
200- then [IntegerEntry(getUserCurrentGameKey(makerAddress), 0), IntegerEntry(getUserCurrentGameKey(takerAddress), 0), BooleanEntry(getPrizeSentKey(gameId, playerRole), true), ScriptTransfer(playerAddress, (getBetEggs(gameId) * 2), eggsAssetId)]
200+ then [IntegerEntry(getPlayerCurrentGameKey(makerAddress), 0), IntegerEntry(getPlayerCurrentGameKey(takerAddress), 0), BooleanEntry(getPrizeSentKey(gameId, playerRole), true), ScriptTransfer(playerAddress, (getBetEggs(gameId) * 2), eggsAssetId)]
201201 else if ((winner == "draw"))
202202 then if ((playerRole == "maker"))
203- then [IntegerEntry(getUserCurrentGameKey(makerAddress), 0), BooleanEntry(getPrizeSentKey(gameId, playerRole), true), ScriptTransfer(playerAddress, getBetEggs(gameId), eggsAssetId)]
204- else [IntegerEntry(getUserCurrentGameKey(takerAddress), 0), BooleanEntry(getPrizeSentKey(gameId, playerRole), true), ScriptTransfer(playerAddress, getBetEggs(gameId), eggsAssetId)]
203+ then [IntegerEntry(getPlayerCurrentGameKey(makerAddress), 0), BooleanEntry(getPrizeSentKey(gameId, playerRole), true), ScriptTransfer(playerAddress, getBetEggs(gameId), eggsAssetId)]
204+ else [IntegerEntry(getPlayerCurrentGameKey(takerAddress), 0), BooleanEntry(getPrizeSentKey(gameId, playerRole), true), ScriptTransfer(playerAddress, getBetEggs(gameId), eggsAssetId)]
205205 else throw("You lose and don't have any prize")
206206 }
207207
217217 then throw(("You can attach only EGGs with the following asset id: " + toBase58String(eggsAssetId)))
218218 else if ((0 >= eggs))
219219 then throw("Not enough EGGs")
220- else if ((getUserCurrentGame(callerAddress) != 0))
220+ else if ((getPlayerCurrentGame(callerAddress) != 0))
221221 then throw("You already have an active game")
222222 else if (if ((0 > slot))
223223 then true
241241 then throw("The medium duck must be better than the worst one")
242242 else if ((rarityRangeMedium >= rarityRangeBest))
243243 then throw("The best duck must be better than the medium one")
244- else [IntegerEntry(getUserCurrentGameKey(callerAddress), gameId), StringEntry(getGameMakerKey(gameId), callerAddress), IntegerEntry(getBetEggsKey(gameId), eggs), IntegerEntry(getGameRarityRangeKey(gameId, "worst"), rarityRangeWorst), IntegerEntry(getGameRarityRangeKey(gameId, "medium"), rarityRangeMedium), IntegerEntry(getGameRarityRangeKey(gameId, "best"), rarityRangeBest), IntegerEntry(getGameWaitingEndHeightKey(gameId), (height + WAITING)), IntegerEntry(getSlotKey(slot), gameId), IntegerEntry("next_game_id", (gameId + 1))]
244+ else [IntegerEntry(getPlayerCurrentGameKey(callerAddress), gameId), StringEntry(getMakerKey(gameId), callerAddress), IntegerEntry(getBetEggsKey(gameId), eggs), IntegerEntry(getRarityRangeKey(gameId, "worst"), rarityRangeWorst), IntegerEntry(getRarityRangeKey(gameId, "medium"), rarityRangeMedium), IntegerEntry(getRarityRangeKey(gameId, "best"), rarityRangeBest), IntegerEntry(getWaitingExpirationHeightKey(gameId), (height + WAITING)), IntegerEntry(getSlotKey(slot), gameId), IntegerEntry("next_game_id", (gameId + 1))]
245245 }
246246
247247
257257 then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId)))
258258 else if ((payment.amount != (getBetEggs(gameId) + takerFee)))
259259 then throw("Insufficient eggs amount")
260- else if ((getGameTaker(gameId) != ""))
260+ else if ((getTaker(gameId) != ""))
261261 then throw("This game is already taken")
262- else if ((height >= getGameWaitingEndHeight(gameId)))
262+ else if ((height >= getWaitingExpirationHeight(gameId)))
263263 then throw("This game is expired")
264- else [IntegerEntry(getUserCurrentGameKey(callerAddress), gameId), StringEntry(getGameTakerKey(gameId), callerAddress), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration)), IntegerEntry(getSlotKey(slot), 0)]
264+ else [IntegerEntry(getPlayerCurrentGameKey(callerAddress), gameId), StringEntry(getTakerKey(gameId), callerAddress), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration)), IntegerEntry(getSlotKey(slot), 0)]
265265 }
266266
267267
275275 then throw("Invalid slot")
276276 else if ((gameId == 0))
277277 then throw("Slot is empty")
278- else if ((getGameWaitingEndHeight(gameId) > height))
278+ else if ((getWaitingExpirationHeight(gameId) > height))
279279 then throw("Waiting is not finished yet")
280- else if ((getGameTaker(gameId) != ""))
280+ else if ((getTaker(gameId) != ""))
281281 then throw("This game is started")
282282 else {
283- let maker = getGameMaker(gameId)
284-[IntegerEntry(getUserCurrentGameKey(maker), 0), IntegerEntry(getSlotKey(slot), 0), ScriptTransfer(Address(fromBase58String(maker)), (getBetEggs(gameId) + makerFee), eggsAssetId)]
283+ let maker = getMaker(gameId)
284+[IntegerEntry(getPlayerCurrentGameKey(maker), 0), IntegerEntry(getSlotKey(slot), 0), ScriptTransfer(Address(fromBase58String(maker)), (getBetEggs(gameId) + makerFee), eggsAssetId)]
285285 }
286286 }
287287
291291 func pickWorstDuck (gameId) = {
292292 let callerAddress = toBase58String(i.caller.bytes)
293293 let assetId = value(value(i.payments[0]).assetId)
294- let gameStep = getGameStep(gameId)
294+ let gameStep = getStep(gameId)
295295 if (if ((value(assetInfo(assetId)).issuer != Address(breederAddress)))
296296 then (value(assetInfo(assetId)).issuer != Address(incubatorAddress))
297297 else false)
298298 then throw("Invalid NFT")
299299 else if ((gameStep == 0))
300- then if ((callerAddress != getGameTaker(gameId)))
300+ then if ((callerAddress != getTaker(gameId)))
301301 then throw("It is the taker's turn to pick now")
302302 else {
303303 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
314314 else throw("Strict value is not equal to itself.")
315315 }
316316 else if ((gameStep == 1))
317- then if ((callerAddress != getGameMaker(gameId)))
317+ then if ((callerAddress != getMaker(gameId)))
318318 then throw("It is the maker's turn to pick now")
319319 else {
320320 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
339339 func pickMediumtDuck (gameId) = {
340340 let callerAddress = toBase58String(i.caller.bytes)
341341 let assetId = value(value(i.payments[0]).assetId)
342- let gameStep = getGameStep(gameId)
342+ let gameStep = getStep(gameId)
343343 if (if ((value(assetInfo(assetId)).issuer != Address(breederAddress)))
344344 then (value(assetInfo(assetId)).issuer != Address(incubatorAddress))
345345 else false)
347347 else if ((2 > gameStep))
348348 then throw("The medium duck must be picked after the worst one")
349349 else if ((gameStep == 2))
350- then if ((callerAddress != getGameMaker(gameId)))
350+ then if ((callerAddress != getMaker(gameId)))
351351 then throw("It is the maker's turn to pick now")
352352 else {
353353 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
364364 else throw("Strict value is not equal to itself.")
365365 }
366366 else if ((gameStep == 3))
367- then if ((callerAddress != getGameTaker(gameId)))
367+ then if ((callerAddress != getTaker(gameId)))
368368 then throw("It is the taker's turn to pick now")
369369 else {
370370 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
389389 func pickBestDuck (gameId) = {
390390 let callerAddress = toBase58String(i.caller.bytes)
391391 let assetId = value(value(i.payments[0]).assetId)
392- let gameStep = getGameStep(gameId)
392+ let gameStep = getStep(gameId)
393393 if (if ((value(assetInfo(assetId)).issuer != Address(breederAddress)))
394394 then (value(assetInfo(assetId)).issuer != Address(incubatorAddress))
395395 else false)
397397 else if ((4 > gameStep))
398398 then throw("The best duck must be picked after the worst and the medium ones")
399399 else if ((gameStep == 4))
400- then if ((callerAddress != getGameTaker(gameId)))
400+ then if ((callerAddress != getTaker(gameId)))
401401 then throw("It is the taker's turn to pick now")
402402 else {
403403 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
414414 else throw("Strict value is not equal to itself.")
415415 }
416416 else if ((gameStep == 5))
417- then if ((callerAddress != getGameMaker(gameId)))
417+ then if ((callerAddress != getMaker(gameId)))
418418 then throw("It is the maker's turn to pick now")
419419 else {
420420 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
438438 @Callable(i)
439439 func commit (gameId,hash) = {
440440 let callerAddress = toBase58String(i.caller.bytes)
441- let gameStep = getGameStep(gameId)
441+ let gameStep = getStep(gameId)
442442 if ((6 > gameStep))
443443 then throw("Ducks hasn't been picked yet")
444444 else if ((gameStep == 6))
445- then if ((callerAddress != getGameMaker(gameId)))
445+ then if ((callerAddress != getMaker(gameId)))
446446 then throw("It is the maker's turn to commit now")
447- else [StringEntry(getCommitKey(gameId, "maker"), hash), IntegerEntry(getGameStepKey(gameId), (gameStep + 1)), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration))]
447+ else [StringEntry(getCommitKey(gameId, "maker"), hash), IntegerEntry(getStepKey(gameId), (gameStep + 1)), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration))]
448448 else if ((gameStep == 7))
449- then if ((callerAddress != getGameTaker(gameId)))
449+ then if ((callerAddress != getTaker(gameId)))
450450 then throw("It is the taker's turn to commit now")
451- else [StringEntry(getCommitKey(gameId, "taker"), hash), IntegerEntry(getGameStepKey(gameId), (gameStep + 1)), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration))]
451+ else [StringEntry(getCommitKey(gameId, "taker"), hash), IntegerEntry(getStepKey(gameId), (gameStep + 1)), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration))]
452452 else throw("Commit is finished")
453453 }
454454
457457 @Callable(i)
458458 func reveal (gameId,duckOrder,salt) = {
459459 let callerAddress = toBase58String(i.caller.bytes)
460- let gameStep = getGameStep(gameId)
460+ let gameStep = getStep(gameId)
461461 if ((8 > gameStep))
462462 then throw("Reveal is not started")
463463 else if (if (if (if (if (if ((duckOrder != "worst,medium,best"))
473473 else (duckOrder != "best,medium,worst"))
474474 then throw("Invalid duckOrder")
475475 else if ((gameStep == 8))
476- then if ((callerAddress != getGameMaker(gameId)))
476+ then if ((callerAddress != getMaker(gameId)))
477477 then throw("It is the maker's turn to reveal now")
478478 else if ((toBase58String(sha256(toBytes((duckOrder + salt)))) != getCommit(gameId, "maker")))
479479 then throw("reveal data is not valid")
480- else [StringEntry(getDuckOrderKey(gameId, "maker"), duckOrder), IntegerEntry(getGameStepKey(gameId), (gameStep + 1)), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration))]
480+ else [StringEntry(getDuckOrderKey(gameId, "maker"), duckOrder), IntegerEntry(getStepKey(gameId), (gameStep + 1)), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration))]
481481 else if ((gameStep == 9))
482- then if ((callerAddress != getGameTaker(gameId)))
482+ then if ((callerAddress != getTaker(gameId)))
483483 then throw("It is the taker's turn to reveal now")
484484 else if ((toBase58String(sha256(toBytes((duckOrder + salt)))) != getCommit(gameId, "taker")))
485485 then throw("reveal data is not valid")
486- else [StringEntry(getDuckOrderKey(gameId, "taker"), duckOrder), IntegerEntry(getGameStepKey(gameId), (gameStep + 1)), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration))]
486+ else [StringEntry(getDuckOrderKey(gameId, "taker"), duckOrder), IntegerEntry(getStepKey(gameId), (gameStep + 1)), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration))]
487487 else throw("Reveal is finished")
488488 }
489489
492492 @Callable(i)
493493 func getPrize (gameId) = {
494494 let callerAddress = toBase58String(i.caller.bytes)
495- let gameStep = getGameStep(gameId)
495+ let gameStep = getStep(gameId)
496496 if ((gameStep != 10))
497497 then throw("Game is not finished")
498- else if ((callerAddress == getGameMaker(gameId)))
498+ else if ((callerAddress == getMaker(gameId)))
499499 then sendPrize(gameId, i.caller, "maker", getWinner(gameId))
500- else if ((callerAddress == getGameTaker(gameId)))
500+ else if ((callerAddress == getTaker(gameId)))
501501 then sendPrize(gameId, i.caller, "taker", getWinner(gameId))
502502 else throw("Invalid caller address")
503503 }
507507 @Callable(i)
508508 func getPrizeExpired (gameId) = {
509509 let callerAddress = toBase58String(i.caller.bytes)
510- let gameStep = getGameStep(gameId)
510+ let gameStep = getStep(gameId)
511511 if ((gameStep == 10))
512512 then throw("Game is finished, call getPrize instead")
513- else if ((getGameOverHeight(gameId) > height))
513+ else if ((getExpirationHeight(gameId) > height))
514514 then throw("Game is not expired")
515- else if ((callerAddress == getGameMaker(gameId)))
515+ else if ((callerAddress == getMaker(gameId)))
516516 then sendPrize(gameId, i.caller, "maker", getWinnerExpired(gameStep))
517- else if ((callerAddress == getGameTaker(gameId)))
517+ else if ((callerAddress == getTaker(gameId)))
518518 then sendPrize(gameId, i.caller, "taker", getWinnerExpired(gameStep))
519519 else throw("Invalid caller address")
520520 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let incubatorAddress = base58'3MtBigTsaeevrcJAEwVcr4quwkqcrtnjoAh'
55
66 let breederAddress = base58'3MtBigTsaeevrcJAEwVcr4quwkqcrtnjoAh'
77
88 let farmingAddress = base58'3NBznG19rEYUAcnukTRTtwJHBVKQLbobVdC'
99
1010 let eggsAssetId = base58'3VUCuh9dWqe54SdzzNUkXhFXpc8UQynnJVh42B7MjNzN'
1111
1212 let makerFee = 1
1313
1414 let takerFee = 1
1515
1616 let SLOTS = 10
1717
1818 let WAITING = 5
1919
2020 let stepDuration = 3
2121
2222 func tryGetInteger (key) = match getInteger(this, key) {
2323 case b: Int =>
2424 b
2525 case _ =>
2626 0
2727 }
2828
2929
3030 func tryGetString (key) = match getString(this, key) {
3131 case a: String =>
3232 a
3333 case _ =>
3434 ""
3535 }
3636
3737
3838 func tryGetBoolean (key) = match getBoolean(this, key) {
3939 case b: Boolean =>
4040 b
4141 case _ =>
4242 false
4343 }
4444
4545
4646 func getNextGameId () = {
47- let nextId = tryGetInteger("next_game_id")
47+ let nextId = tryGetInteger("nextGameId")
4848 if ((nextId == 0))
4949 then 1
5050 else nextId
5151 }
5252
5353
54-func getUserCurrentGameKey (address) = ("current_game_" + address)
54+func getPlayerCurrentGameKey (address) = ("currentGame_" + address)
5555
5656
57-func getUserCurrentGame (address) = tryGetInteger(getUserCurrentGameKey(address))
57+func getPlayerCurrentGame (address) = tryGetInteger(getPlayerCurrentGameKey(address))
5858
5959
6060 func getSlotKey (slot) = ("slot_" + toString(slot))
6161
6262
6363 func getSlot (slot) = tryGetInteger(getSlotKey(slot))
6464
6565
66-func getGameMakerKey (gameId) = (("game_" + toString(gameId)) + "_maker")
66+func getMakerKey (gameId) = (("game_" + toString(gameId)) + "_maker")
6767
6868
69-func getGameMaker (gameId) = tryGetString(getGameMakerKey(gameId))
69+func getMaker (gameId) = tryGetString(getMakerKey(gameId))
7070
7171
72-func getGameTakerKey (gameId) = (("game_" + toString(gameId)) + "_taker")
72+func getTakerKey (gameId) = (("game_" + toString(gameId)) + "_taker")
7373
7474
75-func getGameTaker (gameId) = tryGetString(getGameTakerKey(gameId))
75+func getTaker (gameId) = tryGetString(getTakerKey(gameId))
7676
7777
78-func getBetEggsKey (gameId) = (("game_" + toString(gameId)) + "_bet_eggs")
78+func getBetEggsKey (gameId) = (("game_" + toString(gameId)) + "_betEggs")
7979
8080
8181 func getBetEggs (gameId) = tryGetInteger(getBetEggsKey(gameId))
8282
8383
84-func getGameWaitingEndHeightKey (gameId) = (("game_" + toString(gameId)) + "_waiting_end_height")
84+func getWaitingExpirationHeightKey (gameId) = (("game_" + toString(gameId)) + "_waitingExpirationHeight")
8585
8686
87-func getGameWaitingEndHeight (gameId) = tryGetInteger(getGameWaitingEndHeightKey(gameId))
87+func getWaitingExpirationHeight (gameId) = tryGetInteger(getWaitingExpirationHeightKey(gameId))
8888
8989
90-func getGameOverHeightKey (gameId) = (("game_" + toString(gameId)) + "_over_height")
90+func getExpirationHeightKey (gameId) = (("game_" + toString(gameId)) + "_expirationHeight")
9191
9292
93-func getGameOverHeight (gameId) = tryGetInteger(getGameWaitingEndHeightKey(gameId))
93+func getExpirationHeight (gameId) = tryGetInteger(getExpirationHeightKey(gameId))
9494
9595
96-func getGameRarityRangeKey (gameId,rangePosition) = ((("game_" + toString(gameId)) + "_rarityRange_") + rangePosition)
96+func getRarityRangeKey (gameId,rangePosition) = ((("game_" + toString(gameId)) + "_rarityRange_") + rangePosition)
9797
9898
99-func getGameRarityRange (gameId,rangePosition) = tryGetInteger(getGameRarityRangeKey(gameId, rangePosition))
99+func getRarityRange (gameId,rangePosition) = tryGetInteger(getRarityRangeKey(gameId, rangePosition))
100100
101101
102-func getGameStepKey (gameId) = (("game_" + toString(gameId)) + "_step")
102+func getStepKey (gameId) = (("game_" + toString(gameId)) + "_step")
103103
104104
105-func getGameStep (gameId) = tryGetInteger(getGameStepKey(gameId))
105+func getStep (gameId) = tryGetInteger(getStepKey(gameId))
106106
107107
108108 func getRarityKey (gameId,player,rangePosition) = (((((("game_" + toString(gameId)) + "_") + player) + "_") + rangePosition) + "Rarity")
109109
110110
111111 func getRarity (gameId,player,rangePosition) = tryGetInteger(getRarityKey(gameId, player, rangePosition))
112112
113113
114114 func getCommitKey (gameId,player) = (((("game_" + toString(gameId)) + "_") + player) + "_commit")
115115
116116
117117 func getCommit (gameId,player) = tryGetString(getCommitKey(gameId, player))
118118
119119
120-func getDuckOrderKey (gameId,player) = (((("game_" + toString(gameId)) + "_") + player) + "_duckOrder")
120+func getDuckOrderKey (gameId,playerRole) = (((("game_" + toString(gameId)) + "_") + playerRole) + "_duckOrder")
121121
122122
123-func getDuckOrder (gameId,player) = tryGetString(getDuckOrderKey(gameId, player))
123+func getDuckOrder (gameId,playerRole) = tryGetString(getDuckOrderKey(gameId, playerRole))
124124
125125
126-func getPrizeSentKey (gameId,player) = (((("game_" + toString(gameId)) + "_") + player) + "_withdrawStatus")
126+func getPrizeSentKey (gameId,playerRole) = (((("game_" + toString(gameId)) + "_") + playerRole) + "_withdrawStatus")
127127
128128
129-func getPrizeSent (gameId,player) = tryGetBoolean(getPrizeSentKey(gameId, player))
129+func getPrizeSent (gameId,playerRole) = tryGetBoolean(getPrizeSentKey(gameId, playerRole))
130130
131131
132132 func pickDuck (gameId,playerRole,playerAddress,assetId,rarity,rangePosition,step) = {
133- let rarityRange = getGameRarityRange(gameId, rangePosition)
133+ let rarityRange = getRarityRange(gameId, rangePosition)
134134 if (if (if (if ((rarityRange == 5))
135135 then (40 > rarity)
136136 else false)
137137 then true
138138 else (rarity >= (rarityRange * 10)))
139139 then true
140140 else (((rarityRange - 1) * 10) > rarity))
141141 then throw("This duck doesn't fit the rarity range")
142- else [IntegerEntry(getRarityKey(gameId, playerRole, rangePosition), rarity), IntegerEntry(getGameStepKey(gameId), (step + 1)), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration)), ScriptTransfer(playerAddress, 1, assetId)]
142+ else [IntegerEntry(getRarityKey(gameId, playerRole, rangePosition), rarity), IntegerEntry(getStepKey(gameId), (step + 1)), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration)), ScriptTransfer(playerAddress, 1, assetId)]
143143 }
144144
145145
146146 func getScore (a,b) = if ((a > b))
147147 then 1
148148 else if ((b > a))
149149 then -1
150150 else 0
151151
152152
153153 func getWinner (gameId) = {
154154 let makerDuckOrder = split(getDuckOrder(gameId, "maker"), ",")
155155 let takerDuckOrder = split(getDuckOrder(gameId, "taker"), ",")
156156 let makerRarity1 = getRarity(gameId, "maker", makerDuckOrder[0])
157157 let makerRarity2 = getRarity(gameId, "maker", makerDuckOrder[1])
158158 let makerRarity3 = getRarity(gameId, "maker", makerDuckOrder[2])
159159 let takerRarity1 = getRarity(gameId, "taker", makerDuckOrder[0])
160160 let takerRarity2 = getRarity(gameId, "taker", makerDuckOrder[1])
161161 let takerRarity3 = getRarity(gameId, "taker", makerDuckOrder[2])
162162 let makerScore = ((getScore(makerRarity1, takerRarity1) + getScore(makerRarity2, takerRarity2)) + getScore(makerRarity3, takerRarity3))
163163 if ((makerScore > 0))
164164 then "maker"
165165 else if ((0 > makerScore))
166166 then "taker"
167167 else "draw"
168168 }
169169
170170
171171 func getWinnerExpired (gameStep) = if (if (if (if (if ((gameStep == 0))
172172 then true
173173 else (gameStep == 3))
174174 then true
175175 else (gameStep == 4))
176176 then true
177177 else (gameStep == 7))
178178 then true
179179 else (gameStep == 9))
180180 then "maker"
181181 else if (if (if (if (if ((gameStep == 1))
182182 then true
183183 else (gameStep == 2))
184184 then true
185185 else (gameStep == 5))
186186 then true
187187 else (gameStep == 6))
188188 then true
189189 else (gameStep == 8))
190190 then "taker"
191191 else "draw"
192192
193193
194194 func sendPrize (gameId,playerAddress,playerRole,winner) = {
195- let makerAddress = getGameMaker(gameId)
196- let takerAddress = getGameTaker(gameId)
195+ let makerAddress = getMaker(gameId)
196+ let takerAddress = getTaker(gameId)
197197 if (getPrizeSent(gameId, playerRole))
198198 then throw("You have already got the prize")
199199 else if ((winner == playerRole))
200- then [IntegerEntry(getUserCurrentGameKey(makerAddress), 0), IntegerEntry(getUserCurrentGameKey(takerAddress), 0), BooleanEntry(getPrizeSentKey(gameId, playerRole), true), ScriptTransfer(playerAddress, (getBetEggs(gameId) * 2), eggsAssetId)]
200+ then [IntegerEntry(getPlayerCurrentGameKey(makerAddress), 0), IntegerEntry(getPlayerCurrentGameKey(takerAddress), 0), BooleanEntry(getPrizeSentKey(gameId, playerRole), true), ScriptTransfer(playerAddress, (getBetEggs(gameId) * 2), eggsAssetId)]
201201 else if ((winner == "draw"))
202202 then if ((playerRole == "maker"))
203- then [IntegerEntry(getUserCurrentGameKey(makerAddress), 0), BooleanEntry(getPrizeSentKey(gameId, playerRole), true), ScriptTransfer(playerAddress, getBetEggs(gameId), eggsAssetId)]
204- else [IntegerEntry(getUserCurrentGameKey(takerAddress), 0), BooleanEntry(getPrizeSentKey(gameId, playerRole), true), ScriptTransfer(playerAddress, getBetEggs(gameId), eggsAssetId)]
203+ then [IntegerEntry(getPlayerCurrentGameKey(makerAddress), 0), BooleanEntry(getPrizeSentKey(gameId, playerRole), true), ScriptTransfer(playerAddress, getBetEggs(gameId), eggsAssetId)]
204+ else [IntegerEntry(getPlayerCurrentGameKey(takerAddress), 0), BooleanEntry(getPrizeSentKey(gameId, playerRole), true), ScriptTransfer(playerAddress, getBetEggs(gameId), eggsAssetId)]
205205 else throw("You lose and don't have any prize")
206206 }
207207
208208
209209 @Callable(i)
210210 func makeGame (slot,rarityRangeWorst,rarityRangeMedium,rarityRangeBest) = {
211211 let callerAddress = toBase58String(i.caller.bytes)
212212 let slotGameId = getSlot(slot)
213213 let payment = value(i.payments[0])
214214 let eggs = (payment.amount - makerFee)
215215 let gameId = getNextGameId()
216216 if ((payment.assetId != eggsAssetId))
217217 then throw(("You can attach only EGGs with the following asset id: " + toBase58String(eggsAssetId)))
218218 else if ((0 >= eggs))
219219 then throw("Not enough EGGs")
220- else if ((getUserCurrentGame(callerAddress) != 0))
220+ else if ((getPlayerCurrentGame(callerAddress) != 0))
221221 then throw("You already have an active game")
222222 else if (if ((0 > slot))
223223 then true
224224 else (slot >= SLOTS))
225225 then throw("Invalid slot")
226226 else if ((slotGameId != 0))
227227 then throw("This slot is busy")
228228 else if (if ((1 > rarityRangeWorst))
229229 then true
230230 else (rarityRangeWorst > 5))
231231 then throw("Invalid rarity range for the worst duck")
232232 else if (if ((1 > rarityRangeMedium))
233233 then true
234234 else (rarityRangeMedium > 5))
235235 then throw("Invalid rarity range for the medium duck")
236236 else if (if ((1 > rarityRangeBest))
237237 then true
238238 else (rarityRangeBest > 5))
239239 then throw("Invalid rarity range for the best duck")
240240 else if ((rarityRangeWorst >= rarityRangeMedium))
241241 then throw("The medium duck must be better than the worst one")
242242 else if ((rarityRangeMedium >= rarityRangeBest))
243243 then throw("The best duck must be better than the medium one")
244- else [IntegerEntry(getUserCurrentGameKey(callerAddress), gameId), StringEntry(getGameMakerKey(gameId), callerAddress), IntegerEntry(getBetEggsKey(gameId), eggs), IntegerEntry(getGameRarityRangeKey(gameId, "worst"), rarityRangeWorst), IntegerEntry(getGameRarityRangeKey(gameId, "medium"), rarityRangeMedium), IntegerEntry(getGameRarityRangeKey(gameId, "best"), rarityRangeBest), IntegerEntry(getGameWaitingEndHeightKey(gameId), (height + WAITING)), IntegerEntry(getSlotKey(slot), gameId), IntegerEntry("next_game_id", (gameId + 1))]
244+ else [IntegerEntry(getPlayerCurrentGameKey(callerAddress), gameId), StringEntry(getMakerKey(gameId), callerAddress), IntegerEntry(getBetEggsKey(gameId), eggs), IntegerEntry(getRarityRangeKey(gameId, "worst"), rarityRangeWorst), IntegerEntry(getRarityRangeKey(gameId, "medium"), rarityRangeMedium), IntegerEntry(getRarityRangeKey(gameId, "best"), rarityRangeBest), IntegerEntry(getWaitingExpirationHeightKey(gameId), (height + WAITING)), IntegerEntry(getSlotKey(slot), gameId), IntegerEntry("next_game_id", (gameId + 1))]
245245 }
246246
247247
248248
249249 @Callable(i)
250250 func takeGame (slot) = {
251251 let callerAddress = toBase58String(i.caller.bytes)
252252 let gameId = getSlot(slot)
253253 let payment = value(i.payments[0])
254254 if ((getSlot(slot) == 0))
255255 then throw("This slot is empty")
256256 else if ((payment.assetId != eggsAssetId))
257257 then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId)))
258258 else if ((payment.amount != (getBetEggs(gameId) + takerFee)))
259259 then throw("Insufficient eggs amount")
260- else if ((getGameTaker(gameId) != ""))
260+ else if ((getTaker(gameId) != ""))
261261 then throw("This game is already taken")
262- else if ((height >= getGameWaitingEndHeight(gameId)))
262+ else if ((height >= getWaitingExpirationHeight(gameId)))
263263 then throw("This game is expired")
264- else [IntegerEntry(getUserCurrentGameKey(callerAddress), gameId), StringEntry(getGameTakerKey(gameId), callerAddress), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration)), IntegerEntry(getSlotKey(slot), 0)]
264+ else [IntegerEntry(getPlayerCurrentGameKey(callerAddress), gameId), StringEntry(getTakerKey(gameId), callerAddress), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration)), IntegerEntry(getSlotKey(slot), 0)]
265265 }
266266
267267
268268
269269 @Callable(i)
270270 func kickGame (slot) = {
271271 let gameId = getSlot(slot)
272272 if (if ((0 > slot))
273273 then true
274274 else (slot >= SLOTS))
275275 then throw("Invalid slot")
276276 else if ((gameId == 0))
277277 then throw("Slot is empty")
278- else if ((getGameWaitingEndHeight(gameId) > height))
278+ else if ((getWaitingExpirationHeight(gameId) > height))
279279 then throw("Waiting is not finished yet")
280- else if ((getGameTaker(gameId) != ""))
280+ else if ((getTaker(gameId) != ""))
281281 then throw("This game is started")
282282 else {
283- let maker = getGameMaker(gameId)
284-[IntegerEntry(getUserCurrentGameKey(maker), 0), IntegerEntry(getSlotKey(slot), 0), ScriptTransfer(Address(fromBase58String(maker)), (getBetEggs(gameId) + makerFee), eggsAssetId)]
283+ let maker = getMaker(gameId)
284+[IntegerEntry(getPlayerCurrentGameKey(maker), 0), IntegerEntry(getSlotKey(slot), 0), ScriptTransfer(Address(fromBase58String(maker)), (getBetEggs(gameId) + makerFee), eggsAssetId)]
285285 }
286286 }
287287
288288
289289
290290 @Callable(i)
291291 func pickWorstDuck (gameId) = {
292292 let callerAddress = toBase58String(i.caller.bytes)
293293 let assetId = value(value(i.payments[0]).assetId)
294- let gameStep = getGameStep(gameId)
294+ let gameStep = getStep(gameId)
295295 if (if ((value(assetInfo(assetId)).issuer != Address(breederAddress)))
296296 then (value(assetInfo(assetId)).issuer != Address(incubatorAddress))
297297 else false)
298298 then throw("Invalid NFT")
299299 else if ((gameStep == 0))
300- then if ((callerAddress != getGameTaker(gameId)))
300+ then if ((callerAddress != getTaker(gameId)))
301301 then throw("It is the taker's turn to pick now")
302302 else {
303303 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
304304 if ((invokeRes == invokeRes))
305305 then {
306306 let rarity = match invokeRes {
307307 case r: Int =>
308308 r
309309 case _ =>
310310 throw("Incorrect invoke result")
311311 }
312312 pickDuck(gameId, "taker", i.caller, assetId, rarity, "worst", 0)
313313 }
314314 else throw("Strict value is not equal to itself.")
315315 }
316316 else if ((gameStep == 1))
317- then if ((callerAddress != getGameMaker(gameId)))
317+ then if ((callerAddress != getMaker(gameId)))
318318 then throw("It is the maker's turn to pick now")
319319 else {
320320 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
321321 if ((invokeRes == invokeRes))
322322 then {
323323 let rarity = match invokeRes {
324324 case r: Int =>
325325 r
326326 case _ =>
327327 throw("Incorrect invoke result")
328328 }
329329 pickDuck(gameId, "maker", i.caller, assetId, rarity, "worst", 1)
330330 }
331331 else throw("Strict value is not equal to itself.")
332332 }
333333 else throw("The worst duck has already been picked")
334334 }
335335
336336
337337
338338 @Callable(i)
339339 func pickMediumtDuck (gameId) = {
340340 let callerAddress = toBase58String(i.caller.bytes)
341341 let assetId = value(value(i.payments[0]).assetId)
342- let gameStep = getGameStep(gameId)
342+ let gameStep = getStep(gameId)
343343 if (if ((value(assetInfo(assetId)).issuer != Address(breederAddress)))
344344 then (value(assetInfo(assetId)).issuer != Address(incubatorAddress))
345345 else false)
346346 then throw("Invalid NFT")
347347 else if ((2 > gameStep))
348348 then throw("The medium duck must be picked after the worst one")
349349 else if ((gameStep == 2))
350- then if ((callerAddress != getGameMaker(gameId)))
350+ then if ((callerAddress != getMaker(gameId)))
351351 then throw("It is the maker's turn to pick now")
352352 else {
353353 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
354354 if ((invokeRes == invokeRes))
355355 then {
356356 let rarity = match invokeRes {
357357 case r: Int =>
358358 r
359359 case _ =>
360360 throw("Incorrect invoke result")
361361 }
362362 pickDuck(gameId, "maker", i.caller, assetId, rarity, "medium", 2)
363363 }
364364 else throw("Strict value is not equal to itself.")
365365 }
366366 else if ((gameStep == 3))
367- then if ((callerAddress != getGameTaker(gameId)))
367+ then if ((callerAddress != getTaker(gameId)))
368368 then throw("It is the taker's turn to pick now")
369369 else {
370370 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
371371 if ((invokeRes == invokeRes))
372372 then {
373373 let rarity = match invokeRes {
374374 case r: Int =>
375375 r
376376 case _ =>
377377 throw("Incorrect invoke result")
378378 }
379379 pickDuck(gameId, "taker", i.caller, assetId, rarity, "medium", 3)
380380 }
381381 else throw("Strict value is not equal to itself.")
382382 }
383383 else throw("The medium duck has already been picked")
384384 }
385385
386386
387387
388388 @Callable(i)
389389 func pickBestDuck (gameId) = {
390390 let callerAddress = toBase58String(i.caller.bytes)
391391 let assetId = value(value(i.payments[0]).assetId)
392- let gameStep = getGameStep(gameId)
392+ let gameStep = getStep(gameId)
393393 if (if ((value(assetInfo(assetId)).issuer != Address(breederAddress)))
394394 then (value(assetInfo(assetId)).issuer != Address(incubatorAddress))
395395 else false)
396396 then throw("Invalid NFT")
397397 else if ((4 > gameStep))
398398 then throw("The best duck must be picked after the worst and the medium ones")
399399 else if ((gameStep == 4))
400- then if ((callerAddress != getGameTaker(gameId)))
400+ then if ((callerAddress != getTaker(gameId)))
401401 then throw("It is the taker's turn to pick now")
402402 else {
403403 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
404404 if ((invokeRes == invokeRes))
405405 then {
406406 let rarity = match invokeRes {
407407 case r: Int =>
408408 r
409409 case _ =>
410410 throw("Incorrect invoke result")
411411 }
412412 pickDuck(gameId, "taker", i.caller, assetId, rarity, "best", 4)
413413 }
414414 else throw("Strict value is not equal to itself.")
415415 }
416416 else if ((gameStep == 5))
417- then if ((callerAddress != getGameMaker(gameId)))
417+ then if ((callerAddress != getMaker(gameId)))
418418 then throw("It is the maker's turn to pick now")
419419 else {
420420 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
421421 if ((invokeRes == invokeRes))
422422 then {
423423 let rarity = match invokeRes {
424424 case r: Int =>
425425 r
426426 case _ =>
427427 throw("Incorrect invoke result")
428428 }
429429 pickDuck(gameId, "maker", i.caller, assetId, rarity, "best", 5)
430430 }
431431 else throw("Strict value is not equal to itself.")
432432 }
433433 else throw("The best duck has already been picked")
434434 }
435435
436436
437437
438438 @Callable(i)
439439 func commit (gameId,hash) = {
440440 let callerAddress = toBase58String(i.caller.bytes)
441- let gameStep = getGameStep(gameId)
441+ let gameStep = getStep(gameId)
442442 if ((6 > gameStep))
443443 then throw("Ducks hasn't been picked yet")
444444 else if ((gameStep == 6))
445- then if ((callerAddress != getGameMaker(gameId)))
445+ then if ((callerAddress != getMaker(gameId)))
446446 then throw("It is the maker's turn to commit now")
447- else [StringEntry(getCommitKey(gameId, "maker"), hash), IntegerEntry(getGameStepKey(gameId), (gameStep + 1)), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration))]
447+ else [StringEntry(getCommitKey(gameId, "maker"), hash), IntegerEntry(getStepKey(gameId), (gameStep + 1)), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration))]
448448 else if ((gameStep == 7))
449- then if ((callerAddress != getGameTaker(gameId)))
449+ then if ((callerAddress != getTaker(gameId)))
450450 then throw("It is the taker's turn to commit now")
451- else [StringEntry(getCommitKey(gameId, "taker"), hash), IntegerEntry(getGameStepKey(gameId), (gameStep + 1)), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration))]
451+ else [StringEntry(getCommitKey(gameId, "taker"), hash), IntegerEntry(getStepKey(gameId), (gameStep + 1)), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration))]
452452 else throw("Commit is finished")
453453 }
454454
455455
456456
457457 @Callable(i)
458458 func reveal (gameId,duckOrder,salt) = {
459459 let callerAddress = toBase58String(i.caller.bytes)
460- let gameStep = getGameStep(gameId)
460+ let gameStep = getStep(gameId)
461461 if ((8 > gameStep))
462462 then throw("Reveal is not started")
463463 else if (if (if (if (if (if ((duckOrder != "worst,medium,best"))
464464 then true
465465 else (duckOrder != "worst,best,medium"))
466466 then true
467467 else (duckOrder != "medium,worst,best"))
468468 then true
469469 else (duckOrder != "medium,best,worst"))
470470 then true
471471 else (duckOrder != "best,worst,medium"))
472472 then true
473473 else (duckOrder != "best,medium,worst"))
474474 then throw("Invalid duckOrder")
475475 else if ((gameStep == 8))
476- then if ((callerAddress != getGameMaker(gameId)))
476+ then if ((callerAddress != getMaker(gameId)))
477477 then throw("It is the maker's turn to reveal now")
478478 else if ((toBase58String(sha256(toBytes((duckOrder + salt)))) != getCommit(gameId, "maker")))
479479 then throw("reveal data is not valid")
480- else [StringEntry(getDuckOrderKey(gameId, "maker"), duckOrder), IntegerEntry(getGameStepKey(gameId), (gameStep + 1)), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration))]
480+ else [StringEntry(getDuckOrderKey(gameId, "maker"), duckOrder), IntegerEntry(getStepKey(gameId), (gameStep + 1)), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration))]
481481 else if ((gameStep == 9))
482- then if ((callerAddress != getGameTaker(gameId)))
482+ then if ((callerAddress != getTaker(gameId)))
483483 then throw("It is the taker's turn to reveal now")
484484 else if ((toBase58String(sha256(toBytes((duckOrder + salt)))) != getCommit(gameId, "taker")))
485485 then throw("reveal data is not valid")
486- else [StringEntry(getDuckOrderKey(gameId, "taker"), duckOrder), IntegerEntry(getGameStepKey(gameId), (gameStep + 1)), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration))]
486+ else [StringEntry(getDuckOrderKey(gameId, "taker"), duckOrder), IntegerEntry(getStepKey(gameId), (gameStep + 1)), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration))]
487487 else throw("Reveal is finished")
488488 }
489489
490490
491491
492492 @Callable(i)
493493 func getPrize (gameId) = {
494494 let callerAddress = toBase58String(i.caller.bytes)
495- let gameStep = getGameStep(gameId)
495+ let gameStep = getStep(gameId)
496496 if ((gameStep != 10))
497497 then throw("Game is not finished")
498- else if ((callerAddress == getGameMaker(gameId)))
498+ else if ((callerAddress == getMaker(gameId)))
499499 then sendPrize(gameId, i.caller, "maker", getWinner(gameId))
500- else if ((callerAddress == getGameTaker(gameId)))
500+ else if ((callerAddress == getTaker(gameId)))
501501 then sendPrize(gameId, i.caller, "taker", getWinner(gameId))
502502 else throw("Invalid caller address")
503503 }
504504
505505
506506
507507 @Callable(i)
508508 func getPrizeExpired (gameId) = {
509509 let callerAddress = toBase58String(i.caller.bytes)
510- let gameStep = getGameStep(gameId)
510+ let gameStep = getStep(gameId)
511511 if ((gameStep == 10))
512512 then throw("Game is finished, call getPrize instead")
513- else if ((getGameOverHeight(gameId) > height))
513+ else if ((getExpirationHeight(gameId) > height))
514514 then throw("Game is not expired")
515- else if ((callerAddress == getGameMaker(gameId)))
515+ else if ((callerAddress == getMaker(gameId)))
516516 then sendPrize(gameId, i.caller, "maker", getWinnerExpired(gameStep))
517- else if ((callerAddress == getGameTaker(gameId)))
517+ else if ((callerAddress == getTaker(gameId)))
518518 then sendPrize(gameId, i.caller, "taker", getWinnerExpired(gameStep))
519519 else throw("Invalid caller address")
520520 }
521521
522522
523523 @Verifier(tx)
524524 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
525525

github/deemru/w8io/169f3d6 
126.60 ms