tx · GXEXzz3wkM88SAYEBBqR3tsiuFLzyWbKVrDrze8BXmQG

3Mr1J95HgTFuj93Uh61WS1PBrxc5hSx5uE5:  -0.05000000 Waves

2024.10.28 11:25 [3346483] smart account 3Mr1J95HgTFuj93Uh61WS1PBrxc5hSx5uE5 > SELF 0.00000000 Waves

{ "type": 13, "id": "GXEXzz3wkM88SAYEBBqR3tsiuFLzyWbKVrDrze8BXmQG", "fee": 5000000, "feeAssetId": null, "timestamp": 1730104000599, "version": 2, "chainId": 84, "sender": "3Mr1J95HgTFuj93Uh61WS1PBrxc5hSx5uE5", "senderPublicKey": "DhKSnv34wE65np8uDd8E6ygEbNsn6fHx9p7q4hJTcgRw", "proofs": [ "5tJNn2eXK4kpZfiud2gYPuBhc1wTQjTBAMicdnhwr3oaadFP5rMx68PvcuPwjtfmmv7W3BncjXpRo7MfbjKSbzJ9" ], "script": "base64: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ckF0AAAAAgUAAAAMY3VycmVudEJvYXJkAAAAAAAAAAAFBgkAAAAAAAACCQEAAAAGY2hhckF0AAAAAgUAAAAMY3VycmVudEJvYXJkAAAAAAAAAAAFAgAAAAEwBgcEAAAAFnNldmVudGhQb3NpdGlvbkNvcnJlY3QDAwkAAAAAAAACCQEAAAAGY2hhckF0AAAAAgUAAAAFYm9hcmQAAAAAAAAAAAYJAQAAAAZjaGFyQXQAAAACBQAAAAxjdXJyZW50Qm9hcmQAAAAAAAAAAAYGCQAAAAAAAAIJAQAAAAZjaGFyQXQAAAACBQAAAAxjdXJyZW50Qm9hcmQAAAAAAAAAAAYCAAAAATAGBwQAAAAVZWlnaHRoUG9zaXRpb25Db3JyZWN0AwMJAAAAAAAAAgkBAAAABmNoYXJBdAAAAAIFAAAABWJvYXJkAAAAAAAAAAAHCQEAAAAGY2hhckF0AAAAAgUAAAAMY3VycmVudEJvYXJkAAAAAAAAAAAHBgkAAAAAAAACCQEAAAAGY2hhckF0AAAAAgUAAAAMY3VycmVudEJvYXJkAAAAAAAAAAAHAgAAAAEwBgcEAAAAFG5pbnRoUG9zaXRpb25Db3JyZWN0AwMJAAAAAAAAAgkBAAAABmNoYXJBdAAAAAIFAAAABWJvYXJkAAAAAAAAAAAICQEAAAAGY2hhckF0AAAAAgUAAAAMY3VycmVudEJvYXJkAAAAAAAAAAAIBgkAAAAAAAACCQEAAAAGY2hhckF0AAAAAgUAAAAMY3VycmVudEJvYXJkAAAAAAAAAAAIAgAAAAEwBgcEAAAAGG5vT2xkUG9zaXRpb25PdmVyd3JpdHRlbgMDAwMDAwMDBQAAABRmaXJzdFBvc2l0aW9uQ29ycmVjdAUAAAAVc2Vjb25kUG9zaXRpb25Db3JyZWN0BwUAAAAUdGhpcmRQb3NpdGlvbkNvcnJlY3QHBQAAABVmb3VydGhQb3NpdGlvbkNvcnJlY3QHBQAAABRmaWZ0aFBvc2l0aW9uQ29ycmVjdAcFAAAAFHNpeHRoUG9zaXRpb25Db3JyZWN0BwUAAAAWc2V2ZW50aFBvc2l0aW9uQ29ycmVjdAcFAAAAFWVpZ2h0aFBvc2l0aW9uQ29ycmVjdAcFAAAAFG5pbnRoUG9zaXRpb25Db3JyZWN0BwQAAAAKY291bnRNb3ZlcwkA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AAAAAQIAAAAoT25seSBpbml0aWF0b3IgaXMgYWxsb3dlZCB0byBtYWtlIG1vdmVzIQQAAAATbW92ZU9mUGxheWVySXNWYWxpZAkBAAAAEmNoZWNrSWZNb3ZlSXNWYWxpZAAAAAIFAAAABmdhbWVJZAUAAAAFYm9hcmQDCQEAAAABIQAAAAEFAAAAE21vdmVPZlBsYXllcklzVmFsaWQJAAACAAAAAQIAAAANSWxsZWdhbCBtb3ZlIQQAAAAMcGxheWVySGFzV29uCQEAAAATY2hlY2tJZlBsYXllckhhc1dvbgAAAAMFAAAABmdhbWVJZAUAAAAFYm9hcmQFAAAABlBMQVlFUgQAAAAVbnVtYmVyT2ZQb3NzaWJsZU1vdmVzCQEAAAAVZ2V0UG9zc2libGVNb3Zlc0NvdW50AAAAAQUAAAAFYm9hcmQDBQAAAAxwbGF5ZXJIYXNXb24JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkAASwAAAACAgAAAA1jdXJyZW50Qm9hcmRfBQAAAAZnYW1lSWQFAAAABWJvYXJkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgIAAAAHd2lubmVyXwUAAAAGZ2FtZUlkAgAAAAZwbGF5ZXIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAGc2VuZGVyBQAAAA5XSU5OSU5HX0FNT1VOVAUAAAAMQkFJX0FTU0VUX0lEBQAAAANuaWwDCQAAAAAAAAIFAAAAFW51bWJlck9mUG9zc2libGVNb3ZlcwAAAAAAAAAAAAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQABLAAAAAICAAAADWN1cnJlbnRCb2FyZF8FAAAABmdhbWVJZAUAAAAFYm9hcmQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkAASwAAAACAgAAAAd3aW5uZXJfBQAAAAZnYW1lSWQCAAAABGRyYXcFAAAAA25pbAQAAAAIbmV4dE1vdmUJAAP8AAAABAUAAAAMQkFJX0NPTlRSQUNUAgAAABRyZWdpc3RlclRhc2tDYWxsYmFjawkABEwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAGZ2FtZUlkAgAAAAFfBQAAAAVib2FyZAkABEwAAAACAgAAAAl0aWN0YWN0b2UJAARMAAAAAgIAAAAIY2FsbGJhY2sFAAAAA25pbAkABEwAAAACCQEAAAAPQXR0YWNoZWRQYXltZW50AAAAAgUAAAAMQkFJX0FTU0VUX0lEAAAAAAAAmJaABQAAAANuaWwDCQAAAAAAAAIFAAAACG5leHRNb3ZlBQAAAAhuZXh0TW92ZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQABLAAAAAICAAAADWN1cnJlbnRCb2FyZF8FAAAABmdhbWVJZAUAAAAFYm9hcmQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkAASwAAAACAgAAAAppbml0aWF0b3JfBQAAAAZnYW1lSWQJAAQlAAAAAQUAAAAGc2VuZGVyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgIAAAAHd2lubmVyXwUAAAAGZ2FtZUlkAgAAAARub25lCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgIAAAAMbmV4dF9wbGF5ZXJfBQAAAAZnYW1lSWQFAAAAAkFJBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXnR0Xfo", "height": 3346483, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8gpuWSjoVcdBjN5QVi6KbUMSJ3R4XETiTDo57Th2Ft47 Next: none Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let BAI_CONTRACT = "3N9tKixzqTYWnEXQxrDQ5pBTGvQd6sFsvmV"
4+let BAI_CONTRACT_PUBLIC_KEY = base58'DS6HkopS9zypvxX6VhkdNvv6v4wcPZuChRvTwKJeacxE'
5+
6+let BAI_CONTRACT = addressFromPublicKey(BAI_CONTRACT_PUBLIC_KEY)
57
68 let BAI_ASSET_ID = base58'AxGKQRxKo4F2EbhrRq6N2tdLsxtMnpzQsS4QemV6V1W1'
79
220222
221223
222224 @Callable(i)
223-func callback (taskId,gameIdAndBoard) = {
224- let parts = split(gameIdAndBoard, "_")
225- let gameId = parts[0]
226- let board = parts[1]
227- let nextPlayer = match getString(("next_player_" + gameId)) {
228- case s: String =>
229- s
230- case _ =>
231- ""
232- }
233- let moveOfAIIsValid = checkIfMoveIsValid(gameId, board)
234- if (!(moveOfAIIsValid))
235- then throw("Illegal move!")
236- else if ((nextPlayer != AI))
237- then throw("Player has to move first!")
238- else {
239- let aiHasWon = checkIfPlayerHasWon(gameId, board, AI)
240- if (aiHasWon)
241- then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("winner_" + gameId), "ai")]
242- else [StringEntry(("currentBoard_" + gameId), board), StringEntry(("next_player_" + gameId), PLAYER)]
243- }
244- }
225+func callback (taskId,gameIdAndBoard) = if ((i.callerPublicKey != BAI_CONTRACT_PUBLIC_KEY))
226+ then throw("Only BAI Contract is allowed to call the callback!")
227+ else {
228+ let parts = split(gameIdAndBoard, "_")
229+ let gameId = parts[0]
230+ let board = parts[1]
231+ let nextPlayer = match getString(("next_player_" + gameId)) {
232+ case s: String =>
233+ s
234+ case _ =>
235+ ""
236+ }
237+ let moveOfAIIsValid = checkIfMoveIsValid(gameId, board)
238+ if (!(moveOfAIIsValid))
239+ then throw("Illegal move!")
240+ else if ((nextPlayer != AI))
241+ then throw("Player has to move first!")
242+ else {
243+ let aiHasWon = checkIfPlayerHasWon(gameId, board, AI)
244+ if (aiHasWon)
245+ then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("winner_" + gameId), "ai")]
246+ else [StringEntry(("currentBoard_" + gameId), board), StringEntry(("next_player_" + gameId), PLAYER)]
247+ }
248+ }
245249
246250
247251
254258 let payment = i.payments[0]
255259 let fee = payment.amount
256260 let feeAssetId = payment.assetId
257- let minFee = match getInteger(Address(fromBase58String(BAI_CONTRACT)), "price_tictactoe") {
261+ let minFee = match getInteger(BAI_CONTRACT, "price_tictactoe") {
258262 case n: Int =>
259263 n
260264 case _ =>
304308 else if ((numberOfPossibleMoves == 0))
305309 then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("winner_" + gameId), "draw")]
306310 else {
307- let nextMove = invoke(Address(fromBase58String(BAI_CONTRACT)), "registerTaskCallback", [((gameId + "_") + board), "tictactoe", "callback"], [AttachedPayment(BAI_ASSET_ID, 10000000)])
311+ let nextMove = invoke(BAI_CONTRACT, "registerTaskCallback", [((gameId + "_") + board), "tictactoe", "callback"], [AttachedPayment(BAI_ASSET_ID, 10000000)])
308312 if ((nextMove == nextMove))
309313 then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("initiator_" + gameId), toString(sender)), StringEntry(("winner_" + gameId), "none"), StringEntry(("next_player_" + gameId), AI)]
310314 else throw("Strict value is not equal to itself.")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let BAI_CONTRACT = "3N9tKixzqTYWnEXQxrDQ5pBTGvQd6sFsvmV"
4+let BAI_CONTRACT_PUBLIC_KEY = base58'DS6HkopS9zypvxX6VhkdNvv6v4wcPZuChRvTwKJeacxE'
5+
6+let BAI_CONTRACT = addressFromPublicKey(BAI_CONTRACT_PUBLIC_KEY)
57
68 let BAI_ASSET_ID = base58'AxGKQRxKo4F2EbhrRq6N2tdLsxtMnpzQsS4QemV6V1W1'
79
810 let PLAYER = "1"
911
1012 let AI = "2"
1113
1214 let WINNING_AMOUNT = match getInteger("winning_amount") {
1315 case i: Int =>
1416 i
1517 case _ =>
1618 100000000
1719 }
1820
1921 func charAt (str,i) = split(str, "")[i]
2022
2123
2224 func checkIfMoveIsValid (gameId,board) = {
2325 let currentBoard = match getString(("currentBoard_" + gameId)) {
2426 case s: String =>
2527 s
2628 case _ =>
2729 "000000000"
2830 }
2931 let firstSelected = if ((charAt(board, 0) != charAt(currentBoard, 0)))
3032 then 1
3133 else 0
3234 let secondSelected = if ((charAt(board, 1) != charAt(currentBoard, 1)))
3335 then 1
3436 else 0
3537 let thirdSelected = if ((charAt(board, 2) != charAt(currentBoard, 2)))
3638 then 1
3739 else 0
3840 let fourthSelected = if ((charAt(board, 3) != charAt(currentBoard, 3)))
3941 then 1
4042 else 0
4143 let fifthSelected = if ((charAt(board, 4) != charAt(currentBoard, 4)))
4244 then 1
4345 else 0
4446 let sixthSelected = if ((charAt(board, 5) != charAt(currentBoard, 5)))
4547 then 1
4648 else 0
4749 let seventhSelected = if ((charAt(board, 6) != charAt(currentBoard, 6)))
4850 then 1
4951 else 0
5052 let eighthSelected = if ((charAt(board, 7) != charAt(currentBoard, 7)))
5153 then 1
5254 else 0
5355 let ninthSelected = if ((charAt(board, 8) != charAt(currentBoard, 8)))
5456 then 1
5557 else 0
5658 let firstPositionCorrect = if (if ((charAt(board, 0) == charAt(currentBoard, 0)))
5759 then true
5860 else (charAt(currentBoard, 0) == "0"))
5961 then true
6062 else false
6163 let secondPositionCorrect = if (if ((charAt(board, 1) == charAt(currentBoard, 1)))
6264 then true
6365 else (charAt(currentBoard, 1) == "0"))
6466 then true
6567 else false
6668 let thirdPositionCorrect = if (if ((charAt(board, 2) == charAt(currentBoard, 2)))
6769 then true
6870 else (charAt(currentBoard, 2) == "0"))
6971 then true
7072 else false
7173 let fourthPositionCorrect = if (if ((charAt(board, 3) == charAt(currentBoard, 3)))
7274 then true
7375 else (charAt(currentBoard, 3) == "0"))
7476 then true
7577 else false
7678 let fifthPositionCorrect = if (if ((charAt(board, 4) == charAt(currentBoard, 4)))
7779 then true
7880 else (charAt(currentBoard, 4) == "0"))
7981 then true
8082 else false
8183 let sixthPositionCorrect = if (if ((charAt(board, 5) == charAt(currentBoard, 5)))
8284 then true
8385 else (charAt(currentBoard, 5) == "0"))
8486 then true
8587 else false
8688 let seventhPositionCorrect = if (if ((charAt(board, 6) == charAt(currentBoard, 6)))
8789 then true
8890 else (charAt(currentBoard, 6) == "0"))
8991 then true
9092 else false
9193 let eighthPositionCorrect = if (if ((charAt(board, 7) == charAt(currentBoard, 7)))
9294 then true
9395 else (charAt(currentBoard, 7) == "0"))
9496 then true
9597 else false
9698 let ninthPositionCorrect = if (if ((charAt(board, 8) == charAt(currentBoard, 8)))
9799 then true
98100 else (charAt(currentBoard, 8) == "0"))
99101 then true
100102 else false
101103 let noOldPositionOverwritten = if (if (if (if (if (if (if (if (firstPositionCorrect)
102104 then secondPositionCorrect
103105 else false)
104106 then thirdPositionCorrect
105107 else false)
106108 then fourthPositionCorrect
107109 else false)
108110 then fifthPositionCorrect
109111 else false)
110112 then sixthPositionCorrect
111113 else false)
112114 then seventhPositionCorrect
113115 else false)
114116 then eighthPositionCorrect
115117 else false)
116118 then ninthPositionCorrect
117119 else false
118120 let countMoves = ((((((((firstSelected + secondSelected) + thirdSelected) + fourthSelected) + fifthSelected) + sixthSelected) + seventhSelected) + eighthSelected) + ninthSelected)
119121 let onlyOneMove = (1 >= countMoves)
120122 if ((countMoves > 1))
121123 then throw("More than move made!")
122124 else if (!(noOldPositionOverwritten))
123125 then throw("Former position overwritten!")
124126 else if (noOldPositionOverwritten)
125127 then onlyOneMove
126128 else false
127129 }
128130
129131
130132 func checkIfPlayerHasWon (gameId,board,player) = {
131133 let winningCombinations = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6]]
132134 let topRow = if (if ((charAt(board, winningCombinations[0][0]) == player))
133135 then (charAt(board, winningCombinations[0][1]) == player)
134136 else false)
135137 then (charAt(board, winningCombinations[0][2]) == player)
136138 else false
137139 let middleRow = if (if ((charAt(board, winningCombinations[1][0]) == player))
138140 then (charAt(board, winningCombinations[1][1]) == player)
139141 else false)
140142 then (charAt(board, winningCombinations[1][2]) == player)
141143 else false
142144 let bottomRow = if (if ((charAt(board, winningCombinations[2][0]) == player))
143145 then (charAt(board, winningCombinations[2][1]) == player)
144146 else false)
145147 then (charAt(board, winningCombinations[2][2]) == player)
146148 else false
147149 let leftColumn = if (if ((charAt(board, winningCombinations[3][0]) == player))
148150 then (charAt(board, winningCombinations[3][1]) == player)
149151 else false)
150152 then (charAt(board, winningCombinations[3][2]) == player)
151153 else false
152154 let middleColumn = if (if ((charAt(board, winningCombinations[4][0]) == player))
153155 then (charAt(board, winningCombinations[4][1]) == player)
154156 else false)
155157 then (charAt(board, winningCombinations[4][2]) == player)
156158 else false
157159 let rightColumn = if (if ((charAt(board, winningCombinations[5][0]) == player))
158160 then (charAt(board, winningCombinations[5][1]) == player)
159161 else false)
160162 then (charAt(board, winningCombinations[5][2]) == player)
161163 else false
162164 let diagonalOne = if (if ((charAt(board, winningCombinations[6][0]) == player))
163165 then (charAt(board, winningCombinations[6][1]) == player)
164166 else false)
165167 then (charAt(board, winningCombinations[6][2]) == player)
166168 else false
167169 let diagonalTwo = if (if ((charAt(board, winningCombinations[7][0]) == player))
168170 then (charAt(board, winningCombinations[7][1]) == player)
169171 else false)
170172 then (charAt(board, winningCombinations[7][2]) == player)
171173 else false
172174 if (if (if (if (if (if (if (topRow)
173175 then true
174176 else middleRow)
175177 then true
176178 else bottomRow)
177179 then true
178180 else leftColumn)
179181 then true
180182 else middleColumn)
181183 then true
182184 else rightColumn)
183185 then true
184186 else diagonalOne)
185187 then true
186188 else diagonalTwo
187189 }
188190
189191
190192 func getPossibleMovesCount (board) = {
191193 let firstMovePossible = if ((charAt(board, 0) == "0"))
192194 then 1
193195 else 0
194196 let secondMovePossible = if ((charAt(board, 1) == "0"))
195197 then 1
196198 else 0
197199 let thirdMovePossible = if ((charAt(board, 2) == "0"))
198200 then 1
199201 else 0
200202 let fourthMovePossible = if ((charAt(board, 3) == "0"))
201203 then 1
202204 else 0
203205 let fifthMovePossible = if ((charAt(board, 4) == "0"))
204206 then 1
205207 else 0
206208 let sixthMovePossible = if ((charAt(board, 5) == "0"))
207209 then 1
208210 else 0
209211 let seventhMovePossible = if ((charAt(board, 6) == "0"))
210212 then 1
211213 else 0
212214 let eigthMovePossible = if ((charAt(board, 7) == "0"))
213215 then 1
214216 else 0
215217 let ninthMovePossible = if ((charAt(board, 8) == "0"))
216218 then 1
217219 else 0
218220 ((((((((firstMovePossible + secondMovePossible) + thirdMovePossible) + fourthMovePossible) + fifthMovePossible) + sixthMovePossible) + seventhMovePossible) + eigthMovePossible) + ninthMovePossible)
219221 }
220222
221223
222224 @Callable(i)
223-func callback (taskId,gameIdAndBoard) = {
224- let parts = split(gameIdAndBoard, "_")
225- let gameId = parts[0]
226- let board = parts[1]
227- let nextPlayer = match getString(("next_player_" + gameId)) {
228- case s: String =>
229- s
230- case _ =>
231- ""
232- }
233- let moveOfAIIsValid = checkIfMoveIsValid(gameId, board)
234- if (!(moveOfAIIsValid))
235- then throw("Illegal move!")
236- else if ((nextPlayer != AI))
237- then throw("Player has to move first!")
238- else {
239- let aiHasWon = checkIfPlayerHasWon(gameId, board, AI)
240- if (aiHasWon)
241- then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("winner_" + gameId), "ai")]
242- else [StringEntry(("currentBoard_" + gameId), board), StringEntry(("next_player_" + gameId), PLAYER)]
243- }
244- }
225+func callback (taskId,gameIdAndBoard) = if ((i.callerPublicKey != BAI_CONTRACT_PUBLIC_KEY))
226+ then throw("Only BAI Contract is allowed to call the callback!")
227+ else {
228+ let parts = split(gameIdAndBoard, "_")
229+ let gameId = parts[0]
230+ let board = parts[1]
231+ let nextPlayer = match getString(("next_player_" + gameId)) {
232+ case s: String =>
233+ s
234+ case _ =>
235+ ""
236+ }
237+ let moveOfAIIsValid = checkIfMoveIsValid(gameId, board)
238+ if (!(moveOfAIIsValid))
239+ then throw("Illegal move!")
240+ else if ((nextPlayer != AI))
241+ then throw("Player has to move first!")
242+ else {
243+ let aiHasWon = checkIfPlayerHasWon(gameId, board, AI)
244+ if (aiHasWon)
245+ then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("winner_" + gameId), "ai")]
246+ else [StringEntry(("currentBoard_" + gameId), board), StringEntry(("next_player_" + gameId), PLAYER)]
247+ }
248+ }
245249
246250
247251
248252 @Callable(i)
249253 func playTTT (game,board) = {
250254 let numberOfPayments = size(i.payments)
251255 if ((numberOfPayments != 1))
252256 then throw("Payment necessary!")
253257 else {
254258 let payment = i.payments[0]
255259 let fee = payment.amount
256260 let feeAssetId = payment.assetId
257- let minFee = match getInteger(Address(fromBase58String(BAI_CONTRACT)), "price_tictactoe") {
261+ let minFee = match getInteger(BAI_CONTRACT, "price_tictactoe") {
258262 case n: Int =>
259263 n
260264 case _ =>
261265 0
262266 }
263267 if (if ((feeAssetId != BAI_ASSET_ID))
264268 then true
265269 else (minFee > fee))
266270 then throw("Payment of the minimal BAI amount necessary!")
267271 else {
268272 let sender = i.caller
269273 let gameId = if ((size(game) == 0))
270274 then toBase58String(i.transactionId)
271275 else game
272276 let nextPlayer = match getString(("next_player_" + gameId)) {
273277 case s: String =>
274278 s
275279 case _ =>
276280 PLAYER
277281 }
278282 if ((nextPlayer != PLAYER))
279283 then throw("AI hast to move first!")
280284 else {
281285 let currentBoard = match getString(("currentBoard_" + gameId)) {
282286 case s: String =>
283287 s
284288 case _ =>
285289 board
286290 }
287291 let initiator = match getString(("initiator_" + gameId)) {
288292 case s: String =>
289293 s
290294 case _ =>
291295 toString(sender)
292296 }
293297 if ((toString(sender) != initiator))
294298 then throw("Only initiator is allowed to make moves!")
295299 else {
296300 let moveOfPlayerIsValid = checkIfMoveIsValid(gameId, board)
297301 if (!(moveOfPlayerIsValid))
298302 then throw("Illegal move!")
299303 else {
300304 let playerHasWon = checkIfPlayerHasWon(gameId, board, PLAYER)
301305 let numberOfPossibleMoves = getPossibleMovesCount(board)
302306 if (playerHasWon)
303307 then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("winner_" + gameId), "player"), ScriptTransfer(sender, WINNING_AMOUNT, BAI_ASSET_ID)]
304308 else if ((numberOfPossibleMoves == 0))
305309 then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("winner_" + gameId), "draw")]
306310 else {
307- let nextMove = invoke(Address(fromBase58String(BAI_CONTRACT)), "registerTaskCallback", [((gameId + "_") + board), "tictactoe", "callback"], [AttachedPayment(BAI_ASSET_ID, 10000000)])
311+ let nextMove = invoke(BAI_CONTRACT, "registerTaskCallback", [((gameId + "_") + board), "tictactoe", "callback"], [AttachedPayment(BAI_ASSET_ID, 10000000)])
308312 if ((nextMove == nextMove))
309313 then [StringEntry(("currentBoard_" + gameId), board), StringEntry(("initiator_" + gameId), toString(sender)), StringEntry(("winner_" + gameId), "none"), StringEntry(("next_player_" + gameId), AI)]
310314 else throw("Strict value is not equal to itself.")
311315 }
312316 }
313317 }
314318 }
315319 }
316320 }
317321 }
318322
319323
320324 @Verifier(tx)
321325 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
322326

github/deemru/w8io/c3f4982 
35.57 ms