tx · FZU3x2ej42T7QXdfRqysebUgF2r5VGBVpLpPLzyXRUCv 3NApQZND35BcskVdo5Ukk7gSyP1148wtktt: -0.01400000 Waves 2019.09.16 21:43 [679161] smart account 3NApQZND35BcskVdo5Ukk7gSyP1148wtktt > SELF 0.00000000 Waves
{ "type": 13, "id": "FZU3x2ej42T7QXdfRqysebUgF2r5VGBVpLpPLzyXRUCv", "fee": 1400000, "feeAssetId": null, "timestamp": 1568659370737, "version": 1, "sender": "3NApQZND35BcskVdo5Ukk7gSyP1148wtktt", "senderPublicKey": "Hf6mTifVmE4QjnGG5MrTpZxwegLPYVUkrUnGYGE1hrVh", "proofs": [ "21cpi2JLikX8UduJp2fzD6sK5TFMXJNkecNinB2YNAemXzfv9acQZjmsTLVAhLbhnjYP9KoRtgtSczKHeUJdU88R" ], "script": "base64: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ZWYzBQAAAAckbWF0Y2gyBAAAAAlpbmNMZXZlbDMJAABpAAAAAgkAAGgAAAACBQAAAAlyZWZBbW91bnQFAAAABmxldmVsMwAAAAAAAAAD6AkABEwAAAACCQEAAAAQYmFsYW5jZUluY3JlbWVudAAAAAIFAAAABHJlZjMFAAAACWluY0xldmVsMwkABEwAAAACCQEAAAAWcmVjb3JkQmFsYW5jZUluY3JlbWVudAAAAAYFAAAABHJlZjMFAAAADXdpbm5lckFkZHJlc3MFAAAACWluY0xldmVsMwIAAAACbDMFAAAABHR4aWQFAAAACXRpbWVzdGFtcAkABEwAAAACCQEAAAAQYmFsYW5jZUluY3JlbWVudAAAAAIFAAAADWNoYW5nZUFkZHJlc3MJAABlAAAAAgkAAGUAAAACCQAAZQAAAAIFAAAACXJlZkFtb3VudAUAAAAJaW5jTGV2ZWwxBQAAAAlpbmNMZXZlbDIFAAAACWluY0xldmVsMwkABEwAAAACCQEAAAAWcmVjb3JkQmFsYW5jZUluY3JlbWVudAAAAAYFAAAADWNoYW5nZUFkZHJlc3MFAAAADXdpbm5lckFkZHJlc3MJAABlAAAAAgkAAGUAAAACCQAAZQAAAAIFAAAACXJlZkFtb3VudAUAAAAJaW5jTGV2ZWwxBQAAAAlpbmNMZXZlbDIFAAAACWluY0xldmVsMwIAAAAGY2hhbmdlBQAAAAR0eGlkBQAAAAl0aW1lc3RhbXAFAAAAA25pbAkABEwAAAACCQEAAAAQYmFsYW5jZUluY3JlbWVudAAAAAIFAAAADWNoYW5nZUFkZHJlc3MJAABlAAAAAgkAAGUAAAACBQAAAAlyZWZBbW91bnQFAAAACWluY0xldmVsMQUAAAAJaW5jTGV2ZWwyCQAETAAAAAIJAQAAABZyZWNvcmRCYWxhbmNlSW5jcmVtZW50AAAABgUAAAANY2hhbmdlQWRkcmVzcwUAAAANd2lubmVyQWRkcmVzcwkAAGUAAAACCQAAZQAAAAIFAAAACXJlZkFtb3VudAUAAAAJaW5jTGV2ZWwxBQAAAAlpbmNMZXZlbDICAAAABmNoYW5nZQUAAAAEdHhpZAUAAAAJdGltZXN0YW1wBQAAAANuaWwJAARMAAAAAgkBAAAAEGJhbGFuY2VJbmNyZW1lbnQAAAACBQAAAA1jaGFuZ2VBZGRyZXNzCQAAZQAAAAIFAAAACXJlZkFtb3VudAUAAAAJaW5jTGV2ZWwxCQAETAAAAAIJAQAAABZyZWNvcmRCYWxhbmNlSW5jcmVtZW50AAAABgUAAAANY2hhbmdlQWRkcmVzcwUAAAANd2lubmVyQWRkcmVzcwkAAGUAAAACBQAAAAlyZWZBbW91bnQFAAAACWluY0xldmVsMQIAAAAGY2hhbmdlBQAAAAR0eGlkBQAAAAl0aW1lc3RhbXAFAAAAA25pbAkABEwAAAACCQEAAAAQYmFsYW5jZUluY3JlbWVudAAAAAIFAAAADWNoYW5nZUFkZHJlc3MFAAAACXJlZkFtb3VudAkABEwAAAACCQEAAAAWcmVjb3JkQmFsYW5jZUluY3JlbWVudAAAAAYFAAAADWNoYW5nZUFkZHJlc3MFAAAADXdpbm5lckFkZHJlc3MFAAAACXJlZkFtb3VudAIAAAAGY2hhbmdlBQAAAAR0eGlkBQAAAAl0aW1lc3RhbXAFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIIBQAAAAFpAAAAA2ZlZQUAAAAEdW5pdAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAADXdpbm5lckFkZHJlc3MJAABlAAAAAgUAAAAGYW1vdW50BQAAAAlyZWZBbW91bnQFAAAACmJldEFzc2V0SWQFAAAAA25pbAAAAAFpAQAAAAhkZWxlZ2F0ZQAAAAMAAAAKZGVsZWdhdGVUbwAAABFlbmFibGVBdXRvQXBwcm92ZQAAABBlbmFibGVBdXRvQ2FuY2VsCQEAAAAIcmVwYXlGZWUAAAAFBQAAAAFpCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAJZGVsZWdhdGVfBQAAAApkZWxlZ2F0ZVRvAgAAAAhfYWRkcmVzcwkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzCQAETAAAAAIJAQAAAAlEYXRhRW50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", "chainId": 84, "height": 679161, "spentComplexity": 0 } View: original | compacted Prev: 9EduTHtEjczMrDzN1FyDBGVk7JUNR3VVbw7xYQ7oA9hE Next: C6ewsMT7WfdUNprYC6VAsc3zEig2n4r8vr1W9ygnU3SH Diff:
Old | New | Differences | |
---|---|---|---|
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let a = [DataEntry("sportr", "AcTzTgW1QbJK4Qu6hCsUCLjpxUyD3dofv8xq2CAPbzKJ"), DataEntry("dex", "WAVES")] | |
5 | 5 | ||
6 | - | let b = | |
6 | + | let b = addressFromStringValue("") | |
7 | 7 | ||
8 | 8 | let c = 5000000 | |
9 | 9 | ||
10 | - | let d = | |
10 | + | let d = 5000000 | |
11 | 11 | ||
12 | - | let e = | |
12 | + | let e = 30000000 | |
13 | 13 | ||
14 | - | let f = | |
14 | + | let f = 5000000 | |
15 | 15 | ||
16 | - | let g = | |
16 | + | let g = ((1000 * 60) * 5) | |
17 | 17 | ||
18 | - | let h = | |
18 | + | let h = 250 | |
19 | 19 | ||
20 | - | let i = | |
20 | + | let i = 150 | |
21 | 21 | ||
22 | - | let j = | |
22 | + | let j = 100 | |
23 | 23 | ||
24 | - | let k = | |
24 | + | let k = 500 | |
25 | 25 | ||
26 | - | let l = | |
26 | + | let l = 10 | |
27 | 27 | ||
28 | - | func m (n,o) = { | |
29 | - | let p = toBase58String(n.caller.bytes) | |
30 | - | let q = ("delegate_" + p) | |
31 | - | if ((getBoolean(this, ((q + "_") + o)) == true)) | |
28 | + | let m = "3NAxsbHxS63azdAicVvLGsxjAQ9DsK6L4NL" | |
29 | + | ||
30 | + | let n = 1000000 | |
31 | + | ||
32 | + | func o (p,q) = { | |
33 | + | let r = toBase58String(p.caller.bytes) | |
34 | + | let s = ("delegate_" + r) | |
35 | + | if ((getBoolean(this, ((s + "_") + q)) == true)) | |
32 | 36 | then { | |
33 | - | let | |
34 | - | if ($isInstanceOf( | |
37 | + | let t = getString(this, (s + "_address")) | |
38 | + | if ($isInstanceOf(t, "String")) | |
35 | 39 | then { | |
36 | - | let | |
37 | - | | |
40 | + | let u = t | |
41 | + | u | |
38 | 42 | } | |
39 | - | else | |
43 | + | else r | |
40 | 44 | } | |
41 | - | else | |
45 | + | else r | |
42 | 46 | } | |
43 | 47 | ||
44 | 48 | ||
45 | - | func | |
49 | + | func v (p) = if ((p.fee > c)) | |
46 | 50 | then throw("unreasonable large fee") | |
47 | - | else if (( | |
51 | + | else if ((p.feeAssetId != unit)) | |
48 | 52 | then throw("fee must be in WAVES") | |
49 | 53 | else true | |
50 | 54 | ||
51 | 55 | ||
52 | - | func | |
53 | - | then if (if (( | |
54 | - | then isDefined( | |
56 | + | func w (p,x,y,z,A) = if (v(p)) | |
57 | + | then if (if ((y > 0)) | |
58 | + | then isDefined(z) | |
55 | 59 | else false) | |
56 | - | then ScriptResult( | |
57 | - | else ScriptResult( | |
60 | + | then ScriptResult(x, TransferSet([ScriptTransfer(p.caller, p.fee, unit), ScriptTransfer(extract(z), y, A)])) | |
61 | + | else ScriptResult(x, TransferSet([ScriptTransfer(p.caller, p.fee, unit)])) | |
58 | 62 | else throw("error") | |
59 | 63 | ||
60 | 64 | ||
61 | - | func | |
65 | + | func B (p,C) = (getString(this, (C + "_owner")) == toBase58String(p.caller.bytes)) | |
62 | 66 | ||
63 | 67 | ||
64 | - | func | |
68 | + | func D (C) = (extract(getInteger(this, (C + "_amount"))) - extract(getInteger(this, (C + "_spent")))) | |
65 | 69 | ||
66 | 70 | ||
67 | - | func | |
68 | - | let | |
69 | - | if (( | |
71 | + | func E (C) = { | |
72 | + | let F = getInteger(this, (C + "_defeat")) | |
73 | + | if ((F == 1)) | |
70 | 74 | then true | |
71 | - | else ( | |
75 | + | else (F == 3) | |
72 | 76 | } | |
73 | 77 | ||
74 | 78 | ||
75 | - | func | |
79 | + | func G (H) = getString(this, (H + "_referer")) | |
76 | 80 | ||
77 | 81 | ||
78 | - | func | |
79 | - | let | |
80 | - | DataEntry( | |
81 | - | let | |
82 | - | if ($isInstanceOf( | |
82 | + | func I (J,K) = { | |
83 | + | let L = (J + "_balance") | |
84 | + | DataEntry(L, (K + { | |
85 | + | let t = getInteger(this, L) | |
86 | + | if ($isInstanceOf(t, "Int")) | |
83 | 87 | then { | |
84 | - | let | |
85 | - | | |
88 | + | let M = t | |
89 | + | M | |
86 | 90 | } | |
87 | 91 | else 0 | |
88 | 92 | })) | |
89 | 93 | } | |
90 | 94 | ||
91 | 95 | ||
92 | - | func | |
96 | + | func N (J,O,K,P,Q,R) = DataEntry(((("fund_" + J) + "_") + Q), ((((((O + ":") + toString(K)) + ":") + P) + ":") + R)) | |
93 | 97 | ||
94 | 98 | ||
95 | - | func | |
96 | - | let | |
97 | - | if (( | |
99 | + | func S (T) = { | |
100 | + | let U = getStringValue(a, T) | |
101 | + | if ((U == "WAVES")) | |
98 | 102 | then unit | |
99 | - | else fromBase58String( | |
103 | + | else fromBase58String(U) | |
100 | 104 | } | |
101 | 105 | ||
102 | 106 | ||
103 | - | func | |
107 | + | func V (W) = if ((W == unit)) | |
104 | 108 | then "WAVES" | |
105 | - | else toBase58String(extract( | |
109 | + | else toBase58String(extract(W)) | |
106 | 110 | ||
107 | 111 | ||
108 | - | @Callable( | |
109 | - | func bet ( | |
110 | - | let | |
111 | - | let | |
112 | - | let | |
113 | - | let | |
114 | - | if (( | |
115 | - | then throw(((("bet must be in asset " + | |
116 | - | else if (( | |
117 | - | then throw(("minimum allowed bet is " + toString( | |
118 | - | else if (if (if (( | |
119 | - | then ( | |
112 | + | @Callable(p) | |
113 | + | func bet (X,Y,Z,aa,T) = { | |
114 | + | let ab = ("market_" + X) | |
115 | + | let A = S(T) | |
116 | + | let O = toBase58String(p.caller.bytes) | |
117 | + | let ac = extract(p.payment) | |
118 | + | if ((ac.assetId != A)) | |
119 | + | then throw(((("bet must be in asset " + V(A)) + " for adapter ") + T)) | |
120 | + | else if ((d > ac.amount)) | |
121 | + | then throw(("minimum allowed bet is " + toString(d))) | |
122 | + | else if (if (if ((T == "dex")) | |
123 | + | then (e > ac.amount) | |
120 | 124 | else false) | |
121 | - | then (getBoolean(this, | |
125 | + | then (getBoolean(this, ab) == unit) | |
122 | 126 | else false) | |
123 | - | then throw(("min amount to create first bet is " + toString( | |
124 | - | else if (if (( | |
125 | - | then ( | |
127 | + | then throw(("min amount to create first bet is " + toString(e))) | |
128 | + | else if (if ((Z != "for")) | |
129 | + | then (Z != "against") | |
126 | 130 | else false) | |
127 | 131 | then throw("unexpected side") | |
128 | 132 | else { | |
129 | - | let | |
130 | - | let | |
131 | - | let | |
132 | - | let | |
133 | - | if ($isInstanceOf( | |
133 | + | let C = (((((("bet_" + X) + "_") + toBase58String(p.caller.bytes)) + "_") + take(toBase58String(p.transactionId), 15)) + "_") | |
134 | + | let ad = ((("seq_" + X) + "_") + Y) | |
135 | + | let ae = { | |
136 | + | let t = getInteger(this, ad) | |
137 | + | if ($isInstanceOf(t, "Int")) | |
134 | 138 | then { | |
135 | - | let | |
136 | - | ( | |
139 | + | let af = t | |
140 | + | (af + 1) | |
137 | 141 | } | |
138 | 142 | else 1 | |
139 | 143 | } | |
140 | - | | |
144 | + | w(p, WriteSet([DataEntry((C + "owner"), O), DataEntry((C + "event"), X), DataEntry((C + "subevent"), Y), DataEntry((C + "side"), Z), DataEntry((C + "odds"), aa), DataEntry((C + "amount"), ac.amount), DataEntry((C + "spent"), 0), DataEntry((C + "adapter"), T), DataEntry((C + "timestamp"), lastBlock.timestamp), DataEntry((C + "sequence"), ae), DataEntry(ab, true), DataEntry(ad, ae)]), 0, unit, unit) | |
141 | 145 | } | |
142 | 146 | } | |
143 | 147 | ||
144 | 148 | ||
145 | 149 | ||
146 | - | @Callable( | |
147 | - | func cancel ( | |
150 | + | @Callable(p) | |
151 | + | func cancel (C) = if ((getString(this, (C + "_owner")) != o(p, "autocancel"))) | |
148 | 152 | then throw("must be owner or its delegate to cancel") | |
149 | 153 | else { | |
150 | - | let | |
151 | - | let | |
152 | - | let | |
153 | - | let | |
154 | - | | |
154 | + | let T = getStringValue(this, (C + "_adapter")) | |
155 | + | let y = getIntegerValue(this, (C + "_amount")) | |
156 | + | let ag = getIntegerValue(this, (C + "_spent")) | |
157 | + | let ah = (y - ag) | |
158 | + | w(p, WriteSet([DataEntry((C + "_spent"), y), DataEntry((C + "_cancel_amount"), ah), DataEntry((C + "_cancel_tx"), toBase58String(p.transactionId))]), ah, p.caller, S(T)) | |
155 | 159 | } | |
156 | 160 | ||
157 | 161 | ||
158 | 162 | ||
159 | - | @Callable( | |
160 | - | func betMatch ( | |
163 | + | @Callable(p) | |
164 | + | func betMatch (ai,aj) = if ((getString(this, (ai + "_event")) != getString(this, (aj + "_event")))) | |
161 | 165 | then throw("event id must match") | |
162 | - | else if ((getString(this, ( | |
166 | + | else if ((getString(this, (ai + "_subevent")) != getString(this, (aj + "_subevent")))) | |
163 | 167 | then throw("subevent id must match") | |
164 | - | else if ((getString(this, ( | |
168 | + | else if ((getString(this, (ai + "_side")) != "for")) | |
165 | 169 | then throw("invalid *for* bet") | |
166 | - | else if ((getString(this, ( | |
170 | + | else if ((getString(this, (aj + "_side")) != "against")) | |
167 | 171 | then throw("invalid *against* bet") | |
168 | 172 | else { | |
169 | - | let | |
170 | - | if (( | |
173 | + | let T = getStringValue(this, (ai + "_adapter")) | |
174 | + | if ((T != getStringValue(this, (aj + "_adapter")))) | |
171 | 175 | then throw("bets has different adapters") | |
172 | 176 | else { | |
173 | - | let | |
174 | - | let | |
175 | - | let | |
176 | - | let | |
177 | - | let | |
178 | - | let | |
179 | - | let | |
180 | - | let | |
181 | - | let | |
182 | - | let | |
183 | - | then | |
184 | - | else | |
185 | - | if (( | |
177 | + | let ak = getStringValue(this, (ai + "_owner")) | |
178 | + | let al = getStringValue(this, (aj + "_owner")) | |
179 | + | let am = extract(getString(this, (ai + "_event"))) | |
180 | + | let an = (((((((("match_" + am) + "_") + takeRight(ak, 10)) + "_") + takeRight(al, 10)) + "_") + takeRight(toBase58String(p.transactionId), 10)) + "_") | |
181 | + | let aa = extract(getInteger(this, (ai + "_odds"))) | |
182 | + | let ao = D(ai) | |
183 | + | let ap = D(aj) | |
184 | + | let aq = ao | |
185 | + | let ar = ((ap * 100) / (aa - 100)) | |
186 | + | let as = if ((aq > ar)) | |
187 | + | then ar | |
188 | + | else aq | |
189 | + | if ((f > as)) | |
186 | 190 | then throw("match nominal too low") | |
187 | 191 | else { | |
188 | - | let | |
189 | - | let | |
190 | - | let | |
191 | - | let | |
192 | - | if (( | |
192 | + | let at = as | |
193 | + | let au = ((as * (aa - 100)) / 100) | |
194 | + | let av = (at + extract(getInteger(this, (ai + "_spent")))) | |
195 | + | let aw = (au + extract(getInteger(this, (aj + "_spent")))) | |
196 | + | if ((av > extract(getInteger(this, (ai + "_amount"))))) | |
193 | 197 | then throw("invalid match") | |
194 | - | else if (( | |
198 | + | else if ((aw > extract(getInteger(this, (aj + "_amount"))))) | |
195 | 199 | then throw("invalid match") | |
196 | - | else | |
200 | + | else w(p, WriteSet([DataEntry((an + "amount"), (at + au)), DataEntry((an + "adapter"), T), DataEntry((an + "for"), ai), DataEntry((an + "against"), aj), DataEntry((ai + "_spent"), av), DataEntry((aj + "_spent"), aw)]), 0, unit, unit) | |
197 | 201 | } | |
198 | 202 | } | |
199 | 203 | } | |
200 | 204 | ||
201 | 205 | ||
202 | 206 | ||
203 | - | @Callable( | |
204 | - | func approveDefeat ( | |
205 | - | then ( | |
207 | + | @Callable(p) | |
208 | + | func approveDefeat (ax,ay) = if (if (isDefined(getInteger(this, (ax + "_defeat")))) | |
209 | + | then (ay == 2) | |
206 | 210 | else false) | |
207 | 211 | then throw("can't dispute after approve") | |
208 | - | else if ((getString(this, ( | |
212 | + | else if ((getString(this, (ax + "_owner")) != o(p, "autoapprove"))) | |
209 | 213 | then throw("must be owner or its delegate to approve") | |
210 | - | else | |
214 | + | else w(p, WriteSet([DataEntry((ax + "_defeat"), ay)]), 0, unit, unit) | |
211 | 215 | ||
212 | 216 | ||
213 | 217 | ||
214 | - | @Callable(n) | |
215 | - | func payWinner (ax) = if (!(t(n))) | |
218 | + | @Callable(p) | |
219 | + | func judgeDexMatch (az,Q) = if ((getStringValue(this, (az + "_adapter")) != "dex")) | |
220 | + | then throw("method is only for dex matches") | |
221 | + | else { | |
222 | + | let ai = getStringValue(this, (az + "_for")) | |
223 | + | let aj = getStringValue(this, (az + "_for")) | |
224 | + | let X = getStringValue(this, (ai + "_event")) | |
225 | + | let aA = split(X, ":") | |
226 | + | let aB = aA[1] | |
227 | + | let aC = parseIntValue(aA[2]) | |
228 | + | let aD = parseIntValue(aA[3]) | |
229 | + | let aE = ((aD * 1000) + g) | |
230 | + | if ((aE > lastBlock.timestamp)) | |
231 | + | then throw(("please wait for timestamp " + toString(aE))) | |
232 | + | else { | |
233 | + | let aF = getIntegerValue(b, (X + "_rate")) | |
234 | + | let aG = if ((aF >= aC)) | |
235 | + | then aj | |
236 | + | else ai | |
237 | + | w(p, WriteSet([DataEntry((aG + "_defeat"), 1)]), 0, unit, unit) | |
238 | + | } | |
239 | + | } | |
240 | + | ||
241 | + | ||
242 | + | ||
243 | + | @Callable(p) | |
244 | + | func payWinner (az) = if (!(v(p))) | |
216 | 245 | then throw("error") | |
217 | - | else if (isDefined(getInteger(this, ( | |
246 | + | else if (isDefined(getInteger(this, (az + "_paid")))) | |
218 | 247 | then throw("already paid") | |
219 | 248 | else { | |
220 | - | let | |
221 | - | let | |
222 | - | let | |
223 | - | let | |
224 | - | let | |
225 | - | let | |
226 | - | if (if (!( | |
227 | - | then !( | |
249 | + | let T = getStringValue(this, (az + "_adapter")) | |
250 | + | let A = S(T) | |
251 | + | let aH = extract(getString(this, (az + "_for"))) | |
252 | + | let aI = extract(getString(this, (az + "_against"))) | |
253 | + | let aJ = E(aH) | |
254 | + | let aK = E(aI) | |
255 | + | if (if (!(aJ)) | |
256 | + | then !(aK) | |
228 | 257 | else false) | |
229 | 258 | then throw("no side approved defeat") | |
230 | 259 | else { | |
231 | - | let | |
232 | - | then | |
233 | - | else | |
234 | - | let | |
235 | - | let | |
236 | - | let | |
237 | - | let | |
238 | - | let | |
239 | - | ScriptResult(WriteSet([DataEntry(( | |
240 | - | let | |
241 | - | if ($isInstanceOf( | |
260 | + | let aL = if (aJ) | |
261 | + | then aI | |
262 | + | else aH | |
263 | + | let aM = getStringValue(this, (aL + "_owner")) | |
264 | + | let y = extract(getInteger(this, (az + "_amount"))) | |
265 | + | let aN = toBase58String(p.transactionId) | |
266 | + | let R = toString(lastBlock.timestamp) | |
267 | + | let aO = ((y * l) / 1000) | |
268 | + | ScriptResult(WriteSet([DataEntry((az + "_paid"), toBase58String(p.transactionId)), { | |
269 | + | let t = G(aM) | |
270 | + | if ($isInstanceOf(t, "String")) | |
242 | 271 | then { | |
243 | - | let | |
244 | - | let | |
245 | - | let | |
246 | - | [ | |
247 | - | let | |
248 | - | if ($isInstanceOf( | |
272 | + | let aP = t | |
273 | + | let aQ = ((aO * h) / 1000) | |
274 | + | let aR = ((aO * k) / 1000) | |
275 | + | [I(aM, aR), N(aM, aM, aR, "cashback", aN, R), I(aP, aQ), N(aP, aM, aQ, "l1", aN, R), { | |
276 | + | let aS = G(aP) | |
277 | + | if ($isInstanceOf(aS, "String")) | |
249 | 278 | then { | |
250 | - | let | |
251 | - | let | |
252 | - | [ | |
253 | - | let | |
254 | - | if ($isInstanceOf( | |
279 | + | let aT = aS | |
280 | + | let aU = ((aO * i) / 1000) | |
281 | + | [I(aT, aU), N(aT, aM, aU, "l2", aN, R), { | |
282 | + | let aV = G(aT) | |
283 | + | if ($isInstanceOf(aV, "String")) | |
255 | 284 | then { | |
256 | - | let | |
257 | - | let | |
258 | - | [ | |
285 | + | let aW = aV | |
286 | + | let aX = ((aO * j) / 1000) | |
287 | + | [I(aW, aX), N(aW, aM, aX, "l3", aN, R), I(m, (((aO - aQ) - aU) - aX)), N(m, aM, (((aO - aQ) - aU) - aX), "change", aN, R)] | |
259 | 288 | } | |
260 | - | else [ | |
289 | + | else [I(m, ((aO - aQ) - aU)), N(m, aM, ((aO - aQ) - aU), "change", aN, R)] | |
261 | 290 | }] | |
262 | 291 | } | |
263 | - | else [ | |
292 | + | else [I(m, (aO - aQ)), N(m, aM, (aO - aQ), "change", aN, R)] | |
264 | 293 | }] | |
265 | 294 | } | |
266 | - | else [ | |
267 | - | }]), TransferSet([ScriptTransfer( | |
295 | + | else [I(m, aO), N(m, aM, aO, "change", aN, R)] | |
296 | + | }]), TransferSet([ScriptTransfer(p.caller, p.fee, unit), ScriptTransfer(addressFromStringValue(aM), (y - aO), A)])) | |
268 | 297 | } | |
269 | 298 | } | |
270 | 299 | ||
271 | 300 | ||
272 | 301 | ||
273 | - | @Callable( | |
274 | - | func delegate ( | |
302 | + | @Callable(p) | |
303 | + | func delegate (aY,aZ,ba) = w(p, WriteSet([DataEntry((("delegate_" + aY) + "_address"), toBase58String(p.caller.bytes)), DataEntry((("delegate_" + aY) + "_autoapprove"), aZ), DataEntry((("delegate_" + aY) + "_autocancel"), ba)]), 0, unit, unit) | |
275 | 304 | ||
276 | 305 | ||
277 | 306 | ||
278 | - | @Callable( | |
279 | - | func withdraw () = if (!( | |
307 | + | @Callable(p) | |
308 | + | func withdraw () = if (!(v(p))) | |
280 | 309 | then throw("error") | |
281 | 310 | else { | |
282 | - | let | |
283 | - | let | |
284 | - | let | |
285 | - | let | |
286 | - | let | |
287 | - | if ($isInstanceOf( | |
311 | + | let O = toBase58String(p.caller.bytes) | |
312 | + | let aN = toBase58String(p.transactionId) | |
313 | + | let L = (O + "_balance") | |
314 | + | let y = { | |
315 | + | let t = getInteger(this, L) | |
316 | + | if ($isInstanceOf(t, "Int")) | |
288 | 317 | then { | |
289 | - | let | |
290 | - | | |
318 | + | let M = t | |
319 | + | M | |
291 | 320 | } | |
292 | 321 | else 0 | |
293 | 322 | } | |
294 | - | if (( | |
295 | - | then throw(("Min withdraw amount is" + toString( | |
296 | - | else ScriptResult(WriteSet([DataEntry( | |
323 | + | if ((n > y)) | |
324 | + | then throw(("Min withdraw amount is" + toString(n))) | |
325 | + | else ScriptResult(WriteSet([DataEntry(L, 0), DataEntry(((("withdraw_" + O) + "_") + aN), ((toString(y) + ":") + toString(lastBlock.timestamp)))]), TransferSet([ScriptTransfer(p.caller, (y + p.fee), unit)])) | |
297 | 326 | } | |
298 | 327 | ||
299 | 328 | ||
300 | 329 | ||
301 | - | @Callable( | |
302 | - | func register ( | |
330 | + | @Callable(p) | |
331 | + | func register (bb,bc) = if (!(v(p))) | |
303 | 332 | then throw("error") | |
304 | - | else if ((take(toBase58String( | |
333 | + | else if ((take(toBase58String(p.transactionId), 3) != "123")) | |
305 | 334 | then throw("proof of work failed") | |
306 | 335 | else { | |
307 | - | let | |
308 | - | if (isDefined( | |
336 | + | let O = toBase58String(p.caller.bytes) | |
337 | + | if (isDefined(G(O))) | |
309 | 338 | then throw("Already registered") | |
310 | - | else ScriptResult(WriteSet([DataEntry(( | |
339 | + | else ScriptResult(WriteSet([DataEntry((O + "_referer"), bb), DataEntry(((bb + "_referral_") + O), O)]), TransferSet([ScriptTransfer(p.caller, p.fee, unit)])) | |
311 | 340 | } | |
312 | 341 | ||
313 | 342 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 3 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let a = [DataEntry("sportr", "AcTzTgW1QbJK4Qu6hCsUCLjpxUyD3dofv8xq2CAPbzKJ"), DataEntry("dex", "WAVES")] | |
5 | 5 | ||
6 | - | let b = | |
6 | + | let b = addressFromStringValue("") | |
7 | 7 | ||
8 | 8 | let c = 5000000 | |
9 | 9 | ||
10 | - | let d = | |
10 | + | let d = 5000000 | |
11 | 11 | ||
12 | - | let e = | |
12 | + | let e = 30000000 | |
13 | 13 | ||
14 | - | let f = | |
14 | + | let f = 5000000 | |
15 | 15 | ||
16 | - | let g = | |
16 | + | let g = ((1000 * 60) * 5) | |
17 | 17 | ||
18 | - | let h = | |
18 | + | let h = 250 | |
19 | 19 | ||
20 | - | let i = | |
20 | + | let i = 150 | |
21 | 21 | ||
22 | - | let j = | |
22 | + | let j = 100 | |
23 | 23 | ||
24 | - | let k = | |
24 | + | let k = 500 | |
25 | 25 | ||
26 | - | let l = | |
26 | + | let l = 10 | |
27 | 27 | ||
28 | - | func m (n,o) = { | |
29 | - | let p = toBase58String(n.caller.bytes) | |
30 | - | let q = ("delegate_" + p) | |
31 | - | if ((getBoolean(this, ((q + "_") + o)) == true)) | |
28 | + | let m = "3NAxsbHxS63azdAicVvLGsxjAQ9DsK6L4NL" | |
29 | + | ||
30 | + | let n = 1000000 | |
31 | + | ||
32 | + | func o (p,q) = { | |
33 | + | let r = toBase58String(p.caller.bytes) | |
34 | + | let s = ("delegate_" + r) | |
35 | + | if ((getBoolean(this, ((s + "_") + q)) == true)) | |
32 | 36 | then { | |
33 | - | let | |
34 | - | if ($isInstanceOf( | |
37 | + | let t = getString(this, (s + "_address")) | |
38 | + | if ($isInstanceOf(t, "String")) | |
35 | 39 | then { | |
36 | - | let | |
37 | - | | |
40 | + | let u = t | |
41 | + | u | |
38 | 42 | } | |
39 | - | else | |
43 | + | else r | |
40 | 44 | } | |
41 | - | else | |
45 | + | else r | |
42 | 46 | } | |
43 | 47 | ||
44 | 48 | ||
45 | - | func | |
49 | + | func v (p) = if ((p.fee > c)) | |
46 | 50 | then throw("unreasonable large fee") | |
47 | - | else if (( | |
51 | + | else if ((p.feeAssetId != unit)) | |
48 | 52 | then throw("fee must be in WAVES") | |
49 | 53 | else true | |
50 | 54 | ||
51 | 55 | ||
52 | - | func | |
53 | - | then if (if (( | |
54 | - | then isDefined( | |
56 | + | func w (p,x,y,z,A) = if (v(p)) | |
57 | + | then if (if ((y > 0)) | |
58 | + | then isDefined(z) | |
55 | 59 | else false) | |
56 | - | then ScriptResult( | |
57 | - | else ScriptResult( | |
60 | + | then ScriptResult(x, TransferSet([ScriptTransfer(p.caller, p.fee, unit), ScriptTransfer(extract(z), y, A)])) | |
61 | + | else ScriptResult(x, TransferSet([ScriptTransfer(p.caller, p.fee, unit)])) | |
58 | 62 | else throw("error") | |
59 | 63 | ||
60 | 64 | ||
61 | - | func | |
65 | + | func B (p,C) = (getString(this, (C + "_owner")) == toBase58String(p.caller.bytes)) | |
62 | 66 | ||
63 | 67 | ||
64 | - | func | |
68 | + | func D (C) = (extract(getInteger(this, (C + "_amount"))) - extract(getInteger(this, (C + "_spent")))) | |
65 | 69 | ||
66 | 70 | ||
67 | - | func | |
68 | - | let | |
69 | - | if (( | |
71 | + | func E (C) = { | |
72 | + | let F = getInteger(this, (C + "_defeat")) | |
73 | + | if ((F == 1)) | |
70 | 74 | then true | |
71 | - | else ( | |
75 | + | else (F == 3) | |
72 | 76 | } | |
73 | 77 | ||
74 | 78 | ||
75 | - | func | |
79 | + | func G (H) = getString(this, (H + "_referer")) | |
76 | 80 | ||
77 | 81 | ||
78 | - | func | |
79 | - | let | |
80 | - | DataEntry( | |
81 | - | let | |
82 | - | if ($isInstanceOf( | |
82 | + | func I (J,K) = { | |
83 | + | let L = (J + "_balance") | |
84 | + | DataEntry(L, (K + { | |
85 | + | let t = getInteger(this, L) | |
86 | + | if ($isInstanceOf(t, "Int")) | |
83 | 87 | then { | |
84 | - | let | |
85 | - | | |
88 | + | let M = t | |
89 | + | M | |
86 | 90 | } | |
87 | 91 | else 0 | |
88 | 92 | })) | |
89 | 93 | } | |
90 | 94 | ||
91 | 95 | ||
92 | - | func | |
96 | + | func N (J,O,K,P,Q,R) = DataEntry(((("fund_" + J) + "_") + Q), ((((((O + ":") + toString(K)) + ":") + P) + ":") + R)) | |
93 | 97 | ||
94 | 98 | ||
95 | - | func | |
96 | - | let | |
97 | - | if (( | |
99 | + | func S (T) = { | |
100 | + | let U = getStringValue(a, T) | |
101 | + | if ((U == "WAVES")) | |
98 | 102 | then unit | |
99 | - | else fromBase58String( | |
103 | + | else fromBase58String(U) | |
100 | 104 | } | |
101 | 105 | ||
102 | 106 | ||
103 | - | func | |
107 | + | func V (W) = if ((W == unit)) | |
104 | 108 | then "WAVES" | |
105 | - | else toBase58String(extract( | |
109 | + | else toBase58String(extract(W)) | |
106 | 110 | ||
107 | 111 | ||
108 | - | @Callable( | |
109 | - | func bet ( | |
110 | - | let | |
111 | - | let | |
112 | - | let | |
113 | - | let | |
114 | - | if (( | |
115 | - | then throw(((("bet must be in asset " + | |
116 | - | else if (( | |
117 | - | then throw(("minimum allowed bet is " + toString( | |
118 | - | else if (if (if (( | |
119 | - | then ( | |
112 | + | @Callable(p) | |
113 | + | func bet (X,Y,Z,aa,T) = { | |
114 | + | let ab = ("market_" + X) | |
115 | + | let A = S(T) | |
116 | + | let O = toBase58String(p.caller.bytes) | |
117 | + | let ac = extract(p.payment) | |
118 | + | if ((ac.assetId != A)) | |
119 | + | then throw(((("bet must be in asset " + V(A)) + " for adapter ") + T)) | |
120 | + | else if ((d > ac.amount)) | |
121 | + | then throw(("minimum allowed bet is " + toString(d))) | |
122 | + | else if (if (if ((T == "dex")) | |
123 | + | then (e > ac.amount) | |
120 | 124 | else false) | |
121 | - | then (getBoolean(this, | |
125 | + | then (getBoolean(this, ab) == unit) | |
122 | 126 | else false) | |
123 | - | then throw(("min amount to create first bet is " + toString( | |
124 | - | else if (if (( | |
125 | - | then ( | |
127 | + | then throw(("min amount to create first bet is " + toString(e))) | |
128 | + | else if (if ((Z != "for")) | |
129 | + | then (Z != "against") | |
126 | 130 | else false) | |
127 | 131 | then throw("unexpected side") | |
128 | 132 | else { | |
129 | - | let | |
130 | - | let | |
131 | - | let | |
132 | - | let | |
133 | - | if ($isInstanceOf( | |
133 | + | let C = (((((("bet_" + X) + "_") + toBase58String(p.caller.bytes)) + "_") + take(toBase58String(p.transactionId), 15)) + "_") | |
134 | + | let ad = ((("seq_" + X) + "_") + Y) | |
135 | + | let ae = { | |
136 | + | let t = getInteger(this, ad) | |
137 | + | if ($isInstanceOf(t, "Int")) | |
134 | 138 | then { | |
135 | - | let | |
136 | - | ( | |
139 | + | let af = t | |
140 | + | (af + 1) | |
137 | 141 | } | |
138 | 142 | else 1 | |
139 | 143 | } | |
140 | - | | |
144 | + | w(p, WriteSet([DataEntry((C + "owner"), O), DataEntry((C + "event"), X), DataEntry((C + "subevent"), Y), DataEntry((C + "side"), Z), DataEntry((C + "odds"), aa), DataEntry((C + "amount"), ac.amount), DataEntry((C + "spent"), 0), DataEntry((C + "adapter"), T), DataEntry((C + "timestamp"), lastBlock.timestamp), DataEntry((C + "sequence"), ae), DataEntry(ab, true), DataEntry(ad, ae)]), 0, unit, unit) | |
141 | 145 | } | |
142 | 146 | } | |
143 | 147 | ||
144 | 148 | ||
145 | 149 | ||
146 | - | @Callable( | |
147 | - | func cancel ( | |
150 | + | @Callable(p) | |
151 | + | func cancel (C) = if ((getString(this, (C + "_owner")) != o(p, "autocancel"))) | |
148 | 152 | then throw("must be owner or its delegate to cancel") | |
149 | 153 | else { | |
150 | - | let | |
151 | - | let | |
152 | - | let | |
153 | - | let | |
154 | - | | |
154 | + | let T = getStringValue(this, (C + "_adapter")) | |
155 | + | let y = getIntegerValue(this, (C + "_amount")) | |
156 | + | let ag = getIntegerValue(this, (C + "_spent")) | |
157 | + | let ah = (y - ag) | |
158 | + | w(p, WriteSet([DataEntry((C + "_spent"), y), DataEntry((C + "_cancel_amount"), ah), DataEntry((C + "_cancel_tx"), toBase58String(p.transactionId))]), ah, p.caller, S(T)) | |
155 | 159 | } | |
156 | 160 | ||
157 | 161 | ||
158 | 162 | ||
159 | - | @Callable( | |
160 | - | func betMatch ( | |
163 | + | @Callable(p) | |
164 | + | func betMatch (ai,aj) = if ((getString(this, (ai + "_event")) != getString(this, (aj + "_event")))) | |
161 | 165 | then throw("event id must match") | |
162 | - | else if ((getString(this, ( | |
166 | + | else if ((getString(this, (ai + "_subevent")) != getString(this, (aj + "_subevent")))) | |
163 | 167 | then throw("subevent id must match") | |
164 | - | else if ((getString(this, ( | |
168 | + | else if ((getString(this, (ai + "_side")) != "for")) | |
165 | 169 | then throw("invalid *for* bet") | |
166 | - | else if ((getString(this, ( | |
170 | + | else if ((getString(this, (aj + "_side")) != "against")) | |
167 | 171 | then throw("invalid *against* bet") | |
168 | 172 | else { | |
169 | - | let | |
170 | - | if (( | |
173 | + | let T = getStringValue(this, (ai + "_adapter")) | |
174 | + | if ((T != getStringValue(this, (aj + "_adapter")))) | |
171 | 175 | then throw("bets has different adapters") | |
172 | 176 | else { | |
173 | - | let | |
174 | - | let | |
175 | - | let | |
176 | - | let | |
177 | - | let | |
178 | - | let | |
179 | - | let | |
180 | - | let | |
181 | - | let | |
182 | - | let | |
183 | - | then | |
184 | - | else | |
185 | - | if (( | |
177 | + | let ak = getStringValue(this, (ai + "_owner")) | |
178 | + | let al = getStringValue(this, (aj + "_owner")) | |
179 | + | let am = extract(getString(this, (ai + "_event"))) | |
180 | + | let an = (((((((("match_" + am) + "_") + takeRight(ak, 10)) + "_") + takeRight(al, 10)) + "_") + takeRight(toBase58String(p.transactionId), 10)) + "_") | |
181 | + | let aa = extract(getInteger(this, (ai + "_odds"))) | |
182 | + | let ao = D(ai) | |
183 | + | let ap = D(aj) | |
184 | + | let aq = ao | |
185 | + | let ar = ((ap * 100) / (aa - 100)) | |
186 | + | let as = if ((aq > ar)) | |
187 | + | then ar | |
188 | + | else aq | |
189 | + | if ((f > as)) | |
186 | 190 | then throw("match nominal too low") | |
187 | 191 | else { | |
188 | - | let | |
189 | - | let | |
190 | - | let | |
191 | - | let | |
192 | - | if (( | |
192 | + | let at = as | |
193 | + | let au = ((as * (aa - 100)) / 100) | |
194 | + | let av = (at + extract(getInteger(this, (ai + "_spent")))) | |
195 | + | let aw = (au + extract(getInteger(this, (aj + "_spent")))) | |
196 | + | if ((av > extract(getInteger(this, (ai + "_amount"))))) | |
193 | 197 | then throw("invalid match") | |
194 | - | else if (( | |
198 | + | else if ((aw > extract(getInteger(this, (aj + "_amount"))))) | |
195 | 199 | then throw("invalid match") | |
196 | - | else | |
200 | + | else w(p, WriteSet([DataEntry((an + "amount"), (at + au)), DataEntry((an + "adapter"), T), DataEntry((an + "for"), ai), DataEntry((an + "against"), aj), DataEntry((ai + "_spent"), av), DataEntry((aj + "_spent"), aw)]), 0, unit, unit) | |
197 | 201 | } | |
198 | 202 | } | |
199 | 203 | } | |
200 | 204 | ||
201 | 205 | ||
202 | 206 | ||
203 | - | @Callable( | |
204 | - | func approveDefeat ( | |
205 | - | then ( | |
207 | + | @Callable(p) | |
208 | + | func approveDefeat (ax,ay) = if (if (isDefined(getInteger(this, (ax + "_defeat")))) | |
209 | + | then (ay == 2) | |
206 | 210 | else false) | |
207 | 211 | then throw("can't dispute after approve") | |
208 | - | else if ((getString(this, ( | |
212 | + | else if ((getString(this, (ax + "_owner")) != o(p, "autoapprove"))) | |
209 | 213 | then throw("must be owner or its delegate to approve") | |
210 | - | else | |
214 | + | else w(p, WriteSet([DataEntry((ax + "_defeat"), ay)]), 0, unit, unit) | |
211 | 215 | ||
212 | 216 | ||
213 | 217 | ||
214 | - | @Callable(n) | |
215 | - | func payWinner (ax) = if (!(t(n))) | |
218 | + | @Callable(p) | |
219 | + | func judgeDexMatch (az,Q) = if ((getStringValue(this, (az + "_adapter")) != "dex")) | |
220 | + | then throw("method is only for dex matches") | |
221 | + | else { | |
222 | + | let ai = getStringValue(this, (az + "_for")) | |
223 | + | let aj = getStringValue(this, (az + "_for")) | |
224 | + | let X = getStringValue(this, (ai + "_event")) | |
225 | + | let aA = split(X, ":") | |
226 | + | let aB = aA[1] | |
227 | + | let aC = parseIntValue(aA[2]) | |
228 | + | let aD = parseIntValue(aA[3]) | |
229 | + | let aE = ((aD * 1000) + g) | |
230 | + | if ((aE > lastBlock.timestamp)) | |
231 | + | then throw(("please wait for timestamp " + toString(aE))) | |
232 | + | else { | |
233 | + | let aF = getIntegerValue(b, (X + "_rate")) | |
234 | + | let aG = if ((aF >= aC)) | |
235 | + | then aj | |
236 | + | else ai | |
237 | + | w(p, WriteSet([DataEntry((aG + "_defeat"), 1)]), 0, unit, unit) | |
238 | + | } | |
239 | + | } | |
240 | + | ||
241 | + | ||
242 | + | ||
243 | + | @Callable(p) | |
244 | + | func payWinner (az) = if (!(v(p))) | |
216 | 245 | then throw("error") | |
217 | - | else if (isDefined(getInteger(this, ( | |
246 | + | else if (isDefined(getInteger(this, (az + "_paid")))) | |
218 | 247 | then throw("already paid") | |
219 | 248 | else { | |
220 | - | let | |
221 | - | let | |
222 | - | let | |
223 | - | let | |
224 | - | let | |
225 | - | let | |
226 | - | if (if (!( | |
227 | - | then !( | |
249 | + | let T = getStringValue(this, (az + "_adapter")) | |
250 | + | let A = S(T) | |
251 | + | let aH = extract(getString(this, (az + "_for"))) | |
252 | + | let aI = extract(getString(this, (az + "_against"))) | |
253 | + | let aJ = E(aH) | |
254 | + | let aK = E(aI) | |
255 | + | if (if (!(aJ)) | |
256 | + | then !(aK) | |
228 | 257 | else false) | |
229 | 258 | then throw("no side approved defeat") | |
230 | 259 | else { | |
231 | - | let | |
232 | - | then | |
233 | - | else | |
234 | - | let | |
235 | - | let | |
236 | - | let | |
237 | - | let | |
238 | - | let | |
239 | - | ScriptResult(WriteSet([DataEntry(( | |
240 | - | let | |
241 | - | if ($isInstanceOf( | |
260 | + | let aL = if (aJ) | |
261 | + | then aI | |
262 | + | else aH | |
263 | + | let aM = getStringValue(this, (aL + "_owner")) | |
264 | + | let y = extract(getInteger(this, (az + "_amount"))) | |
265 | + | let aN = toBase58String(p.transactionId) | |
266 | + | let R = toString(lastBlock.timestamp) | |
267 | + | let aO = ((y * l) / 1000) | |
268 | + | ScriptResult(WriteSet([DataEntry((az + "_paid"), toBase58String(p.transactionId)), { | |
269 | + | let t = G(aM) | |
270 | + | if ($isInstanceOf(t, "String")) | |
242 | 271 | then { | |
243 | - | let | |
244 | - | let | |
245 | - | let | |
246 | - | [ | |
247 | - | let | |
248 | - | if ($isInstanceOf( | |
272 | + | let aP = t | |
273 | + | let aQ = ((aO * h) / 1000) | |
274 | + | let aR = ((aO * k) / 1000) | |
275 | + | [I(aM, aR), N(aM, aM, aR, "cashback", aN, R), I(aP, aQ), N(aP, aM, aQ, "l1", aN, R), { | |
276 | + | let aS = G(aP) | |
277 | + | if ($isInstanceOf(aS, "String")) | |
249 | 278 | then { | |
250 | - | let | |
251 | - | let | |
252 | - | [ | |
253 | - | let | |
254 | - | if ($isInstanceOf( | |
279 | + | let aT = aS | |
280 | + | let aU = ((aO * i) / 1000) | |
281 | + | [I(aT, aU), N(aT, aM, aU, "l2", aN, R), { | |
282 | + | let aV = G(aT) | |
283 | + | if ($isInstanceOf(aV, "String")) | |
255 | 284 | then { | |
256 | - | let | |
257 | - | let | |
258 | - | [ | |
285 | + | let aW = aV | |
286 | + | let aX = ((aO * j) / 1000) | |
287 | + | [I(aW, aX), N(aW, aM, aX, "l3", aN, R), I(m, (((aO - aQ) - aU) - aX)), N(m, aM, (((aO - aQ) - aU) - aX), "change", aN, R)] | |
259 | 288 | } | |
260 | - | else [ | |
289 | + | else [I(m, ((aO - aQ) - aU)), N(m, aM, ((aO - aQ) - aU), "change", aN, R)] | |
261 | 290 | }] | |
262 | 291 | } | |
263 | - | else [ | |
292 | + | else [I(m, (aO - aQ)), N(m, aM, (aO - aQ), "change", aN, R)] | |
264 | 293 | }] | |
265 | 294 | } | |
266 | - | else [ | |
267 | - | }]), TransferSet([ScriptTransfer( | |
295 | + | else [I(m, aO), N(m, aM, aO, "change", aN, R)] | |
296 | + | }]), TransferSet([ScriptTransfer(p.caller, p.fee, unit), ScriptTransfer(addressFromStringValue(aM), (y - aO), A)])) | |
268 | 297 | } | |
269 | 298 | } | |
270 | 299 | ||
271 | 300 | ||
272 | 301 | ||
273 | - | @Callable( | |
274 | - | func delegate ( | |
302 | + | @Callable(p) | |
303 | + | func delegate (aY,aZ,ba) = w(p, WriteSet([DataEntry((("delegate_" + aY) + "_address"), toBase58String(p.caller.bytes)), DataEntry((("delegate_" + aY) + "_autoapprove"), aZ), DataEntry((("delegate_" + aY) + "_autocancel"), ba)]), 0, unit, unit) | |
275 | 304 | ||
276 | 305 | ||
277 | 306 | ||
278 | - | @Callable( | |
279 | - | func withdraw () = if (!( | |
307 | + | @Callable(p) | |
308 | + | func withdraw () = if (!(v(p))) | |
280 | 309 | then throw("error") | |
281 | 310 | else { | |
282 | - | let | |
283 | - | let | |
284 | - | let | |
285 | - | let | |
286 | - | let | |
287 | - | if ($isInstanceOf( | |
311 | + | let O = toBase58String(p.caller.bytes) | |
312 | + | let aN = toBase58String(p.transactionId) | |
313 | + | let L = (O + "_balance") | |
314 | + | let y = { | |
315 | + | let t = getInteger(this, L) | |
316 | + | if ($isInstanceOf(t, "Int")) | |
288 | 317 | then { | |
289 | - | let | |
290 | - | | |
318 | + | let M = t | |
319 | + | M | |
291 | 320 | } | |
292 | 321 | else 0 | |
293 | 322 | } | |
294 | - | if (( | |
295 | - | then throw(("Min withdraw amount is" + toString( | |
296 | - | else ScriptResult(WriteSet([DataEntry( | |
323 | + | if ((n > y)) | |
324 | + | then throw(("Min withdraw amount is" + toString(n))) | |
325 | + | else ScriptResult(WriteSet([DataEntry(L, 0), DataEntry(((("withdraw_" + O) + "_") + aN), ((toString(y) + ":") + toString(lastBlock.timestamp)))]), TransferSet([ScriptTransfer(p.caller, (y + p.fee), unit)])) | |
297 | 326 | } | |
298 | 327 | ||
299 | 328 | ||
300 | 329 | ||
301 | - | @Callable( | |
302 | - | func register ( | |
330 | + | @Callable(p) | |
331 | + | func register (bb,bc) = if (!(v(p))) | |
303 | 332 | then throw("error") | |
304 | - | else if ((take(toBase58String( | |
333 | + | else if ((take(toBase58String(p.transactionId), 3) != "123")) | |
305 | 334 | then throw("proof of work failed") | |
306 | 335 | else { | |
307 | - | let | |
308 | - | if (isDefined( | |
336 | + | let O = toBase58String(p.caller.bytes) | |
337 | + | if (isDefined(G(O))) | |
309 | 338 | then throw("Already registered") | |
310 | - | else ScriptResult(WriteSet([DataEntry(( | |
339 | + | else ScriptResult(WriteSet([DataEntry((O + "_referer"), bb), DataEntry(((bb + "_referral_") + O), O)]), TransferSet([ScriptTransfer(p.caller, p.fee, unit)])) | |
311 | 340 | } | |
312 | 341 | ||
313 | 342 |
github/deemru/w8io/873ac7e 145.54 ms ◑![]()