tx · Eior6y1njH3Syqo6jVsoCa9irafm1npPHaqQuLyh4Njb

3MtKQXaiKQxSTRPpa8GjJ5zE7mE992eBrGu:  -0.05000000 Waves

2019.11.02 23:44 [747741] smart account 3MtKQXaiKQxSTRPpa8GjJ5zE7mE992eBrGu > SELF 0.00000000 Waves

{ "type": 13, "id": "Eior6y1njH3Syqo6jVsoCa9irafm1npPHaqQuLyh4Njb", "fee": 5000000, "feeAssetId": null, "timestamp": 1572727425808, "version": 1, "sender": "3MtKQXaiKQxSTRPpa8GjJ5zE7mE992eBrGu", "senderPublicKey": "2vmjFmSn7wGYrffwrNFgTN6j9CATDKwa8t8KAXWe2HVW", "proofs": [ "4DyHPjH9MiwFoawLuKphyxSkrfm4L5YBjmq8wEwRytqbSBh4BQVgJtvzVmzF4WhkmD9BpNosWgr1tfMqiavzTQyR" ], "script": "base64:AAIDAAAAAAAAABIIARIDCgEIEgQKAggCEgMKAQgAAAAkAAAAAAlSU0FQVUJMSUMJAAJbAAAAAQIAAAGPYmFzZTY0Ok1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBZzRkQVI2WGJCREFTOWhyL0VqM2RKdjZGZmM0NjZ4L21PR01XVTNsckFCczNxYThCSG11Skdua2ZicEVmMnZBd1lUT1dQdnZ6Zk0xME9CYmZsb1N5cTNjOU1LdnlUZTFsdUJMR3FXNHZaVVhJeXZTZ3oxbGl5VVZlZklReTNkeUY5amJlVFpiQzBiYmNULzdPM0RFTCswMXo2QStyRENhY1NaMGxHb2xTUTZBbmhMeHpJa1ZwT1FKYnJCbUMreCtadVpQQ01Xekp5bmQ1YWVPbjdqYWovbWtSVnl4ZTZnLzBPaFd6NE5paVpYZXVNUkIrOG1LeTBmV0QvVWxJbFpXSHNBUzJabXJrWEtxakxxMC8wd3I4SUxKa3pualNxZG5JNUliamczdVFyai80QU4raTlyMjhhUTczL1prUHRZNVNidzBBT2lBQkJ1N2dIbXE5YXlWeFpRSURBUUFCAAAAAA9HQU1FU0NPVU5URVJLRVkCAAAACSRHQU1FX05VTQAAAAAEV0JFVAEAAAAghrQ2qHjTDszY8BetSy4sBB8Hn7rKuRapStdvJa2b0HYAAAAADldBTExFVFdBVkVTQkVUCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFULxHweE6v1pOfqW4iK2a1H7JT13jPO2j7AAAAAAxXQUxMRVRNQ0FGRUUJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVQvEfB4Tq/Wk5+pbiIrZrUfslPXeM87aPsAAAAAC0ZFRVdBVkVTQkVUAAAAAAAAAAAEAAAAAAlGRUVNQ0FGRUUAAAAAAAAAAAIAAAAAB1dBVkVMRVQAAAAAAAX14QAAAAAADlNUQVRFU1VCTUlUVEVEAgAAAAlTVUJNSVRURUQAAAAADVNUQVRFQUNDRVBURUQCAAAACEFDQ0VQVEVEAAAAAA1TVEFURUZJTklTSEVEAgAAAAhGSU5JU0hFRAAAAAANU1RBVEVDQU5DRUxFRAIAAAAIQ0FOQ0VMRUQAAAAAB0NPSU5SRUQCAAAAA1JFRAAAAAAIQ09JTkJMVUUC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c0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAABmdhbWVJZAQAAAAHcGF5bWVudAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50BAAAAApmZWVBc3NldElkCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAAWkAAAAKZmVlQXNzZXRJZAMDCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCQAD7AAAAAEBAAAABBOr2TMJAQAAAAIhPQAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAABFdCRVQHCQAAAgAAAAECAAAAMVBheW1lbnQgc2hvdWxkIGJlIGluIFdiZXQgb3IgV2F2ZXMuIEdhbWUgYWJvcnRlZC4DBQAAAApmZWVBc3NldElkCQAAAgAAAAECAAAAMVRyYW5zYWN0aW9uJ3MgZmVlIG11c3QgYmUgaW4gV2F2ZXMuIEdhbWUgYWJvcnRlZC4DBQAAAApnYW1lSWRVc2VkCQAAAgAAAAECAAAAMVBhc3NlZCBnYW1lSWQgaGFkIGJlZW4gdXNlZCBiZWZvcmUuIEdhbWUgYWJvcnRlZC4EAAAACm5ld0dhbWVOdW0JAQAAABBJbmNyZW1lbnRHYW1lTnVtAAAAAAQAAAAPcGxheWVyQVB1YktleTU4CQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQQAAAAHcGF5VHlwZQkBAAAAC3BheW1lbnRUeXBlAAAAAQUAAAAHcGF5bWVudAQAAAAGd2luQW10CQEAAAAaVmFsaWRhdGVCZXRBbmREZWZpbmVXaW5BbXQAAAADCAUAAAAHcGF5bWVudAAAAAZhbW91bnQFAAAABnBhQ29pbgUAAAAHcGF5VHlwZQQAAAALZ2FtZURhdGFTdHIJAQAAABFGb3JtYXRHYW1lRGF0YVN0cgAAAAkFAAAADlNUQVRFU1VCTUlUVEVEBQAAAAZwYUNvaW4FAAAAD3BsYXllckFQdWJLZXk1OAUAAAAHcGF5VHlwZQgFAAAAB3BheW1lbnQAAAAGYW1vdW50BQAAAAZ3aW5BbXQCAAAAAAIAAAAAAgAAAAAJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA9HQU1FU0NPVU5URVJLRVkFAAAACm5ld0dhbWVOdW0JAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAABmdhbWVJZAUAAAALZ2FtZURhdGFTdHIFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQUAAAADbmlsAAAAAWkBAAAAE2FjY2VwdENvaW5DaGFsbGVuZ2UAAAACAAAABmdhbWVJZAAAAAZyc2FTaWcEAAAADGdhbWVEYXRhTGlzdAkBAAAAE0V4dHJhY3RHYW1lRGF0YUxpc3QAAAABBQAAAAZnYW1lSWQEAAAACWdhbWVTdGF0ZQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAADElkeEdhbWVTdGF0ZQQAAAAGcGFDb2luCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAOSWR4UGxheWVyQUNvaW4EAAAACnBhUHViS2V5NTgJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAABJJZHhQbGF5ZXJBUHViS2V5NTgEAAAAB3BheVR5cGUJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAApJZHhQYXlUeXBlBAAAAAZwYXlBbXQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAACUlkeFBheUFtdAQAAAAGd2luQW10CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAAlJZHhXaW5BbXQEAAAAB3BheW1lbnQJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAHcGF5bWVudAQAAAAKZmVlQXNzZXRJZAkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAFpAAAACmZlZUFzc2V0SWQEAAAACnBiUHViS2V5NTgJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAhwYXlUeXBlQgkBAAAAC3BheW1lbnRUeXBlAAAAAQUAAAAHcGF5bWVudAMDCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCQAD7AAAAAEBAAAABBOr2TMJAQAAAAIhPQAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAABFdCRVQHCQAAAgAAAAECAAAAMVBheW1lbnQgc2hvdWxkIGJlIGluIFdiZXQgb3IgV2F2ZXMuIEdhbWUgYWJvcnRlZC4DBQAAAApmZWVBc3NldElkCQAAAgAAAAECAAAAMVRyYW5zYWN0aW9uJ3MgZmVlIG11c3QgYmUgaW4gV2F2ZXMuIEdhbWUgYWJvcnRlZC4DCQAAAAAAAAIFAAAACnBhUHViS2V5NTgFAAAACnBiUHViS2V5NTgJAAACAAAAAQIAAAA/WW91IGNhbid0IGFjY2VwdCBhIGNoYWxsZW5nZSBjcmVhdGVkIGJ5IHlvdXJzZWxmLiBHYW1lIGFib3J0ZWQuAwkBAAAAAiE9AAAAAgUAAAAHcGF5VHlwZQUAAAAIcGF5VHlwZUIJAAACAAAAAQIAAABaUGF5bWVudCBtdXN0IGJlIG1hZGUgaW4gdGhlIHNhbWUgdG9rZW4gYXMgdGhlIGJldCwgV0JFVC9XQkVUIG9yIFdBVkVTL1dBVkVTLiBHYW1lIGFib3J0ZWQuAwkBAAAAAiE9AAAAAgUAAAAGcGF5QW10CAUAAAAHcGF5bWVudAAAAAZhbW91bnQJAAACAAAAAQIAAABAUGF5b3V0IG11c3QgYmUgZXF1YWwgdG8gdGhlIGNoYWxsZW5nZXIgYmV0IGFtb3VudC4gR2FtZSBhYm9ydGVkLgMJAQAAAAIhPQAAAAIFAAAACWdhbWVTdGF0ZQUAAAAOU1RBVEVTVUJNSVRURUQJAAACAAAAAQIAAAAzSW52YWxpZCBnYW1lIHN0YXRlIGZvciBwYXNzZWQgZ2FtZUlkLiBHYW1lIGFib3J0ZWQuBAAAAARyYW5kCQEAAAAPR2VuZXJhdGVSYW5kSW50AAAAAgUAAAAGZ2FtZUlkBQAAAAZyc2FTaWcEAAAACWx1Y2t5Q29pbgMJAABmAAAAAgUAAAAEcmFuZAAAAAAAAAAAMgUAAAAHQ09JTlJFRAUAAAAIQ09JTkJMVUUEAAAABnBiQ29pbgMJAAAAAAAAAgUAAAAGcGFDb2luBQAAAAdDT0lOUkVEBQAAAAhDT0lOQkxVRQUAAAAHQ09JTlJFRAQAAAAMdG9rZW5Bc3NldElkCQEAAAAJdG9rZW5UeXBlAAAAAQUAAAAHcGF5VHlwZQQAAAAObmV3R2FtZURhdGFTdHIJAQAAABFGb3JtYXRHYW1lRGF0YVN0cgAAAAkFAAAADVNUQVRFQUNDRVBURUQFAAAABnBhQ29pbgUAAAAKcGFQdWJLZXk1OAUAAAAHcGF5VHlwZQUAAAAGcGF5QW10BQAAAAZ3aW5BbXQFAAAABnBiQ29pbgUAAAAKcGJQdWJLZXk1OAUAAAAJbHVja3lDb2luBAAAAAd3aW5BZGRyAwkAAAAAAAACBQAAAAZwYUNvaW4FAAAACWx1Y2t5Q29pbgkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAAApwYVB1YktleTU4CAUAAAABaQAAAAZjYWxsZXIJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAZnYW1lSWQFAAAADm5ld0dhbWVEYXRhU3RyBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAOV0FMTEVUV0FWRVNCRVQJAABpAAAAAgkAAGgAAAACBQAAAAZ3aW5BbXQFAAAAC0ZFRVdBVkVTQkVUAAAAAAAAAABkBQAAAAx0b2tlbkFzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAMV0FMTEVUTUNBRkVFCQAAaQAAAAIJAABoAAAAAgUAAAAGd2luQW10BQAAAAtGRUVXQVZFU0JFVAAAAAAAAAAAZAUAAAAMdG9rZW5Bc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAB3dpbkFkZHIFAAAABndpbkFtdAUAAAAMdG9rZW5Bc3NldElkBQAAAANuaWwAAAABaQEAAAATY2FuY2VsQ29pbkNoYWxsZW5nZQAAAAEAAAAGZ2FtZUlkBAAAAAxnYW1lRGF0YUxpc3QJAQAAABNFeHRyYWN0R2FtZURhdGFMaXN0AAAAAQUAAAAGZ2FtZUlkBAAAAAlnYW1lU3RhdGUJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAAxJZHhHYW1lU3RhdGUEAAAABnBhQ29pbgkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAADklkeFBsYXllckFDb2luBAAAAApwYVB1YktleTU4CQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAASSWR4UGxheWVyQVB1YktleTU4BAAAAAdwYXlUeXBlCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAKSWR4UGF5VHlwZQQAAAAGcGF5QW10CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAAlJZHhQYXlBbXQEAAAABndpbkFtdAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAJSWR4V2luQW10BAAAAAhwdWJLZXk1OAkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAACmZlZUFzc2V0SWQJAQAAAAlpc0RlZmluZWQAAAABCAUAAAABaQAAAApmZWVBc3NldElkAwUAAAAKZmVlQXNzZXRJZAkAAAIAAAABAgAAADFUcmFuc2FjdGlvbidzIGZlZSBtdXN0IGJlIGluIFdhdmVzLiBHYW1lIGFib3J0ZWQuAwkBAAAAAiE9AAAAAgUAAAAJZ2FtZVN0YXRlBQAAAA5TVEFURVNVQk1JVFRFRAkAAAIAAAABAgAAADNJbnZhbGlkIGdhbWUgc3RhdGUgZm9yIHBhc3NlZCBnYW1lSWQuIEdhbWUgYWJvcnRlZC4DCQEAAAACIT0AAAACBQAAAApwYVB1YktleTU4BQAAAAhwdWJLZXk1OAkAAAIAAAABAgAAAEFZb3UgY2Fubm90IGNhbmNlbCBhIGdhbWUgY3JlYXRlZCBieSBhbm90aGVyIHBsYXllci4gR2FtZSBhYm9ydGVkLgMJAAAAAAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAANUNvaW5mbGlwIGNvbnRyYWN0IGNhbm5vdCBjYW5jZWwgYSBnYW1lLiBHYW1lIGFib3J0ZWQuBAAAAA5uZXdHYW1lRGF0YVN0cgkBAAAAEUZvcm1hdEdhbWVEYXRhU3RyAAAACQUAAAANU1RBVEVDQU5DRUxFRAUAAAAGcGFDb2luBQAAAApwYVB1YktleTU4BQAAAAdwYXlUeXBlBQAAAAZwYXlBbXQFAAAABndpbkFtdAIAAAAAAgAAAAACAAAAAAQAAAAJcmVmdW5kQW10CQAAZQAAAAIFAAAABnBheUFtdAkAAGkAAAACCQAAaAAAAAIFAAAABnBheUFtdAUAAAALRkVFV0FWRVNCRVQAAAAAAAAAAGQEAAAADHJlZnVuZFdhbGxldAkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAAApwYVB1YktleTU4BAAAAAtyZWZ1bmRUb2tlbgkBAAAACXRva2VuVHlwZQAAAAEFAAAAB3BheVR5cGUJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAZnYW1lSWQFAAAADm5ld0dhbWVEYXRhU3RyBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAMcmVmdW5kV2FsbGV0BQAAAAlyZWZ1bmRBbXQFAAAAC3JlZnVuZFRva2VuBQAAAANuaWwAAAAAWJn/1g==", "chainId": 84, "height": 747741, "spentComplexity": 0 } View: original | compacted Prev: BkiZokeDf7TRYR6YEJRTpfC7jNWxUQDCdPBtiiTSkjFE Next: 5yYuYrxHnPEiFsmanHnhkFz5Tzp5FVJtADzLewAUFS4D Diff:
OldNewDifferences
192192
193193
194194 @Callable(i)
195+func acceptCoinChallenge (gameId,rsaSig) = {
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 payment = extract(i.payment)
204+ let feeAssetId = isDefined(i.feeAssetId)
205+ let pbPubKey58 = toBase58String(i.callerPublicKey)
206+ let payTypeB = paymentType(payment)
207+ if (if ((payment.assetId != assetInfo(base58'WAVES')))
208+ then (payment.assetId != WBET)
209+ else false)
210+ then throw("Payment should be in Wbet or Waves. Game aborted.")
211+ else if (feeAssetId)
212+ then throw("Transaction's fee must be in Waves. Game aborted.")
213+ else if ((paPubKey58 == pbPubKey58))
214+ then throw("You can't accept a challenge created by yourself. Game aborted.")
215+ else if ((payType != payTypeB))
216+ then throw("Payment must be made in the same token as the bet, WBET/WBET or WAVES/WAVES. Game aborted.")
217+ else if ((payAmt != payment.amount))
218+ then throw("Payout must be equal to the challenger bet amount. Game aborted.")
219+ else if ((gameState != STATESUBMITTED))
220+ then throw("Invalid game state for passed gameId. Game aborted.")
221+ else {
222+ let rand = GenerateRandInt(gameId, rsaSig)
223+ let luckyCoin = if ((rand > 50))
224+ then COINRED
225+ else COINBLUE
226+ let pbCoin = if ((paCoin == COINRED))
227+ then COINBLUE
228+ else COINRED
229+ let tokenAssetId = tokenType(payType)
230+ let newGameDataStr = FormatGameDataStr(STATEACCEPTED, paCoin, paPubKey58, payType, payAmt, winAmt, pbCoin, pbPubKey58, luckyCoin)
231+ let winAddr = if ((paCoin == luckyCoin))
232+ then addressFromPublicKey(fromBase58String(paPubKey58))
233+ else i.caller
234+ ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet([ScriptTransfer(WALLETWAVESBET, ((winAmt * FEEWAVESBET) / 100), tokenAssetId), ScriptTransfer(WALLETMCAFEE, ((winAmt * FEEWAVESBET) / 100), tokenAssetId), ScriptTransfer(winAddr, winAmt, tokenAssetId)]))
235+ }
236+ }
237+
238+
239+
240+@Callable(i)
195241 func cancelCoinChallenge (gameId) = {
196242 let gameDataList = ExtractGameDataList(gameId)
197243 let gameState = gameDataList[IdxGameState]
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
193193
194194 @Callable(i)
195+func acceptCoinChallenge (gameId,rsaSig) = {
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 payment = extract(i.payment)
204+ let feeAssetId = isDefined(i.feeAssetId)
205+ let pbPubKey58 = toBase58String(i.callerPublicKey)
206+ let payTypeB = paymentType(payment)
207+ if (if ((payment.assetId != assetInfo(base58'WAVES')))
208+ then (payment.assetId != WBET)
209+ else false)
210+ then throw("Payment should be in Wbet or Waves. Game aborted.")
211+ else if (feeAssetId)
212+ then throw("Transaction's fee must be in Waves. Game aborted.")
213+ else if ((paPubKey58 == pbPubKey58))
214+ then throw("You can't accept a challenge created by yourself. Game aborted.")
215+ else if ((payType != payTypeB))
216+ then throw("Payment must be made in the same token as the bet, WBET/WBET or WAVES/WAVES. Game aborted.")
217+ else if ((payAmt != payment.amount))
218+ then throw("Payout must be equal to the challenger bet amount. Game aborted.")
219+ else if ((gameState != STATESUBMITTED))
220+ then throw("Invalid game state for passed gameId. Game aborted.")
221+ else {
222+ let rand = GenerateRandInt(gameId, rsaSig)
223+ let luckyCoin = if ((rand > 50))
224+ then COINRED
225+ else COINBLUE
226+ let pbCoin = if ((paCoin == COINRED))
227+ then COINBLUE
228+ else COINRED
229+ let tokenAssetId = tokenType(payType)
230+ let newGameDataStr = FormatGameDataStr(STATEACCEPTED, paCoin, paPubKey58, payType, payAmt, winAmt, pbCoin, pbPubKey58, luckyCoin)
231+ let winAddr = if ((paCoin == luckyCoin))
232+ then addressFromPublicKey(fromBase58String(paPubKey58))
233+ else i.caller
234+ ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet([ScriptTransfer(WALLETWAVESBET, ((winAmt * FEEWAVESBET) / 100), tokenAssetId), ScriptTransfer(WALLETMCAFEE, ((winAmt * FEEWAVESBET) / 100), tokenAssetId), ScriptTransfer(winAddr, winAmt, tokenAssetId)]))
235+ }
236+ }
237+
238+
239+
240+@Callable(i)
195241 func cancelCoinChallenge (gameId) = {
196242 let gameDataList = ExtractGameDataList(gameId)
197243 let gameState = gameDataList[IdxGameState]
198244 let paCoin = gameDataList[IdxPlayerACoin]
199245 let paPubKey58 = gameDataList[IdxPlayerAPubKey58]
200246 let payType = gameDataList[IdxPayType]
201247 let payAmt = parseIntValue(gameDataList[IdxPayAmt])
202248 let winAmt = parseIntValue(gameDataList[IdxWinAmt])
203249 let pubKey58 = toBase58String(i.callerPublicKey)
204250 let feeAssetId = isDefined(i.feeAssetId)
205251 if (feeAssetId)
206252 then throw("Transaction's fee must be in Waves. Game aborted.")
207253 else if ((gameState != STATESUBMITTED))
208254 then throw("Invalid game state for passed gameId. Game aborted.")
209255 else if ((paPubKey58 != pubKey58))
210256 then throw("You cannot cancel a game created by another player. Game aborted.")
211257 else if ((i.caller == this))
212258 then throw("Coinflip contract cannot cancel a game. Game aborted.")
213259 else {
214260 let newGameDataStr = FormatGameDataStr(STATECANCELED, paCoin, paPubKey58, payType, payAmt, winAmt, "", "", "")
215261 let refundAmt = (payAmt - ((payAmt * FEEWAVESBET) / 100))
216262 let refundWallet = addressFromPublicKey(fromBase58String(paPubKey58))
217263 let refundToken = tokenType(payType)
218264 ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet([ScriptTransfer(refundWallet, refundAmt, refundToken)]))
219265 }
220266 }
221267
222268

github/deemru/w8io/c3f4982 
45.60 ms