tx · HmvWp7SvDZw26hMA2NtnuuniZSUtuftgvPi9sZvPGd2V

3MzA23AE4UUWrM23oh1qK82J6fyBthBdwcZ:  -0.01500000 Waves

2020.06.16 13:41 [1045949] smart account 3MzA23AE4UUWrM23oh1qK82J6fyBthBdwcZ > SELF 0.00000000 Waves

{ "type": 13, "id": "HmvWp7SvDZw26hMA2NtnuuniZSUtuftgvPi9sZvPGd2V", "fee": 1500000, "feeAssetId": null, "timestamp": 1592304108100, "version": 1, "sender": "3MzA23AE4UUWrM23oh1qK82J6fyBthBdwcZ", "senderPublicKey": "BzPR4w4aBzsR6JueNYXGSWk5ydge7E2ttQnhsS44NhX2", "proofs": [ "mDxwyzJDGvte3g1CoBxYdXCTkNwPwFXH6efJxLfjEC7wxUF4XHEUrZ7R4hJB5Yb6jiAS94YRisxSYGaVPT4pQEJ" ], "script": "base64:AAIDAAAAAAAAAA0IARIDCgEIEgQKAggCAAAARgAAAAAJUlNBUFVCTElDCQACWwAAAAECAAABj2Jhc2U2NDpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQW1wdVhjSS9vNHBJQjV5d3Y5RE9PR2FwVEJVd1JWbE0vNitINmhGZWxPWHRrcndZL1lJdG1QeEVEcHo3ckFlclFQUWU5dERQRWFBdi9HbmxFenR5Yk9GWGd1OUR6RGU4WW9NUkQxdmFrZ29BY29nbWJZNThRRDZLTWo1SGtvVmoveVROSWM5c3pqNXFoSWxyQWRtYjNLTEw2aFFVN3k4K0pqNjlCV1ZQc2FRZ2tzcFNkZVl0YjF0SFFjN3Q5NW43T1o1NnIyQTdHMytiUWY2blNNa1BrQWhJckVwYkNtNThvaUdCY3pkVGQvTHFGU1ZvdFpzYkw3WWg2U0hMZm5IZUQrUWdjZkpybmFtOE9ITUdKRUpUUlhqSUxlSEdqbFJDUDhvVnBpb0hyeTFTMnhQeDVzVnpJbTJNTStDelllbkFHbG8wajI2YXRCaGlVTG9UdWx3RDNwUUlEQVFBQgAAAAAGU0VSVkVSCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAECAAAAIzNONEFpYjVpdWJXaUdNemRUaDZ3V2lWRFZibzMyb2VWVW1IAAAAABNSQU5ET1JBQ0xFVElNRUZSQU1FAAAAAAAAABDgAAAAAAZXQVZFU0QAAAAAAAX14QAAAAAABVVTRE5EAAAAAAAAD0JAAAAAAAhERUNJTUFMUwkABEwAAAACBQAAAAZXQVZFU0QJAARMAAAAAgUAAAAFVVNETkQFAAAAA25pbAAAAAAGQVNTRVRTCQAETAAAAAIFAAAABHVuaXQJAARMAAAAAgkAAlkAAAABAgAAACwyNUZFcUVqUmtxSzZ5Q2tpVDdMejZTQVl6N2dVRkN0eGZDQ2huclZGRDVBVAUAAAADbmlsAQAAAAlnZXRCZXRNaW4AAAABAAAAB2Fzc2V0SWQJAABpAAAAAgkAAGgAAAACAAAAAAAAAAABCQABkQAAAAIFAAAACERFQ0lNQUxTBQAAAAdhc3NldElkAAAAAAAAAAACAQAAAAlnZXRCZXRNYXgAAAABAAAAB2Fzc2V0SWQJ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AAIFAAAADlJFU0VSVkFUSU9OS0VZBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAABAAAAFWluY3JlYXNlUmVzZXJ2ZUFtb3VudAAAAAIAAAAJd2luQW1vdW50AAAAB2Fzc2V0SWQEAAAAEW5ld1Jlc2VydmVkQW1vdW50CQAAZAAAAAIJAQAAAAhnZXRJbnRPcgAAAAIJAAGRAAAAAgUAAAAOUkVTRVJWQVRJT05LRVkFAAAAB2Fzc2V0SWQAAAAAAAAAAAAFAAAACXdpbkFtb3VudAMJAABmAAAAAgUAAAARbmV3UmVzZXJ2ZWRBbW91bnQJAAPrAAAAAgUAAAAEdGhpcwkAAZEAAAACBQAAAAZBU1NFVFMFAAAAB2Fzc2V0SWQJAAACAAAAAQIAAABUSW5zdWZmaWNpZW50IGZ1bmRzIG9uIERpY2UgUm9sbGVyIGFjY291bnQuIFRyYW5zYWN0aW9uIHdhcyByZWplY3RlZCBmb3IgeW91ciBzYWZldHkuBQAAABFuZXdSZXNlcnZlZEFtb3VudAEAAAAWZGVjcmVhc2VSZXNlcnZlZEFtb3VudAAAAAMAAAAGZ2FtZUlkAAAAB2Fzc2V0SWQAAAAJd2luQW1vdW50AwkAAGYAAAACAAAAAAAAAAAACQAAZQAAAAIJAQAAAAhnZXRJbnRPcgAAAAIJAAGRAAAAAgUAAAAOUkVTRVJWQVRJT05LRVkFAAAAB2Fzc2V0SWQAAAAAAAAAAAAFAAAACXdpbkFtb3VudAkAAAIAAAABAgAAAEJJbnZhbGlkIERpY2UgUm9sbGVyIGFjY291bnQgc3RhdGUgLSByZXNlcnZlZCBhbW91bnQgaXMgbGVzcyB0aGFuIDAJAQAAAAljaGFuZ2VJbnQAAAACCQABkQAAAAIFAAAADlJFU0VSVkFUSU9OS0VZBQAAAAdhc3NldElkCQEAAAABLQAAAAEFAAAACXdpbkFtb3VudAEAAAAVdmFsaWRhdGVBbmRHZXRBc3NldElkAAAAAQAAAAdhc3NldElkAwkAAAAAAAACBQAAAAdhc3NldElkCQABkQAAAAIFAAAABkFTU0VUUwAAAAAAAAAAAAAAAAAAAAAAAAMJAAAAAAAAAgUA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AAAAAgUAAAAGZ2FtZUlkBQAAAAhnYW1lRGF0YQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAABlNFUlZFUgUAAAAKY29tbWlzc2lvbggFAAAAAXAAAAAHYXNzZXRJZAUAAAADbmlsAAAAAWkBAAAACHdpdGhkcmF3AAAAAgAAAAZnYW1lSWQAAAAHcnNhU2lnbgQAAAAIZ2FtZURhdGEJAQAAAA9leHRyYWN0R2FtZURhdGEAAAABBQAAAAZnYW1lSWQEAAAACWdhbWVTdGF0ZQkAAZEAAAACBQAAAAhnYW1lRGF0YQUAAAAMSWR4R2FtZVN0YXRlBAAAAAxwbGF5ZXJDaG9pY2UJAAGRAAAAAgUAAAAIZ2FtZURhdGEFAAAAD0lkeFBsYXllckNob2ljZQQAAAANc3RhcnRlZEhlaWdodAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGdhbWVEYXRhBQAAABBJZHhTdGFydGVkSGVpZ2h0BAAAAAl3aW5BbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhnYW1lRGF0YQUAAAAMSWR4V2luQW1vdW50BAAAAAdhc3NldElkCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIZ2FtZURhdGEFAAAACklkeEFzc2V0SWQEAAAADnBsYXllclB1YktleTU4CQABkQAAAAIFAAAACGdhbWVEYXRhBQAAABFJZHhQbGF5ZXJQdWJLZXk1OAQAAAANcGxheWVyQWRkcmVzcwkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAAA5wbGF5ZXJQdWJLZXk1OAQAAAAMd2luQnlUaW1lb3V0CQAAZgAAAAIJAABlAAAAAgUAAAAGaGVpZ2h0BQAAAA1zdGFydGVkSGVpZ2h0BQAAABNSQU5ET1JBQ0xFVElNRUZSQU1FBAAAABFkZWNyZWFzZWRSZXNlcnZlcwkBAAAAFmRlY3JlYXNlUmVzZXJ2ZWRBbW91bnQAAAADBQAAAAZnYW1lSWQFAAAAB2Fzc2V0SWQFAAAACXdpbkFtb3VudAMJAQAAAAIhPQAAAAIFAAAACWdhbWVTdGF0ZQUAAAAOU1RBVEVTVUJNSVRURUQJAAACAAAAAQIAAAAkSW52YWxpZCBnYW1lIHN0YXRlIGZvciBwYXNzZWQgZ2FtZUlkAwUAAAAMd2luQnlUaW1lb3V0BAAAAAdyYW5kU3RyBQAAAAxwbGF5ZXJDaG9pY2UEAAAADm5ld0dhbWVEYXRhU3RyCQEAAAAOZm9ybWF0R2FtZURhdGEAAAAHBQAAAAhTVEFURVdPTgUAAAAMcGxheWVyQ2hvaWNlBQAAAA5wbGF5ZXJQdWJLZXk1OAUAAAANc3RhcnRlZEhlaWdodAUAAAAJd2luQW1vdW50BQAAAAdhc3NldElkBQAAAAdyYW5kU3RyCQEAAAAMd2luU2NyaXB0U2V0AAAABwUAAAAGZ2FtZUlkBQAAAA1wbGF5ZXJBZGRyZXNzBQAAAAl3aW5BbW91bnQFAAAAB2Fzc2V0SWQFAAAADm5ld0dhbWVEYXRhU3RyBQAAAAx3aW5CeVRpbWVvdXQFAAAAEWRlY3JlYXNlZFJlc2VydmVzBAAAAARyYW5kCQEAAAAPZ2VuZXJhdGVSYW5kSW50AAAAAgUAAAAGZ2FtZUlkBQAAAAdyc2FTaWduBAAAAAdyYW5kU3RyCQEAAAAJcmFuZFRvU3RyAAAAAQUAAAAEcmFuZAMJAQAAAAtpc1BsYXllcldpbgAAAAIFAAAADHBsYXllckNob2ljZQUAAAAEcmFuZAQAAAAObmV3R2FtZURhdGFTdHIJAQAAAA5mb3JtYXRHYW1lRGF0YQAAAAcFAAAACFNUQVRFV09OBQAAAAxwbGF5ZXJDaG9pY2UFAAAADnBsYXllclB1YktleTU4BQAAAA1zdGFydGVkSGVpZ2h0BQAAAAl3aW5BbW91bnQFAAAAB2Fzc2V0SWQFAAAAB3JhbmRTdHIJAQAAAAx3aW5TY3JpcHRTZXQAAAAHBQAAAAZnYW1lSWQFAAAADXBsYXllckFkZHJlc3MFAAAACXdpbkFtb3VudAUAAAAHYXNzZXRJZAUAAAAObmV3R2FtZURhdGFTdHIFAAAADHdpbkJ5VGltZW91dAUAAAARZGVjcmVhc2VkUmVzZXJ2ZXMEAAAADm5ld0dhbWVEYXRhU3RyCQEAAAAOZm9ybWF0R2FtZURhdGEAAAAHBQAAAAlTVEFURUxPU1QFAAAADHBsYXllckNob2ljZQUAAAAOcGxheWVyUHViS2V5NTgFAAAADXN0YXJ0ZWRIZWlnaHQFAAAACXdpbkFtb3VudAUAAAAHYXNzZXRJZAUAAAAHcmFuZFN0cgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAGZ2FtZUlkBQAAAA5uZXdHYW1lRGF0YVN0cgkABEwAAAACBQAAABFkZWNyZWFzZWRSZXNlcnZlcwUAAAADbmlsAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5BAAAAAckbWF0Y2gwBQAAAAJ0eAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAATVHJhbnNmZXJUcmFuc2FjdGlvbgQAAAADdHR4BQAAAAckbWF0Y2gwBAAAAAdhc3NldElkCQEAAAAVdmFsaWRhdGVBbmRHZXRBc3NldElkAAAAAQgFAAAAA3R0eAAAAAdhc3NldElkCQAAZwAAAAIJAABlAAAAAgkAA+sAAAACBQAAAAR0aGlzCAUAAAADdHR4AAAAB2Fzc2V0SWQIBQAAAAN0dHgAAAAGYW1vdW50CQEAAAAIZ2V0SW50T3IAAAACCQABkQAAAAIFAAAADlJFU0VSVkFUSU9OS0VZBQAAAAdhc3NldElkAAAAAAAAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABRTZXRTY3JpcHRUcmFuc2FjdGlvbgQAAAADc3R4BQAAAAckbWF0Y2gwAwkAAAAAAAACCQEAAAAIZ2V0SW50T3IAAAACCQABkQAAAAIFAAAADlJFU0VSVkFUSU9OS0VZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAIJAQAAAAhnZXRJbnRPcgAAAAIJAAGRAAAAAgUAAAAOUkVTRVJWQVRJT05LRVkAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAHBwd1WlUm", "chainId": 84, "height": 1045949, "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 3 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let RSAPUBLIC = fromBase64String("base64:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmpuXcI/o4pIB5ywv9DOOGapTBUwRVlM/6+H6hFelOXtkrwY/YItmPxEDpz7rAerQPQe9tDPEaAv/GnlEztybOFXgu9DzDe8YoMRD1vakgoAcogmbY58QD6KMj5HkoVj/yTNIc9szj5qhIlrAdmb3KLL6hQU7y8+Jj69BWVPsaQgkspSdeYtb1tHQc7t95n7OZ56r2A7G3+bQf6nSMkPkAhIrEpbCm58oiGBczdTd/LqFSVotZsbL7Yh6SHLfnHeD+QgcfJrnam8OHMGJEJTRXjILeHGjlRCP8oVpioHry1S2xPx5sVzIm2MM+CzYenAGlo0j26atBhiULoTulwD3pQIDAQAB")
5+
6+let SERVER = addressFromStringValue("3N4Aib5iubWiGMzdTh6wWiVDVbo32oeVUmH")
7+
8+let RANDORACLETIMEFRAME = 4320
9+
10+let WAVESD = 100000000
11+
12+let USDND = 1000000
13+
14+let DECIMALS = [WAVESD, USDND]
15+
16+let ASSETS = [unit, fromBase58String("25FEqEjRkqK6yCkiT7Lz6SAYz7gUFCtxfCChnrVFD5AT")]
17+
18+func getBetMin (assetId) = ((1 * DECIMALS[assetId]) / 2)
19+
20+
21+func getBetMax (assetId) = (6 * DECIMALS[assetId])
22+
23+
24+func getBetStep (assetId) = ((1 * DECIMALS[assetId]) / 10)
25+
26+
27+func getIntOr (key,default) = if (isDefined(getInteger(this, key)))
28+ then getIntegerValue(this, key)
29+ else default
30+
31+
32+func setInt (key,value) = DataEntry(key, value)
33+
34+
35+func incrementInt (key) = setInt(key, (getIntOr(key, -1) + 1))
36+
37+
38+func changeInt (key,by) = setInt(key, (getIntOr(key, 0) + by))
39+
40+
41+let PRECISION = 10000
42+
43+let R1MAX = 96
44+
45+let R1MIN = 94
46+
47+let R1K = 9860
48+
49+let R2MAX = 93
50+
51+let R2MIN = 87
52+
53+let R2K = 9800
54+
55+let R3MAX = 86
56+
57+let R3MIN = 86
58+
59+let R3K = 9750
60+
61+let R4MAX = 85
62+
63+let R4MIN = 84
64+
65+let R4K = 9670
66+
67+let R5MAX = 83
68+
69+let R5MIN = 83
70+
71+let R5K = 9630
72+
73+let R6MAX = 82
74+
75+let R6MIN = 67
76+
77+let R6K = 9610
78+
79+let R7MAX = 66
80+
81+let R7MIN = 56
82+
83+let R7K = 9560
84+
85+let R8MAX = 55
86+
87+let R8MIN = 38
88+
89+let R8K = 9500
90+
91+let R9MAX = 37
92+
93+let R9MIN = 3
94+
95+let R9K = 9290
96+
97+let R10MAX = 2
98+
99+let R10MIN = 1
100+
101+let R10K = 9860
102+
103+let IdxGameState = 0
104+
105+let IdxPlayerChoice = 1
106+
107+let IdxPlayerPubKey58 = 2
108+
109+let IdxStartedHeight = 3
110+
111+let IdxWinAmount = 4
112+
113+let IdxAssetId = 5
114+
115+let RESERVATIONKEY = ["$RESERVED_AMOUNT_WAVES", "$RESERVED_AMOUNT_USDN"]
116+
117+let GAMESCOUNTERKEY = "$GAME_NUM"
118+
119+let MAXBALANCEKEY = "$MAX_BALANCE"
120+
121+let STATESUBMITTED = "SUBMITTED"
122+
123+let STATEWON = "WON"
124+
125+let STATELOST = "LOST"
126+
127+func incrementGameNum () = {
128+ let gameNum = match getInteger(this, GAMESCOUNTERKEY) {
129+ case num: Int =>
130+ num
131+ case _ =>
132+ 0
133+ }
134+ (gameNum + 1)
135+ }
136+
137+
138+func extractReservedAmount (assetId) = match getInteger(this, RESERVATIONKEY[assetId]) {
139+ case a: Int =>
140+ a
141+ case _ =>
142+ 0
143+}
144+
145+
146+func increaseReserveAmount (winAmount,assetId) = {
147+ let newReservedAmount = (getIntOr(RESERVATIONKEY[assetId], 0) + winAmount)
148+ if ((newReservedAmount > assetBalance(this, ASSETS[assetId])))
149+ then throw("Insufficient funds on Dice Roller account. Transaction was rejected for your safety.")
150+ else newReservedAmount
151+ }
152+
153+
154+func decreaseReservedAmount (gameId,assetId,winAmount) = if ((0 > (getIntOr(RESERVATIONKEY[assetId], 0) - winAmount)))
155+ then throw("Invalid Dice Roller account state - reserved amount is less than 0")
156+ else changeInt(RESERVATIONKEY[assetId], -(winAmount))
157+
158+
159+func validateAndGetAssetId (assetId) = if ((assetId == ASSETS[0]))
160+ then 0
161+ else if ((assetId == ASSETS[1]))
162+ then 1
163+ else throw("Invalid payment asset")
164+
165+
166+func validateBetAndGetWinAmount (bet,assetId,playerChoice) = {
167+ let BETMIN = getBetMin(assetId)
168+ let BETMAX = getBetMax(assetId)
169+ let BETSTEP = getBetStep(assetId)
170+ let betAmountValid = if (if ((bet >= BETMIN))
171+ then (BETMAX >= bet)
172+ else false)
173+ then ((bet % BETSTEP) == 0)
174+ else false
175+ if (betAmountValid)
176+ then {
177+ let playerChoiceInt = parseIntValue(playerChoice)
178+ if (if ((playerChoiceInt >= 1))
179+ then (96 >= playerChoiceInt)
180+ else false)
181+ then {
182+ let RKxPrecision = if (if ((R1MAX >= playerChoiceInt))
183+ then (playerChoiceInt >= R1MIN)
184+ else false)
185+ then R1K
186+ else if (if ((R2MAX >= playerChoiceInt))
187+ then (playerChoiceInt >= R2MIN)
188+ else false)
189+ then R2K
190+ else if (if ((R3MAX >= playerChoiceInt))
191+ then (playerChoiceInt >= R3MIN)
192+ else false)
193+ then R3K
194+ else if (if ((R4MAX >= playerChoiceInt))
195+ then (playerChoiceInt >= R4MIN)
196+ else false)
197+ then R4K
198+ else if (if ((R5MAX >= playerChoiceInt))
199+ then (playerChoiceInt >= R5MIN)
200+ else false)
201+ then R5K
202+ else if (if ((R6MAX >= playerChoiceInt))
203+ then (playerChoiceInt >= R6MIN)
204+ else false)
205+ then R6K
206+ else if (if ((R7MAX >= playerChoiceInt))
207+ then (playerChoiceInt >= R7MIN)
208+ else false)
209+ then R7K
210+ else if (if ((R8MAX >= playerChoiceInt))
211+ then (playerChoiceInt >= R8MIN)
212+ else false)
213+ then R8K
214+ else if (if ((R9MAX >= playerChoiceInt))
215+ then (playerChoiceInt >= R9MIN)
216+ else false)
217+ then R9K
218+ else if (if ((R10MAX >= playerChoiceInt))
219+ then (playerChoiceInt >= R10MIN)
220+ else false)
221+ then R10K
222+ else throw(("Couldn't define range: playerChoice=" + playerChoice))
223+ ((((100 * RKxPrecision) / playerChoiceInt) * bet) / PRECISION)
224+ }
225+ else throw("Player choice is out of the condition below: 1 <= choice <= 96")
226+ }
227+ else throw(((((("Bet amount is not in range: minBet=" + toString(BETMIN)) + " maxBet=") + toString(BETMAX)) + " betStep=") + toString(BETSTEP)))
228+ }
229+
230+
231+func randToStr (r) = if (if ((r >= 1))
232+ then (100 >= r)
233+ else false)
234+ then toString(r)
235+ else throw(("Unsupported r parameter passed: expected=[1,...,100] actual=" + toString(r)))
236+
237+
238+func generateRandInt (gameId,rsaSign) = {
239+ let rsaSigValid = rsaVerify(SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
240+ if (rsaSigValid)
241+ then {
242+ let rand = (toInt(sha256(rsaSign)) % 100)
243+ if ((0 > rand))
244+ then ((-1 * rand) + 1)
245+ else (rand + 1)
246+ }
247+ else throw("Invalid RSA signature")
248+ }
249+
250+
251+func isPlayerWin (playerChoice,rand) = {
252+ let playerChoiceInt = parseIntValue(playerChoice)
253+ (playerChoiceInt >= rand)
254+ }
255+
256+
257+func formatGameDataParam (p) = {
258+ let s = size(p)
259+ if ((s == 0))
260+ then throw("Parameter size must be greater then 0")
261+ else if ((s > 99))
262+ then throw("Parameter size must be less then 100")
263+ else if ((10 > s))
264+ then (("0" + toString(s)) + p)
265+ else (toString(s) + p)
266+ }
267+
268+
269+func formatGameData (gameState,playerChoice,playerPubKey58,startedHeight,winAmount,assetId,randOrEmpty) = (((((((((((gameState + "_") + playerChoice) + "_") + playerPubKey58) + "_") + toString(startedHeight)) + "_") + toString(winAmount)) + "_") + toString(assetId)) + (if ((randOrEmpty == ""))
270+ then ""
271+ else ("_" + randOrEmpty)))
272+
273+
274+func extractGameData (gameId) = split(match getString(this, gameId) {
275+ case str: String =>
276+ str
277+ case _ =>
278+ throw((("Game: " + gameId) + " not found."))
279+}, "_")
280+
281+
282+func winScriptSet (gameId,playerAddress,winAmount,assetId,newGameDataStr,winByTimeout,decreasedReserves) = {
283+ let wSetCommonData = [decreasedReserves]
284+ let tSetCommonData = [ScriptTransfer(playerAddress, winAmount, ASSETS[assetId])]
285+ if (winByTimeout)
286+ then {
287+ let newGameDataStrAdjusted = (newGameDataStr + "_TIMEOUT")
288+ let gameData = DataEntry(gameId, newGameDataStrAdjusted)
289+ ScriptResult(WriteSet(gameData :: wSetCommonData), TransferSet(tSetCommonData))
290+ }
291+ else {
292+ let gameData = DataEntry(gameId, newGameDataStr)
293+ ScriptResult(WriteSet(gameData :: wSetCommonData), TransferSet(tSetCommonData))
294+ }
295+ }
296+
297+
298+@Callable(i)
299+func bet (playerChoice) = {
300+ let gameId = toBase58String(i.transactionId)
301+ if ((i.payment == unit))
302+ then throw("No payment")
303+ else if (isDefined(getString(this, gameId)))
304+ then throw((("Bet for: " + gameId) + " was already made."))
305+ else if (if ((i.feeAssetId != ASSETS[0]))
306+ then (i.feeAssetId != ASSETS[1])
307+ else false)
308+ then throw("Invalid fee")
309+ else {
310+ let p = extract(i.payment)
311+ if ((i.feeAssetId != p.assetId))
312+ then throw("Fee assetId and payment assetId should match")
313+ else {
314+ let assetId = validateAndGetAssetId(p.assetId)
315+ let commission = i.fee
316+ let winAmount = validateBetAndGetWinAmount((p.amount - i.fee), assetId, playerChoice)
317+ let playerPubKey58 = toBase58String(i.callerPublicKey)
318+ let gameData = formatGameData(STATESUBMITTED, playerChoice, playerPubKey58, height, winAmount, assetId, "")
319+ ScriptResult(WriteSet([DataEntry(RESERVATIONKEY[assetId], increaseReserveAmount(winAmount, assetId)), incrementInt(GAMESCOUNTERKEY), DataEntry(gameId, gameData)]), TransferSet([ScriptTransfer(SERVER, commission, p.assetId)]))
320+ }
321+ }
322+ }
323+
324+
325+
326+@Callable(i)
327+func withdraw (gameId,rsaSign) = {
328+ let gameData = extractGameData(gameId)
329+ let gameState = gameData[IdxGameState]
330+ let playerChoice = gameData[IdxPlayerChoice]
331+ let startedHeight = parseIntValue(gameData[IdxStartedHeight])
332+ let winAmount = parseIntValue(gameData[IdxWinAmount])
333+ let assetId = parseIntValue(gameData[IdxAssetId])
334+ let playerPubKey58 = gameData[IdxPlayerPubKey58]
335+ let playerAddress = addressFromPublicKey(fromBase58String(playerPubKey58))
336+ let winByTimeout = ((height - startedHeight) > RANDORACLETIMEFRAME)
337+ let decreasedReserves = decreaseReservedAmount(gameId, assetId, winAmount)
338+ if ((gameState != STATESUBMITTED))
339+ then throw("Invalid game state for passed gameId")
340+ else if (winByTimeout)
341+ then {
342+ let randStr = playerChoice
343+ let newGameDataStr = formatGameData(STATEWON, playerChoice, playerPubKey58, startedHeight, winAmount, assetId, randStr)
344+ winScriptSet(gameId, playerAddress, winAmount, assetId, newGameDataStr, winByTimeout, decreasedReserves)
345+ }
346+ else {
347+ let rand = generateRandInt(gameId, rsaSign)
348+ let randStr = randToStr(rand)
349+ if (isPlayerWin(playerChoice, rand))
350+ then {
351+ let newGameDataStr = formatGameData(STATEWON, playerChoice, playerPubKey58, startedHeight, winAmount, assetId, randStr)
352+ winScriptSet(gameId, playerAddress, winAmount, assetId, newGameDataStr, winByTimeout, decreasedReserves)
353+ }
354+ else {
355+ let newGameDataStr = formatGameData(STATELOST, playerChoice, playerPubKey58, startedHeight, winAmount, assetId, randStr)
356+ WriteSet([DataEntry(gameId, newGameDataStr), decreasedReserves])
357+ }
358+ }
359+ }
360+
361+
362+@Verifier(tx)
363+func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
364+ then match tx {
365+ case ttx: TransferTransaction =>
366+ let assetId = validateAndGetAssetId(ttx.assetId)
367+ ((assetBalance(this, ttx.assetId) - ttx.amount) >= getIntOr(RESERVATIONKEY[assetId], 0))
368+ case stx: SetScriptTransaction =>
369+ if ((getIntOr(RESERVATIONKEY[0], 0) == 0))
370+ then (getIntOr(RESERVATIONKEY[1], 0) == 0)
371+ else false
372+ case _ =>
373+ false
374+ }
375+ else false
376+

github/deemru/w8io/873ac7e 
31.49 ms