tx · FNSvmMf4PoovR3PwjYCMhcFfy7vmL3u4Gg4NZwr5iAev

3MqQ9ihYKGehfUnXYf5WmkYSZUD71ByeCQe:  -0.01500000 Waves

2019.06.21 14:56 [551708] smart account 3MqQ9ihYKGehfUnXYf5WmkYSZUD71ByeCQe > SELF 0.00000000 Waves

{ "type": 13, "id": "FNSvmMf4PoovR3PwjYCMhcFfy7vmL3u4Gg4NZwr5iAev", "fee": 1500000, "feeAssetId": null, "timestamp": 1561118238918, "version": 1, "sender": "3MqQ9ihYKGehfUnXYf5WmkYSZUD71ByeCQe", "senderPublicKey": "HcUXEkA9JTGp78LcTKsu4FmEpbDmnqntL4aMNLx1BHMB", "proofs": [ "42LiAEPrieaT9CUBsTzDVEDqgErgyhDPotL686WV7fXwzfJ7NiEKg1VUadu2phn4dvgzfeM14vhMHJBcDdpKbiqN" ], "script": "base64:AAIDAAAAAAAAAAAAAAAqAAAAAAlSU0FQVUJMSUMJAAJbAAAAAQIAAAGPYmFzZTY0Ok1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcWxBaUFOU21CcERIWUtQOXNLZ2VOL2wxYkFiMjhnL3RHbGdEa3dUNUZpTU40WDNwd2R2ZHhFN212U1I4LzQxZFU5cng0akcrNnRacGIxVUxWRFBzNDMxdFIySVJhVFh3NUNqK0FjMnZoTCs1SmFtQ2VyR0QxVVcrYmgvRUdRdHhvOFczWUxEcm9mWEI1UUhKeDRQa3oyS2dmK29TL0M4aEh1Qi9VNGtyTzc2VTA1MDdHVGpaUFA5a1JRMHVMU01lcVFYdDh3WFMrbk1wNXdhanF4UHBETE1hU1JFZ3NLd3YvQUVrUDRkenBUWWJpa0xCWWw0cXRkSnNEODRITEZTa2l3ZDNCaGNPclBqb0lZbUx4UXVCRDVUSU1LVEtEM3NkWmdhWTlyc3lxeDNBMDBpbm55eEQ2enAzYjRnRnBVT1g4SnhLWmRFQzJteUVxbGVOZ2c3R3p3SURBUUFCAAAAAAZTRVJWRVIJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQIAAAAjM040QWliNWl1YldpR016ZFRoNndXaVZEVmJvMzJvZVZVbUgAAAAAE1JBTkRPUkFDTEVUSU1FRlJBTUUAAAAAAAAAC0AAAAAAB1dBVkVMRVQJAABoAAAAAgkAAGgAAAACAAAAAAAAAABkAAAAAAAAAAPoAAAAAAAAAAPoAAAAAApDT01NSVNTSU9OCQAAaQAAAAIJAABoAAAAAgAAAAAAAAAABQUAAAAHV0FWRUxFVAAAAAAAAAAD6AAAAAAEQkVUMQkAAGgAAAACAAAAAAAAAAABBQAAAAdXQVZFTEVUAAAAAARCRVQyCQAAaAAAAAIAAAAAAAAAAAIFAAAAB1dBVkVMRVQAAAAABEJFVDQJAABoAAAAAgAAAAAAAAAABAUAAAAHV0FWRUxFVAAAAAAEQkVUOAkAAGgAAAACAAAAAAAAAAAIBQAAAAdXQVZFTEVUAAAAAAVCRVQxNAkAAGgAAAACAAAAAAAAAAAOBQAAAAdXQVZFTEVUAAAAAAhSQVRFTVVMVAAAAAAAAAAnEAAAAAAFUkFURTEAAAAAAAAAmucAAAAABVJBVEUyAAAAAAAAAGAYAAAAAAVSQVRFMwAAAAAAAABKOAAAAAAFUkFURTQAAAAAAAAAN3gAAAAABVJBVEU1AAAAAAAAACyIAAAAAAxJZHhHYW1lU3RhdGUAAAAAAAAAAAAAAAAAD0lkeFBsYXllckNob2ljZQAAAAAAAAAAAQAAAAARSWR4UGxheWVyUHViS2V5NTgAAAAAAAAAAAIAAAAAEElkeFN0YXJ0ZWRIZWlnaHQAAAAAAAAAAAMAAAAACUlkeFdpbkFtdAAAAAAAAAAABAAAAAAOSWR4UmFuZE9yRW1wdHkAAAAAAAAAAAUAAAAADlJFU0VSVkFUSU9OS0VZAgAAABAkUkVTRVJWRURfQU1PVU5UAAAAAA9HQU1FU0NPVU5URVJLRVkCAAAACSRHQU1FX05VTQAAAAAOU1RBVEVTVUJNSVRURUQCAAAACVNVQk1JVFRFRAAAAAAIU1RBVEVXT04CAAAAA1dPTgAAAAAJU1RBVEVMT1NUAgAAAARMT1NUAQAAABBJbmNyZW1lbnRHYW1lTnVtAAAAAAQAAAAHZ2FtZU51bQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzBQAAAA9HQU1FU0NPVU5URVJLRVkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAADbnVtBQAAAAckbWF0Y2gwBQAAAANudW0AAAAAAAAAAAAJAABkAAAAAgUAAAAHZ2FtZU51bQAAAAAAAAAAAQEAAAASRXh0cmFjdFJlc2VydmVkQW10AAAAAAQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzBQAAAA5SRVNFUlZBVElPTktFWQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAAAQAAAB5WYWxpZGF0ZUFuZEluY3JlYXNlUmVzZXJ2ZWRBbXQAAAABAAAABndpbkFtdAQAAAARbmV3UmVzZXJ2ZWRBbW91bnQJAABkAAAAAgkBAAAAEkV4dHJhY3RSZXNlcnZlZEFtdAAAAAAFAAAABndpbkFtdAQAAAAHYmFsYW5jZQkBAAAADHdhdmVzQmFsYW5jZQAAAAEFAAAABHRoaXMDCQAAZgAAAAIFAAAAEW5ld1Jlc2VydmVkQW1vdW50BQAAAAdiYWxhbmNlCQAAAgAAAAECAAAAVEluc3VmZmljaWVudCBmdW5kcyBvbiBEaWNlIFJvbGxlciBhY2NvdW50LiBUcmFuc2FjdGlvbiB3YXMgcmVqZWN0ZWQgZm9yIHlvdXIgc2FmZXR5LgUAAAARbmV3UmVzZXJ2ZWRBbW91bnQBAAAAE0RlY3JlYXNlUmVzZXJ2ZWRBbXQAAAACAAAABmdhbWVJZAAAAAZ3aW5BbXQEAAAAEW5ld1Jlc2VydmVkQW1vdW50CQAAZQAAAAIJAQAAABJFeHRyYWN0UmVzZXJ2ZWRBbXQAAAAABQAAAAZ3aW5BbXQDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEW5ld1Jlc2VydmVkQW1vdW50CQAAAgAAAAECAAAAQkludmFsaWQgRGljZSBSb2xsZXIgYWNjb3VudCBzdGF0ZSAtIHJlc2VydmVkIGFtb3VudCBpcyBsZXNzIHRoYW4gMAkBAAAACURhdGFFbnRyeQAAAAIFAAAADlJFU0VSVkFUSU9OS0VZBQAAABFuZXdSZXNlcnZlZEFtb3VudAEAAAAaVmFsaWRhdGVCZXRBbmREZWZpbmVXaW5BbXQAAAACAAAABmJldEFtdAAAAAxwbGF5ZXJDaG9pY2UEAAAAC2JldEFtdFZhbGlkAwMDAwkAAAAAAAACBQAAAAZiZXRBbXQJAABkAAAAAgUAAAAEQkVUMQUAAAAKQ09NTUlTU0lPTgYJAAAAAAAAAgUAAAAGYmV0QW10CQAAZAAAAAIFAAAABEJFVDIFAAAACkNPTU1JU1NJT04GCQAAAAAAAAIFAAAABmJldEFtdAkAAGQAAAACBQAAAARCRVQ0BQAAAApDT01NSVNTSU9OBgkAAAAAAAACBQAAAAZiZXRBbXQJAABkAAAAAgUAAAAEQkVUOAUAAAAKQ09NTUlTU0lPTgYJAAAAAAAAAgUAAAAGYmV0QW10CQAAZAAAAAIFAAAABUJFVDE0BQAAAApDT01NSVNTSU9OAwUAAAALYmV0QW10VmFsaWQEAAAACmRpY2VzQ291bnQJAAExAAAAAQUAAAAMcGxheWVyQ2hvaWNlBAAAAANiZXQJAABlAAAAAgUAAAAGYmV0QW10BQAAAApDT01NSVNTSU9OAwkAAAAAAAACBQAAAApkaWNl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AAZnYW1lSWQFAAAAFm5ld0dhbWVEYXRhU3RyQWRqdXN0ZWQJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIFAAAACGdhbWVEYXRhBQAAAA53U2V0Q29tbW9uRGF0YQkBAAAAC1RyYW5zZmVyU2V0AAAAAQUAAAAOdFNldENvbW1vbkRhdGEEAAAACGdhbWVEYXRhCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAGZ2FtZUlkBQAAAA5uZXdHYW1lRGF0YVN0cgkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgUAAAAIZ2FtZURhdGEFAAAADndTZXRDb21tb25EYXRhCQEAAAALVHJhbnNmZXJTZXQAAAABBQAAAA50U2V0Q29tbW9uRGF0YQAAAAIAAAABaQEAAAADYmV0AAAAAQAAAAxwbGF5ZXJDaG9pY2UEAAAACm5ld0dhbWVOdW0JAQAAABBJbmNyZW1lbnRHYW1lTnVtAAAAAAQAAAAGZ2FtZUlkCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQEAAAAA3BtdAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50BAAAAA1iZXROb3RJbldhdmVzCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkBAAAAA1mZWVOb3RJbldhdmVzCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkBAAAAAZ3aW5BbXQJAQAAABpWYWxpZGF0ZUJldEFuZERlZmluZVdpbkFtdAAAAAIIBQAAAANwbXQAAAAGYW1vdW50BQAAAAxwbGF5ZXJDaG9pY2UEAAAACHR4SWRVc2VkCQEAAAAJaXNEZWZpbmVkAAAAAQkABB0AAAACBQAAAAR0aGlzBQAAAAZnYW1lSWQDBQAAAA1iZXROb3RJbldhdmVzCQAAAgAAAAECAAAAG0JldCBhbW91bnQgbXVzdCBiZSBpbiBXYXZlcwMFAAAADWZlZU5vdEluV2F2ZXMJAAACAAAAAQIAAAAiVHJhbnNhY3Rpb24ncyBmZWUgbXVzdCBiZSBpbiBXYXZlcwMFAAAACHR4SWRVc2VkCQAAAgAAAAECAAAAL1Bhc3NlZCB0eElkIGhhZCBiZWVuIHVzZWQgYmVmb3JlLiBHYW1lIGFib3J0ZWQuBAAAAA5wbGF5ZXJQdWJLZXk1OAkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAC2dhbWVEYXRhU3RyCQEAAAARRm9ybWF0R2FtZURhdGFTdHIAAAAGBQAAAA5TVEFURVNVQk1JVFRFRAUAAAAMcGxheWVyQ2hvaWNlBQAAAA5wbGF5ZXJQdWJLZXk1OAUAAAAGaGVpZ2h0BQAAAAZ3aW5BbXQCAAAAAAkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADlJFU0VSVkFUSU9OS0VZCQEAAAAeVmFsaWRhdGVBbmRJbmNyZWFzZVJlc2VydmVkQW10AAAAAQUAAAAGd2luQW10CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA9HQU1FU0NPVU5URVJLRVkFAAAACm5ld0dhbWVOdW0JAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAABmdhbWVJZAUAAAALZ2FtZURhdGFTdHIFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAZTRVJWRVIFAAAACkNPTU1JU1NJT04FAAAABHVuaXQFAAAAA25pbAAAAAFpAQAAAAh3aXRoZHJhdwAAAAIAAAAGZ2FtZUlkAAAAB3JzYVNpZ24EAAAADGdhbWVEYXRhTGlzdAkBAAAAE0V4dHJhY3RHYW1lRGF0YUxpc3QAAAABBQAAAAZnYW1lSWQEAAAACWdhbWVTdGF0ZQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAADElkeEdhbWVTdGF0ZQQAAAAMcGxheWVyQ2hvaWNlCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAPSWR4UGxheWVyQ2hvaWNlBAAAAA1zdGFydGVkSGVpZ2h0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAABBJZHhTdGFydGVkSGVpZ2h0BAAAAAZ3aW5BbXQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAACUlkeFdpbkFtdAQAAAAOcGxheWVyUHViS2V5NTgJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAABFJZHhQbGF5ZXJQdWJLZXk1OAQAAAANcGxheWVyQWRkcmVzcwkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAAA5wbGF5ZXJQdWJLZXk1OAQAAAAMd2luQnlUaW1lb3V0CQAAZgAAAAIJAABlAAAAAgUAAAAGaGVpZ2h0BQAAAA1zdGFydGVkSGVpZ2h0BQAAABNSQU5ET1JBQ0xFVElNRUZSQU1FBAAAABFkZWNyZWFzZWRSZXNlcnZlcwkBAAAAE0RlY3JlYXNlUmVzZXJ2ZWRBbXQAAAACBQAAAAZnYW1lSWQFAAAABndpbkFtdAMJAQAAAAIhPQAAAAIFAAAACWdhbWVTdGF0ZQUAAAAOU1RBVEVTVUJNSVRURUQJAAACAAAAAQIAAAAkSW52YWxpZCBnYW1lIHN0YXRlIGZvciBwYXNzZWQgZ2FtZUlkAwUAAAAMd2luQnlUaW1lb3V0BAAAAAdyYW5kU3RyCQABLwAAAAIFAAAADHBsYXllckNob2ljZQAAAAAAAAAAAQQAAAAObmV3R2FtZURhdGFTdHIJAQAAABFGb3JtYXRHYW1lRGF0YVN0cgAAAAYFAAAACFNUQVRFV09OBQAAAAxwbGF5ZXJDaG9pY2UFAAAADnBsYXllclB1YktleTU4BQAAAA1zdGFydGVkSGVpZ2h0BQAAAAZ3aW5BbXQFAAAAB3JhbmRTdHIJAQAAAAxXaW5TY3JpcHRTZXQAAAAGBQAAAAZnYW1lSWQFAAAADXBsYXllckFkZHJlc3MFAAAABndpbkFtdAUAAAAObmV3R2FtZURhdGFTdHIFAAAADHdpbkJ5VGltZW91dAUAAAARZGVjcmVhc2VkUmVzZXJ2ZXMEAAAAB3JhbmRTdHIJAQAAAAlSYW5kVG9TdHIAAAABCQEAAAAPR2VuZXJhdGVSYW5kSW50AAAAAgUAAAAGZ2FtZUlkBQAAAAdyc2FTaWduAwkBAAAAC0lzUGxheWVyV2luAAAAAgUAAAAMcGxheWVyQ2hvaWNlBQAAAAdyYW5kU3RyBAAAAA5uZXdHYW1lRGF0YVN0cgkBAAAAEUZvcm1hdEdhbWVEYXRhU3RyAAAABgUAAAAIU1RBVEVXT04FAAAADHBsYXllckNob2ljZQUAAAAOcGxheWVyUHViS2V5NTgFAAAADXN0YXJ0ZWRIZWlnaHQFAAAABndpbkFtdAUAAAAHcmFuZFN0cgkBAAAADFdpblNjcmlwdFNldAAAAAYFAAAABmdhbWVJZAUAAAANcGxheWVyQWRkcmVzcwUAAAAGd2luQW10BQAAAA5uZXdHYW1lRGF0YVN0cgUAAAAMd2luQnlUaW1lb3V0BQAAABFkZWNyZWFzZWRSZXNlcnZlcwQAAAAObmV3R2FtZURhdGFTdHIJAQAAABFGb3JtYXRHYW1lRGF0YVN0cgAAAAYFAAAACVNUQVRFTE9TVAUAAAAMcGxheWVyQ2hvaWNlBQAAAA5wbGF5ZXJQdWJLZXk1OAUAAAANc3RhcnRlZEhlaWdodAUAAAAGd2luQW10BQAAAAdyYW5kU3RyCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAZnYW1lSWQFAAAADm5ld0dhbWVEYXRhU3RyCQAETAAAAAIFAAAAEWRlY3JlYXNlZFJlc2VydmVzBQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkEAAAAByRtYXRjaDAFAAAAAnR4AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABNUcmFuc2ZlclRyYW5zYWN0aW9uBAAAAAN0dHgFAAAAByRtYXRjaDAJAABnAAAAAgkAAGUAAAACCQEAAAAMd2F2ZXNCYWxhbmNlAAAAAQUAAAAEdGhpcwgFAAAAA3R0eAAAAAZhbW91bnQJAQAAABJFeHRyYWN0UmVzZXJ2ZWRBbXQAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABRTZXRTY3JpcHRUcmFuc2FjdGlvbgQAAAADc3R4BQAAAAckbWF0Y2gwBgcHoQR78Q==", "chainId": 84, "height": 551708, "spentComplexity": 0 } View: original | compacted Prev: none Next: 3XDUQbDxQA8sVmbpq5XB3VRHyh1KYLsutxt5ErPiaEGT Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 3 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let RSAPUBLIC = fromBase64String("base64:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqlAiANSmBpDHYKP9sKgeN/l1bAb28g/tGlgDkwT5FiMN4X3pwdvdxE7mvSR8/41dU9rx4jG+6tZpb1ULVDPs431tR2IRaTXw5Cj+Ac2vhL+5JamCerGD1UW+bh/EGQtxo8W3YLDrofXB5QHJx4Pkz2Kgf+oS/C8hHuB/U4krO76U0507GTjZPP9kRQ0uLSMeqQXt8wXS+nMp5wajqxPpDLMaSREgsKwv/AEkP4dzpTYbikLBYl4qtdJsD84HLFSkiwd3BhcOrPjoIYmLxQuBD5TIMKTKD3sdZgaY9rsyqx3A00innyxD6zp3b4gFpUOX8JxKZdEC2myEqleNgg7GzwIDAQAB")
5+
6+let SERVER = addressFromStringValue("3N4Aib5iubWiGMzdTh6wWiVDVbo32oeVUmH")
7+
8+let RANDORACLETIMEFRAME = 2880
9+
10+let WAVELET = ((100 * 1000) * 1000)
11+
12+let COMMISSION = ((5 * WAVELET) / 1000)
13+
14+let BET1 = (1 * WAVELET)
15+
16+let BET2 = (2 * WAVELET)
17+
18+let BET4 = (4 * WAVELET)
19+
20+let BET8 = (8 * WAVELET)
21+
22+let BET14 = (14 * WAVELET)
23+
24+let RATEMULT = 10000
25+
26+let RATE1 = 39655
27+
28+let RATE2 = 24600
29+
30+let RATE3 = 19000
31+
32+let RATE4 = 14200
33+
34+let RATE5 = 11400
35+
36+let IdxGameState = 0
37+
38+let IdxPlayerChoice = 1
39+
40+let IdxPlayerPubKey58 = 2
41+
42+let IdxStartedHeight = 3
43+
44+let IdxWinAmt = 4
45+
46+let IdxRandOrEmpty = 5
47+
48+let RESERVATIONKEY = "$RESERVED_AMOUNT"
49+
50+let GAMESCOUNTERKEY = "$GAME_NUM"
51+
52+let STATESUBMITTED = "SUBMITTED"
53+
54+let STATEWON = "WON"
55+
56+let STATELOST = "LOST"
57+
58+func IncrementGameNum () = {
59+ let gameNum = match getInteger(this, GAMESCOUNTERKEY) {
60+ case num: Int =>
61+ num
62+ case _ =>
63+ 0
64+ }
65+ (gameNum + 1)
66+ }
67+
68+
69+func ExtractReservedAmt () = match getInteger(this, RESERVATIONKEY) {
70+ case a: Int =>
71+ a
72+ case _ =>
73+ 0
74+}
75+
76+
77+func ValidateAndIncreaseReservedAmt (winAmt) = {
78+ let newReservedAmount = (ExtractReservedAmt() + winAmt)
79+ let balance = wavesBalance(this)
80+ if ((newReservedAmount > balance))
81+ then throw("Insufficient funds on Dice Roller account. Transaction was rejected for your safety.")
82+ else newReservedAmount
83+ }
84+
85+
86+func DecreaseReservedAmt (gameId,winAmt) = {
87+ let newReservedAmount = (ExtractReservedAmt() - winAmt)
88+ if ((0 > newReservedAmount))
89+ then throw("Invalid Dice Roller account state - reserved amount is less than 0")
90+ else DataEntry(RESERVATIONKEY, newReservedAmount)
91+ }
92+
93+
94+func ValidateBetAndDefineWinAmt (betAmt,playerChoice) = {
95+ let betAmtValid = if (if (if (if ((betAmt == (BET1 + COMMISSION)))
96+ then true
97+ else (betAmt == (BET2 + COMMISSION)))
98+ then true
99+ else (betAmt == (BET4 + COMMISSION)))
100+ then true
101+ else (betAmt == (BET8 + COMMISSION)))
102+ then true
103+ else (betAmt == (BET14 + COMMISSION))
104+ if (betAmtValid)
105+ then {
106+ let dicesCount = size(playerChoice)
107+ let bet = (betAmt - COMMISSION)
108+ if ((dicesCount == 1))
109+ then ((bet * RATE1) / RATEMULT)
110+ else if ((dicesCount == 2))
111+ then ((bet * RATE2) / RATEMULT)
112+ else if ((dicesCount == 3))
113+ then ((bet * RATE3) / RATEMULT)
114+ else if ((dicesCount == 4))
115+ then ((bet * RATE4) / RATEMULT)
116+ else if ((dicesCount == 5))
117+ then ((bet * RATE5) / RATEMULT)
118+ else throw("Invalid dices count in player's choice")
119+ }
120+ else throw("Bet amount is not in range")
121+ }
122+
123+
124+func RandToStr (r) = if ((r == 0))
125+ then "1"
126+ else if ((r == 1))
127+ then "2"
128+ else if ((r == 2))
129+ then "3"
130+ else if ((r == 3))
131+ then "4"
132+ else if ((r == 4))
133+ then "5"
134+ else if ((r == 5))
135+ then "6"
136+ else throw(("Unsupported r parameter passed: expected=[0,...,5] actual=" + toString(r)))
137+
138+
139+func GenerateRandInt (gameId,rsaSign) = {
140+ let rsaSigValid = rsaVerify(SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
141+ if (rsaSigValid)
142+ then {
143+ let rand = (toInt(sha256(rsaSign)) % 6)
144+ if ((0 > rand))
145+ then (-1 * rand)
146+ else rand
147+ }
148+ else throw("Invalid RSA signature")
149+ }
150+
151+
152+func IsPlayerWin (playerChoice,randStr) = {
153+ let s = size(playerChoice)
154+ if (if (if (if (if (if ((s >= 1))
155+ then (take(drop(playerChoice, 0), 1) == randStr)
156+ else false)
157+ then true
158+ else if ((s >= 2))
159+ then (take(drop(playerChoice, 1), 1) == randStr)
160+ else false)
161+ then true
162+ else if ((s >= 3))
163+ then (take(drop(playerChoice, 2), 1) == randStr)
164+ else false)
165+ then true
166+ else if ((s >= 4))
167+ then (take(drop(playerChoice, 3), 1) == randStr)
168+ else false)
169+ then true
170+ else if ((s >= 5))
171+ then (take(drop(playerChoice, 4), 1) == randStr)
172+ else false)
173+ then true
174+ else if ((s >= 6))
175+ then (take(drop(playerChoice, 5), 1) == randStr)
176+ else false
177+ }
178+
179+
180+func FormatGameDataParam (p) = {
181+ let s = size(p)
182+ if ((s == 0))
183+ then throw("Parameter size must be greater then 0")
184+ else if ((s > 99))
185+ then throw("Parameter size must be less then 100")
186+ else if ((10 > s))
187+ then (("0" + toString(s)) + p)
188+ else (toString(s) + p)
189+ }
190+
191+
192+func FormatGameDataStr (gameState,playerChoice,playerPubKey58,startedHeight,winAmt,randOrEmpty) = {
193+ let fullStateStr = ((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(playerChoice)) + "_") + FormatGameDataParam(playerPubKey58)) + "_") + FormatGameDataParam(toString(startedHeight))) + "_") + FormatGameDataParam(toString(winAmt)))
194+ if ((randOrEmpty == ""))
195+ then fullStateStr
196+ else ((fullStateStr + "_") + FormatGameDataParam(randOrEmpty))
197+ }
198+
199+
200+func RemoveUnderscoreIfPresent (remaining) = if ((size(remaining) > 0))
201+ then drop(remaining, 1)
202+ else remaining
203+
204+
205+func ParseNextAttribute (remaining) = {
206+ let s = size(remaining)
207+ if ((s > 0))
208+ then {
209+ let nn = parseIntValue(take(remaining, 2))
210+ let v = take(drop(remaining, 2), nn)
211+ let tmpRemaining = drop(remaining, (nn + 2))
212+ let remainingState = RemoveUnderscoreIfPresent(tmpRemaining)
213+[v, remainingState]
214+ }
215+ else throw("Empty string was passed into parseNextAttribute func")
216+ }
217+
218+
219+func ParseGameRawDataStr (rawStateStr) = {
220+ let gameState = ParseNextAttribute(rawStateStr)
221+ let playerChoice = ParseNextAttribute(gameState[1])
222+ let playerPubKey58 = ParseNextAttribute(playerChoice[1])
223+ let startedHeight = ParseNextAttribute(playerPubKey58[1])
224+ let winAmt = ParseNextAttribute(startedHeight[1])
225+[gameState[0], playerChoice[0], playerPubKey58[0], startedHeight[0], winAmt[0]]
226+ }
227+
228+
229+func ExtractGameDataList (gameId) = {
230+ let rawDataStr = match getString(this, gameId) {
231+ case str: String =>
232+ str
233+ case _ =>
234+ throw(("Couldn't find game by " + gameId))
235+ }
236+ ParseGameRawDataStr(rawDataStr)
237+ }
238+
239+
240+func WinScriptSet (gameId,playerAddress,winAmt,newGameDataStr,winByTimeout,decreasedReserves) = {
241+ let wSetCommonData = [decreasedReserves]
242+ let tSetCommonData = [ScriptTransfer(playerAddress, winAmt, unit)]
243+ if (winByTimeout)
244+ then {
245+ let newGameDataStrAdjusted = ((newGameDataStr + "_") + FormatGameDataParam("TIMEOUT"))
246+ let gameData = DataEntry(gameId, newGameDataStrAdjusted)
247+ ScriptResult(WriteSet(gameData :: wSetCommonData), TransferSet(tSetCommonData))
248+ }
249+ else {
250+ let gameData = DataEntry(gameId, newGameDataStr)
251+ ScriptResult(WriteSet(gameData :: wSetCommonData), TransferSet(tSetCommonData))
252+ }
253+ }
254+
255+
256+@Callable(i)
257+func bet (playerChoice) = {
258+ let newGameNum = IncrementGameNum()
259+ let gameId = toBase58String(i.transactionId)
260+ let pmt = extract(i.payment)
261+ let betNotInWaves = isDefined(pmt.assetId)
262+ let feeNotInWaves = isDefined(pmt.assetId)
263+ let winAmt = ValidateBetAndDefineWinAmt(pmt.amount, playerChoice)
264+ let txIdUsed = isDefined(getString(this, gameId))
265+ if (betNotInWaves)
266+ then throw("Bet amount must be in Waves")
267+ else if (feeNotInWaves)
268+ then throw("Transaction's fee must be in Waves")
269+ else if (txIdUsed)
270+ then throw("Passed txId had been used before. Game aborted.")
271+ else {
272+ let playerPubKey58 = toBase58String(i.callerPublicKey)
273+ let gameDataStr = FormatGameDataStr(STATESUBMITTED, playerChoice, playerPubKey58, height, winAmt, "")
274+ ScriptResult(WriteSet([DataEntry(RESERVATIONKEY, ValidateAndIncreaseReservedAmt(winAmt)), DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet([ScriptTransfer(SERVER, COMMISSION, unit)]))
275+ }
276+ }
277+
278+
279+
280+@Callable(i)
281+func withdraw (gameId,rsaSign) = {
282+ let gameDataList = ExtractGameDataList(gameId)
283+ let gameState = gameDataList[IdxGameState]
284+ let playerChoice = gameDataList[IdxPlayerChoice]
285+ let startedHeight = parseIntValue(gameDataList[IdxStartedHeight])
286+ let winAmt = parseIntValue(gameDataList[IdxWinAmt])
287+ let playerPubKey58 = gameDataList[IdxPlayerPubKey58]
288+ let playerAddress = addressFromPublicKey(fromBase58String(playerPubKey58))
289+ let winByTimeout = ((height - startedHeight) > RANDORACLETIMEFRAME)
290+ let decreasedReserves = DecreaseReservedAmt(gameId, winAmt)
291+ if ((gameState != STATESUBMITTED))
292+ then throw("Invalid game state for passed gameId")
293+ else if (winByTimeout)
294+ then {
295+ let randStr = take(playerChoice, 1)
296+ let newGameDataStr = FormatGameDataStr(STATEWON, playerChoice, playerPubKey58, startedHeight, winAmt, randStr)
297+ WinScriptSet(gameId, playerAddress, winAmt, newGameDataStr, winByTimeout, decreasedReserves)
298+ }
299+ else {
300+ let randStr = RandToStr(GenerateRandInt(gameId, rsaSign))
301+ if (IsPlayerWin(playerChoice, randStr))
302+ then {
303+ let newGameDataStr = FormatGameDataStr(STATEWON, playerChoice, playerPubKey58, startedHeight, winAmt, randStr)
304+ WinScriptSet(gameId, playerAddress, winAmt, newGameDataStr, winByTimeout, decreasedReserves)
305+ }
306+ else {
307+ let newGameDataStr = FormatGameDataStr(STATELOST, playerChoice, playerPubKey58, startedHeight, winAmt, randStr)
308+ WriteSet([DataEntry(gameId, newGameDataStr), decreasedReserves])
309+ }
310+ }
311+ }
312+
313+
314+@Verifier(tx)
315+func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
316+ then match tx {
317+ case ttx: TransferTransaction =>
318+ ((wavesBalance(this) - ttx.amount) >= ExtractReservedAmt())
319+ case stx: SetScriptTransaction =>
320+ true
321+ case _ =>
322+ false
323+ }
324+ else false
325+

github/deemru/w8io/026f985 
36.03 ms