tx · 3FzrAWyk9eU6yGisf4YKapaf5ZzDKtt2yd4a9ZhtZRLy

3MwwjunorC2aAiHETPpC43VPAcBEX7kFGFT:  -0.01400000 Waves

2019.07.20 16:55 [594328] smart account 3MwwjunorC2aAiHETPpC43VPAcBEX7kFGFT > SELF 0.00000000 Waves

{ "type": 13, "id": "3FzrAWyk9eU6yGisf4YKapaf5ZzDKtt2yd4a9ZhtZRLy", "fee": 1400000, "feeAssetId": null, "timestamp": 1563631042481, "version": 1, "sender": "3MwwjunorC2aAiHETPpC43VPAcBEX7kFGFT", "senderPublicKey": "EXzRUBMhcmZ8qxjSu1oy26eo6d3oKbrcYQo8GzGbCgtn", "proofs": [ "51e9TwbErKJDvgUdzX5WVMKruXZaekcDznTZgENCAuzZvQ5FV4KxHXEZoxe71qP6K7eXQMBJuTnpQVQfgkdK2LQP" ], "script": "base64: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AAAADnVuc3BlbnRBZ2FpbnN0CQEAAAAKZ2V0VW5zcGVudAAAAAEFAAAACmJldEFnYWluc3QEAAAADW1heEZvck5vbWluYWwFAAAACnVuc3BlbnRGb3IEAAAAEW1heEFnYWluc3ROb21pbmFsCQAAaQAAAAIJAABoAAAAAgUAAAAOdW5zcGVudEFnYWluc3QAAAAAAAAAAGQFAAAABG9kZHMEAAAADG1hdGNoTm9taW5hbAMJAABmAAAAAgUAAAANbWF4Rm9yTm9taW5hbAUAAAARbWF4QWdhaW5zdE5vbWluYWwFAAAAEW1heEFnYWluc3ROb21pbmFsBQAAAA1tYXhGb3JOb21pbmFsAwkAAGYAAAACBQAAAA9taW5NYXRjaE5vbWluYWwFAAAADG1hdGNoTm9taW5hbAkAAAIAAAABAgAAABVtYXRjaCBub21pbmFsIHRvbyBsb3cEAAAACHNwZW5kRm9yBQAAAAxtYXRjaE5vbWluYWwEAAAADHNwZW5kQWdhaW5zdAkAAGkAAAACCQAAaAAAAAIFAAAADG1hdGNoTm9taW5hbAUAAAAEb2RkcwAAAAAAAAAAZAQAAAALbmV3U3BlbnRGb3IJAABkAAAAAgUAAAAIc3BlbmRGb3IFAAAACnVuc3BlbnRGb3IEAAAAD25ld1NwZW50QWdhaW5zdAkAAGQAAAACBQAAAAxzcGVuZEFnYWluc3QFAAAADnVuc3BlbnRBZ2FpbnN0AwkAAGYAAAACBQAAAAtuZXdTcGVudEZvcgkBAAAAB2V4dHJhY3QAAAABCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAGYmV0Rm9yAgAAAAdfYW1vdW50CQAAAgAAAAECAAAADWludmFsaWQgbWF0Y2gDCQAAZgAAAAIFAAAAD25ld1NwZW50QWdhaW5zdAkBAAAAB2V4dHJhY3QAAAABCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAKYmV0QWdhaW5zdAIAAAAHX2Ftb3VudAkAAAIAAAABAgAAAA1pbnZhbGlkIG1hdGNoCQEAAAAIcmVwYXlGZWUAAAADBQAAAAFpCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAAB21hdGNoaWQCAAAABmFtb3Vu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", "chainId": 84, "height": 594328, "spentComplexity": 0 } View: original | compacted Prev: none Next: DftZ64mSyxyBrsHp98tVdpzU5HFrX8pG4acLNWqicAYE Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 3 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let betAssetId = base58'AcTzTgW1QbJK4Qu6hCsUCLjpxUyD3dofv8xq2CAPbzKJ'
5+
6+let maxFee = 5000000
7+
8+let minBet = 5000000
9+
10+let minMatchNominal = 5000000
11+
12+func checkFee (i) = if ((i.fee > maxFee))
13+ then throw("unreasonable large fee")
14+ else if ((i.feeAssetId != unit))
15+ then throw("fee must be in WAVES")
16+ else true
17+
18+
19+func getTimestamp () = {
20+ let block = extract(blockInfoByHeight(height))
21+ toString(block.timestamp)
22+ }
23+
24+
25+func repayFee (i,ws,amount) = if (checkFee(i))
26+ then ScriptResult(ws, TransferSet([ScriptTransfer(i.caller, i.fee, unit)]))
27+ else throw("error")
28+
29+
30+func checkOwner (i,betid) = (getString(this, (betid + "_owner")) == toBase58String(i.caller.bytes))
31+
32+
33+func getUnspent (betid) = (extract(getInteger(this, (betid + "_amount"))) - extract(getInteger(this, (betid + "_spent"))))
34+
35+
36+func isDefeated (betid) = {
37+ let defeatStatus = getInteger(this, (betid + "_defeat"))
38+ if ((defeatStatus == 1))
39+ then true
40+ else (defeatStatus == 3)
41+ }
42+
43+
44+@Callable(i)
45+func bet (event,subevent,side,odds) = {
46+ let owner = toBase58String(i.caller.bytes)
47+ let payment = extract(i.payment)
48+ if ((payment.assetId != betAssetId))
49+ then throw(("bet must be in asset " + toBase58String(betAssetId)))
50+ else if ((minBet > payment.amount))
51+ then throw(("minimum allowed bet is " + toString(minBet)))
52+ else if (if ((side != "for"))
53+ then (side != "against")
54+ else false)
55+ then throw("unexpected side")
56+ else {
57+ let betid = (((("bet_" + event) + "_") + toBase58String(i.transactionId)) + "_")
58+ repayFee(i, WriteSet([DataEntry((betid + "owner"), owner), DataEntry((betid + "event"), event), DataEntry((betid + "subevent"), subevent), DataEntry((betid + "side"), side), DataEntry((betid + "odds"), odds), DataEntry((betid + "amount"), payment.amount), DataEntry((betid + "spent"), 0)]), 0)
59+ }
60+ }
61+
62+
63+
64+@Callable(i)
65+func cancel (betid) = if (!(checkOwner(i, betid)))
66+ then throw("permission denied")
67+ else {
68+ let amount = extract(getInteger(this, (betid + "_amount")))
69+ let spent = extract(getInteger(this, (betid + "_spent")))
70+ let cancelAmount = (amount - spent)
71+ repayFee(i, WriteSet([DataEntry((betid + "_spent"), amount), DataEntry((betid + "_cancel_amount"), cancelAmount)]), cancelAmount)
72+ }
73+
74+
75+
76+@Callable(i)
77+func betMatch (betFor,betAgainst) = if ((getString(this, (betFor + "_event")) != getString(this, (betAgainst + "_event"))))
78+ then throw("event id must match")
79+ else if ((getString(this, (betFor + "_subevent")) != getString(this, (betAgainst + "_subevent"))))
80+ then throw("subevent id must match")
81+ else if ((getString(this, (betFor + "_side")) != "for"))
82+ then throw("invalid *for* bet")
83+ else if ((getString(this, (betAgainst + "_side")) != "against"))
84+ then throw("invalid *against* bet")
85+ else {
86+ let eventid = extract(getString(this, (betFor + "_event")))
87+ let matchid = (((((((("match_" + betFor) + "_") + betAgainst) + "_") + eventid) + "_") + toBase58String(i.transactionId)) + "_")
88+ let odds = extract(getInteger(this, (betFor + "_odds")))
89+ let unspentFor = getUnspent(betFor)
90+ let unspentAgainst = getUnspent(betAgainst)
91+ let maxForNominal = unspentFor
92+ let maxAgainstNominal = ((unspentAgainst * 100) / odds)
93+ let matchNominal = if ((maxForNominal > maxAgainstNominal))
94+ then maxAgainstNominal
95+ else maxForNominal
96+ if ((minMatchNominal > matchNominal))
97+ then throw("match nominal too low")
98+ else {
99+ let spendFor = matchNominal
100+ let spendAgainst = ((matchNominal * odds) / 100)
101+ let newSpentFor = (spendFor + unspentFor)
102+ let newSpentAgainst = (spendAgainst + unspentAgainst)
103+ if ((newSpentFor > extract(getInteger(this, (betFor + "_amount")))))
104+ then throw("invalid match")
105+ else if ((newSpentAgainst > extract(getInteger(this, (betAgainst + "_amount")))))
106+ then throw("invalid match")
107+ else repayFee(i, WriteSet([DataEntry((matchid + "amount"), (spendFor + spendAgainst)), DataEntry((matchid + "for"), betFor), DataEntry((matchid + "against"), betAgainst), DataEntry((betFor + "_spent"), newSpentFor), DataEntry((betAgainst + "_spent"), newSpentAgainst)]), 0)
108+ }
109+ }
110+
111+
112+
113+@Callable(i)
114+func approveDefeat (betId,defeat) = if (if (isDefined(getInteger(this, (betId + "_defeat"))))
115+ then (defeat == 2)
116+ else false)
117+ then throw("can't dispute after approve")
118+ else repayFee(i, WriteSet([DataEntry((betId + "_defeat"), defeat)]), 0)
119+
120+
121+
122+@Callable(i)
123+func payWinner (matchId) = if (isDefined(getInteger(this, (matchId + "_paid"))))
124+ then throw("already paid")
125+ else {
126+ let betForId = extract(getString(this, (matchId + "_for")))
127+ let betAgainstId = extract(getString(this, (matchId + "_against")))
128+ let betForDefeated = isDefeated(betForId)
129+ let betAgainstDefeated = isDefeated(betAgainstId)
130+ if (if (!(betForDefeated))
131+ then !(betAgainstDefeated)
132+ else false)
133+ then throw("no side approved defeat")
134+ else {
135+ let winnerId = if (betForDefeated)
136+ then betAgainstId
137+ else betForId
138+ let winnerAddress = getString(this, (winnerId + "_owner"))
139+ if ((winnerAddress != toBase58String(i.caller.bytes)))
140+ then throw("paywinner() should be called by winner only")
141+ else {
142+ let amount = extract(getInteger(this, (matchId + "_amount")))
143+ repayFee(i, WriteSet([DataEntry((matchId + "_paid"), amount)]), amount)
144+ }
145+ }
146+ }
147+
148+

github/deemru/w8io/169f3d6 
19.77 ms