tx · 3EeGYFg14w8rP7G6zzZLd2RBSQJbvUNttjf5eLumEagr

3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX:  -0.05000000 Waves

2019.10.29 16:28 [741501] smart account 3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX > SELF 0.00000000 Waves

{ "type": 13, "id": "3EeGYFg14w8rP7G6zzZLd2RBSQJbvUNttjf5eLumEagr", "fee": 5000000, "feeAssetId": null, "timestamp": 1572354876920, "version": 1, "sender": "3N2tusqAtDctK8iSTXS6F9rimmftmSuwLUX", "senderPublicKey": "ACfUG5PwG2GssMuyEwVEhkYAbbbP1geSHR8XoNxLyu6V", "proofs": [ "36vhDpM7PRxd4VBWR3HgTJyBjXMXbmWCzRnteswzcn9DSAZGLBqimPpjQJGgFMViTVHkMEVHAhQGSoGFxn7Rp4Hf" ], "script": "base64:AAIDAAAAAAAAABIIARIDCgEIEgQKAggCEgMKAQgAAAAjAAAAAAlSU0FQVUJMSUMJAAJbAAAAAQIAAAGPYmFzZTY0Ok1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBZzRkQVI2WGJCREFTOWhyL0VqM2RKdjZGZmM0NjZ4L21PR01XVTNsckFCczNxYThCSG11Skdua2ZicEVmMnZBd1lUT1dQdnZ6Zk0xME9CYmZsb1N5cTNjOU1LdnlUZTFsdUJMR3FXNHZaVVhJeXZTZ3oxbGl5VVZlZklReTNkeUY5amJlVFpiQzBiYmNULzdPM0RFTCswMXo2QStyRENhY1NaMGxHb2xTUTZBbmhMeHpJa1ZwT1FKYnJCbUMreCtadVpQQ01Xekp5bmQ1YWVPbjdqYWovbWtSVnl4ZTZnLzBPaFd6NE5paVpYZXVNUkIrOG1LeTBmV0QvVWxJbFpXSHNBUzJabXJrWEtxakxxMC8wd3I4SUxKa3pualNxZG5JNUliamczdVFyai80QU4raTlyMjhhUTczL1prUHRZNVNidzBBT2lBQkJ1N2dIbXE5YXlWeFpRSURBUUFCAAAAAA9HQU1FU0NPVU5URVJLRVkCAAAACSRHQU1FX05VTQAAAAAEV0JFVAEAAAAgD5uLrFpvaCc5H1Jt+IyA7GJAqs11k4f4jn5gjTii4MkAAAAAC0ZFRVdBVkVTQkVUAAAAAAAAAAAEAAAAAAlGRUVNQ0FGRUUAAAAAAAAAAAIAAAAAB1dBVkVMRVQAAAAAAAX14QAAAAAADlNUQVRFU1VCTUlUVEVEAgAAAAlTVUJNSVRURUQAAAAADVNUQVRFQUNDRVBURUQCAAAACEFDQ0VQVEVEAAAAAA1TVEFURUZJTklTSEVEAgAAAAhGSU5JU0hFRAAAAAANU1RBVEVDQU5DRUxFRAIAAAAIQ0FOQ0VMRUQAAAAAB0NPSU5SRUQCAAAAA1JFRAAAAAAIQ09JTkJMVUUCAAAABEJMVUUAAAAAC0JFVE1JTldBVkVTCQAAaQAAAAIJAABoAAAAAgAAAAAAAAAAAQUAAAAHV0FWRUxFVAAAAAAAAAAAAgAAAAAKQkVUTUlOV0JFVAkAAGgAAAACAAAAAAAAAABkBQAAAAdXQVZFTEVUAAAAAAxJZHhHYW1lU3RhdGUA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AAALcGxheWVyQUNvaW4AAAAPcGxheWVyQVB1YktleTU4AAAAB3BheVR5cGUAAAAJcGF5QW1vdW50AAAABndpbkFtdAAAAAtwbGF5ZXJCQ29pbgAAAA9wbGF5ZXJCUHViS2V5NTgAAAAJbHVja3lDb2luBAAAAAxmdWxsU3RhdGVTdHIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkBAAAAE0Zvcm1hdEdhbWVEYXRhUGFyYW0AAAABBQAAAAlnYW1lU3RhdGUCAAAAAV8JAQAAABNGb3JtYXRHYW1lRGF0YVBhcmFtAAAAAQUAAAALcGxheWVyQUNvaW4CAAAAAV8JAQAAABNGb3JtYXRHYW1lRGF0YVBhcmFtAAAAAQUAAAAPcGxheWVyQVB1YktleTU4AgAAAAFfCQEAAAATRm9ybWF0R2FtZURhdGFQYXJhbQAAAAEFAAAAB3BheVR5cGUCAAAAAV8JAQAAABNGb3JtYXRHYW1lRGF0YVBhcmFtAAAAAQkAAaQAAAABBQAAAAlwYXlBbW91bnQCAAAAAV8JAQAAABNGb3JtYXRHYW1lRGF0YVBhcmFtAAAAAQkAAaQAAAABBQAAAAZ3aW5BbXQDAwMJAAAAAAAAAgUAAAALcGxheWVyQkNvaW4CAAAAAAYJAAAAAAAAAgUAAAAPcGxheWVyQlB1YktleTU4AgAAAAAGCQAAAAAAAAIFAAAACWx1Y2t5Q29pbgIAAAAABQAAAAxmdWxsU3RhdGVTdHIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAADGZ1bGxTdGF0ZVN0cgIAAAABXwkBAAAAE0Zvcm1hdEdhbWVEYXRhUGFyYW0AAAABBQAAAAtwbGF5ZXJCQ29pbgIAAAABXwkBAAAAE0Zvcm1hdEdhbWVEYXRhUGFyYW0AAAABBQAAAA9wbGF5ZXJCUHViS2V5NTgCAAAAAV8JAQAAABNGb3JtYXRHYW1lRGF0YVBhcmFtAAAAAQUAAAAJbHVja3lDb2luAQAAABlSZW1vdmVVbmRlcnNjb3JlSWZQcmVzZW50AAAAAQAAAAlyZW1haW5pbmcDCQAA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AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAANUNvaW5mbGlwIGNvbnRyYWN0IGNhbm5vdCBjcmVhdGUgYSBnYW1lLiBHYW1lIGFib3J0ZWQuBAAAAApuZXdHYW1lTnVtCQEAAAAQSW5jcmVtZW50R2FtZU51bQAAAAAEAAAAD3BsYXllckFQdWJLZXk1OAkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAB3BheVR5cGUJAQAAAAtwYXltZW50VHlwZQAAAAEFAAAAB3BheW1lbnQEAAAABndpbkFtdAkBAAAAGlZhbGlkYXRlQmV0QW5kRGVmaW5lV2luQW10AAAAAwgFAAAAB3BheW1lbnQAAAAGYW1vdW50BQAAAAZwYUNvaW4FAAAAB3BheVR5cGUEAAAAC2dhbWVEYXRhU3RyCQEAAAARRm9ybWF0R2FtZURhdGFTdHIAAAAJBQAAAA5TVEFURVNVQk1JVFRFRAUAAAAGcGFDb2luBQAAAA9wbGF5ZXJBUHViS2V5NTgFAAAAB3BheVR5cGUIBQAAAAdwYXltZW50AAAABmFtb3VudAUAAAAGd2luQW10AgAAAAACAAAAAAIAAAAACQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAPR0FNRVNDT1VOVEVSS0VZBQAAAApuZXdHYW1lTnVtCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAZnYW1lSWQFAAAAC2dhbWVEYXRhU3RyBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEFAAAAA25pbAAAAAFpAQAAABNhY2NlcHRDb2luQ2hhbGxlbmdlAAAAAgAAAAZnYW1lSWQAAAAGcnNhU2lnBAAAAAxnYW1lRGF0YUxpc3QJAQAAABNFeHRyYWN0R2FtZURhdGFMaXN0AAAAAQUAAAAGZ2FtZUlkBAAAAAlnYW1lU3RhdGUJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAAxJZHhHYW1lU3RhdGUEAAAABnBhQ29pbgkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAADklkeFBsYXllckFDb2luBAAAAApwYVB1YktleTU4CQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAASSWR4UGxheWVyQVB1YktleTU4BAAAAAdwYXlUeXBlCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAKSWR4UGF5VHlwZQQAAAAGcGF5QW10CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAAlJZHhQYXlBbXQEAAAABndpbkFtdAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAJSWR4V2luQW10BAAAAAdwYXltZW50CQEAAAAHZXh0cmFjdAAAAAEIBQAAAAFpAAAAB3BheW1lbnQEAAAACmZlZUFzc2V0SWQJAQAAAAlpc0RlZmluZWQAAAABCAUAAAABaQAAAApmZWVBc3NldElkBAAAAApwYlB1YktleTU4CQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQQAAAAIcGF5VHlwZUIJAQAAAAtwYXltZW50VHlwZQAAAAEFAAAAB3BheW1lbnQDAwkBAAAAAiE9AAAAAggFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAkAA+wAAAABAQAAAAQTq9kzCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkBQAAAARXQkVUBwkAAAIAAAABAgAAADFQYXltZW50IHNob3VsZCBiZSBpbiBXYmV0IG9yIFdhdmVzLiBHYW1lIGFib3J0ZWQuAwUAAAAKZmVlQXNzZXRJZAkAAAIAAAABAgAAADFUcmFuc2FjdGlvbidzIGZlZSBtdXN0IGJlIGluIFdhdmVzLiBHYW1lIGFib3J0ZWQuAwkAAAAAAAACBQAAAApwYVB1YktleTU4BQAAAApwYlB1YktleTU4CQAAAgAAAAECAAAAP1lvdSBjYW4ndCBhY2NlcHQgYSBjaGFsbGVuZ2UgY3JlYXRlZCBieSB5b3Vyc2VsZi4gR2FtZSBhYm9ydGVkLgMJAQAAAAIhPQAAAAIFAAAAB3BheVR5cGUFAAAACHBheVR5cGVCCQAAAgAAAAECAAAAY1BheW1lbnQgbXVzdCBiZSBtYWRlIGluIHRoZSBzYW1lIGN1cnJlbmN5IHRva2VuIGFzIHRoZSBiZXQsIFdCRVQvV0JFVCBvciBXQVZFUy9XQVZFUy4gR2FtZSBhYm9ydGVkLgMJAQAAAAIhPQAAAAIFAAAABnBheUFtdAgFAAAAB3BheW1lbnQAAAAGYW1vdW50CQAAAgAAAAECAAAAQFBheW91dCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBjaGFsbGVuZ2VyIGJldCBhbW91bnQuIEdhbWUgYWJvcnRlZC4DCQEAAAACIT0AAAACBQAAAAlnYW1lU3RhdGUFAAAADlNUQVRFU1VCTUlUVEVECQAAAgAAAAECAAAAM0ludmFsaWQgZ2FtZSBzdGF0ZSBmb3IgcGFzc2VkIGdhbWVJZC4gR2FtZSBhYm9ydGVkLgMJAAAAAAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAANUNvaW5mbGlwIGNvbnRyYWN0IGNhbm5vdCBhY2NlcHQgYSBnYW1lLiBHYW1lIGFib3J0ZWQuBAAAAARyYW5kCQEAAAAOZ2VuZXJhdGVOdW1iZXIAAAADBQAAAAFpAAAAAAAAAABkAAAAAAAAAAAABAAAAAlsdWNreUNvaW4DCQAAZgAAAAIFAAAABHJhbmQAAAAAAAAAADIFAAAAB0NPSU5SRUQFAAAACENPSU5CTFVFBAAAAAZwYkNvaW4DCQAAAAAAAAIFAAAABnBhQ29pbgUAAAAHQ09JTlJFRAUAAAAIQ09JTkJMVUUFAAAAB0NPSU5SRUQEAAAADHRva2VuQXNzZXRJZAkBAAAACXRva2VuVHlwZQAAAAEFAAAAB3BheVR5cGUEAAAADm5ld0dhbWVEYXRhU3RyCQEAAAARRm9ybWF0R2FtZURhdGFTdHIAAAAJBQAAAA1TVEFURUFDQ0VQVEVEBQAAAAZwYUNvaW4FAAAACnBhUHViS2V5NTgFAAAAB3BheVR5cGUFAAAABnBheUFtdAUAAAAGd2luQW10BQAAAAZwYkNvaW4FAAAACnBiUHViS2V5NTgFAAAACWx1Y2t5Q29pbgkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAABmdhbWVJZAUAAAAObmV3R2FtZURhdGFTdHIFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQUAAAADbmlsAAAAAWkBAAAAE2NhbmNlbENvaW5DaGFsbGVuZ2UAAAABAAAABmdhbWVJZAQAAAAMZ2FtZURhdGFMaXN0CQEAAAATRXh0cmFjdEdhbWVEYXRhTGlzdAAAAAEFAAAABmdhbWVJZAQAAAAJZ2FtZVN0YXRlCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAMSWR4R2FtZVN0YXRlBAAAAAZwYUNvaW4JAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAA5JZHhQbGF5ZXJBQ29pbgQAAAAKcGFQdWJLZXk1OAkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAAEklkeFBsYXllckFQdWJLZXk1OAQAAAAHcGF5VHlwZQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAACklkeFBheVR5cGUEAAAABnBheUFtdAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAJSWR4UGF5QW10BAAAAAZ3aW5BbXQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAACUlkeFdpbkFtdAQAAAAIcHViS2V5NTgJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAApmZWVBc3NldElkCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAAWkAAAAKZmVlQXNzZXRJZAMFAAAACmZlZUFzc2V0SWQJAAACAAAAAQIAAAAxVHJhbnNhY3Rpb24ncyBmZWUgbXVzdCBiZSBpbiBXYXZlcy4gR2FtZSBhYm9ydGVkLgMJAQAAAAIhPQAAAAIFAAAACWdhbWVTdGF0ZQUAAAAOU1RBVEVTVUJNSVRURUQJAAACAAAAAQIAAAAzSW52YWxpZCBnYW1lIHN0YXRlIGZvciBwYXNzZWQgZ2FtZUlkLiBHYW1lIGFib3J0ZWQuAwkBAAAAAiE9AAAAAgUAAAAKcGFQdWJLZXk1OAUAAAAIcHViS2V5NTgJAAACAAAAAQIAAABBWW91IGNhbm5vdCBjYW5jZWwgYSBnYW1lIGNyZWF0ZWQgYnkgYW5vdGhlciBwbGF5ZXIuIEdhbWUgYWJvcnRlZC4DCQAAAAAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAADVDb2luZmxpcCBjb250cmFjdCBjYW5ub3QgY2FuY2VsIGEgZ2FtZS4gR2FtZSBhYm9ydGVkLgQAAAAObmV3R2FtZURhdGFTdHIJAQAAABFGb3JtYXRHYW1lRGF0YVN0cgAAAAkFAAAADVNUQVRFQ0FOQ0VMRUQFAAAABnBhQ29pbgUAAAAKcGFQdWJLZXk1OAUAAAAHcGF5VHlwZQUAAAAGcGF5QW10BQAAAAZ3aW5BbXQCAAAAAAIAAAAAAgAAAAAEAAAACXJlZnVuZEFtdAkAAGUAAAACBQAAAAZwYXlBbXQJAABpAAAAAgkAAGgAAAACBQAAAAZwYXlBbXQFAAAAC0ZFRVdBVkVTQkVUAAAAAAAAAABkBAAAAAxyZWZ1bmRXYWxsZXQJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEJAAJZAAAAAQUAAAAKcGFQdWJLZXk1OAQAAAALcmVmdW5kVG9rZW4JAQAAAAl0b2tlblR5cGUAAAABBQAAAAdwYXlUeXBlCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAGZ2FtZUlkBQAAAA5uZXdHYW1lRGF0YVN0cgUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAADHJlZnVuZFdhbGxldAUAAAAJcmVmdW5kQW10BQAAAAtyZWZ1bmRUb2tlbgUAAAADbmlsAAAAAMlHgiM=", "chainId": 84, "height": 741501, "spentComplexity": 0 } View: original | compacted Prev: 66MeUeLqE6LnuMZUWuvBYcZQLiZbsMHPtkezsUwaAH5c Next: EbZsck9ofC6chtUBMqNUduEHB5L7feHPrWnYfaUwfVpN Diff:
OldNewDifferences
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)
72+ }
73+
74+
75+func GenerateRandInt (gameId,rsaSign) = {
76+ let rsaSigValid = rsaVerify(SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
77+ if (rsaSigValid)
78+ then {
79+ let rand = (toInt(sha256(rsaSign)) % 100)
80+ if ((0 > rand))
81+ then ((-1 * rand) + 1)
82+ else (rand + 1)
83+ }
84+ else throw("Invalid RSA signature")
7285 }
7386
7487
227240 let pbCoin = if ((paCoin == COINRED))
228241 then COINBLUE
229242 else COINRED
243+ let tokenAssetId = tokenType(payType)
230244 let newGameDataStr = FormatGameDataStr(STATEACCEPTED, paCoin, paPubKey58, payType, payAmt, winAmt, pbCoin, pbPubKey58, luckyCoin)
231245 ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet(nil))
232246 }
256270 else {
257271 let newGameDataStr = FormatGameDataStr(STATECANCELED, paCoin, paPubKey58, payType, payAmt, winAmt, "", "", "")
258272 let refundAmt = (payAmt - ((payAmt * FEEWAVESBET) / 100))
259- let refundWallet = addressFromPublicKey(toBytes(paPubKey58))
273+ let refundWallet = addressFromPublicKey(fromBase58String(paPubKey58))
260274 let refundToken = tokenType(payType)
261275 ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet([ScriptTransfer(refundWallet, refundAmt, refundToken)]))
262276 }
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)
72+ }
73+
74+
75+func GenerateRandInt (gameId,rsaSign) = {
76+ let rsaSigValid = rsaVerify(SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
77+ if (rsaSigValid)
78+ then {
79+ let rand = (toInt(sha256(rsaSign)) % 100)
80+ if ((0 > rand))
81+ then ((-1 * rand) + 1)
82+ else (rand + 1)
83+ }
84+ else throw("Invalid RSA signature")
7285 }
7386
7487
7588 func paymentType (payment) = if ((payment.assetId == WBET))
7689 then "WBET"
7790 else "WAVES"
7891
7992
8093 func tokenType (token) = if ((token == "WBET"))
8194 then WBET
8295 else unit
8396
8497
8598 func FormatGameDataParam (p) = {
8699 let s = size(p)
87100 if ((s == 0))
88101 then throw("Parameter size must be greater then 0")
89102 else if ((s > 99))
90103 then throw("Parameter size must be less then 100")
91104 else if ((10 > s))
92105 then (("0" + toString(s)) + p)
93106 else (toString(s) + p)
94107 }
95108
96109
97110 func FormatGameDataStr (gameState,playerACoin,playerAPubKey58,payType,payAmount,winAmt,playerBCoin,playerBPubKey58,luckyCoin) = {
98111 let fullStateStr = ((((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(playerACoin)) + "_") + FormatGameDataParam(playerAPubKey58)) + "_") + FormatGameDataParam(payType)) + "_") + FormatGameDataParam(toString(payAmount))) + "_") + FormatGameDataParam(toString(winAmt)))
99112 if (if (if ((playerBCoin == ""))
100113 then true
101114 else (playerBPubKey58 == ""))
102115 then true
103116 else (luckyCoin == ""))
104117 then fullStateStr
105118 else ((((((fullStateStr + "_") + FormatGameDataParam(playerBCoin)) + "_") + FormatGameDataParam(playerBPubKey58)) + "_") + FormatGameDataParam(luckyCoin))
106119 }
107120
108121
109122 func RemoveUnderscoreIfPresent (remaining) = if ((size(remaining) > 0))
110123 then drop(remaining, 1)
111124 else remaining
112125
113126
114127 func ParseNextAttribute (remaining) = {
115128 let s = size(remaining)
116129 if ((s > 0))
117130 then {
118131 let nn = parseIntValue(take(remaining, 2))
119132 let v = take(drop(remaining, 2), nn)
120133 let tmpRemaining = drop(remaining, (nn + 2))
121134 let remainingState = RemoveUnderscoreIfPresent(tmpRemaining)
122135 [v, remainingState]
123136 }
124137 else throw("Empty string was passed into parseNextAttribute func")
125138 }
126139
127140
128141 func ParseGameRawDataStr (rawStateStr) = {
129142 let gameState = ParseNextAttribute(rawStateStr)
130143 let paCoin = ParseNextAttribute(gameState[1])
131144 let paPubKey58 = ParseNextAttribute(paCoin[1])
132145 let payType = ParseNextAttribute(paPubKey58[1])
133146 let payAmt = ParseNextAttribute(payType[1])
134147 let winAmt = ParseNextAttribute(payAmt[1])
135148 [gameState[0], paCoin[0], paPubKey58[0], payType[0], payAmt[0], winAmt[0]]
136149 }
137150
138151
139152 func ExtractGameDataList (gameId) = {
140153 let rawDataStr = match getString(this, gameId) {
141154 case str: String =>
142155 str
143156 case _ =>
144157 throw(("Couldn't find game by " + gameId))
145158 }
146159 ParseGameRawDataStr(rawDataStr)
147160 }
148161
149162
150163 func ValidateBetAndDefineWinAmt (amount,playerCoin,paymentType) = if (if ((playerCoin != COINRED))
151164 then (playerCoin != COINBLUE)
152165 else false)
153166 then throw("Invalid play, change your bet to RED or BLUE coin. Game aborted.")
154167 else if (if ((paymentType == "WBET"))
155168 then (BETMINWBET > amount)
156169 else false)
157170 then throw(("The minimum bet on Wbet is " + toString((BETMINWBET / WAVELET))))
158171 else if (if ((paymentType == "WAVES"))
159172 then (BETMINWAVES > amount)
160173 else false)
161174 then throw(("The minimum bet on Waves is " + toString((BETMINWAVES / WAVELET))))
162175 else (((amount * 2) * (100 - (FEEWAVESBET + FEEMCAFEE))) / 100)
163176
164177
165178 @Callable(i)
166179 func playCoin (paCoin) = {
167180 let gameId = toBase58String(i.transactionId)
168181 let gameIdUsed = isDefined(getString(this, gameId))
169182 let payment = extract(i.payment)
170183 let feeAssetId = isDefined(i.feeAssetId)
171184 if (if ((payment.assetId != assetInfo(base58'WAVES')))
172185 then (payment.assetId != WBET)
173186 else false)
174187 then throw("Payment should be in Wbet or Waves. Game aborted.")
175188 else if (feeAssetId)
176189 then throw("Transaction's fee must be in Waves. Game aborted.")
177190 else if (gameIdUsed)
178191 then throw("Passed gameId had been used before. Game aborted.")
179192 else if ((i.caller == this))
180193 then throw("Coinflip contract cannot create a game. Game aborted.")
181194 else {
182195 let newGameNum = IncrementGameNum()
183196 let playerAPubKey58 = toBase58String(i.callerPublicKey)
184197 let payType = paymentType(payment)
185198 let winAmt = ValidateBetAndDefineWinAmt(payment.amount, paCoin, payType)
186199 let gameDataStr = FormatGameDataStr(STATESUBMITTED, paCoin, playerAPubKey58, payType, payment.amount, winAmt, "", "", "")
187200 ScriptResult(WriteSet([DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet(nil))
188201 }
189202 }
190203
191204
192205
193206 @Callable(i)
194207 func acceptCoinChallenge (gameId,rsaSig) = {
195208 let gameDataList = ExtractGameDataList(gameId)
196209 let gameState = gameDataList[IdxGameState]
197210 let paCoin = gameDataList[IdxPlayerACoin]
198211 let paPubKey58 = gameDataList[IdxPlayerAPubKey58]
199212 let payType = gameDataList[IdxPayType]
200213 let payAmt = parseIntValue(gameDataList[IdxPayAmt])
201214 let winAmt = parseIntValue(gameDataList[IdxWinAmt])
202215 let payment = extract(i.payment)
203216 let feeAssetId = isDefined(i.feeAssetId)
204217 let pbPubKey58 = toBase58String(i.callerPublicKey)
205218 let payTypeB = paymentType(payment)
206219 if (if ((payment.assetId != assetInfo(base58'WAVES')))
207220 then (payment.assetId != WBET)
208221 else false)
209222 then throw("Payment should be in Wbet or Waves. Game aborted.")
210223 else if (feeAssetId)
211224 then throw("Transaction's fee must be in Waves. Game aborted.")
212225 else if ((paPubKey58 == pbPubKey58))
213226 then throw("You can't accept a challenge created by yourself. Game aborted.")
214227 else if ((payType != payTypeB))
215228 then throw("Payment must be made in the same currency token as the bet, WBET/WBET or WAVES/WAVES. Game aborted.")
216229 else if ((payAmt != payment.amount))
217230 then throw("Payout must be equal to the challenger bet amount. Game aborted.")
218231 else if ((gameState != STATESUBMITTED))
219232 then throw("Invalid game state for passed gameId. Game aborted.")
220233 else if ((i.caller == this))
221234 then throw("Coinflip contract cannot accept a game. Game aborted.")
222235 else {
223236 let rand = generateNumber(i, 100, 0)
224237 let luckyCoin = if ((rand > 50))
225238 then COINRED
226239 else COINBLUE
227240 let pbCoin = if ((paCoin == COINRED))
228241 then COINBLUE
229242 else COINRED
243+ let tokenAssetId = tokenType(payType)
230244 let newGameDataStr = FormatGameDataStr(STATEACCEPTED, paCoin, paPubKey58, payType, payAmt, winAmt, pbCoin, pbPubKey58, luckyCoin)
231245 ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet(nil))
232246 }
233247 }
234248
235249
236250
237251 @Callable(i)
238252 func cancelCoinChallenge (gameId) = {
239253 let gameDataList = ExtractGameDataList(gameId)
240254 let gameState = gameDataList[IdxGameState]
241255 let paCoin = gameDataList[IdxPlayerACoin]
242256 let paPubKey58 = gameDataList[IdxPlayerAPubKey58]
243257 let payType = gameDataList[IdxPayType]
244258 let payAmt = parseIntValue(gameDataList[IdxPayAmt])
245259 let winAmt = parseIntValue(gameDataList[IdxWinAmt])
246260 let pubKey58 = toBase58String(i.callerPublicKey)
247261 let feeAssetId = isDefined(i.feeAssetId)
248262 if (feeAssetId)
249263 then throw("Transaction's fee must be in Waves. Game aborted.")
250264 else if ((gameState != STATESUBMITTED))
251265 then throw("Invalid game state for passed gameId. Game aborted.")
252266 else if ((paPubKey58 != pubKey58))
253267 then throw("You cannot cancel a game created by another player. Game aborted.")
254268 else if ((i.caller == this))
255269 then throw("Coinflip contract cannot cancel a game. Game aborted.")
256270 else {
257271 let newGameDataStr = FormatGameDataStr(STATECANCELED, paCoin, paPubKey58, payType, payAmt, winAmt, "", "", "")
258272 let refundAmt = (payAmt - ((payAmt * FEEWAVESBET) / 100))
259- let refundWallet = addressFromPublicKey(toBytes(paPubKey58))
273+ let refundWallet = addressFromPublicKey(fromBase58String(paPubKey58))
260274 let refundToken = tokenType(payType)
261275 ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet([ScriptTransfer(refundWallet, refundAmt, refundToken)]))
262276 }
263277 }
264278
265279

github/deemru/w8io/873ac7e 
32.05 ms