tx · B5sh5eCzMdCK9paWDLCYPuA5K58YRVhyZedKNwx1fbiW

3MqQ9ihYKGehfUnXYf5WmkYSZUD71ByeCQe:  -0.01500000 Waves

2019.07.17 10:04 [589516] smart account 3MqQ9ihYKGehfUnXYf5WmkYSZUD71ByeCQe > SELF 0.00000000 Waves

{ "type": 13, "id": "B5sh5eCzMdCK9paWDLCYPuA5K58YRVhyZedKNwx1fbiW", "fee": 1500000, "feeAssetId": null, "timestamp": 1563347086872, "version": 1, "sender": "3MqQ9ihYKGehfUnXYf5WmkYSZUD71ByeCQe", "senderPublicKey": "HcUXEkA9JTGp78LcTKsu4FmEpbDmnqntL4aMNLx1BHMB", "proofs": [ "4sWy2uLfxaZYun1TDxqkwxNYoWHwsxecfZzpDec4dkrdJmpwnR6rhWchajzH1vQX27efMW7QiNFLZ1Ar6KzyuNe" ], "script": "base64:AAIDAAAAAAAAAAAAAAAqAAAAAAlSU0FQVUJMSUMJAAJbAAAAAQIAAAGPYmFzZTY0Ok1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBbXB1WGNJL280cElCNXl3djlET09HYXBUQlV3UlZsTS82K0g2aEZlbE9YdGtyd1kvWUl0bVB4RURwejdyQWVyUVBRZTl0RFBFYUF2L0dubEV6dHliT0ZYZ3U5RHpEZThZb01SRDF2YWtnb0Fjb2dtYlk1OFFENktNajVIa29Wai95VE5JYzlzemo1cWhJbHJBZG1iM0tMTDZoUVU3eTgrSmo2OUJXVlBzYVFna3NwU2RlWXRiMXRIUWM3dDk1bjdPWjU2cjJBN0czK2JRZjZuU01rUGtBaElyRXBiQ201OG9pR0JjemRUZC9McUZTVm90WnNiTDdZaDZTSExmbkhlRCtRZ2NmSnJuYW04T0hNR0pFSlRSWGpJTGVIR2psUkNQOG9WcGlvSHJ5MVMyeFB4NXNWekltMk1NK0N6WWVuQUdsbzBqMjZhdEJoaVVMb1R1bHdEM3BRSURBUUFCAAAAAAZTRVJWRVIJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQIAAAAjM05DaUcyOExtV3lUaWdXRzEzRTVRbnZkSEJzWkZZWFNTMmoAAAAAE1JBTkRPUkFDTEVUSU1FRlJBTUUAAAAAAAAAEOAAAAAAB1dBVkVMRVQJAABoAAAAAgkAAGgAAAACAAAAAAAAAABkAAAAAAAAAAPoAAAAAAAAAAPoAAAAAApDT01NSVNTSU9OCQAAaQAAAAIJAABoAAAAAgAAAAAAAAAABQUAAAAHV0FWRUxFVAAAAAAAAAAD6AAAAAAEQkVUMQkAAGgAAAACAAAAAAAAAAABBQAAAAdXQVZFTEVUAAAAAARCRVQyCQAAaAAAAAIAAAAAAAAAAAIFAAAAB1dBVkVMRVQAAAAABEJFVDQJAABoAAAAAgAAAAAAAAAABAUAAAAHV0FWRUxFVAAAAAAEQkVUOAkAAGgAAAACAAAAAAAAAAAIBQAAAAdXQVZFTEVUAAAAAAVCRVQxNAkAAGgAAAACAAAAAAAAAAAOBQAAAAdXQVZFTEVUAAAAAAhSQVRFTVVMVAAAAAAAAAAnEAAAAAAFUkFURTEAAAAAAAAAmucAAAAABVJBVEUyAAAAAAAAAGAYAAAAAAVSQVRFMwAAAAAAAABKOAAAAAAFUkFURTQAAAAAAAAAN3gAAAAABVJBVEU1AAAAAAAAACyIAAAAAAxJZHhHYW1lU3RhdGUAAAAAAAAAAAAAAAAAD0lkeFBsYXllckNob2ljZQAAAAAAAAAAAQAAAAARSWR4UGxheWVyUHViS2V5NTgAAAAAAAAAAAIAAAAAEElkeFN0YXJ0ZWRIZWlnaHQAAAAAAAAAAAMAAAAACUlkeFdpbkFtdAAAAAAAAAAABAAAAAAOSWR4UmFuZE9yRW1wdHkAAAAAAAAAAAUAAAAADlJFU0VSVkFUSU9OS0VZAgAAABAkUkVTRVJWRURfQU1PVU5UAAAAAA9HQU1FU0NPVU5URVJLRVkCAAAACSRHQU1FX05VTQAAAAAOU1RBVEVTVUJNSVRURUQCAAAACVNVQk1JVFRFRAAAAAAIU1RBVEVXT04CAAAAA1dPTgAAAAAJU1RBVEVMT1NUAgAAAARMT1NUAQAAABBJbmNyZW1lbnRHYW1lTnVtAAAAAAQAAAAHZ2FtZU51bQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzBQAAAA9HQU1FU0NPVU5URVJLRVkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAADbnVtBQAAAAckbWF0Y2gwBQAAAANudW0AAAAAAAAAAAAJAABkAAAAAgUAAAAHZ2FtZU51bQAAAAAAAAAAAQEAAAASRXh0cmFjdFJlc2VydmVkQW10AAAAAAQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzBQAAAA5SRVNFUlZBVElPTktFWQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAAAQAAAB5WYWxpZGF0ZUFuZEluY3JlYXNlUmVzZXJ2ZWRBbXQAAAABAAAABndpbkFtdAQAAAARbmV3UmVzZXJ2ZWRBbW91bnQJAABkAAAAAgkBAAAAEkV4dHJhY3RSZXNlcnZlZEFtdAAAAAAFAAAABndpbkFtdAQAAAAHYmFsYW5jZQkBAAAADHdhdmVzQmFsYW5jZQAAAAEFAAAABHRoaXMDCQAAZgAAAAIFAAAAEW5ld1Jlc2VydmVkQW1vdW50BQAAAAdiYWxhbmNlCQAAAgAAAAECAAAAVEluc3VmZmljaWVudCBmdW5kcyBvbiBEaWNlIFJvbGxlciBhY2NvdW50LiBUcmFuc2FjdGlvbiB3YXMgcmVqZWN0ZWQgZm9yIHlvdXIgc2FmZXR5LgUAAAARbmV3UmVzZXJ2ZWRBbW91bnQBAAAAE0RlY3JlYXNlUmVzZXJ2ZWRBbXQAAAACAAAABmdhbWVJZAAAAAZ3aW5BbXQEAAAAEW5ld1Jlc2VydmVkQW1vdW50CQAAZQAAAAIJAQAAABJFeHRyYWN0UmVzZXJ2ZWRBbXQAAAAABQAAAAZ3aW5BbXQDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEW5ld1Jlc2VydmVkQW1vdW50CQAAAgAAAAECAAAAQkludmFsaWQgRGljZSBSb2xsZXIgYWNjb3VudCBzdGF0ZSAtIHJlc2VydmVkIGFtb3VudCBpcyBsZXNzIHRoYW4gMAkBAAAACURhdGFFbnRyeQAAAAIFAAAADlJFU0VSVkFUSU9OS0VZBQAAABFuZXdSZXNlcnZlZEFtb3VudAEAAAAaVmFsaWRhdGVCZXRBbmREZWZpbmVXaW5BbXQAAAACAAAABmJldEFtdAAAAAxwbGF5ZXJDaG9pY2UEAAAAC2JldEFtdFZhbGlkAwMDAwkAAAAAAAACBQAAAAZiZXRBbXQJAABkAAAAAgUAAAAEQkVUMQUAAAAKQ09NTUlTU0lPTgYJAAAAAAAAAgUAAAAGYmV0QW10CQAAZAAAAAIFAAAABEJFVDIFAAAACkNPTU1JU1NJT04GCQAAAAAAAAIFAAAABmJldEFtdAkAAGQAAAACBQAAAARCRVQ0BQAAAApDT01NSVNTSU9OBgkAAAAAAAACBQAAAAZiZXRBbXQJAABkAAAAAgUAAAAEQkVUOAUAAAAKQ09NTUlTU0lPTgYJAAAAAAAAAgUAAAAGYmV0QW10CQAAZAAAAAIFAAAABUJFVDE0BQAAAApDT01NSVNTSU9OAwUAAAALYmV0QW10VmFsaWQEAAAACmRpY2VzQ291bnQJAAExAAAAAQUAAAAMcGxheWVyQ2hvaWNlBAAAAANiZXQJAABlAAAAAgUAAAAGYmV0QW10BQAAAApDT01NSVNTSU9OAwkAAAAAAAACBQAAAApkaWNl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AAZnYW1lSWQFAAAAFm5ld0dhbWVEYXRhU3RyQWRqdXN0ZWQJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIFAAAACGdhbWVEYXRhBQAAAA53U2V0Q29tbW9uRGF0YQkBAAAAC1RyYW5zZmVyU2V0AAAAAQUAAAAOdFNldENvbW1vbkRhdGEEAAAACGdhbWVEYXRhCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAGZ2FtZUlkBQAAAA5uZXdHYW1lRGF0YVN0cgkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgUAAAAIZ2FtZURhdGEFAAAADndTZXRDb21tb25EYXRhCQEAAAALVHJhbnNmZXJTZXQAAAABBQAAAA50U2V0Q29tbW9uRGF0YQAAAAIAAAABaQEAAAADYmV0AAAAAQAAAAxwbGF5ZXJDaG9pY2UEAAAACm5ld0dhbWVOdW0JAQAAABBJbmNyZW1lbnRHYW1lTnVtAAAAAAQAAAAGZ2FtZUlkCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQEAAAAA3BtdAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50BAAAAA1iZXROb3RJbldhdmVzCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkBAAAAA1mZWVOb3RJbldhdmVzCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkBAAAAAZ3aW5BbXQJAQAAABpWYWxpZGF0ZUJldEFuZERlZmluZVdpbkFtdAAAAAIIBQAAAANwbXQAAAAGYW1vdW50BQAAAAxwbGF5ZXJDaG9pY2UEAAAACHR4SWRVc2VkCQEAAAAJaXNEZWZpbmVkAAAAAQkABB0AAAACBQAAAAR0aGlzBQAAAAZnYW1lSWQDBQAAAA1iZXROb3RJbldhdmVzCQAAAgAAAAECAAAAG0JldCBhbW91bnQgbXVzdCBiZSBpbiBXYXZlcwMFAAAADWZlZU5vdEluV2F2ZXMJAAACAAAAAQIAAAAiVHJhbnNhY3Rpb24ncyBmZWUgbXVzdCBiZSBpbiBXYXZlcwMFAAAACHR4SWRVc2VkCQAAAgAAAAECAAAAL1Bhc3NlZCB0eElkIGhhZCBiZWVuIHVzZWQgYmVmb3JlLiBHYW1lIGFib3J0ZWQuBAAAAA5wbGF5ZXJQdWJLZXk1OAkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAC2dhbWVEYXRhU3RyCQEAAAARRm9ybWF0R2FtZURhdGFTdHIAAAAGBQAAAA5TVEFURVNVQk1JVFRFRAUAAAAMcGxheWVyQ2hvaWNlBQAAAA5wbGF5ZXJQdWJLZXk1OAUAAAAGaGVpZ2h0BQAAAAZ3aW5BbXQCAAAAAAkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADlJFU0VSVkFUSU9OS0VZCQEAAAAeVmFsaWRhdGVBbmRJbmNyZWFzZVJlc2VydmVkQW10AAAAAQUAAAAGd2luQW10CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA9HQU1FU0NPVU5URVJLRVkFAAAACm5ld0dhbWVOdW0JAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAABmdhbWVJZAUAAAALZ2FtZURhdGFTdHIFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAZTRVJWRVIFAAAACkNPTU1JU1NJT04FAAAABHVuaXQFAAAAA25pbAAAAAFpAQAAAAh3aXRoZHJhdwAAAAIAAAAGZ2FtZUlkAAAAB3JzYVNpZ24EAAAADGdhbWVEYXRhTGlzdAkBAAAAE0V4dHJhY3RHYW1lRGF0YUxpc3QAAAABBQAAAAZnYW1lSWQEAAAACWdhbWVTdGF0ZQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAADElkeEdhbWVTdGF0ZQQAAAAMcGxheWVyQ2hvaWNlCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAPSWR4UGxheWVyQ2hvaWNlBAAAAA1zdGFydGVkSGVpZ2h0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAABBJZHhTdGFydGVkSGVpZ2h0BAAAAAZ3aW5BbXQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAACUlkeFdpbkFtdAQAAAAOcGxheWVyUHViS2V5NTgJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAABFJZHhQbGF5ZXJQdWJLZXk1OAQAAAANcGxheWVyQWRkcmVzcwkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAAA5wbGF5ZXJQdWJLZXk1OAQAAAAMd2luQnlUaW1lb3V0CQAAZgAAAAIJAABlAAAAAgUAAAAGaGVpZ2h0BQAAAA1zdGFydGVkSGVpZ2h0BQAAABNSQU5ET1JBQ0xFVElNRUZSQU1FBAAAABFkZWNyZWFzZWRSZXNlcnZlcwkBAAAAE0RlY3JlYXNlUmVzZXJ2ZWRBbXQAAAACBQAAAAZnYW1lSWQFAAAABndpbkFtdAMJAQAAAAIhPQAAAAIFAAAACWdhbWVTdGF0ZQUAAAAOU1RBVEVTVUJNSVRURUQJAAACAAAAAQIAAAAkSW52YWxpZCBnYW1lIHN0YXRlIGZvciBwYXNzZWQgZ2FtZUlkAwUAAAAMd2luQnlUaW1lb3V0BAAAAAdyYW5kU3RyCQABLwAAAAIFAAAADHBsYXllckNob2ljZQAAAAAAAAAAAQQAAAAObmV3R2FtZURhdGFTdHIJAQAAABFGb3JtYXRHYW1lRGF0YVN0cgAAAAYFAAAACFNUQVRFV09OBQAAAAxwbGF5ZXJDaG9pY2UFAAAADnBsYXllclB1YktleTU4BQAAAA1zdGFydGVkSGVpZ2h0BQAAAAZ3aW5BbXQFAAAAB3JhbmRTdHIJAQAAAAxXaW5TY3JpcHRTZXQAAAAGBQAAAAZnYW1lSWQFAAAADXBsYXllckFkZHJlc3MFAAAABndpbkFtdAUAAAAObmV3R2FtZURhdGFTdHIFAAAADHdpbkJ5VGltZW91dAUAAAARZGVjcmVhc2VkUmVzZXJ2ZXMEAAAAB3JhbmRTdHIJAQAAAAlSYW5kVG9TdHIAAAABCQEAAAAPR2VuZXJhdGVSYW5kSW50AAAAAgUAAAAGZ2FtZUlkBQAAAAdyc2FTaWduAwkBAAAAC0lzUGxheWVyV2luAAAAAgUAAAAMcGxheWVyQ2hvaWNlBQAAAAdyYW5kU3RyBAAAAA5uZXdHYW1lRGF0YVN0cgkBAAAAEUZvcm1hdEdhbWVEYXRhU3RyAAAABgUAAAAIU1RBVEVXT04FAAAADHBsYXllckNob2ljZQUAAAAOcGxheWVyUHViS2V5NTgFAAAADXN0YXJ0ZWRIZWlnaHQFAAAABndpbkFtdAUAAAAHcmFuZFN0cgkBAAAADFdpblNjcmlwdFNldAAAAAYFAAAABmdhbWVJZAUAAAANcGxheWVyQWRkcmVzcwUAAAAGd2luQW10BQAAAA5uZXdHYW1lRGF0YVN0cgUAAAAMd2luQnlUaW1lb3V0BQAAABFkZWNyZWFzZWRSZXNlcnZlcwQAAAAObmV3R2FtZURhdGFTdHIJAQAAABFGb3JtYXRHYW1lRGF0YVN0cgAAAAYFAAAACVNUQVRFTE9TVAUAAAAMcGxheWVyQ2hvaWNlBQAAAA5wbGF5ZXJQdWJLZXk1OAUAAAANc3RhcnRlZEhlaWdodAUAAAAGd2luQW10BQAAAAdyYW5kU3RyCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAZnYW1lSWQFAAAADm5ld0dhbWVEYXRhU3RyCQAETAAAAAIFAAAAEWRlY3JlYXNlZFJlc2VydmVzBQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkEAAAAByRtYXRjaDAFAAAAAnR4AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABNUcmFuc2ZlclRyYW5zYWN0aW9uBAAAAAN0dHgFAAAAByRtYXRjaDAJAABnAAAAAgkAAGUAAAACCQEAAAAMd2F2ZXNCYWxhbmNlAAAAAQUAAAAEdGhpcwgFAAAAA3R0eAAAAAZhbW91bnQJAQAAABJFeHRyYWN0UmVzZXJ2ZWRBbXQAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABRTZXRTY3JpcHRUcmFuc2FjdGlvbgQAAAADc3R4BQAAAAckbWF0Y2gwBgcH23unqQ==", "chainId": 84, "height": 589516, "spentComplexity": 0 } View: original | compacted Prev: Ezhozijervr4gJUuVviNqWRa8CRFv84pvmfTspwe13uf Next: EPMpHrbGh5EBXXjXR73zsJDT76zqWryQvP4juczHoz3r Diff:
OldNewDifferences
1111
1212 let COMMISSION = ((5 * WAVELET) / 1000)
1313
14-let BETMIN = ((1 * WAVELET) / 2)
14+let BET1 = (1 * WAVELET)
1515
16-let BETMAX = (6 * WAVELET)
16+let BET2 = (2 * WAVELET)
1717
18-let BETSTEP = ((1 * WAVELET) / 10)
18+let BET4 = (4 * WAVELET)
1919
20-let PRECISION = 10000
20+let BET8 = (8 * WAVELET)
2121
22-let R1MAX = 96
22+let BET14 = (14 * WAVELET)
2323
24-let R1MIN = 94
24+let RATEMULT = 10000
2525
26-let R1K = 9860
26+let RATE1 = 39655
2727
28-let R2MAX = 93
28+let RATE2 = 24600
2929
30-let R2MIN = 87
30+let RATE3 = 19000
3131
32-let R2K = 9800
32+let RATE4 = 14200
3333
34-let R3MAX = 86
35-
36-let R3MIN = 86
37-
38-let R3K = 9750
39-
40-let R4MAX = 85
41-
42-let R4MIN = 84
43-
44-let R4K = 9670
45-
46-let R5MAX = 83
47-
48-let R5MIN = 83
49-
50-let R5K = 9630
51-
52-let R6MAX = 82
53-
54-let R6MIN = 67
55-
56-let R6K = 9610
57-
58-let R7MAX = 66
59-
60-let R7MIN = 56
61-
62-let R7K = 9560
63-
64-let R8MAX = 55
65-
66-let R8MIN = 38
67-
68-let R8K = 9500
69-
70-let R9MAX = 37
71-
72-let R9MIN = 3
73-
74-let R9K = 9290
75-
76-let R10MAX = 2
77-
78-let R10MIN = 1
79-
80-let R10K = 9860
34+let RATE5 = 11400
8135
8236 let IdxGameState = 0
8337
12478 let newReservedAmount = (ExtractReservedAmt() + winAmt)
12579 let balance = wavesBalance(this)
12680 if ((newReservedAmount > balance))
127- then throw("Insufficient funds on Waves Rider account. Transaction was rejected for your safety.")
81+ then throw("Insufficient funds on Dice Roller account. Transaction was rejected for your safety.")
12882 else newReservedAmount
12983 }
13084
13892
13993
14094 func ValidateBetAndDefineWinAmt (betAmt,playerChoice) = {
141- let bet = (betAmt - COMMISSION)
142- let betAmtValid = if (if ((bet >= BETMIN))
143- then (BETMAX >= bet)
144- else false)
145- then ((bet % BETSTEP) == 0)
146- else false
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))
147104 if (betAmtValid)
148105 then {
149- let playerChoiceInt = parseIntValue(playerChoice)
150- if (if ((playerChoiceInt >= 1))
151- then (96 >= playerChoiceInt)
152- else false)
153- then {
154- let RKxPrecision = if (if ((R1MAX >= playerChoiceInt))
155- then (playerChoiceInt >= R1MIN)
156- else false)
157- then R1K
158- else if (if ((R2MAX >= playerChoiceInt))
159- then (playerChoiceInt >= R2MIN)
160- else false)
161- then R2K
162- else if (if ((R3MAX >= playerChoiceInt))
163- then (playerChoiceInt >= R3MIN)
164- else false)
165- then R3K
166- else if (if ((R4MAX >= playerChoiceInt))
167- then (playerChoiceInt >= R4MIN)
168- else false)
169- then R4K
170- else if (if ((R5MAX >= playerChoiceInt))
171- then (playerChoiceInt >= R5MIN)
172- else false)
173- then R5K
174- else if (if ((R6MAX >= playerChoiceInt))
175- then (playerChoiceInt >= R6MIN)
176- else false)
177- then R6K
178- else if (if ((R7MAX >= playerChoiceInt))
179- then (playerChoiceInt >= R7MIN)
180- else false)
181- then R7K
182- else if (if ((R8MAX >= playerChoiceInt))
183- then (playerChoiceInt >= R8MIN)
184- else false)
185- then R8K
186- else if (if ((R9MAX >= playerChoiceInt))
187- then (playerChoiceInt >= R9MIN)
188- else false)
189- then R9K
190- else if (if ((R10MAX >= playerChoiceInt))
191- then (playerChoiceInt >= R10MIN)
192- else false)
193- then R10K
194- else throw(("Couldn't define range: playerChoice=" + playerChoice))
195- ((((100 * RKxPrecision) / playerChoiceInt) * bet) / PRECISION)
196- }
197- else throw("Player choice is out of the condition below: 1 <= choice <= 96")
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")
198119 }
199- else throw(((((("Bet amount is not in range: minBet=" + toString(BETMIN)) + " maxBet=") + toString(BETMAX)) + " betStep=") + toString(BETSTEP)))
120+ else throw("Bet amount is not in range")
200121 }
201122
202123
203-func RandToStr (r) = if (if ((r >= 1))
204- then (100 >= r)
205- else false)
206- then toString(r)
207- else throw(("Unsupported r parameter passed: expected=[1,...,100] actual=" + toString(r)))
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)))
208137
209138
210139 func GenerateRandInt (gameId,rsaSign) = {
211140 let rsaSigValid = rsaVerify(SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
212141 if (rsaSigValid)
213142 then {
214- let rand = (toInt(sha256(rsaSign)) % 100)
143+ let rand = (toInt(sha256(rsaSign)) % 6)
215144 if ((0 > rand))
216- then ((-1 * rand) + 1)
217- else (rand + 1)
145+ then (-1 * rand)
146+ else rand
218147 }
219148 else throw("Invalid RSA signature")
220149 }
221150
222151
223-func IsPlayerWin (playerChoice,rand) = {
224- let playerChoiceInt = parseIntValue(playerChoice)
225- (playerChoiceInt >= rand)
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
226177 }
227178
228179
341292 then throw("Invalid game state for passed gameId")
342293 else if (winByTimeout)
343294 then {
344- let randStr = playerChoice
295+ let randStr = take(playerChoice, 1)
345296 let newGameDataStr = FormatGameDataStr(STATEWON, playerChoice, playerPubKey58, startedHeight, winAmt, randStr)
346297 WinScriptSet(gameId, playerAddress, winAmt, newGameDataStr, winByTimeout, decreasedReserves)
347298 }
348299 else {
349- let rand = GenerateRandInt(gameId, rsaSign)
350- let randStr = RandToStr(rand)
351- if (IsPlayerWin(playerChoice, rand))
300+ let randStr = RandToStr(GenerateRandInt(gameId, rsaSign))
301+ if (IsPlayerWin(playerChoice, randStr))
352302 then {
353303 let newGameDataStr = FormatGameDataStr(STATEWON, playerChoice, playerPubKey58, startedHeight, winAmt, randStr)
354304 WinScriptSet(gameId, playerAddress, winAmt, newGameDataStr, winByTimeout, decreasedReserves)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let RSAPUBLIC = fromBase64String("base64:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmpuXcI/o4pIB5ywv9DOOGapTBUwRVlM/6+H6hFelOXtkrwY/YItmPxEDpz7rAerQPQe9tDPEaAv/GnlEztybOFXgu9DzDe8YoMRD1vakgoAcogmbY58QD6KMj5HkoVj/yTNIc9szj5qhIlrAdmb3KLL6hQU7y8+Jj69BWVPsaQgkspSdeYtb1tHQc7t95n7OZ56r2A7G3+bQf6nSMkPkAhIrEpbCm58oiGBczdTd/LqFSVotZsbL7Yh6SHLfnHeD+QgcfJrnam8OHMGJEJTRXjILeHGjlRCP8oVpioHry1S2xPx5sVzIm2MM+CzYenAGlo0j26atBhiULoTulwD3pQIDAQAB")
55
66 let SERVER = addressFromStringValue("3NCiG28LmWyTigWG13E5QnvdHBsZFYXSS2j")
77
88 let RANDORACLETIMEFRAME = 4320
99
1010 let WAVELET = ((100 * 1000) * 1000)
1111
1212 let COMMISSION = ((5 * WAVELET) / 1000)
1313
14-let BETMIN = ((1 * WAVELET) / 2)
14+let BET1 = (1 * WAVELET)
1515
16-let BETMAX = (6 * WAVELET)
16+let BET2 = (2 * WAVELET)
1717
18-let BETSTEP = ((1 * WAVELET) / 10)
18+let BET4 = (4 * WAVELET)
1919
20-let PRECISION = 10000
20+let BET8 = (8 * WAVELET)
2121
22-let R1MAX = 96
22+let BET14 = (14 * WAVELET)
2323
24-let R1MIN = 94
24+let RATEMULT = 10000
2525
26-let R1K = 9860
26+let RATE1 = 39655
2727
28-let R2MAX = 93
28+let RATE2 = 24600
2929
30-let R2MIN = 87
30+let RATE3 = 19000
3131
32-let R2K = 9800
32+let RATE4 = 14200
3333
34-let R3MAX = 86
35-
36-let R3MIN = 86
37-
38-let R3K = 9750
39-
40-let R4MAX = 85
41-
42-let R4MIN = 84
43-
44-let R4K = 9670
45-
46-let R5MAX = 83
47-
48-let R5MIN = 83
49-
50-let R5K = 9630
51-
52-let R6MAX = 82
53-
54-let R6MIN = 67
55-
56-let R6K = 9610
57-
58-let R7MAX = 66
59-
60-let R7MIN = 56
61-
62-let R7K = 9560
63-
64-let R8MAX = 55
65-
66-let R8MIN = 38
67-
68-let R8K = 9500
69-
70-let R9MAX = 37
71-
72-let R9MIN = 3
73-
74-let R9K = 9290
75-
76-let R10MAX = 2
77-
78-let R10MIN = 1
79-
80-let R10K = 9860
34+let RATE5 = 11400
8135
8236 let IdxGameState = 0
8337
8438 let IdxPlayerChoice = 1
8539
8640 let IdxPlayerPubKey58 = 2
8741
8842 let IdxStartedHeight = 3
8943
9044 let IdxWinAmt = 4
9145
9246 let IdxRandOrEmpty = 5
9347
9448 let RESERVATIONKEY = "$RESERVED_AMOUNT"
9549
9650 let GAMESCOUNTERKEY = "$GAME_NUM"
9751
9852 let STATESUBMITTED = "SUBMITTED"
9953
10054 let STATEWON = "WON"
10155
10256 let STATELOST = "LOST"
10357
10458 func IncrementGameNum () = {
10559 let gameNum = match getInteger(this, GAMESCOUNTERKEY) {
10660 case num: Int =>
10761 num
10862 case _ =>
10963 0
11064 }
11165 (gameNum + 1)
11266 }
11367
11468
11569 func ExtractReservedAmt () = match getInteger(this, RESERVATIONKEY) {
11670 case a: Int =>
11771 a
11872 case _ =>
11973 0
12074 }
12175
12276
12377 func ValidateAndIncreaseReservedAmt (winAmt) = {
12478 let newReservedAmount = (ExtractReservedAmt() + winAmt)
12579 let balance = wavesBalance(this)
12680 if ((newReservedAmount > balance))
127- then throw("Insufficient funds on Waves Rider account. Transaction was rejected for your safety.")
81+ then throw("Insufficient funds on Dice Roller account. Transaction was rejected for your safety.")
12882 else newReservedAmount
12983 }
13084
13185
13286 func DecreaseReservedAmt (gameId,winAmt) = {
13387 let newReservedAmount = (ExtractReservedAmt() - winAmt)
13488 if ((0 > newReservedAmount))
13589 then throw("Invalid Dice Roller account state - reserved amount is less than 0")
13690 else DataEntry(RESERVATIONKEY, newReservedAmount)
13791 }
13892
13993
14094 func ValidateBetAndDefineWinAmt (betAmt,playerChoice) = {
141- let bet = (betAmt - COMMISSION)
142- let betAmtValid = if (if ((bet >= BETMIN))
143- then (BETMAX >= bet)
144- else false)
145- then ((bet % BETSTEP) == 0)
146- else false
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))
147104 if (betAmtValid)
148105 then {
149- let playerChoiceInt = parseIntValue(playerChoice)
150- if (if ((playerChoiceInt >= 1))
151- then (96 >= playerChoiceInt)
152- else false)
153- then {
154- let RKxPrecision = if (if ((R1MAX >= playerChoiceInt))
155- then (playerChoiceInt >= R1MIN)
156- else false)
157- then R1K
158- else if (if ((R2MAX >= playerChoiceInt))
159- then (playerChoiceInt >= R2MIN)
160- else false)
161- then R2K
162- else if (if ((R3MAX >= playerChoiceInt))
163- then (playerChoiceInt >= R3MIN)
164- else false)
165- then R3K
166- else if (if ((R4MAX >= playerChoiceInt))
167- then (playerChoiceInt >= R4MIN)
168- else false)
169- then R4K
170- else if (if ((R5MAX >= playerChoiceInt))
171- then (playerChoiceInt >= R5MIN)
172- else false)
173- then R5K
174- else if (if ((R6MAX >= playerChoiceInt))
175- then (playerChoiceInt >= R6MIN)
176- else false)
177- then R6K
178- else if (if ((R7MAX >= playerChoiceInt))
179- then (playerChoiceInt >= R7MIN)
180- else false)
181- then R7K
182- else if (if ((R8MAX >= playerChoiceInt))
183- then (playerChoiceInt >= R8MIN)
184- else false)
185- then R8K
186- else if (if ((R9MAX >= playerChoiceInt))
187- then (playerChoiceInt >= R9MIN)
188- else false)
189- then R9K
190- else if (if ((R10MAX >= playerChoiceInt))
191- then (playerChoiceInt >= R10MIN)
192- else false)
193- then R10K
194- else throw(("Couldn't define range: playerChoice=" + playerChoice))
195- ((((100 * RKxPrecision) / playerChoiceInt) * bet) / PRECISION)
196- }
197- else throw("Player choice is out of the condition below: 1 <= choice <= 96")
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")
198119 }
199- else throw(((((("Bet amount is not in range: minBet=" + toString(BETMIN)) + " maxBet=") + toString(BETMAX)) + " betStep=") + toString(BETSTEP)))
120+ else throw("Bet amount is not in range")
200121 }
201122
202123
203-func RandToStr (r) = if (if ((r >= 1))
204- then (100 >= r)
205- else false)
206- then toString(r)
207- else throw(("Unsupported r parameter passed: expected=[1,...,100] actual=" + toString(r)))
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)))
208137
209138
210139 func GenerateRandInt (gameId,rsaSign) = {
211140 let rsaSigValid = rsaVerify(SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
212141 if (rsaSigValid)
213142 then {
214- let rand = (toInt(sha256(rsaSign)) % 100)
143+ let rand = (toInt(sha256(rsaSign)) % 6)
215144 if ((0 > rand))
216- then ((-1 * rand) + 1)
217- else (rand + 1)
145+ then (-1 * rand)
146+ else rand
218147 }
219148 else throw("Invalid RSA signature")
220149 }
221150
222151
223-func IsPlayerWin (playerChoice,rand) = {
224- let playerChoiceInt = parseIntValue(playerChoice)
225- (playerChoiceInt >= rand)
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
226177 }
227178
228179
229180 func FormatGameDataParam (p) = {
230181 let s = size(p)
231182 if ((s == 0))
232183 then throw("Parameter size must be greater then 0")
233184 else if ((s > 99))
234185 then throw("Parameter size must be less then 100")
235186 else if ((10 > s))
236187 then (("0" + toString(s)) + p)
237188 else (toString(s) + p)
238189 }
239190
240191
241192 func FormatGameDataStr (gameState,playerChoice,playerPubKey58,startedHeight,winAmt,randOrEmpty) = {
242193 let fullStateStr = ((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(playerChoice)) + "_") + FormatGameDataParam(playerPubKey58)) + "_") + FormatGameDataParam(toString(startedHeight))) + "_") + FormatGameDataParam(toString(winAmt)))
243194 if ((randOrEmpty == ""))
244195 then fullStateStr
245196 else ((fullStateStr + "_") + FormatGameDataParam(randOrEmpty))
246197 }
247198
248199
249200 func RemoveUnderscoreIfPresent (remaining) = if ((size(remaining) > 0))
250201 then drop(remaining, 1)
251202 else remaining
252203
253204
254205 func ParseNextAttribute (remaining) = {
255206 let s = size(remaining)
256207 if ((s > 0))
257208 then {
258209 let nn = parseIntValue(take(remaining, 2))
259210 let v = take(drop(remaining, 2), nn)
260211 let tmpRemaining = drop(remaining, (nn + 2))
261212 let remainingState = RemoveUnderscoreIfPresent(tmpRemaining)
262213 [v, remainingState]
263214 }
264215 else throw("Empty string was passed into parseNextAttribute func")
265216 }
266217
267218
268219 func ParseGameRawDataStr (rawStateStr) = {
269220 let gameState = ParseNextAttribute(rawStateStr)
270221 let playerChoice = ParseNextAttribute(gameState[1])
271222 let playerPubKey58 = ParseNextAttribute(playerChoice[1])
272223 let startedHeight = ParseNextAttribute(playerPubKey58[1])
273224 let winAmt = ParseNextAttribute(startedHeight[1])
274225 [gameState[0], playerChoice[0], playerPubKey58[0], startedHeight[0], winAmt[0]]
275226 }
276227
277228
278229 func ExtractGameDataList (gameId) = {
279230 let rawDataStr = match getString(this, gameId) {
280231 case str: String =>
281232 str
282233 case _ =>
283234 throw(("Couldn't find game by " + gameId))
284235 }
285236 ParseGameRawDataStr(rawDataStr)
286237 }
287238
288239
289240 func WinScriptSet (gameId,playerAddress,winAmt,newGameDataStr,winByTimeout,decreasedReserves) = {
290241 let wSetCommonData = [decreasedReserves]
291242 let tSetCommonData = [ScriptTransfer(playerAddress, winAmt, unit)]
292243 if (winByTimeout)
293244 then {
294245 let newGameDataStrAdjusted = ((newGameDataStr + "_") + FormatGameDataParam("TIMEOUT"))
295246 let gameData = DataEntry(gameId, newGameDataStrAdjusted)
296247 ScriptResult(WriteSet(gameData :: wSetCommonData), TransferSet(tSetCommonData))
297248 }
298249 else {
299250 let gameData = DataEntry(gameId, newGameDataStr)
300251 ScriptResult(WriteSet(gameData :: wSetCommonData), TransferSet(tSetCommonData))
301252 }
302253 }
303254
304255
305256 @Callable(i)
306257 func bet (playerChoice) = {
307258 let newGameNum = IncrementGameNum()
308259 let gameId = toBase58String(i.transactionId)
309260 let pmt = extract(i.payment)
310261 let betNotInWaves = isDefined(pmt.assetId)
311262 let feeNotInWaves = isDefined(pmt.assetId)
312263 let winAmt = ValidateBetAndDefineWinAmt(pmt.amount, playerChoice)
313264 let txIdUsed = isDefined(getString(this, gameId))
314265 if (betNotInWaves)
315266 then throw("Bet amount must be in Waves")
316267 else if (feeNotInWaves)
317268 then throw("Transaction's fee must be in Waves")
318269 else if (txIdUsed)
319270 then throw("Passed txId had been used before. Game aborted.")
320271 else {
321272 let playerPubKey58 = toBase58String(i.callerPublicKey)
322273 let gameDataStr = FormatGameDataStr(STATESUBMITTED, playerChoice, playerPubKey58, height, winAmt, "")
323274 ScriptResult(WriteSet([DataEntry(RESERVATIONKEY, ValidateAndIncreaseReservedAmt(winAmt)), DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet([ScriptTransfer(SERVER, COMMISSION, unit)]))
324275 }
325276 }
326277
327278
328279
329280 @Callable(i)
330281 func withdraw (gameId,rsaSign) = {
331282 let gameDataList = ExtractGameDataList(gameId)
332283 let gameState = gameDataList[IdxGameState]
333284 let playerChoice = gameDataList[IdxPlayerChoice]
334285 let startedHeight = parseIntValue(gameDataList[IdxStartedHeight])
335286 let winAmt = parseIntValue(gameDataList[IdxWinAmt])
336287 let playerPubKey58 = gameDataList[IdxPlayerPubKey58]
337288 let playerAddress = addressFromPublicKey(fromBase58String(playerPubKey58))
338289 let winByTimeout = ((height - startedHeight) > RANDORACLETIMEFRAME)
339290 let decreasedReserves = DecreaseReservedAmt(gameId, winAmt)
340291 if ((gameState != STATESUBMITTED))
341292 then throw("Invalid game state for passed gameId")
342293 else if (winByTimeout)
343294 then {
344- let randStr = playerChoice
295+ let randStr = take(playerChoice, 1)
345296 let newGameDataStr = FormatGameDataStr(STATEWON, playerChoice, playerPubKey58, startedHeight, winAmt, randStr)
346297 WinScriptSet(gameId, playerAddress, winAmt, newGameDataStr, winByTimeout, decreasedReserves)
347298 }
348299 else {
349- let rand = GenerateRandInt(gameId, rsaSign)
350- let randStr = RandToStr(rand)
351- if (IsPlayerWin(playerChoice, rand))
300+ let randStr = RandToStr(GenerateRandInt(gameId, rsaSign))
301+ if (IsPlayerWin(playerChoice, randStr))
352302 then {
353303 let newGameDataStr = FormatGameDataStr(STATEWON, playerChoice, playerPubKey58, startedHeight, winAmt, randStr)
354304 WinScriptSet(gameId, playerAddress, winAmt, newGameDataStr, winByTimeout, decreasedReserves)
355305 }
356306 else {
357307 let newGameDataStr = FormatGameDataStr(STATELOST, playerChoice, playerPubKey58, startedHeight, winAmt, randStr)
358308 WriteSet([DataEntry(gameId, newGameDataStr), decreasedReserves])
359309 }
360310 }
361311 }
362312
363313
364314 @Verifier(tx)
365315 func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
366316 then match tx {
367317 case ttx: TransferTransaction =>
368318 ((wavesBalance(this) - ttx.amount) >= ExtractReservedAmt())
369319 case stx: SetScriptTransaction =>
370320 true
371321 case _ =>
372322 false
373323 }
374324 else false
375325

github/deemru/w8io/026f985 
65.75 ms