tx · C337qM2FryZMoZHj5SBNSixKtewfmsVc2xBCG5Y5nMmz 3Mr1FdiZzG9iTQUtPmQEs1hBVbyQhG6LU93: -0.01500000 Waves 2021.08.04 09:10 [1643207] smart account 3Mr1FdiZzG9iTQUtPmQEs1hBVbyQhG6LU93 > SELF 0.00000000 Waves
{ "type": 13, "id": "C337qM2FryZMoZHj5SBNSixKtewfmsVc2xBCG5Y5nMmz", "fee": 1500000, "feeAssetId": null, "timestamp": 1628057470483, "version": 1, "sender": "3Mr1FdiZzG9iTQUtPmQEs1hBVbyQhG6LU93", "senderPublicKey": "De2GV53Brxd2GCQnLJWRugSidGtrVvPL9kJn2Dh4NTpJ", "proofs": [ "frYUnm81nZtjkkc4CNaWyMr4PTug74sDba6SqgziiK3LoTsHkzw44TW64GsuFJic93fHLPhf4aAhv53PsaBY64A" ], "script": "base64:AAIEAAAAAAAAAA0IAhIDCgEIEgQKAggCAAAANQAAAAAGV0FWRVNEAAAAAAAF9eEAAAAAAAVVU0RORAAAAAAAAA9CQAAAAAAERUdHRAAAAAAAAAAAZAAAAAAIREVDSU1BTFMJAARMAAAAAgUAAAAGV0FWRVNECQAETAAAAAIFAAAABVVTRE5ECQAETAAAAAIFAAAABEVHR0QFAAAAA25pbAAAAAAGQVNTRVRTCQAETAAAAAIFAAAABHVuaXQJAARMAAAAAgkAAlkAAAABAgAAACwyNUZFcUVqUmtxSzZ5Q2tpVDdMejZTQVl6N2dVRkN0eGZDQ2huclZGRDVBVAkABEwAAAACCQACWQAAAAECAAAALEhzRXdXdXVRalVvaHJYMjZGeDh0ZzVlaUw0TEREN3VtNmpxTnFGZ0VSeDZnBQAAAANuaWwAAAAAC0JFVERJVklERVJTCQAETAAAAAIAAAAAAAAAAAEJAARMAAAAAgAAAAAAAAAAAQkABEwAAAACAAAAAAAAAABkBQAAAANuaWwAAAAAC01JTkZFRVdBVkVTCQAAaQAAAAIJAABoAAAAAgAAAAAAAAAABQUAAAAGV0FWRVNEAAAAAAAAAAPoAAAAAARCRVQxAAAAAAAAAAABAAAAAARCRVQyAAAAAAAAAAACAAAAAARCRVQ0AAAAAAAAAAAEAAAAAARCRVQ4AAAAAAAAAAAIAAAAAAVCRVQxNAAAAAAAAAAADgAAAAAIUkFURU1VTFQAAAAAAAAAJxAAAAAABVJBVEUxAAAAAAAAAJrnAAAAAAVSQVRFMgAAAAAAAABgGAAAAAAFUkFURTMAAAAAAAAASjgAAAAABVJBVEU0AAAAAAAAADd4AAAAAAVSQVRFNQAAAAAAAAAsiAAAAAAFUkFURVMJAARMAAAAAgUAAAAFUkFURTEJAARMAAAAAgUAAAAFUkFURTIJAARMAAAAAgUAAAAFUkFURTMJAARMAAAAAgUAAAAFUkFURTQJAARMAAAAAgUAAAAFUkFURTUFAAAAA25pbAAAAAAEQkVUUwkABEwAAAACBQAAAARCRVQxCQAETAAAAAIFAAAABEJFVDIJAARMAAAAAgUAAAAEQkVUNAkABEwAAAACBQAAAARCRVQ4CQAETAAAAAIFAAAABUJFVDE0BQAAAANuaWwAAAAADElkeEdhbWVTdGF0ZQAAAAAAAAAAAAAAAAAPSWR4UGxheWVyQ2hvaWNlAAAAAAAAAAABAAAAABFJZHhQbGF5ZXJQdWJLZXk1OAAAAAAAAAAAAgAAAAAQSWR4U3RhcnRlZEhlaWdodAAAAAAAAAAAAwAAAAAMSWR4V2luQW1vdW50AAAAAAAAAAAEAAAAAApJZHhBc3NldElkAAAAAAAAAAAFAAAAAA5SRVNFUlZBVElPTktFWQkABEwAAAACAgAAABYkUkVTRVJWRURfQU1PVU5UX1dBVkVTCQAETAAAAAICAAAAFSRSRVNFUlZFRF9BTU9VTlRfVVNETgUAAAADbmlsAAAAAA9HQU1FU0NPVU5URVJLRVkCAAAACSRHQU1FX05VTQAAAAAOUlNBUFVCTElDNjRLRVkCAAAADSRSU0FfUFVCTElDNjQAAAAAEFNFUlZFUkFERFJFU1NLRVkCAAAADSRCRU5aX0FERFJFU1MAAAAAEFJBTkRUSU1FRlJBTUVLRVkCAAAAFiRSQU5EX09SQUNMRV9USU1FRlJBTUUAAAAADlNUQVRFU1VCTUlUVEVEAgAAAAlTVUJNSVRURUQAAAAACFNUQVRFV09OAgAAAANXT04AAAAACVNUQVRFTE9TVAIAAAAETE9TVAEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAQAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkJAAEsAAAAAgUAAAADa2V5AgAAACMga2V5IGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhpcy5zdGF0ZQAAAAAJUlNBUFVCTElDCQACWwAAAAEJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAABBQAAAA5SU0FQVUJMSUM2NEtFWQAAAAAGU0VSVkVSCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAQUAAAAQU0VSVkVSQUREUkVTU0tFWQAAAAATUkFORE9SQUNMRVRJTUVGUkFNRQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABBSQU5EVElNRUZSQU1FS0VZAAAAAAAAABwgAQAAAAhnZXRJbnRPcgAAAAIAAAADa2V5AAAAB2RlZmF1bHQDCQEA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AA1zdGFydGVkSGVpZ2h0AAAACXdpbkFtb3VudAAAAAdhc3NldElkAAAAC3JhbmRPckVtcHR5CQAEuQAAAAIJAARMAAAAAgUAAAAKZ2FtZVN0YXR1cwkABEwAAAACBQAAAAxwbGF5ZXJDaG9pY2UJAARMAAAAAgUAAAAOcGxheWVyUHViS2V5NTgJAARMAAAAAgUAAAANc3RhcnRlZEhlaWdodAkABEwAAAACBQAAAAl3aW5BbW91bnQJAARMAAAAAgUAAAAHYXNzZXRJZAkABEwAAAACAwkAAAAAAAACBQAAAAtyYW5kT3JFbXB0eQIAAAAAAgAAAAAJAAEsAAAAAgIAAAABXwUAAAALcmFuZE9yRW1wdHkFAAAAA25pbAIAAAABXwEAAAAOZm9ybWF0R2FtZURhdGEAAAAHAAAACmdhbWVTdGF0dXMAAAAMcGxheWVyQ2hvaWNlAAAADnBsYXllclB1YktleTU4AAAADXN0YXJ0ZWRIZWlnaHQAAAAJd2luQW1vdW50AAAAB2Fzc2V0SWQAAAALcmFuZE9yRW1wdHkJAQAAAA9mb3JtYXRHYW1lRGF0YVMAAAAHBQAAAApnYW1lU3RhdHVzBQAAAAxwbGF5ZXJDaG9pY2UFAAAADnBsYXllclB1YktleTU4CQABpAAAAAEFAAAADXN0YXJ0ZWRIZWlnaHQJAAGkAAAAAQUAAAAJd2luQW1vdW50CQABpAAAAAEFAAAAB2Fzc2V0SWQFAAAAC3JhbmRPckVtcHR5AQAAAA5maW5pc2hHYW1lRGF0YQAAAAQAAAAMb3JpZ0dhbWVEYXRhAAAACmdhbWVTdGF0dXMAAAAEcmFuZAAAAAx3aW5CeVRpbWVvdXQEAAAADmZpbmlzaEdhbWVEYXRhCQEAAAAPZm9ybWF0R2FtZURhdGFTAAAABwUAAAAKZ2FtZVN0YXR1cwkAAZEAAAACBQAAAAxvcmlnR2FtZURhdGEFAAAAD0lkeFBsYXllckNob2ljZQkAAZEAAAACBQAAAAxvcmlnR2FtZURhdGEFAAAAEUlkeFBsYXllclB1YktleTU4CQABkQAAAAIFAAAADG9yaWdHYW1lRGF0YQUAAAAQSWR4U3RhcnRlZEhlaWdodAkAAZEAAAACBQAAAAxvcmlnR2FtZURhdGEFAAAADElkeFdpbkFtb3VudAkAAZEAAAACBQAAAAxvcmlnR2FtZURhdGEFAAAACklkeEFzc2V0SWQFAAAABHJhbmQDBQAAAAx3aW5CeVRpbWVvdXQJAAEsAAAAAgUAAAAOZmluaXNoR2FtZURhdGECAAAACF9USU1FT1VUBQAAAA5maW5pc2hHYW1lRGF0YQEAAAAPZXh0cmFjdEdhbWVEYXRhAAAAAQAAAAZnYW1lSWQJAAS1AAAAAgQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzBQAAAAZnYW1lSWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAADc3RyBQAAAAckbWF0Y2gwBQAAAANzdHIJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAABkdhbWU6IAUAAAAGZ2FtZUlkAgAAAAsgbm90IGZvdW5kLgIAAAABXwAAAAIAAAABaQEAAAADYmV0AAAAAQAAAAxwbGF5ZXJDaG9pY2UEAAAABmdhbWVJZAkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkAwkAAGcAAAACAAAAAAAAAAABCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzCQAAAgAAAAECAAAAGzIgcGF5bWVudHMgbXVzdCBiZSBhdHRhY2hlZAMJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAABmdhbWVJZAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAJQmV0IGZvcjogBQAAAAZnYW1lSWQCAAAAEiB3YXMgYWxyZWFkeSBtYWRlLgQAAAAGYmV0UG10CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAZmZWVQbXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEDCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAABmZlZVBtdAAAAAdhc3NldElkCQAAAgAAAAECAAAALWZlZVBtdCAoMm5kIHBheW1lbnQpIGFzc2V0SWQgbXVzdCBiZSBpbiBXYXZlcwMJAABmAAAAAgUAAAALTUlORkVFV0FWRVMIBQAAAAZmZWVQbXQAAAAGYW1vdW50CQAAAgAAAAECAAAAK2ZlZVBtdCAoMm5kIHBheW1lbnQpIG11c3QgYmUgPj0gMC4wMDUgV2F2ZXMEAAAAD2ludGVybmFsQXNzZXRJZAkBAAAAFXZhbGlkYXRlQW5kR2V0QXNzZXRJZAAAAAEIBQAAAAZiZXRQbXQAAAAHYXNzZXRJZAQAAAAKY29tbWlzc2lvbggFAAAABmZlZVBtdAAAAAZhbW91bnQEAAAACXdpbkFtb3VudAkBAAAAGnZhbGlkYXRlQmV0QW5kR2V0V2luQW1vdW50AAAAAwgFAAAABmJldFBtdAAAAAZhbW91bnQFAAAAD2ludGVybmFsQXNzZXRJZAUAAAAMcGxheWVyQ2hvaWNlBAAAAA5wbGF5ZXJQdWJLZXk1OAkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAACGdhbWVEYXRhCQEAAAAOZm9ybWF0R2FtZURhdGEAAAAHBQAAAA5TVEFURVNVQk1JVFRFRAUAAAAMcGxheWVyQ2hvaWNlBQAAAA5wbGF5ZXJQdWJLZXk1OAUAAAAGaGVpZ2h0BQAAAAl3aW5BbW91bnQFAAAAD2ludGVybmFsQXNzZXRJZAIAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABkQAAAAIFAAAADlJFU0VSVkFUSU9OS0VZBQAAAA9pbnRlcm5hbEFzc2V0SWQJAQAAABVpbmNyZWFzZVJlc2VydmVBbW91bnQAAAACBQAAAAl3aW5BbW91bnQFAAAAD2ludGVybmFsQXNzZXRJZAkABEwAAAACCQEAAAAMaW5jcmVtZW50SW50AAAAAQUAAAAPR0FNRVNDT1VOVEVSS0VZCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAABmdhbWVJZAUAAAAIZ2FtZURhdGEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAGU0VSVkVSBQAAAApjb21taXNzaW9uCAUAAAAGZmVlUG10AAAAB2Fzc2V0SWQFAAAAA25pbAAAAAFpAQAAAAh3aXRoZHJhdwAAAAIAAAAGZ2FtZUlkAAAAB3JzYVNpZ24EAAAACGdhbWVEYXRhCQEAAAAPZXh0cmFjdEdhbWVEYXRhAAAAAQUAAAAGZ2FtZUlkBAAAAAlnYW1lU3RhdGUJAAGRAAAAAgUAAAAIZ2FtZURhdGEFAAAADElkeEdhbWVTdGF0ZQQAAAAMcGxheWVyQ2hvaWNlCQABkQAAAAIFAAAACGdhbWVEYXRhBQAAAA9JZHhQbGF5ZXJDaG9pY2UEAAAADXN0YXJ0ZWRIZWlnaHQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhnYW1lRGF0YQUAAAAQSWR4U3RhcnRlZEhlaWdodAQAAAAJd2luQW1vdW50CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIZ2FtZURhdGEFAAAADElkeFdpbkFtb3VudAQAAAAHYXNzZXRJZAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGdhbWVEYXRhBQAAAApJZHhBc3NldElkBAAAAA5wbGF5ZXJQdWJLZXk1OAkAAZEAAAACBQAAAAhnYW1lRGF0YQUAAAARSWR4UGxheWVyUHViS2V5NTgEAAAADXBsYXllckFkZHJlc3MJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEJAAJZAAAAAQUAAAAOcGxheWVyUHViS2V5NTgDCQEAAAACIT0AAAACBQAAAAlnYW1lU3RhdGUFAAAADlNUQVRFU1VCTUlUVEVECQAAAgAAAAECAAAAJEludmFsaWQgZ2FtZSBzdGF0ZSBmb3IgcGFzc2VkIGdhbWVJZAMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAGU0VSVkVSCQAAAgAAAAECAAAAK1JlZ3VsYXIgd2l0aGRyYXcgY2FuIGJlIGRvbmUgYnkgc2VydmVyIG9ubHkEAAAADHdpbkJ5VGltZW91dAkAAGYAAAACCQAAZQAAAAIFAAAABmhlaWdodAUAAAANc3RhcnRlZEhlaWdodAUAAAATUkFORE9SQUNMRVRJTUVGUkFNRQQAAAAKcmFuZENob2lzZQMFAAAADHdpbkJ5VGltZW91dAkAAS8AAAACBQAAAAxwbGF5ZXJDaG9pY2UAAAAAAAAAAAEJAQAAABJnZW5lcmF0ZVJhbmRDaG9pc2UAAAACBQAAAAZnYW1lSWQFAAAAB3JzYVNpZ24EAAAACXBsYXllcldpbgkBAAAAC2lzUGxheWVyV2luAAAAAgUAAAAMcGxheWVyQ2hvaWNlBQAAAApyYW5kQ2hvaXNlBAAAAA1uZXdHYW1lU3RhdHVzAwUAAAAJcGxheWVyV2luBQAAAAhTVEFURVdPTgUAAAAJU1RBVEVMT1NUBAAAAAtuZXdHYW1lRGF0YQkBAAAADmZpbmlzaEdhbWVEYXRhAAAABAUAAAAIZ2FtZURhdGEFAAAADW5ld0dhbWVTdGF0dXMFAAAACnJhbmRDaG9pc2UFAAAADHdpbkJ5VGltZW91dAkABE4AAAACCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAABmdhbWVJZAUAAAALbmV3R2FtZURhdGEJAARMAAAAAgkBAAAAFmRlY3JlYXNlUmVzZXJ2ZWRBbW91bnQAAAADBQAAAAZnYW1lSWQFAAAAB2Fzc2V0SWQFAAAACXdpbkFtb3VudAUAAAADbmlsAwUAAAAJcGxheWVyV2luCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAADXBsYXllckFkZHJlc3MFAAAACXdpbkFtb3VudAkAAZEAAAACBQAAAAZBU1NFVFMFAAAAB2Fzc2V0SWQFAAAAA25pbAUAAAADbmlsAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5BAAAAAckbWF0Y2gwBQAAAAJ0eAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAATVHJhbnNmZXJUcmFuc2FjdGlvbgQAAAADdHR4BQAAAAckbWF0Y2gwBAAAAAdhc3NldElkCQEAAAAVdmFsaWRhdGVBbmRHZXRBc3NldElkAAAAAQgFAAAAA3R0eAAAAAdhc3NldElkCQAAZwAAAAIJAABlAAAAAgkBAAAAD2dldEFzc2V0QmFsYW5jZQAAAAEIBQAAAAN0dHgAAAAHYXNzZXRJZAgFAAAAA3R0eAAAAAZhbW91bnQJAQAAAAhnZXRJbnRPcgAAAAIJAAGRAAAAAgUAAAAOUkVTRVJWQVRJT05LRVkFAAAAB2Fzc2V0SWQAAAAAAAAAAAADCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAFFNldFNjcmlwdFRyYW5zYWN0aW9uBAAAAANzdHgFAAAAByRtYXRjaDADCQAAAAAAAAIJAQAAAAhnZXRJbnRPcgAAAAIJAAGRAAAAAgUAAAAOUkVTRVJWQVRJT05LRVkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAAAgkBAAAACGdldEludE9yAAAAAgkAAZEAAAACBQAAAA5SRVNFUlZBVElPTktFWQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAcHB2nIf1g=", "chainId": 84, "height": 1643207, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 7obcaRZQW8VdVGVUP8Nt51F6MBEbVWGTfauVj2B7eTyk Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 4 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let WAVESD = 100000000 | |
5 | + | ||
6 | + | let USDND = 1000000 | |
7 | + | ||
8 | + | let EGGD = 100 | |
9 | + | ||
10 | + | let DECIMALS = [WAVESD, USDND, EGGD] | |
11 | + | ||
12 | + | let ASSETS = [unit, fromBase58String("25FEqEjRkqK6yCkiT7Lz6SAYz7gUFCtxfCChnrVFD5AT"), fromBase58String("HsEwWuuQjUohrX26Fx8tg5eiL4LDD7um6jqNqFgERx6g")] | |
13 | + | ||
14 | + | let BETDIVIDERS = [1, 1, 100] | |
15 | + | ||
16 | + | let MINFEEWAVES = ((5 * WAVESD) / 1000) | |
17 | + | ||
18 | + | let BET1 = 1 | |
19 | + | ||
20 | + | let BET2 = 2 | |
21 | + | ||
22 | + | let BET4 = 4 | |
23 | + | ||
24 | + | let BET8 = 8 | |
25 | + | ||
26 | + | let BET14 = 14 | |
27 | + | ||
28 | + | let RATEMULT = 10000 | |
29 | + | ||
30 | + | let RATE1 = 39655 | |
31 | + | ||
32 | + | let RATE2 = 24600 | |
33 | + | ||
34 | + | let RATE3 = 19000 | |
35 | + | ||
36 | + | let RATE4 = 14200 | |
37 | + | ||
38 | + | let RATE5 = 11400 | |
39 | + | ||
40 | + | let RATES = [RATE1, RATE2, RATE3, RATE4, RATE5] | |
41 | + | ||
42 | + | let BETS = [BET1, BET2, BET4, BET8, BET14] | |
43 | + | ||
44 | + | let IdxGameState = 0 | |
45 | + | ||
46 | + | let IdxPlayerChoice = 1 | |
47 | + | ||
48 | + | let IdxPlayerPubKey58 = 2 | |
49 | + | ||
50 | + | let IdxStartedHeight = 3 | |
51 | + | ||
52 | + | let IdxWinAmount = 4 | |
53 | + | ||
54 | + | let IdxAssetId = 5 | |
55 | + | ||
56 | + | let RESERVATIONKEY = ["$RESERVED_AMOUNT_WAVES", "$RESERVED_AMOUNT_USDN"] | |
57 | + | ||
58 | + | let GAMESCOUNTERKEY = "$GAME_NUM" | |
59 | + | ||
60 | + | let RSAPUBLIC64KEY = "$RSA_PUBLIC64" | |
61 | + | ||
62 | + | let SERVERADDRESSKEY = "$BENZ_ADDRESS" | |
63 | + | ||
64 | + | let RANDTIMEFRAMEKEY = "$RAND_ORACLE_TIMEFRAME" | |
65 | + | ||
66 | + | let STATESUBMITTED = "SUBMITTED" | |
67 | + | ||
68 | + | let STATEWON = "WON" | |
69 | + | ||
70 | + | let STATELOST = "LOST" | |
71 | + | ||
72 | + | func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (key + " key is not specified in this.state")) | |
73 | + | ||
74 | + | ||
75 | + | let RSAPUBLIC = fromBase64String(getStringOrFail(RSAPUBLIC64KEY)) | |
76 | + | ||
77 | + | let SERVER = addressFromStringValue(getStringOrFail(SERVERADDRESSKEY)) | |
78 | + | ||
79 | + | let RANDORACLETIMEFRAME = valueOrElse(getInteger(this, RANDTIMEFRAMEKEY), 7200) | |
80 | + | ||
81 | + | func getIntOr (key,default) = if (isDefined(getInteger(this, key))) | |
82 | + | then getIntegerValue(this, key) | |
83 | + | else default | |
84 | + | ||
85 | + | ||
86 | + | func setInt (key,value) = IntegerEntry(key, value) | |
87 | + | ||
88 | + | ||
89 | + | func incrementInt (key) = setInt(key, (getIntOr(key, -1) + 1)) | |
90 | + | ||
91 | + | ||
92 | + | func changeInt (key,by) = setInt(key, (getIntOr(key, 0) + by)) | |
93 | + | ||
94 | + | ||
95 | + | func getAssetBalance (assetIdOrUnit) = match assetIdOrUnit { | |
96 | + | case assetId: ByteVector => | |
97 | + | assetBalance(this, assetId) | |
98 | + | case _ => | |
99 | + | wavesBalance(this).available | |
100 | + | } | |
101 | + | ||
102 | + | ||
103 | + | func increaseReserveAmount (winAmount,assetId) = { | |
104 | + | let newReservedAmount = (getIntOr(RESERVATIONKEY[assetId], 0) + winAmount) | |
105 | + | if ((newReservedAmount > getAssetBalance(ASSETS[assetId]))) | |
106 | + | then throw("Insufficient funds on Dice Roller account. Transaction was rejected for your safety.") | |
107 | + | else newReservedAmount | |
108 | + | } | |
109 | + | ||
110 | + | ||
111 | + | func decreaseReservedAmount (gameId,assetId,winAmount) = if ((0 > (getIntOr(RESERVATIONKEY[assetId], 0) - winAmount))) | |
112 | + | then throw("Invalid Dice Roller account state - reserved amount is less than 0") | |
113 | + | else changeInt(RESERVATIONKEY[assetId], -(winAmount)) | |
114 | + | ||
115 | + | ||
116 | + | func validateAndGetAssetId (assetId) = if ((assetId == ASSETS[0])) | |
117 | + | then 0 | |
118 | + | else if ((assetId == ASSETS[1])) | |
119 | + | then 1 | |
120 | + | else if ((assetId == ASSETS[2])) | |
121 | + | then 2 | |
122 | + | else throw("Invalid payment asset") | |
123 | + | ||
124 | + | ||
125 | + | func validateBetAndGetWinAmount (bet,internalAssetId,playerChoice) = { | |
126 | + | let dicesCount = size(playerChoice) | |
127 | + | func checkAmount (a,x) = if (a) | |
128 | + | then true | |
129 | + | else (bet == ((x * DECIMALS[internalAssetId]) / BETDIVIDERS[internalAssetId])) | |
130 | + | ||
131 | + | if (!({ | |
132 | + | let $l = BETS | |
133 | + | let $s = size($l) | |
134 | + | let $acc0 = false | |
135 | + | func 1 ($a,$i) = if (($i >= $s)) | |
136 | + | then $a | |
137 | + | else checkAmount($a, $l[$i]) | |
138 | + | ||
139 | + | func 2 ($a,$i) = if (($i >= $s)) | |
140 | + | then $a | |
141 | + | else throw("List size exceeds 5") | |
142 | + | ||
143 | + | 2(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5) | |
144 | + | })) | |
145 | + | then throw("Bet amount is not valid") | |
146 | + | else if ((parseInt(playerChoice) == unit)) | |
147 | + | then throw("Invalid player's choice") | |
148 | + | else if (if ((1 > dicesCount)) | |
149 | + | then true | |
150 | + | else (dicesCount > 5)) | |
151 | + | then throw("Invalid dices count in player's choice") | |
152 | + | else ((bet * RATES[(dicesCount - 1)]) / RATEMULT) | |
153 | + | } | |
154 | + | ||
155 | + | ||
156 | + | func generateRandChoise (gameId,rsaSign) = { | |
157 | + | let rsaSigValid = rsaVerify_16Kb(SHA256, toBytes(gameId), rsaSign, RSAPUBLIC) | |
158 | + | if (!(rsaSigValid)) | |
159 | + | then throw("Invalid RSA signature") | |
160 | + | else { | |
161 | + | let rand = (toInt(sha256(rsaSign)) % 6) | |
162 | + | let result = if ((0 > rand)) | |
163 | + | then (-1 * rand) | |
164 | + | else rand | |
165 | + | toString((result + 1)) | |
166 | + | } | |
167 | + | } | |
168 | + | ||
169 | + | ||
170 | + | func isPlayerWin (playerChoice,randChoise) = { | |
171 | + | let s = size(playerChoice) | |
172 | + | func check (a,x) = if (a) | |
173 | + | then true | |
174 | + | else if ((s >= x)) | |
175 | + | then (take(drop(playerChoice, (x - 1)), 1) == randChoise) | |
176 | + | else false | |
177 | + | ||
178 | + | let $l = [1, 2, 3, 4, 5] | |
179 | + | let $s = size($l) | |
180 | + | let $acc0 = false | |
181 | + | func 1 ($a,$i) = if (($i >= $s)) | |
182 | + | then $a | |
183 | + | else check($a, $l[$i]) | |
184 | + | ||
185 | + | func 2 ($a,$i) = if (($i >= $s)) | |
186 | + | then $a | |
187 | + | else throw("List size exceeds 5") | |
188 | + | ||
189 | + | 2(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5) | |
190 | + | } | |
191 | + | ||
192 | + | ||
193 | + | func formatGameDataS (gameStatus,playerChoice,playerPubKey58,startedHeight,winAmount,assetId,randOrEmpty) = makeString([gameStatus, playerChoice, playerPubKey58, startedHeight, winAmount, assetId, if ((randOrEmpty == "")) | |
194 | + | then "" | |
195 | + | else ("_" + randOrEmpty)], "_") | |
196 | + | ||
197 | + | ||
198 | + | func formatGameData (gameStatus,playerChoice,playerPubKey58,startedHeight,winAmount,assetId,randOrEmpty) = formatGameDataS(gameStatus, playerChoice, playerPubKey58, toString(startedHeight), toString(winAmount), toString(assetId), randOrEmpty) | |
199 | + | ||
200 | + | ||
201 | + | func finishGameData (origGameData,gameStatus,rand,winByTimeout) = { | |
202 | + | let finishGameData = formatGameDataS(gameStatus, origGameData[IdxPlayerChoice], origGameData[IdxPlayerPubKey58], origGameData[IdxStartedHeight], origGameData[IdxWinAmount], origGameData[IdxAssetId], rand) | |
203 | + | if (winByTimeout) | |
204 | + | then (finishGameData + "_TIMEOUT") | |
205 | + | else finishGameData | |
206 | + | } | |
207 | + | ||
208 | + | ||
209 | + | func extractGameData (gameId) = split(match getString(this, gameId) { | |
210 | + | case str: String => | |
211 | + | str | |
212 | + | case _ => | |
213 | + | throw((("Game: " + gameId) + " not found.")) | |
214 | + | }, "_") | |
215 | + | ||
216 | + | ||
217 | + | @Callable(i) | |
218 | + | func bet (playerChoice) = { | |
219 | + | let gameId = toBase58String(i.transactionId) | |
220 | + | if ((1 >= size(i.payments))) | |
221 | + | then throw("2 payments must be attached") | |
222 | + | else if (isDefined(getString(this, gameId))) | |
223 | + | then throw((("Bet for: " + gameId) + " was already made.")) | |
224 | + | else { | |
225 | + | let betPmt = value(i.payments[0]) | |
226 | + | let feePmt = value(i.payments[1]) | |
227 | + | if (isDefined(feePmt.assetId)) | |
228 | + | then throw("feePmt (2nd payment) assetId must be in Waves") | |
229 | + | else if ((MINFEEWAVES > feePmt.amount)) | |
230 | + | then throw("feePmt (2nd payment) must be >= 0.005 Waves") | |
231 | + | else { | |
232 | + | let internalAssetId = validateAndGetAssetId(betPmt.assetId) | |
233 | + | let commission = feePmt.amount | |
234 | + | let winAmount = validateBetAndGetWinAmount(betPmt.amount, internalAssetId, playerChoice) | |
235 | + | let playerPubKey58 = toBase58String(i.callerPublicKey) | |
236 | + | let gameData = formatGameData(STATESUBMITTED, playerChoice, playerPubKey58, height, winAmount, internalAssetId, "") | |
237 | + | [IntegerEntry(RESERVATIONKEY[internalAssetId], increaseReserveAmount(winAmount, internalAssetId)), incrementInt(GAMESCOUNTERKEY), StringEntry(gameId, gameData), ScriptTransfer(SERVER, commission, feePmt.assetId)] | |
238 | + | } | |
239 | + | } | |
240 | + | } | |
241 | + | ||
242 | + | ||
243 | + | ||
244 | + | @Callable(i) | |
245 | + | func withdraw (gameId,rsaSign) = { | |
246 | + | let gameData = extractGameData(gameId) | |
247 | + | let gameState = gameData[IdxGameState] | |
248 | + | let playerChoice = gameData[IdxPlayerChoice] | |
249 | + | let startedHeight = parseIntValue(gameData[IdxStartedHeight]) | |
250 | + | let winAmount = parseIntValue(gameData[IdxWinAmount]) | |
251 | + | let assetId = parseIntValue(gameData[IdxAssetId]) | |
252 | + | let playerPubKey58 = gameData[IdxPlayerPubKey58] | |
253 | + | let playerAddress = addressFromPublicKey(fromBase58String(playerPubKey58)) | |
254 | + | if ((gameState != STATESUBMITTED)) | |
255 | + | then throw("Invalid game state for passed gameId") | |
256 | + | else if ((i.caller != SERVER)) | |
257 | + | then throw("Regular withdraw can be done by server only") | |
258 | + | else { | |
259 | + | let winByTimeout = ((height - startedHeight) > RANDORACLETIMEFRAME) | |
260 | + | let randChoise = if (winByTimeout) | |
261 | + | then take(playerChoice, 1) | |
262 | + | else generateRandChoise(gameId, rsaSign) | |
263 | + | let playerWin = isPlayerWin(playerChoice, randChoise) | |
264 | + | let newGameStatus = if (playerWin) | |
265 | + | then STATEWON | |
266 | + | else STATELOST | |
267 | + | let newGameData = finishGameData(gameData, newGameStatus, randChoise, winByTimeout) | |
268 | + | ([StringEntry(gameId, newGameData), decreaseReservedAmount(gameId, assetId, winAmount)] ++ (if (playerWin) | |
269 | + | then [ScriptTransfer(playerAddress, winAmount, ASSETS[assetId])] | |
270 | + | else nil)) | |
271 | + | } | |
272 | + | } | |
273 | + | ||
274 | + | ||
275 | + | @Verifier(tx) | |
276 | + | func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)) | |
277 | + | then match tx { | |
278 | + | case ttx: TransferTransaction => | |
279 | + | let assetId = validateAndGetAssetId(ttx.assetId) | |
280 | + | ((getAssetBalance(ttx.assetId) - ttx.amount) >= getIntOr(RESERVATIONKEY[assetId], 0)) | |
281 | + | case stx: SetScriptTransaction => | |
282 | + | if ((getIntOr(RESERVATIONKEY[0], 0) == 0)) | |
283 | + | then (getIntOr(RESERVATIONKEY[1], 0) == 0) | |
284 | + | else false | |
285 | + | case _ => | |
286 | + | false | |
287 | + | } | |
288 | + | else false | |
289 | + |
github/deemru/w8io/169f3d6 19.90 ms ◑