tx · 2bymUMbeiD31XfHwj4NbTPgDuJhbKgkhLkAbvbUrnjab

3N6hQF6HBBQ5JCKB8Xs17Q61wkG3VrLvbGd:  -0.01000000 Waves

2021.11.13 02:55 [1788474] smart account 3N6hQF6HBBQ5JCKB8Xs17Q61wkG3VrLvbGd > SELF 0.00000000 Waves

{ "type": 13, "id": "2bymUMbeiD31XfHwj4NbTPgDuJhbKgkhLkAbvbUrnjab", "fee": 1000000, "feeAssetId": null, "timestamp": 1636761356550, "version": 2, "chainId": 84, "sender": "3N6hQF6HBBQ5JCKB8Xs17Q61wkG3VrLvbGd", "senderPublicKey": "7Hi4o6vBstRs79NMVMjEove52dmP87RAcvNDAXN8C4Wi", "proofs": [ "5YSeX1n6ornVJmStM2V3JEHmGSAKmZHBMgqjf1rA3LqXKCwLtmbZWzERa9Qg3D1Au7Womt1K7pbA4XKbFGXE7zfh" ], "script": "base64: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YXRvcgkBAAAAF2dldFByZXZpb3VzUmFuZG9tTnVtYmVyAAAAAQUAAAANY2FsbGVyQWRkcmVzcwkAAZAAAAABBQAAAAZhdkRlY2sEAAAACmNhcmRQbGF5ZXIJAAGRAAAAAgUAAAAGYXZEZWNrCQAAagAAAAIFAAAAEmNhcmRQb3NpdGlvblBsYXllcgkAAZAAAAABBQAAAAZhdkRlY2sEAAAAB2F2RGVjazEJAARRAAAAAgUAAAAGYXZEZWNrCQAAagAAAAIFAAAAEmNhcmRQb3NpdGlvblBsYXllcgkAAZAAAAABBQAAAAZhdkRlY2sEAAAAB2F2RGVjazIJAQAAAAdnZXREZWNrAAAAAQUAAAAHYXZEZWNrMQQAAAASY2FyZFBvc2l0aW9uT3JhY2xlCQEAAAAPZ2V0UmFuZG9tTnVtYmVyAAAAAwkAASwAAAACBQAAAAVtZUtleQkABLkAAAACBQAAAAdhdkRlY2syBQAAAAlzZXBhcmF0b3IJAQAAABdnZXRQcmV2aW91c1JhbmRvbU51bWJlcgAAAAEFAAAADWNhbGxlckFkZHJlc3MJAAGQAAAAAQUAAAAHYXZEZWNrMgQAAAAKY2FyZE9yYWNsZQkAAZEAAAACBQAAAAdhdkRlY2syCQAAagAAAAIFAAAAEmNhcmRQb3NpdGlvbk9yYWNsZQkAAZAAAAABBQAAAAdhdkRlY2syBAAAAAdhdkRlY2szCQAEUQAAAAIFAAAAB2F2RGVjazIJAABqAAAAAgUAAAASY2FyZFBvc2l0aW9uUGxheWVyCQABkAAAAAEFAAAAB2F2RGVjazIDCQAAAAAAAAIJAQAAAAxnZXRDYXJkVmFsdWUAAAABBQAAAApjYXJkUGxheWVyCQEAAAAMZ2V0Q2FyZFZhbHVlAAAAAQUAAAAKY2FyZE9yYWNsZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAAVtZUtleQIAAAANX2RyYXdTZXF1ZW5jZQkAAGQAAAACBQAAAAxjdXJyZW50RHJhd3MAAAAAAAAAAAEFAAAAA25pbAQAAAAGd2lubmVyCQEAAAAJZ2V0V2lubmVyAAAABAUAAAAKY2FyZFBsYXllcgUAAAAKY2FyZE9yYWNsZQUAAAANY2FsbGVyQWRkcmVzcwUAAAAGb3JhY2xlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgUAAAAFbWVLZXkCAAAAB193aW5uZXIFAAAABndpbm5lcgUAAAADbmlsAAAAAWkBAAAACHdpdGhkcmF3AAAAAQAAAAVyb3VuZAQAAAANY2FsbGVyQWRkcmVzcwkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAVtZUtleQkAASwAAAACCQABLAAAAAIFAAAABXJvdW5kAgAAAAFfBQAAAA1jYWxsZXJBZGRyZXNzBAAAAAt3aXRoZHJhd0tleQkAASwAAAACBQAAAAVtZUtleQIAAAAJX3dpdGhkcmF3AwkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAEdGhpcwUAAAALd2l0aGRyYXdLZXkJAAACAAAAAQIAAAAfWW91IGhhdmUgYWxyZWFkeSBnb3QgeW91ciBwcml6ZQMJAQAAAAlpc0RlZmluZWQAAAABCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAFbWVLZXkCAAAADV9kcmF3U2VxdWVuY2UJAAACAAAAAQIAAAAhVGhlcmUgaXMgbm8gd2lubmVyLCBpdCB3YXMgYSBkcmF3AwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkABB0AAAACBQAAAAR0aGlzCQABLAAAAAIFAAAABW1lS2V5AgAAAAdfd2lubmVyCQAAAgAAAAECAAAAElRoZXJlIGlzIG5vIHdpbm5lcgQAAAAGd2lubmVyCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAABW1lS2V5AgAAAAdfd2lubmVyBAAAAAljdXJTdW1CZXQJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAFbWVLZXkCAAAACF9zdW1CZXRzAwkAAAAAAAACBQAAAAljdXJTdW1CZXQAAAAAAAAAAAAJAAACAAAAAQIAAAAaWW91IHdvbiBub3RoaW5nIHRoaXMgcm91bmQDCQAAAAAAAAIFAAAABndpbm5lcgUAAAANY2FsbGVyQWRkcmVzcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAt3aXRoZHJhd0tleQkAAaQAAAABBQAAAAljdXJTdW1CZXQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAljdXJTdW1CZXQFAAAABHVuaXQFAAAAA25pbAkAAAIAAAABAgAAABZZb3UgYXJlIG5vdCB0aGUgd2lubmVyAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkhR6Hp", "height": 1788474, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: E4R8Z8aZ6BHTn1pFVdS4SxmzPuMM14zUS6zPVQGo6DXX Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 5 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let oracle = "3MtaCL4v1bjTabUqs7oU4ofS8fbai34WM1i"
5+
6+let WAVES = 1000000000
7+
8+let maxBet = (100 * WAVES)
9+
10+let separator = ","
11+
12+func getNewDeck () = ["01C", "02C", "03C", "04C", "05C", "06C", "07C", "08C", "09C", "10C", "11C", "12C", "13C", "01D", "02D", "03D", "04D", "05D", "06D", "07D", "08D", "09D", "10D", "11D", "12D", "13D", "01H", "02H", "03H", "04H", "05H", "06H", "07H", "08H", "09H", "10H", "11H", "12H", "13H", "01S", "02S", "03S", "04S", "05S", "06S", "07S", "08S", "09S", "10S", "11S", "12S", "13S"]
13+
14+
15+func getDeck (deck) = if ((0 >= size(deck)))
16+ then getNewDeck()
17+ else deck
18+
19+
20+func getRandomNumber (salt1,salt2,answersCount) = {
21+ let hash = sha256(toBytes((salt1 + salt2)))
22+ let index = toInt(hash)
23+ let rand = (index % answersCount)
24+ if ((0 > rand))
25+ then ((-1 * rand) + 1)
26+ else (rand + 1)
27+ }
28+
29+
30+func getPreviousRandomNumber (address) = match getInteger(this, (address + "_LastRandonNumber")) {
31+ case n: Int =>
32+ toString(n)
33+ case _ =>
34+ address
35+}
36+
37+
38+func getAmountOrZero (this,key) = match getInteger(this, key) {
39+ case a: Int =>
40+ a
41+ case _ =>
42+ 0
43+}
44+
45+
46+func getPayment (i) = if ((size(i.payments) == 0))
47+ then throw("Payment must be attached")
48+ else {
49+ let pmt = i.payments[0]
50+ if (isDefined(pmt.assetId))
51+ then throw("This function accepts WAVES tokens only")
52+ else pmt.amount
53+ }
54+
55+
56+func getCardValue (stringCard) = parseIntValue(take(stringCard, 2))
57+
58+
59+func getWinner (cardPlayer,cardOracle,callerAddress,oracle) = {
60+ let p = getCardValue(cardPlayer)
61+ let o = getCardValue(cardOracle)
62+ if ((p > o))
63+ then callerAddress
64+ else oracle
65+ }
66+
67+
68+func getAvailableDeck (this,availableProp) = if (isDefined(getString(this, availableProp)))
69+ then {
70+ let stringDeck = getStringValue(this, availableProp)
71+ let deck = split(stringDeck, separator)
72+ if ((size(deck) == 0))
73+ then getNewDeck()
74+ else deck
75+ }
76+ else getNewDeck()
77+
78+
79+@Callable(i)
80+func bet (round) = {
81+ let callerAddress = toBase58String(i.caller.bytes)
82+ let meKey = ((round + "_") + callerAddress)
83+ let p = getPayment(i)
84+ let roundBetsKey = (meKey + "_sumBets")
85+ let curSumBets = getAmountOrZero(this, roundBetsKey)
86+ let currentDraws = match getInteger(this, (meKey + "_drawSequence")) {
87+ case a: Int =>
88+ (a + 1)
89+ case _ =>
90+ 0
91+ }
92+ let availableProp = (meKey + "_available")
93+ let newSumBets = (curSumBets + p)
94+ if (if (isDefined(getBoolean(this, (round + "_stop"))))
95+ then true
96+ else isDefined(getString(this, round)))
97+ then throw("This round is already played")
98+ else if ((newSumBets > maxBet))
99+ then throw(((("Maximum amount of bets for round " + toString(maxBet)) + ". With your bet it's ") + toString(newSumBets)))
100+ else {
101+ let avDeck = getAvailableDeck(this, availableProp)
102+ let cardPositionPlayer = getRandomNumber((meKey + makeString(avDeck, separator)), getPreviousRandomNumber(callerAddress), size(avDeck))
103+ let cardPlayer = avDeck[(cardPositionPlayer % size(avDeck))]
104+ let avDeck1 = removeByIndex(avDeck, (cardPositionPlayer % size(avDeck)))
105+ let avDeck2 = getDeck(avDeck1)
106+ let cardPositionOracle = getRandomNumber((meKey + makeString(avDeck2, separator)), getPreviousRandomNumber(callerAddress), size(avDeck2))
107+ let cardOracle = avDeck2[(cardPositionOracle % size(avDeck2))]
108+ let avDeck3 = removeByIndex(avDeck2, (cardPositionPlayer % size(avDeck2)))
109+ if ((getCardValue(cardPlayer) == getCardValue(cardOracle)))
110+ then [IntegerEntry((meKey + "_drawSequence"), (currentDraws + 1))]
111+ else {
112+ let winner = getWinner(cardPlayer, cardOracle, callerAddress, oracle)
113+[StringEntry((meKey + "_winner"), winner)]
114+ }
115+ }
116+ }
117+
118+
119+
120+@Callable(i)
121+func withdraw (round) = {
122+ let callerAddress = toBase58String(i.caller.bytes)
123+ let meKey = ((round + "_") + callerAddress)
124+ let withdrawKey = (meKey + "_withdraw")
125+ if (isDefined(getString(this, withdrawKey)))
126+ then throw("You have already got your prize")
127+ else if (isDefined(getInteger(this, (meKey + "_drawSequence"))))
128+ then throw("There is no winner, it was a draw")
129+ else if (!(isDefined(getString(this, (meKey + "_winner")))))
130+ then throw("There is no winner")
131+ else {
132+ let winner = getStringValue(this, (meKey + "_winner"))
133+ let curSumBet = getIntegerValue(this, (meKey + "_sumBets"))
134+ if ((curSumBet == 0))
135+ then throw("You won nothing this round")
136+ else if ((winner == callerAddress))
137+ then [StringEntry(withdrawKey, toString(curSumBet)), ScriptTransfer(i.caller, curSumBet, unit)]
138+ else throw("You are not the winner")
139+ }
140+ }
141+
142+
143+@Verifier(tx)
144+func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
145+

github/deemru/w8io/169f3d6 
274.08 ms