tx · 5XD4xKJRX4GqadKi7FLy7Lmzrou45g1Rbs5522jxaK1m

3MxuKJsPyg2ZjwWhoptvft74wJUfYZ6gjnd:  -0.10000000 Waves

2022.07.07 13:41 [2129158] smart account 3MxuKJsPyg2ZjwWhoptvft74wJUfYZ6gjnd > SELF 0.00000000 Waves

{ "type": 13, "id": "5XD4xKJRX4GqadKi7FLy7Lmzrou45g1Rbs5522jxaK1m", "fee": 10000000, "feeAssetId": null, "timestamp": 1657190483608, "version": 1, "sender": "3MxuKJsPyg2ZjwWhoptvft74wJUfYZ6gjnd", "senderPublicKey": "9eayJAqhfR1WrSx5GsboDijMXZuWp5X2dRS59JP3vacT", "proofs": [ "3t39i48JL5571iZWH6x7t9ztFEzBbCUerV9dMsr2nkB9dbBXYUHnFHqZfXeazD7AnyKkdaymVzKuwNPufjH9zLDu" ], "script": "base64:AAIFAAAAAAAAAHMIAhIGCgQBAQEBEgkKBwgICAgBAQESAwoBARIFCgMBAQESBAoCAQESBQoDAQEBEgQKAgEBEgQKAgEBEgASABIGCgQBAQEEEgQKAgEBEgASBAoCAQESABIAEgMKAQgSABIAEgMKAQESABIAEgMKAQQSABIAAAAAOQAAAAAHTl9DT0lOUwAAAAAAAAAAAwAAAAAPRkVFX0RFTk9NSU5BVE9SAAAAAAJUC+QAAAAAAAlQUkVDSVNJT04AAAAAAAAPQkAAAAAACERFQ0lNQUxTAAAAAAAAAAAGAAAAAA1NQVhfQURNSU5fRkVFAAAAAAJUC+QAAAAAAAdNQVhfRkVFAAAAAAEqBfIAAAAAAAVNQVhfQQAAAAAAAA9CQAAAAAAMTUFYX0FfQ0hBTkdFAAAAAAAAAAAKAAAAABNBRE1JTl9BQ1RJT05TX0RFTEFZCQAAaQAAAAIJAABoAAAAAgAAAAAAAAAAAwAAAAAAAAFRgAAAAAAAAAAAPAAAAAANTUlOX1JBTVBfVElNRQkAAGkAAAACAAAAAAAAAVGAAAAAAAAAAAA8AAAAAAdjb2luc18wCQEAAAARQGV4dHJOYXRpdmUoMTA1MikAAAACBQAAAAR0aGlzAgAAAAdjb2luc18wAAAAAAdjb2luc18xCQEAAAARQGV4dHJOYXRpdmUoMTA1MikAAAACBQAAAAR0aGlzAgAAAAdjb2luc18xAAAAAAdjb2luc18yCQEAAAARQGV4dHJOYXRpdmUoMTA1MikAAAACBQAAAAR0aGlzAgAAAAdjb2luc18yAAAAAApiYWxhbmNlc18wCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMCAAAACmJhbGFuY2VzXzAAAAAAAAAAAAAAAAAACmJhbGFuY2VzXzEJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwIAAAAKYmFsYW5jZXNfMQAAAAAAAAAAAAAAAAAKYmFsYW5jZXNfMgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzAgAAAApiYWxhbmNlc18yAAAAAAAAAAAAAAAAAAhiYWxhbmNlcwkABRUAAAADBQAAAApiYWxhbmNlc18wBQAAAApiYWxhbmNlc18xBQAAAApiYWxhbmNlc18yAAAAAANmZWUJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMCAAAAA2ZlZQAAAAAJYWRtaW5fZmVlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzAgAAAAlhZG1pbl9mZWUAAAAADGlzX2F1dG9fZmVlcwkBAAAAEUBleHRyTmF0aXZlKDEwNTEpAAAAAgUAAAAEdGhpcwIAAAAMaXNfYXV0b19mZWVzAAAAAAVvd25lcgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwIAAAAFb3duZXIAAAAABXRva2VuCQEAAAARQGV4dHJOYXRpdmUoMTA1MikAAAACBQAAAAR0aGlzAgAAAAV0b2tlbgAAAAAOdG9rZW5fcXVhbnRpdHkICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAABXRva2VuAAAACHF1YW50aXR5AAAAAAlpbml0aWFsX0EJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMCAAAACWluaXRpYWxfQQAAAAAIZnV0dXJlX0EJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMCAAAACGZ1dHVyZV9BAAAAAA5pbml0aWFsX0FfdGltZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzAgAAAA5pbml0aWFsX0FfdGltZQAAAAAAAAAAAAAAAAANZnV0dXJlX0FfdGltZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzAgAAAA1mdXR1cmVfQV90aW1lAAAAAAAAAAAAAAAAABZhZG1pbl9hY3Rpb25zX2RlYWRsaW5lCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMCAAAAFmFkbWluX2FjdGlvbnNfZGVhZGxpbmUAAAAAAAAAAAAAAAAAG3RyYW5zZmVyX293bmVyc2hpcF9kZWFkbGluZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzAgAAABt0cmFuc2Zlcl9vd25lcnNoaXBfZGVhZGxpbmUAAAAAAAAA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AAECAAAAImluaXRpYWwgZGVwb3NpdCByZXF1aXJlcyBhbGwgY29pbnMEAAAADm5ld19iYWxhbmNlc18wCQAAZAAAAAIFAAAACmJhbGFuY2VzXzAFAAAACWFtb3VudHNfMAQAAAAObmV3X2JhbGFuY2VzXzEJAABkAAAAAgUAAAAKYmFsYW5jZXNfMQUAAAAJYW1vdW50c18xBAAAAA5uZXdfYmFsYW5jZXNfMgkAAGQAAAACBQAAAApiYWxhbmNlc18yBQAAAAlhbW91bnRzXzIEAAAAAkQxCQEAAAAJZ2V0X0RfbWVtAAAABAUAAAAObmV3X2JhbGFuY2VzXzAFAAAADm5ld19iYWxhbmNlc18xBQAAAA5uZXdfYmFsYW5jZXNfMgUAAAADYW1wAwkBAAAABmFzc2VydAAAAAEJAABmAAAAAgUAAAACRDEFAAAAAkQwCQAAAgAAAAECAAAAB0QxID4gRDAEAAAADSR0MDEyNzk3MTQ3MjYDCQAAZgAAAAIFAAAADHRva2VuX3N1cHBseQAAAAAAAAAAAAoBAAAACGZlZXNQcm9jAAAAAgAAAAtvbGRfYmFsYW5jZQAAAAtuZXdfYmFsYW5jZQQAAAANaWRlYWxfYmFsYW5jZQkAAGsAAAADBQAAAAJEMQUAAAALb2xkX2JhbGFuY2UFAAAAAkQwBAAAAApkaWZmZXJlbmNlAwkAAGYAAAACBQAAAA1pZGVhbF9iYWxhbmNlBQAAAAtuZXdfYmFsYW5jZQkAAGUAAAACBQAAAA1pZGVhbF9iYWxhbmNlBQAAAAtuZXdfYmFsYW5jZQkAAGUAAAACBQAAAAtuZXdfYmFsYW5jZQUAAAANaWRlYWxfYmFsYW5jZQkAAGsAAAADBQAAAARfZmVlBQAAAApkaWZmZXJlbmNlBQAAAA9GRUVfREVOT01JTkFUT1IEAAAABmZlZXNfMAkBAAAACGZlZXNQcm9jAAAAAgUAAAAKYmFsYW5jZXNfMAUAAAAObmV3X2JhbGFuY2VzXzAEAAAABmZlZXNfMQkBAAAACGZlZXNQcm9jAAAAAgUAAAAKYmFsYW5jZXNfMQUAAAAObmV3X2JhbGFuY2VzXzEEAAAABmZlZXNfMgkBAAAACGZlZXNQcm9jAAAAAgUAAAAKYmFsYW5jZXNfMgUAAAAObmV3X2JhbGFuY2VzXzIE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ZXNfMAUAAAAHX2Ftb3VudAUAAAAMdG90YWxfc3VwcGx5BAAAAAd2YWx1ZV8xCQAAawAAAAMFAAAACmJhbGFuY2VzXzEFAAAAB19hbW91bnQFAAAADHRvdGFsX3N1cHBseQQAAAAHdmFsdWVfMgkAAGsAAAADBQAAAApiYWxhbmNlc18yBQAAAAdfYW1vdW50BQAAAAx0b3RhbF9zdXBwbHkDCQEAAAAGYXNzZXJ0AAAAAQMDCQAAZwAAAAIFAAAAB3ZhbHVlXzAFAAAADW1pbl9hbW91bnRzXzAJAABnAAAAAgUAAAAHdmFsdWVfMQUAAAANbWluX2Ftb3VudHNfMQcJAABnAAAAAgUAAAAHdmFsdWVfMgUAAAANbWluX2Ftb3VudHNfMgcJAAACAAAAAQIAAAAwV2l0aGRyYXdhbCByZXN1bHRlZCBpbiBmZXdlciBjb2lucyB0aGFuIGV4cGVjdGVkBAAAABBmaW5hbF9iYWxhbmNlc18wCQAAZQAAAAIFAAAACmJhbGFuY2VzXzAFAAAAB3ZhbHVlXzAEAAAAEGZpbmFsX2JhbGFuY2VzXzEJAABlAAAAAgUAAAAKYmFsYW5jZXNfMQUAAAAHdmFsdWVfMQQAAAAQZmluYWxfYmFsYW5jZXNfMgkAAGUAAAACBQAAAApiYWxhbmNlc18yBQAAAAd2YWx1ZV8yCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAAApiYWxhbmNlc18wBQAAABBmaW5hbF9iYWxhbmNlc18wCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAAApiYWxhbmNlc18xBQAAABBmaW5hbF9iYWxhbmNlc18xCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAAApiYWxhbmNlc18yBQAAABBmaW5hbF9iYWxhbmNlc18yCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAANtc2cAAAAGY2FsbGVyBQAAAAd2YWx1ZV8wBQAAAAdjb2luc18wCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAANtc2cAAAAGY2FsbGVyBQAAAAd2YWx1ZV8xBQAAAAdjb2luc18xCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2Zl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", "chainId": 84, "height": 2129158, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 5 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let N_COINS = 3
5+
6+let FEE_DENOMINATOR = 10000000000
7+
8+let PRECISION = 1000000
9+
10+let DECIMALS = 6
11+
12+let MAX_ADMIN_FEE = 10000000000
13+
14+let MAX_FEE = 5000000000
15+
16+let MAX_A = 1000000
17+
18+let MAX_A_CHANGE = 10
19+
20+let ADMIN_ACTIONS_DELAY = ((3 * 86400) / 60)
21+
22+let MIN_RAMP_TIME = (86400 / 60)
23+
24+let coins_0 = getBinaryValue(this, "coins_0")
25+
26+let coins_1 = getBinaryValue(this, "coins_1")
27+
28+let coins_2 = getBinaryValue(this, "coins_2")
29+
30+let balances_0 = valueOrElse(getInteger(this, "balances_0"), 0)
31+
32+let balances_1 = valueOrElse(getInteger(this, "balances_1"), 0)
33+
34+let balances_2 = valueOrElse(getInteger(this, "balances_2"), 0)
35+
36+let balances = $Tuple3(balances_0, balances_1, balances_2)
37+
38+let fee = getIntegerValue(this, "fee")
39+
40+let admin_fee = getIntegerValue(this, "admin_fee")
41+
42+let is_auto_fees = getBooleanValue(this, "is_auto_fees")
43+
44+let owner = addressFromStringValue(getStringValue(this, "owner"))
45+
46+let token = getBinaryValue(this, "token")
47+
48+let token_quantity = value(assetInfo(token)).quantity
49+
50+let initial_A = getIntegerValue(this, "initial_A")
51+
52+let future_A = getIntegerValue(this, "future_A")
53+
54+let initial_A_time = valueOrElse(getInteger(this, "initial_A_time"), 0)
55+
56+let future_A_time = valueOrElse(getInteger(this, "future_A_time"), 0)
57+
58+let admin_actions_deadline = valueOrElse(getInteger(this, "admin_actions_deadline"), 0)
59+
60+let transfer_ownership_deadline = valueOrElse(getInteger(this, "transfer_ownership_deadline"), 0)
61+
62+let future_fee = getIntegerValue(this, "future_fee")
63+
64+let future_admin_fee = getIntegerValue(this, "future_admin_fee")
65+
66+let future_owner = getStringValue(this, "future_owner")
67+
68+let is_killed = getBooleanValue(this, "is_killed")
69+
70+let kill_deadline = getIntegerValue(this, "kill_deadline")
71+
72+let KILL_DEADLINE_DT = (((2 * 30) * 86400) / 60)
73+
74+let big0 = toBigInt(0)
75+
76+let big1 = toBigInt(1)
77+
78+let big2 = toBigInt(2)
79+
80+let big3 = toBigInt(3)
81+
82+let big4 = toBigInt(4)
83+
84+let big27 = toBigInt(27)
85+
86+let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, "config"), "no settings defined")), "bad settings address")
87+
88+let HEIGHT = height
89+
90+let block_timestamp = HEIGHT
91+
92+func assert (a) = if (a)
93+ then false
94+ else true
95+
96+
97+func x_i (x,i) = if ((i == 0))
98+ then x._1
99+ else if ((i == 1))
100+ then x._2
101+ else if ((i == 2))
102+ then x._3
103+ else throw("index out of N_COINS")
104+
105+
106+func admin_balance (i) = if ((i == 0))
107+ then (assetBalance(this, coins_0) - balances_0)
108+ else if ((i == 1))
109+ then (assetBalance(this, coins_1) - balances_1)
110+ else if ((i == 2))
111+ then (assetBalance(this, coins_2) - balances_2)
112+ else throw("index out of N_COINS")
113+
114+
115+func checkAddress (a58) = {
116+ let a = addressFromStringValue(a58)
117+ toString(a)
118+ }
119+
120+
121+func _A () = {
122+ let t1 = future_A_time
123+ let A1 = future_A
124+ if ((t1 > block_timestamp))
125+ then {
126+ let A0 = initial_A
127+ let t0 = initial_A_time
128+ if ((A1 > A0))
129+ then (A0 + (((A1 - A0) * (block_timestamp - t0)) / (t1 - t0)))
130+ else (A0 - (((A0 - A1) * (block_timestamp - t0)) / (t1 - t0)))
131+ }
132+ else A1
133+ }
134+
135+
136+func _xp () = balances
137+
138+
139+func _xp_mem (_balances) = _balances
140+
141+
142+func get_D (xp,amp) = {
143+ let @ = invoke(this, "D", [xp._1, xp._2, xp._3, amp], nil)
144+ if ($isInstanceOf(@, "Int"))
145+ then @
146+ else throw("Couldn't cast Any to Int")
147+ }
148+
149+
150+func get_D_internal (xp0,xp1,xp2,amp) = {
151+ let S = ((xp0 + xp1) + xp2)
152+ if ((toInt(S) == 0))
153+ then 0
154+ else {
155+ let Ann = (amp * N_COINS)
156+ let AnnS = (toBigInt(Ann) * S)
157+ let Ann1 = toBigInt((Ann - 1))
158+ let xd = (((xp0 * xp1) * xp2) * big27)
159+ func Dproc (acc,i) = if ((acc._2 == true))
160+ then acc
161+ else {
162+ let Dprev = acc._1
163+ let DprevDprev = (Dprev * Dprev)
164+ let D_P = ((DprevDprev * DprevDprev) / xd)
165+ let D = fraction((AnnS + (big3 * D_P)), Dprev, ((Ann1 * Dprev) + (big4 * D_P)))
166+ if ((D > Dprev))
167+ then if ((1 >= toInt((D - Dprev))))
168+ then $Tuple2(D, true)
169+ else $Tuple2(D, false)
170+ else if ((1 >= toInt((Dprev - D))))
171+ then $Tuple2(D, true)
172+ else $Tuple2(D, false)
173+ }
174+
175+ let $t045104617 = {
176+ let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
177+ let $s = size($l)
178+ let $acc0 = $Tuple2(S, false)
179+ func $f0_1 ($a,$i) = if (($i >= $s))
180+ then $a
181+ else Dproc($a, $l[$i])
182+
183+ func $f0_2 ($a,$i) = if (($i >= $s))
184+ then $a
185+ else throw("List size exceeds 15")
186+
187+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
188+ }
189+ let D = $t045104617._1
190+ let finished = $t045104617._2
191+ if ((finished == false))
192+ then throw(("get_D() not finished with " + toString(D)))
193+ else toInt(D)
194+ }
195+ }
196+
197+
198+func get_D_mem (_balances_0,_balances_1,_balances_2,amp) = get_D(_xp_mem($Tuple3(_balances_0, _balances_1, _balances_2)), amp)
199+
200+
201+func get_y (i,j,x,xp_) = if (assert((i != j)))
202+ then throw("same coin")
203+ else if (assert(if ((j >= 0))
204+ then (i >= 0)
205+ else false))
206+ then throw("below zero")
207+ else if (assert(if ((N_COINS > j))
208+ then (N_COINS > i)
209+ else false))
210+ then throw("above N_COINS")
211+ else {
212+ let amp = _A()
213+ let D = get_D(xp_, amp)
214+ let Ann = (amp * N_COINS)
215+ func xs (acc,_i) = if ((_i == i))
216+ then (acc ++ [x])
217+ else if ((_i != j))
218+ then (acc ++ [x_i(xp_, _i)])
219+ else acc
220+
221+ let ab = {
222+ let $l = [0, 1, 2]
223+ let $s = size($l)
224+ let $acc0 = nil
225+ func $f0_1 ($a,$i) = if (($i >= $s))
226+ then $a
227+ else xs($a, $l[$i])
228+
229+ func $f0_2 ($a,$i) = if (($i >= $s))
230+ then $a
231+ else throw("List size exceeds 3")
232+
233+ $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
234+ }
235+ func S_c (a,b) = {
236+ let S_ = (a + b)
237+ let ca = fraction(D, D, (a * N_COINS))
238+ let cb = fraction(ca, D, (b * N_COINS))
239+ $Tuple2(S_, cb)
240+ }
241+
242+ let $t056835719 = S_c(ab[0], ab[1])
243+ let S_ = $t056835719._1
244+ let c_ = $t056835719._2
245+ let c = fraction(toBigInt(c_), toBigInt(D), toBigInt((Ann * N_COINS)))
246+ let bD = toBigInt(((S_ + (D / Ann)) - D))
247+ func y_proc (acc,_i) = if ((acc._2 == true))
248+ then acc
249+ else {
250+ let y_prev = acc._1
251+ let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
252+ if ((y > y_prev))
253+ then if ((1 >= toInt((y - y_prev))))
254+ then $Tuple2(y, true)
255+ else $Tuple2(y, false)
256+ else if ((1 >= toInt((y_prev - y))))
257+ then $Tuple2(y, true)
258+ else $Tuple2(y, false)
259+ }
260+
261+ let $t062406363 = {
262+ let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
263+ let $s = size($l)
264+ let $acc0 = $Tuple2(toBigInt(D), false)
265+ func $f1_1 ($a,$i) = if (($i >= $s))
266+ then $a
267+ else y_proc($a, $l[$i])
268+
269+ func $f1_2 ($a,$i) = if (($i >= $s))
270+ then $a
271+ else throw("List size exceeds 16")
272+
273+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
274+ }
275+ let y = $t062406363._1
276+ let finished = $t062406363._2
277+ if ((finished == false))
278+ then throw(("get_y() not finished with " + toString(y)))
279+ else toInt(y)
280+ }
281+
282+
283+func get_y_D (A_,i,xp,D) = if (assert((i >= 0)))
284+ then throw("i below zero")
285+ else if (assert((N_COINS > i)))
286+ then throw("i above N_COINS")
287+ else {
288+ let Ann = (A_ * N_COINS)
289+ func S_c (a,b) = {
290+ let S_ = (a + b)
291+ let ca = fraction(D, D, (a * N_COINS))
292+ let cb = fraction(ca, D, (b * N_COINS))
293+ $Tuple2(S_, cb)
294+ }
295+
296+ let $t068977110 = if ((i == 0))
297+ then S_c(xp._2, xp._3)
298+ else if ((i == 1))
299+ then S_c(xp._1, xp._3)
300+ else if ((i == 2))
301+ then S_c(xp._1, xp._2)
302+ else throw("index out of N_COINS")
303+ let S_ = $t068977110._1
304+ let c_ = $t068977110._2
305+ let c = fraction(toBigInt(c_), toBigInt(D), toBigInt((Ann * N_COINS)))
306+ let bD = toBigInt(((S_ + (D / Ann)) - D))
307+ func y_D_proc (acc,_i) = if ((acc._2 == true))
308+ then acc
309+ else {
310+ let y_prev = acc._1
311+ let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
312+ if ((y > y_prev))
313+ then if ((1 >= toInt((y - y_prev))))
314+ then $Tuple2(y, true)
315+ else $Tuple2(y, false)
316+ else if ((1 >= toInt((y_prev - y))))
317+ then $Tuple2(y, true)
318+ else $Tuple2(y, false)
319+ }
320+
321+ let $t076347759 = {
322+ let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
323+ let $s = size($l)
324+ let $acc0 = $Tuple2(toBigInt(D), false)
325+ func $f0_1 ($a,$i) = if (($i >= $s))
326+ then $a
327+ else y_D_proc($a, $l[$i])
328+
329+ func $f0_2 ($a,$i) = if (($i >= $s))
330+ then $a
331+ else throw("List size exceeds 16")
332+
333+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
334+ }
335+ let y = $t076347759._1
336+ let finished = $t076347759._2
337+ if ((finished == false))
338+ then throw(("get_y_D() not finished with " + toString(y)))
339+ else toInt(y)
340+ }
341+
342+
343+func _calc_withdraw_one_coin (_token_amount,i) = {
344+ let amp = _A()
345+ let _fee = ((fee * N_COINS) / (4 * (N_COINS - 1)))
346+ let total_supply = token_quantity
347+ let xp = _xp()
348+ let D0 = get_D(xp, amp)
349+ let D1 = (D0 - fraction(_token_amount, D0, total_supply))
350+ let new_y = get_y_D(amp, i, xp, D1)
351+ let dy_0 = (x_i(xp, i) - new_y)
352+ func xp_reduced_proc (ji,xp_j) = {
353+ let dx_expected = if (ji)
354+ then (fraction(xp_j, D1, D0) - new_y)
355+ else (xp_j - fraction(xp_j, D1, D0))
356+ (xp_j - fraction(_fee, dx_expected, FEE_DENOMINATOR))
357+ }
358+
359+ let xp_reduced = $Tuple3(xp_reduced_proc((i == 0), xp._1), xp_reduced_proc((i == 1), xp._2), xp_reduced_proc((i == 2), xp._3))
360+ let xp_reduced_i = x_i(xp_reduced, i)
361+ let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
362+ $Tuple2(dy, (dy_0 - dy))
363+ }
364+
365+
366+@Callable(msg)
367+func D (xp0,xp1,xp2,amp) = {
368+ let D = get_D_internal(toBigInt(xp0), toBigInt(xp1), toBigInt(xp2), amp)
369+ $Tuple2([IntegerEntry("D", D)], D)
370+ }
371+
372+
373+
374+@Callable(msg)
375+func init (_owner,_config,_coins,_pool_token,_A,_fee,_admin_fee) = if (!(isDataStorageUntouched(this)))
376+ then throw("Already initialized")
377+ else if ((msg.caller != this))
378+ then throw("Self initialization only")
379+ else {
380+ func checkCoin (coin58) = {
381+ let coin = valueOrErrorMessage(fromBase58String(coin58), ("fromBase58String: " + coin58))
382+ let decimals = valueOrErrorMessage(assetInfo(coin), ("assetInfo: " + coin58)).decimals
383+ if ((decimals != DECIMALS))
384+ then throw("wrong decimals")
385+ else coin
386+ }
387+
388+ let coins = split(_coins, ",")
389+ if ((size(coins) != N_COINS))
390+ then throw(("size( coins ) != " + toString(N_COINS)))
391+ else {
392+ let issueToken = Issue(_pool_token, ("LP token for " + _coins), 0, DECIMALS, true)
393+ let tokenId = calculateAssetId(issueToken)
394+ let token58 = toBase58String(tokenId)
395+[BinaryEntry("coins_0", checkCoin(coins[0])), BinaryEntry("coins_1", checkCoin(coins[1])), BinaryEntry("coins_2", checkCoin(coins[2])), IntegerEntry("initial_A", _A), IntegerEntry("future_A", _A), IntegerEntry("fee", _fee), IntegerEntry("admin_fee", _admin_fee), StringEntry("owner", checkAddress(_owner)), StringEntry("config", checkAddress(_config)), IntegerEntry("kill_deadline", (height + KILL_DEADLINE_DT)), BinaryEntry("token", tokenId), StringEntry("token58", token58), BooleanEntry("is_killed", false), BooleanEntry("is_auto_fees", true), issueToken]
396+ }
397+ }
398+
399+
400+
401+@Callable(msg)
402+func add_liquidity (min_mint_amount) = if (assert(!(is_killed)))
403+ then throw("is killed")
404+ else {
405+ let _fee = ((fee * N_COINS) / (4 * (N_COINS - 1)))
406+ let amp = _A()
407+ let token_supply = token_quantity
408+ let D0 = if ((token_supply == 0))
409+ then 0
410+ else get_D_mem(balances_0, balances_1, balances_2, amp)
411+ let payments = msg.payments
412+ let n = size(payments)
413+ func assetValid (coin) = if (if ((coin == coins_0))
414+ then true
415+ else (coin == coins_1))
416+ then true
417+ else (coin == coins_2)
418+
419+ func validPayments (payments,n) = if ((n > 3))
420+ then throw("payments size > 3")
421+ else if ((1 > n))
422+ then throw("payments size < 1")
423+ else if (!(assetValid(payments[0].assetId)))
424+ then throw("unknown payment 1 token")
425+ else if (if ((n > 1))
426+ then !(assetValid(payments[1].assetId))
427+ else false)
428+ then throw("unknown payment 2 token")
429+ else if (if ((n > 2))
430+ then !(assetValid(payments[2].assetId))
431+ else false)
432+ then throw("unknown payment 3 token")
433+ else true
434+
435+ func paymentAmount (coin,payments,n) = (((if ((payments[0].assetId == coin))
436+ then payments[0].amount
437+ else 0) + (if (if ((n > 1))
438+ then (payments[1].assetId == coin)
439+ else false)
440+ then payments[1].amount
441+ else 0)) + (if (if ((n > 2))
442+ then (payments[2].assetId == coin)
443+ else false)
444+ then payments[2].amount
445+ else 0))
446+
447+ if (!(validPayments(payments, n)))
448+ then throw()
449+ else {
450+ let amounts_0 = paymentAmount(coins_0, payments, n)
451+ let amounts_1 = paymentAmount(coins_1, payments, n)
452+ let amounts_2 = paymentAmount(coins_2, payments, n)
453+ if (if ((token_supply == 0))
454+ then if (if ((amounts_0 == 0))
455+ then true
456+ else (amounts_1 == 0))
457+ then true
458+ else (amounts_2 == 0)
459+ else false)
460+ then throw("initial deposit requires all coins")
461+ else {
462+ let new_balances_0 = (balances_0 + amounts_0)
463+ let new_balances_1 = (balances_1 + amounts_1)
464+ let new_balances_2 = (balances_2 + amounts_2)
465+ let D1 = get_D_mem(new_balances_0, new_balances_1, new_balances_2, amp)
466+ if (assert((D1 > D0)))
467+ then throw("D1 > D0")
468+ else {
469+ let $t01279714726 = if ((token_supply > 0))
470+ then {
471+ func feesProc (old_balance,new_balance) = {
472+ let ideal_balance = fraction(D1, old_balance, D0)
473+ let difference = if ((ideal_balance > new_balance))
474+ then (ideal_balance - new_balance)
475+ else (new_balance - ideal_balance)
476+ fraction(_fee, difference, FEE_DENOMINATOR)
477+ }
478+
479+ let fees_0 = feesProc(balances_0, new_balances_0)
480+ let fees_1 = feesProc(balances_1, new_balances_1)
481+ let fees_2 = feesProc(balances_2, new_balances_2)
482+ let admin_fees_0 = fraction(fees_0, admin_fee, FEE_DENOMINATOR)
483+ let admin_fees_1 = fraction(fees_1, admin_fee, FEE_DENOMINATOR)
484+ let admin_fees_2 = fraction(fees_2, admin_fee, FEE_DENOMINATOR)
485+ $Tuple5((new_balances_0 - admin_fees_0), (new_balances_1 - admin_fees_1), (new_balances_2 - admin_fees_2), get_D_mem((new_balances_0 - fees_0), (new_balances_1 - fees_1), (new_balances_2 - fees_2), amp), (((nil ++ (if (if (is_auto_fees)
486+ then (admin_fees_0 > 0)
487+ else false)
488+ then [ScriptTransfer(owner, admin_fees_0, coins_0)]
489+ else nil)) ++ (if (if (is_auto_fees)
490+ then (admin_fees_1 > 0)
491+ else false)
492+ then [ScriptTransfer(owner, admin_fees_1, coins_1)]
493+ else nil)) ++ (if (if (is_auto_fees)
494+ then (admin_fees_2 > 0)
495+ else false)
496+ then [ScriptTransfer(owner, admin_fees_2, coins_2)]
497+ else nil)))
498+ }
499+ else $Tuple5(new_balances_0, new_balances_1, new_balances_2, D1, nil)
500+ let final_balances_0 = $t01279714726._1
501+ let final_balances_1 = $t01279714726._2
502+ let final_balances_2 = $t01279714726._3
503+ let D2 = $t01279714726._4
504+ let fees_actions = $t01279714726._5
505+ let mint_amount = if ((token_supply == 0))
506+ then D1
507+ else fraction(token_supply, (D2 - D0), D0)
508+ if (assert((mint_amount >= min_mint_amount)))
509+ then throw("Slippage screwed you")
510+ else ([IntegerEntry("balances_0", final_balances_0), IntegerEntry("balances_1", final_balances_1), IntegerEntry("balances_2", final_balances_2), Reissue(token, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, token)] ++ fees_actions)
511+ }
512+ }
513+ }
514+ }
515+
516+
517+
518+@Callable(msg)
519+func get_dy (i,j,dx) = {
520+ let xp = _xp()
521+ let xp_i = x_i(xp, i)
522+ let xp_j = x_i(xp, j)
523+ let x = (xp_i + dx)
524+ let y = get_y(i, j, x, xp)
525+ let dy = ((xp_j - y) - 1)
526+ let _fee = fraction(fee, dy, FEE_DENOMINATOR)
527+ $Tuple2(nil, (dy - _fee))
528+ }
529+
530+
531+
532+@Callable(msg)
533+func exchange (j,min_dy) = if (assert(!(is_killed)))
534+ then throw("is killed")
535+ else if ((size(msg.payments) != 1))
536+ then throw("size( payments ) != 1")
537+ else {
538+ let payment = msg.payments[0]
539+ let tokenIn = payment.assetId
540+ let dx = payment.amount
541+ let i = if ((tokenIn == coins_0))
542+ then 0
543+ else if ((tokenIn == coins_1))
544+ then 1
545+ else if ((tokenIn == coins_2))
546+ then 2
547+ else throw("unknown token in")
548+ let tokenOut = if ((j == 0))
549+ then coins_0
550+ else if ((j == 1))
551+ then coins_1
552+ else if ((j == 2))
553+ then coins_2
554+ else throw("unknown token out")
555+ let xp = _xp_mem(balances)
556+ let xp_i = x_i(xp, i)
557+ let xp_j = x_i(xp, j)
558+ let x = (xp_i + dx)
559+ let y = get_y(i, j, x, xp)
560+ let _dy = ((xp_j - y) - 1)
561+ let dy_fee = fraction(_dy, fee, FEE_DENOMINATOR)
562+ let dy = (_dy - dy_fee)
563+ if (assert((dy >= min_dy)))
564+ then throw("Exchange resulted in fewer coins than expected")
565+ else {
566+ let dy_admin_fee = fraction(dy_fee, admin_fee, FEE_DENOMINATOR)
567+ func balanceProc (old_balance,_i) = if ((_i == i))
568+ then (old_balance + dx)
569+ else if ((_i == j))
570+ then ((old_balance - dy) - dy_admin_fee)
571+ else old_balance
572+
573+ let final_balances_0 = balanceProc(balances_0, 0)
574+ let final_balances_1 = balanceProc(balances_1, 1)
575+ let final_balances_2 = balanceProc(balances_2, 2)
576+ $Tuple2(([IntegerEntry("balances_0", final_balances_0), IntegerEntry("balances_1", final_balances_1), IntegerEntry("balances_2", final_balances_2), ScriptTransfer(msg.caller, dy, tokenOut)] ++ (if (if (is_auto_fees)
577+ then (dy_admin_fee > 0)
578+ else false)
579+ then [ScriptTransfer(owner, dy_admin_fee, tokenOut)]
580+ else nil)), dy)
581+ }
582+ }
583+
584+
585+
586+@Callable(msg)
587+func remove_liquidity (min_amounts_0,min_amounts_1,min_amounts_2) = if ((size(msg.payments) != 1))
588+ then throw("size( payments ) != 1")
589+ else {
590+ let payment = msg.payments[0]
591+ let tokenIn = payment.assetId
592+ if ((tokenIn != token))
593+ then throw("unknown token")
594+ else {
595+ let _amount = payment.amount
596+ let total_supply = token_quantity
597+ let value_0 = fraction(balances_0, _amount, total_supply)
598+ let value_1 = fraction(balances_1, _amount, total_supply)
599+ let value_2 = fraction(balances_2, _amount, total_supply)
600+ if (assert(if (if ((value_0 >= min_amounts_0))
601+ then (value_1 >= min_amounts_1)
602+ else false)
603+ then (value_2 >= min_amounts_2)
604+ else false))
605+ then throw("Withdrawal resulted in fewer coins than expected")
606+ else {
607+ let final_balances_0 = (balances_0 - value_0)
608+ let final_balances_1 = (balances_1 - value_1)
609+ let final_balances_2 = (balances_2 - value_2)
610+[IntegerEntry("balances_0", final_balances_0), IntegerEntry("balances_1", final_balances_1), IntegerEntry("balances_2", final_balances_2), ScriptTransfer(msg.caller, value_0, coins_0), ScriptTransfer(msg.caller, value_1, coins_1), ScriptTransfer(msg.caller, value_2, coins_2), Burn(token, _amount)]
611+ }
612+ }
613+ }
614+
615+
616+
617+@Callable(msg)
618+func calc_withdraw_one_coin (_token_amount,i) = $Tuple2(nil, _calc_withdraw_one_coin(_token_amount, i)._1)
619+
620+
621+
622+@Callable(msg)
623+func remove_liquidity_one_coin (i,min_amount) = if (assert(!(is_killed)))
624+ then throw("is killed")
625+ else if ((size(msg.payments) != 1))
626+ then throw("size( payments ) != 1")
627+ else {
628+ let payment = msg.payments[0]
629+ let tokenIn = payment.assetId
630+ if ((tokenIn != token))
631+ then throw("unknown token")
632+ else {
633+ let _token_amount = payment.amount
634+ let $t01927819342 = _calc_withdraw_one_coin(_token_amount, i)
635+ let dy = $t01927819342._1
636+ let dy_fee = $t01927819342._2
637+ if (assert((dy >= min_amount)))
638+ then throw("Not enough coins removed")
639+ else {
640+ let dy_admin_fee = fraction(dy_fee, admin_fee, FEE_DENOMINATOR)
641+ let dy_and_fee = (dy + dy_admin_fee)
642+ let $t01954120048 = if ((i == 0))
643+ then $Tuple2([IntegerEntry("balances_0", (balances_0 - dy_and_fee)), ScriptTransfer(msg.caller, dy, coins_0)], coins_0)
644+ else if ((i == 1))
645+ then $Tuple2([IntegerEntry("balances_1", (balances_1 - dy_and_fee)), ScriptTransfer(msg.caller, dy, coins_1)], coins_1)
646+ else if ((i == 2))
647+ then $Tuple2([IntegerEntry("balances_2", (balances_2 - dy_and_fee)), ScriptTransfer(msg.caller, dy, coins_2)], coins_2)
648+ else throw("index out of N_COINS")
649+ let base_actions = $t01954120048._1
650+ let tokenOut = $t01954120048._2
651+ ((base_actions ++ [Burn(token, _token_amount)]) ++ (if (if (is_auto_fees)
652+ then (dy_admin_fee > 0)
653+ else false)
654+ then [ScriptTransfer(owner, dy_admin_fee, tokenOut)]
655+ else nil))
656+ }
657+ }
658+ }
659+
660+
661+
662+@Callable(msg)
663+func A () = $Tuple2(nil, _A())
664+
665+
666+
667+@Callable(msg)
668+func get_virtual_price () = {
669+ let D = get_D(_xp(), _A())
670+ let token_supply = token_quantity
671+ $Tuple2(nil, fraction(D, PRECISION, token_supply))
672+ }
673+
674+
675+
676+@Callable(msg)
677+func calc_token_amount (amounts_0,amounts_1,amounts_2,deposit) = {
678+ let amp = _A()
679+ let D0 = get_D_mem(balances_0, balances_1, balances_2, amp)
680+ let new_balances_0 = (balances_0 + (if (deposit)
681+ then amounts_0
682+ else -(amounts_0)))
683+ let new_balances_1 = (balances_1 + (if (deposit)
684+ then amounts_1
685+ else -(amounts_1)))
686+ let new_balances_2 = (balances_2 + (if (deposit)
687+ then amounts_2
688+ else -(amounts_2)))
689+ let D1 = get_D_mem(new_balances_0, new_balances_1, new_balances_2, amp)
690+ let token_amount = token_quantity
691+ let diff = if (deposit)
692+ then (D1 - D0)
693+ else (D0 - D1)
694+ $Tuple2(nil, fraction(diff, token_amount, D0))
695+ }
696+
697+
698+
699+@Callable(msg)
700+func ramp_A (_future_A,_future_time) = if (assert((msg.caller == owner)))
701+ then throw("only owner")
702+ else if (assert((block_timestamp >= (initial_A_time + MIN_RAMP_TIME))))
703+ then throw("too often")
704+ else if (assert((_future_time >= (block_timestamp + MIN_RAMP_TIME))))
705+ then throw("insufficient time")
706+ else {
707+ let _initial_A = _A()
708+ if (assert(if ((_future_A > 0))
709+ then (MAX_A > _future_A)
710+ else false))
711+ then throw("out of base range")
712+ else if (assert(if (if ((_future_A >= _initial_A))
713+ then ((_initial_A * MAX_A_CHANGE) >= _future_A)
714+ else false)
715+ then true
716+ else if ((_initial_A > _future_A))
717+ then ((_future_A * MAX_A_CHANGE) >= _initial_A)
718+ else false))
719+ then throw("out of range")
720+ else [IntegerEntry("initial_A", _initial_A), IntegerEntry("future_A", _future_A), IntegerEntry("initial_A_time", block_timestamp), IntegerEntry("future_A_time", _future_time)]
721+ }
722+
723+
724+
725+@Callable(msg)
726+func stop_ramp_A () = if (assert((msg.caller == owner)))
727+ then throw("only owner")
728+ else {
729+ let current_A = _A()
730+[IntegerEntry("initial_A", current_A), IntegerEntry("future_A", current_A), IntegerEntry("initial_A_time", block_timestamp), IntegerEntry("future_A_time", block_timestamp)]
731+ }
732+
733+
734+
735+@Callable(msg)
736+func commit_new_fee (new_fee,new_admin_fee) = if (assert((msg.caller == owner)))
737+ then throw("only owner")
738+ else if (assert((admin_actions_deadline == 0)))
739+ then throw("active action")
740+ else if (assert((MAX_FEE >= new_fee)))
741+ then throw("fee exceeds maximum")
742+ else if (assert((MAX_ADMIN_FEE >= new_admin_fee)))
743+ then throw("admin fee exceeds maximum")
744+ else {
745+ let _deadline = (block_timestamp + ADMIN_ACTIONS_DELAY)
746+[IntegerEntry("admin_actions_deadline", _deadline), IntegerEntry("future_fee", new_fee), IntegerEntry("future_admin_fee", new_admin_fee)]
747+ }
748+
749+
750+
751+@Callable(msg)
752+func apply_new_fee () = if (assert((msg.caller == owner)))
753+ then throw("only owner")
754+ else if (assert((block_timestamp >= admin_actions_deadline)))
755+ then throw("insufficient time")
756+ else if (assert((admin_actions_deadline != 0)))
757+ then throw("no active action")
758+ else [IntegerEntry("admin_actions_deadline", 0), IntegerEntry("fee", future_fee), IntegerEntry("admin_fee", future_admin_fee)]
759+
760+
761+
762+@Callable(msg)
763+func revert_new_parameters () = if (assert((msg.caller == owner)))
764+ then throw("only owner")
765+ else [IntegerEntry("admin_actions_deadline", 0)]
766+
767+
768+
769+@Callable(msg)
770+func commit_transfer_ownership (_owner) = if (assert((msg.caller == owner)))
771+ then throw("only owner")
772+ else if (assert((transfer_ownership_deadline == 0)))
773+ then throw("active transfer")
774+ else {
775+ let _deadline = (block_timestamp + ADMIN_ACTIONS_DELAY)
776+[IntegerEntry("transfer_ownership_deadline", _deadline), StringEntry("future_owner", checkAddress(_owner))]
777+ }
778+
779+
780+
781+@Callable(msg)
782+func apply_transfer_ownership () = if (assert((msg.caller == owner)))
783+ then throw("only owner")
784+ else if (assert((block_timestamp >= transfer_ownership_deadline)))
785+ then throw("insufficient time")
786+ else if (assert((transfer_ownership_deadline != 0)))
787+ then throw("no active transfer")
788+ else [IntegerEntry("transfer_ownership_deadline", 0), StringEntry("owner", future_owner)]
789+
790+
791+
792+@Callable(msg)
793+func revert_transfer_ownership () = if (assert((msg.caller == owner)))
794+ then throw("only owner")
795+ else [IntegerEntry("transfer_ownership_deadline", 0)]
796+
797+
798+
799+@Callable(msg)
800+func admin_balances (i) = $Tuple2(nil, admin_balance(i))
801+
802+
803+
804+@Callable(msg)
805+func withdraw_admin_fees () = if (assert((msg.caller == owner)))
806+ then throw("only owner")
807+ else [ScriptTransfer(owner, admin_balance(0), coins_0), ScriptTransfer(owner, admin_balance(1), coins_1), ScriptTransfer(owner, admin_balance(2), coins_2)]
808+
809+
810+
811+@Callable(msg)
812+func donate_admin_fees () = if (assert((msg.caller == owner)))
813+ then throw("only owner")
814+ else [IntegerEntry("balances_0", (admin_balance(0) + balances_0)), IntegerEntry("balances_1", (admin_balance(1) + balances_1)), IntegerEntry("balances_2", (admin_balance(2) + balances_2))]
815+
816+
817+
818+@Callable(msg)
819+func set_auto_fees (_is_auto_fees) = if (assert((msg.caller == owner)))
820+ then throw("only owner")
821+ else [BooleanEntry("is_auto_fees", _is_auto_fees)]
822+
823+
824+
825+@Callable(msg)
826+func kill_me () = if (assert((msg.caller == owner)))
827+ then throw("only owner")
828+ else if (assert((kill_deadline > block_timestamp)))
829+ then throw("deadline has passed")
830+ else [BooleanEntry("is_killed", true)]
831+
832+
833+
834+@Callable(msg)
835+func unkill_me () = if (assert((msg.caller == owner)))
836+ then throw("only owner")
837+ else [BooleanEntry("is_killed", false)]
838+
839+

github/deemru/w8io/026f985 
42.27 ms