tx · 6TN2UzpqopB3uUh2yy3JFYP8b1zyZEENLuwLShTAgsfL

3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX:  -0.05000000 Waves

2019.10.28 06:57 [739439] smart account 3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX > SELF 0.00000000 Waves

{ "type": 13, "id": "6TN2UzpqopB3uUh2yy3JFYP8b1zyZEENLuwLShTAgsfL", "fee": 5000000, "feeAssetId": null, "timestamp": 1572235133276, "version": 1, "sender": "3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX", "senderPublicKey": "ACfUG5PwG2GssMuyEwVEhkYAbbbP1geSHR8XoNxLyu6V", "proofs": [ "QCoooMUFjLDr2N92cvKkdWwApjT2hqtiKbpuHTbvrCvqx3dX8h6gzH7PaJb83XiQjRKPB8HigNH1zG9DC1DeQP7" ], "script": "base64:AAIDAAAAAAAAAAkIARIFCgMIAQIAAAAUAAAAAAlSU0FQVUJMSUMJAAJbAAAAAQIAAAGPYmFzZTY0Ok1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBZzRkQVI2WGJCREFTOWhyL0VqM2RKdjZGZmM0NjZ4L21PR01XVTNsckFCczNxYThCSG11Skdua2ZicEVmMnZBd1lUT1dQdnZ6Zk0xME9CYmZsb1N5cTNjOU1LdnlUZTFsdUJMR3FXNHZaVVhJeXZTZ3oxbGl5VVZlZklReTNkeUY5amJlVFpiQzBiYmNULzdPM0RFTCswMXo2QStyRENhY1NaMGxHb2xTUTZBbmhMeHpJa1ZwT1FKYnJCbUMreCtadVpQQ01Xekp5bmQ1YWVPbjdqYWovbWtSVnl4ZTZnLzBPaFd6NE5paVpYZXVNUkIrOG1LeTBmV0QvVWxJbFpXSHNBUzJabXJrWEtxakxxMC8wd3I4SUxKa3pualNxZG5JNUliamczdVFyai80QU4raTlyMjhhUTczL1prUHRZNVNidzBBT2lBQkJ1N2dIbXE5YXlWeFpRSURBUUFCAAAAAA9HQU1FU0NPVU5URVJLRVkCAAAACSRHQU1FX05VTQAAAAAEV0JFVAEAAAAgD5uLrFpvaCc5H1Jt+IyA7GJAqs11k4f4jn5gjTii4MkAAAAAC0ZFRVdBVkVTQkVUAAAAAAAAAAAEAAAAAAlGRUVNQ0FGRUUAAAAAAAAAAAIAAAAAB1dBVkVMRVQAAAAAAAX14QAAAAAACFNUQVRFV09OAgAAAANXT04AAAAACVNUQVRFTE9TVAIAAAAETE9TVAAAAAAJUk9MTFVOREVSAgAAAAVVTkRFUgAAAAAIUk9MTE9WRVICAAAABE9WRVIAAAAABkJFVE1JTgkAAGgAAAACAAAAAAAAAABkBQAAAAdXQVZFTEVUAAAAAAZCRVRNQVgJAABoAAAAAgAAAAAAATEtAAUAAAAHV0FWRUxFVAAAAAANUFJFRElDVElPTk1JTgAAAAAAAAAAAQAAAAANUFJFRElDVElPTk1BWAAAAAAAAAAAYwEAAAAQSW5jcmVtZW50R2FtZU51bQAAAAAEAAAAB2dhbWVOdW0EAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwUAAAAPR0FNRVND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dGlvbgAAAAAAAAAAKAAAAAAAAAKBQAMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAAKQAAAAAAAAKMHAMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAAKgAAAAAAAAKXXAMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAAKwAAAAAAAAKjAAMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAALAAAAAAAAAKvEgMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAALQAAAAAAAAK7kgMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAALgAAAAAAAALV8AMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAALwAAAAAAAALV8AMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAAMAAAAAAAAALj7AMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAAMQAAAAAAAALyagMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAAMgAAAAAAAAMBiAMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAAMwAAAAAAAAMRPAMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAANAAAAAAAAAMhkAMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAANQAAAAAAAAMyogMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAANgAAAAAAAANEcgMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAANwAAAAAAAANXAAMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAAOAAAAAAAAANqdAMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAAOQAAAAAAAAN+xAMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAAOgAAAAAAAAOUGAMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAAOwAAAAAAAAOqcAMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAAPAAAAAAAAAPB6gMJAAAAAAAAAgUAAAAKcHJlZGljdGlvbgAAAAAAAAAAPQAAAAAA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YVNpZwQAAAAGZ2FtZUlkCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQEAAAAB3BheW1lbnQJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAHcGF5bWVudAQAAAAKZmVlQXNzZXRJZAkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAFpAAAACmZlZUFzc2V0SWQEAAAADXBsYXllckJhbGFuY2UJAQAAAAx3YXZlc0JhbGFuY2UAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAACmdhbWVJZFVzZWQJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAABmdhbWVJZAMJAQAAAAIhPQAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAABFdCRVQJAAACAAAAAQIAAAAsUGF5bWVudCBzaG91bGQgYmUgaW4gV2F2ZXNiZXQuIEdhbWUgYWJvcnRlZC4DCQAAZgAAAAIAAAAAAAAHoSAFAAAADXBsYXllckJhbGFuY2UJAAACAAAAAQIAAABGVGhlcmUgYXJlIG5vdCBlbm91Z2ggd2F2ZXMsIGl0IHRha2VzIDAuMDA1IFdhdmVzIHRvIGJldC4gR2FtZSBhYm9ydGVkLgMFAAAACmZlZUFzc2V0SWQJAAACAAAAAQIAAAAxVHJhbnNhY3Rpb24ncyBmZWUgbXVzdCBiZSBpbiBXYXZlcy4gR2FtZSBhYm9ydGVkLgMFAAAACmdhbWVJZFVzZWQJAAACAAAAAQIAAAAxUGFzc2VkIGdhbWVJZCBoYWQgYmVlbiB1c2VkIGJlZm9yZS4gR2FtZSBhYm9ydGVkLgQAAAAEcmFuZAkBAAAAD0dlbmVyYXRlUmFuZEludAAAAAIFAAAABmdhbWVJZAUAAAAGcnNhU2lnBAAAAAdyYW5kU3RyCQEAAAAJUmFuZFRvU3RyAAAAAQUAAAAEcmFuZAQAAAAGcmVzdWx0CQEAAAAHZGljZVdpbgAAAAMFAAAACHJvbGxUeXBlBQAAAApwcmVkaWN0aW9uBQAAAARyYW5kBAAAAAZ3aW5BbXQDBQAAAAZyZXN1bHQJAQAAABpWYWxpZGF0ZUJldEFuZERlZmluZVdpbkFtdAAAAAMIBQAAAAdwYXltZW50AAAABmFtb3VudAUAAAAKcHJlZGljdGlvbgUAAAAIcm9sbFR5cGUAAAAAAAAAAAAEAAAACm5ld0dhbWVOdW0JAQAAABBJbmNyZW1lbnRHYW1lTnVtAAAAAAQAAAAHYmV0RGF0YQkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAGZ2FtZUlkAwUAAAAGcmVzdWx0BQAAAAhTVEFURVdPTgUAAAAJU1RBVEVMT1NUCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA9HQU1FU0NPVU5URVJLRVkFAAAACm5ld0dhbWVOdW0JAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAICAAAABnJhbmRvbQUAAAAEcmFuZAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgIAAAAHcGF5bWVudAgFAAAAB3BheW1lbnQAAAAGYW1vdW50CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACAgAAAAZwYXlvdXQFAAAABndpbkFtdAUAAAADbmlsAwUAAAAGcmVzdWx0CQEAAAAMU2NyaXB0UmVzdWx0AAAAAgUAAAAHYmV0RGF0YQkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAABndpbkFtdAUAAAAEV0JFVAUAAAADbmlsCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgUAAAAHYmV0RGF0YQkBAAAAC1RyYW5zZmVyU2V0AAAAAQUAAAADbmlsAAAAABC9Bis=", "chainId": 84, "height": 739439, "spentComplexity": 0 } View: original | compacted Prev: cMaULSV56FZE8qkZt5n5f6sF3hnKaXj2gD6UZCWzwwJ Next: C7EMUrbJvfo1YZd8n7fR7Lkr2Pw1skyDk2qsFFN93Kwz Diff:
OldNewDifferences
55
66 let GAMESCOUNTERKEY = "$GAME_NUM"
77
8-let RESERVATIONKEY = "$RESERVED_AMOUNT"
9-
108 let WBET = base58'23vgV9p9pD83A7CFbsDEc4zjanep7UeFo4ZRS6oGorhv'
11-
12-let WAVELET = ((100 * 1000) * 1000)
139
1410 let FEEWAVESBET = 4
1511
1612 let FEEMCAFEE = 2
1713
18-let STATESUBMITTED = "SUBMITTED"
14+let WAVELET = 100000000
1915
2016 let STATEWON = "WON"
2117
3329
3430 let PREDICTIONMAX = 99
3531
36-let IdxGameState = 0
37-
38-let IdxPrediction = 1
39-
40-let IdxType = 2
41-
42-let IdxPlayerPubKey58 = 3
43-
44-let IdxWinAmt = 4
45-
46-let IdxRandOrEmpty = 5
47-
4832 func IncrementGameNum () = {
4933 let gameNum = match getInteger(this, GAMESCOUNTERKEY) {
5034 case num: Int =>
5337 0
5438 }
5539 (gameNum + 1)
56- }
57-
58-
59-func ExtractReservedAmt () = match getInteger(this, RESERVATIONKEY) {
60- case a: Int =>
61- a
62- case _ =>
63- 0
64-}
65-
66-
67-func ValidateAndIncreaseReservedAmt (winAmt) = {
68- let newReservedAmount = (ExtractReservedAmt() + winAmt)
69- let balance = assetBalance(this, WBET)
70- if ((newReservedAmount > balance))
71- then throw("Insufficient funds on Wavesbet Dice account. Transaction was rejected for your safety.")
72- else newReservedAmount
73- }
74-
75-
76-func FormatGameDataParam (p) = {
77- let s = size(p)
78- if ((s == 0))
79- then throw("Parameter size must be greater then 0")
80- else if ((s > 99))
81- then throw("Parameter size must be less then 100")
82- else if ((10 > s))
83- then (("0" + toString(s)) + p)
84- else (toString(s) + p)
85- }
86-
87-
88-func FormatGameDataStr (gameState,prediction,typeRoll,playerPubKey58,winAmt,randOrEmpty) = {
89- let fullStateStr = ((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(toString(prediction))) + "_") + FormatGameDataParam(typeRoll)) + "_") + FormatGameDataParam(playerPubKey58)) + "_") + FormatGameDataParam(toString(winAmt)))
90- if ((randOrEmpty == ""))
91- then fullStateStr
92- else ((fullStateStr + "_") + FormatGameDataParam(randOrEmpty))
93- }
94-
95-
96-func RemoveUnderscoreIfPresent (remaining) = if ((size(remaining) > 0))
97- then drop(remaining, 1)
98- else remaining
99-
100-
101-func ParseNextAttribute (remaining) = {
102- let s = size(remaining)
103- if ((s > 0))
104- then {
105- let nn = parseIntValue(take(remaining, 2))
106- let v = take(drop(remaining, 2), nn)
107- let tmpRemaining = drop(remaining, (nn + 2))
108- let remainingState = RemoveUnderscoreIfPresent(tmpRemaining)
109-[v, remainingState]
110- }
111- else throw("Empty string was passed into parseNextAttribute func")
112- }
113-
114-
115-func ParseGameRawDataStr (rawStateStr) = {
116- let gameState = ParseNextAttribute(rawStateStr)
117- let prediction = ParseNextAttribute(gameState[1])
118- let rollType = ParseNextAttribute(prediction[1])
119- let playerPubKey58 = ParseNextAttribute(rollType[1])
120- let winAmt = ParseNextAttribute(playerPubKey58[1])
121-[gameState[0], prediction[0], rollType[0], playerPubKey58[0], winAmt[0]]
122- }
123-
124-
125-func ExtractGameDataList (gameId) = {
126- let rawDataStr = match getString(this, gameId) {
127- case str: String =>
128- str
129- case _ =>
130- throw(("Couldn't find game by " + gameId))
131- }
132- ParseGameRawDataStr(rawDataStr)
133- }
134-
135-
136-func DecreaseReservedAmt (gameId,winAmt) = {
137- let newReservedAmount = (ExtractReservedAmt() - winAmt)
138- if ((0 > newReservedAmount))
139- then throw("Invalid Dice Roller account state - reserved amount is less than 0")
140- else DataEntry(RESERVATIONKEY, newReservedAmount)
14140 }
14241
14342
15958 else false)
16059 then toString(r)
16160 else throw(("Unsupported r parameter passed: expected=[1,...,100] actual=" + toString(r)))
162-
163-
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))
169- }
17061
17162
17263 func Multiplier (prediction,rollType) = if ((rollType == ROLLUNDER))
560451 else 100000
561452
562453
563-func diceWin (type,prediction,number) = if ((type == ROLLUNDER))
564- then if ((prediction >= number))
454+func diceWin (type,prediction,rand) = if ((type == ROLLUNDER))
455+ then if ((prediction >= rand))
565456 then true
566457 else false
567458 else if ((type == ROLLOVER))
568- then if ((number >= prediction))
459+ then if ((rand >= prediction))
569460 then true
570461 else false
571462 else false
590481
591482
592483 @Callable(i)
593-func playDice (rollType,prediction) = {
484+func playDice (rollType,prediction,rsaSig) = {
594485 let gameId = toBase58String(i.transactionId)
595486 let payment = extract(i.payment)
596487 let feeAssetId = isDefined(i.feeAssetId)
597- let multi = Multiplier(prediction, rollType)
598- let winAmt = ValidateBetAndDefineWinAmt(payment.amount, prediction, rollType)
599488 let playerBalance = wavesBalance(i.caller)
600489 let gameIdUsed = isDefined(getString(this, gameId))
601490 if ((payment.assetId != WBET))
602- then throw("Payment should be in Wavesbet")
603- else if ((1400000 > playerBalance))
604- then throw("There are not enough waves, it takes 0.014 Waves to bet. Game aborted.")
491+ then throw("Payment should be in Wavesbet. Game aborted.")
492+ else if ((500000 > playerBalance))
493+ then throw("There are not enough waves, it takes 0.005 Waves to bet. Game aborted.")
605494 else if (feeAssetId)
606495 then throw("Transaction's fee must be in Waves. Game aborted.")
607496 else if (gameIdUsed)
608497 then throw("Passed gameId had been used before. Game aborted.")
609498 else {
499+ let rand = GenerateRandInt(gameId, rsaSig)
500+ let randStr = RandToStr(rand)
501+ let result = diceWin(rollType, prediction, rand)
502+ let winAmt = if (result)
503+ then ValidateBetAndDefineWinAmt(payment.amount, prediction, rollType)
504+ else 0
610505 let newGameNum = IncrementGameNum()
611- let playerPubKey58 = toBase58String(i.callerPublicKey)
612- let gameDataStr = FormatGameDataStr(STATESUBMITTED, prediction, rollType, playerPubKey58, winAmt, "")
613- ScriptResult(WriteSet([DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet(nil))
506+ let betData = WriteSet([DataEntry(gameId, if (result)
507+ then STATEWON
508+ else STATELOST), DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry("random", rand), DataEntry("payment", payment.amount), DataEntry("payout", winAmt)])
509+ if (result)
510+ then ScriptResult(betData, TransferSet([ScriptTransfer(i.caller, winAmt, WBET)]))
511+ else ScriptResult(betData, TransferSet(nil))
614512 }
615513 }
616514
617-
618-
619-@Callable(i)
620-func withdraw (gameId,rsaSig) = {
621- let gameDataList = ExtractGameDataList(gameId)
622- let gameState = gameDataList[IdxGameState]
623- let prediction = parseIntValue(gameDataList[IdxPrediction])
624- let rollType = gameDataList[IdxType]
625- let winAmt = parseIntValue(gameDataList[IdxWinAmt])
626- let playerPubKey58 = gameDataList[IdxPlayerPubKey58]
627- let playerAddress = addressFromPublicKey(fromBase58String(playerPubKey58))
628- let decreasedReserves = DecreaseReservedAmt(gameId, winAmt)
629- if ((gameState != STATESUBMITTED))
630- then throw("Invalid game state for passed gameId. Game aborted.")
631- else {
632- let rand = GenerateRandInt(gameId, rsaSig)
633- let randStr = RandToStr(rand)
634- if (diceWin(rollType, prediction, rand))
635- then {
636- let newGameDataStr = FormatGameDataStr(STATEWON, prediction, rollType, playerPubKey58, winAmt, randStr)
637- WinScriptSet(gameId, playerAddress, winAmt, newGameDataStr, decreasedReserves)
638- }
639- else {
640- let newGameDataStr = FormatGameDataStr(STATELOST, prediction, rollType, playerPubKey58, winAmt, randStr)
641- WriteSet([DataEntry(gameId, newGameDataStr), decreasedReserves])
642- }
643- }
644- }
645-
646-
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
662515
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 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
8-let RESERVATIONKEY = "$RESERVED_AMOUNT"
9-
108 let WBET = base58'23vgV9p9pD83A7CFbsDEc4zjanep7UeFo4ZRS6oGorhv'
11-
12-let WAVELET = ((100 * 1000) * 1000)
139
1410 let FEEWAVESBET = 4
1511
1612 let FEEMCAFEE = 2
1713
18-let STATESUBMITTED = "SUBMITTED"
14+let WAVELET = 100000000
1915
2016 let STATEWON = "WON"
2117
2218 let STATELOST = "LOST"
2319
2420 let ROLLUNDER = "UNDER"
2521
2622 let ROLLOVER = "OVER"
2723
2824 let BETMIN = (100 * WAVELET)
2925
3026 let BETMAX = (20000000 * WAVELET)
3127
3228 let PREDICTIONMIN = 1
3329
3430 let PREDICTIONMAX = 99
3531
36-let IdxGameState = 0
37-
38-let IdxPrediction = 1
39-
40-let IdxType = 2
41-
42-let IdxPlayerPubKey58 = 3
43-
44-let IdxWinAmt = 4
45-
46-let IdxRandOrEmpty = 5
47-
4832 func IncrementGameNum () = {
4933 let gameNum = match getInteger(this, GAMESCOUNTERKEY) {
5034 case num: Int =>
5135 num
5236 case _ =>
5337 0
5438 }
5539 (gameNum + 1)
56- }
57-
58-
59-func ExtractReservedAmt () = match getInteger(this, RESERVATIONKEY) {
60- case a: Int =>
61- a
62- case _ =>
63- 0
64-}
65-
66-
67-func ValidateAndIncreaseReservedAmt (winAmt) = {
68- let newReservedAmount = (ExtractReservedAmt() + winAmt)
69- let balance = assetBalance(this, WBET)
70- if ((newReservedAmount > balance))
71- then throw("Insufficient funds on Wavesbet Dice account. Transaction was rejected for your safety.")
72- else newReservedAmount
73- }
74-
75-
76-func FormatGameDataParam (p) = {
77- let s = size(p)
78- if ((s == 0))
79- then throw("Parameter size must be greater then 0")
80- else if ((s > 99))
81- then throw("Parameter size must be less then 100")
82- else if ((10 > s))
83- then (("0" + toString(s)) + p)
84- else (toString(s) + p)
85- }
86-
87-
88-func FormatGameDataStr (gameState,prediction,typeRoll,playerPubKey58,winAmt,randOrEmpty) = {
89- let fullStateStr = ((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(toString(prediction))) + "_") + FormatGameDataParam(typeRoll)) + "_") + FormatGameDataParam(playerPubKey58)) + "_") + FormatGameDataParam(toString(winAmt)))
90- if ((randOrEmpty == ""))
91- then fullStateStr
92- else ((fullStateStr + "_") + FormatGameDataParam(randOrEmpty))
93- }
94-
95-
96-func RemoveUnderscoreIfPresent (remaining) = if ((size(remaining) > 0))
97- then drop(remaining, 1)
98- else remaining
99-
100-
101-func ParseNextAttribute (remaining) = {
102- let s = size(remaining)
103- if ((s > 0))
104- then {
105- let nn = parseIntValue(take(remaining, 2))
106- let v = take(drop(remaining, 2), nn)
107- let tmpRemaining = drop(remaining, (nn + 2))
108- let remainingState = RemoveUnderscoreIfPresent(tmpRemaining)
109-[v, remainingState]
110- }
111- else throw("Empty string was passed into parseNextAttribute func")
112- }
113-
114-
115-func ParseGameRawDataStr (rawStateStr) = {
116- let gameState = ParseNextAttribute(rawStateStr)
117- let prediction = ParseNextAttribute(gameState[1])
118- let rollType = ParseNextAttribute(prediction[1])
119- let playerPubKey58 = ParseNextAttribute(rollType[1])
120- let winAmt = ParseNextAttribute(playerPubKey58[1])
121-[gameState[0], prediction[0], rollType[0], playerPubKey58[0], winAmt[0]]
122- }
123-
124-
125-func ExtractGameDataList (gameId) = {
126- let rawDataStr = match getString(this, gameId) {
127- case str: String =>
128- str
129- case _ =>
130- throw(("Couldn't find game by " + gameId))
131- }
132- ParseGameRawDataStr(rawDataStr)
133- }
134-
135-
136-func DecreaseReservedAmt (gameId,winAmt) = {
137- let newReservedAmount = (ExtractReservedAmt() - winAmt)
138- if ((0 > newReservedAmount))
139- then throw("Invalid Dice Roller account state - reserved amount is less than 0")
140- else DataEntry(RESERVATIONKEY, newReservedAmount)
14140 }
14241
14342
14443 func GenerateRandInt (gameId,rsaSign) = {
14544 let rsaSigValid = rsaVerify(SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
14645 if (rsaSigValid)
14746 then {
14847 let rand = (toInt(sha256(rsaSign)) % 100)
14948 if ((0 > rand))
15049 then ((-1 * rand) + 1)
15150 else (rand + 1)
15251 }
15352 else throw("Invalid RSA signature")
15453 }
15554
15655
15756 func RandToStr (r) = if (if ((r >= 1))
15857 then (100 >= r)
15958 else false)
16059 then toString(r)
16160 else throw(("Unsupported r parameter passed: expected=[1,...,100] actual=" + toString(r)))
162-
163-
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))
169- }
17061
17162
17263 func Multiplier (prediction,rollType) = if ((rollType == ROLLUNDER))
17364 then if ((prediction == 1))
17465 then 9850000
17566 else if ((prediction == 2))
17667 then 4925000
17768 else if ((prediction == 3))
17869 then 3283330
17970 else if ((prediction == 4))
18071 then 2462500
18172 else if ((prediction == 5))
18273 then 1970000
18374 else if ((prediction == 6))
18475 then 1641660
18576 else if ((prediction == 7))
18677 then 1407140
18778 else if ((prediction == 8))
18879 then 1231250
18980 else if ((prediction == 9))
19081 then 1094440
19182 else if ((prediction == 10))
19283 then 985000
19384 else if ((prediction == 11))
19485 then 895450
19586 else if ((prediction == 12))
19687 then 820830
19788 else if ((prediction == 13))
19889 then 757690
19990 else if ((prediction == 14))
20091 then 703570
20192 else if ((prediction == 15))
20293 then 656660
20394 else if ((prediction == 16))
20495 then 615620
20596 else if ((prediction == 17))
20697 then 579410
20798 else if ((prediction == 18))
20899 then 547220
209100 else if ((prediction == 19))
210101 then 518420
211102 else if ((prediction == 20))
212103 then 492500
213104 else if ((prediction == 21))
214105 then 469040
215106 else if ((prediction == 22))
216107 then 447720
217108 else if ((prediction == 23))
218109 then 428260
219110 else if ((prediction == 24))
220111 then 410410
221112 else if ((prediction == 25))
222113 then 394000
223114 else if ((prediction == 26))
224115 then 378840
225116 else if ((prediction == 27))
226117 then 364810
227118 else if ((prediction == 28))
228119 then 351780
229120 else if ((prediction == 29))
230121 then 339650
231122 else if ((prediction == 30))
232123 then 328330
233124 else if ((prediction == 31))
234125 then 317740
235126 else if ((prediction == 32))
236127 then 307810
237128 else if ((prediction == 33))
238129 then 298480
239130 else if ((prediction == 34))
240131 then 289700
241132 else if ((prediction == 35))
242133 then 281420
243134 else if ((prediction == 36))
244135 then 273610
245136 else if ((prediction == 37))
246137 then 259210
247138 else if ((prediction == 38))
248139 then 259210
249140 else if ((prediction == 39))
250141 then 252560
251142 else if ((prediction == 40))
252143 then 246250
253144 else if ((prediction == 41))
254145 then 240240
255146 else if ((prediction == 42))
256147 then 234520
257148 else if ((prediction == 43))
258149 then 229060
259150 else if ((prediction == 44))
260151 then 223860
261152 else if ((prediction == 45))
262153 then 218880
263154 else if ((prediction == 46))
264155 then 214130
265156 else if ((prediction == 47))
266157 then 209570
267158 else if ((prediction == 48))
268159 then 205200
269160 else if ((prediction == 49))
270161 then 201020
271162 else if ((prediction == 50))
272163 then 197000
273164 else if ((prediction == 51))
274165 then 193130
275166 else if ((prediction == 52))
276167 then 189420
277168 else if ((prediction == 53))
278169 then 185840
279170 else if ((prediction == 54))
280171 then 182400
281172 else if ((prediction == 55))
282173 then 179090
283174 else if ((prediction == 56))
284175 then 175890
285176 else if ((prediction == 57))
286177 then 172800
287178 else if ((prediction == 58))
288179 then 169820
289180 else if ((prediction == 59))
290181 then 166940
291182 else if ((prediction == 60))
292183 then 164160
293184 else if ((prediction == 61))
294185 then 161470
295186 else if ((prediction == 62))
296187 then 158870
297188 else if ((prediction == 63))
298189 then 156340
299190 else if ((prediction == 64))
300191 then 153900
301192 else if ((prediction == 65))
302193 then 151530
303194 else if ((prediction == 66))
304195 then 149240
305196 else if ((prediction == 67))
306197 then 147010
307198 else if ((prediction == 68))
308199 then 144850
309200 else if ((prediction == 69))
310201 then 142750
311202 else if ((prediction == 70))
312203 then 140710
313204 else if ((prediction == 71))
314205 then 138730
315206 else if ((prediction == 72))
316207 then 136800
317208 else if ((prediction == 73))
318209 then 134930
319210 else if ((prediction == 74))
320211 then 133100
321212 else if ((prediction == 75))
322213 then 131330
323214 else if ((prediction == 76))
324215 then 129600
325216 else if ((prediction == 77))
326217 then 127920
327218 else if ((prediction == 78))
328219 then 126280
329220 else if ((prediction == 79))
330221 then 124680
331222 else if ((prediction == 80))
332223 then 123120
333224 else if ((prediction == 81))
334225 then 121600
335226 else if ((prediction == 82))
336227 then 120120
337228 else if ((prediction == 83))
338229 then 118670
339230 else if ((prediction == 84))
340231 then 117260
341232 else if ((prediction == 85))
342233 then 115880
343234 else if ((prediction == 86))
344235 then 114530
345236 else if ((prediction == 87))
346237 then 113210
347238 else if ((prediction == 88))
348239 then 111930
349240 else if ((prediction == 89))
350241 then 110670
351242 else if ((prediction == 90))
352243 then 109440
353244 else if ((prediction == 91))
354245 then 108240
355246 else if ((prediction == 92))
356247 then 107060
357248 else if ((prediction == 93))
358249 then 105910
359250 else if ((prediction == 94))
360251 then 104780
361252 else if ((prediction == 95))
362253 then 103680
363254 else if ((prediction == 96))
364255 then 103680
365256 else 100000
366257 else if ((rollType == ROLLOVER))
367258 then if ((prediction == 4))
368259 then 103680
369260 else if ((prediction == 5))
370261 then 103680
371262 else if ((prediction == 6))
372263 then 104780
373264 else if ((prediction == 7))
374265 then 105910
375266 else if ((prediction == 8))
376267 then 107060
377268 else if ((prediction == 9))
378269 then 108240
379270 else if ((prediction == 10))
380271 then 109440
381272 else if ((prediction == 11))
382273 then 110670
383274 else if ((prediction == 12))
384275 then 111930
385276 else if ((prediction == 13))
386277 then 113210
387278 else if ((prediction == 14))
388279 then 114530
389280 else if ((prediction == 15))
390281 then 115880
391282 else if ((prediction == 16))
392283 then 117260
393284 else if ((prediction == 17))
394285 then 118670
395286 else if ((prediction == 18))
396287 then 120120
397288 else if ((prediction == 19))
398289 then 121600
399290 else if ((prediction == 20))
400291 then 123120
401292 else if ((prediction == 21))
402293 then 124680
403294 else if ((prediction == 22))
404295 then 126280
405296 else if ((prediction == 23))
406297 then 127920
407298 else if ((prediction == 24))
408299 then 129600
409300 else if ((prediction == 25))
410301 then 131330
411302 else if ((prediction == 26))
412303 then 133100
413304 else if ((prediction == 27))
414305 then 134930
415306 else if ((prediction == 28))
416307 then 136800
417308 else if ((prediction == 29))
418309 then 138730
419310 else if ((prediction == 30))
420311 then 140710
421312 else if ((prediction == 31))
422313 then 142750
423314 else if ((prediction == 32))
424315 then 144850
425316 else if ((prediction == 33))
426317 then 147010
427318 else if ((prediction == 34))
428319 then 149240
429320 else if ((prediction == 35))
430321 then 151530
431322 else if ((prediction == 36))
432323 then 153900
433324 else if ((prediction == 37))
434325 then 156340
435326 else if ((prediction == 38))
436327 then 158870
437328 else if ((prediction == 39))
438329 then 161470
439330 else if ((prediction == 40))
440331 then 164160
441332 else if ((prediction == 41))
442333 then 166940
443334 else if ((prediction == 42))
444335 then 169820
445336 else if ((prediction == 43))
446337 then 172800
447338 else if ((prediction == 44))
448339 then 175890
449340 else if ((prediction == 45))
450341 then 179090
451342 else if ((prediction == 46))
452343 then 185840
453344 else if ((prediction == 47))
454345 then 185840
455346 else if ((prediction == 48))
456347 then 189420
457348 else if ((prediction == 49))
458349 then 193130
459350 else if ((prediction == 50))
460351 then 197000
461352 else if ((prediction == 51))
462353 then 201020
463354 else if ((prediction == 52))
464355 then 205200
465356 else if ((prediction == 53))
466357 then 209570
467358 else if ((prediction == 54))
468359 then 214130
469360 else if ((prediction == 55))
470361 then 218880
471362 else if ((prediction == 56))
472363 then 223860
473364 else if ((prediction == 57))
474365 then 229060
475366 else if ((prediction == 58))
476367 then 234520
477368 else if ((prediction == 59))
478369 then 240240
479370 else if ((prediction == 60))
480371 then 246250
481372 else if ((prediction == 61))
482373 then 252560
483374 else if ((prediction == 62))
484375 then 259210
485376 else if ((prediction == 63))
486377 then 259210
487378 else if ((prediction == 64))
488379 then 273610
489380 else if ((prediction == 65))
490381 then 281420
491382 else if ((prediction == 66))
492383 then 289700
493384 else if ((prediction == 67))
494385 then 298480
495386 else if ((prediction == 68))
496387 then 307810
497388 else if ((prediction == 69))
498389 then 317740
499390 else if ((prediction == 70))
500391 then 328330
501392 else if ((prediction == 71))
502393 then 339650
503394 else if ((prediction == 72))
504395 then 351780
505396 else if ((prediction == 73))
506397 then 364810
507398 else if ((prediction == 74))
508399 then 378840
509400 else if ((prediction == 75))
510401 then 394000
511402 else if ((prediction == 76))
512403 then 410410
513404 else if ((prediction == 77))
514405 then 428260
515406 else if ((prediction == 78))
516407 then 447720
517408 else if ((prediction == 79))
518409 then 469040
519410 else if ((prediction == 80))
520411 then 492500
521412 else if ((prediction == 81))
522413 then 518420
523414 else if ((prediction == 82))
524415 then 547220
525416 else if ((prediction == 83))
526417 then 579410
527418 else if ((prediction == 84))
528419 then 615620
529420 else if ((prediction == 85))
530421 then 656660
531422 else if ((prediction == 86))
532423 then 703570
533424 else if ((prediction == 87))
534425 then 757690
535426 else if ((prediction == 88))
536427 then 820830
537428 else if ((prediction == 89))
538429 then 895450
539430 else if ((prediction == 90))
540431 then 985000
541432 else if ((prediction == 91))
542433 then 1094440
543434 else if ((prediction == 92))
544435 then 1231250
545436 else if ((prediction == 93))
546437 then 1407140
547438 else if ((prediction == 94))
548439 then 1641660
549440 else if ((prediction == 95))
550441 then 1970000
551442 else if ((prediction == 96))
552443 then 2462500
553444 else if ((prediction == 97))
554445 then 3283330
555446 else if ((prediction == 98))
556447 then 4925000
557448 else if ((prediction == 99))
558449 then 9850000
559450 else 100000
560451 else 100000
561452
562453
563-func diceWin (type,prediction,number) = if ((type == ROLLUNDER))
564- then if ((prediction >= number))
454+func diceWin (type,prediction,rand) = if ((type == ROLLUNDER))
455+ then if ((prediction >= rand))
565456 then true
566457 else false
567458 else if ((type == ROLLOVER))
568- then if ((number >= prediction))
459+ then if ((rand >= prediction))
569460 then true
570461 else false
571462 else false
572463
573464
574465 func ValidateBetAndDefineWinAmt (amount,prediction,rollType) = if (if ((BETMIN > amount))
575466 then true
576467 else (amount > BETMAX))
577468 then throw(((("Bet amount is not in range: minBet=" + toString((BETMIN / WAVELET))) + " maxBet=") + toString((BETMAX / WAVELET))))
578469 else if (if ((rollType != ROLLUNDER))
579470 then (rollType != ROLLOVER)
580471 else false)
581472 then throw("Invalid Roll type, try with OVER or UNDER")
582473 else if (if ((PREDICTIONMIN > prediction))
583474 then true
584475 else (prediction > PREDICTIONMAX))
585476 then throw(((("Prediction is out of the range: " + toString(PREDICTIONMIN)) + " <= prediction <= ") + toString(PREDICTIONMAX)))
586477 else {
587478 let multi = Multiplier(prediction, rollType)
588479 ((((amount * multi) / 100000) * (100 - (FEEWAVESBET + FEEMCAFEE))) / 100)
589480 }
590481
591482
592483 @Callable(i)
593-func playDice (rollType,prediction) = {
484+func playDice (rollType,prediction,rsaSig) = {
594485 let gameId = toBase58String(i.transactionId)
595486 let payment = extract(i.payment)
596487 let feeAssetId = isDefined(i.feeAssetId)
597- let multi = Multiplier(prediction, rollType)
598- let winAmt = ValidateBetAndDefineWinAmt(payment.amount, prediction, rollType)
599488 let playerBalance = wavesBalance(i.caller)
600489 let gameIdUsed = isDefined(getString(this, gameId))
601490 if ((payment.assetId != WBET))
602- then throw("Payment should be in Wavesbet")
603- else if ((1400000 > playerBalance))
604- then throw("There are not enough waves, it takes 0.014 Waves to bet. Game aborted.")
491+ then throw("Payment should be in Wavesbet. Game aborted.")
492+ else if ((500000 > playerBalance))
493+ then throw("There are not enough waves, it takes 0.005 Waves to bet. Game aborted.")
605494 else if (feeAssetId)
606495 then throw("Transaction's fee must be in Waves. Game aborted.")
607496 else if (gameIdUsed)
608497 then throw("Passed gameId had been used before. Game aborted.")
609498 else {
499+ let rand = GenerateRandInt(gameId, rsaSig)
500+ let randStr = RandToStr(rand)
501+ let result = diceWin(rollType, prediction, rand)
502+ let winAmt = if (result)
503+ then ValidateBetAndDefineWinAmt(payment.amount, prediction, rollType)
504+ else 0
610505 let newGameNum = IncrementGameNum()
611- let playerPubKey58 = toBase58String(i.callerPublicKey)
612- let gameDataStr = FormatGameDataStr(STATESUBMITTED, prediction, rollType, playerPubKey58, winAmt, "")
613- ScriptResult(WriteSet([DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet(nil))
506+ let betData = WriteSet([DataEntry(gameId, if (result)
507+ then STATEWON
508+ else STATELOST), DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry("random", rand), DataEntry("payment", payment.amount), DataEntry("payout", winAmt)])
509+ if (result)
510+ then ScriptResult(betData, TransferSet([ScriptTransfer(i.caller, winAmt, WBET)]))
511+ else ScriptResult(betData, TransferSet(nil))
614512 }
615513 }
616514
617-
618-
619-@Callable(i)
620-func withdraw (gameId,rsaSig) = {
621- let gameDataList = ExtractGameDataList(gameId)
622- let gameState = gameDataList[IdxGameState]
623- let prediction = parseIntValue(gameDataList[IdxPrediction])
624- let rollType = gameDataList[IdxType]
625- let winAmt = parseIntValue(gameDataList[IdxWinAmt])
626- let playerPubKey58 = gameDataList[IdxPlayerPubKey58]
627- let playerAddress = addressFromPublicKey(fromBase58String(playerPubKey58))
628- let decreasedReserves = DecreaseReservedAmt(gameId, winAmt)
629- if ((gameState != STATESUBMITTED))
630- then throw("Invalid game state for passed gameId. Game aborted.")
631- else {
632- let rand = GenerateRandInt(gameId, rsaSig)
633- let randStr = RandToStr(rand)
634- if (diceWin(rollType, prediction, rand))
635- then {
636- let newGameDataStr = FormatGameDataStr(STATEWON, prediction, rollType, playerPubKey58, winAmt, randStr)
637- WinScriptSet(gameId, playerAddress, winAmt, newGameDataStr, decreasedReserves)
638- }
639- else {
640- let newGameDataStr = FormatGameDataStr(STATELOST, prediction, rollType, playerPubKey58, winAmt, randStr)
641- WriteSet([DataEntry(gameId, newGameDataStr), decreasedReserves])
642- }
643- }
644- }
645-
646-
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
662515

github/deemru/w8io/873ac7e 
86.08 ms