tx · cMaULSV56FZE8qkZt5n5f6sF3hnKaXj2gD6UZCWzwwJ

3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX:  -0.05000000 Waves

2019.10.28 05:56 [739389] smart account 3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX > SELF 0.00000000 Waves

{ "type": 13, "id": "cMaULSV56FZE8qkZt5n5f6sF3hnKaXj2gD6UZCWzwwJ", "fee": 5000000, "feeAssetId": null, "timestamp": 1572231413895, "version": 1, "sender": "3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX", "senderPublicKey": "ACfUG5PwG2GssMuyEwVEhkYAbbbP1geSHR8XoNxLyu6V", "proofs": [ "3LgkBTBmvcmCoCJW5LpJoFKi8ZDb3tMAMuo2ws2QQqeTq59FTyjaRuKFvTcx3jU5oeDM7PiGK5srjNc2i2qQ3s9h" ], "script": "base64:AAIDAAAAAAAAAA4IARIECgIIARIECgIIAgAAACYAAAAACVJTQVBVQkxJQwkAAlsAAAABAgAAAY9iYXNlNjQ6TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFnNGRBUjZYYkJEQVM5aHIvRWozZEp2NkZmYzQ2NngvbU9HTVdVM2xyQUJzM3FhOEJIbXVKR25rZmJwRWYydkF3WVRPV1B2dnpmTTEwT0JiZmxvU3lxM2M5TUt2eVRlMWx1QkxHcVc0dlpVWEl5dlNnejFsaXlVVmVmSVF5M2R5RjlqYmVUWmJDMGJiY1QvN08zREVMKzAxejZBK3JEQ2FjU1owbEdvbFNRNkFuaEx4eklrVnBPUUpickJtQyt4K1p1WlBDTVd6SnluZDVhZU9uN2phai9ta1JWeXhlNmcvME9oV3o0TmlpWlhldU1SQis4bUt5MGZXRC9VbElsWldIc0FTMlptcmtYS3FqTHEwLzB3cjhJTEprem5qU3Fkbkk1SWJqZzN1UXJqLzRBTitpOXIyOGFRNzMvWmtQdFk1U2J3MEFPaUFCQnU3Z0htcTlheVZ4WlFJREFRQUIAAAAAD0dBTUVTQ09VTlRFUktFWQIAAAAJJEdBTUVfTlVNAAAAAA5SRVNFUlZBVElPTktFWQIAAAAQJFJFU0VSVkVEX0FNT1VOVAAAAAAEV0JFVAEAAAAgD5uLrFpvaCc5H1Jt+IyA7GJAqs11k4f4jn5gjTii4MkAAAAAB1dBVkVMRVQJAABoAAAAAgkAAGgAAAACAAAAAAAAAABkAAAAAAAAAAPoAAAAAAAAAAPoAAAAAAtGRUVXQVZFU0JFVAAAAAAAAAAABAAAAAAJRkVFTUNBRkVFAAAAAAAAAAACAAAAAA5TVEFURVNVQk1JVFRFRAIAAAAJU1VCTUlUVEVEAAAAAAhTVEFURVdPTgIAAAADV09OAAAAAAlTVEFURUxPU1QCAAAABExPU1QAAAAACVJPTExVTkRFUgIAAAAFVU5ERVIAAAAACFJPTExPVkVSAgAAAARPVkVSAAAAAAZCRVRNSU4JAABoAAAAAgAAAAAAAAAAZAUAAAAHV0FWRUxFVAAAAAAGQkVUTUFYCQAAaAAAAAIAAAAAAAExLQAFAAAAB1dBVkVMRVQAAAAADVBSRURJQ1RJT05NSU4A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UGFzc2VkIGdhbWVJZCBoYWQgYmVlbiB1c2VkIGJlZm9yZS4gR2FtZSBhYm9ydGVkLgQAAAAKbmV3R2FtZU51bQkBAAAAEEluY3JlbWVudEdhbWVOdW0AAAAABAAAAA5wbGF5ZXJQdWJLZXk1OAkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAC2dhbWVEYXRhU3RyCQEAAAARRm9ybWF0R2FtZURhdGFTdHIAAAAGBQAAAA5TVEFURVNVQk1JVFRFRAUAAAAKcHJlZGljdGlvbgUAAAAIcm9sbFR5cGUFAAAADnBsYXllclB1YktleTU4BQAAAAZ3aW5BbXQCAAAAAAkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAD0dBTUVTQ09VTlRFUktFWQUAAAAKbmV3R2FtZU51bQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAGZ2FtZUlkBQAAAAtnYW1lRGF0YVN0cgUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABBQAAAANuaWwAAAABaQEAAAAId2l0aGRyYXcAAAACAAAABmdhbWVJZAAAAAZyc2FTaWcEAAAADGdhbWVEYXRhTGlzdAkBAAAAE0V4dHJhY3RHYW1lRGF0YUxpc3QAAAABBQAAAAZnYW1lSWQEAAAACWdhbWVTdGF0ZQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAADElkeEdhbWVTdGF0ZQQAAAAKcHJlZGljdGlvbgkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAANSWR4UHJlZGljdGlvbgQAAAAIcm9sbFR5cGUJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAAdJZHhUeXBlBAAAAAZ3aW5BbXQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAACUlkeFdpbkFtdAQAAAAOcGxheWVyUHViS2V5NTgJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAABFJZHhQbGF5ZXJQdWJLZXk1OAQAAAANcGxheWVyQWRkcmVzcwkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAAA5wbGF5ZXJQdWJLZXk1OAQAAAARZGVjcmVhc2VkUmVzZXJ2ZXMJAQAAABNEZWNyZWFzZVJlc2VydmVkQW10AAAAAgUAAAAGZ2FtZUlkBQAAAAZ3aW5BbXQDCQEAAAACIT0AAAACBQAAAAlnYW1lU3RhdGUFAAAADlNUQVRFU1VCTUlUVEVECQAAAgAAAAECAAAAM0ludmFsaWQgZ2FtZSBzdGF0ZSBmb3IgcGFzc2VkIGdhbWVJZC4gR2FtZSBhYm9ydGVkLgQAAAAEcmFuZAkBAAAAD0dlbmVyYXRlUmFuZEludAAAAAIFAAAABmdhbWVJZAUAAAAGcnNhU2lnBAAAAAdyYW5kU3RyCQEAAAAJUmFuZFRvU3RyAAAAAQUAAAAEcmFuZAMJAQAAAAdkaWNlV2luAAAAAwUAAAAIcm9sbFR5cGUFAAAACnByZWRpY3Rpb24FAAAABHJhbmQEAAAADm5ld0dhbWVEYXRhU3RyCQEAAAARRm9ybWF0R2FtZURhdGFTdHIAAAAGBQAAAAhTVEFURVdPTgUAAAAKcHJlZGljdGlvbgUAAAAIcm9sbFR5cGUFAAAADnBsYXllclB1YktleTU4BQAAAAZ3aW5BbXQFAAAAB3JhbmRTdHIJAQAAAAxXaW5TY3JpcHRTZXQAAAAFBQAAAAZnYW1lSWQFAAAADXBsYXllckFkZHJlc3MFAAAABndpbkFtdAUAAAAObmV3R2FtZURhdGFTdHIFAAAAEWRlY3JlYXNlZFJlc2VydmVzBAAAAA5uZXdHYW1lRGF0YVN0cgkBAAAAEUZvcm1hdEdhbWVEYXRhU3RyAAAABgUAAAAJU1RBVEVMT1NUBQAAAApwcmVkaWN0aW9uBQAAAAhyb2xsVHlwZQUAAAAOcGxheWVyUHViS2V5NTgFAAAABndpbkFtdAUAAAAHcmFuZFN0cgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAGZ2FtZUlkBQAAAA5uZXdHYW1lRGF0YVN0cgkABEwAAAACBQAAABFkZWNyZWFzZWRSZXNlcnZlcwUAAAADbmlsAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5BAAAAAckbWF0Y2gwBQAAAAJ0eAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAATVHJhbnNmZXJUcmFuc2FjdGlvbgQAAAADdHR4BQAAAAckbWF0Y2gwCQAAZwAAAAIJAABlAAAAAgkAA+sAAAACBQAAAAR0aGlzBQAAAARXQkVUCAUAAAADdHR4AAAABmFtb3VudAkBAAAAEkV4dHJhY3RSZXNlcnZlZEFtdAAAAAADCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAFFNldFNjcmlwdFRyYW5zYWN0aW9uBAAAAANzdHgFAAAAByRtYXRjaDAGAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQAAAADaXR4BQAAAAckbWF0Y2gwAwkAAAAAAAACCAUAAAADaXR4AAAACGZ1bmN0aW9uAgAAAAh3aXRoZHJhdwYHBwceNmhC", "chainId": 84, "height": 739389, "spentComplexity": 0 } View: original | compacted Prev: F5HSkroxPxiUtqweVoRBYQN3Qj4r4wkwPT5VCQAcvt8V Next: 6TN2UzpqopB3uUh2yy3JFYP8b1zyZEENLuwLShTAgsfL Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let RSAPUBLIC = fromBase64String("base64:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmOlRBTYEO3H7Y9rBmoFQFn4392Px0Qw13DsdEhnzMH2cj6Y5ymPuCOLMNe5qrUzQl8oRLzIBzFVMZlwUYl2bosrOIxQbYF7WVQWvoVxET1YIgDm3NzzOLA5uH7CKO0snshmMFCDOZEew41GjKh3Pgx+nbAguP9ZQPfqSafEmC3CN/4yDsJrKriRniZJo9jS/4LLsRKwB7HAZHzoF9LL7tSZH3htaNGtbdTkxZ1TzST3Mb2VPSzsZvQDocXUVOmJOu0o29aOY+GkG/G4RCK0FBWQHEUvC51TRDS5k8jad0O1MobjQc6b18d+fuoVFdNfZwGH+uFudtPG3UJTf2mkzZQIDAQAB")
4+let RSAPUBLIC = fromBase64String("base64:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg4dAR6XbBDAS9hr/Ej3dJv6Ffc466x/mOGMWU3lrABs3qa8BHmuJGnkfbpEf2vAwYTOWPvvzfM10OBbfloSyq3c9MKvyTe1luBLGqW4vZUXIyvSgz1liyUVefIQy3dyF9jbeTZbC0bbcT/7O3DEL+01z6A+rDCacSZ0lGolSQ6AnhLxzIkVpOQJbrBmC+x+ZuZPCMWzJynd5aeOn7jaj/mkRVyxe6g/0OhWz4NiiZXeuMRB+8mKy0fWD/UlIlZWHsAS2ZmrkXKqjLq0/0wr8ILJkznjSqdnI5Ibjg3uQrj/4AN+i9r28aQ73/ZkPtY5Sbw0AOiABBu7gHmq9ayVxZQIDAQAB")
55
66 let GAMESCOUNTERKEY = "$GAME_NUM"
77
88 let RESERVATIONKEY = "$RESERVED_AMOUNT"
99
1010 let WBET = base58'23vgV9p9pD83A7CFbsDEc4zjanep7UeFo4ZRS6oGorhv'
11-
12-let WALLETWAVESBET = Address(base58'3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX')
13-
14-let WALLETMCAFFE = Address(base58'')
1511
1612 let WAVELET = ((100 * 1000) * 1000)
1713
3127
3228 let BETMIN = (100 * WAVELET)
3329
34-let BETMAX = ((1000 * 100) * WAVELET)
30+let BETMAX = (20000000 * WAVELET)
3531
36-let PREDICTIONMIN = 4
32+let PREDICTIONMIN = 1
3733
38-let PREDICTIONMAX = 100
34+let PREDICTIONMAX = 99
3935
4036 let IdxGameState = 0
4137
42-let IdxPlayerChoice = 1
38+let IdxPrediction = 1
4339
4440 let IdxType = 2
4541
7268 let newReservedAmount = (ExtractReservedAmt() + winAmt)
7369 let balance = assetBalance(this, WBET)
7470 if ((newReservedAmount > balance))
75- then throw("Insufficient funds on Waves Rider account. Transaction was rejected for your safety.")
71+ then throw("Insufficient funds on Wavesbet Dice account. Transaction was rejected for your safety.")
7672 else newReservedAmount
7773 }
7874
8985 }
9086
9187
92-func FormatGameDataStr (gameState,playerChoice,playerType,playerPubKey58,winAmt,randOrEmpty) = {
93- let fullStateStr = ((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(playerChoice)) + "_") + FormatGameDataParam(playerType)) + "_") + FormatGameDataParam(playerPubKey58)) + "_") + FormatGameDataParam(toString(winAmt)))
88+func FormatGameDataStr (gameState,prediction,typeRoll,playerPubKey58,winAmt,randOrEmpty) = {
89+ let fullStateStr = ((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(toString(prediction))) + "_") + FormatGameDataParam(typeRoll)) + "_") + FormatGameDataParam(playerPubKey58)) + "_") + FormatGameDataParam(toString(winAmt)))
9490 if ((randOrEmpty == ""))
9591 then fullStateStr
9692 else ((fullStateStr + "_") + FormatGameDataParam(randOrEmpty))
118114
119115 func ParseGameRawDataStr (rawStateStr) = {
120116 let gameState = ParseNextAttribute(rawStateStr)
121- let playerChoice = ParseNextAttribute(gameState[1])
122- let rollType = ParseNextAttribute(playerChoice[1])
117+ let prediction = ParseNextAttribute(gameState[1])
118+ let rollType = ParseNextAttribute(prediction[1])
123119 let playerPubKey58 = ParseNextAttribute(rollType[1])
124120 let winAmt = ParseNextAttribute(playerPubKey58[1])
125-[gameState[0], playerChoice[0], rollType[0], playerPubKey58[0], winAmt[0]]
121+[gameState[0], prediction[0], rollType[0], playerPubKey58[0], winAmt[0]]
126122 }
127123
128124
165161 else throw(("Unsupported r parameter passed: expected=[1,...,100] actual=" + toString(r)))
166162
167163
168-func WinScriptSet (gameId,playerAddress,winAmt,newGameDataStr) = {
169- let tSetCommonData = [ScriptTransfer(playerAddress, winAmt, base58'4vPcbA5yiwpWBVPALPGXus6fNdGEuYTpe4hAeSxM9Kj4')]
170- let writeDicePlay = WriteSet([DataEntry("Game Id", gameId), DataEntry("Player Address", toString(playerAddress))])
171- ScriptResult(writeDicePlay, TransferSet(tSetCommonData))
164+func WinScriptSet (gameId,playerAddress,winAmt,newGameDataStr,decreasedReserves) = {
165+ let wSetCommonData = [decreasedReserves]
166+ let tSetCommonData = [ScriptTransfer(playerAddress, winAmt, WBET)]
167+ let gameData = DataEntry(gameId, newGameDataStr)
168+ ScriptResult(WriteSet(gameData :: wSetCommonData), TransferSet(tSetCommonData))
172169 }
173170
174171
577574 func ValidateBetAndDefineWinAmt (amount,prediction,rollType) = if (if ((BETMIN > amount))
578575 then true
579576 else (amount > BETMAX))
580- then throw(((("Bet amount is not in range: minBet=" + toString((BETMIN / 100000000))) + " maxBet=") + toString((BETMAX / 100000000))))
577+ then throw(((("Bet amount is not in range: minBet=" + toString((BETMIN / WAVELET))) + " maxBet=") + toString((BETMAX / WAVELET))))
581578 else if (if ((rollType != ROLLUNDER))
582579 then (rollType != ROLLOVER)
583580 else false)
585582 else if (if ((PREDICTIONMIN > prediction))
586583 then true
587584 else (prediction > PREDICTIONMAX))
588- then throw(((("Prediction is out of the condition: " + toString(PREDICTIONMIN)) + " <= predction <= ") + toString(PREDICTIONMAX)))
585+ then throw(((("Prediction is out of the range: " + toString(PREDICTIONMIN)) + " <= prediction <= ") + toString(PREDICTIONMAX)))
589586 else {
590587 let multi = Multiplier(prediction, rollType)
591588 ((((amount * multi) / 100000) * (100 - (FEEWAVESBET + FEEMCAFEE))) / 100)
594591
595592 @Callable(i)
596593 func playDice (rollType,prediction) = {
597- let predInt = parseIntValue(prediction)
598594 let gameId = toBase58String(i.transactionId)
599595 let payment = extract(i.payment)
600596 let feeAssetId = isDefined(i.feeAssetId)
601- let multi = Multiplier(predInt, rollType)
602- let winAmt = ValidateBetAndDefineWinAmt(payment.amount, predInt, rollType)
597+ let multi = Multiplier(prediction, rollType)
598+ let winAmt = ValidateBetAndDefineWinAmt(payment.amount, prediction, rollType)
603599 let playerBalance = wavesBalance(i.caller)
604600 let gameIdUsed = isDefined(getString(this, gameId))
605601 if ((payment.assetId != WBET))
606602 then throw("Payment should be in Wavesbet")
607- else if ((100000 > playerBalance))
608- then throw("There are not enough waves, it takes 0.01 Waves to bet. Game aborted.")
603+ else if ((1400000 > playerBalance))
604+ then throw("There are not enough waves, it takes 0.014 Waves to bet. Game aborted.")
609605 else if (feeAssetId)
610606 then throw("Transaction's fee must be in Waves. Game aborted.")
611607 else if (gameIdUsed)
614610 let newGameNum = IncrementGameNum()
615611 let playerPubKey58 = toBase58String(i.callerPublicKey)
616612 let gameDataStr = FormatGameDataStr(STATESUBMITTED, prediction, rollType, playerPubKey58, winAmt, "")
617- ScriptResult(WriteSet([DataEntry(RESERVATIONKEY, ValidateAndIncreaseReservedAmt(winAmt)), DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet([ScriptTransfer(WALLETWAVESBET, ((payment.amount * FEEWAVESBET) / 100), WBET), ScriptTransfer(this, 500000, unit)]))
613+ ScriptResult(WriteSet([DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet(nil))
618614 }
619615 }
620616
624620 func withdraw (gameId,rsaSig) = {
625621 let gameDataList = ExtractGameDataList(gameId)
626622 let gameState = gameDataList[IdxGameState]
627- let playerChoice = gameDataList[IdxPlayerChoice]
623+ let prediction = parseIntValue(gameDataList[IdxPrediction])
628624 let rollType = gameDataList[IdxType]
629625 let winAmt = parseIntValue(gameDataList[IdxWinAmt])
630626 let playerPubKey58 = gameDataList[IdxPlayerPubKey58]
631627 let playerAddress = addressFromPublicKey(fromBase58String(playerPubKey58))
632628 let decreasedReserves = DecreaseReservedAmt(gameId, winAmt)
633629 if ((gameState != STATESUBMITTED))
634- then throw("Invalid game state for passed gameId")
630+ then throw("Invalid game state for passed gameId. Game aborted.")
635631 else {
636632 let rand = GenerateRandInt(gameId, rsaSig)
637633 let randStr = RandToStr(rand)
638- if (diceWin(rollType, parseIntValue(playerChoice), rand))
634+ if (diceWin(rollType, prediction, rand))
639635 then {
640- let newGameDataStr = FormatGameDataStr(STATEWON, playerChoice, rollType, playerPubKey58, winAmt, randStr)
641- WinScriptSet(gameId, playerAddress, winAmt, newGameDataStr)
636+ let newGameDataStr = FormatGameDataStr(STATEWON, prediction, rollType, playerPubKey58, winAmt, randStr)
637+ WinScriptSet(gameId, playerAddress, winAmt, newGameDataStr, decreasedReserves)
642638 }
643639 else {
644- let newGameDataStr = FormatGameDataStr(STATELOST, playerChoice, rollType, playerPubKey58, winAmt, randStr)
645- WriteSet([DataEntry(gameId, newGameDataStr)])
640+ let newGameDataStr = FormatGameDataStr(STATELOST, prediction, rollType, playerPubKey58, winAmt, randStr)
641+ WriteSet([DataEntry(gameId, newGameDataStr), decreasedReserves])
646642 }
647643 }
648644 }
649645
650646
647+@Verifier(tx)
648+func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
649+ then match tx {
650+ case ttx: TransferTransaction =>
651+ ((assetBalance(this, WBET) - ttx.amount) >= ExtractReservedAmt())
652+ case stx: SetScriptTransaction =>
653+ true
654+ case itx: InvokeScriptTransaction =>
655+ if ((itx.function == "withdraw"))
656+ then true
657+ else false
658+ case _ =>
659+ false
660+ }
661+ else false
662+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let RSAPUBLIC = fromBase64String("base64:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmOlRBTYEO3H7Y9rBmoFQFn4392Px0Qw13DsdEhnzMH2cj6Y5ymPuCOLMNe5qrUzQl8oRLzIBzFVMZlwUYl2bosrOIxQbYF7WVQWvoVxET1YIgDm3NzzOLA5uH7CKO0snshmMFCDOZEew41GjKh3Pgx+nbAguP9ZQPfqSafEmC3CN/4yDsJrKriRniZJo9jS/4LLsRKwB7HAZHzoF9LL7tSZH3htaNGtbdTkxZ1TzST3Mb2VPSzsZvQDocXUVOmJOu0o29aOY+GkG/G4RCK0FBWQHEUvC51TRDS5k8jad0O1MobjQc6b18d+fuoVFdNfZwGH+uFudtPG3UJTf2mkzZQIDAQAB")
4+let RSAPUBLIC = fromBase64String("base64:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg4dAR6XbBDAS9hr/Ej3dJv6Ffc466x/mOGMWU3lrABs3qa8BHmuJGnkfbpEf2vAwYTOWPvvzfM10OBbfloSyq3c9MKvyTe1luBLGqW4vZUXIyvSgz1liyUVefIQy3dyF9jbeTZbC0bbcT/7O3DEL+01z6A+rDCacSZ0lGolSQ6AnhLxzIkVpOQJbrBmC+x+ZuZPCMWzJynd5aeOn7jaj/mkRVyxe6g/0OhWz4NiiZXeuMRB+8mKy0fWD/UlIlZWHsAS2ZmrkXKqjLq0/0wr8ILJkznjSqdnI5Ibjg3uQrj/4AN+i9r28aQ73/ZkPtY5Sbw0AOiABBu7gHmq9ayVxZQIDAQAB")
55
66 let GAMESCOUNTERKEY = "$GAME_NUM"
77
88 let RESERVATIONKEY = "$RESERVED_AMOUNT"
99
1010 let WBET = base58'23vgV9p9pD83A7CFbsDEc4zjanep7UeFo4ZRS6oGorhv'
11-
12-let WALLETWAVESBET = Address(base58'3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX')
13-
14-let WALLETMCAFFE = Address(base58'')
1511
1612 let WAVELET = ((100 * 1000) * 1000)
1713
1814 let FEEWAVESBET = 4
1915
2016 let FEEMCAFEE = 2
2117
2218 let STATESUBMITTED = "SUBMITTED"
2319
2420 let STATEWON = "WON"
2521
2622 let STATELOST = "LOST"
2723
2824 let ROLLUNDER = "UNDER"
2925
3026 let ROLLOVER = "OVER"
3127
3228 let BETMIN = (100 * WAVELET)
3329
34-let BETMAX = ((1000 * 100) * WAVELET)
30+let BETMAX = (20000000 * WAVELET)
3531
36-let PREDICTIONMIN = 4
32+let PREDICTIONMIN = 1
3733
38-let PREDICTIONMAX = 100
34+let PREDICTIONMAX = 99
3935
4036 let IdxGameState = 0
4137
42-let IdxPlayerChoice = 1
38+let IdxPrediction = 1
4339
4440 let IdxType = 2
4541
4642 let IdxPlayerPubKey58 = 3
4743
4844 let IdxWinAmt = 4
4945
5046 let IdxRandOrEmpty = 5
5147
5248 func IncrementGameNum () = {
5349 let gameNum = match getInteger(this, GAMESCOUNTERKEY) {
5450 case num: Int =>
5551 num
5652 case _ =>
5753 0
5854 }
5955 (gameNum + 1)
6056 }
6157
6258
6359 func ExtractReservedAmt () = match getInteger(this, RESERVATIONKEY) {
6460 case a: Int =>
6561 a
6662 case _ =>
6763 0
6864 }
6965
7066
7167 func ValidateAndIncreaseReservedAmt (winAmt) = {
7268 let newReservedAmount = (ExtractReservedAmt() + winAmt)
7369 let balance = assetBalance(this, WBET)
7470 if ((newReservedAmount > balance))
75- then throw("Insufficient funds on Waves Rider account. Transaction was rejected for your safety.")
71+ then throw("Insufficient funds on Wavesbet Dice account. Transaction was rejected for your safety.")
7672 else newReservedAmount
7773 }
7874
7975
8076 func FormatGameDataParam (p) = {
8177 let s = size(p)
8278 if ((s == 0))
8379 then throw("Parameter size must be greater then 0")
8480 else if ((s > 99))
8581 then throw("Parameter size must be less then 100")
8682 else if ((10 > s))
8783 then (("0" + toString(s)) + p)
8884 else (toString(s) + p)
8985 }
9086
9187
92-func FormatGameDataStr (gameState,playerChoice,playerType,playerPubKey58,winAmt,randOrEmpty) = {
93- let fullStateStr = ((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(playerChoice)) + "_") + FormatGameDataParam(playerType)) + "_") + FormatGameDataParam(playerPubKey58)) + "_") + FormatGameDataParam(toString(winAmt)))
88+func FormatGameDataStr (gameState,prediction,typeRoll,playerPubKey58,winAmt,randOrEmpty) = {
89+ let fullStateStr = ((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(toString(prediction))) + "_") + FormatGameDataParam(typeRoll)) + "_") + FormatGameDataParam(playerPubKey58)) + "_") + FormatGameDataParam(toString(winAmt)))
9490 if ((randOrEmpty == ""))
9591 then fullStateStr
9692 else ((fullStateStr + "_") + FormatGameDataParam(randOrEmpty))
9793 }
9894
9995
10096 func RemoveUnderscoreIfPresent (remaining) = if ((size(remaining) > 0))
10197 then drop(remaining, 1)
10298 else remaining
10399
104100
105101 func ParseNextAttribute (remaining) = {
106102 let s = size(remaining)
107103 if ((s > 0))
108104 then {
109105 let nn = parseIntValue(take(remaining, 2))
110106 let v = take(drop(remaining, 2), nn)
111107 let tmpRemaining = drop(remaining, (nn + 2))
112108 let remainingState = RemoveUnderscoreIfPresent(tmpRemaining)
113109 [v, remainingState]
114110 }
115111 else throw("Empty string was passed into parseNextAttribute func")
116112 }
117113
118114
119115 func ParseGameRawDataStr (rawStateStr) = {
120116 let gameState = ParseNextAttribute(rawStateStr)
121- let playerChoice = ParseNextAttribute(gameState[1])
122- let rollType = ParseNextAttribute(playerChoice[1])
117+ let prediction = ParseNextAttribute(gameState[1])
118+ let rollType = ParseNextAttribute(prediction[1])
123119 let playerPubKey58 = ParseNextAttribute(rollType[1])
124120 let winAmt = ParseNextAttribute(playerPubKey58[1])
125-[gameState[0], playerChoice[0], rollType[0], playerPubKey58[0], winAmt[0]]
121+[gameState[0], prediction[0], rollType[0], playerPubKey58[0], winAmt[0]]
126122 }
127123
128124
129125 func ExtractGameDataList (gameId) = {
130126 let rawDataStr = match getString(this, gameId) {
131127 case str: String =>
132128 str
133129 case _ =>
134130 throw(("Couldn't find game by " + gameId))
135131 }
136132 ParseGameRawDataStr(rawDataStr)
137133 }
138134
139135
140136 func DecreaseReservedAmt (gameId,winAmt) = {
141137 let newReservedAmount = (ExtractReservedAmt() - winAmt)
142138 if ((0 > newReservedAmount))
143139 then throw("Invalid Dice Roller account state - reserved amount is less than 0")
144140 else DataEntry(RESERVATIONKEY, newReservedAmount)
145141 }
146142
147143
148144 func GenerateRandInt (gameId,rsaSign) = {
149145 let rsaSigValid = rsaVerify(SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
150146 if (rsaSigValid)
151147 then {
152148 let rand = (toInt(sha256(rsaSign)) % 100)
153149 if ((0 > rand))
154150 then ((-1 * rand) + 1)
155151 else (rand + 1)
156152 }
157153 else throw("Invalid RSA signature")
158154 }
159155
160156
161157 func RandToStr (r) = if (if ((r >= 1))
162158 then (100 >= r)
163159 else false)
164160 then toString(r)
165161 else throw(("Unsupported r parameter passed: expected=[1,...,100] actual=" + toString(r)))
166162
167163
168-func WinScriptSet (gameId,playerAddress,winAmt,newGameDataStr) = {
169- let tSetCommonData = [ScriptTransfer(playerAddress, winAmt, base58'4vPcbA5yiwpWBVPALPGXus6fNdGEuYTpe4hAeSxM9Kj4')]
170- let writeDicePlay = WriteSet([DataEntry("Game Id", gameId), DataEntry("Player Address", toString(playerAddress))])
171- ScriptResult(writeDicePlay, TransferSet(tSetCommonData))
164+func WinScriptSet (gameId,playerAddress,winAmt,newGameDataStr,decreasedReserves) = {
165+ let wSetCommonData = [decreasedReserves]
166+ let tSetCommonData = [ScriptTransfer(playerAddress, winAmt, WBET)]
167+ let gameData = DataEntry(gameId, newGameDataStr)
168+ ScriptResult(WriteSet(gameData :: wSetCommonData), TransferSet(tSetCommonData))
172169 }
173170
174171
175172 func Multiplier (prediction,rollType) = if ((rollType == ROLLUNDER))
176173 then if ((prediction == 1))
177174 then 9850000
178175 else if ((prediction == 2))
179176 then 4925000
180177 else if ((prediction == 3))
181178 then 3283330
182179 else if ((prediction == 4))
183180 then 2462500
184181 else if ((prediction == 5))
185182 then 1970000
186183 else if ((prediction == 6))
187184 then 1641660
188185 else if ((prediction == 7))
189186 then 1407140
190187 else if ((prediction == 8))
191188 then 1231250
192189 else if ((prediction == 9))
193190 then 1094440
194191 else if ((prediction == 10))
195192 then 985000
196193 else if ((prediction == 11))
197194 then 895450
198195 else if ((prediction == 12))
199196 then 820830
200197 else if ((prediction == 13))
201198 then 757690
202199 else if ((prediction == 14))
203200 then 703570
204201 else if ((prediction == 15))
205202 then 656660
206203 else if ((prediction == 16))
207204 then 615620
208205 else if ((prediction == 17))
209206 then 579410
210207 else if ((prediction == 18))
211208 then 547220
212209 else if ((prediction == 19))
213210 then 518420
214211 else if ((prediction == 20))
215212 then 492500
216213 else if ((prediction == 21))
217214 then 469040
218215 else if ((prediction == 22))
219216 then 447720
220217 else if ((prediction == 23))
221218 then 428260
222219 else if ((prediction == 24))
223220 then 410410
224221 else if ((prediction == 25))
225222 then 394000
226223 else if ((prediction == 26))
227224 then 378840
228225 else if ((prediction == 27))
229226 then 364810
230227 else if ((prediction == 28))
231228 then 351780
232229 else if ((prediction == 29))
233230 then 339650
234231 else if ((prediction == 30))
235232 then 328330
236233 else if ((prediction == 31))
237234 then 317740
238235 else if ((prediction == 32))
239236 then 307810
240237 else if ((prediction == 33))
241238 then 298480
242239 else if ((prediction == 34))
243240 then 289700
244241 else if ((prediction == 35))
245242 then 281420
246243 else if ((prediction == 36))
247244 then 273610
248245 else if ((prediction == 37))
249246 then 259210
250247 else if ((prediction == 38))
251248 then 259210
252249 else if ((prediction == 39))
253250 then 252560
254251 else if ((prediction == 40))
255252 then 246250
256253 else if ((prediction == 41))
257254 then 240240
258255 else if ((prediction == 42))
259256 then 234520
260257 else if ((prediction == 43))
261258 then 229060
262259 else if ((prediction == 44))
263260 then 223860
264261 else if ((prediction == 45))
265262 then 218880
266263 else if ((prediction == 46))
267264 then 214130
268265 else if ((prediction == 47))
269266 then 209570
270267 else if ((prediction == 48))
271268 then 205200
272269 else if ((prediction == 49))
273270 then 201020
274271 else if ((prediction == 50))
275272 then 197000
276273 else if ((prediction == 51))
277274 then 193130
278275 else if ((prediction == 52))
279276 then 189420
280277 else if ((prediction == 53))
281278 then 185840
282279 else if ((prediction == 54))
283280 then 182400
284281 else if ((prediction == 55))
285282 then 179090
286283 else if ((prediction == 56))
287284 then 175890
288285 else if ((prediction == 57))
289286 then 172800
290287 else if ((prediction == 58))
291288 then 169820
292289 else if ((prediction == 59))
293290 then 166940
294291 else if ((prediction == 60))
295292 then 164160
296293 else if ((prediction == 61))
297294 then 161470
298295 else if ((prediction == 62))
299296 then 158870
300297 else if ((prediction == 63))
301298 then 156340
302299 else if ((prediction == 64))
303300 then 153900
304301 else if ((prediction == 65))
305302 then 151530
306303 else if ((prediction == 66))
307304 then 149240
308305 else if ((prediction == 67))
309306 then 147010
310307 else if ((prediction == 68))
311308 then 144850
312309 else if ((prediction == 69))
313310 then 142750
314311 else if ((prediction == 70))
315312 then 140710
316313 else if ((prediction == 71))
317314 then 138730
318315 else if ((prediction == 72))
319316 then 136800
320317 else if ((prediction == 73))
321318 then 134930
322319 else if ((prediction == 74))
323320 then 133100
324321 else if ((prediction == 75))
325322 then 131330
326323 else if ((prediction == 76))
327324 then 129600
328325 else if ((prediction == 77))
329326 then 127920
330327 else if ((prediction == 78))
331328 then 126280
332329 else if ((prediction == 79))
333330 then 124680
334331 else if ((prediction == 80))
335332 then 123120
336333 else if ((prediction == 81))
337334 then 121600
338335 else if ((prediction == 82))
339336 then 120120
340337 else if ((prediction == 83))
341338 then 118670
342339 else if ((prediction == 84))
343340 then 117260
344341 else if ((prediction == 85))
345342 then 115880
346343 else if ((prediction == 86))
347344 then 114530
348345 else if ((prediction == 87))
349346 then 113210
350347 else if ((prediction == 88))
351348 then 111930
352349 else if ((prediction == 89))
353350 then 110670
354351 else if ((prediction == 90))
355352 then 109440
356353 else if ((prediction == 91))
357354 then 108240
358355 else if ((prediction == 92))
359356 then 107060
360357 else if ((prediction == 93))
361358 then 105910
362359 else if ((prediction == 94))
363360 then 104780
364361 else if ((prediction == 95))
365362 then 103680
366363 else if ((prediction == 96))
367364 then 103680
368365 else 100000
369366 else if ((rollType == ROLLOVER))
370367 then if ((prediction == 4))
371368 then 103680
372369 else if ((prediction == 5))
373370 then 103680
374371 else if ((prediction == 6))
375372 then 104780
376373 else if ((prediction == 7))
377374 then 105910
378375 else if ((prediction == 8))
379376 then 107060
380377 else if ((prediction == 9))
381378 then 108240
382379 else if ((prediction == 10))
383380 then 109440
384381 else if ((prediction == 11))
385382 then 110670
386383 else if ((prediction == 12))
387384 then 111930
388385 else if ((prediction == 13))
389386 then 113210
390387 else if ((prediction == 14))
391388 then 114530
392389 else if ((prediction == 15))
393390 then 115880
394391 else if ((prediction == 16))
395392 then 117260
396393 else if ((prediction == 17))
397394 then 118670
398395 else if ((prediction == 18))
399396 then 120120
400397 else if ((prediction == 19))
401398 then 121600
402399 else if ((prediction == 20))
403400 then 123120
404401 else if ((prediction == 21))
405402 then 124680
406403 else if ((prediction == 22))
407404 then 126280
408405 else if ((prediction == 23))
409406 then 127920
410407 else if ((prediction == 24))
411408 then 129600
412409 else if ((prediction == 25))
413410 then 131330
414411 else if ((prediction == 26))
415412 then 133100
416413 else if ((prediction == 27))
417414 then 134930
418415 else if ((prediction == 28))
419416 then 136800
420417 else if ((prediction == 29))
421418 then 138730
422419 else if ((prediction == 30))
423420 then 140710
424421 else if ((prediction == 31))
425422 then 142750
426423 else if ((prediction == 32))
427424 then 144850
428425 else if ((prediction == 33))
429426 then 147010
430427 else if ((prediction == 34))
431428 then 149240
432429 else if ((prediction == 35))
433430 then 151530
434431 else if ((prediction == 36))
435432 then 153900
436433 else if ((prediction == 37))
437434 then 156340
438435 else if ((prediction == 38))
439436 then 158870
440437 else if ((prediction == 39))
441438 then 161470
442439 else if ((prediction == 40))
443440 then 164160
444441 else if ((prediction == 41))
445442 then 166940
446443 else if ((prediction == 42))
447444 then 169820
448445 else if ((prediction == 43))
449446 then 172800
450447 else if ((prediction == 44))
451448 then 175890
452449 else if ((prediction == 45))
453450 then 179090
454451 else if ((prediction == 46))
455452 then 185840
456453 else if ((prediction == 47))
457454 then 185840
458455 else if ((prediction == 48))
459456 then 189420
460457 else if ((prediction == 49))
461458 then 193130
462459 else if ((prediction == 50))
463460 then 197000
464461 else if ((prediction == 51))
465462 then 201020
466463 else if ((prediction == 52))
467464 then 205200
468465 else if ((prediction == 53))
469466 then 209570
470467 else if ((prediction == 54))
471468 then 214130
472469 else if ((prediction == 55))
473470 then 218880
474471 else if ((prediction == 56))
475472 then 223860
476473 else if ((prediction == 57))
477474 then 229060
478475 else if ((prediction == 58))
479476 then 234520
480477 else if ((prediction == 59))
481478 then 240240
482479 else if ((prediction == 60))
483480 then 246250
484481 else if ((prediction == 61))
485482 then 252560
486483 else if ((prediction == 62))
487484 then 259210
488485 else if ((prediction == 63))
489486 then 259210
490487 else if ((prediction == 64))
491488 then 273610
492489 else if ((prediction == 65))
493490 then 281420
494491 else if ((prediction == 66))
495492 then 289700
496493 else if ((prediction == 67))
497494 then 298480
498495 else if ((prediction == 68))
499496 then 307810
500497 else if ((prediction == 69))
501498 then 317740
502499 else if ((prediction == 70))
503500 then 328330
504501 else if ((prediction == 71))
505502 then 339650
506503 else if ((prediction == 72))
507504 then 351780
508505 else if ((prediction == 73))
509506 then 364810
510507 else if ((prediction == 74))
511508 then 378840
512509 else if ((prediction == 75))
513510 then 394000
514511 else if ((prediction == 76))
515512 then 410410
516513 else if ((prediction == 77))
517514 then 428260
518515 else if ((prediction == 78))
519516 then 447720
520517 else if ((prediction == 79))
521518 then 469040
522519 else if ((prediction == 80))
523520 then 492500
524521 else if ((prediction == 81))
525522 then 518420
526523 else if ((prediction == 82))
527524 then 547220
528525 else if ((prediction == 83))
529526 then 579410
530527 else if ((prediction == 84))
531528 then 615620
532529 else if ((prediction == 85))
533530 then 656660
534531 else if ((prediction == 86))
535532 then 703570
536533 else if ((prediction == 87))
537534 then 757690
538535 else if ((prediction == 88))
539536 then 820830
540537 else if ((prediction == 89))
541538 then 895450
542539 else if ((prediction == 90))
543540 then 985000
544541 else if ((prediction == 91))
545542 then 1094440
546543 else if ((prediction == 92))
547544 then 1231250
548545 else if ((prediction == 93))
549546 then 1407140
550547 else if ((prediction == 94))
551548 then 1641660
552549 else if ((prediction == 95))
553550 then 1970000
554551 else if ((prediction == 96))
555552 then 2462500
556553 else if ((prediction == 97))
557554 then 3283330
558555 else if ((prediction == 98))
559556 then 4925000
560557 else if ((prediction == 99))
561558 then 9850000
562559 else 100000
563560 else 100000
564561
565562
566563 func diceWin (type,prediction,number) = if ((type == ROLLUNDER))
567564 then if ((prediction >= number))
568565 then true
569566 else false
570567 else if ((type == ROLLOVER))
571568 then if ((number >= prediction))
572569 then true
573570 else false
574571 else false
575572
576573
577574 func ValidateBetAndDefineWinAmt (amount,prediction,rollType) = if (if ((BETMIN > amount))
578575 then true
579576 else (amount > BETMAX))
580- then throw(((("Bet amount is not in range: minBet=" + toString((BETMIN / 100000000))) + " maxBet=") + toString((BETMAX / 100000000))))
577+ then throw(((("Bet amount is not in range: minBet=" + toString((BETMIN / WAVELET))) + " maxBet=") + toString((BETMAX / WAVELET))))
581578 else if (if ((rollType != ROLLUNDER))
582579 then (rollType != ROLLOVER)
583580 else false)
584581 then throw("Invalid Roll type, try with OVER or UNDER")
585582 else if (if ((PREDICTIONMIN > prediction))
586583 then true
587584 else (prediction > PREDICTIONMAX))
588- then throw(((("Prediction is out of the condition: " + toString(PREDICTIONMIN)) + " <= predction <= ") + toString(PREDICTIONMAX)))
585+ then throw(((("Prediction is out of the range: " + toString(PREDICTIONMIN)) + " <= prediction <= ") + toString(PREDICTIONMAX)))
589586 else {
590587 let multi = Multiplier(prediction, rollType)
591588 ((((amount * multi) / 100000) * (100 - (FEEWAVESBET + FEEMCAFEE))) / 100)
592589 }
593590
594591
595592 @Callable(i)
596593 func playDice (rollType,prediction) = {
597- let predInt = parseIntValue(prediction)
598594 let gameId = toBase58String(i.transactionId)
599595 let payment = extract(i.payment)
600596 let feeAssetId = isDefined(i.feeAssetId)
601- let multi = Multiplier(predInt, rollType)
602- let winAmt = ValidateBetAndDefineWinAmt(payment.amount, predInt, rollType)
597+ let multi = Multiplier(prediction, rollType)
598+ let winAmt = ValidateBetAndDefineWinAmt(payment.amount, prediction, rollType)
603599 let playerBalance = wavesBalance(i.caller)
604600 let gameIdUsed = isDefined(getString(this, gameId))
605601 if ((payment.assetId != WBET))
606602 then throw("Payment should be in Wavesbet")
607- else if ((100000 > playerBalance))
608- then throw("There are not enough waves, it takes 0.01 Waves to bet. Game aborted.")
603+ else if ((1400000 > playerBalance))
604+ then throw("There are not enough waves, it takes 0.014 Waves to bet. Game aborted.")
609605 else if (feeAssetId)
610606 then throw("Transaction's fee must be in Waves. Game aborted.")
611607 else if (gameIdUsed)
612608 then throw("Passed gameId had been used before. Game aborted.")
613609 else {
614610 let newGameNum = IncrementGameNum()
615611 let playerPubKey58 = toBase58String(i.callerPublicKey)
616612 let gameDataStr = FormatGameDataStr(STATESUBMITTED, prediction, rollType, playerPubKey58, winAmt, "")
617- ScriptResult(WriteSet([DataEntry(RESERVATIONKEY, ValidateAndIncreaseReservedAmt(winAmt)), DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet([ScriptTransfer(WALLETWAVESBET, ((payment.amount * FEEWAVESBET) / 100), WBET), ScriptTransfer(this, 500000, unit)]))
613+ ScriptResult(WriteSet([DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet(nil))
618614 }
619615 }
620616
621617
622618
623619 @Callable(i)
624620 func withdraw (gameId,rsaSig) = {
625621 let gameDataList = ExtractGameDataList(gameId)
626622 let gameState = gameDataList[IdxGameState]
627- let playerChoice = gameDataList[IdxPlayerChoice]
623+ let prediction = parseIntValue(gameDataList[IdxPrediction])
628624 let rollType = gameDataList[IdxType]
629625 let winAmt = parseIntValue(gameDataList[IdxWinAmt])
630626 let playerPubKey58 = gameDataList[IdxPlayerPubKey58]
631627 let playerAddress = addressFromPublicKey(fromBase58String(playerPubKey58))
632628 let decreasedReserves = DecreaseReservedAmt(gameId, winAmt)
633629 if ((gameState != STATESUBMITTED))
634- then throw("Invalid game state for passed gameId")
630+ then throw("Invalid game state for passed gameId. Game aborted.")
635631 else {
636632 let rand = GenerateRandInt(gameId, rsaSig)
637633 let randStr = RandToStr(rand)
638- if (diceWin(rollType, parseIntValue(playerChoice), rand))
634+ if (diceWin(rollType, prediction, rand))
639635 then {
640- let newGameDataStr = FormatGameDataStr(STATEWON, playerChoice, rollType, playerPubKey58, winAmt, randStr)
641- WinScriptSet(gameId, playerAddress, winAmt, newGameDataStr)
636+ let newGameDataStr = FormatGameDataStr(STATEWON, prediction, rollType, playerPubKey58, winAmt, randStr)
637+ WinScriptSet(gameId, playerAddress, winAmt, newGameDataStr, decreasedReserves)
642638 }
643639 else {
644- let newGameDataStr = FormatGameDataStr(STATELOST, playerChoice, rollType, playerPubKey58, winAmt, randStr)
645- WriteSet([DataEntry(gameId, newGameDataStr)])
640+ let newGameDataStr = FormatGameDataStr(STATELOST, prediction, rollType, playerPubKey58, winAmt, randStr)
641+ WriteSet([DataEntry(gameId, newGameDataStr), decreasedReserves])
646642 }
647643 }
648644 }
649645
650646
647+@Verifier(tx)
648+func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
649+ then match tx {
650+ case ttx: TransferTransaction =>
651+ ((assetBalance(this, WBET) - ttx.amount) >= ExtractReservedAmt())
652+ case stx: SetScriptTransaction =>
653+ true
654+ case itx: InvokeScriptTransaction =>
655+ if ((itx.function == "withdraw"))
656+ then true
657+ else false
658+ case _ =>
659+ false
660+ }
661+ else false
662+

github/deemru/w8io/873ac7e 
112.99 ms