tx · E9UKfZ1BvAZ9E5bFRbs1oEn96SR5GHKWxjpEGyN7LfYL

3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT:  -0.03800000 Waves

2022.08.18 15:03 [2189880] smart account 3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT > SELF 0.00000000 Waves

{ "type": 13, "id": "E9UKfZ1BvAZ9E5bFRbs1oEn96SR5GHKWxjpEGyN7LfYL", "fee": 3800000, "feeAssetId": null, "timestamp": 1660824208953, "version": 2, "chainId": 84, "sender": "3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT", "senderPublicKey": "D1BL65meykxFZTCuq7jq9HSGLLnWvQamQPUNrguW5w39", "proofs": [ "3TXAieWhf7AFf42A5DFdyiquPR4xoGesaS5FhHKKWgTPyC5AK5obUYrwyJciTbDSsyJ8Rbf3ko3RjjPrsFPkK2hG" ], "script": "base64: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CWlkeFBvb2xTdAQAAAAEbHBFbQgJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAARscElkAgAAAAhXciBscCBhcwAAAAhxdWFudGl0eQQAAAAJYW1CYWxhbmNlAwUAAAAGaXNFdmFsCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAAB2FtSWRTdHIDAwUAAAAKaXNPbmVBc3NldAkAAAAAAAACBQAAAAVwbXRJZAUAAAAHYW1JZFN0cgcJAABlAAAAAgkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAdhbUlkU3RyBQAAAAZwbXRBbXQDBQAAAAppc09uZUFzc2V0CQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAAB2FtSWRTdHIJAABlAAAAAgkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAdhbUlkU3RyBQAAAAdpbkFtQW10BAAAAAlwckJhbGFuY2UDBQAAAAZpc0V2YWwJAQAAAA1nZXRBY2NCYWxhbmNlAAAAAQUAAAAHcHJJZFN0cgMDBQAAAAppc09uZUFzc2V0CQAAAAAAAAIFAAAABXBtdElkBQAAAAdwcklkU3RyBwkAAGUAAAACCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAAB3BySWRTdHIFAAAABnBtdEFtdAMFAAAACmlzT25lQXNzZXQJAQAAAA1nZXRBY2NCYWxhbmNlAAAAAQUAAAAHcHJJZFN0cgkAAGUAAAACCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAAB3BySWRTdHIFAAAAB2luUHJBbXQEAAAAD2luQW1Bc3NldEFtdFgxOAkBAAAAAnQxAAAAAgUAAAAHaW5BbUFtdAUAAAAGYW10RGNtBAAAAA9pblByQXNzZXRBbXRYMTgJAQAAAAJ0MQAAAAIFAAAAB2luUHJBbXQFAAAACHByaWNlRGNtBAAAAAx1c2VyUHJpY2VYMTgJAQAAAARjcGJpAAAAAgUAAAAPaW5QckFzc2V0QW10WDE4BQAAAA9pbkFtQXNzZXRBbXRYMTgEAAAADGFtQmFsYW5jZVgxOAkBAAAAAnQxAAAAAgUAAAAJYW1CYWxhbmNlBQAAAAZhbXREY20EAAAADHByQmFsYW5jZVgxOAkBAAAAAnQxAAAAAgUAAAAJcHJCYWxhbmNlBQAAAAhwcmljZURjbQQAAAABcgMJAAAAAAAAAgUAAAAEbHBFbQAAAAAAAAAAAAQAAAALY3VyUHJpY2VYMTgFAAAACnplcm9CaWdJbnQEAAAAC3NsaXBwYWdlWDE4BQAAAAp6ZXJvQmlnSW50BAAAAAhscEFtdFgxOAkAAHYAAAAGCQABOQAAAAIFAAAAD2luQW1Bc3NldEFtdFgxOAUAAAAPaW5QckFzc2V0QW10WDE4AAAAAAAAAAAACQABNgAAAAEAAAAAAAAAAAUAAAAAAAAAAAEAAAAAAAAAAAAFAAAABERPV04JAAUXAAAABQkBAAAAAmYxAAAAAgUAAAAIbHBBbXRYMTgFAAAABnNjYWxlOAkBAAAAAmYxAAAAAgUAAAAPaW5BbUFzc2V0QW10WDE4BQAAAAZhbXREY20JAQAAAAJmMQAAAAIFAAAAD2luUHJBc3NldEFtdFgxOAUAAAAIcHJpY2VEY20JAQAAAARjcGJpAAAAAgkAATcAAAACBQAAAAxwckJhbGFuY2VYMTgFAAAAD2luUHJBc3NldEFtdFgxOAkAATcAAAACBQAAAAxhbUJhbGFuY2VYMTgFAAAAD2luQW1Bc3NldEFtdFgxOAUAAAALc2xpcHBhZ2VYMTgEAAAAC2N1clByaWNlWDE4CQEAAAAEY3BiaQAAAAIFAAAADHByQmFsYW5jZVgxOAUAAAAMYW1CYWxhbmNlWDE4BAAAAA9zbGlwcGFnZVJlYWxYMTgJAAE8AAAAAwkBAAAAA2FicwAAAAEJAAE4AAAAAgUAAAALY3VyUHJpY2VYMTgFAAAADHVzZXJQcmljZVgxOAUAAAAHc2NhbGUxOAUAAAALY3VyUHJpY2VYMTgEAAAAC3NsaXBwYWdlWDE4CQEAAAACdDEAAAACBQAAAAhzbGlwcGFnZQUAAAAGc2NhbGU4AwMJAQAAAAIhPQAAAAIFAAAAC2N1clByaWNlWDE4BQAAAAp6ZXJvQmlnSW50CQABPwAAAAIFAAAAD3NsaXBwYWdlUmVhbFgxOAUAAAALc2xpcHBhZ2VYMTgHCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAD1ByaWNlIHNsaXBwYWdlIAkAAaYAAAABBQAAAA9zbGlwcGFnZVJlYWxYMTgCAAAAAyA+IAkAAaYAAAABBQAAAAtzbGlwcGFnZVgxOAQAAAANbHBFbWlzc2lvblgxOAkBAAAAAnQxAAAAAgUAAAAEbHBFbQUAAAAGc2NhbGU4BAAAAApwclZpYUFtWDE4CQABPAAAAAMFAAAAD2luQW1Bc3NldEFtdFgxOAUAAAALY3VyUHJpY2VYMTgFAAAAB3NjYWxlMTgEAAAACmFtVmlhUHJYMTgJAAE8AAAAAwUAAAAPaW5QckFzc2V0QW10WDE4BQAAAAdzY2FsZTE4BQAAAAtjdXJQcmljZVgxOAQAAAAMZXhwZWN0ZWRBbXRzAwkAAT8AAAACBQAAAApwclZpYUFtWDE4BQAAAA9pblByQXNzZXRBbXRYMTgJAAUUAAAAAgUAAAAKYW1WaWFQclgxOAUAAAAPaW5QckFzc2V0QW10WDE4CQAFFAAAAAIFAAAAD2luQW1Bc3NldEFtdFgxOAUAAAAKcHJWaWFBbVgxOAQAAAARZXhwQW10QXNzZXRBbXRYMTgIBQAAAAxleHBlY3RlZEFtdHMAAAACXzEEAAAAE2V4cFByaWNlQXNzZXRBbXRYMTgIBQAAAAxleHBlY3RlZEFtdHMAAAACXzIEAAAACGxwQW10WDE4CQABPAAAAAMFAAAADWxwRW1pc3Npb25YMTgFAAAAE2V4cFByaWNlQXNzZXRBbXRYMTgFAAAADHByQmFsYW5jZVgxOAkABRcAAAAFCQEAAAACZjEAAAACBQAAAAhscEFtdFgxOAUAAAAGc2NhbGU4CQEAAAACZjEAAAACBQAAABFleHBBbXRBc3NldEFtdFgxOAUAAAAGYW10RGNtCQEAAAACZjEAAAACBQAAABNleHBQcmljZUFzc2V0QW10WDE4BQAAAAhwcmljZURjbQUAAAALY3VyUHJpY2VYMTgFAAAAC3NsaXBwYWdlWDE4BAAAAAljYWxjTHBBbXQIBQAAAAFyAAAAAl8xBAAAAA5jYWxjQW1Bc3NldFBtdAgFAAAAAXIAAAACXzIEAAAADmNhbGNQckFzc2V0UG10CAUAAAABcgAAAAJfMwQAAAAIY3VyUHJpY2UJAQAAAAJmMQAAAAIIBQAAAAFyAAAAAl80BQAAAAZzY2FsZTgEAAAADHNsaXBwYWdlQ2FsYwkBAAAAAmYxAAAAAggFAAAAAXIAAAACXzUFAAAABnNjYWxlOAMJAABn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bQgFAAAADSR0MDMxMjA4MzEzMTIAAAACXzEEAAAABW91dFByCAUAAAANJHQwMzEyMDgzMTMxMgAAAAJfMgQAAAAOdG90YWxBbW91bnRSYXcJAABkAAAAAgUAAAAFb3V0QW0FAAAABW91dFByBAAAAA0kdDAzMTM1MjMxNDA3CQEAAAAHdGFrZUZlZQAAAAEFAAAADnRvdGFsQW1vdW50UmF3BAAAAAt0b3RhbEFtb3VudAgFAAAADSR0MDMxMzUyMzE0MDcAAAACXzEEAAAACWZlZUFtb3VudAgFAAAADSR0MDMxMzUyMzE0MDcAAAACXzIEAAAAEW91dEFzc2V0SWRPcldhdmVzAwkAAAAAAAACBQAAAApvdXRBc3NldElkAgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABBQAAAApvdXRBc3NldElkBAAAABBzZW5kRmVlVG9NYXRjaGVyAwkAAGYAAAACBQAAAAlmZWVBbW91bnQAAAAAAAAAAAAJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAObWF0Y2hlckFkZHJlc3MFAAAACWZlZUFtb3VudAUAAAARb3V0QXNzZXRJZE9yV2F2ZXMFAAAAA25pbAUAAAADbmlsBAAAAAhjdXJQclgxOAkBAAAABGNwYmkAAAACCQEAAAACdDEAAAACBQAAAAlwckJhbGFuY2UFAAAABXByRGNtCQEAAAACdDEAAAACBQAAAAlhbUJhbGFuY2UFAAAABWFtRGNtBAAAAAVjdXJQcgkBAAAAAmYxAAAAAgUAAAAIY3VyUHJYMTgFAAAABnNjYWxlOAQAAAAFc3RhdGUJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAALdXNlckFkZHJlc3MFAAAAC3RvdGFsQW1vdW50BQAAABFvdXRBc3NldElkT3JXYXZlcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAADZ2F1AAAAAgkABCUAAAABBQAAAAt1c2VyQWRkcmVzcwUAAAAGdHhJZDU4CQEAAAARZGF0YUdldEFjdGlvbkluZm8AAAAGBQAAAAVvdXRBbQUAAAAFb3V0UHIFAAAABnBtdEFtdAUAAAAFY3VyUHIFAAAABmhlaWdodAgFAAAACWxhc3RCbG9jawAA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", "height": 2189880, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8MAfPt5EzZNjJoHATMesYcYR7KUk5g8dmXWiBnwWqx5Y Next: 9CsjET2RraBMc9dar653yEeKvnr2mNJBERh1yFRaR2u3 Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 6 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scale8 = 100000000
5757
5858 let feePermilleDefault = 0
5959
60-func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
60+func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6161
6262
63-func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
63+func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6464
6565
6666 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
7171 else val
7272
7373
74-func keyFactoryContact () = "%s__factoryContract"
74+func fc () = "%s__factoryContract"
7575
7676
77-func keyManagerPublicKey () = "%s__managerPublicKey"
77+func mpk () = "%s__managerPublicKey"
7878
7979
80-func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
80+func pmpk () = "%s__pendingManagerPublicKey"
8181
8282
83-func keyPriceLast () = "%s%s__price__last"
83+func pl () = "%s%s__price__last"
8484
8585
86-func keyPriceHistory (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
86+func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
8787
8888
89-func keyPutActionByUser (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
89+func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
9090
9191
92-func keyGetActionByUser (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
92+func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
9393
9494
95-func keyAmountAsset () = "%s__amountAsset"
95+func aa () = "%s__amountAsset"
9696
9797
98-func keyPriceAsset () = "%s__priceAsset"
98+func pa () = "%s__priceAsset"
9999
100100
101-func keyAmplificator () = "%s__amp"
101+func amp () = "%s__amp"
102102
103103
104-func keyAddonAddress () = "%s__addonAddr"
104+func ada () = "%s__addonAddr"
105105
106106
107107 let keyFeePermille = "%s__feePermille"
123123 func aps () = "%s__shutdown"
124124
125125
126-func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
127-
128-
129-func throwOrderError (orV,sendrV,matchV) = throwErr(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
126+func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
130127
131128
132129 func str (val) = match val {
133130 case valStr: String =>
134131 valStr
135132 case _ =>
136- throwErr("fail cast to String")
133+ throw("fail cast to String")
137134 }
138135
139136
140-func getStringOrFail (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
137+func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
141138
142139
143-func getIntOrFail (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
140+func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
144141
145142
146-let factoryContract = addressFromStringValue(getStringOrFail(this, keyFactoryContact()))
143+let fca = addressFromStringValue(strf(this, fc()))
147144
148-let amplificator = getStringOrFail(this, keyAmplificator())
145+let A = strf(this, amp())
149146
150-func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, aps()), false)
147+func igs () = valueOrElse(getBoolean(fca, aps()), false)
151148
152149
153-func getMatcherPubOrFail () = fromBase58String(getStringOrFail(factoryContract, mtpk()))
150+func mp () = fromBase58String(strf(fca, mtpk()))
154151
155152
156-let matcherAddress = addressFromPublicKey(getMatcherPubOrFail())
153+let matcherAddress = addressFromPublicKey(mp())
157154
158-func getPoolConfig () = {
159- let amtAs = getStringOrFail(this, keyAmountAsset())
160- let priceAs = getStringOrFail(this, keyPriceAsset())
161- let iPriceAs = getIntOrFail(factoryContract, mba(priceAs))
162- let iAmtAs = getIntOrFail(factoryContract, mba(amtAs))
163- split(getStringOrFail(factoryContract, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
155+func gpc () = {
156+ let amtAs = strf(this, aa())
157+ let priceAs = strf(this, pa())
158+ let iPriceAs = intf(fca, mba(priceAs))
159+ let iAmtAs = intf(fca, mba(amtAs))
160+ split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
164161 }
165162
166163
167-func getFactoryConfig () = split(getStringOrFail(factoryContract, fcfg()), SEP)
164+func gfc () = split(strf(fca, fcfg()), SEP)
168165
169166
170167 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slipByUser,slippageReal,txHeight,txTimestamp,slipageAmAmt,slipagePrAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slipByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
178175 else assetBalance(this, fromBase58String(assetId))
179176
180177
181-func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
178+func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
182179
183180
184-func validateAbsDiff (estimateLP,outLp,slippage) = {
185- let diff = fraction((estimateLP - outLp), scale8BigInt, outLp)
181+func vad (A1,A2,slippage) = {
182+ let diff = fraction((A1 - A2), scale8BigInt, A2)
186183 let pass = ((slippage - abs(diff)) > zeroBigInt)
187184 if (!(pass))
188- then throwErr(("Big slippage: " + toString(diff)))
189- else $Tuple2(pass, min([estimateLP, outLp]))
185+ then throw(("Big slpg: " + toString(diff)))
186+ else $Tuple2(pass, min([A1, A2]))
190187 }
191188
192189
193-func validateD (D1,D0,slippage) = {
190+func vd (D1,D0,slpg) = {
194191 let diff = fraction(D0, scale8BigInt, D1)
195- let fail = (slippage > diff)
192+ let fail = (slpg > diff)
196193 if (if (fail)
197194 then true
198195 else (D0 > D1))
199- then throwErr(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slippage)))
196+ then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
200197 else fail
201198 }
202199
203200
204-func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
205- let amtAsAmtX18 = toX18(amAmt, amAssetDcm)
206- let prAsAmtX18 = toX18(prAmt, prAssetDcm)
207- calcPriceBigInt(prAsAmtX18, amtAsAmtX18)
201+func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
202+ let amtAsAmtX18 = t1(amAmt, amAssetDcm)
203+ let prAsAmtX18 = t1(prAmt, prAssetDcm)
204+ cpbi(prAsAmtX18, amtAsAmtX18)
208205 }
209206
210207
211208 func calcPrices (amAmt,prAmt,lpAmt) = {
212- let cfg = getPoolConfig()
209+ let cfg = gpc()
213210 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
214211 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
215- let priceX18 = privateCalcPrice(amtAsDcm, prAsDcm, amAmt, prAmt)
216- let amAmtX18 = toX18(amAmt, amtAsDcm)
217- let prAmtX18 = toX18(prAmt, prAsDcm)
218- let lpAmtX18 = toX18(lpAmt, scale8)
219- let lpPrInAmAsX18 = calcPriceBigInt(amAmtX18, lpAmtX18)
220- let lpPrInPrAsX18 = calcPriceBigInt(prAmtX18, lpAmtX18)
212+ let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
213+ let amAmtX18 = t1(amAmt, amtAsDcm)
214+ let prAmtX18 = t1(prAmt, prAsDcm)
215+ let lpAmtX18 = t1(lpAmt, scale8)
216+ let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
217+ let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
221218 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
222219 }
223220
224221
225222 func calculatePrices (amAmt,prAmt,lpAmt) = {
226223 let p = calcPrices(amAmt, prAmt, lpAmt)
227-[fromX18(p[0], scale8), fromX18(p[1], scale8), fromX18(p[2], scale8)]
224+[f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
228225 }
229226
230227
231-func estimateGetOperation (txId58,paymentAssetId,paymentLpAmount,userAddress) = {
232- let cfg = getPoolConfig()
233- let lpAssetId = cfg[idxLPAsId]
234- let amountId = cfg[idxAmAsId]
235- let priceId = cfg[idxPrAsId]
236- let amountDecimals = parseIntValue(cfg[idxAmtAsDcm])
237- let priceDecimals = parseIntValue(cfg[idxPriceAsDcm])
228+func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
229+ let cfg = gpc()
230+ let lpId = cfg[idxLPAsId]
231+ let amId = cfg[idxAmAsId]
232+ let prId = cfg[idxPrAsId]
233+ let amDcm = parseIntValue(cfg[idxAmtAsDcm])
234+ let prDcm = parseIntValue(cfg[idxPriceAsDcm])
238235 let sts = cfg[idxPoolSt]
239- let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpAssetId)), "Wrong LP id").quantity
240- let validationBlock = if ((lpAssetId == paymentAssetId))
241- then true
242- else throwErr("Wrong payment asset")
243- if ((validationBlock == validationBlock))
244- then {
245- let decimals = if ((amountDecimals >= priceDecimals))
246- then amountDecimals
247- else priceDecimals
248- if ((decimals == decimals))
249- then {
250- let amountBalance = getAccBalance(amountId)
251- let amountBalanceX18 = toX18(amountBalance, decimals)
252- let priceBalance = getAccBalance(priceId)
253- let priceBalanceX18 = toX18(priceBalance, decimals)
254- let currentPriceX18 = calcPriceBigInt(priceBalanceX18, amountBalanceX18)
255- let curPrice = fromX18(currentPriceX18, scale8)
256- let paymentLpAmountX18 = toX18(paymentLpAmount, scale8)
257- let lpEmissionX18 = toX18(lpEmission, scale8)
258- let outAmountAmountX18 = fraction(amountBalanceX18, paymentLpAmountX18, lpEmissionX18)
259- let outPriceAmountX18 = fraction(priceBalanceX18, paymentLpAmountX18, lpEmissionX18)
260- let outAmountAmount = fromX18(outAmountAmountX18, decimals)
261- let outPriceAmount = fromX18(outPriceAmountX18, decimals)
262- let state = if ((txId58 == ""))
263- then nil
264- else [ScriptTransfer(userAddress, outAmountAmount, if ((amountId == "WAVES"))
265- then unit
266- else fromBase58String(amountId)), ScriptTransfer(userAddress, outPriceAmount, if ((priceId == "WAVES"))
267- then unit
268- else fromBase58String(priceId)), StringEntry(keyGetActionByUser(toString(userAddress), txId58), dataGetActionInfo(outAmountAmount, outPriceAmount, paymentLpAmount, curPrice, height, lastBlock.timestamp)), IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice)]
269- $Tuple10(outAmountAmount, outPriceAmount, amountId, priceId, amountBalance, priceBalance, lpEmission, currentPriceX18, sts, state)
270- }
271- else throw("Strict value is not equal to itself.")
236+ let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
237+ if ((lpId != pmtAssetId))
238+ then throw("Wrong pmt asset")
239+ else {
240+ let amBalance = getAccBalance(amId)
241+ let amBalanceX18 = t1(amBalance, amDcm)
242+ let prBalance = getAccBalance(prId)
243+ let prBalanceX18 = t1(prBalance, prDcm)
244+ let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
245+ let curPrice = f1(curPriceX18, scale8)
246+ let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
247+ let lpEmissX18 = t1(lpEmiss, scale8)
248+ let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
249+ let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
250+ let outAmAmt = f1(outAmAmtX18, amDcm)
251+ let outPrAmt = f1(outPrAmtX18, prDcm)
252+ let state = if ((txId58 == ""))
253+ then nil
254+ else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
255+ then unit
256+ else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
257+ then unit
258+ else fromBase58String(prId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
259+ $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
272260 }
273- else throw("Strict value is not equal to itself.")
274261 }
275262
276263
277-func estimatePutOperation (txId58,slippageTolerance,inAmountAssetAmount,inAmountAssetId,inPriceAssetAmount,inPriceAssetId,userAddress,isEvaluate,emitLp,isOneAsset,paymentAmount,paymentId) = {
278- let cfg = getPoolConfig()
279- let lpAssetId = fromBase58String(cfg[idxLPAsId])
280- let amountIdStr = cfg[idxAmAsId]
281- let priceIdStr = cfg[idxPrAsId]
282- let inAmountIdStr = cfg[idxIAmtAsId]
283- let inPriceIdStr = cfg[idxIPriceAsId]
284- let amountDecimals = parseIntValue(cfg[idxAmtAsDcm])
285- let priceDecimals = parseIntValue(cfg[idxPriceAsDcm])
264+func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,pmtAmt,pmtId) = {
265+ let cfg = gpc()
266+ let lpId = fromBase58String(cfg[idxLPAsId])
267+ let amIdStr = cfg[idxAmAsId]
268+ let prIdStr = cfg[idxPrAsId]
269+ let inAmIdStr = cfg[idxIAmtAsId]
270+ let inPrIdStr = cfg[idxIPriceAsId]
271+ let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
272+ let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
286273 let sts = cfg[idxPoolSt]
287- let lpEmission = valueOrErrorMessage(assetInfo(lpAssetId), "Wrong lp asset").quantity
288- let amountBalance = if (isEvaluate)
289- then getAccBalance(amountIdStr)
274+ let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
275+ let amBalance = if (isEval)
276+ then getAccBalance(amIdStr)
290277 else if (if (isOneAsset)
291- then (paymentId == amountIdStr)
278+ then (pmtId == amIdStr)
292279 else false)
293- then (getAccBalance(amountIdStr) - paymentAmount)
280+ then (getAccBalance(amIdStr) - pmtAmt)
294281 else if (isOneAsset)
295- then getAccBalance(amountIdStr)
296- else (getAccBalance(amountIdStr) - inAmountAssetAmount)
297- let priceBalance = if (isEvaluate)
298- then getAccBalance(priceIdStr)
282+ then getAccBalance(amIdStr)
283+ else (getAccBalance(amIdStr) - inAmAmt)
284+ let prBalance = if (isEval)
285+ then getAccBalance(prIdStr)
299286 else if (if (isOneAsset)
300- then (paymentId == priceIdStr)
287+ then (pmtId == prIdStr)
301288 else false)
302- then (getAccBalance(priceIdStr) - paymentAmount)
289+ then (getAccBalance(prIdStr) - pmtAmt)
303290 else if (isOneAsset)
304- then getAccBalance(priceIdStr)
305- else (getAccBalance(priceIdStr) - inPriceAssetAmount)
306- let decimals = if ((amountDecimals >= priceDecimals))
307- then amountDecimals
308- else priceDecimals
309- if ((decimals == decimals))
291+ then getAccBalance(prIdStr)
292+ else (getAccBalance(prIdStr) - inPrAmt)
293+ let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
294+ let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
295+ let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
296+ let amBalanceX18 = t1(amBalance, amtDcm)
297+ let prBalanceX18 = t1(prBalance, priceDcm)
298+ let r = if ((lpEm == 0))
310299 then {
311- let inAmountAssetAmountX18 = toX18(inAmountAssetAmount, decimals)
312- let inPriceAssetAmountX18 = toX18(inPriceAssetAmount, decimals)
313- let userPriceX18 = calcPriceBigInt(inPriceAssetAmountX18, inAmountAssetAmountX18)
314- let amountBalanceX18 = toX18(amountBalance, decimals)
315- let priceBalanceX18 = toX18(priceBalance, decimals)
316- let r = if ((lpEmission == 0))
317- then {
318- let currentPriceX18 = zeroBigInt
319- let slippageX18 = zeroBigInt
320- let lpAmountX18 = pow((inAmountAssetAmountX18 * inPriceAssetAmountX18), 0, toBigInt(5), 1, 0, DOWN)
321- $Tuple5(fromX18(lpAmountX18, scale8), fromX18(inAmountAssetAmountX18, decimals), fromX18(inPriceAssetAmountX18, decimals), calcPriceBigInt((priceBalanceX18 + inPriceAssetAmountX18), (amountBalanceX18 + inAmountAssetAmountX18)), slippageX18)
300+ let curPriceX18 = zeroBigInt
301+ let slippageX18 = zeroBigInt
302+ let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
303+ $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
304+ }
305+ else {
306+ let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
307+ let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
308+ let slippageX18 = t1(slippage, scale8)
309+ if (if ((curPriceX18 != zeroBigInt))
310+ then (slippageRealX18 > slippageX18)
311+ else false)
312+ then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
313+ else {
314+ let lpEmissionX18 = t1(lpEm, scale8)
315+ let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
316+ let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
317+ let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
318+ then $Tuple2(amViaPrX18, inPrAssetAmtX18)
319+ else $Tuple2(inAmAssetAmtX18, prViaAmX18)
320+ let expAmtAssetAmtX18 = expectedAmts._1
321+ let expPriceAssetAmtX18 = expectedAmts._2
322+ let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
323+ $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
322324 }
323- else {
324- let currentPriceX18 = calcPriceBigInt(priceBalanceX18, amountBalanceX18)
325- let slippageRealX18 = fraction(abs((currentPriceX18 - userPriceX18)), scale18, currentPriceX18)
326- let slippageX18 = toX18(slippageTolerance, scale8)
327- if (if ((currentPriceX18 != zeroBigInt))
328- then (slippageRealX18 > slippageX18)
329- else false)
330- then throwErr(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
331- else {
332- let lpEmissionX18 = toX18(lpEmission, scale8)
333- let prViaAmX18 = fraction(inAmountAssetAmountX18, currentPriceX18, scale18)
334- let amViaPrX18 = fraction(inPriceAssetAmountX18, scale18, currentPriceX18)
335- let expectedAmounts = if ((prViaAmX18 > inPriceAssetAmountX18))
336- then $Tuple2(amViaPrX18, inAmountAssetAmountX18)
337- else $Tuple2(inAmountAssetAmountX18, prViaAmX18)
338- let expectedAmountAssetAmountX18 = expectedAmounts._1
339- let expectedPriceAssetAmountX18 = expectedAmounts._2
340- let lpAmountX18 = fraction(lpEmissionX18, expectedPriceAssetAmountX18, priceBalanceX18)
341- $Tuple5(fromX18(lpAmountX18, scale8), fromX18(expectedAmountAssetAmountX18, decimals), fromX18(expectedPriceAssetAmountX18, decimals), currentPriceX18, slippageX18)
342- }
343- }
344- let calculateLpAmount = r._1
345- let calculateAmountAssetPayment = r._2
346- let calculatePriceAssetPayment = r._3
347- let currentPrice = fromX18(r._4, scale8)
348- let slippageCalculate = fromX18(r._5, scale8)
349- let checkCalcLpAmount = if ((calculateLpAmount > 0))
350- then true
351- else throwErr("LP <= 0")
352- if ((checkCalcLpAmount == checkCalcLpAmount))
353- then {
354- let emitLpAmount = if (!(emitLp))
355- then 0
356- else calculateLpAmount
357- let amountDiff = (inAmountAssetAmount - calculateAmountAssetPayment)
358- let priceDiff = (inPriceAssetAmount - calculatePriceAssetPayment)
359- let $t01618916448 = if (if (isOneAsset)
360- then (paymentId == amountIdStr)
361- else false)
362- then $Tuple2(paymentAmount, 0)
363- else if (if (isOneAsset)
364- then (paymentId == priceIdStr)
365- else false)
366- then $Tuple2(0, paymentAmount)
367- else $Tuple2(calculateAmountAssetPayment, calculatePriceAssetPayment)
368- let writeAmAmt = $t01618916448._1
369- let writePrAmt = $t01618916448._2
370- let commonState = [IntegerEntry(keyPriceLast(), currentPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), currentPrice), StringEntry(keyPutActionByUser(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmount, currentPrice, slippageTolerance, slippageCalculate, height, lastBlock.timestamp, amountDiff, priceDiff))]
371- $Tuple13(calculateLpAmount, emitLpAmount, currentPrice, amountBalance, priceBalance, lpEmission, lpAssetId, sts, commonState, amountDiff, priceDiff, inAmountAssetId, inPriceAssetId)
372- }
373- else throw("Strict value is not equal to itself.")
374325 }
375- else throw("Strict value is not equal to itself.")
326+ let calcLpAmt = r._1
327+ let calcAmAssetPmt = r._2
328+ let calcPrAssetPmt = r._3
329+ let curPrice = f1(r._4, scale8)
330+ let slippageCalc = f1(r._5, scale8)
331+ if ((0 >= calcLpAmt))
332+ then throw("LP <= 0")
333+ else {
334+ let emitLpAmt = if (!(emitLp))
335+ then 0
336+ else calcLpAmt
337+ let amDiff = (inAmAmt - calcAmAssetPmt)
338+ let prDiff = (inPrAmt - calcPrAssetPmt)
339+ let $t01551715862 = if (if (isOneAsset)
340+ then (pmtId == amIdStr)
341+ else false)
342+ then $Tuple2(pmtAmt, 0)
343+ else if (if (isOneAsset)
344+ then (pmtId == prIdStr)
345+ else false)
346+ then $Tuple2(0, pmtAmt)
347+ else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
348+ let writeAmAmt = $t01551715862._1
349+ let writePrAmt = $t01551715862._2
350+ let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
351+ $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
352+ }
376353 }
377354
378355
379-func validateMatcherOrderAllowed (order) = {
380- let cfg = getPoolConfig()
356+func moa (order) = {
357+ let cfg = gpc()
381358 let amtAsId = cfg[idxAmAsId]
382359 let prAsId = cfg[idxPrAsId]
383360 let sts = parseIntValue(cfg[idxPoolSt])
385362 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
386363 let accAmtAsBalance = getAccBalance(amtAsId)
387364 let accPrAsBalance = getAccBalance(prAsId)
388- let currentPriceX18 = if ((order.orderType == Buy))
389- then privateCalcPrice(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
390- else privateCalcPrice(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
391- let curPrice = fromX18(currentPriceX18, scale8)
392- if (if (if (isGlobalShutdown())
365+ let curPriceX18 = if ((order.orderType == Buy))
366+ then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
367+ else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
368+ let curPrice = f1(curPriceX18, scale8)
369+ if (if (if (igs())
393370 then true
394371 else (sts == PoolMatcherDis))
395372 then true
396373 else (sts == PoolShutdown))
397- then throwErr("Admin blocked")
374+ then throw("Admin blocked")
398375 else {
399376 let orAmtAsset = order.assetPair.amountAsset
400377 let orAmtAsStr = if ((orAmtAsset == unit))
407384 if (if ((orAmtAsStr != amtAsId))
408385 then true
409386 else (orPrAsStr != prAsId))
410- then throwErr("Wr assets")
387+ then throw("Wr assets")
411388 else {
412389 let orderPrice = order.price
413- let priceDecimals = fraction(scale8, prAsDcm, amtAsDcm)
414- let castOrderPrice = ts(orderPrice, scale8, priceDecimals)
390+ let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
391+ let castOrderPrice = ts(orderPrice, scale8, priceDcm)
415392 let isOrderPriceValid = if ((order.orderType == Buy))
416393 then (curPrice >= castOrderPrice)
417394 else (castOrderPrice >= curPrice)
421398 }
422399
423400
424-func commonGet (i) = {
425- let checkPayments = if ((size(i.payments) == 1))
426- then true
427- else throwErr("1 payment expected")
428- if ((checkPayments == checkPayments))
429- then {
430- let payment = value(i.payments[0])
431- let paymentAssetId = value(payment.assetId)
432- let paymentAmount = payment.amount
433- let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(paymentAssetId), paymentAmount, i.caller)
434- let outAmountAmount = r._1
435- let outPriceAmount = r._2
436- let sts = parseIntValue(r._9)
437- let state = r._10
438- if (if (isGlobalShutdown())
439- then true
440- else (sts == PoolShutdown))
441- then throwErr(("Admin blocked: " + toString(sts)))
442- else $Tuple5(outAmountAmount, outPriceAmount, paymentAmount, paymentAssetId, state)
443- }
444- else throw("Strict value is not equal to itself.")
445- }
401+func cg (i) = if ((size(i.payments) != 1))
402+ then throw("1 pmnt exp")
403+ else {
404+ let pmt = value(i.payments[0])
405+ let pmtAssetId = value(pmt.assetId)
406+ let pmtAmt = pmt.amount
407+ let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
408+ let outAmAmt = r._1
409+ let outPrAmt = r._2
410+ let sts = parseIntValue(r._9)
411+ let state = r._10
412+ if (if (igs())
413+ then true
414+ else (sts == PoolShutdown))
415+ then throw(("Admin blocked: " + toString(sts)))
416+ else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
417+ }
446418
447419
448-func commonPut (caller,txId,amountAssetPayment,priceAssetPayment,slippage,emitLp,isOneAsset,paymentAmount,paymentId) = {
449- let r = estimatePutOperation(txId, slippage, value(amountAssetPayment).amount, value(amountAssetPayment).assetId, value(priceAssetPayment).amount, value(priceAssetPayment).assetId, caller, false, emitLp, isOneAsset, paymentAmount, paymentId)
420+func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,pmtAmt,pmtId) = {
421+ let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, false, emitLp, isOneAsset, pmtAmt, pmtId)
450422 let sts = parseIntValue(r._8)
451- if (if (if (isGlobalShutdown())
423+ if (if (if (igs())
452424 then true
453425 else (sts == PoolPutDis))
454426 then true
455427 else (sts == PoolShutdown))
456- then throwErr(("Blocked:" + toString(sts)))
428+ then throw(("Blocked:" + toString(sts)))
457429 else r
458430 }
459431
464436 }
465437
466438
467-func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
439+func m () = match getString(mpk()) {
468440 case s: String =>
469441 fromBase58String(s)
470442 case _: Unit =>
474446 }
475447
476448
477-func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
449+func pm () = match getString(pmpk()) {
478450 case s: String =>
479451 fromBase58String(s)
480452 case _: Unit =>
484456 }
485457
486458
487-let pd = throwErr("Permission denied")
459+let pd = throw("Permission denied")
488460
489-func mustManager (i) = match managerPublicKeyOrUnit() {
461+func mm (i) = match m() {
490462 case pk: ByteVector =>
491463 if ((i.callerPublicKey == pk))
492464 then true
501473
502474
503475 @Callable(i)
504-func constructor (factoryContract) = {
505- let checkCaller = mustManager(i)
506- if ((checkCaller == checkCaller))
507- then [StringEntry(keyFactoryContact(), factoryContract)]
476+func constructor (fc) = {
477+ let c = mm(i)
478+ if ((c == c))
479+ then [StringEntry(fc(), fc)]
508480 else throw("Strict value is not equal to itself.")
509481 }
510482
512484
513485 @Callable(i)
514486 func setManager (pendingManagerPublicKey) = {
515- let checkCaller = mustManager(i)
516- if ((checkCaller == checkCaller))
487+ let c = mm(i)
488+ if ((c == c))
517489 then {
518- let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
519- if ((checkManagerPublicKey == checkManagerPublicKey))
520- then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
490+ let cm = fromBase58String(pendingManagerPublicKey)
491+ if ((cm == cm))
492+ then [StringEntry(pmpk(), pendingManagerPublicKey)]
521493 else throw("Strict value is not equal to itself.")
522494 }
523495 else throw("Strict value is not equal to itself.")
527499
528500 @Callable(i)
529501 func confirmManager () = {
530- let pm = pendingManagerPublicKeyOrUnit()
531- let hasPM = if (isDefined(pm))
502+ let p = pm()
503+ let hpm = if (isDefined(p))
532504 then true
533- else throwErr("No pending manager")
534- if ((hasPM == hasPM))
505+ else throw("No pending manager")
506+ if ((hpm == hpm))
535507 then {
536- let checkPM = if ((i.callerPublicKey == value(pm)))
508+ let cpm = if ((i.callerPublicKey == value(p)))
537509 then true
538- else throwErr("You are not pending manager")
539- if ((checkPM == checkPM))
540- then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
510+ else throw("You are not pending manager")
511+ if ((cpm == cpm))
512+ then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
541513 else throw("Strict value is not equal to itself.")
542514 }
543515 else throw("Strict value is not equal to itself.")
546518
547519
548520 @Callable(i)
549-func put (slippage,autoStake) = {
550- let factCfg = getFactoryConfig()
551- let stakingContract = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wrong staking contract")
552- let slippageContract = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wrogn slippage contract")
553- let slippageCheck = if ((slippage >= 0))
554- then true
555- else throwErr("wrong slippage")
556- if ((slippageCheck == slippageCheck))
557- then {
558- let paymentsCheck = if ((size(i.payments) == 2))
559- then true
560- else throwErr("2 payments expected")
561- if ((paymentsCheck == paymentsCheck))
562- then {
563- let estimatePut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slippage, true, false, 0, "")
564- let emitLpAmount = estimatePut._2
565- let lpAssetId = estimatePut._7
566- let state = estimatePut._9
567- let amountDiff = estimatePut._10
568- let priceDiff = estimatePut._11
569- let amountId = estimatePut._12
570- let priceId = estimatePut._13
571- let r = invoke(factoryContract, "emit", [emitLpAmount], nil)
572- if ((r == r))
573- then {
574- let el = match r {
575- case legacy: Address =>
576- invoke(legacy, "emit", [emitLpAmount], nil)
577- case _ =>
578- unit
579- }
580- if ((el == el))
581- then {
582- let sa = if ((amountDiff > 0))
583- then invoke(slippageContract, "put", nil, [AttachedPayment(amountId, amountDiff)])
584- else nil
585- if ((sa == sa))
586- then {
587- let sp = if ((priceDiff > 0))
588- then invoke(slippageContract, "put", nil, [AttachedPayment(priceId, priceDiff)])
589- else nil
590- if ((sp == sp))
591- then {
592- let lpTrasfer = if (autoStake)
593- then {
594- let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmount)])
595- if ((ss == ss))
596- then nil
597- else throw("Strict value is not equal to itself.")
598- }
599- else [ScriptTransfer(i.caller, emitLpAmount, lpAssetId)]
600- (state ++ lpTrasfer)
601- }
602- else throw("Strict value is not equal to itself.")
603- }
604- else throw("Strict value is not equal to itself.")
605- }
606- else throw("Strict value is not equal to itself.")
607- }
608- else throw("Strict value is not equal to itself.")
609- }
610- else throw("Strict value is not equal to itself.")
611- }
612- else throw("Strict value is not equal to itself.")
521+func put (slip,autoStake) = {
522+ let factCfg = gfc()
523+ let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
524+ let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
525+ if ((0 > slip))
526+ then throw("Wrong slippage")
527+ else if ((size(i.payments) != 2))
528+ then throw("2 pmnts expd")
529+ else {
530+ let e = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true, false, 0, "")
531+ let emitLpAmt = e._2
532+ let lpAssetId = e._7
533+ let state = e._9
534+ let amDiff = e._10
535+ let prDiff = e._11
536+ let amId = e._12
537+ let prId = e._13
538+ let r = invoke(fca, "emit", [emitLpAmt], nil)
539+ if ((r == r))
540+ then {
541+ let el = match r {
542+ case legacy: Address =>
543+ invoke(legacy, "emit", [emitLpAmt], nil)
544+ case _ =>
545+ unit
546+ }
547+ if ((el == el))
548+ then {
549+ let sa = if ((amDiff > 0))
550+ then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
551+ else nil
552+ if ((sa == sa))
553+ then {
554+ let sp = if ((prDiff > 0))
555+ then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
556+ else nil
557+ if ((sp == sp))
558+ then {
559+ let lpTrnsfr = if (autoStake)
560+ then {
561+ let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
562+ if ((ss == ss))
563+ then nil
564+ else throw("Strict value is not equal to itself.")
565+ }
566+ else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
567+ (state ++ lpTrnsfr)
568+ }
569+ else throw("Strict value is not equal to itself.")
570+ }
571+ else throw("Strict value is not equal to itself.")
572+ }
573+ else throw("Strict value is not equal to itself.")
574+ }
575+ else throw("Strict value is not equal to itself.")
576+ }
613577 }
614578
615579
616580
617581 @Callable(i)
618-func putOneTkn (amountAssetPart,priceAssetPart,outLp,slippage,autoStake) = {
619- let cfg = getFactoryConfig()
620- let stakingContract = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wrong staking contract")
621- let slippageContract = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wrong slippage contract")
622- let gwxRewardContract = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wrong gwx reward contract")
623- let poolCfg = getPoolConfig()
624- let amountId = poolCfg[idxAmAsId]
625- let priceId = poolCfg[idxPrAsId]
626- let amountDecimals = parseIntValue(poolCfg[idxAmtAsDcm])
627- let priceDecimals = parseIntValue(poolCfg[idxPriceAsDcm])
628- let addon = valueOrElse(getString(this, keyAddonAddress()), "")
582+func putOneTkn (amAssetPart,prAssetPart,outLp,slippage,autoStake) = {
583+ let cfg = gfc()
584+ let stakingCntr = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wr st addr")
585+ let slipCntr = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wr sl addr")
586+ let gwxCntr = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wr gwx addr")
587+ let poolCfg = gpc()
588+ let amId = poolCfg[idxAmAsId]
589+ let prId = poolCfg[idxPrAsId]
590+ let amDcm = parseIntValue(poolCfg[idxAmtAsDcm])
591+ let prDcm = parseIntValue(poolCfg[idxPriceAsDcm])
592+ let addon = valueOrElse(getString(this, ada()), "")
629593 let userAddress = if ((addon == toString(i.caller)))
630594 then i.originCaller
631595 else i.caller
632596 if (if (if (if ((0 >= slippage))
633597 then true
634- else (0 >= amountAssetPart))
598+ else (0 >= amAssetPart))
635599 then true
636- else (0 >= priceAssetPart))
600+ else (0 >= prAssetPart))
637601 then true
638602 else (0 >= outLp))
639- then throwErr("Wrong params")
603+ then throw("Wrong params")
640604 else if ((size(i.payments) != 1))
641- then throwErr("1 payment expected")
605+ then throw("1 pmnt expd")
642606 else {
643- let payment = value(i.payments[0])
644- let paymentAssetId = toBase58String(value(payment.assetId))
645- let paymentAmountRaw = payment.amount
646- let $t02561725676 = takeFee(paymentAmountRaw)
647- let paymentAmount = $t02561725676._1
648- let feeAmount = $t02561725676._2
649- if (if (if ((amountAssetPart > paymentAmount))
607+ let pmt = value(i.payments[0])
608+ let pmtAssetId = toBase58String(value(pmt.assetId))
609+ let paymentAmountRaw = pmt.amount
610+ let $t02447924531 = takeFee(paymentAmountRaw)
611+ let pmtAmt = $t02447924531._1
612+ let feeAmount = $t02447924531._2
613+ if (if (if ((amAssetPart > pmtAmt))
650614 then true
651- else (priceAssetPart > paymentAmount))
615+ else (prAssetPart > pmtAmt))
652616 then true
653- else (10000000 > paymentAmount))
654- then throwErr("wrong payment amount")
617+ else (10000000 > pmtAmt))
618+ then throw("Wrong pmt amt")
655619 else {
656- let amountBalance = getAccBalance(amountId)
657- let priceBalance = getAccBalance(priceId)
658- let $t02594026395 = if ((paymentAssetId == amountId))
659- then $Tuple6((amountBalance - paymentAmount), priceBalance, (paymentAmount - amountAssetPart), priceAssetPart, 0, 0)
660- else if ((paymentAssetId == priceId))
661- then $Tuple6(amountBalance, (priceBalance - paymentAmount), 0, 0, (paymentAmount - priceAssetPart), amountAssetPart)
662- else throwErr("wrong paymentAssetId")
663- let amountBalanceNow = $t02594026395._1
664- let priceBalanceNow = $t02594026395._2
665- let virtSwapInAm = $t02594026395._3
666- let virtSwapOutPr = $t02594026395._4
667- let virtSwapInPr = $t02594026395._5
668- let virtSwapOutAm = $t02594026395._6
669- let D0 = invoke(gwxRewardContract, "calcD", [toString(amountBalanceNow), toString(priceBalanceNow), amplificator, Amult, Dconv], nil)
670- let D1 = invoke(gwxRewardContract, "calcD", [toString(toBigInt(((amountBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((priceBalanceNow + virtSwapInPr) - virtSwapOutPr))), amplificator, Amult, Dconv], nil)
671- let D0vsD1 = validateD(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
620+ let amBalance = getAccBalance(amId)
621+ let prBalance = getAccBalance(prId)
622+ let $t02472825108 = if ((pmtAssetId == amId))
623+ then $Tuple6((amBalance - pmtAmt), prBalance, (pmtAmt - amAssetPart), prAssetPart, 0, 0)
624+ else if ((pmtAssetId == prId))
625+ then $Tuple6(amBalance, (prBalance - pmtAmt), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
626+ else throw("wrong pmtAssetId")
627+ let amBalanceNow = $t02472825108._1
628+ let prBalanceNow = $t02472825108._2
629+ let virtSwapInAm = $t02472825108._3
630+ let virtSwapOutPr = $t02472825108._4
631+ let virtSwapInPr = $t02472825108._5
632+ let virtSwapOutAm = $t02472825108._6
633+ let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
634+ let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
635+ let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
672636 if ((D0vsD1 == D0vsD1))
673637 then {
674- let estimatePut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amountId), amountAssetPart), AttachedPayment(fromBase58String(priceId), priceAssetPart), slippage, true, true, paymentAmount, paymentAssetId)
675- let estimateLP = estimatePut._2
676- let lpAssetId = estimatePut._7
677- let state = estimatePut._9
678- let amountDiff = estimatePut._10
679- let priceDiff = estimatePut._11
680- let lpCalcRes = validateAbsDiff(toBigInt(estimateLP), toBigInt(outLp), toBigInt(slippage))
681- let emitLpAmount = toInt(lpCalcRes._2)
682- let e = invoke(factoryContract, "emit", [emitLpAmount], nil)
638+ let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), slippage, true, true, pmtAmt, pmtAssetId)
639+ let estimLP = estPut._2
640+ let lpAssetId = estPut._7
641+ let state = estPut._9
642+ let amDiff = estPut._10
643+ let prDiff = estPut._11
644+ let lpCalcRes = vad(toBigInt(estimLP), toBigInt(outLp), toBigInt(slippage))
645+ let emitLpAmt = toInt(lpCalcRes._2)
646+ let e = invoke(fca, "emit", [emitLpAmt], nil)
683647 if ((e == e))
684648 then {
685649 let el = match e {
686650 case legacy: Address =>
687- invoke(legacy, "emit", [emitLpAmount], nil)
651+ invoke(legacy, "emit", [emitLpAmt], nil)
688652 case _ =>
689653 unit
690654 }
691655 if ((el == el))
692656 then {
693- let sa = if ((amountDiff > 0))
694- then invoke(slippageContract, "put", nil, [AttachedPayment(fromBase58String(amountId), amountDiff)])
657+ let sa = if ((amDiff > 0))
658+ then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
695659 else nil
696660 if ((sa == sa))
697661 then {
698- let sp = if ((priceDiff > 0))
699- then invoke(slippageContract, "put", nil, [AttachedPayment(fromBase58String(priceId), priceDiff)])
662+ let sp = if ((prDiff > 0))
663+ then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
700664 else nil
701665 if ((sp == sp))
702666 then {
703- let lpTrasfer = if (autoStake)
667+ let lpTrnsfr = if (autoStake)
704668 then {
705- let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmount)])
669+ let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
706670 if ((ss == ss))
707671 then nil
708672 else throw("Strict value is not equal to itself.")
709673 }
710- else [ScriptTransfer(i.caller, emitLpAmount, lpAssetId)]
674+ else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
711675 let sendFeeToMatcher = if ((feeAmount > 0))
712- then [ScriptTransfer(matcherAddress, feeAmount, fromBase58String(paymentAssetId))]
676+ then [ScriptTransfer(matcherAddress, feeAmount, fromBase58String(pmtAssetId))]
713677 else nil
714- ((state ++ lpTrasfer) ++ sendFeeToMatcher)
678+ ((state ++ lpTrnsfr) ++ sendFeeToMatcher)
715679 }
716680 else throw("Strict value is not equal to itself.")
717681 }
729693
730694
731695 @Callable(i)
732-func putForFree (maxslippage) = if ((0 > maxslippage))
733- then throwErr("wrong slippage")
696+func putForFree (maxSlpg) = if ((0 > maxSlpg))
697+ then throw("Wrong slpg")
734698 else if ((size(i.payments) != 2))
735- then throwErr("2 payments expected")
699+ then throw("2 pmnts expd")
736700 else {
737- let estimatePut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxslippage, false, false, 0, "")
738- estimatePut._9
701+ let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlpg, false, false, 0, "")
702+ estPut._9
739703 }
740704
741705
742706
743707 @Callable(i)
744708 func get () = {
745- let r = commonGet(i)
709+ let r = cg(i)
746710 let outAmtAmt = r._1
747- let outPriceAmount = r._2
748- let paymentAmount = r._3
749- let paymentAssetId = r._4
711+ let outPrAmt = r._2
712+ let pmtAmt = r._3
713+ let pmtAssetId = r._4
750714 let state = r._5
751- let b = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
715+ let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
752716 if ((b == b))
753717 then state
754718 else throw("Strict value is not equal to itself.")
758722
759723 @Callable(i)
760724 func getOneTkn (exchResult,notUsed,outAmount,outAssetId,slippage) = if ((size(i.payments) != 1))
761- then throwErr("1 payment expected")
725+ then throw("1 pmnt expd")
762726 else {
763- let cfg = getPoolConfig()
764- let lpAssetId = cfg[idxLPAsId]
765- let amountId = cfg[idxAmAsId]
766- let priceId = cfg[idxPrAsId]
767- let amountDecimals = parseIntValue(cfg[idxAmtAsDcm])
768- let priceDecimals = parseIntValue(cfg[idxPriceAsDcm])
727+ let cfg = gpc()
728+ let lpId = cfg[idxLPAsId]
729+ let amId = cfg[idxAmAsId]
730+ let prId = cfg[idxPrAsId]
731+ let amDcm = parseIntValue(cfg[idxAmtAsDcm])
732+ let prDcm = parseIntValue(cfg[idxPriceAsDcm])
769733 let sts = cfg[idxPoolSt]
770- let factCfg = getFactoryConfig()
771- let gwxRewardContract = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wrong gwxRewardContract address")
772- let payment = value(i.payments[0])
773- let addon = valueOrElse(getString(this, keyAddonAddress()), "")
734+ let factCfg = gfc()
735+ let gwxCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wr sl addr")
736+ let pmt = value(i.payments[0])
737+ let addon = valueOrElse(getString(this, ada()), "")
774738 let userAddress = if ((addon == toString(i.caller)))
775739 then i.originCaller
776740 else i.caller
777741 let txId58 = toBase58String(i.transactionId)
778- let paymentAssetId = value(payment.assetId)
779- let paymentAmount = payment.amount
780- if ((1000000000 > paymentAmount))
781- then throwErr("Min payment 10 LP")
742+ let pmtAssetId = value(pmt.assetId)
743+ let pmtAmt = pmt.amount
744+ if ((1000000000 > pmtAmt))
745+ then throw("Min pmt 10 LP")
782746 else if (if (if ((0 > slippage))
783747 then true
784748 else (0 > exchResult))
785749 then true
786750 else (0 > outAmount))
787- then throwErr("Wrong params")
788- else if ((lpAssetId != toBase58String(paymentAssetId)))
789- then throwErr("Wrong LP")
751+ then throw("Wrong params")
752+ else if ((lpId != toBase58String(pmtAssetId)))
753+ then throw("Wrong LP")
790754 else {
791- let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(paymentAssetId), paymentAmount, i.caller)
755+ let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
792756 let estimAmAmt = r._1
793757 let estimPrAmt = r._2
794- let amountBalance = getAccBalance(amountId)
795- let priceBalance = getAccBalance(priceId)
796- let $t03153432002 = if ((outAssetId == amountId))
797- then $Tuple7((amountBalance - estimAmAmt), (priceBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
798- else if ((outAssetId == priceId))
799- then $Tuple7((amountBalance - estimAmAmt), (priceBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
800- else throwErr("wrong outAssetId")
801- let amountBalanceNow = $t03153432002._1
802- let priceBalanceNow = $t03153432002._2
803- let virtSwapInAm = $t03153432002._3
804- let virtSwapOutPr = $t03153432002._4
805- let virtSwapInPr = $t03153432002._5
806- let virtSwapOutAm = $t03153432002._6
807- let totalGet = $t03153432002._7
758+ let amBalance = getAccBalance(amId)
759+ let prBalance = getAccBalance(prId)
760+ let $t03004630503 = if ((outAssetId == amId))
761+ then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
762+ else if ((outAssetId == prId))
763+ then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
764+ else throw("wrong outAssetId")
765+ let amBalanceNow = $t03004630503._1
766+ let prBalanceNow = $t03004630503._2
767+ let virtSwapInAm = $t03004630503._3
768+ let virtSwapOutPr = $t03004630503._4
769+ let virtSwapInPr = $t03004630503._5
770+ let virtSwapOutAm = $t03004630503._6
771+ let totalGet = $t03004630503._7
808772 if (if ((0 > virtSwapInAm))
809773 then true
810774 else (0 > virtSwapInPr))
811- then throwErr("Wrong calc")
775+ then throw("Wrong calc")
812776 else {
813- let D0 = invoke(gwxRewardContract, "calcD", [toString(amountBalanceNow), toString(priceBalanceNow), amplificator, Amult, Dconv], nil)
814- let D1 = invoke(gwxRewardContract, "calcD", [toString(((amountBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((priceBalanceNow + virtSwapOutPr) - virtSwapInPr)), amplificator, Amult, Dconv], nil)
815- let D0vsD1 = validateD(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
777+ let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
778+ let D1 = invoke(gwxCntr, "calcD", [toString(((amBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((prBalanceNow + virtSwapOutPr) - virtSwapInPr)), A, Amult, Dconv], nil)
779+ let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
816780 if ((D0vsD1 == D0vsD1))
817781 then {
818- let finalRes = validateAbsDiff(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
782+ let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
819783 if ((finalRes == finalRes))
820784 then {
821- let $t03267132779 = if ((outAssetId == amountId))
785+ let $t03120831312 = if ((outAssetId == amId))
822786 then $Tuple2(toInt(finalRes._2), 0)
823787 else $Tuple2(0, toInt(finalRes._2))
824- let outAm = $t03267132779._1
825- let outPr = $t03267132779._2
788+ let outAm = $t03120831312._1
789+ let outPr = $t03120831312._2
826790 let totalAmountRaw = (outAm + outPr)
827- let $t03281932874 = takeFee(totalAmountRaw)
828- let totalAmount = $t03281932874._1
829- let feeAmount = $t03281932874._2
791+ let $t03135231407 = takeFee(totalAmountRaw)
792+ let totalAmount = $t03135231407._1
793+ let feeAmount = $t03135231407._2
830794 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
831795 then unit
832796 else fromBase58String(outAssetId)
833797 let sendFeeToMatcher = if ((feeAmount > 0))
834798 then [ScriptTransfer(matcherAddress, feeAmount, outAssetIdOrWaves)]
835799 else nil
836- let decimals = if ((amountDecimals >= priceDecimals))
837- then amountDecimals
838- else priceDecimals
839- if ((decimals == decimals))
800+ let curPrX18 = cpbi(t1(prBalance, prDcm), t1(amBalance, amDcm))
801+ let curPr = f1(curPrX18, scale8)
802+ let state = [ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)]
803+ if ((state == state))
840804 then {
841- let curPrX18 = calcPriceBigInt(toX18(priceBalance, decimals), toX18(amountBalance, decimals))
842- let curPr = fromX18(curPrX18, scale8)
843- let state = [ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(keyGetActionByUser(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, paymentAmount, curPr, height, lastBlock.timestamp)), IntegerEntry(keyPriceLast(), curPr), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPr)]
844- if ((state == state))
845- then {
846- let burn = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
847- if ((burn == burn))
848- then (state ++ sendFeeToMatcher)
849- else throw("Strict value is not equal to itself.")
850- }
805+ let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
806+ if ((burn == burn))
807+ then (state ++ sendFeeToMatcher)
851808 else throw("Strict value is not equal to itself.")
852809 }
853810 else throw("Strict value is not equal to itself.")
863820
864821 @Callable(i)
865822 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
866- let r = commonGet(i)
867- let outAmountAmount = r._1
868- let outPriceAmount = r._2
869- let paymentAmount = r._3
870- let paymentAssetId = r._4
823+ let r = cg(i)
824+ let outAmAmt = r._1
825+ let outPrAmt = r._2
826+ let pmtAmt = r._3
827+ let pmtAssetId = r._4
871828 let state = r._5
872- let checkOutAmountAmount = if ((outAmountAmount >= noLessThenAmtAsset))
873- then true
874- else throwErr(((("Failed: " + toString(outAmountAmount)) + " < ") + toString(noLessThenAmtAsset)))
875- if ((checkOutAmountAmount == checkOutAmountAmount))
876- then {
877- let checkOutPriceAmount = if ((outPriceAmount >= noLessThenPriceAsset))
878- then true
879- else throwErr(((("Failed: " + toString(outPriceAmount)) + " < ") + toString(noLessThenPriceAsset)))
880- if ((checkOutPriceAmount == checkOutPriceAmount))
881- then {
882- let burnLPAssetOnFactory = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
883- if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
884- then state
885- else throw("Strict value is not equal to itself.")
886- }
887- else throw("Strict value is not equal to itself.")
888- }
889- else throw("Strict value is not equal to itself.")
829+ if ((noLessThenAmtAsset > outAmAmt))
830+ then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
831+ else if ((noLessThenPriceAsset > outPrAmt))
832+ then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
833+ else {
834+ let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
835+ if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
836+ then state
837+ else throw("Strict value is not equal to itself.")
838+ }
890839 }
891840
892841
894843 @Callable(i)
895844 func unstakeAndGet (amount) = {
896845 let checkPayments = if ((size(i.payments) != 0))
897- then throwErr("no payments expected")
846+ then throw("No pmnts expd")
898847 else true
899848 if ((checkPayments == checkPayments))
900849 then {
901- let cfg = getPoolConfig()
902- let factoryCfg = getFactoryConfig()
850+ let cfg = gpc()
851+ let factoryCfg = gfc()
903852 let lpAssetId = fromBase58String(cfg[idxLPAsId])
904- let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "wrong")
853+ let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
905854 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
906855 if ((unstakeInv == unstakeInv))
907856 then {
908- let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
857+ let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
909858 let sts = parseIntValue(r._9)
910859 let state = r._10
911- let v = if (if (isGlobalShutdown())
860+ let v = if (if (igs())
912861 then true
913862 else (sts == PoolShutdown))
914- then throwErr(("Blocked: " + toString(sts)))
863+ then throw(("Blocked: " + toString(sts)))
915864 else true
916865 if ((v == v))
917866 then {
918- let burnA = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
867+ let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
919868 if ((burnA == burnA))
920869 then state
921870 else throw("Strict value is not equal to itself.")
930879
931880
932881 @Callable(i)
933-func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(factoryContract)))
934- then throwErr("denied")
935- else $Tuple2([StringEntry(keyAmountAsset(), amtAsStr), StringEntry(keyPriceAsset(), prAsStr)], "success")
882+func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
883+ then throw("denied")
884+ else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
936885
937886
938887
939888 @Callable(i)
940-func setS (k,v) = if ((toString(i.caller) != getStringOrFail(this, keyAddonAddress())))
889+func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
941890 then pd
942891 else [StringEntry(k, v)]
943892
944893
945894
946895 @Callable(i)
947-func setI (k,v) = if ((toString(i.caller) != getStringOrFail(this, keyAddonAddress())))
896+func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
948897 then pd
949898 else [IntegerEntry(k, v)]
950899
951900
952901
953902 @Callable(i)
954-func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig())
903+func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
955904
956905
957906
969918
970919
971920 @Callable(i)
972-func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resScaleMult))
921+func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
973922
974923
975924
976925 @Callable(i)
977-func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult)))
926+func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
978927
979928
980929
981930 @Callable(i)
982-func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
931+func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
983932
984933
985934
986935 @Callable(i)
987-func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmountAssetAmount,inAmId,inPriceAssetAmount,inPrId,usrAddr,isEvaluate,emitLp) = $Tuple2(nil, estimatePutOperation(txId58, slippage, inAmountAssetAmount, inAmId, inPriceAssetAmount, inPrId, usrAddr, isEvaluate, emitLp, false, 0, ""))
936+func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, false, 0, ""))
988937
989938
990939
991940 @Callable(i)
992-func estimateGetOperationWrapperREADONLY (txId58,paymentAsId,paymentLpAmount,usrAddr) = {
993- let r = estimateGetOperation(txId58, paymentAsId, paymentLpAmount, addressFromStringValue(usrAddr))
941+func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
942+ let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
994943 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
995944 }
996945
998947 @Verifier(tx)
999948 func verify () = match tx {
1000949 case order: Order =>
1001- let mtchPub = getMatcherPubOrFail()
1002- let orV = validateMatcherOrderAllowed(order)
950+ let mtchPub = mp()
951+ let orV = moa(order)
1003952 let sndrV = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
1004953 let mtchV = sigVerify(order.bodyBytes, order.proofs[1], mtchPub)
1005954 if (if (if (orV)
1008957 then mtchV
1009958 else false)
1010959 then true
1011- else throwOrderError(orV, sndrV, mtchV)
960+ else toe(orV, sndrV, mtchV)
1012961 case _ =>
1013- let targetPublicKey = match managerPublicKeyOrUnit() {
962+ let targetPublicKey = match m() {
1014963 case pk: ByteVector =>
1015964 pk
1016965 case _: Unit =>
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 6 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scale8 = 100000000
55
66 let scale8BigInt = toBigInt(100000000)
77
88 let scale18 = toBigInt(1000000000000000000)
99
1010 let thousand = 1000
1111
1212 let zeroBigInt = toBigInt(0)
1313
1414 let oneBigInt = toBigInt(1)
1515
1616 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
1717
1818 let Amult = "100"
1919
2020 let Dconv = "1"
2121
2222 let SEP = "__"
2323
2424 let EMPTY = ""
2525
2626 let PoolActive = 1
2727
2828 let PoolPutDis = 2
2929
3030 let PoolMatcherDis = 3
3131
3232 let PoolShutdown = 4
3333
3434 let idxPoolAddress = 1
3535
3636 let idxPoolSt = 2
3737
3838 let idxLPAsId = 3
3939
4040 let idxAmAsId = 4
4141
4242 let idxPrAsId = 5
4343
4444 let idxAmtAsDcm = 6
4545
4646 let idxPriceAsDcm = 7
4747
4848 let idxIAmtAsId = 8
4949
5050 let idxIPriceAsId = 9
5151
5252 let idxFactStakCntr = 1
5353
5454 let idxFactSlippCntr = 7
5555
5656 let idxFactGwxRewCntr = 10
5757
5858 let feePermilleDefault = 0
5959
60-func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
60+func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6161
6262
63-func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
63+func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6464
6565
6666 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
6767
6868
6969 func abs (val) = if ((zeroBigInt > val))
7070 then -(val)
7171 else val
7272
7373
74-func keyFactoryContact () = "%s__factoryContract"
74+func fc () = "%s__factoryContract"
7575
7676
77-func keyManagerPublicKey () = "%s__managerPublicKey"
77+func mpk () = "%s__managerPublicKey"
7878
7979
80-func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
80+func pmpk () = "%s__pendingManagerPublicKey"
8181
8282
83-func keyPriceLast () = "%s%s__price__last"
83+func pl () = "%s%s__price__last"
8484
8585
86-func keyPriceHistory (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
86+func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
8787
8888
89-func keyPutActionByUser (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
89+func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
9090
9191
92-func keyGetActionByUser (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
92+func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
9393
9494
95-func keyAmountAsset () = "%s__amountAsset"
95+func aa () = "%s__amountAsset"
9696
9797
98-func keyPriceAsset () = "%s__priceAsset"
98+func pa () = "%s__priceAsset"
9999
100100
101-func keyAmplificator () = "%s__amp"
101+func amp () = "%s__amp"
102102
103103
104-func keyAddonAddress () = "%s__addonAddr"
104+func ada () = "%s__addonAddr"
105105
106106
107107 let keyFeePermille = "%s__feePermille"
108108
109109 let feePermille = valueOrElse(getInteger(this, keyFeePermille), feePermilleDefault)
110110
111111 func fcfg () = "%s__factoryConfig"
112112
113113
114114 func mtpk () = "%s%s__matcher__publicKey"
115115
116116
117117 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
118118
119119
120120 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
121121
122122
123123 func aps () = "%s__shutdown"
124124
125125
126-func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
127-
128-
129-func throwOrderError (orV,sendrV,matchV) = throwErr(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
126+func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
130127
131128
132129 func str (val) = match val {
133130 case valStr: String =>
134131 valStr
135132 case _ =>
136- throwErr("fail cast to String")
133+ throw("fail cast to String")
137134 }
138135
139136
140-func getStringOrFail (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
137+func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
141138
142139
143-func getIntOrFail (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
140+func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
144141
145142
146-let factoryContract = addressFromStringValue(getStringOrFail(this, keyFactoryContact()))
143+let fca = addressFromStringValue(strf(this, fc()))
147144
148-let amplificator = getStringOrFail(this, keyAmplificator())
145+let A = strf(this, amp())
149146
150-func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, aps()), false)
147+func igs () = valueOrElse(getBoolean(fca, aps()), false)
151148
152149
153-func getMatcherPubOrFail () = fromBase58String(getStringOrFail(factoryContract, mtpk()))
150+func mp () = fromBase58String(strf(fca, mtpk()))
154151
155152
156-let matcherAddress = addressFromPublicKey(getMatcherPubOrFail())
153+let matcherAddress = addressFromPublicKey(mp())
157154
158-func getPoolConfig () = {
159- let amtAs = getStringOrFail(this, keyAmountAsset())
160- let priceAs = getStringOrFail(this, keyPriceAsset())
161- let iPriceAs = getIntOrFail(factoryContract, mba(priceAs))
162- let iAmtAs = getIntOrFail(factoryContract, mba(amtAs))
163- split(getStringOrFail(factoryContract, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
155+func gpc () = {
156+ let amtAs = strf(this, aa())
157+ let priceAs = strf(this, pa())
158+ let iPriceAs = intf(fca, mba(priceAs))
159+ let iAmtAs = intf(fca, mba(amtAs))
160+ split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
164161 }
165162
166163
167-func getFactoryConfig () = split(getStringOrFail(factoryContract, fcfg()), SEP)
164+func gfc () = split(strf(fca, fcfg()), SEP)
168165
169166
170167 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slipByUser,slippageReal,txHeight,txTimestamp,slipageAmAmt,slipagePrAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slipByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
171168
172169
173170 func dataGetActionInfo (outAmtAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmtAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP)
174171
175172
176173 func getAccBalance (assetId) = if ((assetId == "WAVES"))
177174 then wavesBalance(this).available
178175 else assetBalance(this, fromBase58String(assetId))
179176
180177
181-func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
178+func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
182179
183180
184-func validateAbsDiff (estimateLP,outLp,slippage) = {
185- let diff = fraction((estimateLP - outLp), scale8BigInt, outLp)
181+func vad (A1,A2,slippage) = {
182+ let diff = fraction((A1 - A2), scale8BigInt, A2)
186183 let pass = ((slippage - abs(diff)) > zeroBigInt)
187184 if (!(pass))
188- then throwErr(("Big slippage: " + toString(diff)))
189- else $Tuple2(pass, min([estimateLP, outLp]))
185+ then throw(("Big slpg: " + toString(diff)))
186+ else $Tuple2(pass, min([A1, A2]))
190187 }
191188
192189
193-func validateD (D1,D0,slippage) = {
190+func vd (D1,D0,slpg) = {
194191 let diff = fraction(D0, scale8BigInt, D1)
195- let fail = (slippage > diff)
192+ let fail = (slpg > diff)
196193 if (if (fail)
197194 then true
198195 else (D0 > D1))
199- then throwErr(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slippage)))
196+ then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
200197 else fail
201198 }
202199
203200
204-func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
205- let amtAsAmtX18 = toX18(amAmt, amAssetDcm)
206- let prAsAmtX18 = toX18(prAmt, prAssetDcm)
207- calcPriceBigInt(prAsAmtX18, amtAsAmtX18)
201+func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
202+ let amtAsAmtX18 = t1(amAmt, amAssetDcm)
203+ let prAsAmtX18 = t1(prAmt, prAssetDcm)
204+ cpbi(prAsAmtX18, amtAsAmtX18)
208205 }
209206
210207
211208 func calcPrices (amAmt,prAmt,lpAmt) = {
212- let cfg = getPoolConfig()
209+ let cfg = gpc()
213210 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
214211 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
215- let priceX18 = privateCalcPrice(amtAsDcm, prAsDcm, amAmt, prAmt)
216- let amAmtX18 = toX18(amAmt, amtAsDcm)
217- let prAmtX18 = toX18(prAmt, prAsDcm)
218- let lpAmtX18 = toX18(lpAmt, scale8)
219- let lpPrInAmAsX18 = calcPriceBigInt(amAmtX18, lpAmtX18)
220- let lpPrInPrAsX18 = calcPriceBigInt(prAmtX18, lpAmtX18)
212+ let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
213+ let amAmtX18 = t1(amAmt, amtAsDcm)
214+ let prAmtX18 = t1(prAmt, prAsDcm)
215+ let lpAmtX18 = t1(lpAmt, scale8)
216+ let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
217+ let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
221218 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
222219 }
223220
224221
225222 func calculatePrices (amAmt,prAmt,lpAmt) = {
226223 let p = calcPrices(amAmt, prAmt, lpAmt)
227-[fromX18(p[0], scale8), fromX18(p[1], scale8), fromX18(p[2], scale8)]
224+[f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
228225 }
229226
230227
231-func estimateGetOperation (txId58,paymentAssetId,paymentLpAmount,userAddress) = {
232- let cfg = getPoolConfig()
233- let lpAssetId = cfg[idxLPAsId]
234- let amountId = cfg[idxAmAsId]
235- let priceId = cfg[idxPrAsId]
236- let amountDecimals = parseIntValue(cfg[idxAmtAsDcm])
237- let priceDecimals = parseIntValue(cfg[idxPriceAsDcm])
228+func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
229+ let cfg = gpc()
230+ let lpId = cfg[idxLPAsId]
231+ let amId = cfg[idxAmAsId]
232+ let prId = cfg[idxPrAsId]
233+ let amDcm = parseIntValue(cfg[idxAmtAsDcm])
234+ let prDcm = parseIntValue(cfg[idxPriceAsDcm])
238235 let sts = cfg[idxPoolSt]
239- let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpAssetId)), "Wrong LP id").quantity
240- let validationBlock = if ((lpAssetId == paymentAssetId))
241- then true
242- else throwErr("Wrong payment asset")
243- if ((validationBlock == validationBlock))
244- then {
245- let decimals = if ((amountDecimals >= priceDecimals))
246- then amountDecimals
247- else priceDecimals
248- if ((decimals == decimals))
249- then {
250- let amountBalance = getAccBalance(amountId)
251- let amountBalanceX18 = toX18(amountBalance, decimals)
252- let priceBalance = getAccBalance(priceId)
253- let priceBalanceX18 = toX18(priceBalance, decimals)
254- let currentPriceX18 = calcPriceBigInt(priceBalanceX18, amountBalanceX18)
255- let curPrice = fromX18(currentPriceX18, scale8)
256- let paymentLpAmountX18 = toX18(paymentLpAmount, scale8)
257- let lpEmissionX18 = toX18(lpEmission, scale8)
258- let outAmountAmountX18 = fraction(amountBalanceX18, paymentLpAmountX18, lpEmissionX18)
259- let outPriceAmountX18 = fraction(priceBalanceX18, paymentLpAmountX18, lpEmissionX18)
260- let outAmountAmount = fromX18(outAmountAmountX18, decimals)
261- let outPriceAmount = fromX18(outPriceAmountX18, decimals)
262- let state = if ((txId58 == ""))
263- then nil
264- else [ScriptTransfer(userAddress, outAmountAmount, if ((amountId == "WAVES"))
265- then unit
266- else fromBase58String(amountId)), ScriptTransfer(userAddress, outPriceAmount, if ((priceId == "WAVES"))
267- then unit
268- else fromBase58String(priceId)), StringEntry(keyGetActionByUser(toString(userAddress), txId58), dataGetActionInfo(outAmountAmount, outPriceAmount, paymentLpAmount, curPrice, height, lastBlock.timestamp)), IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice)]
269- $Tuple10(outAmountAmount, outPriceAmount, amountId, priceId, amountBalance, priceBalance, lpEmission, currentPriceX18, sts, state)
270- }
271- else throw("Strict value is not equal to itself.")
236+ let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
237+ if ((lpId != pmtAssetId))
238+ then throw("Wrong pmt asset")
239+ else {
240+ let amBalance = getAccBalance(amId)
241+ let amBalanceX18 = t1(amBalance, amDcm)
242+ let prBalance = getAccBalance(prId)
243+ let prBalanceX18 = t1(prBalance, prDcm)
244+ let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
245+ let curPrice = f1(curPriceX18, scale8)
246+ let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
247+ let lpEmissX18 = t1(lpEmiss, scale8)
248+ let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
249+ let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
250+ let outAmAmt = f1(outAmAmtX18, amDcm)
251+ let outPrAmt = f1(outPrAmtX18, prDcm)
252+ let state = if ((txId58 == ""))
253+ then nil
254+ else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
255+ then unit
256+ else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
257+ then unit
258+ else fromBase58String(prId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
259+ $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
272260 }
273- else throw("Strict value is not equal to itself.")
274261 }
275262
276263
277-func estimatePutOperation (txId58,slippageTolerance,inAmountAssetAmount,inAmountAssetId,inPriceAssetAmount,inPriceAssetId,userAddress,isEvaluate,emitLp,isOneAsset,paymentAmount,paymentId) = {
278- let cfg = getPoolConfig()
279- let lpAssetId = fromBase58String(cfg[idxLPAsId])
280- let amountIdStr = cfg[idxAmAsId]
281- let priceIdStr = cfg[idxPrAsId]
282- let inAmountIdStr = cfg[idxIAmtAsId]
283- let inPriceIdStr = cfg[idxIPriceAsId]
284- let amountDecimals = parseIntValue(cfg[idxAmtAsDcm])
285- let priceDecimals = parseIntValue(cfg[idxPriceAsDcm])
264+func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,pmtAmt,pmtId) = {
265+ let cfg = gpc()
266+ let lpId = fromBase58String(cfg[idxLPAsId])
267+ let amIdStr = cfg[idxAmAsId]
268+ let prIdStr = cfg[idxPrAsId]
269+ let inAmIdStr = cfg[idxIAmtAsId]
270+ let inPrIdStr = cfg[idxIPriceAsId]
271+ let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
272+ let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
286273 let sts = cfg[idxPoolSt]
287- let lpEmission = valueOrErrorMessage(assetInfo(lpAssetId), "Wrong lp asset").quantity
288- let amountBalance = if (isEvaluate)
289- then getAccBalance(amountIdStr)
274+ let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
275+ let amBalance = if (isEval)
276+ then getAccBalance(amIdStr)
290277 else if (if (isOneAsset)
291- then (paymentId == amountIdStr)
278+ then (pmtId == amIdStr)
292279 else false)
293- then (getAccBalance(amountIdStr) - paymentAmount)
280+ then (getAccBalance(amIdStr) - pmtAmt)
294281 else if (isOneAsset)
295- then getAccBalance(amountIdStr)
296- else (getAccBalance(amountIdStr) - inAmountAssetAmount)
297- let priceBalance = if (isEvaluate)
298- then getAccBalance(priceIdStr)
282+ then getAccBalance(amIdStr)
283+ else (getAccBalance(amIdStr) - inAmAmt)
284+ let prBalance = if (isEval)
285+ then getAccBalance(prIdStr)
299286 else if (if (isOneAsset)
300- then (paymentId == priceIdStr)
287+ then (pmtId == prIdStr)
301288 else false)
302- then (getAccBalance(priceIdStr) - paymentAmount)
289+ then (getAccBalance(prIdStr) - pmtAmt)
303290 else if (isOneAsset)
304- then getAccBalance(priceIdStr)
305- else (getAccBalance(priceIdStr) - inPriceAssetAmount)
306- let decimals = if ((amountDecimals >= priceDecimals))
307- then amountDecimals
308- else priceDecimals
309- if ((decimals == decimals))
291+ then getAccBalance(prIdStr)
292+ else (getAccBalance(prIdStr) - inPrAmt)
293+ let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
294+ let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
295+ let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
296+ let amBalanceX18 = t1(amBalance, amtDcm)
297+ let prBalanceX18 = t1(prBalance, priceDcm)
298+ let r = if ((lpEm == 0))
310299 then {
311- let inAmountAssetAmountX18 = toX18(inAmountAssetAmount, decimals)
312- let inPriceAssetAmountX18 = toX18(inPriceAssetAmount, decimals)
313- let userPriceX18 = calcPriceBigInt(inPriceAssetAmountX18, inAmountAssetAmountX18)
314- let amountBalanceX18 = toX18(amountBalance, decimals)
315- let priceBalanceX18 = toX18(priceBalance, decimals)
316- let r = if ((lpEmission == 0))
317- then {
318- let currentPriceX18 = zeroBigInt
319- let slippageX18 = zeroBigInt
320- let lpAmountX18 = pow((inAmountAssetAmountX18 * inPriceAssetAmountX18), 0, toBigInt(5), 1, 0, DOWN)
321- $Tuple5(fromX18(lpAmountX18, scale8), fromX18(inAmountAssetAmountX18, decimals), fromX18(inPriceAssetAmountX18, decimals), calcPriceBigInt((priceBalanceX18 + inPriceAssetAmountX18), (amountBalanceX18 + inAmountAssetAmountX18)), slippageX18)
300+ let curPriceX18 = zeroBigInt
301+ let slippageX18 = zeroBigInt
302+ let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
303+ $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
304+ }
305+ else {
306+ let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
307+ let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
308+ let slippageX18 = t1(slippage, scale8)
309+ if (if ((curPriceX18 != zeroBigInt))
310+ then (slippageRealX18 > slippageX18)
311+ else false)
312+ then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
313+ else {
314+ let lpEmissionX18 = t1(lpEm, scale8)
315+ let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
316+ let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
317+ let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
318+ then $Tuple2(amViaPrX18, inPrAssetAmtX18)
319+ else $Tuple2(inAmAssetAmtX18, prViaAmX18)
320+ let expAmtAssetAmtX18 = expectedAmts._1
321+ let expPriceAssetAmtX18 = expectedAmts._2
322+ let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
323+ $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
322324 }
323- else {
324- let currentPriceX18 = calcPriceBigInt(priceBalanceX18, amountBalanceX18)
325- let slippageRealX18 = fraction(abs((currentPriceX18 - userPriceX18)), scale18, currentPriceX18)
326- let slippageX18 = toX18(slippageTolerance, scale8)
327- if (if ((currentPriceX18 != zeroBigInt))
328- then (slippageRealX18 > slippageX18)
329- else false)
330- then throwErr(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
331- else {
332- let lpEmissionX18 = toX18(lpEmission, scale8)
333- let prViaAmX18 = fraction(inAmountAssetAmountX18, currentPriceX18, scale18)
334- let amViaPrX18 = fraction(inPriceAssetAmountX18, scale18, currentPriceX18)
335- let expectedAmounts = if ((prViaAmX18 > inPriceAssetAmountX18))
336- then $Tuple2(amViaPrX18, inAmountAssetAmountX18)
337- else $Tuple2(inAmountAssetAmountX18, prViaAmX18)
338- let expectedAmountAssetAmountX18 = expectedAmounts._1
339- let expectedPriceAssetAmountX18 = expectedAmounts._2
340- let lpAmountX18 = fraction(lpEmissionX18, expectedPriceAssetAmountX18, priceBalanceX18)
341- $Tuple5(fromX18(lpAmountX18, scale8), fromX18(expectedAmountAssetAmountX18, decimals), fromX18(expectedPriceAssetAmountX18, decimals), currentPriceX18, slippageX18)
342- }
343- }
344- let calculateLpAmount = r._1
345- let calculateAmountAssetPayment = r._2
346- let calculatePriceAssetPayment = r._3
347- let currentPrice = fromX18(r._4, scale8)
348- let slippageCalculate = fromX18(r._5, scale8)
349- let checkCalcLpAmount = if ((calculateLpAmount > 0))
350- then true
351- else throwErr("LP <= 0")
352- if ((checkCalcLpAmount == checkCalcLpAmount))
353- then {
354- let emitLpAmount = if (!(emitLp))
355- then 0
356- else calculateLpAmount
357- let amountDiff = (inAmountAssetAmount - calculateAmountAssetPayment)
358- let priceDiff = (inPriceAssetAmount - calculatePriceAssetPayment)
359- let $t01618916448 = if (if (isOneAsset)
360- then (paymentId == amountIdStr)
361- else false)
362- then $Tuple2(paymentAmount, 0)
363- else if (if (isOneAsset)
364- then (paymentId == priceIdStr)
365- else false)
366- then $Tuple2(0, paymentAmount)
367- else $Tuple2(calculateAmountAssetPayment, calculatePriceAssetPayment)
368- let writeAmAmt = $t01618916448._1
369- let writePrAmt = $t01618916448._2
370- let commonState = [IntegerEntry(keyPriceLast(), currentPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), currentPrice), StringEntry(keyPutActionByUser(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmount, currentPrice, slippageTolerance, slippageCalculate, height, lastBlock.timestamp, amountDiff, priceDiff))]
371- $Tuple13(calculateLpAmount, emitLpAmount, currentPrice, amountBalance, priceBalance, lpEmission, lpAssetId, sts, commonState, amountDiff, priceDiff, inAmountAssetId, inPriceAssetId)
372- }
373- else throw("Strict value is not equal to itself.")
374325 }
375- else throw("Strict value is not equal to itself.")
326+ let calcLpAmt = r._1
327+ let calcAmAssetPmt = r._2
328+ let calcPrAssetPmt = r._3
329+ let curPrice = f1(r._4, scale8)
330+ let slippageCalc = f1(r._5, scale8)
331+ if ((0 >= calcLpAmt))
332+ then throw("LP <= 0")
333+ else {
334+ let emitLpAmt = if (!(emitLp))
335+ then 0
336+ else calcLpAmt
337+ let amDiff = (inAmAmt - calcAmAssetPmt)
338+ let prDiff = (inPrAmt - calcPrAssetPmt)
339+ let $t01551715862 = if (if (isOneAsset)
340+ then (pmtId == amIdStr)
341+ else false)
342+ then $Tuple2(pmtAmt, 0)
343+ else if (if (isOneAsset)
344+ then (pmtId == prIdStr)
345+ else false)
346+ then $Tuple2(0, pmtAmt)
347+ else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
348+ let writeAmAmt = $t01551715862._1
349+ let writePrAmt = $t01551715862._2
350+ let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
351+ $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
352+ }
376353 }
377354
378355
379-func validateMatcherOrderAllowed (order) = {
380- let cfg = getPoolConfig()
356+func moa (order) = {
357+ let cfg = gpc()
381358 let amtAsId = cfg[idxAmAsId]
382359 let prAsId = cfg[idxPrAsId]
383360 let sts = parseIntValue(cfg[idxPoolSt])
384361 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
385362 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
386363 let accAmtAsBalance = getAccBalance(amtAsId)
387364 let accPrAsBalance = getAccBalance(prAsId)
388- let currentPriceX18 = if ((order.orderType == Buy))
389- then privateCalcPrice(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
390- else privateCalcPrice(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
391- let curPrice = fromX18(currentPriceX18, scale8)
392- if (if (if (isGlobalShutdown())
365+ let curPriceX18 = if ((order.orderType == Buy))
366+ then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
367+ else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
368+ let curPrice = f1(curPriceX18, scale8)
369+ if (if (if (igs())
393370 then true
394371 else (sts == PoolMatcherDis))
395372 then true
396373 else (sts == PoolShutdown))
397- then throwErr("Admin blocked")
374+ then throw("Admin blocked")
398375 else {
399376 let orAmtAsset = order.assetPair.amountAsset
400377 let orAmtAsStr = if ((orAmtAsset == unit))
401378 then "WAVES"
402379 else toBase58String(value(orAmtAsset))
403380 let orPrAsset = order.assetPair.priceAsset
404381 let orPrAsStr = if ((orPrAsset == unit))
405382 then "WAVES"
406383 else toBase58String(value(orPrAsset))
407384 if (if ((orAmtAsStr != amtAsId))
408385 then true
409386 else (orPrAsStr != prAsId))
410- then throwErr("Wr assets")
387+ then throw("Wr assets")
411388 else {
412389 let orderPrice = order.price
413- let priceDecimals = fraction(scale8, prAsDcm, amtAsDcm)
414- let castOrderPrice = ts(orderPrice, scale8, priceDecimals)
390+ let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
391+ let castOrderPrice = ts(orderPrice, scale8, priceDcm)
415392 let isOrderPriceValid = if ((order.orderType == Buy))
416393 then (curPrice >= castOrderPrice)
417394 else (castOrderPrice >= curPrice)
418395 true
419396 }
420397 }
421398 }
422399
423400
424-func commonGet (i) = {
425- let checkPayments = if ((size(i.payments) == 1))
426- then true
427- else throwErr("1 payment expected")
428- if ((checkPayments == checkPayments))
429- then {
430- let payment = value(i.payments[0])
431- let paymentAssetId = value(payment.assetId)
432- let paymentAmount = payment.amount
433- let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(paymentAssetId), paymentAmount, i.caller)
434- let outAmountAmount = r._1
435- let outPriceAmount = r._2
436- let sts = parseIntValue(r._9)
437- let state = r._10
438- if (if (isGlobalShutdown())
439- then true
440- else (sts == PoolShutdown))
441- then throwErr(("Admin blocked: " + toString(sts)))
442- else $Tuple5(outAmountAmount, outPriceAmount, paymentAmount, paymentAssetId, state)
443- }
444- else throw("Strict value is not equal to itself.")
445- }
401+func cg (i) = if ((size(i.payments) != 1))
402+ then throw("1 pmnt exp")
403+ else {
404+ let pmt = value(i.payments[0])
405+ let pmtAssetId = value(pmt.assetId)
406+ let pmtAmt = pmt.amount
407+ let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
408+ let outAmAmt = r._1
409+ let outPrAmt = r._2
410+ let sts = parseIntValue(r._9)
411+ let state = r._10
412+ if (if (igs())
413+ then true
414+ else (sts == PoolShutdown))
415+ then throw(("Admin blocked: " + toString(sts)))
416+ else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
417+ }
446418
447419
448-func commonPut (caller,txId,amountAssetPayment,priceAssetPayment,slippage,emitLp,isOneAsset,paymentAmount,paymentId) = {
449- let r = estimatePutOperation(txId, slippage, value(amountAssetPayment).amount, value(amountAssetPayment).assetId, value(priceAssetPayment).amount, value(priceAssetPayment).assetId, caller, false, emitLp, isOneAsset, paymentAmount, paymentId)
420+func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,pmtAmt,pmtId) = {
421+ let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, false, emitLp, isOneAsset, pmtAmt, pmtId)
450422 let sts = parseIntValue(r._8)
451- if (if (if (isGlobalShutdown())
423+ if (if (if (igs())
452424 then true
453425 else (sts == PoolPutDis))
454426 then true
455427 else (sts == PoolShutdown))
456- then throwErr(("Blocked:" + toString(sts)))
428+ then throw(("Blocked:" + toString(sts)))
457429 else r
458430 }
459431
460432
461433 func takeFee (amount) = {
462434 let fee = fraction(amount, feePermille, thousand)
463435 $Tuple2((amount - fee), fee)
464436 }
465437
466438
467-func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
439+func m () = match getString(mpk()) {
468440 case s: String =>
469441 fromBase58String(s)
470442 case _: Unit =>
471443 unit
472444 case _ =>
473445 throw("Match error")
474446 }
475447
476448
477-func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
449+func pm () = match getString(pmpk()) {
478450 case s: String =>
479451 fromBase58String(s)
480452 case _: Unit =>
481453 unit
482454 case _ =>
483455 throw("Match error")
484456 }
485457
486458
487-let pd = throwErr("Permission denied")
459+let pd = throw("Permission denied")
488460
489-func mustManager (i) = match managerPublicKeyOrUnit() {
461+func mm (i) = match m() {
490462 case pk: ByteVector =>
491463 if ((i.callerPublicKey == pk))
492464 then true
493465 else pd
494466 case _: Unit =>
495467 if ((i.caller == this))
496468 then true
497469 else pd
498470 case _ =>
499471 throw("Match error")
500472 }
501473
502474
503475 @Callable(i)
504-func constructor (factoryContract) = {
505- let checkCaller = mustManager(i)
506- if ((checkCaller == checkCaller))
507- then [StringEntry(keyFactoryContact(), factoryContract)]
476+func constructor (fc) = {
477+ let c = mm(i)
478+ if ((c == c))
479+ then [StringEntry(fc(), fc)]
508480 else throw("Strict value is not equal to itself.")
509481 }
510482
511483
512484
513485 @Callable(i)
514486 func setManager (pendingManagerPublicKey) = {
515- let checkCaller = mustManager(i)
516- if ((checkCaller == checkCaller))
487+ let c = mm(i)
488+ if ((c == c))
517489 then {
518- let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
519- if ((checkManagerPublicKey == checkManagerPublicKey))
520- then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
490+ let cm = fromBase58String(pendingManagerPublicKey)
491+ if ((cm == cm))
492+ then [StringEntry(pmpk(), pendingManagerPublicKey)]
521493 else throw("Strict value is not equal to itself.")
522494 }
523495 else throw("Strict value is not equal to itself.")
524496 }
525497
526498
527499
528500 @Callable(i)
529501 func confirmManager () = {
530- let pm = pendingManagerPublicKeyOrUnit()
531- let hasPM = if (isDefined(pm))
502+ let p = pm()
503+ let hpm = if (isDefined(p))
532504 then true
533- else throwErr("No pending manager")
534- if ((hasPM == hasPM))
505+ else throw("No pending manager")
506+ if ((hpm == hpm))
535507 then {
536- let checkPM = if ((i.callerPublicKey == value(pm)))
508+ let cpm = if ((i.callerPublicKey == value(p)))
537509 then true
538- else throwErr("You are not pending manager")
539- if ((checkPM == checkPM))
540- then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
510+ else throw("You are not pending manager")
511+ if ((cpm == cpm))
512+ then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
541513 else throw("Strict value is not equal to itself.")
542514 }
543515 else throw("Strict value is not equal to itself.")
544516 }
545517
546518
547519
548520 @Callable(i)
549-func put (slippage,autoStake) = {
550- let factCfg = getFactoryConfig()
551- let stakingContract = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wrong staking contract")
552- let slippageContract = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wrogn slippage contract")
553- let slippageCheck = if ((slippage >= 0))
554- then true
555- else throwErr("wrong slippage")
556- if ((slippageCheck == slippageCheck))
557- then {
558- let paymentsCheck = if ((size(i.payments) == 2))
559- then true
560- else throwErr("2 payments expected")
561- if ((paymentsCheck == paymentsCheck))
562- then {
563- let estimatePut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slippage, true, false, 0, "")
564- let emitLpAmount = estimatePut._2
565- let lpAssetId = estimatePut._7
566- let state = estimatePut._9
567- let amountDiff = estimatePut._10
568- let priceDiff = estimatePut._11
569- let amountId = estimatePut._12
570- let priceId = estimatePut._13
571- let r = invoke(factoryContract, "emit", [emitLpAmount], nil)
572- if ((r == r))
573- then {
574- let el = match r {
575- case legacy: Address =>
576- invoke(legacy, "emit", [emitLpAmount], nil)
577- case _ =>
578- unit
579- }
580- if ((el == el))
581- then {
582- let sa = if ((amountDiff > 0))
583- then invoke(slippageContract, "put", nil, [AttachedPayment(amountId, amountDiff)])
584- else nil
585- if ((sa == sa))
586- then {
587- let sp = if ((priceDiff > 0))
588- then invoke(slippageContract, "put", nil, [AttachedPayment(priceId, priceDiff)])
589- else nil
590- if ((sp == sp))
591- then {
592- let lpTrasfer = if (autoStake)
593- then {
594- let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmount)])
595- if ((ss == ss))
596- then nil
597- else throw("Strict value is not equal to itself.")
598- }
599- else [ScriptTransfer(i.caller, emitLpAmount, lpAssetId)]
600- (state ++ lpTrasfer)
601- }
602- else throw("Strict value is not equal to itself.")
603- }
604- else throw("Strict value is not equal to itself.")
605- }
606- else throw("Strict value is not equal to itself.")
607- }
608- else throw("Strict value is not equal to itself.")
609- }
610- else throw("Strict value is not equal to itself.")
611- }
612- else throw("Strict value is not equal to itself.")
521+func put (slip,autoStake) = {
522+ let factCfg = gfc()
523+ let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
524+ let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
525+ if ((0 > slip))
526+ then throw("Wrong slippage")
527+ else if ((size(i.payments) != 2))
528+ then throw("2 pmnts expd")
529+ else {
530+ let e = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true, false, 0, "")
531+ let emitLpAmt = e._2
532+ let lpAssetId = e._7
533+ let state = e._9
534+ let amDiff = e._10
535+ let prDiff = e._11
536+ let amId = e._12
537+ let prId = e._13
538+ let r = invoke(fca, "emit", [emitLpAmt], nil)
539+ if ((r == r))
540+ then {
541+ let el = match r {
542+ case legacy: Address =>
543+ invoke(legacy, "emit", [emitLpAmt], nil)
544+ case _ =>
545+ unit
546+ }
547+ if ((el == el))
548+ then {
549+ let sa = if ((amDiff > 0))
550+ then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
551+ else nil
552+ if ((sa == sa))
553+ then {
554+ let sp = if ((prDiff > 0))
555+ then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
556+ else nil
557+ if ((sp == sp))
558+ then {
559+ let lpTrnsfr = if (autoStake)
560+ then {
561+ let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
562+ if ((ss == ss))
563+ then nil
564+ else throw("Strict value is not equal to itself.")
565+ }
566+ else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
567+ (state ++ lpTrnsfr)
568+ }
569+ else throw("Strict value is not equal to itself.")
570+ }
571+ else throw("Strict value is not equal to itself.")
572+ }
573+ else throw("Strict value is not equal to itself.")
574+ }
575+ else throw("Strict value is not equal to itself.")
576+ }
613577 }
614578
615579
616580
617581 @Callable(i)
618-func putOneTkn (amountAssetPart,priceAssetPart,outLp,slippage,autoStake) = {
619- let cfg = getFactoryConfig()
620- let stakingContract = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wrong staking contract")
621- let slippageContract = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wrong slippage contract")
622- let gwxRewardContract = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wrong gwx reward contract")
623- let poolCfg = getPoolConfig()
624- let amountId = poolCfg[idxAmAsId]
625- let priceId = poolCfg[idxPrAsId]
626- let amountDecimals = parseIntValue(poolCfg[idxAmtAsDcm])
627- let priceDecimals = parseIntValue(poolCfg[idxPriceAsDcm])
628- let addon = valueOrElse(getString(this, keyAddonAddress()), "")
582+func putOneTkn (amAssetPart,prAssetPart,outLp,slippage,autoStake) = {
583+ let cfg = gfc()
584+ let stakingCntr = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wr st addr")
585+ let slipCntr = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wr sl addr")
586+ let gwxCntr = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wr gwx addr")
587+ let poolCfg = gpc()
588+ let amId = poolCfg[idxAmAsId]
589+ let prId = poolCfg[idxPrAsId]
590+ let amDcm = parseIntValue(poolCfg[idxAmtAsDcm])
591+ let prDcm = parseIntValue(poolCfg[idxPriceAsDcm])
592+ let addon = valueOrElse(getString(this, ada()), "")
629593 let userAddress = if ((addon == toString(i.caller)))
630594 then i.originCaller
631595 else i.caller
632596 if (if (if (if ((0 >= slippage))
633597 then true
634- else (0 >= amountAssetPart))
598+ else (0 >= amAssetPart))
635599 then true
636- else (0 >= priceAssetPart))
600+ else (0 >= prAssetPart))
637601 then true
638602 else (0 >= outLp))
639- then throwErr("Wrong params")
603+ then throw("Wrong params")
640604 else if ((size(i.payments) != 1))
641- then throwErr("1 payment expected")
605+ then throw("1 pmnt expd")
642606 else {
643- let payment = value(i.payments[0])
644- let paymentAssetId = toBase58String(value(payment.assetId))
645- let paymentAmountRaw = payment.amount
646- let $t02561725676 = takeFee(paymentAmountRaw)
647- let paymentAmount = $t02561725676._1
648- let feeAmount = $t02561725676._2
649- if (if (if ((amountAssetPart > paymentAmount))
607+ let pmt = value(i.payments[0])
608+ let pmtAssetId = toBase58String(value(pmt.assetId))
609+ let paymentAmountRaw = pmt.amount
610+ let $t02447924531 = takeFee(paymentAmountRaw)
611+ let pmtAmt = $t02447924531._1
612+ let feeAmount = $t02447924531._2
613+ if (if (if ((amAssetPart > pmtAmt))
650614 then true
651- else (priceAssetPart > paymentAmount))
615+ else (prAssetPart > pmtAmt))
652616 then true
653- else (10000000 > paymentAmount))
654- then throwErr("wrong payment amount")
617+ else (10000000 > pmtAmt))
618+ then throw("Wrong pmt amt")
655619 else {
656- let amountBalance = getAccBalance(amountId)
657- let priceBalance = getAccBalance(priceId)
658- let $t02594026395 = if ((paymentAssetId == amountId))
659- then $Tuple6((amountBalance - paymentAmount), priceBalance, (paymentAmount - amountAssetPart), priceAssetPart, 0, 0)
660- else if ((paymentAssetId == priceId))
661- then $Tuple6(amountBalance, (priceBalance - paymentAmount), 0, 0, (paymentAmount - priceAssetPart), amountAssetPart)
662- else throwErr("wrong paymentAssetId")
663- let amountBalanceNow = $t02594026395._1
664- let priceBalanceNow = $t02594026395._2
665- let virtSwapInAm = $t02594026395._3
666- let virtSwapOutPr = $t02594026395._4
667- let virtSwapInPr = $t02594026395._5
668- let virtSwapOutAm = $t02594026395._6
669- let D0 = invoke(gwxRewardContract, "calcD", [toString(amountBalanceNow), toString(priceBalanceNow), amplificator, Amult, Dconv], nil)
670- let D1 = invoke(gwxRewardContract, "calcD", [toString(toBigInt(((amountBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((priceBalanceNow + virtSwapInPr) - virtSwapOutPr))), amplificator, Amult, Dconv], nil)
671- let D0vsD1 = validateD(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
620+ let amBalance = getAccBalance(amId)
621+ let prBalance = getAccBalance(prId)
622+ let $t02472825108 = if ((pmtAssetId == amId))
623+ then $Tuple6((amBalance - pmtAmt), prBalance, (pmtAmt - amAssetPart), prAssetPart, 0, 0)
624+ else if ((pmtAssetId == prId))
625+ then $Tuple6(amBalance, (prBalance - pmtAmt), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
626+ else throw("wrong pmtAssetId")
627+ let amBalanceNow = $t02472825108._1
628+ let prBalanceNow = $t02472825108._2
629+ let virtSwapInAm = $t02472825108._3
630+ let virtSwapOutPr = $t02472825108._4
631+ let virtSwapInPr = $t02472825108._5
632+ let virtSwapOutAm = $t02472825108._6
633+ let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
634+ let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
635+ let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
672636 if ((D0vsD1 == D0vsD1))
673637 then {
674- let estimatePut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amountId), amountAssetPart), AttachedPayment(fromBase58String(priceId), priceAssetPart), slippage, true, true, paymentAmount, paymentAssetId)
675- let estimateLP = estimatePut._2
676- let lpAssetId = estimatePut._7
677- let state = estimatePut._9
678- let amountDiff = estimatePut._10
679- let priceDiff = estimatePut._11
680- let lpCalcRes = validateAbsDiff(toBigInt(estimateLP), toBigInt(outLp), toBigInt(slippage))
681- let emitLpAmount = toInt(lpCalcRes._2)
682- let e = invoke(factoryContract, "emit", [emitLpAmount], nil)
638+ let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), slippage, true, true, pmtAmt, pmtAssetId)
639+ let estimLP = estPut._2
640+ let lpAssetId = estPut._7
641+ let state = estPut._9
642+ let amDiff = estPut._10
643+ let prDiff = estPut._11
644+ let lpCalcRes = vad(toBigInt(estimLP), toBigInt(outLp), toBigInt(slippage))
645+ let emitLpAmt = toInt(lpCalcRes._2)
646+ let e = invoke(fca, "emit", [emitLpAmt], nil)
683647 if ((e == e))
684648 then {
685649 let el = match e {
686650 case legacy: Address =>
687- invoke(legacy, "emit", [emitLpAmount], nil)
651+ invoke(legacy, "emit", [emitLpAmt], nil)
688652 case _ =>
689653 unit
690654 }
691655 if ((el == el))
692656 then {
693- let sa = if ((amountDiff > 0))
694- then invoke(slippageContract, "put", nil, [AttachedPayment(fromBase58String(amountId), amountDiff)])
657+ let sa = if ((amDiff > 0))
658+ then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
695659 else nil
696660 if ((sa == sa))
697661 then {
698- let sp = if ((priceDiff > 0))
699- then invoke(slippageContract, "put", nil, [AttachedPayment(fromBase58String(priceId), priceDiff)])
662+ let sp = if ((prDiff > 0))
663+ then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
700664 else nil
701665 if ((sp == sp))
702666 then {
703- let lpTrasfer = if (autoStake)
667+ let lpTrnsfr = if (autoStake)
704668 then {
705- let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmount)])
669+ let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
706670 if ((ss == ss))
707671 then nil
708672 else throw("Strict value is not equal to itself.")
709673 }
710- else [ScriptTransfer(i.caller, emitLpAmount, lpAssetId)]
674+ else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
711675 let sendFeeToMatcher = if ((feeAmount > 0))
712- then [ScriptTransfer(matcherAddress, feeAmount, fromBase58String(paymentAssetId))]
676+ then [ScriptTransfer(matcherAddress, feeAmount, fromBase58String(pmtAssetId))]
713677 else nil
714- ((state ++ lpTrasfer) ++ sendFeeToMatcher)
678+ ((state ++ lpTrnsfr) ++ sendFeeToMatcher)
715679 }
716680 else throw("Strict value is not equal to itself.")
717681 }
718682 else throw("Strict value is not equal to itself.")
719683 }
720684 else throw("Strict value is not equal to itself.")
721685 }
722686 else throw("Strict value is not equal to itself.")
723687 }
724688 else throw("Strict value is not equal to itself.")
725689 }
726690 }
727691 }
728692
729693
730694
731695 @Callable(i)
732-func putForFree (maxslippage) = if ((0 > maxslippage))
733- then throwErr("wrong slippage")
696+func putForFree (maxSlpg) = if ((0 > maxSlpg))
697+ then throw("Wrong slpg")
734698 else if ((size(i.payments) != 2))
735- then throwErr("2 payments expected")
699+ then throw("2 pmnts expd")
736700 else {
737- let estimatePut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxslippage, false, false, 0, "")
738- estimatePut._9
701+ let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlpg, false, false, 0, "")
702+ estPut._9
739703 }
740704
741705
742706
743707 @Callable(i)
744708 func get () = {
745- let r = commonGet(i)
709+ let r = cg(i)
746710 let outAmtAmt = r._1
747- let outPriceAmount = r._2
748- let paymentAmount = r._3
749- let paymentAssetId = r._4
711+ let outPrAmt = r._2
712+ let pmtAmt = r._3
713+ let pmtAssetId = r._4
750714 let state = r._5
751- let b = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
715+ let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
752716 if ((b == b))
753717 then state
754718 else throw("Strict value is not equal to itself.")
755719 }
756720
757721
758722
759723 @Callable(i)
760724 func getOneTkn (exchResult,notUsed,outAmount,outAssetId,slippage) = if ((size(i.payments) != 1))
761- then throwErr("1 payment expected")
725+ then throw("1 pmnt expd")
762726 else {
763- let cfg = getPoolConfig()
764- let lpAssetId = cfg[idxLPAsId]
765- let amountId = cfg[idxAmAsId]
766- let priceId = cfg[idxPrAsId]
767- let amountDecimals = parseIntValue(cfg[idxAmtAsDcm])
768- let priceDecimals = parseIntValue(cfg[idxPriceAsDcm])
727+ let cfg = gpc()
728+ let lpId = cfg[idxLPAsId]
729+ let amId = cfg[idxAmAsId]
730+ let prId = cfg[idxPrAsId]
731+ let amDcm = parseIntValue(cfg[idxAmtAsDcm])
732+ let prDcm = parseIntValue(cfg[idxPriceAsDcm])
769733 let sts = cfg[idxPoolSt]
770- let factCfg = getFactoryConfig()
771- let gwxRewardContract = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wrong gwxRewardContract address")
772- let payment = value(i.payments[0])
773- let addon = valueOrElse(getString(this, keyAddonAddress()), "")
734+ let factCfg = gfc()
735+ let gwxCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wr sl addr")
736+ let pmt = value(i.payments[0])
737+ let addon = valueOrElse(getString(this, ada()), "")
774738 let userAddress = if ((addon == toString(i.caller)))
775739 then i.originCaller
776740 else i.caller
777741 let txId58 = toBase58String(i.transactionId)
778- let paymentAssetId = value(payment.assetId)
779- let paymentAmount = payment.amount
780- if ((1000000000 > paymentAmount))
781- then throwErr("Min payment 10 LP")
742+ let pmtAssetId = value(pmt.assetId)
743+ let pmtAmt = pmt.amount
744+ if ((1000000000 > pmtAmt))
745+ then throw("Min pmt 10 LP")
782746 else if (if (if ((0 > slippage))
783747 then true
784748 else (0 > exchResult))
785749 then true
786750 else (0 > outAmount))
787- then throwErr("Wrong params")
788- else if ((lpAssetId != toBase58String(paymentAssetId)))
789- then throwErr("Wrong LP")
751+ then throw("Wrong params")
752+ else if ((lpId != toBase58String(pmtAssetId)))
753+ then throw("Wrong LP")
790754 else {
791- let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(paymentAssetId), paymentAmount, i.caller)
755+ let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
792756 let estimAmAmt = r._1
793757 let estimPrAmt = r._2
794- let amountBalance = getAccBalance(amountId)
795- let priceBalance = getAccBalance(priceId)
796- let $t03153432002 = if ((outAssetId == amountId))
797- then $Tuple7((amountBalance - estimAmAmt), (priceBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
798- else if ((outAssetId == priceId))
799- then $Tuple7((amountBalance - estimAmAmt), (priceBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
800- else throwErr("wrong outAssetId")
801- let amountBalanceNow = $t03153432002._1
802- let priceBalanceNow = $t03153432002._2
803- let virtSwapInAm = $t03153432002._3
804- let virtSwapOutPr = $t03153432002._4
805- let virtSwapInPr = $t03153432002._5
806- let virtSwapOutAm = $t03153432002._6
807- let totalGet = $t03153432002._7
758+ let amBalance = getAccBalance(amId)
759+ let prBalance = getAccBalance(prId)
760+ let $t03004630503 = if ((outAssetId == amId))
761+ then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
762+ else if ((outAssetId == prId))
763+ then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
764+ else throw("wrong outAssetId")
765+ let amBalanceNow = $t03004630503._1
766+ let prBalanceNow = $t03004630503._2
767+ let virtSwapInAm = $t03004630503._3
768+ let virtSwapOutPr = $t03004630503._4
769+ let virtSwapInPr = $t03004630503._5
770+ let virtSwapOutAm = $t03004630503._6
771+ let totalGet = $t03004630503._7
808772 if (if ((0 > virtSwapInAm))
809773 then true
810774 else (0 > virtSwapInPr))
811- then throwErr("Wrong calc")
775+ then throw("Wrong calc")
812776 else {
813- let D0 = invoke(gwxRewardContract, "calcD", [toString(amountBalanceNow), toString(priceBalanceNow), amplificator, Amult, Dconv], nil)
814- let D1 = invoke(gwxRewardContract, "calcD", [toString(((amountBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((priceBalanceNow + virtSwapOutPr) - virtSwapInPr)), amplificator, Amult, Dconv], nil)
815- let D0vsD1 = validateD(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
777+ let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
778+ let D1 = invoke(gwxCntr, "calcD", [toString(((amBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((prBalanceNow + virtSwapOutPr) - virtSwapInPr)), A, Amult, Dconv], nil)
779+ let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
816780 if ((D0vsD1 == D0vsD1))
817781 then {
818- let finalRes = validateAbsDiff(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
782+ let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
819783 if ((finalRes == finalRes))
820784 then {
821- let $t03267132779 = if ((outAssetId == amountId))
785+ let $t03120831312 = if ((outAssetId == amId))
822786 then $Tuple2(toInt(finalRes._2), 0)
823787 else $Tuple2(0, toInt(finalRes._2))
824- let outAm = $t03267132779._1
825- let outPr = $t03267132779._2
788+ let outAm = $t03120831312._1
789+ let outPr = $t03120831312._2
826790 let totalAmountRaw = (outAm + outPr)
827- let $t03281932874 = takeFee(totalAmountRaw)
828- let totalAmount = $t03281932874._1
829- let feeAmount = $t03281932874._2
791+ let $t03135231407 = takeFee(totalAmountRaw)
792+ let totalAmount = $t03135231407._1
793+ let feeAmount = $t03135231407._2
830794 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
831795 then unit
832796 else fromBase58String(outAssetId)
833797 let sendFeeToMatcher = if ((feeAmount > 0))
834798 then [ScriptTransfer(matcherAddress, feeAmount, outAssetIdOrWaves)]
835799 else nil
836- let decimals = if ((amountDecimals >= priceDecimals))
837- then amountDecimals
838- else priceDecimals
839- if ((decimals == decimals))
800+ let curPrX18 = cpbi(t1(prBalance, prDcm), t1(amBalance, amDcm))
801+ let curPr = f1(curPrX18, scale8)
802+ let state = [ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)]
803+ if ((state == state))
840804 then {
841- let curPrX18 = calcPriceBigInt(toX18(priceBalance, decimals), toX18(amountBalance, decimals))
842- let curPr = fromX18(curPrX18, scale8)
843- let state = [ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(keyGetActionByUser(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, paymentAmount, curPr, height, lastBlock.timestamp)), IntegerEntry(keyPriceLast(), curPr), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPr)]
844- if ((state == state))
845- then {
846- let burn = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
847- if ((burn == burn))
848- then (state ++ sendFeeToMatcher)
849- else throw("Strict value is not equal to itself.")
850- }
805+ let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
806+ if ((burn == burn))
807+ then (state ++ sendFeeToMatcher)
851808 else throw("Strict value is not equal to itself.")
852809 }
853810 else throw("Strict value is not equal to itself.")
854811 }
855812 else throw("Strict value is not equal to itself.")
856813 }
857814 else throw("Strict value is not equal to itself.")
858815 }
859816 }
860817 }
861818
862819
863820
864821 @Callable(i)
865822 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
866- let r = commonGet(i)
867- let outAmountAmount = r._1
868- let outPriceAmount = r._2
869- let paymentAmount = r._3
870- let paymentAssetId = r._4
823+ let r = cg(i)
824+ let outAmAmt = r._1
825+ let outPrAmt = r._2
826+ let pmtAmt = r._3
827+ let pmtAssetId = r._4
871828 let state = r._5
872- let checkOutAmountAmount = if ((outAmountAmount >= noLessThenAmtAsset))
873- then true
874- else throwErr(((("Failed: " + toString(outAmountAmount)) + " < ") + toString(noLessThenAmtAsset)))
875- if ((checkOutAmountAmount == checkOutAmountAmount))
876- then {
877- let checkOutPriceAmount = if ((outPriceAmount >= noLessThenPriceAsset))
878- then true
879- else throwErr(((("Failed: " + toString(outPriceAmount)) + " < ") + toString(noLessThenPriceAsset)))
880- if ((checkOutPriceAmount == checkOutPriceAmount))
881- then {
882- let burnLPAssetOnFactory = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
883- if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
884- then state
885- else throw("Strict value is not equal to itself.")
886- }
887- else throw("Strict value is not equal to itself.")
888- }
889- else throw("Strict value is not equal to itself.")
829+ if ((noLessThenAmtAsset > outAmAmt))
830+ then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
831+ else if ((noLessThenPriceAsset > outPrAmt))
832+ then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
833+ else {
834+ let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
835+ if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
836+ then state
837+ else throw("Strict value is not equal to itself.")
838+ }
890839 }
891840
892841
893842
894843 @Callable(i)
895844 func unstakeAndGet (amount) = {
896845 let checkPayments = if ((size(i.payments) != 0))
897- then throwErr("no payments expected")
846+ then throw("No pmnts expd")
898847 else true
899848 if ((checkPayments == checkPayments))
900849 then {
901- let cfg = getPoolConfig()
902- let factoryCfg = getFactoryConfig()
850+ let cfg = gpc()
851+ let factoryCfg = gfc()
903852 let lpAssetId = fromBase58String(cfg[idxLPAsId])
904- let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "wrong")
853+ let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
905854 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
906855 if ((unstakeInv == unstakeInv))
907856 then {
908- let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
857+ let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
909858 let sts = parseIntValue(r._9)
910859 let state = r._10
911- let v = if (if (isGlobalShutdown())
860+ let v = if (if (igs())
912861 then true
913862 else (sts == PoolShutdown))
914- then throwErr(("Blocked: " + toString(sts)))
863+ then throw(("Blocked: " + toString(sts)))
915864 else true
916865 if ((v == v))
917866 then {
918- let burnA = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
867+ let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
919868 if ((burnA == burnA))
920869 then state
921870 else throw("Strict value is not equal to itself.")
922871 }
923872 else throw("Strict value is not equal to itself.")
924873 }
925874 else throw("Strict value is not equal to itself.")
926875 }
927876 else throw("Strict value is not equal to itself.")
928877 }
929878
930879
931880
932881 @Callable(i)
933-func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(factoryContract)))
934- then throwErr("denied")
935- else $Tuple2([StringEntry(keyAmountAsset(), amtAsStr), StringEntry(keyPriceAsset(), prAsStr)], "success")
882+func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
883+ then throw("denied")
884+ else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
936885
937886
938887
939888 @Callable(i)
940-func setS (k,v) = if ((toString(i.caller) != getStringOrFail(this, keyAddonAddress())))
889+func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
941890 then pd
942891 else [StringEntry(k, v)]
943892
944893
945894
946895 @Callable(i)
947-func setI (k,v) = if ((toString(i.caller) != getStringOrFail(this, keyAddonAddress())))
896+func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
948897 then pd
949898 else [IntegerEntry(k, v)]
950899
951900
952901
953902 @Callable(i)
954-func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig())
903+func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
955904
956905
957906
958907 @Callable(i)
959908 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
960909
961910
962911
963912 @Callable(i)
964913 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
965914 let pr = calcPrices(amAmt, prAmt, lpAmt)
966915 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
967916 }
968917
969918
970919
971920 @Callable(i)
972-func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resScaleMult))
921+func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
973922
974923
975924
976925 @Callable(i)
977-func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult)))
926+func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
978927
979928
980929
981930 @Callable(i)
982-func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
931+func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
983932
984933
985934
986935 @Callable(i)
987-func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmountAssetAmount,inAmId,inPriceAssetAmount,inPrId,usrAddr,isEvaluate,emitLp) = $Tuple2(nil, estimatePutOperation(txId58, slippage, inAmountAssetAmount, inAmId, inPriceAssetAmount, inPrId, usrAddr, isEvaluate, emitLp, false, 0, ""))
936+func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, false, 0, ""))
988937
989938
990939
991940 @Callable(i)
992-func estimateGetOperationWrapperREADONLY (txId58,paymentAsId,paymentLpAmount,usrAddr) = {
993- let r = estimateGetOperation(txId58, paymentAsId, paymentLpAmount, addressFromStringValue(usrAddr))
941+func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
942+ let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
994943 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
995944 }
996945
997946
998947 @Verifier(tx)
999948 func verify () = match tx {
1000949 case order: Order =>
1001- let mtchPub = getMatcherPubOrFail()
1002- let orV = validateMatcherOrderAllowed(order)
950+ let mtchPub = mp()
951+ let orV = moa(order)
1003952 let sndrV = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
1004953 let mtchV = sigVerify(order.bodyBytes, order.proofs[1], mtchPub)
1005954 if (if (if (orV)
1006955 then sndrV
1007956 else false)
1008957 then mtchV
1009958 else false)
1010959 then true
1011- else throwOrderError(orV, sndrV, mtchV)
960+ else toe(orV, sndrV, mtchV)
1012961 case _ =>
1013- let targetPublicKey = match managerPublicKeyOrUnit() {
962+ let targetPublicKey = match m() {
1014963 case pk: ByteVector =>
1015964 pk
1016965 case _: Unit =>
1017966 tx.senderPublicKey
1018967 case _ =>
1019968 throw("Match error")
1020969 }
1021970 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
1022971 }
1023972

github/deemru/w8io/c3f4982 
232.30 ms