tx · 66MeUeLqE6LnuMZUWuvBYcZQLiZbsMHPtkezsUwaAH5c

3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX:  -0.05000000 Waves

2019.10.29 16:01 [741468] smart account 3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX > SELF 0.00000000 Waves

{ "type": 13, "id": "66MeUeLqE6LnuMZUWuvBYcZQLiZbsMHPtkezsUwaAH5c", "fee": 5000000, "feeAssetId": null, "timestamp": 1572354098038, "version": 1, "sender": "3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX", "senderPublicKey": "ACfUG5PwG2GssMuyEwVEhkYAbbbP1geSHR8XoNxLyu6V", "proofs": [ "57TDWz9cnck7qLn2xTqvei3RGJ2BopaHdTeMd7HuVf4oj1bBqCj6FyJcGdVKajxiwWAP2gPuqSqEFaxgSvgjeidH" ], "script": "base64:AAIDAAAAAAAAABIIARIDCgEIEgQKAggCEgMKAQgAAAAiAAAAAAlSU0FQVUJMSUMJAAJbAAAAAQIAAAGPYmFzZTY0Ok1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBZzRkQVI2WGJCREFTOWhyL0VqM2RKdjZGZmM0NjZ4L21PR01XVTNsckFCczNxYThCSG11Skdua2ZicEVmMnZBd1lUT1dQdnZ6Zk0xME9CYmZsb1N5cTNjOU1LdnlUZTFsdUJMR3FXNHZaVVhJeXZTZ3oxbGl5VVZlZklReTNkeUY5amJlVFpiQzBiYmNULzdPM0RFTCswMXo2QStyRENhY1NaMGxHb2xTUTZBbmhMeHpJa1ZwT1FKYnJCbUMreCtadVpQQ01Xekp5bmQ1YWVPbjdqYWovbWtSVnl4ZTZnLzBPaFd6NE5paVpYZXVNUkIrOG1LeTBmV0QvVWxJbFpXSHNBUzJabXJrWEtxakxxMC8wd3I4SUxKa3pualNxZG5JNUliamczdVFyai80QU4raTlyMjhhUTczL1prUHRZNVNidzBBT2lBQkJ1N2dIbXE5YXlWeFpRSURBUUFCAAAAAA9HQU1FU0NPVU5URVJLRVkCAAAACSRHQU1FX05VTQAAAAAEV0JFVAEAAAAgD5uLrFpvaCc5H1Jt+IyA7GJAqs11k4f4jn5gjTii4MkAAAAAC0ZFRVdBVkVTQkVUAAAAAAAAAAAEAAAAAAlGRUVNQ0FGRUUAAAAAAAAAAAIAAAAAB1dBVkVMRVQAAAAAAAX14QAAAAAADlNUQVRFU1VCTUlUVEVEAgAAAAlTVUJNSVRURUQAAAAADVNUQVRFQUNDRVBURUQCAAAACEFDQ0VQVEVEAAAAAA1TVEFURUZJTklTSEVEAgAAAAhGSU5JU0hFRAAAAAANU1RBVEVDQU5DRUxFRAIAAAAIQ0FOQ0VMRUQAAAAAB0NPSU5SRUQCAAAAA1JFRAAAAAAIQ09JTkJMVUUCAAAABEJMVUUAAAAAC0JFVE1JTldBVkVTCQAAaQAAAAIJAABoAAAAAgAAAAAAAAAAAQUAAAAHV0FWRUxFVAAAAAAAAAAAAgAAAAAKQkVUTUlOV0JFVAkAAGgAAAACAAAAAAAAAABkBQAAAAdXQVZFTEVUAAAAAAxJZHhHYW1lU3RhdGUA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AAAAAAAAZAAAAAMAAAABaQEAAAAIcGxheUNvaW4AAAABAAAABnBhQ29pbgQAAAAGZ2FtZUlkCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQEAAAACmdhbWVJZFVzZWQJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAABmdhbWVJZAQAAAAHcGF5bWVudAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50BAAAAApmZWVBc3NldElkCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAAWkAAAAKZmVlQXNzZXRJZAMDCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCQAD7AAAAAEBAAAABBOr2TMJAQAAAAIhPQAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAABFdCRVQHCQAAAgAAAAECAAAAMVBheW1lbnQgc2hvdWxkIGJlIGluIFdiZXQgb3IgV2F2ZXMuIEdhbWUgYWJvcnRlZC4DBQAAAApmZWVBc3NldElkCQAAAgAAAAECAAAAMVRyYW5zYWN0aW9uJ3MgZmVlIG11c3QgYmUgaW4gV2F2ZXMuIEdhbWUgYWJvcnRlZC4DBQAAAApnYW1lSWRVc2VkCQAAAgAAAAECAAAAMVBhc3NlZCBnYW1lSWQgaGFkIGJlZW4gdXNlZCBiZWZvcmUuIEdhbWUgYWJvcnRlZC4DCQAAAAAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAADVDb2luZmxpcCBjb250cmFjdCBjYW5ub3QgY3JlYXRlIGEgZ2FtZS4gR2FtZSBhYm9ydGVkLgQAAAAKbmV3R2FtZU51bQkBAAAAEEluY3JlbWVudEdhbWVOdW0AAAAABAAAAA9wbGF5ZXJBUHViS2V5NTgJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAdwYXlUeXBlCQEAAAALcGF5bWVudFR5cGUAAAABBQAAAAdwYXltZW50BAAAAAZ3aW5BbXQJAQAAABpWYWxpZGF0ZUJldEFuZERlZmluZVdpbkFtdAAAAAMIBQAAAAdwYXltZW50AAAABmFtb3VudAUAAAAGcGFDb2luBQAAAAdwYXlUeXBlBAAAAAtnYW1lRGF0YVN0cgkBAAAAEUZvcm1hdEdhbWVEYXRhU3RyAAAACQUAAAAOU1RBVEVTVUJNSVRURUQFAAAABnBhQ29pbgUAAAAPcGxheWVyQVB1YktleTU4BQAAAAdwYXlUeXBlCAUAAAAHcGF5bWVudAAAAAZhbW91bnQFAAAABndpbkFtdAIAAAAAAgAAAAACAAAAAAkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAD0dBTUVTQ09VTlRFUktFWQUAAAAKbmV3R2FtZU51bQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAGZ2FtZUlkBQAAAAtnYW1lRGF0YVN0cgUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABBQAAAANuaWwAAAABaQEAAAATYWNjZXB0Q29pbkNoYWxsZW5nZQAAAAIAAAAGZ2FtZUlkAAAABnJzYVNpZwQAAAAMZ2FtZURhdGFMaXN0CQEAAAATRXh0cmFjdEdhbWVEYXRhTGlzdAAAAAEFAAAABmdhbWVJZAQAAAAJZ2FtZVN0YXRlCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAMSWR4R2FtZVN0YXRlBAAAAAZwYUNvaW4JAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAA5JZHhQbGF5ZXJBQ29pbgQAAAAKcGFQdWJLZXk1OAkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAAEklkeFBsYXllckFQdWJLZXk1OAQAAAAHcGF5VHlwZQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAACklkeFBheVR5cGUEAAAABnBheUFtdAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAJSWR4UGF5QW10BAAAAAZ3aW5BbXQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAACUlkeFdpbkFtdAQAAAAHcGF5bWVudAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50BAAAAApmZWVBc3NldElkCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAAWkAAAAKZmVlQXNzZXRJZAQAAAAKcGJQdWJLZXk1OAkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAACHBheVR5cGVCCQEAAAALcGF5bWVudFR5cGUAAAABBQAAAAdwYXltZW50AwMJAQAAAAIhPQAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQJAAPsAAAAAQEAAAAEE6vZMwkBAAAAAiE9AAAAAggFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAUAAAAEV0JFVAcJAAACAAAAAQIAAAAxUGF5bWVudCBzaG91bGQgYmUgaW4gV2JldCBvciBXYXZlcy4gR2FtZSBhYm9ydGVkLgMFAAAACmZlZUFzc2V0SWQJAAACAAAAAQIAAAAxVHJhbnNhY3Rpb24ncyBmZWUgbXVzdCBiZSBpbiBXYXZlcy4gR2FtZSBhYm9ydGVkLgMJAAAAAAAAAgUAAAAKcGFQdWJLZXk1OAUAAAAKcGJQdWJLZXk1OAkAAAIAAAABAgAAAD9Zb3UgY2FuJ3QgYWNjZXB0IGEgY2hhbGxlbmdlIGNyZWF0ZWQgYnkgeW91cnNlbGYuIEdhbWUgYWJvcnRlZC4DCQEAAAACIT0AAAACBQAAAAdwYXlUeXBlBQAAAAhwYXlUeXBlQgkAAAIAAAABAgAAAGNQYXltZW50IG11c3QgYmUgbWFkZSBpbiB0aGUgc2FtZSBjdXJyZW5jeSB0b2tlbiBhcyB0aGUgYmV0LCBXQkVUL1dCRVQgb3IgV0FWRVMvV0FWRVMuIEdhbWUgYWJvcnRlZC4DCQEAAAACIT0AAAACBQAAAAZwYXlBbXQIBQAAAAdwYXltZW50AAAABmFtb3VudAkAAAIAAAABAgAAAEBQYXlvdXQgbXVzdCBiZSBlcXVhbCB0byB0aGUgY2hhbGxlbmdlciBiZXQgYW1vdW50LiBHYW1lIGFib3J0ZWQuAwkBAAAAAiE9AAAAAgUAAAAJZ2FtZVN0YXRlBQAAAA5TVEFURVNVQk1JVFRFRAkAAAIAAAABAgAAADNJbnZhbGlkIGdhbWUgc3RhdGUgZm9yIHBhc3NlZCBnYW1lSWQuIEdhbWUgYWJvcnRlZC4DCQAAAAAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAADVDb2luZmxpcCBjb250cmFjdCBjYW5ub3QgYWNjZXB0IGEgZ2FtZS4gR2FtZSBhYm9ydGVkLgQAAAAEcmFuZAkBAAAADmdlbmVyYXRlTnVtYmVyAAAAAwUAAAABaQAAAAAAAAAAZAAAAAAAAAAAAAQAAAAJbHVja3lDb2luAwkAAGYAAAACBQAAAARyYW5kAAAAAAAAAAAyBQAAAAdDT0lOUkVEBQAAAAhDT0lOQkxVRQQAAAAGcGJDb2luAwkAAAAAAAACBQAAAAZwYUNvaW4FAAAAB0NPSU5SRUQFAAAACENPSU5CTFVFBQAAAAdDT0lOUkVEBAAAAA5uZXdHYW1lRGF0YVN0cgkBAAAAEUZvcm1hdEdhbWVEYXRhU3RyAAAACQUAAAANU1RBVEVBQ0NFUFRFRAUAAAAGcGFDb2luBQAAAApwYVB1YktleTU4BQAAAAdwYXlUeXBlBQAAAAZwYXlBbXQFAAAABndpbkFtdAUAAAAGcGJDb2luBQAAAApwYlB1YktleTU4BQAAAAlsdWNreUNvaW4JAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAZnYW1lSWQFAAAADm5ld0dhbWVEYXRhU3RyBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEFAAAAA25pbAAAAAFpAQAAABNjYW5jZWxDb2luQ2hhbGxlbmdlAAAAAQAAAAZnYW1lSWQEAAAADGdhbWVEYXRhTGlzdAkBAAAAE0V4dHJhY3RHYW1lRGF0YUxpc3QAAAABBQAAAAZnYW1lSWQEAAAACWdhbWVTdGF0ZQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAADElkeEdhbWVTdGF0ZQQAAAAGcGFDb2luCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAOSWR4UGxheWVyQUNvaW4EAAAACnBhUHViS2V5NTgJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAABJJZHhQbGF5ZXJBUHViS2V5NTgEAAAAB3BheVR5cGUJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAApJZHhQYXlUeXBlBAAAAAZwYXlBbXQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAACUlkeFBheUFtdAQAAAAGd2luQW10CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAAlJZHhXaW5BbXQEAAAACHB1YktleTU4CQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQQAAAAKZmVlQXNzZXRJZAkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAFpAAAACmZlZUFzc2V0SWQDBQAAAApmZWVBc3NldElkCQAAAgAAAAECAAAAMVRyYW5zYWN0aW9uJ3MgZmVlIG11c3QgYmUgaW4gV2F2ZXMuIEdhbWUgYWJvcnRlZC4DCQEAAAACIT0AAAACBQAAAAlnYW1lU3RhdGUFAAAADlNUQVRFU1VCTUlUVEVECQAAAgAAAAECAAAAM0ludmFsaWQgZ2FtZSBzdGF0ZSBmb3IgcGFzc2VkIGdhbWVJZC4gR2FtZSBhYm9ydGVkLgMJAQAAAAIhPQAAAAIFAAAACnBhUHViS2V5NTgFAAAACHB1YktleTU4CQAAAgAAAAECAAAAQVlvdSBjYW5ub3QgY2FuY2VsIGEgZ2FtZSBjcmVhdGVkIGJ5IGFub3RoZXIgcGxheWVyLiBHYW1lIGFib3J0ZWQuAwkAAAAAAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAA1Q29pbmZsaXAgY29udHJhY3QgY2Fubm90IGNhbmNlbCBhIGdhbWUuIEdhbWUgYWJvcnRlZC4EAAAADm5ld0dhbWVEYXRhU3RyCQEAAAARRm9ybWF0R2FtZURhdGFTdHIAAAAJBQAAAA1TVEFURUNBTkNFTEVEBQAAAAZwYUNvaW4FAAAACnBhUHViS2V5NTgFAAAAB3BheVR5cGUFAAAABnBheUFtdAUAAAAGd2luQW10AgAAAAACAAAAAAIAAAAABAAAAAlyZWZ1bmRBbXQJAABlAAAAAgUAAAAGcGF5QW10CQAAaQAAAAIJAABoAAAAAgUAAAAGcGF5QW10BQAAAAtGRUVXQVZFU0JFVAAAAAAAAAAAZAQAAAAMcmVmdW5kV2FsbGV0CQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABCQABmwAAAAEFAAAACnBhUHViS2V5NTgEAAAAC3JlZnVuZFRva2VuCQEAAAAJdG9rZW5UeXBlAAAAAQUAAAAHcGF5VHlwZQkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAABmdhbWVJZAUAAAAObmV3R2FtZURhdGFTdHIFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAxyZWZ1bmRXYWxsZXQFAAAACXJlZnVuZEFtdAUAAAALcmVmdW5kVG9rZW4FAAAAA25pbAAAAAAwbSsR", "chainId": 84, "height": 741468, "spentComplexity": 0 } View: original | compacted Prev: yxSkDPE9JhZyg7FCQTYJzAZEb5ebKhFFoU6V3zQGzjr Next: 3EeGYFg14w8rP7G6zzZLd2RBSQJbvUNttjf5eLumEagr Diff:
OldNewDifferences
176176 then throw("Transaction's fee must be in Waves. Game aborted.")
177177 else if (gameIdUsed)
178178 then throw("Passed gameId had been used before. Game aborted.")
179- else {
180- let newGameNum = IncrementGameNum()
181- let playerAPubKey58 = toBase58String(i.callerPublicKey)
182- let payType = paymentType(payment)
183- let winAmt = ValidateBetAndDefineWinAmt(payment.amount, paCoin, payType)
184- let gameDataStr = FormatGameDataStr(STATESUBMITTED, paCoin, playerAPubKey58, payType, payment.amount, winAmt, "", "", "")
185- ScriptResult(WriteSet([DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet(nil))
186- }
179+ else if ((i.caller == this))
180+ then throw("Coinflip contract cannot create a game. Game aborted.")
181+ else {
182+ let newGameNum = IncrementGameNum()
183+ let playerAPubKey58 = toBase58String(i.callerPublicKey)
184+ let payType = paymentType(payment)
185+ let winAmt = ValidateBetAndDefineWinAmt(payment.amount, paCoin, payType)
186+ let gameDataStr = FormatGameDataStr(STATESUBMITTED, paCoin, playerAPubKey58, payType, payment.amount, winAmt, "", "", "")
187+ ScriptResult(WriteSet([DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet(nil))
188+ }
187189 }
188190
189191
215217 then throw("Payout must be equal to the challenger bet amount. Game aborted.")
216218 else if ((gameState != STATESUBMITTED))
217219 then throw("Invalid game state for passed gameId. Game aborted.")
218- else {
219- let rand = generateNumber(i, 100, 0)
220- let luckyCoin = if ((rand > 50))
221- then COINRED
222- else COINBLUE
223- let pbCoin = if ((paCoin == COINRED))
224- then COINBLUE
225- else COINRED
226- let newGameDataStr = FormatGameDataStr(STATEACCEPTED, paCoin, paPubKey58, payType, payAmt, winAmt, pbCoin, pbPubKey58, luckyCoin)
227- ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet(nil))
228- }
220+ else if ((i.caller == this))
221+ then throw("Coinflip contract cannot accept a game. Game aborted.")
222+ else {
223+ let rand = generateNumber(i, 100, 0)
224+ let luckyCoin = if ((rand > 50))
225+ then COINRED
226+ else COINBLUE
227+ let pbCoin = if ((paCoin == COINRED))
228+ then COINBLUE
229+ else COINRED
230+ let newGameDataStr = FormatGameDataStr(STATEACCEPTED, paCoin, paPubKey58, payType, payAmt, winAmt, pbCoin, pbPubKey58, luckyCoin)
231+ ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet(nil))
232+ }
229233 }
230234
231235
247251 then throw("Invalid game state for passed gameId. Game aborted.")
248252 else if ((paPubKey58 != pubKey58))
249253 then throw("You cannot cancel a game created by another player. Game aborted.")
250- else {
251- let newGameDataStr = FormatGameDataStr(STATECANCELED, paCoin, paPubKey58, payType, payAmt, winAmt, "", "", "")
252- let refundAmt = (payAmt - ((payAmt * FEEWAVESBET) / 100))
253- let refundWallet = addressFromPublicKey(toBytes(paPubKey58))
254- let refundToken = tokenType(payType)
255- ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet([ScriptTransfer(refundWallet, refundAmt, refundToken)]))
256- }
254+ else if ((i.caller == this))
255+ then throw("Coinflip contract cannot cancel a game. Game aborted.")
256+ else {
257+ let newGameDataStr = FormatGameDataStr(STATECANCELED, paCoin, paPubKey58, payType, payAmt, winAmt, "", "", "")
258+ let refundAmt = (payAmt - ((payAmt * FEEWAVESBET) / 100))
259+ let refundWallet = addressFromPublicKey(toBytes(paPubKey58))
260+ let refundToken = tokenType(payType)
261+ ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet([ScriptTransfer(refundWallet, refundAmt, refundToken)]))
262+ }
257263 }
258264
259265
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'23vgV9p9pD83A7CFbsDEc4zjanep7UeFo4ZRS6oGorhv'
99
1010 let FEEWAVESBET = 4
1111
1212 let FEEMCAFEE = 2
1313
1414 let WAVELET = 100000000
1515
1616 let STATESUBMITTED = "SUBMITTED"
1717
1818 let STATEACCEPTED = "ACCEPTED"
1919
2020 let STATEFINISHED = "FINISHED"
2121
2222 let STATECANCELED = "CANCELED"
2323
2424 let COINRED = "RED"
2525
2626 let COINBLUE = "BLUE"
2727
2828 let BETMINWAVES = ((1 * WAVELET) / 2)
2929
3030 let BETMINWBET = (100 * WAVELET)
3131
3232 let IdxGameState = 0
3333
3434 let IdxPlayerACoin = 1
3535
3636 let IdxPlayerAPubKey58 = 2
3737
3838 let IdxPayType = 3
3939
4040 let IdxPayAmt = 4
4141
4242 let IdxWinAmt = 5
4343
4444 let IdxPlayerBCoin = 6
4545
4646 let IdxPlayerBPubKey58 = 7
4747
4848 let IdxLuckyCoin = 8
4949
5050 func IncrementGameNum () = {
5151 let gameNum = match getInteger(this, GAMESCOUNTERKEY) {
5252 case num: Int =>
5353 num
5454 case _ =>
5555 0
5656 }
5757 (gameNum + 1)
5858 }
5959
6060
6161 func generateNumber (inv,max,min) = {
6262 let lastPlay = match getBinary(this, "lastPlay") {
6363 case s: ByteVector =>
6464 s
6565 case a: Unit =>
6666 base58'2ee4oFDYriWJ9EMeR'
6767 case _ =>
6868 throw()
6969 }
7070 let rand = (((((lastPlay + inv.transactionId) + inv.callerPublicKey) + lastBlock.generationSignature) + toBytes(lastBlock.timestamp)) + toBytes(lastBlock.height))
7171 (((toInt(sha256(rand)) % 1000) % ((max - min) + 1)) + 1)
7272 }
7373
7474
7575 func paymentType (payment) = if ((payment.assetId == WBET))
7676 then "WBET"
7777 else "WAVES"
7878
7979
8080 func tokenType (token) = if ((token == "WBET"))
8181 then WBET
8282 else unit
8383
8484
8585 func FormatGameDataParam (p) = {
8686 let s = size(p)
8787 if ((s == 0))
8888 then throw("Parameter size must be greater then 0")
8989 else if ((s > 99))
9090 then throw("Parameter size must be less then 100")
9191 else if ((10 > s))
9292 then (("0" + toString(s)) + p)
9393 else (toString(s) + p)
9494 }
9595
9696
9797 func FormatGameDataStr (gameState,playerACoin,playerAPubKey58,payType,payAmount,winAmt,playerBCoin,playerBPubKey58,luckyCoin) = {
9898 let fullStateStr = ((((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(playerACoin)) + "_") + FormatGameDataParam(playerAPubKey58)) + "_") + FormatGameDataParam(payType)) + "_") + FormatGameDataParam(toString(payAmount))) + "_") + FormatGameDataParam(toString(winAmt)))
9999 if (if (if ((playerBCoin == ""))
100100 then true
101101 else (playerBPubKey58 == ""))
102102 then true
103103 else (luckyCoin == ""))
104104 then fullStateStr
105105 else ((((((fullStateStr + "_") + FormatGameDataParam(playerBCoin)) + "_") + FormatGameDataParam(playerBPubKey58)) + "_") + FormatGameDataParam(luckyCoin))
106106 }
107107
108108
109109 func RemoveUnderscoreIfPresent (remaining) = if ((size(remaining) > 0))
110110 then drop(remaining, 1)
111111 else remaining
112112
113113
114114 func ParseNextAttribute (remaining) = {
115115 let s = size(remaining)
116116 if ((s > 0))
117117 then {
118118 let nn = parseIntValue(take(remaining, 2))
119119 let v = take(drop(remaining, 2), nn)
120120 let tmpRemaining = drop(remaining, (nn + 2))
121121 let remainingState = RemoveUnderscoreIfPresent(tmpRemaining)
122122 [v, remainingState]
123123 }
124124 else throw("Empty string was passed into parseNextAttribute func")
125125 }
126126
127127
128128 func ParseGameRawDataStr (rawStateStr) = {
129129 let gameState = ParseNextAttribute(rawStateStr)
130130 let paCoin = ParseNextAttribute(gameState[1])
131131 let paPubKey58 = ParseNextAttribute(paCoin[1])
132132 let payType = ParseNextAttribute(paPubKey58[1])
133133 let payAmt = ParseNextAttribute(payType[1])
134134 let winAmt = ParseNextAttribute(payAmt[1])
135135 [gameState[0], paCoin[0], paPubKey58[0], payType[0], payAmt[0], winAmt[0]]
136136 }
137137
138138
139139 func ExtractGameDataList (gameId) = {
140140 let rawDataStr = match getString(this, gameId) {
141141 case str: String =>
142142 str
143143 case _ =>
144144 throw(("Couldn't find game by " + gameId))
145145 }
146146 ParseGameRawDataStr(rawDataStr)
147147 }
148148
149149
150150 func ValidateBetAndDefineWinAmt (amount,playerCoin,paymentType) = if (if ((playerCoin != COINRED))
151151 then (playerCoin != COINBLUE)
152152 else false)
153153 then throw("Invalid play, change your bet to RED or BLUE coin. Game aborted.")
154154 else if (if ((paymentType == "WBET"))
155155 then (BETMINWBET > amount)
156156 else false)
157157 then throw(("The minimum bet on Wbet is " + toString((BETMINWBET / WAVELET))))
158158 else if (if ((paymentType == "WAVES"))
159159 then (BETMINWAVES > amount)
160160 else false)
161161 then throw(("The minimum bet on Waves is " + toString((BETMINWAVES / WAVELET))))
162162 else (((amount * 2) * (100 - (FEEWAVESBET + FEEMCAFEE))) / 100)
163163
164164
165165 @Callable(i)
166166 func playCoin (paCoin) = {
167167 let gameId = toBase58String(i.transactionId)
168168 let gameIdUsed = isDefined(getString(this, gameId))
169169 let payment = extract(i.payment)
170170 let feeAssetId = isDefined(i.feeAssetId)
171171 if (if ((payment.assetId != assetInfo(base58'WAVES')))
172172 then (payment.assetId != WBET)
173173 else false)
174174 then throw("Payment should be in Wbet or Waves. Game aborted.")
175175 else if (feeAssetId)
176176 then throw("Transaction's fee must be in Waves. Game aborted.")
177177 else if (gameIdUsed)
178178 then throw("Passed gameId had been used before. Game aborted.")
179- else {
180- let newGameNum = IncrementGameNum()
181- let playerAPubKey58 = toBase58String(i.callerPublicKey)
182- let payType = paymentType(payment)
183- let winAmt = ValidateBetAndDefineWinAmt(payment.amount, paCoin, payType)
184- let gameDataStr = FormatGameDataStr(STATESUBMITTED, paCoin, playerAPubKey58, payType, payment.amount, winAmt, "", "", "")
185- ScriptResult(WriteSet([DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet(nil))
186- }
179+ else if ((i.caller == this))
180+ then throw("Coinflip contract cannot create a game. Game aborted.")
181+ else {
182+ let newGameNum = IncrementGameNum()
183+ let playerAPubKey58 = toBase58String(i.callerPublicKey)
184+ let payType = paymentType(payment)
185+ let winAmt = ValidateBetAndDefineWinAmt(payment.amount, paCoin, payType)
186+ let gameDataStr = FormatGameDataStr(STATESUBMITTED, paCoin, playerAPubKey58, payType, payment.amount, winAmt, "", "", "")
187+ ScriptResult(WriteSet([DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet(nil))
188+ }
187189 }
188190
189191
190192
191193 @Callable(i)
192194 func acceptCoinChallenge (gameId,rsaSig) = {
193195 let gameDataList = ExtractGameDataList(gameId)
194196 let gameState = gameDataList[IdxGameState]
195197 let paCoin = gameDataList[IdxPlayerACoin]
196198 let paPubKey58 = gameDataList[IdxPlayerAPubKey58]
197199 let payType = gameDataList[IdxPayType]
198200 let payAmt = parseIntValue(gameDataList[IdxPayAmt])
199201 let winAmt = parseIntValue(gameDataList[IdxWinAmt])
200202 let payment = extract(i.payment)
201203 let feeAssetId = isDefined(i.feeAssetId)
202204 let pbPubKey58 = toBase58String(i.callerPublicKey)
203205 let payTypeB = paymentType(payment)
204206 if (if ((payment.assetId != assetInfo(base58'WAVES')))
205207 then (payment.assetId != WBET)
206208 else false)
207209 then throw("Payment should be in Wbet or Waves. Game aborted.")
208210 else if (feeAssetId)
209211 then throw("Transaction's fee must be in Waves. Game aborted.")
210212 else if ((paPubKey58 == pbPubKey58))
211213 then throw("You can't accept a challenge created by yourself. Game aborted.")
212214 else if ((payType != payTypeB))
213215 then throw("Payment must be made in the same currency token as the bet, WBET/WBET or WAVES/WAVES. Game aborted.")
214216 else if ((payAmt != payment.amount))
215217 then throw("Payout must be equal to the challenger bet amount. Game aborted.")
216218 else if ((gameState != STATESUBMITTED))
217219 then throw("Invalid game state for passed gameId. Game aborted.")
218- else {
219- let rand = generateNumber(i, 100, 0)
220- let luckyCoin = if ((rand > 50))
221- then COINRED
222- else COINBLUE
223- let pbCoin = if ((paCoin == COINRED))
224- then COINBLUE
225- else COINRED
226- let newGameDataStr = FormatGameDataStr(STATEACCEPTED, paCoin, paPubKey58, payType, payAmt, winAmt, pbCoin, pbPubKey58, luckyCoin)
227- ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet(nil))
228- }
220+ else if ((i.caller == this))
221+ then throw("Coinflip contract cannot accept a game. Game aborted.")
222+ else {
223+ let rand = generateNumber(i, 100, 0)
224+ let luckyCoin = if ((rand > 50))
225+ then COINRED
226+ else COINBLUE
227+ let pbCoin = if ((paCoin == COINRED))
228+ then COINBLUE
229+ else COINRED
230+ let newGameDataStr = FormatGameDataStr(STATEACCEPTED, paCoin, paPubKey58, payType, payAmt, winAmt, pbCoin, pbPubKey58, luckyCoin)
231+ ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet(nil))
232+ }
229233 }
230234
231235
232236
233237 @Callable(i)
234238 func cancelCoinChallenge (gameId) = {
235239 let gameDataList = ExtractGameDataList(gameId)
236240 let gameState = gameDataList[IdxGameState]
237241 let paCoin = gameDataList[IdxPlayerACoin]
238242 let paPubKey58 = gameDataList[IdxPlayerAPubKey58]
239243 let payType = gameDataList[IdxPayType]
240244 let payAmt = parseIntValue(gameDataList[IdxPayAmt])
241245 let winAmt = parseIntValue(gameDataList[IdxWinAmt])
242246 let pubKey58 = toBase58String(i.callerPublicKey)
243247 let feeAssetId = isDefined(i.feeAssetId)
244248 if (feeAssetId)
245249 then throw("Transaction's fee must be in Waves. Game aborted.")
246250 else if ((gameState != STATESUBMITTED))
247251 then throw("Invalid game state for passed gameId. Game aborted.")
248252 else if ((paPubKey58 != pubKey58))
249253 then throw("You cannot cancel a game created by another player. Game aborted.")
250- else {
251- let newGameDataStr = FormatGameDataStr(STATECANCELED, paCoin, paPubKey58, payType, payAmt, winAmt, "", "", "")
252- let refundAmt = (payAmt - ((payAmt * FEEWAVESBET) / 100))
253- let refundWallet = addressFromPublicKey(toBytes(paPubKey58))
254- let refundToken = tokenType(payType)
255- ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet([ScriptTransfer(refundWallet, refundAmt, refundToken)]))
256- }
254+ else if ((i.caller == this))
255+ then throw("Coinflip contract cannot cancel a game. Game aborted.")
256+ else {
257+ let newGameDataStr = FormatGameDataStr(STATECANCELED, paCoin, paPubKey58, payType, payAmt, winAmt, "", "", "")
258+ let refundAmt = (payAmt - ((payAmt * FEEWAVESBET) / 100))
259+ let refundWallet = addressFromPublicKey(toBytes(paPubKey58))
260+ let refundToken = tokenType(payType)
261+ ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet([ScriptTransfer(refundWallet, refundAmt, refundToken)]))
262+ }
257263 }
258264
259265

github/deemru/w8io/873ac7e 
35.91 ms