tx · SdbTsCAiPk8fsrHpmZBw4vnWT7PuWxbpYu8kK1Ysxim

3MsGBnTzBhrNe6w1KpLYPkzdDdxWudm4U89:  -0.01400000 Waves

2019.08.21 09:36 [640528] smart account 3MsGBnTzBhrNe6w1KpLYPkzdDdxWudm4U89 > SELF 0.00000000 Waves

{ "type": 13, "id": "SdbTsCAiPk8fsrHpmZBw4vnWT7PuWxbpYu8kK1Ysxim", "fee": 1400000, "feeAssetId": null, "timestamp": 1566369422779, "version": 1, "sender": "3MsGBnTzBhrNe6w1KpLYPkzdDdxWudm4U89", "senderPublicKey": "FgbqvGasMMrXxbhwrsgEiCgJLjXPjgn8kHxsZiVmLrkb", "proofs": [ "eEcjgH8WVdveHJtyYHh3bAAKU1vHvFxFZQZXPzUA8B7KJJj2kGoEJTueYw6tnRuBXnpZ7BcyxdiU9Xqsgh1fNXN" ], "script": "base64:AAIDAAAAAAAAAAAAAAAgAAAAAAlSU0FQVUJMSUMJAAJbAAAAAQIAAAGPYmFzZTY0Ok1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBbGVtcjk1SjFqWlVzN2NKbXJtbWxONHpvN1lWc0JKekllSmRrOExERkdoVUtTSTZ5ZnMyMFp5SmUyMSs2R0p3Tm5LVVUxVXlvYzE3d1NXTUtrclowTU12WUUrWjVBaWlqdkJLNHNTSjNJZ0dqZFU4L05oSThDQkR1MEYreFJNOXEzVEIzTExiRHk1c0JkdWRZZkhmc1VPYytNVHZBRDY5bjI3ZGIyUmg4K3laUU10dWJrdVRRTnA4OXNwaEhRYUxHeVFGYU5sSy9OYTNsRng2b21xemFhMWdqb3BsVXI2cnZZS2dmQUlDVUIzelZtSlNoaUVpN3c3UjBoV2xOUkQzcWNaakNVT05TcEZvNFdiemtuR09henc4NEIrSU1JRm5JcFhXelFMOFJYMHZOY2ZzQnZMRGZNNmsyWmFjcXd5TUthTExxaWdkQmlHZEo3VyswbE9TdE9RSURBUUFCAAAAABNSQU5ET1JBQ0xFVElNRUZSQU1FAAAAAAAAABDgAAAAAAdXQVZFTEVUCQAAaAAAAAIJAABoAAAAAgAAAAAAAAAAZAAAAAAAAAAD6AAAAAAAAAAD6AAAAAAKQ09NTUlTU0lPTgkAAGkAAAACCQAAaAAAAAIAAAAAAAAAAAUFAAAAB1dBVkVMRVQAAAAAAAAAA+gAAAAABEJFVDEJAABoAAAAAgAAAAAAAAAAAQUAAAAHV0FWRUxFVAAAAAAEQkVUMgkAAGgAAAACAAAAAAAAAAACBQAAAAdXQVZFTEVUAAAAAARCRVQ0CQAAaAAAAAIAAAAAAAAAAAQFAAAAB1dBVkVMRVQAAAAABEJFVDgJAABoAAAAAgAAAAAAAAAACAUAAAAHV0FWRUxFVAAAAAAFQkVUMTQJAABoAAAAAgAAAAAAAAAADgUAAAAHV0FWRUxFVAAAAAAIUkFURU1VTFQAAAAAAAAAJxAAAAAABVJBVEUxAAAAAAAAAJrnAAAAAAVSQVRFMgAAAAAAAABgGAAAAAAFUkFURTMAAAAAAAAASjgAAAAABVJBVEU0AAAAAAAAADd4AAAAAAVSQVRFNQAAAAAAAAAsiAAA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AAZnYW1lSWQJAAJYAAAAAQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAQAAAADcG10CQEAAAAHZXh0cmFjdAAAAAEIBQAAAAFpAAAAB3BheW1lbnQEAAAADWJldE5vdEluV2F2ZXMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQEAAAADWZlZU5vdEluV2F2ZXMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQEAAAABndpbkFtdAkBAAAAGlZhbGlkYXRlQmV0QW5kRGVmaW5lV2luQW10AAAAAggFAAAAA3BtdAAAAAZhbW91bnQFAAAADHBsYXllckNob2ljZQQAAAAIdHhJZFVzZWQJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAABmdhbWVJZAMFAAAADWJldE5vdEluV2F2ZXMJAAACAAAAAQIAAAAbQmV0IGFtb3VudCBtdXN0IGJlIGluIFdhdmVzAwUAAAANZmVlTm90SW5XYXZlcwkAAAIAAAABAgAAACJUcmFuc2FjdGlvbidzIGZlZSBtdXN0IGJlIGluIFdhdmVzAwUAAAAIdHhJZFVzZWQJAAACAAAAAQIAAAAvUGFzc2VkIHR4SWQgaGFkIGJlZW4gdXNlZCBiZWZvcmUuIEdhbWUgYWJvcnRlZC4EAAAADnBsYXllclB1YktleTU4CQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQQAAAALZ2FtZURhdGFTdHIJAQAAABFGb3JtYXRHYW1lRGF0YVN0cgAAAAYFAAAADlNUQVRFU1VCTUlUVEVEBQAAAAxwbGF5ZXJDaG9pY2UFAAAADnBsYXllclB1YktleTU4BQAAAAZoZWlnaHQFAAAABndpbkFtdAIAAAAABAAAAAZTRVJWRVIJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQQAAAAOc2VydmVyVHJhbnNmZXIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAGU0VSVkVSBQAAAApDT01NSVNTSU9OBQAAAAR1bml0BQAAAANuaWwEAAAAB2JldERhdGEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADlJFU0VSVkFUSU9OS0VZCQEAAAAeVmFsaWRhdGVBbmRJbmNyZWFzZVJlc2VydmVkQW10AAAAAQUAAAAGd2luQW10CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA9HQU1FU0NPVU5URVJLRVkFAAAACm5ld0dhbWVOdW0JAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAABmdhbWVJZAUAAAALZ2FtZURhdGFTdHIFAAAAA25pbAkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEFAAAAB2JldERhdGEJAQAAAAtUcmFuc2ZlclNldAAAAAEFAAAADnNlcnZlclRyYW5zZmVyAAAAAOoVkbk=", "chainId": 84, "height": 640528, "spentComplexity": 0 } View: original | compacted Prev: BNcRqiYRNYBGqzkZaopEacSxP3vhDjJzmoviHtJgFk8G Next: FZaVVwuudjyPinYPnh2twVyVoL6EezfDWF72xkYXN69a Diff:
OldNewDifferences
1919
2020 let BET14 = (14 * WAVELET)
2121
22+let RATEMULT = 10000
23+
24+let RATE1 = 39655
25+
26+let RATE2 = 24600
27+
28+let RATE3 = 19000
29+
30+let RATE4 = 14200
31+
32+let RATE5 = 11400
33+
34+let GAMESCOUNTERKEY = "$GAME_NUM"
35+
2236 let RESERVATIONKEY = "$RESERVED_AMOUNT"
37+
38+let STATESUBMITTED = "SUBMITTED"
39+
40+let STATEWON = "WON"
41+
42+let STATELOST = "LOST"
2343
2444 func getAnswer (playerChoice) = BET14
2545
85105 }
86106
87107
88-@Callable(i)
89-func bet (playerChoice) = {
90- let playerAddress = toBase58String(i.caller.bytes)
91- let answer = getAnswer(playerChoice)
92- let amount = i.payment
108+func ValidateAndIncreaseReservedAmt (winAmt) = {
109+ let newReservedAmount = (ExtractReservedAmt() + winAmt)
93110 let balance = wavesBalance(this)
94- let game = [DataEntry((playerAddress + " это Ставка Игрока"), playerChoice), DataEntry("Ответ Сервера", answer), DataEntry("Текущий баланс игры", balance), DataEntry("Номер текущего блока", height), DataEntry("Bytes блокчейн игры", this.bytes)]
95- let playerAddressTx = Address(i.caller.bytes)
96- let tSetCommonData = [ScriptTransfer(playerAddressTx, 10, unit)]
97- ScriptResult(WriteSet(game), TransferSet(tSetCommonData))
111+ if ((newReservedAmount > balance))
112+ then throw("Insufficient funds on Russian Roulette account. Transaction was rejected for your safety.")
113+ else newReservedAmount
98114 }
99115
100116
101-
102-@Callable(i)
103-func withdraw (amount) = {
104- let currentKey = toBase58String(i.caller.bytes)
105- let currentAmount = match getInteger(this, currentKey) {
106- case a: Int =>
107- a
117+func IncrementGameNum () = {
118+ let gameNum = match getInteger(this, GAMESCOUNTERKEY) {
119+ case num: Int =>
120+ num
108121 case _ =>
109122 0
110123 }
111- let newAmount = (currentAmount - amount)
112- if ((0 > amount))
113- then throw("Can't withdraw negative amount")
114- else if ((0 > newAmount))
115- then throw("Not enough balance")
116- else ScriptResult(WriteSet([DataEntry(currentKey, newAmount)]), TransferSet([ScriptTransfer(i.caller, amount, unit)]))
124+ (gameNum + 1)
117125 }
118126
119127
120-@Verifier(tx)
121-func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
122- then match tx {
123- case ttx: TransferTransaction =>
124- ((wavesBalance(this) - ttx.amount) >= ExtractReservedAmt())
125- case stx: SetScriptTransaction =>
126- true
127- case _ =>
128- false
128+func FormatGameDataParam (p) = {
129+ let s = size(p)
130+ if ((s == 0))
131+ then throw("Parameter size must be greater then 0")
132+ else if ((s > 99))
133+ then throw("Parameter size must be less then 100")
134+ else if ((10 > s))
135+ then (("0" + toString(s)) + p)
136+ else (toString(s) + p)
129137 }
130- else false
138+
139+
140+func FormatGameDataStr (gameState,playerChoice,playerPubKey58,startedHeight,winAmt,randOrEmpty) = {
141+ let fullStateStr = ((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(playerChoice)) + "_") + FormatGameDataParam(playerPubKey58)) + "_") + FormatGameDataParam(toString(startedHeight))) + "_") + FormatGameDataParam(toString(winAmt)))
142+ if ((randOrEmpty == ""))
143+ then fullStateStr
144+ else ((fullStateStr + "_") + FormatGameDataParam(randOrEmpty))
145+ }
146+
147+
148+func ValidateBetAndDefineWinAmt (betAmt,playerChoice) = {
149+ let betAmtValid = if (if (if (if (if ((betAmt == (BET1 + COMMISSION)))
150+ then true
151+ else (betAmt == (BET2 + COMMISSION)))
152+ then true
153+ else (betAmt == (BET4 + COMMISSION)))
154+ then true
155+ else (betAmt == (BET8 + COMMISSION)))
156+ then true
157+ else (betAmt == (BET14 + COMMISSION)))
158+ then true
159+ else false
160+ if (betAmtValid)
161+ then {
162+ let bulletsCount = size(playerChoice)
163+ let bet = (betAmt - COMMISSION)
164+ if ((bulletsCount == 5))
165+ then ((bet * RATE1) / RATEMULT)
166+ else if ((bulletsCount == 4))
167+ then ((bet * RATE2) / RATEMULT)
168+ else if ((bulletsCount == 3))
169+ then ((bet * RATE3) / RATEMULT)
170+ else if ((bulletsCount == 2))
171+ then ((bet * RATE4) / RATEMULT)
172+ else if ((bulletsCount == 1))
173+ then ((bet * RATE5) / RATEMULT)
174+ else throw("Invalid bullets in player's choice")
175+ }
176+ else throw("Bet amount is not in range")
177+ }
178+
179+
180+@Callable(i)
181+func bet (playerChoice) = {
182+ let newGameNum = IncrementGameNum()
183+ let gameId = toBase58String(i.transactionId)
184+ let pmt = extract(i.payment)
185+ let betNotInWaves = isDefined(pmt.assetId)
186+ let feeNotInWaves = isDefined(pmt.assetId)
187+ let winAmt = ValidateBetAndDefineWinAmt(pmt.amount, playerChoice)
188+ let txIdUsed = isDefined(getString(this, gameId))
189+ if (betNotInWaves)
190+ then throw("Bet amount must be in Waves")
191+ else if (feeNotInWaves)
192+ then throw("Transaction's fee must be in Waves")
193+ else if (txIdUsed)
194+ then throw("Passed txId had been used before. Game aborted.")
195+ else {
196+ let playerPubKey58 = toBase58String(i.callerPublicKey)
197+ let gameDataStr = FormatGameDataStr(STATESUBMITTED, playerChoice, playerPubKey58, height, winAmt, "")
198+ let SERVER = addressFromPublicKey(i.callerPublicKey)
199+ let serverTransfer = [ScriptTransfer(SERVER, COMMISSION, unit)]
200+ let betData = [DataEntry(RESERVATIONKEY, ValidateAndIncreaseReservedAmt(winAmt)), DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]
201+ ScriptResult(WriteSet(betData), TransferSet(serverTransfer))
202+ }
203+ }
204+
131205
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let RSAPUBLIC = fromBase64String("base64:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlemr95J1jZUs7cJmrmmlN4zo7YVsBJzIeJdk8LDFGhUKSI6yfs20ZyJe21+6GJwNnKUU1Uyoc17wSWMKkrZ0MMvYE+Z5AiijvBK4sSJ3IgGjdU8/NhI8CBDu0F+xRM9q3TB3LLbDy5sBdudYfHfsUOc+MTvAD69n27db2Rh8+yZQMtubkuTQNp89sphHQaLGyQFaNlK/Na3lFx6omqzaa1gjoplUr6rvYKgfAICUB3zVmJShiEi7w7R0hWlNRD3qcZjCUONSpFo4WbzknGOazw84B+IMIFnIpXWzQL8RX0vNcfsBvLDfM6k2ZacqwyMKaLLqigdBiGdJ7W+0lOStOQIDAQAB")
55
66 let RANDORACLETIMEFRAME = 4320
77
88 let WAVELET = ((100 * 1000) * 1000)
99
1010 let COMMISSION = ((5 * WAVELET) / 1000)
1111
1212 let BET1 = (1 * WAVELET)
1313
1414 let BET2 = (2 * WAVELET)
1515
1616 let BET4 = (4 * WAVELET)
1717
1818 let BET8 = (8 * WAVELET)
1919
2020 let BET14 = (14 * WAVELET)
2121
22+let RATEMULT = 10000
23+
24+let RATE1 = 39655
25+
26+let RATE2 = 24600
27+
28+let RATE3 = 19000
29+
30+let RATE4 = 14200
31+
32+let RATE5 = 11400
33+
34+let GAMESCOUNTERKEY = "$GAME_NUM"
35+
2236 let RESERVATIONKEY = "$RESERVED_AMOUNT"
37+
38+let STATESUBMITTED = "SUBMITTED"
39+
40+let STATEWON = "WON"
41+
42+let STATELOST = "LOST"
2343
2444 func getAnswer (playerChoice) = BET14
2545
2646
2747 func GenerateRandInt (gameId,rsaSign) = {
2848 let rsaSigValid = rsaVerify(SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
2949 if (rsaSigValid)
3050 then {
3151 let rand = (toInt(sha256(rsaSign)) % 6)
3252 if ((0 > rand))
3353 then (-1 * rand)
3454 else rand
3555 }
3656 else throw("Invalid RSA signature")
3757 }
3858
3959
4060 func RemoveUnderscoreIfPresent (remaining) = if ((size(remaining) > 0))
4161 then drop(remaining, 1)
4262 else remaining
4363
4464
4565 func ParseNextAttribute (remaining) = {
4666 let s = size(remaining)
4767 if ((s > 0))
4868 then {
4969 let nn = parseIntValue(take(remaining, 2))
5070 let v = take(drop(remaining, 2), nn)
5171 let tmpRemaining = drop(remaining, (nn + 2))
5272 let remainingState = RemoveUnderscoreIfPresent(tmpRemaining)
5373 [v, remainingState]
5474 }
5575 else throw("Empty string was passed into parseNextAttribute func")
5676 }
5777
5878
5979 func ParseGameRawDataStr (rawStateStr) = {
6080 let gameState = ParseNextAttribute(rawStateStr)
6181 let playerChoice = ParseNextAttribute(gameState[1])
6282 let playerPubKey58 = ParseNextAttribute(playerChoice[1])
6383 let startedHeight = ParseNextAttribute(playerPubKey58[1])
6484 let winAmt = ParseNextAttribute(startedHeight[1])
6585 [gameState[0], playerChoice[0], playerPubKey58[0], startedHeight[0], winAmt[0]]
6686 }
6787
6888
6989 func ExtractGameDataList (gameId) = {
7090 let rawDataStr = match getString(this, gameId) {
7191 case str: String =>
7292 str
7393 case _ =>
7494 throw(("Couldn't find game by " + gameId))
7595 }
7696 ParseGameRawDataStr(rawDataStr)
7797 }
7898
7999
80100 func ExtractReservedAmt () = match getInteger(this, RESERVATIONKEY) {
81101 case a: Int =>
82102 a
83103 case _ =>
84104 0
85105 }
86106
87107
88-@Callable(i)
89-func bet (playerChoice) = {
90- let playerAddress = toBase58String(i.caller.bytes)
91- let answer = getAnswer(playerChoice)
92- let amount = i.payment
108+func ValidateAndIncreaseReservedAmt (winAmt) = {
109+ let newReservedAmount = (ExtractReservedAmt() + winAmt)
93110 let balance = wavesBalance(this)
94- let game = [DataEntry((playerAddress + " это Ставка Игрока"), playerChoice), DataEntry("Ответ Сервера", answer), DataEntry("Текущий баланс игры", balance), DataEntry("Номер текущего блока", height), DataEntry("Bytes блокчейн игры", this.bytes)]
95- let playerAddressTx = Address(i.caller.bytes)
96- let tSetCommonData = [ScriptTransfer(playerAddressTx, 10, unit)]
97- ScriptResult(WriteSet(game), TransferSet(tSetCommonData))
111+ if ((newReservedAmount > balance))
112+ then throw("Insufficient funds on Russian Roulette account. Transaction was rejected for your safety.")
113+ else newReservedAmount
98114 }
99115
100116
101-
102-@Callable(i)
103-func withdraw (amount) = {
104- let currentKey = toBase58String(i.caller.bytes)
105- let currentAmount = match getInteger(this, currentKey) {
106- case a: Int =>
107- a
117+func IncrementGameNum () = {
118+ let gameNum = match getInteger(this, GAMESCOUNTERKEY) {
119+ case num: Int =>
120+ num
108121 case _ =>
109122 0
110123 }
111- let newAmount = (currentAmount - amount)
112- if ((0 > amount))
113- then throw("Can't withdraw negative amount")
114- else if ((0 > newAmount))
115- then throw("Not enough balance")
116- else ScriptResult(WriteSet([DataEntry(currentKey, newAmount)]), TransferSet([ScriptTransfer(i.caller, amount, unit)]))
124+ (gameNum + 1)
117125 }
118126
119127
120-@Verifier(tx)
121-func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
122- then match tx {
123- case ttx: TransferTransaction =>
124- ((wavesBalance(this) - ttx.amount) >= ExtractReservedAmt())
125- case stx: SetScriptTransaction =>
126- true
127- case _ =>
128- false
128+func FormatGameDataParam (p) = {
129+ let s = size(p)
130+ if ((s == 0))
131+ then throw("Parameter size must be greater then 0")
132+ else if ((s > 99))
133+ then throw("Parameter size must be less then 100")
134+ else if ((10 > s))
135+ then (("0" + toString(s)) + p)
136+ else (toString(s) + p)
129137 }
130- else false
138+
139+
140+func FormatGameDataStr (gameState,playerChoice,playerPubKey58,startedHeight,winAmt,randOrEmpty) = {
141+ let fullStateStr = ((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(playerChoice)) + "_") + FormatGameDataParam(playerPubKey58)) + "_") + FormatGameDataParam(toString(startedHeight))) + "_") + FormatGameDataParam(toString(winAmt)))
142+ if ((randOrEmpty == ""))
143+ then fullStateStr
144+ else ((fullStateStr + "_") + FormatGameDataParam(randOrEmpty))
145+ }
146+
147+
148+func ValidateBetAndDefineWinAmt (betAmt,playerChoice) = {
149+ let betAmtValid = if (if (if (if (if ((betAmt == (BET1 + COMMISSION)))
150+ then true
151+ else (betAmt == (BET2 + COMMISSION)))
152+ then true
153+ else (betAmt == (BET4 + COMMISSION)))
154+ then true
155+ else (betAmt == (BET8 + COMMISSION)))
156+ then true
157+ else (betAmt == (BET14 + COMMISSION)))
158+ then true
159+ else false
160+ if (betAmtValid)
161+ then {
162+ let bulletsCount = size(playerChoice)
163+ let bet = (betAmt - COMMISSION)
164+ if ((bulletsCount == 5))
165+ then ((bet * RATE1) / RATEMULT)
166+ else if ((bulletsCount == 4))
167+ then ((bet * RATE2) / RATEMULT)
168+ else if ((bulletsCount == 3))
169+ then ((bet * RATE3) / RATEMULT)
170+ else if ((bulletsCount == 2))
171+ then ((bet * RATE4) / RATEMULT)
172+ else if ((bulletsCount == 1))
173+ then ((bet * RATE5) / RATEMULT)
174+ else throw("Invalid bullets in player's choice")
175+ }
176+ else throw("Bet amount is not in range")
177+ }
178+
179+
180+@Callable(i)
181+func bet (playerChoice) = {
182+ let newGameNum = IncrementGameNum()
183+ let gameId = toBase58String(i.transactionId)
184+ let pmt = extract(i.payment)
185+ let betNotInWaves = isDefined(pmt.assetId)
186+ let feeNotInWaves = isDefined(pmt.assetId)
187+ let winAmt = ValidateBetAndDefineWinAmt(pmt.amount, playerChoice)
188+ let txIdUsed = isDefined(getString(this, gameId))
189+ if (betNotInWaves)
190+ then throw("Bet amount must be in Waves")
191+ else if (feeNotInWaves)
192+ then throw("Transaction's fee must be in Waves")
193+ else if (txIdUsed)
194+ then throw("Passed txId had been used before. Game aborted.")
195+ else {
196+ let playerPubKey58 = toBase58String(i.callerPublicKey)
197+ let gameDataStr = FormatGameDataStr(STATESUBMITTED, playerChoice, playerPubKey58, height, winAmt, "")
198+ let SERVER = addressFromPublicKey(i.callerPublicKey)
199+ let serverTransfer = [ScriptTransfer(SERVER, COMMISSION, unit)]
200+ let betData = [DataEntry(RESERVATIONKEY, ValidateAndIncreaseReservedAmt(winAmt)), DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]
201+ ScriptResult(WriteSet(betData), TransferSet(serverTransfer))
202+ }
203+ }
204+
131205

github/deemru/w8io/873ac7e 
36.15 ms