tx · BkiZokeDf7TRYR6YEJRTpfC7jNWxUQDCdPBtiiTSkjFE

3MtKQXaiKQxSTRPpa8GjJ5zE7mE992eBrGu:  -0.05000000 Waves

2019.11.02 11:25 [747000] smart account 3MtKQXaiKQxSTRPpa8GjJ5zE7mE992eBrGu > SELF 0.00000000 Waves

{ "type": 13, "id": "BkiZokeDf7TRYR6YEJRTpfC7jNWxUQDCdPBtiiTSkjFE", "fee": 5000000, "feeAssetId": null, "timestamp": 1572683094326, "version": 1, "sender": "3MtKQXaiKQxSTRPpa8GjJ5zE7mE992eBrGu", "senderPublicKey": "2vmjFmSn7wGYrffwrNFgTN6j9CATDKwa8t8KAXWe2HVW", "proofs": [ "3rXcqtJVW4UgGibC6NHKCXndbRb3oB6jwys3Shxd9ZfwaGX1jnrq4dasYNjwEVKoLVNkTWKGDWRgfT15rhfuAh9k" ], "script": "base64:AAIDAAAAAAAAAAwIARIDCgEIEgMKAQgAAAAkAAAAAAlSU0FQVUJMSUMJAAJbAAAAAQIAAAGPYmFzZTY0Ok1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBZzRkQVI2WGJCREFTOWhyL0VqM2RKdjZGZmM0NjZ4L21PR01XVTNsckFCczNxYThCSG11Skdua2ZicEVmMnZBd1lUT1dQdnZ6Zk0xME9CYmZsb1N5cTNjOU1LdnlUZTFsdUJMR3FXNHZaVVhJeXZTZ3oxbGl5VVZlZklReTNkeUY5amJlVFpiQzBiYmNULzdPM0RFTCswMXo2QStyRENhY1NaMGxHb2xTUTZBbmhMeHpJa1ZwT1FKYnJCbUMreCtadVpQQ01Xekp5bmQ1YWVPbjdqYWovbWtSVnl4ZTZnLzBPaFd6NE5paVpYZXVNUkIrOG1LeTBmV0QvVWxJbFpXSHNBUzJabXJrWEtxakxxMC8wd3I4SUxKa3pualNxZG5JNUliamczdVFyai80QU4raTlyMjhhUTczL1prUHRZNVNidzBBT2lBQkJ1N2dIbXE5YXlWeFpRSURBUUFCAAAAAA9HQU1FU0NPVU5URVJLRVkCAAAACSRHQU1FX05VTQAAAAAEV0JFVAEAAAAghrQ2qHjTDszY8BetSy4sBB8Hn7rKuRapStdvJa2b0HYAAAAADldBTExFVFdBVkVTQkVUCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFULxHweE6v1pOfqW4iK2a1H7JT13jPO2j7AAAAAAxXQUxMRVRNQ0FGRUUJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVQvEfB4Tq/Wk5+pbiIrZrUfslPXeM87aPsAAAAAC0ZFRVdBVkVTQkVUAAAAAAAAAAAEAAAAAAlGRUVNQ0FGRUUAAAAAAAAAAAIAAAAAB1dBVkVMRVQAAAAAAAX14QAAAAAADlNUQVRFU1VCTUlUVEVEAgAAAAlTVUJNSVRURUQAAAAADVNUQVRFQUNDRVBURUQCAAAACEFDQ0VQVEVEAAAAAA1TVEFURUZJTklTSEVEAgAAAAhGSU5JU0hFRAAAAAANU1RBVEVDQU5DRUxFRAIAAAAIQ0FOQ0VMRUQAAAAAB0NPSU5SRUQCAAAAA1JFRAAAAAAIQ09JTkJMVUUCAAAABEJM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ZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAABmdhbWVJZAQAAAAHcGF5bWVudAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50BAAAAApmZWVBc3NldElkCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAAWkAAAAKZmVlQXNzZXRJZAMDCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCQAD7AAAAAEBAAAABBOr2TMJAQAAAAIhPQAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAABFdCRVQHCQAAAgAAAAECAAAAMVBheW1lbnQgc2hvdWxkIGJlIGluIFdiZXQgb3IgV2F2ZXMuIEdhbWUgYWJvcnRlZC4DBQAAAApmZWVBc3NldElkCQAAAgAAAAECAAAAMVRyYW5zYWN0aW9uJ3MgZmVlIG11c3QgYmUgaW4gV2F2ZXMuIEdhbWUgYWJvcnRlZC4DBQAAAApnYW1lSWRVc2VkCQAAAgAAAAECAAAAMVBhc3NlZCBnYW1lSWQgaGFkIGJlZW4gdXNlZCBiZWZvcmUuIEdhbWUgYWJvcnRlZC4EAAAACm5ld0dhbWVOdW0JAQAAABBJbmNyZW1lbnRHYW1lTnVtAAAAAAQAAAAPcGxheWVyQVB1YktleTU4CQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQQAAAAHcGF5VHlwZQkBAAAAC3BheW1lbnRUeXBlAAAAAQUAAAAHcGF5bWVudAQAAAAGd2luQW10CQEAAAAaVmFsaWRhdGVCZXRBbmREZWZpbmVXaW5BbXQAAAADCAUAAAAHcGF5bWVudAAAAAZhbW91bnQFAAAABnBhQ29pbgUAAAAHcGF5VHlwZQQAAAALZ2FtZURhdGFTdHIJAQAAABFGb3JtYXRHYW1lRGF0YVN0cgAAAAkFAAAADlNUQVRFU1VCTUlUVEVEBQAAAAZwYUNvaW4FAAAAD3BsYXllckFQdWJLZXk1OAUAAAAHcGF5VHlwZQgFAAAAB3BheW1lbnQAAAAGYW1vdW50BQAAAAZ3aW5BbXQCAAAAAAIAAAAAAgAAAAAJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA9HQU1FU0NPVU5URVJLRVkFAAAACm5ld0dhbWVOdW0JAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAABmdhbWVJZAUAAAALZ2FtZURhdGFTdHIFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQUAAAADbmlsAAAAAWkBAAAAE2NhbmNlbENvaW5DaGFsbGVuZ2UAAAABAAAABmdhbWVJZAQAAAAMZ2FtZURhdGFMaXN0CQEAAAATRXh0cmFjdEdhbWVEYXRhTGlzdAAAAAEFAAAABmdhbWVJZAQAAAAJZ2FtZVN0YXRlCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAMSWR4R2FtZVN0YXRlBAAAAAZwYUNvaW4JAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAA5JZHhQbGF5ZXJBQ29pbgQAAAAKcGFQdWJLZXk1OAkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAAEklkeFBsYXllckFQdWJLZXk1OAQAAAAHcGF5VHlwZQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAACklkeFBheVR5cGUEAAAABnBheUFtdAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAJSWR4UGF5QW10BAAAAAZ3aW5BbXQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAACUlkeFdpbkFtdAQAAAAIcHViS2V5NTgJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAApmZWVBc3NldElkCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAAWkAAAAKZmVlQXNzZXRJZAMFAAAACmZlZUFzc2V0SWQJAAACAAAAAQIAAAAxVHJhbnNhY3Rpb24ncyBmZWUgbXVzdCBiZSBpbiBXYXZlcy4gR2FtZSBhYm9ydGVkLgMJAQAAAAIhPQAAAAIFAAAACWdhbWVTdGF0ZQUAAAAOU1RBVEVTVUJNSVRURUQJAAACAAAAAQIAAAAzSW52YWxpZCBnYW1lIHN0YXRlIGZvciBwYXNzZWQgZ2FtZUlkLiBHYW1lIGFib3J0ZWQuAwkBAAAAAiE9AAAAAgUAAAAKcGFQdWJLZXk1OAUAAAAIcHViS2V5NTgJAAACAAAAAQIAAABBWW91IGNhbm5vdCBjYW5jZWwgYSBnYW1lIGNyZWF0ZWQgYnkgYW5vdGhlciBwbGF5ZXIuIEdhbWUgYWJvcnRlZC4DCQAAAAAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAADVDb2luZmxpcCBjb250cmFjdCBjYW5ub3QgY2FuY2VsIGEgZ2FtZS4gR2FtZSBhYm9ydGVkLgQAAAAObmV3R2FtZURhdGFTdHIJAQAAABFGb3JtYXRHYW1lRGF0YVN0cgAAAAkFAAAADVNUQVRFQ0FOQ0VMRUQFAAAABnBhQ29pbgUAAAAKcGFQdWJLZXk1OAUAAAAHcGF5VHlwZQUAAAAGcGF5QW10BQAAAAZ3aW5BbXQCAAAAAAIAAAAAAgAAAAAEAAAACXJlZnVuZEFtdAkAAGUAAAACBQAAAAZwYXlBbXQJAABpAAAAAgkAAGgAAAACBQAAAAZwYXlBbXQFAAAAC0ZFRVdBVkVTQkVUAAAAAAAAAABkBAAAAAxyZWZ1bmRXYWxsZXQJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEJAAJZAAAAAQUAAAAKcGFQdWJLZXk1OAQAAAALcmVmdW5kVG9rZW4JAQAAAAl0b2tlblR5cGUAAAABBQAAAAdwYXlUeXBlCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAGZ2FtZUlkBQAAAA5uZXdHYW1lRGF0YVN0cgUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAADHJlZnVuZFdhbGxldAUAAAAJcmVmdW5kQW10BQAAAAtyZWZ1bmRUb2tlbgUAAAADbmlsAAAAADLXE1E=", "chainId": 84, "height": 747000, "spentComplexity": 0 } View: original | compacted Prev: 5KQSfMnCZcDrBcZ4DeU2n8vybR1BSpHYXas8nugp8ca7 Next: Eior6y1njH3Syqo6jVsoCa9irafm1npPHaqQuLyh4Njb Diff:
OldNewDifferences
190190 }
191191
192192
193+
194+@Callable(i)
195+func cancelCoinChallenge (gameId) = {
196+ let gameDataList = ExtractGameDataList(gameId)
197+ let gameState = gameDataList[IdxGameState]
198+ let paCoin = gameDataList[IdxPlayerACoin]
199+ let paPubKey58 = gameDataList[IdxPlayerAPubKey58]
200+ let payType = gameDataList[IdxPayType]
201+ let payAmt = parseIntValue(gameDataList[IdxPayAmt])
202+ let winAmt = parseIntValue(gameDataList[IdxWinAmt])
203+ let pubKey58 = toBase58String(i.callerPublicKey)
204+ let feeAssetId = isDefined(i.feeAssetId)
205+ if (feeAssetId)
206+ then throw("Transaction's fee must be in Waves. Game aborted.")
207+ else if ((gameState != STATESUBMITTED))
208+ then throw("Invalid game state for passed gameId. Game aborted.")
209+ else if ((paPubKey58 != pubKey58))
210+ then throw("You cannot cancel a game created by another player. Game aborted.")
211+ else if ((i.caller == this))
212+ then throw("Coinflip contract cannot cancel a game. Game aborted.")
213+ else {
214+ let newGameDataStr = FormatGameDataStr(STATECANCELED, paCoin, paPubKey58, payType, payAmt, winAmt, "", "", "")
215+ let refundAmt = (payAmt - ((payAmt * FEEWAVESBET) / 100))
216+ let refundWallet = addressFromPublicKey(fromBase58String(paPubKey58))
217+ let refundToken = tokenType(payType)
218+ ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet([ScriptTransfer(refundWallet, refundAmt, refundToken)]))
219+ }
220+ }
221+
222+
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
88 let WBET = base58'A4q1mYKo11yuH9gmvDodeJoksagcyQzeFE9JtphMWddw'
99
1010 let WALLETWAVESBET = Address(base58'3MtCy2PCFPyu8A9SRNL4qUo1V17SGLHftD8')
1111
1212 let WALLETMCAFEE = Address(base58'3MtCy2PCFPyu8A9SRNL4qUo1V17SGLHftD8')
1313
1414 let FEEWAVESBET = 4
1515
1616 let FEEMCAFEE = 2
1717
1818 let WAVELET = 100000000
1919
2020 let STATESUBMITTED = "SUBMITTED"
2121
2222 let STATEACCEPTED = "ACCEPTED"
2323
2424 let STATEFINISHED = "FINISHED"
2525
2626 let STATECANCELED = "CANCELED"
2727
2828 let COINRED = "RED"
2929
3030 let COINBLUE = "BLUE"
3131
3232 let BETMINWAVES = ((1 * WAVELET) / 4)
3333
3434 let BETMINWBET = (100 * WAVELET)
3535
3636 let IdxGameState = 0
3737
3838 let IdxPlayerACoin = 1
3939
4040 let IdxPlayerAPubKey58 = 2
4141
4242 let IdxPayType = 3
4343
4444 let IdxPayAmt = 4
4545
4646 let IdxWinAmt = 5
4747
4848 let IdxPlayerBCoin = 6
4949
5050 let IdxPlayerBPubKey58 = 7
5151
5252 let IdxLuckyCoin = 8
5353
5454 func IncrementGameNum () = {
5555 let gameNum = match getInteger(this, GAMESCOUNTERKEY) {
5656 case num: Int =>
5757 num
5858 case _ =>
5959 0
6060 }
6161 (gameNum + 1)
6262 }
6363
6464
6565 func GenerateRandInt (gameId,rsaSign) = {
6666 let rsaSigValid = rsaVerify(SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
6767 if (rsaSigValid)
6868 then {
6969 let rand = (toInt(sha256(rsaSign)) % 100)
7070 if ((0 > rand))
7171 then ((-1 * rand) + 1)
7272 else (rand + 1)
7373 }
7474 else throw("Invalid RSA signature")
7575 }
7676
7777
7878 func paymentType (payment) = if ((payment.assetId == WBET))
7979 then "WBET"
8080 else "WAVES"
8181
8282
8383 func tokenType (token) = if ((token == "WBET"))
8484 then WBET
8585 else unit
8686
8787
8888 func FormatGameDataParam (p) = {
8989 let s = size(p)
9090 if ((s == 0))
9191 then throw("Parameter size must be greater then 0")
9292 else if ((s > 99))
9393 then throw("Parameter size must be less then 100")
9494 else if ((10 > s))
9595 then (("0" + toString(s)) + p)
9696 else (toString(s) + p)
9797 }
9898
9999
100100 func FormatGameDataStr (gameState,playerACoin,playerAPubKey58,payType,payAmount,winAmt,playerBCoin,playerBPubKey58,luckyCoin) = {
101101 let fullStateStr = ((((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(playerACoin)) + "_") + FormatGameDataParam(playerAPubKey58)) + "_") + FormatGameDataParam(payType)) + "_") + FormatGameDataParam(toString(payAmount))) + "_") + FormatGameDataParam(toString(winAmt)))
102102 if (if (if ((playerBCoin == ""))
103103 then true
104104 else (playerBPubKey58 == ""))
105105 then true
106106 else (luckyCoin == ""))
107107 then fullStateStr
108108 else ((((((fullStateStr + "_") + FormatGameDataParam(playerBCoin)) + "_") + FormatGameDataParam(playerBPubKey58)) + "_") + FormatGameDataParam(luckyCoin))
109109 }
110110
111111
112112 func RemoveUnderscoreIfPresent (remaining) = if ((size(remaining) > 0))
113113 then drop(remaining, 1)
114114 else remaining
115115
116116
117117 func ParseNextAttribute (remaining) = {
118118 let s = size(remaining)
119119 if ((s > 0))
120120 then {
121121 let nn = parseIntValue(take(remaining, 2))
122122 let v = take(drop(remaining, 2), nn)
123123 let tmpRemaining = drop(remaining, (nn + 2))
124124 let remainingState = RemoveUnderscoreIfPresent(tmpRemaining)
125125 [v, remainingState]
126126 }
127127 else throw("Empty string was passed into parseNextAttribute func")
128128 }
129129
130130
131131 func ParseGameRawDataStr (rawStateStr) = {
132132 let gameState = ParseNextAttribute(rawStateStr)
133133 let paCoin = ParseNextAttribute(gameState[1])
134134 let paPubKey58 = ParseNextAttribute(paCoin[1])
135135 let payType = ParseNextAttribute(paPubKey58[1])
136136 let payAmt = ParseNextAttribute(payType[1])
137137 let winAmt = ParseNextAttribute(payAmt[1])
138138 [gameState[0], paCoin[0], paPubKey58[0], payType[0], payAmt[0], winAmt[0]]
139139 }
140140
141141
142142 func ExtractGameDataList (gameId) = {
143143 let rawDataStr = match getString(this, gameId) {
144144 case str: String =>
145145 str
146146 case _ =>
147147 throw(("Couldn't find game by " + gameId))
148148 }
149149 ParseGameRawDataStr(rawDataStr)
150150 }
151151
152152
153153 func ValidateBetAndDefineWinAmt (amount,playerCoin,paymentType) = if (if ((playerCoin != COINRED))
154154 then (playerCoin != COINBLUE)
155155 else false)
156156 then throw("Invalid play, change your bet to RED or BLUE coin. Game aborted.")
157157 else if (if ((paymentType == "WBET"))
158158 then (BETMINWBET > amount)
159159 else false)
160160 then throw(("The minimum bet on Wbet is " + toString((BETMINWBET / WAVELET))))
161161 else if (if ((paymentType == "WAVES"))
162162 then (BETMINWAVES > amount)
163163 else false)
164164 then throw(("The minimum bet on Waves is " + toString((BETMINWAVES / WAVELET))))
165165 else (((amount * 2) * (100 - (FEEWAVESBET + FEEMCAFEE))) / 100)
166166
167167
168168 @Callable(i)
169169 func playCoinflip (paCoin) = {
170170 let gameId = toBase58String(i.transactionId)
171171 let gameIdUsed = isDefined(getString(this, gameId))
172172 let payment = extract(i.payment)
173173 let feeAssetId = isDefined(i.feeAssetId)
174174 if (if ((payment.assetId != assetInfo(base58'WAVES')))
175175 then (payment.assetId != WBET)
176176 else false)
177177 then throw("Payment should be in Wbet or Waves. Game aborted.")
178178 else if (feeAssetId)
179179 then throw("Transaction's fee must be in Waves. Game aborted.")
180180 else if (gameIdUsed)
181181 then throw("Passed gameId had been used before. Game aborted.")
182182 else {
183183 let newGameNum = IncrementGameNum()
184184 let playerAPubKey58 = toBase58String(i.callerPublicKey)
185185 let payType = paymentType(payment)
186186 let winAmt = ValidateBetAndDefineWinAmt(payment.amount, paCoin, payType)
187187 let gameDataStr = FormatGameDataStr(STATESUBMITTED, paCoin, playerAPubKey58, payType, payment.amount, winAmt, "", "", "")
188188 ScriptResult(WriteSet([DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet(nil))
189189 }
190190 }
191191
192192
193+
194+@Callable(i)
195+func cancelCoinChallenge (gameId) = {
196+ let gameDataList = ExtractGameDataList(gameId)
197+ let gameState = gameDataList[IdxGameState]
198+ let paCoin = gameDataList[IdxPlayerACoin]
199+ let paPubKey58 = gameDataList[IdxPlayerAPubKey58]
200+ let payType = gameDataList[IdxPayType]
201+ let payAmt = parseIntValue(gameDataList[IdxPayAmt])
202+ let winAmt = parseIntValue(gameDataList[IdxWinAmt])
203+ let pubKey58 = toBase58String(i.callerPublicKey)
204+ let feeAssetId = isDefined(i.feeAssetId)
205+ if (feeAssetId)
206+ then throw("Transaction's fee must be in Waves. Game aborted.")
207+ else if ((gameState != STATESUBMITTED))
208+ then throw("Invalid game state for passed gameId. Game aborted.")
209+ else if ((paPubKey58 != pubKey58))
210+ then throw("You cannot cancel a game created by another player. Game aborted.")
211+ else if ((i.caller == this))
212+ then throw("Coinflip contract cannot cancel a game. Game aborted.")
213+ else {
214+ let newGameDataStr = FormatGameDataStr(STATECANCELED, paCoin, paPubKey58, payType, payAmt, winAmt, "", "", "")
215+ let refundAmt = (payAmt - ((payAmt * FEEWAVESBET) / 100))
216+ let refundWallet = addressFromPublicKey(fromBase58String(paPubKey58))
217+ let refundToken = tokenType(payType)
218+ ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet([ScriptTransfer(refundWallet, refundAmt, refundToken)]))
219+ }
220+ }
221+
222+

github/deemru/w8io/c3f4982 
28.58 ms