tx · AZCcydYvW5aiS9fYbHjRXWnyqYsFdqd7GGNPwBPBRQ7f

3N4vUDe3oc1YPNwMyQi2h8f2tmGoA7wBZp2:  -0.01400000 Waves

2022.05.18 16:19 [2057154] smart account 3N4vUDe3oc1YPNwMyQi2h8f2tmGoA7wBZp2 > SELF 0.00000000 Waves

{ "type": 13, "id": "AZCcydYvW5aiS9fYbHjRXWnyqYsFdqd7GGNPwBPBRQ7f", "fee": 1400000, "feeAssetId": null, "timestamp": 1652879984664, "version": 1, "sender": "3N4vUDe3oc1YPNwMyQi2h8f2tmGoA7wBZp2", "senderPublicKey": "6MuWw1pkme7UgQX2hZh8yTZyoWVkz8A4rmHZ1acrsrVm", "proofs": [ "2rxUEG37rSkzFA83Cy19mtceYZGs9Q8mYf5MtuGiFv7oQ3qqxuUCsiBStfhMwtLYX4q8TyDw8KpXi5hgiMvW7f6g" ], "script": "base64:AAIFAAAAAAAAACIIAhIDCgEIEgMKAQgSABIDCgEYEggKBgEBAQEIARIDCgEIAAAAHgAAAAADU0VQAgAAAAJfXwAAAAAFRU1QVFkCAAAAAAAAAAAOaWR4UG9vbEFkZHJlc3MAAAAAAAAAAAEAAAAACWlkeExQQXNJZAAAAAAAAAAAAwAAAAAJaWR4QW1Bc0lkAAAAAAAAAAAEAAAAAAlpZHhQckFzSWQAAAAAAAAAAAUAAAAAD2lkeEZhY3RTdGFrQ250cgAAAAAAAAAAAQEAAAALa2V5RmFjdENudHIAAAAAAgAAABMlc19fZmFjdG9yeUNvbnRyYWN0AQAAABNrZXlNYW5hZ2VyUHVibGljS2V5AAAAAAIAAAAUJXNfX21hbmFnZXJQdWJsaWNLZXkBAAAAGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAAAAAIAAAAbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQAAAAtrZXlQb29sQWRkcgAAAAACAAAADyVzX19wb29sQWRkcmVzcwEAAAALa2V5QW10QXNzZXQAAAAAAgAAAA8lc19fYW1vdW50QXNzZXQBAAAADWtleVByaWNlQXNzZXQAAAAAAgAAAA4lc19fcHJpY2VBc3NldAEAAAAPa2V5QWRtaW5QdWJLZXlzAAAAAAIAAAAQJXNfX2FkbWluUHViS2V5cwEAAAAGa2V5QW1wAAAAAAIAAAAHJXNfX2FtcAEAAAANa2V5QW1wSGlzdG9yeQAAAAEAAAAGaGVpZ2h0CQABLAAAAAICAAAACyVzJWRfX2FtcF9fCQABpAAAAAEFAAAABmhlaWdodAEAAAAQa2V5RmFjdG9yeUNvbmZpZwAAAAACAAAAESVzX19mYWN0b3J5Q29uZmlnAQAAAA1rZXlQb29sQ29uZmlnAAAAAgAAAAZpQW10QXMAAAAFaVByQXMJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIJWQlZCVzX18FAAAABmlBbXRBcwIAAAACX18FAAAABWlQckFzAgAAAAhfX2NvbmZpZwEAAAAfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAAAAAEAAAAFYkFTdHIJAAEsAAAAAgIAAAAoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUAAAAFYkFTdHIBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIAAAAEYWRkcgAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAARhZGRyBQAAAANrZXkJAAS5AAAAAgkABEwAAAACAgAAAAptYW5kYXRvcnkgCQAETAAAAAIJAAQlAAAAAQUAAAAEYWRkcgkABEwAAAACAgAAAAEuCQAETAAAAAIFAAAAA2tleQkABEwAAAACAgAAAAwgbm90IGRlZmluZWQFAAAAA25pbAIAAAAAAQAAAAxnZXRJbnRPckZhaWwAAAACAAAABGFkZHIAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEYWRkcgUAAAADa2V5CQAEuQAAAAIJAARMAAAAAgIAAAAKbWFuZGF0b3J5IAkABEwAAAACCQAEJQAAAAEFAAAABGFkZHIJAARMAAAAAgIAAAABLgkABEwAAAACBQAAAANrZXkJAARMAAAAAgIAAAAMIG5vdCBkZWZpbmVkBQAAAANuaWwCAAAAAAAAAAAMcG9vbENvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAEdGhpcwkBAAAAC2tleVBvb2xBZGRyAAAAAAAAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAMcG9vbENvbnRyYWN0CQEAAAALa2V5RmFjdENudHIAAAAAAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAFYW10QXMJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAAxwb29sQ29udHJhY3QJAQAAAAtrZXlBbXRBc3NldAAAAAAEAAAAB3ByaWNlQXMJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAAxwb29sQ29udHJhY3QJAQAAAA1rZXlQcmljZUFzc2V0AAAAAAQAAAAIaVByaWNlQXMJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAAB9rZXlNYXBwaW5nc0Jhc2VBc3NldDJpbnRlcm5hbElkAAAAAQUAAAAHcHJpY2VBcwQAAAAGaUFtdEFzCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAAfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAAAAAEFAAAABWFtdEFzCQAEtQAAAAIJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAAA1rZXlQb29sQ29uZmlnAAAAAgkAAaQAAAABBQAAAAZpQW10QXMJAAGkAAAAAQUAAAAIaVByaWNlQXMFAAAAA1NFUAEAAAAQZ2V0RmFjdG9yeUNvbmZpZwAAAAAJAAS1AAAAAgkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAEGtleUZhY3RvcnlDb25maWcAAAAABQAAAANTRVABAAAAFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAAAABAAAAAckbWF0Y2gwCQAEIgAAAAEJAQAAABNrZXlNYW5hZ2VyUHVibGljS2V5AAAAAAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFzBQAAAAckbWF0Y2gwCQACWQAAAAEFAAAAAXMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQFAAAABHVuaXQJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IBAAAAHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAAAAAQAAAAHJG1hdGNoMAkABCIAAAABCQEAAAAaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAJAAJZAAAAAQUAAAABcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAUAAAAEdW5pdAkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgEAAAALbXVzdE1hbmFnZXIAAAABAAAAAWkEAAAAAnBkCQAAAgAAAAECAAAAEVBlcm1pc3Npb24gZGVuaWVkBAAAAAckbWF0Y2gwCQEAAAAWbWFuYWdlclB1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", "chainId": 84, "height": 2057154, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9xnBmiL7RJ7XxqxFHXmAL39vToUm1kNJqdA42FK276cq Next: A5eBjfEsGLxzBn1QCGVMBLzkifw2NxN1CtBPkUNMLKR8 Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let scale8 = 100000000
5-
6-let scale8BigInt = toBigInt(100000000)
7-
8-let scale18 = toBigInt(1000000000000000000)
9-
10-let zeroBigInt = toBigInt(0)
11-
12-let oneBigInt = toBigInt(1)
13-
14-let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
15-
16-let Amult = "100"
17-
18-let Dconv = "1"
19-
204 let SEP = "__"
215
226 let EMPTY = ""
237
24-let PoolActive = 1
25-
26-let PoolPutDis = 2
27-
28-let PoolMatcherDis = 3
29-
30-let PoolShutdown = 4
31-
328 let idxPoolAddress = 1
33-
34-let idxPoolSt = 2
359
3610 let idxLPAsId = 3
3711
3913
4014 let idxPrAsId = 5
4115
42-let idxAmtAsDcm = 6
43-
44-let idxPriceAsDcm = 7
45-
46-let idxIAmtAsId = 8
47-
48-let idxIPriceAsId = 9
49-
5016 let idxFactStakCntr = 1
5117
52-let idxFactSlippCntr = 7
53-
54-let idxFactGwxRewCntr = 10
55-
56-func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
18+func keyFactCntr () = "%s__factoryContract"
5719
5820
59-func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
21+func keyManagerPublicKey () = "%s__managerPublicKey"
6022
6123
62-func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
24+func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
6325
6426
65-func abs (val) = if ((zeroBigInt > val))
66- then -(val)
67- else val
27+func keyPoolAddr () = "%s__poolAddress"
6828
6929
70-func fc () = "%s__factoryContract"
30+func keyAmtAsset () = "%s__amountAsset"
7131
7232
73-func mpk () = "%s__managerPublicKey"
33+func keyPriceAsset () = "%s__priceAsset"
7434
7535
76-func pmpk () = "%s__pendingManagerPublicKey"
36+func keyAdminPubKeys () = "%s__adminPubKeys"
7737
7838
79-func pl () = "%s%s__price__last"
39+func keyAmp () = "%s__amp"
8040
8141
82-func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
42+func keyAmpHistory (height) = ("%s%d__amp__" + toString(height))
8343
8444
85-func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
45+func keyFactoryConfig () = "%s__factoryConfig"
8646
8747
88-func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
48+func keyPoolConfig (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
8949
9050
91-func aa () = "%s__amountAsset"
51+func keyMappingsBaseAsset2internalId (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
9252
9353
94-func pa () = "%s__priceAsset"
54+func getStringOrFail (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
9555
9656
97-func amp () = "%s__amp"
57+func getIntOrFail (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
9858
9959
100-func ada () = "%s__addonAddr"
60+let poolContract = addressFromStringValue(getStringOrFail(this, keyPoolAddr()))
10161
62+let factoryContract = addressFromStringValue(getStringOrFail(poolContract, keyFactCntr()))
10263
103-func fcfg () = "%s__factoryConfig"
104-
105-
106-func mtpk () = "%s%s__matcher__publicKey"
107-
108-
109-func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
110-
111-
112-func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
113-
114-
115-func aps () = "%s__shutdown"
116-
117-
118-func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
119-
120-
121-func str (val) = match val {
122- case valStr: String =>
123- valStr
124- case _ =>
125- throw("fail cast to String")
126-}
127-
128-
129-func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
130-
131-
132-func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
133-
134-
135-let fca = addressFromStringValue(strf(this, fc()))
136-
137-let A = strf(this, amp())
138-
139-func igs () = valueOrElse(getBoolean(fca, aps()), false)
140-
141-
142-func mp () = fromBase58String(strf(fca, mtpk()))
143-
144-
145-func gpc () = {
146- let amtAs = strf(this, aa())
147- let priceAs = strf(this, pa())
148- let iPriceAs = intf(fca, mba(priceAs))
149- let iAmtAs = intf(fca, mba(amtAs))
150- split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
64+func getPoolConfig () = {
65+ let amtAs = getStringOrFail(poolContract, keyAmtAsset())
66+ let priceAs = getStringOrFail(poolContract, keyPriceAsset())
67+ let iPriceAs = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAs))
68+ let iAmtAs = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amtAs))
69+ split(getStringOrFail(factoryContract, keyPoolConfig(toString(iAmtAs), toString(iPriceAs))), SEP)
15170 }
15271
15372
154-func gfc () = split(strf(fca, fcfg()), SEP)
73+func getFactoryConfig () = split(getStringOrFail(factoryContract, keyFactoryConfig()), SEP)
15574
15675
157-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)
158-
159-
160-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)
161-
162-
163-func getAccBalance (assetId) = if ((assetId == "WAVES"))
164- then wavesBalance(this).available
165- else assetBalance(this, fromBase58String(assetId))
166-
167-
168-func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
169-
170-
171-func vad (A1,A2,slippage) = {
172- let diff = fraction((A1 - A2), scale8BigInt, A2)
173- let pass = ((slippage - abs(diff)) > zeroBigInt)
174- if (!(pass))
175- then throw(("Big slpg: " + toString(diff)))
176- else $Tuple2(pass, min([A1, A2]))
177- }
178-
179-
180-func vd (D1,D0,slpg) = {
181- let diff = fraction(D0, scale8BigInt, D1)
182- let fail = (slpg > diff)
183- if (if (fail)
184- then true
185- else (D0 > D1))
186- then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
187- else fail
188- }
189-
190-
191-func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
192- let amtAsAmtX18 = t1(amAmt, amAssetDcm)
193- let prAsAmtX18 = t1(prAmt, prAssetDcm)
194- cpbi(prAsAmtX18, amtAsAmtX18)
195- }
196-
197-
198-func calcPrices (amAmt,prAmt,lpAmt) = {
199- let cfg = gpc()
200- let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
201- let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
202- let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
203- let amAmtX18 = t1(amAmt, amtAsDcm)
204- let prAmtX18 = t1(prAmt, prAsDcm)
205- let lpAmtX18 = t1(lpAmt, scale8)
206- let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
207- let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
208-[priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
209- }
210-
211-
212-func calculatePrices (amAmt,prAmt,lpAmt) = {
213- let p = calcPrices(amAmt, prAmt, lpAmt)
214-[f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
215- }
216-
217-
218-func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
219- let cfg = gpc()
220- let lpId = cfg[idxLPAsId]
221- let amId = cfg[idxAmAsId]
222- let prId = cfg[idxPrAsId]
223- let amDcm = parseIntValue(cfg[idxAmtAsDcm])
224- let prDcm = parseIntValue(cfg[idxPriceAsDcm])
225- let sts = cfg[idxPoolSt]
226- let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
227- if ((lpId != pmtAssetId))
228- then throw("Wrong pmt asset")
229- else {
230- let amBalance = getAccBalance(amId)
231- let amBalanceX18 = t1(amBalance, amDcm)
232- let prBalance = getAccBalance(prId)
233- let prBalanceX18 = t1(prBalance, prDcm)
234- let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
235- let curPrice = f1(curPriceX18, scale8)
236- let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
237- let lpEmissX18 = t1(lpEmiss, scale8)
238- let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
239- let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
240- let outAmAmt = f1(outAmAmtX18, amDcm)
241- let outPrAmt = f1(outPrAmtX18, prDcm)
242- let state = if ((txId58 == ""))
243- then nil
244- else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
245- then unit
246- else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
247- then unit
248- 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)]
249- $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
250- }
251- }
252-
253-
254-func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,pmtAmt,pmtId) = {
255- let cfg = gpc()
256- let lpId = fromBase58String(cfg[idxLPAsId])
257- let amIdStr = cfg[idxAmAsId]
258- let prIdStr = cfg[idxPrAsId]
259- let inAmIdStr = cfg[idxIAmtAsId]
260- let inPrIdStr = cfg[idxIPriceAsId]
261- let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
262- let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
263- let sts = cfg[idxPoolSt]
264- let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
265- let amBalance = if (isEval)
266- then getAccBalance(amIdStr)
267- else if (if (isOneAsset)
268- then (pmtId == amIdStr)
269- else false)
270- then (getAccBalance(amIdStr) - pmtAmt)
271- else if (isOneAsset)
272- then getAccBalance(amIdStr)
273- else (getAccBalance(amIdStr) - inAmAmt)
274- let prBalance = if (isEval)
275- then getAccBalance(prIdStr)
276- else if (if (isOneAsset)
277- then (pmtId == prIdStr)
278- else false)
279- then (getAccBalance(prIdStr) - pmtAmt)
280- else if (isOneAsset)
281- then getAccBalance(prIdStr)
282- else (getAccBalance(prIdStr) - inPrAmt)
283- let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
284- let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
285- let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
286- let amBalanceX18 = t1(amBalance, amtDcm)
287- let prBalanceX18 = t1(prBalance, priceDcm)
288- let r = if ((lpEm == 0))
289- then {
290- let curPriceX18 = zeroBigInt
291- let slippageX18 = zeroBigInt
292- let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
293- $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
294- }
295- else {
296- let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
297- let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
298- let slippageX18 = t1(slippage, scale8)
299- if (if ((curPriceX18 != zeroBigInt))
300- then (slippageRealX18 > slippageX18)
301- else false)
302- then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
303- else {
304- let lpEmissionX18 = t1(lpEm, scale8)
305- let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
306- let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
307- let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
308- then $Tuple2(amViaPrX18, inPrAssetAmtX18)
309- else $Tuple2(inAmAssetAmtX18, prViaAmX18)
310- let expAmtAssetAmtX18 = expectedAmts._1
311- let expPriceAssetAmtX18 = expectedAmts._2
312- let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
313- $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
314- }
315- }
316- let calcLpAmt = r._1
317- let calcAmAssetPmt = r._2
318- let calcPrAssetPmt = r._3
319- let curPrice = f1(r._4, scale8)
320- let slippageCalc = f1(r._5, scale8)
321- if ((0 >= calcLpAmt))
322- then throw("LP <= 0")
323- else {
324- let emitLpAmt = if (!(emitLp))
325- then 0
326- else calcLpAmt
327- let amDiff = (inAmAmt - calcAmAssetPmt)
328- let prDiff = (inPrAmt - calcPrAssetPmt)
329- let $t01529615641 = if (if (isOneAsset)
330- then (pmtId == amIdStr)
331- else false)
332- then $Tuple2(pmtAmt, 0)
333- else if (if (isOneAsset)
334- then (pmtId == prIdStr)
335- else false)
336- then $Tuple2(0, pmtAmt)
337- else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
338- let writeAmAmt = $t01529615641._1
339- let writePrAmt = $t01529615641._2
340- 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))]
341- $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
342- }
343- }
344-
345-
346-func moa (order) = {
347- let cfg = gpc()
348- let amtAsId = cfg[idxAmAsId]
349- let prAsId = cfg[idxPrAsId]
350- let sts = parseIntValue(cfg[idxPoolSt])
351- let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
352- let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
353- let accAmtAsBalance = getAccBalance(amtAsId)
354- let accPrAsBalance = getAccBalance(prAsId)
355- let curPriceX18 = if ((order.orderType == Buy))
356- then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
357- else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
358- let curPrice = f1(curPriceX18, scale8)
359- if (if (if (igs())
360- then true
361- else (sts == PoolMatcherDis))
362- then true
363- else (sts == PoolShutdown))
364- then throw("Admin blocked")
365- else {
366- let orAmtAsset = order.assetPair.amountAsset
367- let orAmtAsStr = if ((orAmtAsset == unit))
368- then "WAVES"
369- else toBase58String(value(orAmtAsset))
370- let orPrAsset = order.assetPair.priceAsset
371- let orPrAsStr = if ((orPrAsset == unit))
372- then "WAVES"
373- else toBase58String(value(orPrAsset))
374- if (if ((orAmtAsStr != amtAsId))
375- then true
376- else (orPrAsStr != prAsId))
377- then throw("Wr assets")
378- else {
379- let orderPrice = order.price
380- let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
381- let castOrderPrice = ts(orderPrice, scale8, priceDcm)
382- let isOrderPriceValid = if ((order.orderType == Buy))
383- then (curPrice >= castOrderPrice)
384- else (castOrderPrice >= curPrice)
385- true
386- }
387- }
388- }
389-
390-
391-func cg (i) = if ((size(i.payments) != 1))
392- then throw("1 pmnt exp")
393- else {
394- let pmt = value(i.payments[0])
395- let pmtAssetId = value(pmt.assetId)
396- let pmtAmt = pmt.amount
397- let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
398- let outAmAmt = r._1
399- let outPrAmt = r._2
400- let sts = parseIntValue(r._9)
401- let state = r._10
402- if (if (igs())
403- then true
404- else (sts == PoolShutdown))
405- then throw(("Admin blocked: " + toString(sts)))
406- else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
407- }
408-
409-
410-func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,pmtAmt,pmtId) = {
411- let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, false, emitLp, isOneAsset, pmtAmt, pmtId)
412- let sts = parseIntValue(r._8)
413- if (if (if (igs())
414- then true
415- else (sts == PoolPutDis))
416- then true
417- else (sts == PoolShutdown))
418- then throw(("Blocked:" + toString(sts)))
419- else r
420- }
421-
422-
423-func m () = match getString(mpk()) {
76+func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
42477 case s: String =>
42578 fromBase58String(s)
42679 case _: Unit =>
43083 }
43184
43285
433-func pm () = match getString(pmpk()) {
86+func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
43487 case s: String =>
43588 fromBase58String(s)
43689 case _: Unit =>
44093 }
44194
44295
443-func mm (i) = {
96+func mustManager (i) = {
44497 let pd = throw("Permission denied")
445- match m() {
98+ match managerPublicKeyOrUnit() {
44699 case pk: ByteVector =>
447100 if ((i.callerPublicKey == pk))
448101 then true
457110 }
458111
459112
113+func getAdmins () = match getString(keyAdminPubKeys()) {
114+ case s: String =>
115+ if ((size(s) == 0))
116+ then nil
117+ else split(s, SEP)
118+ case _ =>
119+ nil
120+}
121+
122+
123+func mustAdmin (i) = if (containsElement(getAdmins(), toBase58String(i.callerPublicKey)))
124+ then true
125+ else mustManager(i)
126+
127+
460128 @Callable(i)
461-func constructor (fc) = {
462- let c = mm(i)
463- if ((c == c))
464- then [StringEntry(fc(), fc)]
129+func constructor (poolAddress) = {
130+ let checkCaller = mustManager(i)
131+ if ((checkCaller == checkCaller))
132+ then [StringEntry(keyPoolAddr(), poolAddress)]
465133 else throw("Strict value is not equal to itself.")
466134 }
467135
469137
470138 @Callable(i)
471139 func setManager (pendingManagerPublicKey) = {
472- let c = mm(i)
473- if ((c == c))
140+ let checkCaller = mustManager(i)
141+ if ((checkCaller == checkCaller))
474142 then {
475- let cm = fromBase58String(pendingManagerPublicKey)
476- if ((cm == cm))
477- then [StringEntry(pmpk(), pendingManagerPublicKey)]
143+ let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
144+ if ((checkManagerPublicKey == checkManagerPublicKey))
145+ then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
478146 else throw("Strict value is not equal to itself.")
479147 }
480148 else throw("Strict value is not equal to itself.")
484152
485153 @Callable(i)
486154 func confirmManager () = {
487- let p = pm()
488- let hpm = if (isDefined(p))
155+ let pm = pendingManagerPublicKeyOrUnit()
156+ let hasPM = if (isDefined(pm))
489157 then true
490158 else throw("No pending manager")
491- if ((hpm == hpm))
159+ if ((hasPM == hasPM))
492160 then {
493- let cpm = if ((i.callerPublicKey == value(p)))
161+ let checkPM = if ((i.callerPublicKey == value(pm)))
494162 then true
495163 else throw("You are not pending manager")
496- if ((cpm == cpm))
497- then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
164+ if ((checkPM == checkPM))
165+ then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
498166 else throw("Strict value is not equal to itself.")
499167 }
500168 else throw("Strict value is not equal to itself.")
503171
504172
505173 @Callable(i)
506-func put (slip,autoStake) = {
507- let factCfg = gfc()
508- let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
509- let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
510- if ((0 > slip))
511- then throw("Wrong slippage")
512- else if ((size(i.payments) != 2))
513- then throw("2 pmnts expd")
514- else {
515- 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, "")
516- let emitLpAmt = e._2
517- let lpAssetId = e._7
518- let state = e._9
519- let amDiff = e._10
520- let prDiff = e._11
521- let amId = e._12
522- let prId = e._13
523- let r = invoke(fca, "emit", [emitLpAmt], nil)
524- if ((r == r))
525- then {
526- let el = match r {
527- case legacy: Address =>
528- invoke(legacy, "emit", [emitLpAmt], nil)
529- case _ =>
530- unit
531- }
532- if ((el == el))
533- then {
534- let sa = if ((amDiff > 0))
535- then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
536- else nil
537- if ((sa == sa))
538- then {
539- let sp = if ((prDiff > 0))
540- then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
541- else nil
542- if ((sp == sp))
543- then {
544- let lpTrnsfr = if (autoStake)
545- then {
546- let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
547- if ((ss == ss))
548- then nil
549- else throw("Strict value is not equal to itself.")
550- }
551- else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
552- (state ++ lpTrnsfr)
553- }
554- else throw("Strict value is not equal to itself.")
555- }
556- else throw("Strict value is not equal to itself.")
557- }
558- else throw("Strict value is not equal to itself.")
559- }
560- else throw("Strict value is not equal to itself.")
561- }
562- }
563-
564-
565-
566-@Callable(i)
567-func putOneTkn (amAssetPart,prAssetPart,outLp,slippage,autoStake) = {
568- let cfg = gfc()
569- let stakingCntr = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wr st addr")
570- let slipCntr = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wr sl addr")
571- let gwxCntr = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wr gwx addr")
572- let poolCfg = gpc()
573- let amId = poolCfg[idxAmAsId]
574- let prId = poolCfg[idxPrAsId]
575- let amDcm = parseIntValue(poolCfg[idxAmtAsDcm])
576- let prDcm = parseIntValue(poolCfg[idxPriceAsDcm])
577- if (if (if (if ((0 >= slippage))
578- then true
579- else (0 >= amAssetPart))
580- then true
581- else (0 >= prAssetPart))
582- then true
583- else (0 >= outLp))
584- then throw("Wrong params")
585- else if ((size(i.payments) != 1))
586- then throw("1 pmnt expd")
587- else {
588- let pmt = value(i.payments[0])
589- let pmtAssetId = toBase58String(value(pmt.assetId))
590- let pmtAmt = pmt.amount
591- if (if (if ((amAssetPart > pmtAmt))
592- then true
593- else (prAssetPart > pmtAmt))
594- then true
595- else (10000000 > pmtAmt))
596- then throw("Wrong pmt amt")
597- else {
598- let amBalance = getAccBalance(amId)
599- let prBalance = getAccBalance(prId)
600- let $t02418924569 = if ((pmtAssetId == amId))
601- then $Tuple6((amBalance - pmtAmt), prBalance, (pmtAmt - amAssetPart), prAssetPart, 0, 0)
602- else if ((pmtAssetId == prId))
603- then $Tuple6(amBalance, (prBalance - pmtAmt), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
604- else throw("wrong pmtAssetId")
605- let amBalanceNow = $t02418924569._1
606- let prBalanceNow = $t02418924569._2
607- let virtSwapInAm = $t02418924569._3
608- let virtSwapOutPr = $t02418924569._4
609- let virtSwapInPr = $t02418924569._5
610- let virtSwapOutAm = $t02418924569._6
611- let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
612- let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
613- let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
614- if ((D0vsD1 == D0vsD1))
615- then {
616- let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), slippage, true, true, pmtAmt, pmtAssetId)
617- let estimLP = estPut._2
618- let lpAssetId = estPut._7
619- let state = estPut._9
620- let amDiff = estPut._10
621- let prDiff = estPut._11
622- let lpCalcRes = vad(toBigInt(estimLP), toBigInt(outLp), toBigInt(slippage))
623- let emitLpAmt = toInt(lpCalcRes._2)
624- let e = invoke(fca, "emit", [emitLpAmt], nil)
625- if ((e == e))
626- then {
627- let el = match e {
628- case legacy: Address =>
629- invoke(legacy, "emit", [emitLpAmt], nil)
630- case _ =>
631- unit
632- }
633- if ((el == el))
634- then {
635- let sa = if ((amDiff > 0))
636- then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
637- else nil
638- if ((sa == sa))
639- then {
640- let sp = if ((prDiff > 0))
641- then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
642- else nil
643- if ((sp == sp))
644- then {
645- let lpTrnsfr = if (autoStake)
646- then {
647- let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
648- if ((ss == ss))
649- then nil
650- else throw("Strict value is not equal to itself.")
651- }
652- else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
653- (state ++ lpTrnsfr)
654- }
655- else throw("Strict value is not equal to itself.")
656- }
657- else throw("Strict value is not equal to itself.")
658- }
659- else throw("Strict value is not equal to itself.")
660- }
661- else throw("Strict value is not equal to itself.")
662- }
663- else throw("Strict value is not equal to itself.")
664- }
665- }
666- }
667-
668-
669-
670-@Callable(i)
671-func putForFree (maxSlpg) = if ((0 > maxSlpg))
672- then throw("Wrong slpg")
673- else if ((size(i.payments) != 2))
674- then throw("2 pmnts expd")
675- else {
676- 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, "")
677- estPut._9
678- }
679-
680-
681-
682-@Callable(i)
683-func get () = {
684- let r = cg(i)
685- let outAmtAmt = r._1
686- let outPrAmt = r._2
687- let pmtAmt = r._3
688- let pmtAssetId = r._4
689- let state = r._5
690- let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
691- if ((b == b))
692- then state
174+func setAdmins (adminPubKeys) = {
175+ let checkCaller = mustManager(i)
176+ if ((checkCaller == checkCaller))
177+ then [StringEntry(keyAdminPubKeys(), makeString(adminPubKeys, SEP))]
693178 else throw("Strict value is not equal to itself.")
694179 }
695180
696181
697182
698183 @Callable(i)
699-func getOneTkn (exchResult,notUsed,outAmount,outAssetId,slippage) = if ((size(i.payments) != 1))
700- then throw("1 pmnt expd")
701- else {
702- let cfg = gpc()
703- let lpId = cfg[idxLPAsId]
704- let amId = cfg[idxAmAsId]
705- let prId = cfg[idxPrAsId]
706- let amDcm = parseIntValue(cfg[idxAmtAsDcm])
707- let prDcm = parseIntValue(cfg[idxPriceAsDcm])
708- let sts = cfg[idxPoolSt]
709- let factCfg = gfc()
710- let gwxCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wr sl addr")
711- let pmt = value(i.payments[0])
712- let addon = valueOrElse(getString(this, ada()), "")
713- let userAddress = if ((addon == toString(i.caller)))
714- then i.originCaller
715- else i.caller
716- let txId58 = toBase58String(i.transactionId)
717- let pmtAssetId = value(pmt.assetId)
718- let pmtAmt = pmt.amount
719- if ((1000000000 > pmtAmt))
720- then throw("Min pmt 10 LP")
721- else if (if (if ((0 > slippage))
722- then true
723- else (0 > exchResult))
724- then true
725- else (0 > outAmount))
726- then throw("Wrong params")
727- else if ((lpId != toBase58String(pmtAssetId)))
728- then throw("Wrong LP")
729- else {
730- let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
731- let estimAmAmt = r._1
732- let estimPrAmt = r._2
733- let amBalance = getAccBalance(amId)
734- let prBalance = getAccBalance(prId)
735- let $t02934829805 = if ((outAssetId == amId))
736- then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
737- else if ((outAssetId == prId))
738- then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
739- else throw("wrong outAssetId")
740- let amBalanceNow = $t02934829805._1
741- let prBalanceNow = $t02934829805._2
742- let virtSwapInAm = $t02934829805._3
743- let virtSwapOutPr = $t02934829805._4
744- let virtSwapInPr = $t02934829805._5
745- let virtSwapOutAm = $t02934829805._6
746- let totalGet = $t02934829805._7
747- if (if ((0 > virtSwapInAm))
748- then true
749- else (0 > virtSwapInPr))
750- then throw("Wrong calc")
751- else {
752- let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
753- let D1 = invoke(gwxCntr, "calcD", [toString(((amBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((prBalanceNow + virtSwapOutPr) - virtSwapInPr)), A, Amult, Dconv], nil)
754- let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
755- if ((D0vsD1 == D0vsD1))
756- then {
757- let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
758- if ((finalRes == finalRes))
759- then {
760- let $t03051030614 = if ((outAssetId == amId))
761- then $Tuple2(toInt(finalRes._2), 0)
762- else $Tuple2(0, toInt(finalRes._2))
763- let outAm = $t03051030614._1
764- let outPr = $t03051030614._2
765- let curPrX18 = cpbi(t1(prBalance, prDcm), t1(amBalance, amDcm))
766- let curPr = f1(curPrX18, scale8)
767- let state = [ScriptTransfer(userAddress, (outAm + outPr), if ((outAssetId == "WAVES"))
768- then unit
769- else fromBase58String(outAssetId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)]
770- if ((state == state))
771- then {
772- let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
773- if ((burn == burn))
774- then state
775- else throw("Strict value is not equal to itself.")
776- }
777- else throw("Strict value is not equal to itself.")
778- }
779- else throw("Strict value is not equal to itself.")
780- }
781- else throw("Strict value is not equal to itself.")
782- }
783- }
784- }
785-
786-
787-
788-@Callable(i)
789-func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
790- let r = cg(i)
791- let outAmAmt = r._1
792- let outPrAmt = r._2
793- let pmtAmt = r._3
794- let pmtAssetId = r._4
795- let state = r._5
796- if ((noLessThenAmtAsset > outAmAmt))
797- then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
798- else if ((noLessThenPriceAsset > outPrAmt))
799- then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
800- else {
801- let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
802- if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
803- then state
804- else throw("Strict value is not equal to itself.")
805- }
806- }
807-
808-
809-
810-@Callable(i)
811-func unstakeAndGet (amount) = {
184+func unstakeAndGetOneTkn (amount,exchResult,notUsed,outAmount,outAssetId,slippage) = {
812185 let checkPayments = if ((size(i.payments) != 0))
813186 then throw("No pmnts expd")
814187 else true
815188 if ((checkPayments == checkPayments))
816189 then {
817- let cfg = gpc()
818- let factoryCfg = gfc()
190+ let cfg = getPoolConfig()
191+ let factoryCfg = getFactoryConfig()
819192 let lpAssetId = fromBase58String(cfg[idxLPAsId])
820193 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
821194 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
822195 if ((unstakeInv == unstakeInv))
823196 then {
824- let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
825- let sts = parseIntValue(r._9)
826- let state = r._10
827- let v = if (if (igs())
828- then true
829- else (sts == PoolShutdown))
830- then throw(("Blocked: " + toString(sts)))
831- else true
832- if ((v == v))
833- then {
834- let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
835- if ((burnA == burnA))
836- then state
837- else throw("Strict value is not equal to itself.")
838- }
197+ let getOneTkn = invoke(poolContract, "getOneTkn", [exchResult, notUsed, outAmount, outAssetId, slippage], [AttachedPayment(lpAssetId, amount)])
198+ if ((getOneTkn == getOneTkn))
199+ then nil
839200 else throw("Strict value is not equal to itself.")
840201 }
841202 else throw("Strict value is not equal to itself.")
846207
847208
848209 @Callable(i)
849-func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
850- then throw("denied")
851- else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
852-
853-
854-
855-@Callable(i)
856-func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
857-
858-
859-
860-@Callable(i)
861-func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
862-
863-
864-
865-@Callable(i)
866-func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
867- let pr = calcPrices(amAmt, prAmt, lpAmt)
868- $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
869- }
870-
871-
872-
873-@Callable(i)
874-func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
875-
876-
877-
878-@Callable(i)
879-func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
880-
881-
882-
883-@Callable(i)
884-func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
885-
886-
887-
888-@Callable(i)
889-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, ""))
890-
891-
892-
893-@Callable(i)
894-func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
895- let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
896- $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
210+func setAmp (amp) = {
211+ let checkCaller = mustAdmin(i)
212+ if ((checkCaller == checkCaller))
213+ then {
214+ let res1 = invoke(poolContract, "setS", [keyAmp(), amp], nil)
215+ let res2 = invoke(poolContract, "setS", [keyAmpHistory(height), amp], nil)
216+ $Tuple2(nil, $Tuple2(res1, res2))
217+ }
218+ else throw("Strict value is not equal to itself.")
897219 }
898220
899221
900222 @Verifier(tx)
901-func verify () = match tx {
902- case order: Order =>
903- let mtchPub = mp()
904- let orV = moa(order)
905- let sndrV = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
906- let mtchV = sigVerify(order.bodyBytes, order.proofs[1], mtchPub)
907- if (if (if (orV)
908- then sndrV
909- else false)
910- then mtchV
911- else false)
912- then true
913- else toe(orV, sndrV, mtchV)
914- case _ =>
915- let targetPublicKey = match m() {
916- case pk: ByteVector =>
917- pk
918- case _: Unit =>
919- tx.senderPublicKey
920- case _ =>
921- throw("Match error")
922- }
923- sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
924-}
223+func verify () = {
224+ let targetPublicKey = match managerPublicKeyOrUnit() {
225+ case pk: ByteVector =>
226+ pk
227+ case _: Unit =>
228+ tx.senderPublicKey
229+ case _ =>
230+ throw("Match error")
231+ }
232+ sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
233+ }
925234
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let scale8 = 100000000
5-
6-let scale8BigInt = toBigInt(100000000)
7-
8-let scale18 = toBigInt(1000000000000000000)
9-
10-let zeroBigInt = toBigInt(0)
11-
12-let oneBigInt = toBigInt(1)
13-
14-let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
15-
16-let Amult = "100"
17-
18-let Dconv = "1"
19-
204 let SEP = "__"
215
226 let EMPTY = ""
237
24-let PoolActive = 1
25-
26-let PoolPutDis = 2
27-
28-let PoolMatcherDis = 3
29-
30-let PoolShutdown = 4
31-
328 let idxPoolAddress = 1
33-
34-let idxPoolSt = 2
359
3610 let idxLPAsId = 3
3711
3812 let idxAmAsId = 4
3913
4014 let idxPrAsId = 5
4115
42-let idxAmtAsDcm = 6
43-
44-let idxPriceAsDcm = 7
45-
46-let idxIAmtAsId = 8
47-
48-let idxIPriceAsId = 9
49-
5016 let idxFactStakCntr = 1
5117
52-let idxFactSlippCntr = 7
53-
54-let idxFactGwxRewCntr = 10
55-
56-func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
18+func keyFactCntr () = "%s__factoryContract"
5719
5820
59-func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
21+func keyManagerPublicKey () = "%s__managerPublicKey"
6022
6123
62-func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
24+func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
6325
6426
65-func abs (val) = if ((zeroBigInt > val))
66- then -(val)
67- else val
27+func keyPoolAddr () = "%s__poolAddress"
6828
6929
70-func fc () = "%s__factoryContract"
30+func keyAmtAsset () = "%s__amountAsset"
7131
7232
73-func mpk () = "%s__managerPublicKey"
33+func keyPriceAsset () = "%s__priceAsset"
7434
7535
76-func pmpk () = "%s__pendingManagerPublicKey"
36+func keyAdminPubKeys () = "%s__adminPubKeys"
7737
7838
79-func pl () = "%s%s__price__last"
39+func keyAmp () = "%s__amp"
8040
8141
82-func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
42+func keyAmpHistory (height) = ("%s%d__amp__" + toString(height))
8343
8444
85-func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
45+func keyFactoryConfig () = "%s__factoryConfig"
8646
8747
88-func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
48+func keyPoolConfig (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
8949
9050
91-func aa () = "%s__amountAsset"
51+func keyMappingsBaseAsset2internalId (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
9252
9353
94-func pa () = "%s__priceAsset"
54+func getStringOrFail (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
9555
9656
97-func amp () = "%s__amp"
57+func getIntOrFail (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
9858
9959
100-func ada () = "%s__addonAddr"
60+let poolContract = addressFromStringValue(getStringOrFail(this, keyPoolAddr()))
10161
62+let factoryContract = addressFromStringValue(getStringOrFail(poolContract, keyFactCntr()))
10263
103-func fcfg () = "%s__factoryConfig"
104-
105-
106-func mtpk () = "%s%s__matcher__publicKey"
107-
108-
109-func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
110-
111-
112-func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
113-
114-
115-func aps () = "%s__shutdown"
116-
117-
118-func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
119-
120-
121-func str (val) = match val {
122- case valStr: String =>
123- valStr
124- case _ =>
125- throw("fail cast to String")
126-}
127-
128-
129-func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
130-
131-
132-func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
133-
134-
135-let fca = addressFromStringValue(strf(this, fc()))
136-
137-let A = strf(this, amp())
138-
139-func igs () = valueOrElse(getBoolean(fca, aps()), false)
140-
141-
142-func mp () = fromBase58String(strf(fca, mtpk()))
143-
144-
145-func gpc () = {
146- let amtAs = strf(this, aa())
147- let priceAs = strf(this, pa())
148- let iPriceAs = intf(fca, mba(priceAs))
149- let iAmtAs = intf(fca, mba(amtAs))
150- split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
64+func getPoolConfig () = {
65+ let amtAs = getStringOrFail(poolContract, keyAmtAsset())
66+ let priceAs = getStringOrFail(poolContract, keyPriceAsset())
67+ let iPriceAs = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAs))
68+ let iAmtAs = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amtAs))
69+ split(getStringOrFail(factoryContract, keyPoolConfig(toString(iAmtAs), toString(iPriceAs))), SEP)
15170 }
15271
15372
154-func gfc () = split(strf(fca, fcfg()), SEP)
73+func getFactoryConfig () = split(getStringOrFail(factoryContract, keyFactoryConfig()), SEP)
15574
15675
157-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)
158-
159-
160-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)
161-
162-
163-func getAccBalance (assetId) = if ((assetId == "WAVES"))
164- then wavesBalance(this).available
165- else assetBalance(this, fromBase58String(assetId))
166-
167-
168-func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
169-
170-
171-func vad (A1,A2,slippage) = {
172- let diff = fraction((A1 - A2), scale8BigInt, A2)
173- let pass = ((slippage - abs(diff)) > zeroBigInt)
174- if (!(pass))
175- then throw(("Big slpg: " + toString(diff)))
176- else $Tuple2(pass, min([A1, A2]))
177- }
178-
179-
180-func vd (D1,D0,slpg) = {
181- let diff = fraction(D0, scale8BigInt, D1)
182- let fail = (slpg > diff)
183- if (if (fail)
184- then true
185- else (D0 > D1))
186- then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
187- else fail
188- }
189-
190-
191-func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
192- let amtAsAmtX18 = t1(amAmt, amAssetDcm)
193- let prAsAmtX18 = t1(prAmt, prAssetDcm)
194- cpbi(prAsAmtX18, amtAsAmtX18)
195- }
196-
197-
198-func calcPrices (amAmt,prAmt,lpAmt) = {
199- let cfg = gpc()
200- let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
201- let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
202- let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
203- let amAmtX18 = t1(amAmt, amtAsDcm)
204- let prAmtX18 = t1(prAmt, prAsDcm)
205- let lpAmtX18 = t1(lpAmt, scale8)
206- let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
207- let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
208-[priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
209- }
210-
211-
212-func calculatePrices (amAmt,prAmt,lpAmt) = {
213- let p = calcPrices(amAmt, prAmt, lpAmt)
214-[f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
215- }
216-
217-
218-func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
219- let cfg = gpc()
220- let lpId = cfg[idxLPAsId]
221- let amId = cfg[idxAmAsId]
222- let prId = cfg[idxPrAsId]
223- let amDcm = parseIntValue(cfg[idxAmtAsDcm])
224- let prDcm = parseIntValue(cfg[idxPriceAsDcm])
225- let sts = cfg[idxPoolSt]
226- let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
227- if ((lpId != pmtAssetId))
228- then throw("Wrong pmt asset")
229- else {
230- let amBalance = getAccBalance(amId)
231- let amBalanceX18 = t1(amBalance, amDcm)
232- let prBalance = getAccBalance(prId)
233- let prBalanceX18 = t1(prBalance, prDcm)
234- let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
235- let curPrice = f1(curPriceX18, scale8)
236- let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
237- let lpEmissX18 = t1(lpEmiss, scale8)
238- let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
239- let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
240- let outAmAmt = f1(outAmAmtX18, amDcm)
241- let outPrAmt = f1(outPrAmtX18, prDcm)
242- let state = if ((txId58 == ""))
243- then nil
244- else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
245- then unit
246- else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
247- then unit
248- 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)]
249- $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
250- }
251- }
252-
253-
254-func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,pmtAmt,pmtId) = {
255- let cfg = gpc()
256- let lpId = fromBase58String(cfg[idxLPAsId])
257- let amIdStr = cfg[idxAmAsId]
258- let prIdStr = cfg[idxPrAsId]
259- let inAmIdStr = cfg[idxIAmtAsId]
260- let inPrIdStr = cfg[idxIPriceAsId]
261- let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
262- let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
263- let sts = cfg[idxPoolSt]
264- let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
265- let amBalance = if (isEval)
266- then getAccBalance(amIdStr)
267- else if (if (isOneAsset)
268- then (pmtId == amIdStr)
269- else false)
270- then (getAccBalance(amIdStr) - pmtAmt)
271- else if (isOneAsset)
272- then getAccBalance(amIdStr)
273- else (getAccBalance(amIdStr) - inAmAmt)
274- let prBalance = if (isEval)
275- then getAccBalance(prIdStr)
276- else if (if (isOneAsset)
277- then (pmtId == prIdStr)
278- else false)
279- then (getAccBalance(prIdStr) - pmtAmt)
280- else if (isOneAsset)
281- then getAccBalance(prIdStr)
282- else (getAccBalance(prIdStr) - inPrAmt)
283- let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
284- let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
285- let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
286- let amBalanceX18 = t1(amBalance, amtDcm)
287- let prBalanceX18 = t1(prBalance, priceDcm)
288- let r = if ((lpEm == 0))
289- then {
290- let curPriceX18 = zeroBigInt
291- let slippageX18 = zeroBigInt
292- let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
293- $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
294- }
295- else {
296- let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
297- let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
298- let slippageX18 = t1(slippage, scale8)
299- if (if ((curPriceX18 != zeroBigInt))
300- then (slippageRealX18 > slippageX18)
301- else false)
302- then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
303- else {
304- let lpEmissionX18 = t1(lpEm, scale8)
305- let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
306- let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
307- let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
308- then $Tuple2(amViaPrX18, inPrAssetAmtX18)
309- else $Tuple2(inAmAssetAmtX18, prViaAmX18)
310- let expAmtAssetAmtX18 = expectedAmts._1
311- let expPriceAssetAmtX18 = expectedAmts._2
312- let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
313- $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
314- }
315- }
316- let calcLpAmt = r._1
317- let calcAmAssetPmt = r._2
318- let calcPrAssetPmt = r._3
319- let curPrice = f1(r._4, scale8)
320- let slippageCalc = f1(r._5, scale8)
321- if ((0 >= calcLpAmt))
322- then throw("LP <= 0")
323- else {
324- let emitLpAmt = if (!(emitLp))
325- then 0
326- else calcLpAmt
327- let amDiff = (inAmAmt - calcAmAssetPmt)
328- let prDiff = (inPrAmt - calcPrAssetPmt)
329- let $t01529615641 = if (if (isOneAsset)
330- then (pmtId == amIdStr)
331- else false)
332- then $Tuple2(pmtAmt, 0)
333- else if (if (isOneAsset)
334- then (pmtId == prIdStr)
335- else false)
336- then $Tuple2(0, pmtAmt)
337- else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
338- let writeAmAmt = $t01529615641._1
339- let writePrAmt = $t01529615641._2
340- 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))]
341- $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
342- }
343- }
344-
345-
346-func moa (order) = {
347- let cfg = gpc()
348- let amtAsId = cfg[idxAmAsId]
349- let prAsId = cfg[idxPrAsId]
350- let sts = parseIntValue(cfg[idxPoolSt])
351- let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
352- let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
353- let accAmtAsBalance = getAccBalance(amtAsId)
354- let accPrAsBalance = getAccBalance(prAsId)
355- let curPriceX18 = if ((order.orderType == Buy))
356- then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
357- else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
358- let curPrice = f1(curPriceX18, scale8)
359- if (if (if (igs())
360- then true
361- else (sts == PoolMatcherDis))
362- then true
363- else (sts == PoolShutdown))
364- then throw("Admin blocked")
365- else {
366- let orAmtAsset = order.assetPair.amountAsset
367- let orAmtAsStr = if ((orAmtAsset == unit))
368- then "WAVES"
369- else toBase58String(value(orAmtAsset))
370- let orPrAsset = order.assetPair.priceAsset
371- let orPrAsStr = if ((orPrAsset == unit))
372- then "WAVES"
373- else toBase58String(value(orPrAsset))
374- if (if ((orAmtAsStr != amtAsId))
375- then true
376- else (orPrAsStr != prAsId))
377- then throw("Wr assets")
378- else {
379- let orderPrice = order.price
380- let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
381- let castOrderPrice = ts(orderPrice, scale8, priceDcm)
382- let isOrderPriceValid = if ((order.orderType == Buy))
383- then (curPrice >= castOrderPrice)
384- else (castOrderPrice >= curPrice)
385- true
386- }
387- }
388- }
389-
390-
391-func cg (i) = if ((size(i.payments) != 1))
392- then throw("1 pmnt exp")
393- else {
394- let pmt = value(i.payments[0])
395- let pmtAssetId = value(pmt.assetId)
396- let pmtAmt = pmt.amount
397- let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
398- let outAmAmt = r._1
399- let outPrAmt = r._2
400- let sts = parseIntValue(r._9)
401- let state = r._10
402- if (if (igs())
403- then true
404- else (sts == PoolShutdown))
405- then throw(("Admin blocked: " + toString(sts)))
406- else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
407- }
408-
409-
410-func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,pmtAmt,pmtId) = {
411- let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, false, emitLp, isOneAsset, pmtAmt, pmtId)
412- let sts = parseIntValue(r._8)
413- if (if (if (igs())
414- then true
415- else (sts == PoolPutDis))
416- then true
417- else (sts == PoolShutdown))
418- then throw(("Blocked:" + toString(sts)))
419- else r
420- }
421-
422-
423-func m () = match getString(mpk()) {
76+func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
42477 case s: String =>
42578 fromBase58String(s)
42679 case _: Unit =>
42780 unit
42881 case _ =>
42982 throw("Match error")
43083 }
43184
43285
433-func pm () = match getString(pmpk()) {
86+func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
43487 case s: String =>
43588 fromBase58String(s)
43689 case _: Unit =>
43790 unit
43891 case _ =>
43992 throw("Match error")
44093 }
44194
44295
443-func mm (i) = {
96+func mustManager (i) = {
44497 let pd = throw("Permission denied")
445- match m() {
98+ match managerPublicKeyOrUnit() {
44699 case pk: ByteVector =>
447100 if ((i.callerPublicKey == pk))
448101 then true
449102 else pd
450103 case _: Unit =>
451104 if ((i.caller == this))
452105 then true
453106 else pd
454107 case _ =>
455108 throw("Match error")
456109 }
457110 }
458111
459112
113+func getAdmins () = match getString(keyAdminPubKeys()) {
114+ case s: String =>
115+ if ((size(s) == 0))
116+ then nil
117+ else split(s, SEP)
118+ case _ =>
119+ nil
120+}
121+
122+
123+func mustAdmin (i) = if (containsElement(getAdmins(), toBase58String(i.callerPublicKey)))
124+ then true
125+ else mustManager(i)
126+
127+
460128 @Callable(i)
461-func constructor (fc) = {
462- let c = mm(i)
463- if ((c == c))
464- then [StringEntry(fc(), fc)]
129+func constructor (poolAddress) = {
130+ let checkCaller = mustManager(i)
131+ if ((checkCaller == checkCaller))
132+ then [StringEntry(keyPoolAddr(), poolAddress)]
465133 else throw("Strict value is not equal to itself.")
466134 }
467135
468136
469137
470138 @Callable(i)
471139 func setManager (pendingManagerPublicKey) = {
472- let c = mm(i)
473- if ((c == c))
140+ let checkCaller = mustManager(i)
141+ if ((checkCaller == checkCaller))
474142 then {
475- let cm = fromBase58String(pendingManagerPublicKey)
476- if ((cm == cm))
477- then [StringEntry(pmpk(), pendingManagerPublicKey)]
143+ let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
144+ if ((checkManagerPublicKey == checkManagerPublicKey))
145+ then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
478146 else throw("Strict value is not equal to itself.")
479147 }
480148 else throw("Strict value is not equal to itself.")
481149 }
482150
483151
484152
485153 @Callable(i)
486154 func confirmManager () = {
487- let p = pm()
488- let hpm = if (isDefined(p))
155+ let pm = pendingManagerPublicKeyOrUnit()
156+ let hasPM = if (isDefined(pm))
489157 then true
490158 else throw("No pending manager")
491- if ((hpm == hpm))
159+ if ((hasPM == hasPM))
492160 then {
493- let cpm = if ((i.callerPublicKey == value(p)))
161+ let checkPM = if ((i.callerPublicKey == value(pm)))
494162 then true
495163 else throw("You are not pending manager")
496- if ((cpm == cpm))
497- then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
164+ if ((checkPM == checkPM))
165+ then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
498166 else throw("Strict value is not equal to itself.")
499167 }
500168 else throw("Strict value is not equal to itself.")
501169 }
502170
503171
504172
505173 @Callable(i)
506-func put (slip,autoStake) = {
507- let factCfg = gfc()
508- let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
509- let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
510- if ((0 > slip))
511- then throw("Wrong slippage")
512- else if ((size(i.payments) != 2))
513- then throw("2 pmnts expd")
514- else {
515- 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, "")
516- let emitLpAmt = e._2
517- let lpAssetId = e._7
518- let state = e._9
519- let amDiff = e._10
520- let prDiff = e._11
521- let amId = e._12
522- let prId = e._13
523- let r = invoke(fca, "emit", [emitLpAmt], nil)
524- if ((r == r))
525- then {
526- let el = match r {
527- case legacy: Address =>
528- invoke(legacy, "emit", [emitLpAmt], nil)
529- case _ =>
530- unit
531- }
532- if ((el == el))
533- then {
534- let sa = if ((amDiff > 0))
535- then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
536- else nil
537- if ((sa == sa))
538- then {
539- let sp = if ((prDiff > 0))
540- then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
541- else nil
542- if ((sp == sp))
543- then {
544- let lpTrnsfr = if (autoStake)
545- then {
546- let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
547- if ((ss == ss))
548- then nil
549- else throw("Strict value is not equal to itself.")
550- }
551- else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
552- (state ++ lpTrnsfr)
553- }
554- else throw("Strict value is not equal to itself.")
555- }
556- else throw("Strict value is not equal to itself.")
557- }
558- else throw("Strict value is not equal to itself.")
559- }
560- else throw("Strict value is not equal to itself.")
561- }
562- }
563-
564-
565-
566-@Callable(i)
567-func putOneTkn (amAssetPart,prAssetPart,outLp,slippage,autoStake) = {
568- let cfg = gfc()
569- let stakingCntr = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wr st addr")
570- let slipCntr = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wr sl addr")
571- let gwxCntr = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wr gwx addr")
572- let poolCfg = gpc()
573- let amId = poolCfg[idxAmAsId]
574- let prId = poolCfg[idxPrAsId]
575- let amDcm = parseIntValue(poolCfg[idxAmtAsDcm])
576- let prDcm = parseIntValue(poolCfg[idxPriceAsDcm])
577- if (if (if (if ((0 >= slippage))
578- then true
579- else (0 >= amAssetPart))
580- then true
581- else (0 >= prAssetPart))
582- then true
583- else (0 >= outLp))
584- then throw("Wrong params")
585- else if ((size(i.payments) != 1))
586- then throw("1 pmnt expd")
587- else {
588- let pmt = value(i.payments[0])
589- let pmtAssetId = toBase58String(value(pmt.assetId))
590- let pmtAmt = pmt.amount
591- if (if (if ((amAssetPart > pmtAmt))
592- then true
593- else (prAssetPart > pmtAmt))
594- then true
595- else (10000000 > pmtAmt))
596- then throw("Wrong pmt amt")
597- else {
598- let amBalance = getAccBalance(amId)
599- let prBalance = getAccBalance(prId)
600- let $t02418924569 = if ((pmtAssetId == amId))
601- then $Tuple6((amBalance - pmtAmt), prBalance, (pmtAmt - amAssetPart), prAssetPart, 0, 0)
602- else if ((pmtAssetId == prId))
603- then $Tuple6(amBalance, (prBalance - pmtAmt), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
604- else throw("wrong pmtAssetId")
605- let amBalanceNow = $t02418924569._1
606- let prBalanceNow = $t02418924569._2
607- let virtSwapInAm = $t02418924569._3
608- let virtSwapOutPr = $t02418924569._4
609- let virtSwapInPr = $t02418924569._5
610- let virtSwapOutAm = $t02418924569._6
611- let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
612- let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
613- let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
614- if ((D0vsD1 == D0vsD1))
615- then {
616- let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), slippage, true, true, pmtAmt, pmtAssetId)
617- let estimLP = estPut._2
618- let lpAssetId = estPut._7
619- let state = estPut._9
620- let amDiff = estPut._10
621- let prDiff = estPut._11
622- let lpCalcRes = vad(toBigInt(estimLP), toBigInt(outLp), toBigInt(slippage))
623- let emitLpAmt = toInt(lpCalcRes._2)
624- let e = invoke(fca, "emit", [emitLpAmt], nil)
625- if ((e == e))
626- then {
627- let el = match e {
628- case legacy: Address =>
629- invoke(legacy, "emit", [emitLpAmt], nil)
630- case _ =>
631- unit
632- }
633- if ((el == el))
634- then {
635- let sa = if ((amDiff > 0))
636- then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
637- else nil
638- if ((sa == sa))
639- then {
640- let sp = if ((prDiff > 0))
641- then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
642- else nil
643- if ((sp == sp))
644- then {
645- let lpTrnsfr = if (autoStake)
646- then {
647- let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
648- if ((ss == ss))
649- then nil
650- else throw("Strict value is not equal to itself.")
651- }
652- else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
653- (state ++ lpTrnsfr)
654- }
655- else throw("Strict value is not equal to itself.")
656- }
657- else throw("Strict value is not equal to itself.")
658- }
659- else throw("Strict value is not equal to itself.")
660- }
661- else throw("Strict value is not equal to itself.")
662- }
663- else throw("Strict value is not equal to itself.")
664- }
665- }
666- }
667-
668-
669-
670-@Callable(i)
671-func putForFree (maxSlpg) = if ((0 > maxSlpg))
672- then throw("Wrong slpg")
673- else if ((size(i.payments) != 2))
674- then throw("2 pmnts expd")
675- else {
676- 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, "")
677- estPut._9
678- }
679-
680-
681-
682-@Callable(i)
683-func get () = {
684- let r = cg(i)
685- let outAmtAmt = r._1
686- let outPrAmt = r._2
687- let pmtAmt = r._3
688- let pmtAssetId = r._4
689- let state = r._5
690- let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
691- if ((b == b))
692- then state
174+func setAdmins (adminPubKeys) = {
175+ let checkCaller = mustManager(i)
176+ if ((checkCaller == checkCaller))
177+ then [StringEntry(keyAdminPubKeys(), makeString(adminPubKeys, SEP))]
693178 else throw("Strict value is not equal to itself.")
694179 }
695180
696181
697182
698183 @Callable(i)
699-func getOneTkn (exchResult,notUsed,outAmount,outAssetId,slippage) = if ((size(i.payments) != 1))
700- then throw("1 pmnt expd")
701- else {
702- let cfg = gpc()
703- let lpId = cfg[idxLPAsId]
704- let amId = cfg[idxAmAsId]
705- let prId = cfg[idxPrAsId]
706- let amDcm = parseIntValue(cfg[idxAmtAsDcm])
707- let prDcm = parseIntValue(cfg[idxPriceAsDcm])
708- let sts = cfg[idxPoolSt]
709- let factCfg = gfc()
710- let gwxCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wr sl addr")
711- let pmt = value(i.payments[0])
712- let addon = valueOrElse(getString(this, ada()), "")
713- let userAddress = if ((addon == toString(i.caller)))
714- then i.originCaller
715- else i.caller
716- let txId58 = toBase58String(i.transactionId)
717- let pmtAssetId = value(pmt.assetId)
718- let pmtAmt = pmt.amount
719- if ((1000000000 > pmtAmt))
720- then throw("Min pmt 10 LP")
721- else if (if (if ((0 > slippage))
722- then true
723- else (0 > exchResult))
724- then true
725- else (0 > outAmount))
726- then throw("Wrong params")
727- else if ((lpId != toBase58String(pmtAssetId)))
728- then throw("Wrong LP")
729- else {
730- let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
731- let estimAmAmt = r._1
732- let estimPrAmt = r._2
733- let amBalance = getAccBalance(amId)
734- let prBalance = getAccBalance(prId)
735- let $t02934829805 = if ((outAssetId == amId))
736- then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
737- else if ((outAssetId == prId))
738- then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
739- else throw("wrong outAssetId")
740- let amBalanceNow = $t02934829805._1
741- let prBalanceNow = $t02934829805._2
742- let virtSwapInAm = $t02934829805._3
743- let virtSwapOutPr = $t02934829805._4
744- let virtSwapInPr = $t02934829805._5
745- let virtSwapOutAm = $t02934829805._6
746- let totalGet = $t02934829805._7
747- if (if ((0 > virtSwapInAm))
748- then true
749- else (0 > virtSwapInPr))
750- then throw("Wrong calc")
751- else {
752- let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
753- let D1 = invoke(gwxCntr, "calcD", [toString(((amBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((prBalanceNow + virtSwapOutPr) - virtSwapInPr)), A, Amult, Dconv], nil)
754- let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
755- if ((D0vsD1 == D0vsD1))
756- then {
757- let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
758- if ((finalRes == finalRes))
759- then {
760- let $t03051030614 = if ((outAssetId == amId))
761- then $Tuple2(toInt(finalRes._2), 0)
762- else $Tuple2(0, toInt(finalRes._2))
763- let outAm = $t03051030614._1
764- let outPr = $t03051030614._2
765- let curPrX18 = cpbi(t1(prBalance, prDcm), t1(amBalance, amDcm))
766- let curPr = f1(curPrX18, scale8)
767- let state = [ScriptTransfer(userAddress, (outAm + outPr), if ((outAssetId == "WAVES"))
768- then unit
769- else fromBase58String(outAssetId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)]
770- if ((state == state))
771- then {
772- let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
773- if ((burn == burn))
774- then state
775- else throw("Strict value is not equal to itself.")
776- }
777- else throw("Strict value is not equal to itself.")
778- }
779- else throw("Strict value is not equal to itself.")
780- }
781- else throw("Strict value is not equal to itself.")
782- }
783- }
784- }
785-
786-
787-
788-@Callable(i)
789-func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
790- let r = cg(i)
791- let outAmAmt = r._1
792- let outPrAmt = r._2
793- let pmtAmt = r._3
794- let pmtAssetId = r._4
795- let state = r._5
796- if ((noLessThenAmtAsset > outAmAmt))
797- then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
798- else if ((noLessThenPriceAsset > outPrAmt))
799- then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
800- else {
801- let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
802- if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
803- then state
804- else throw("Strict value is not equal to itself.")
805- }
806- }
807-
808-
809-
810-@Callable(i)
811-func unstakeAndGet (amount) = {
184+func unstakeAndGetOneTkn (amount,exchResult,notUsed,outAmount,outAssetId,slippage) = {
812185 let checkPayments = if ((size(i.payments) != 0))
813186 then throw("No pmnts expd")
814187 else true
815188 if ((checkPayments == checkPayments))
816189 then {
817- let cfg = gpc()
818- let factoryCfg = gfc()
190+ let cfg = getPoolConfig()
191+ let factoryCfg = getFactoryConfig()
819192 let lpAssetId = fromBase58String(cfg[idxLPAsId])
820193 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
821194 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
822195 if ((unstakeInv == unstakeInv))
823196 then {
824- let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
825- let sts = parseIntValue(r._9)
826- let state = r._10
827- let v = if (if (igs())
828- then true
829- else (sts == PoolShutdown))
830- then throw(("Blocked: " + toString(sts)))
831- else true
832- if ((v == v))
833- then {
834- let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
835- if ((burnA == burnA))
836- then state
837- else throw("Strict value is not equal to itself.")
838- }
197+ let getOneTkn = invoke(poolContract, "getOneTkn", [exchResult, notUsed, outAmount, outAssetId, slippage], [AttachedPayment(lpAssetId, amount)])
198+ if ((getOneTkn == getOneTkn))
199+ then nil
839200 else throw("Strict value is not equal to itself.")
840201 }
841202 else throw("Strict value is not equal to itself.")
842203 }
843204 else throw("Strict value is not equal to itself.")
844205 }
845206
846207
847208
848209 @Callable(i)
849-func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
850- then throw("denied")
851- else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
852-
853-
854-
855-@Callable(i)
856-func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
857-
858-
859-
860-@Callable(i)
861-func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
862-
863-
864-
865-@Callable(i)
866-func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
867- let pr = calcPrices(amAmt, prAmt, lpAmt)
868- $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
869- }
870-
871-
872-
873-@Callable(i)
874-func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
875-
876-
877-
878-@Callable(i)
879-func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
880-
881-
882-
883-@Callable(i)
884-func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
885-
886-
887-
888-@Callable(i)
889-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, ""))
890-
891-
892-
893-@Callable(i)
894-func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
895- let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
896- $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
210+func setAmp (amp) = {
211+ let checkCaller = mustAdmin(i)
212+ if ((checkCaller == checkCaller))
213+ then {
214+ let res1 = invoke(poolContract, "setS", [keyAmp(), amp], nil)
215+ let res2 = invoke(poolContract, "setS", [keyAmpHistory(height), amp], nil)
216+ $Tuple2(nil, $Tuple2(res1, res2))
217+ }
218+ else throw("Strict value is not equal to itself.")
897219 }
898220
899221
900222 @Verifier(tx)
901-func verify () = match tx {
902- case order: Order =>
903- let mtchPub = mp()
904- let orV = moa(order)
905- let sndrV = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
906- let mtchV = sigVerify(order.bodyBytes, order.proofs[1], mtchPub)
907- if (if (if (orV)
908- then sndrV
909- else false)
910- then mtchV
911- else false)
912- then true
913- else toe(orV, sndrV, mtchV)
914- case _ =>
915- let targetPublicKey = match m() {
916- case pk: ByteVector =>
917- pk
918- case _: Unit =>
919- tx.senderPublicKey
920- case _ =>
921- throw("Match error")
922- }
923- sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
924-}
223+func verify () = {
224+ let targetPublicKey = match managerPublicKeyOrUnit() {
225+ case pk: ByteVector =>
226+ pk
227+ case _: Unit =>
228+ tx.senderPublicKey
229+ case _ =>
230+ throw("Match error")
231+ }
232+ sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
233+ }
925234

github/deemru/w8io/c3f4982 
82.11 ms