tx · DuKUZisMxrbKqG5HgJ8c8Up3NNwkATXhM6zwGMtQb5UZ

3N2Z6EjzrzaCpD8ypDYLWDKe2PPVU8y9dJs:  -0.01400000 Waves

2019.09.07 02:47 [664887] smart account 3N2Z6EjzrzaCpD8ypDYLWDKe2PPVU8y9dJs > SELF 0.00000000 Waves

{ "type": 13, "id": "DuKUZisMxrbKqG5HgJ8c8Up3NNwkATXhM6zwGMtQb5UZ", "fee": 1400000, "feeAssetId": null, "timestamp": 1567813561048, "version": 1, "sender": "3N2Z6EjzrzaCpD8ypDYLWDKe2PPVU8y9dJs", "senderPublicKey": "HSTmdhPrJF81ozDBaqVn8QVtV76oD7gzDfcHPQRdxdwW", "proofs": [ "66sCfsubFwpyeJamgU4AoSzLmoqU2KrjfaLcKQ2GfDY5Ud3KbJrfC8Yp8bkMML3XpwGTcrwwqvjXBYqfpo3cLr8b" ], "script": "base64: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", "chainId": 84, "height": 664887, "spentComplexity": 0 } View: original | compacted Prev: 5tEKP6aVwiDYZSB1sW2Zrrn2cjuUeEa1W1bxU51MuT2W Next: Hnuoz15zweps2xD8SoPhAYxaX6M3nVT9HcHcHLaoSjPU Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let ServerPublicKey = fromBase58String("7im9caiCmE4SL6jTm4KTicHH4bGPf5v59rnfUA3cCRDj")
5-
64 let ServerBetPublicKey = fromBase58String("7im9caiCmE4SL6jTm4KTicHH4bGPf5v59rnfUA3cCRDj")
75
86 let WAVELET = ((100 * 1000) * 1000)
97
108 let COMMISSION = ((5 * WAVELET) / 1000)
119
12-func GenerateRandInt (gameId,rsaSign,lastTicket) = {
13- let rsaSigValid = sigVerify(toBytes(gameId), rsaSign, ServerPublicKey)
14- if (rsaSigValid)
15- then {
16- let rand = (toInt(sha256(rsaSign)) % lastTicket)
17- if ((0 > rand))
18- then ((-1 * rand) + 1)
19- else (rand + 1)
20- }
21- else throw("Invalid RSA signature")
10+let TicketsPerWave = 100
11+
12+let CURRENTGAME = "$CURRENT_GAME"
13+
14+let GAMESCOUNTERKEY = "$GAME_NUM"
15+
16+let LASTTICKET = "$LAST_TICKET"
17+
18+func getPlayersList (gameId,currentPlayer) = {
19+ let playersPresented = isDefined(getStringValue(this, (gameId + "_players")))
20+ if (!(playersPresented))
21+ then currentPlayer
22+ else if (isDefined(getStringValue(this, (((gameId + "_") + currentPlayer) + "_tickets"))))
23+ then getStringValue(this, (gameId + "_players"))
24+ else ((getStringValue(this, (gameId + "_players")) + "_") + currentPlayer)
2225 }
2326
2427
25-func getPlayersTickets (gameId,player) = {
26- let ticketsStr = (((gameId + "_") + player) + "_tickets")
27- let playerTicketsStr = getStringValue(this, ticketsStr)
28- playerTicketsStr
28+func getTickets (paymentAmt) = {
29+ let lastTicket = getIntegerValue(this, LASTTICKET)
30+ let wavesPayment = (paymentAmt / WAVELET)
31+ let tickets = "011_03100__03101_03300__010_010__010_010__010_010"
32+ tickets
2933 }
3034
3135
32-func ParseNextAttribute (remaining) = {
33- let s = size(remaining)
34- if ((s > 0))
35- then {
36- let nn = parseIntValue(take(remaining, 2))
37- let v = take(drop(remaining, 2), nn)
38- let tmpRemaining = drop(remaining, (nn + 2))
39- let remainingState = tmpRemaining
40-[v, remainingState]
41- }
42- else throw("Empty string was passed into parseNextAttribute func")
36+func IncrementGameNum () = {
37+ let gameNum = match getInteger(this, GAMESCOUNTERKEY) {
38+ case num: Int =>
39+ num
40+ case _ =>
41+ 0
42+ }
43+ (gameNum + 1)
4344 }
4445
4546
46-func parseBetStr (ticketsStr) = ["1", "100", "101", "300", "0", "0", "0", "0"]
47-
48-
49-func isWinner (gameId,player,winTicket) = {
50- let playersTicket = getPlayersTickets(gameId, player)
51- let bets = parseBetStr(playersTicket)
52- if (if ((winTicket >= parseIntValue(bets[0])))
53- then (parseIntValue(bets[1]) >= winTicket)
54- else false)
55- then true
56- else if (if ((winTicket >= parseIntValue(bets[2])))
57- then (parseIntValue(bets[3]) >= winTicket)
58- else false)
59- then true
60- else if (if ((winTicket >= parseIntValue(bets[4])))
61- then (parseIntValue(bets[5]) >= winTicket)
62- else false)
63- then true
64- else if (if ((winTicket >= parseIntValue(bets[6])))
65- then (parseIntValue(bets[7]) >= winTicket)
66- else false)
67- then true
68- else false
69- }
70-
71-
72-func defineWinner (gameId,players,winAmounts,winTicket) = {
73- let playersList = split(players, "_")
74- let winAmountsList = split(winAmounts, "_")
75- if (isWinner(gameId, playersList[0], winTicket))
76- then 0
77- else if (isWinner(gameId, playersList[1], winTicket))
78- then 1
79- else if (isWinner(gameId, playersList[2], winTicket))
80- then 2
81- else if (isWinner(gameId, playersList[3], winTicket))
82- then 3
83- else if (isWinner(gameId, playersList[4], winTicket))
84- then 4
85- else if (isWinner(gameId, playersList[5], winTicket))
86- then 5
87- else throw("Error with defining winner")
47+func getCurrentGame (txId) = {
48+ let gameId = getStringValue(this, CURRENTGAME)
49+ if ((gameId == ""))
50+ then txId
51+ else gameId
8852 }
8953
9054
9155 @Callable(i)
92-func bet (gameId,gameIdCryptedStr,tickets) = {
93- let gameIdCrypted = fromBase58String(gameIdCryptedStr)
56+func gameEnd () = {
57+ let gameData = [DataEntry(CURRENTGAME, "")]
58+ WriteSet(gameData)
59+ }
60+
61+
62+
63+@Callable(i)
64+func bet () = {
65+ let txId = toBase58String(i.transactionId)
66+ let gameId = getCurrentGame(txId)
9467 let pmt = extract(i.payment)
9568 let betNotInWaves = isDefined(pmt.assetId)
9669 let feeNotInWaves = isDefined(pmt.assetId)
10376 else if (feeNotInWaves)
10477 then throw("Transaction's fee must be in Waves")
10578 else {
106- let rsaSigValid = sigVerify(toBytes(gameId), gameIdCrypted, ServerBetPublicKey)
107- if (rsaSigValid)
108- then {
109- let playerAddressStr = toString(playerAddress)
110- let betData = [DataEntry((((gameId + "_") + playerAddressStr) + "_tickets"), tickets)]
111- WriteSet(betData)
112- }
113- else throw("Invalid RSA signature")
79+ let playerAddressStr = toString(playerAddress)
80+ let betData = [DataEntry(CURRENTGAME, gameId), DataEntry((((gameId + "_") + playerAddressStr) + "_tickets"), getTickets(pmt.amount)), DataEntry((gameId + "_players"), getPlayersList(gameId, playerAddressStr))]
81+ WriteSet(betData)
11482 }
11583 else throw("This game already end, try make bet again")
116- }
117-
118-
119-
120-@Callable(i)
121-func generateResult (gameId,rsaSignCrypted,lastTicket,players,winAmounts) = {
122- let rsaSign = fromBase58String(rsaSignCrypted)
123- let winTicket = GenerateRandInt(gameId, rsaSign, lastTicket)
124- let playersList = split(players, "_")
125- let winAmountsList = split(winAmounts, "_")
126- let winnerNum = defineWinner(gameId, players, winAmounts, winTicket)
127- let winTX = [ScriptTransfer(addressFromStringValue(playersList[winnerNum]), parseIntValue(winAmountsList[winnerNum]), unit)]
128- let gameResult = [DataEntry((gameId + "_result"), toString(winTicket)), DataEntry((gameId + "_winner"), playersList[winnerNum]), DataEntry((gameId + "_winAmt"), winAmountsList[winnerNum])]
129- ScriptResult(WriteSet(gameResult), TransferSet(winTX))
13084 }
13185
13286
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let ServerPublicKey = fromBase58String("7im9caiCmE4SL6jTm4KTicHH4bGPf5v59rnfUA3cCRDj")
5-
64 let ServerBetPublicKey = fromBase58String("7im9caiCmE4SL6jTm4KTicHH4bGPf5v59rnfUA3cCRDj")
75
86 let WAVELET = ((100 * 1000) * 1000)
97
108 let COMMISSION = ((5 * WAVELET) / 1000)
119
12-func GenerateRandInt (gameId,rsaSign,lastTicket) = {
13- let rsaSigValid = sigVerify(toBytes(gameId), rsaSign, ServerPublicKey)
14- if (rsaSigValid)
15- then {
16- let rand = (toInt(sha256(rsaSign)) % lastTicket)
17- if ((0 > rand))
18- then ((-1 * rand) + 1)
19- else (rand + 1)
20- }
21- else throw("Invalid RSA signature")
10+let TicketsPerWave = 100
11+
12+let CURRENTGAME = "$CURRENT_GAME"
13+
14+let GAMESCOUNTERKEY = "$GAME_NUM"
15+
16+let LASTTICKET = "$LAST_TICKET"
17+
18+func getPlayersList (gameId,currentPlayer) = {
19+ let playersPresented = isDefined(getStringValue(this, (gameId + "_players")))
20+ if (!(playersPresented))
21+ then currentPlayer
22+ else if (isDefined(getStringValue(this, (((gameId + "_") + currentPlayer) + "_tickets"))))
23+ then getStringValue(this, (gameId + "_players"))
24+ else ((getStringValue(this, (gameId + "_players")) + "_") + currentPlayer)
2225 }
2326
2427
25-func getPlayersTickets (gameId,player) = {
26- let ticketsStr = (((gameId + "_") + player) + "_tickets")
27- let playerTicketsStr = getStringValue(this, ticketsStr)
28- playerTicketsStr
28+func getTickets (paymentAmt) = {
29+ let lastTicket = getIntegerValue(this, LASTTICKET)
30+ let wavesPayment = (paymentAmt / WAVELET)
31+ let tickets = "011_03100__03101_03300__010_010__010_010__010_010"
32+ tickets
2933 }
3034
3135
32-func ParseNextAttribute (remaining) = {
33- let s = size(remaining)
34- if ((s > 0))
35- then {
36- let nn = parseIntValue(take(remaining, 2))
37- let v = take(drop(remaining, 2), nn)
38- let tmpRemaining = drop(remaining, (nn + 2))
39- let remainingState = tmpRemaining
40-[v, remainingState]
41- }
42- else throw("Empty string was passed into parseNextAttribute func")
36+func IncrementGameNum () = {
37+ let gameNum = match getInteger(this, GAMESCOUNTERKEY) {
38+ case num: Int =>
39+ num
40+ case _ =>
41+ 0
42+ }
43+ (gameNum + 1)
4344 }
4445
4546
46-func parseBetStr (ticketsStr) = ["1", "100", "101", "300", "0", "0", "0", "0"]
47-
48-
49-func isWinner (gameId,player,winTicket) = {
50- let playersTicket = getPlayersTickets(gameId, player)
51- let bets = parseBetStr(playersTicket)
52- if (if ((winTicket >= parseIntValue(bets[0])))
53- then (parseIntValue(bets[1]) >= winTicket)
54- else false)
55- then true
56- else if (if ((winTicket >= parseIntValue(bets[2])))
57- then (parseIntValue(bets[3]) >= winTicket)
58- else false)
59- then true
60- else if (if ((winTicket >= parseIntValue(bets[4])))
61- then (parseIntValue(bets[5]) >= winTicket)
62- else false)
63- then true
64- else if (if ((winTicket >= parseIntValue(bets[6])))
65- then (parseIntValue(bets[7]) >= winTicket)
66- else false)
67- then true
68- else false
69- }
70-
71-
72-func defineWinner (gameId,players,winAmounts,winTicket) = {
73- let playersList = split(players, "_")
74- let winAmountsList = split(winAmounts, "_")
75- if (isWinner(gameId, playersList[0], winTicket))
76- then 0
77- else if (isWinner(gameId, playersList[1], winTicket))
78- then 1
79- else if (isWinner(gameId, playersList[2], winTicket))
80- then 2
81- else if (isWinner(gameId, playersList[3], winTicket))
82- then 3
83- else if (isWinner(gameId, playersList[4], winTicket))
84- then 4
85- else if (isWinner(gameId, playersList[5], winTicket))
86- then 5
87- else throw("Error with defining winner")
47+func getCurrentGame (txId) = {
48+ let gameId = getStringValue(this, CURRENTGAME)
49+ if ((gameId == ""))
50+ then txId
51+ else gameId
8852 }
8953
9054
9155 @Callable(i)
92-func bet (gameId,gameIdCryptedStr,tickets) = {
93- let gameIdCrypted = fromBase58String(gameIdCryptedStr)
56+func gameEnd () = {
57+ let gameData = [DataEntry(CURRENTGAME, "")]
58+ WriteSet(gameData)
59+ }
60+
61+
62+
63+@Callable(i)
64+func bet () = {
65+ let txId = toBase58String(i.transactionId)
66+ let gameId = getCurrentGame(txId)
9467 let pmt = extract(i.payment)
9568 let betNotInWaves = isDefined(pmt.assetId)
9669 let feeNotInWaves = isDefined(pmt.assetId)
9770 let playerPubKey58 = toBase58String(i.callerPublicKey)
9871 let playerAddress = addressFromPublicKey(fromBase58String(playerPubKey58))
9972 let gameStillOpen = isDefined(getString(this, (gameId + "_result")))
10073 if (!(gameStillOpen))
10174 then if (betNotInWaves)
10275 then throw("Bet amount must be in Waves")
10376 else if (feeNotInWaves)
10477 then throw("Transaction's fee must be in Waves")
10578 else {
106- let rsaSigValid = sigVerify(toBytes(gameId), gameIdCrypted, ServerBetPublicKey)
107- if (rsaSigValid)
108- then {
109- let playerAddressStr = toString(playerAddress)
110- let betData = [DataEntry((((gameId + "_") + playerAddressStr) + "_tickets"), tickets)]
111- WriteSet(betData)
112- }
113- else throw("Invalid RSA signature")
79+ let playerAddressStr = toString(playerAddress)
80+ let betData = [DataEntry(CURRENTGAME, gameId), DataEntry((((gameId + "_") + playerAddressStr) + "_tickets"), getTickets(pmt.amount)), DataEntry((gameId + "_players"), getPlayersList(gameId, playerAddressStr))]
81+ WriteSet(betData)
11482 }
11583 else throw("This game already end, try make bet again")
116- }
117-
118-
119-
120-@Callable(i)
121-func generateResult (gameId,rsaSignCrypted,lastTicket,players,winAmounts) = {
122- let rsaSign = fromBase58String(rsaSignCrypted)
123- let winTicket = GenerateRandInt(gameId, rsaSign, lastTicket)
124- let playersList = split(players, "_")
125- let winAmountsList = split(winAmounts, "_")
126- let winnerNum = defineWinner(gameId, players, winAmounts, winTicket)
127- let winTX = [ScriptTransfer(addressFromStringValue(playersList[winnerNum]), parseIntValue(winAmountsList[winnerNum]), unit)]
128- let gameResult = [DataEntry((gameId + "_result"), toString(winTicket)), DataEntry((gameId + "_winner"), playersList[winnerNum]), DataEntry((gameId + "_winAmt"), winAmountsList[winnerNum])]
129- ScriptResult(WriteSet(gameResult), TransferSet(winTX))
13084 }
13185
13286

github/deemru/w8io/c3f4982 
24.56 ms