tx · 3S7a66gHMc95XgjiCqyndCifrkTVtji8VmGd5UiUoPwR

3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT:  -0.03900000 Waves

2022.08.26 09:13 [2201068] smart account 3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT > SELF 0.00000000 Waves

{ "type": 13, "id": "3S7a66gHMc95XgjiCqyndCifrkTVtji8VmGd5UiUoPwR", "fee": 3900000, "feeAssetId": null, "timestamp": 1661494366888, "version": 2, "chainId": 84, "sender": "3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT", "senderPublicKey": "D1BL65meykxFZTCuq7jq9HSGLLnWvQamQPUNrguW5w39", "proofs": [ "5uA5vJyzpTU78adfRcNwaFuiuHLUmf6shWgMWtJxVzGMhpQ8txSD7HvJ8beZXiDUfAg3J8eTmpvDUjySQ8i6HN2o" ], "script": "base64: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CWlkeFBvb2xTdAQAAAAEbHBFbQgJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAARscElkAgAAAAhXciBscCBhcwAAAAhxdWFudGl0eQQAAAAJYW1CYWxhbmNlAwUAAAAGaXNFdmFsCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAAB2FtSWRTdHIDAwUAAAAKaXNPbmVBc3NldAkAAAAAAAACBQAAAAVwbXRJZAUAAAAHYW1JZFN0cgcJAABlAAAAAgkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAdhbUlkU3RyBQAAAAZwbXRBbXQDBQAAAAppc09uZUFzc2V0CQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAAB2FtSWRTdHIJAABlAAAAAgkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAdhbUlkU3RyBQAAAAdpbkFtQW10BAAAAAlwckJhbGFuY2UDBQAAAAZpc0V2YWwJAQAAAA1nZXRBY2NCYWxhbmNlAAAAAQUAAAAHcHJJZFN0cgMDBQAAAAppc09uZUFzc2V0CQAAAAAAAAIFAAAABXBtdElkBQAAAAdwcklkU3RyBwkAAGUAAAACCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAAB3BySWRTdHIFAAAABnBtdEFtdAMFAAAACmlzT25lQXNzZXQJAQAAAA1nZXRBY2NCYWxhbmNlAAAAAQUAAAAHcHJJZFN0cgkAAGUAAAACCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAAB3BySWRTdHIFAAAAB2luUHJBbXQEAAAAD2luQW1Bc3NldEFtdFgxOAkBAAAAAnQxAAAAAgUAAAAHaW5BbUFtdAUAAAAGYW10RGNtBAAAAA9pblByQXNzZXRBbXRYMTgJAQAAAAJ0MQAAAAIFAAAAB2luUHJBbXQFAAAACHByaWNlRGNtBAAAAAx1c2VyUHJpY2VYMTgJAQAAAARjcGJpAAAAAgUAAAAPaW5QckFzc2V0QW10WDE4BQAAAA9pbkFtQXNzZXRBbXRYMTgEAAAADGFtQmFsYW5jZVgxOAkBAAAAAnQxAAAAAgUAAAAJYW1CYWxhbmNlBQAAAAZhbXREY20EAAAADHByQmFsYW5jZVgxOAkBAAAAAnQxAAAAAgUAAAAJcHJCYWxhbmNlBQAAAAhwcmljZURjbQQAAAABcgMJAAAAAAAAAgUAAAAEbHBFbQAAAAAAAAAAAAQAAAALY3VyUHJpY2VYMTgFAAAACnplcm9CaWdJbnQEAAAAC3NsaXBwYWdlWDE4BQAAAAp6ZXJvQmlnSW50BAAAAAhscEFtdFgxOAkAAHYAAAAGCQABOQAAAAIFAAAAD2luQW1Bc3NldEFtdFgxOAUAAAAPaW5QckFzc2V0QW10WDE4AAAAAAAAAAAACQABNgAAAAEAAAAAAAAAAAUAAAAAAAAAAAEAAAAAAAAAAAAFAAAABERPV04JAAUXAAAABQkBAAAAAmYxAAAAAgUAAAAIbHBBbXRYMTgFAAAABnNjYWxlOAkBAAAAAmYxAAAAAgUAAAAPaW5BbUFzc2V0QW10WDE4BQAAAAZhbXREY20JAQAAAAJmMQAAAAIFAAAAD2luUHJBc3NldEFtdFgxOAUAAAAIcHJpY2VEY20JAQAAAARjcGJpAAAAAgkAATcAAAACBQAAAAxwckJhbGFuY2VYMTgFAAAAD2luUHJBc3NldEFtdFgxOAkAATcAAAACBQAAAAxhbUJhbGFuY2VYMTgFAAAAD2luQW1Bc3NldEFtdFgxOAUAAAALc2xpcHBhZ2VYMTgEAAAAC2N1clByaWNlWDE4CQEAAAAEY3BiaQAAAAIFAAAADHByQmFsYW5jZVgxOAUAAAAMYW1CYWxhbmNlWDE4BAAAAA9zbGlwcGFnZVJlYWxYMTgJAAE8AAAAAwkBAAAAA2FicwAAAAEJAAE4AAAAAgUAAAALY3VyUHJpY2VYMTgFAAAADHVzZXJQcmljZVgxOAUAAAAHc2NhbGUxOAUAAAALY3VyUHJpY2VYMTgEAAAAC3NsaXBwYWdlWDE4CQEAAAACdDEAAAACBQAAAAhzbGlwcGFnZQUAAAAGc2NhbGU4AwMJAQAAAAIhPQAAAAIFAAAAC2N1clByaWNlWDE4BQAAAAp6ZXJvQmlnSW50CQABPwAAAAIFAAAAD3NsaXBwYWdlUmVhbFgxOAUAAAALc2xpcHBhZ2VYMTgHCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAD1ByaWNlIHNsaXBwYWdlIAkAAaYAAAABBQAAAA9zbGlwcGFnZVJlYWxYMTgCAAAAAyA+IAkAAaYAAAABBQAAAAtzbGlwcGFnZVgxOAQAAAANbHBFbWlzc2lvblgxOAkBAAAAAnQxAAAAAgUAAAAEbHBFbQUAAAAGc2NhbGU4BAAAAApwclZpYUFtWDE4CQABPAAAAAMFAAAAD2luQW1Bc3NldEFtdFgxOAUAAAALY3VyUHJpY2VYMTgFAAAAB3NjYWxlMTgEAAAACmFtVmlhUHJYMTgJAAE8AAAAAwUAAAAPaW5QckFzc2V0QW10WDE4BQAAAAdzY2FsZTE4BQAAAAtjdXJQcmljZVgxOAQAAAAMZXhwZWN0ZWRBbXRzAwkAAT8AAAACBQAAAApwclZpYUFtWDE4BQAAAA9pblByQXNzZXRBbXRYMTgJAAUUAAAAAgUAAAAKYW1WaWFQclgxOAUAAAAPaW5QckFzc2V0QW10WDE4CQAFFAAAAAIFAAAAD2luQW1Bc3NldEFtdFgxOAUAAAAKcHJWaWFBbVgxOAQAAAARZXhwQW10QXNzZXRBbXRYMTgIBQAAAAxleHBlY3RlZEFtdHMAAAACXzEEAAAAE2V4cFByaWNlQXNzZXRBbXRYMTgIBQAAAAxleHBlY3RlZEFtdHMAAAACXzIEAAAACGxwQW10WDE4CQABPAAAAAMFAAAADWxwRW1pc3Npb25YMTgFAAAAE2V4cFByaWNlQXNzZXRBbXRYMTgFAAAADHByQmFsYW5jZVgxOAkABRcAAAAFCQEAAAACZjEAAAACBQAAAAhscEFtdFgxOAUAAAAGc2NhbGU4CQEAAAACZjEAAAACBQAAABFleHBBbXRBc3NldEFtdFgxOAUAAAAGYW10RGNtCQEAAAACZjEAAAACBQAAABNleHBQcmljZUFzc2V0QW10WDE4BQAAAAhwcmljZURjbQUAAAALY3VyUHJpY2VYMTgFAAAAC3NsaXBwYWdlWDE4BAAAAAljYWxjTHBBbXQIBQAAAAFyAAAAAl8xBAAAAA5jYWxjQW1Bc3NldFBtdAgFAAAAAXIAAAACXzIEAAAADmNhbGNQckFzc2V0UG10CAUAAAABcgAAAAJfMwQAAAAIY3VyUHJpY2UJAQAAAAJmMQAAAAIIBQAAAAFyAAAAAl80BQAAAAZzY2FsZTgEAAAADHNsaXBwYWdlQ2FsYwkBAAAAAmYxAAAAAggFAAAAAXIAAAACXzUFAAAABnNjYWxlOAMJAABn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", "height": 2201068, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3mwKumGKisGWyxtVDZg4q1v8k8LAcPRuRz3GCnRobm4y Next: rz7pRE9Zk4eegS13bndjGGCWpuEZ23xmgthC1dh3gK5 Diff:
OldNewDifferences
66 let scale8BigInt = toBigInt(100000000)
77
88 let scale18 = toBigInt(1000000000000000000)
9+
10+let thousand = 1000
911
1012 let zeroBigInt = toBigInt(0)
1113
5355
5456 let idxFactGwxRewCntr = 10
5557
56-let delay = "%s__delay"
58+let feePermilleDefault = 0
5759
5860 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
5961
102104 func ada () = "%s__addonAddr"
103105
104106
105-func lgotc (caller) = makeString(["%s%s__lastGetOneTknCall", caller], SEP)
107+let keyFeePermille = "%s__feePermille"
106108
107-
108-func lsotc (caller) = makeString(["%s%s__lastPutOneTknCall", caller], SEP)
109-
109+let feePermille = valueOrElse(getInteger(this, keyFeePermille), feePermilleDefault)
110110
111111 func fcfg () = "%s__factoryConfig"
112112
149149
150150 func mp () = fromBase58String(strf(fca, mtpk()))
151151
152+
153+let matcherAddress = addressFromPublicKey(mp())
152154
153155 func gpc () = {
154156 let amtAs = strf(this, aa())
334336 else calcLpAmt
335337 let amDiff = (inAmAmt - calcAmAssetPmt)
336338 let prDiff = (inPrAmt - calcPrAssetPmt)
337- let $t01553115876 = if (if (isOneAsset)
339+ let $t01551715862 = if (if (isOneAsset)
338340 then (pmtId == amIdStr)
339341 else false)
340342 then $Tuple2(pmtAmt, 0)
343345 else false)
344346 then $Tuple2(0, pmtAmt)
345347 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
346- let writeAmAmt = $t01553115876._1
347- let writePrAmt = $t01553115876._2
348+ let writeAmAmt = $t01551715862._1
349+ let writePrAmt = $t01551715862._2
348350 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))]
349351 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
350352 }
425427 else (sts == PoolShutdown))
426428 then throw(("Blocked:" + toString(sts)))
427429 else r
430+ }
431+
432+
433+func takeFee (amount) = {
434+ let fee = fraction(amount, feePermille, thousand)
435+ $Tuple2((amount - fee), fee)
428436 }
429437
430438
585593 let userAddress = if ((addon == toString(i.caller)))
586594 then i.originCaller
587595 else i.caller
588- let addonContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(ada()), "no addons")), "addon address in not valid")
589- let check = reentrantInvoke(addonContract, "ensureCanPutOneTkn", [toString(userAddress)], nil)
590- if ((check == check))
591- then if (if (if (if ((0 >= slippage))
592- then true
593- else (0 >= amAssetPart))
594- then true
595- else (0 >= prAssetPart))
596- then true
597- else (0 >= outLp))
598- then throw("Wrong params")
599- else if ((size(i.payments) != 1))
600- then throw("1 pmnt expd")
601- else {
602- let pmt = value(i.payments[0])
603- let pmtAssetId = toBase58String(value(pmt.assetId))
604- let pmtAmt = pmt.amount
605- if ((10000000 > pmtAmt))
606- then throw("Wrong pmt amt")
607- else {
608- let amBalance = getAccBalance(amId)
609- let prBalance = getAccBalance(prId)
610- let $t02478925365 = if ((pmtAssetId == amId))
611- then if (if ((pmtAmt > amBalance))
596+ if (if (if (if ((0 >= slippage))
597+ then true
598+ else (0 >= amAssetPart))
599+ then true
600+ else (0 >= prAssetPart))
601+ then true
602+ else (0 >= outLp))
603+ then throw("Wrong params")
604+ else if ((size(i.payments) != 1))
605+ then throw("1 pmnt expd")
606+ else {
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 ((10000000 > pmtAmt))
614+ then throw("Wrong pmt amt")
615+ else {
616+ let amBalance = getAccBalance(amId)
617+ let prBalance = getAccBalance(prId)
618+ let $t02468125257 = if ((pmtAssetId == amId))
619+ then if (if ((pmtAmt > amBalance))
620+ then true
621+ else (amAssetPart > pmtAmt))
622+ then throw("invalid payment amount")
623+ else $Tuple6((amBalance - pmtAmt), prBalance, (pmtAmt - amAssetPart), prAssetPart, 0, 0)
624+ else if ((pmtAssetId == prId))
625+ then if (if ((pmtAmt > prBalance))
612626 then true
613- else (amAssetPart > pmtAmt))
627+ else (prAssetPart > pmtAmt))
614628 then throw("invalid payment amount")
615- else $Tuple6((amBalance - pmtAmt), prBalance, (pmtAmt - amAssetPart), prAssetPart, 0, 0)
616- else if ((pmtAssetId == prId))
617- then if (if ((pmtAmt > prBalance))
618- then true
619- else (prAssetPart > pmtAmt))
620- then throw("invalid payment amount")
621- else $Tuple6(amBalance, (prBalance - pmtAmt), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
622- else throw("wrong pmtAssetId")
623- let amBalanceNow = $t02478925365._1
624- let prBalanceNow = $t02478925365._2
625- let virtSwapInAm = $t02478925365._3
626- let virtSwapOutPr = $t02478925365._4
627- let virtSwapInPr = $t02478925365._5
628- let virtSwapOutAm = $t02478925365._6
629- let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
630- let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
631- let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
632- if ((D0vsD1 == D0vsD1))
633- then {
634- let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), slippage, true, true, pmtAmt, pmtAssetId)
635- let estimLP = estPut._2
636- let lpAssetId = estPut._7
637- let state = estPut._9
638- let amDiff = estPut._10
639- let prDiff = estPut._11
640- let lpCalcRes = vad(toBigInt(estimLP), toBigInt(outLp), toBigInt(slippage))
641- let emitLpAmt = toInt(lpCalcRes._2)
642- let e = invoke(fca, "emit", [emitLpAmt], nil)
643- if ((e == e))
644- then {
645- let el = match e {
646- case legacy: Address =>
647- invoke(legacy, "emit", [emitLpAmt], nil)
648- case _ =>
649- unit
650- }
651- if ((el == el))
652- then {
653- let sa = if ((amDiff > 0))
654- then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
655- else nil
656- if ((sa == sa))
657- then {
658- let sp = if ((prDiff > 0))
659- then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
660- else nil
661- if ((sp == sp))
662- then {
663- let lpTrnsfr = if (autoStake)
664- then {
665- let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
666- if ((ss == ss))
667- then nil
668- else throw("Strict value is not equal to itself.")
669- }
670- else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
671- (state ++ lpTrnsfr)
672- }
673- else throw("Strict value is not equal to itself.")
674- }
675- else throw("Strict value is not equal to itself.")
676- }
677- else throw("Strict value is not equal to itself.")
678- }
679- else throw("Strict value is not equal to itself.")
680- }
681- else throw("Strict value is not equal to itself.")
682- }
683- }
684- else throw("Strict value is not equal to itself.")
629+ else $Tuple6(amBalance, (prBalance - pmtAmt), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
630+ else throw("wrong pmtAssetId")
631+ let amBalanceNow = $t02468125257._1
632+ let prBalanceNow = $t02468125257._2
633+ let virtSwapInAm = $t02468125257._3
634+ let virtSwapOutPr = $t02468125257._4
635+ let virtSwapInPr = $t02468125257._5
636+ let virtSwapOutAm = $t02468125257._6
637+ let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
638+ let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
639+ let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
640+ if ((D0vsD1 == D0vsD1))
641+ then {
642+ let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), slippage, true, true, pmtAmt, pmtAssetId)
643+ let estimLP = estPut._2
644+ let lpAssetId = estPut._7
645+ let state = estPut._9
646+ let amDiff = estPut._10
647+ let prDiff = estPut._11
648+ let lpCalcRes = vad(toBigInt(estimLP), toBigInt(outLp), toBigInt(slippage))
649+ let emitLpAmt = toInt(lpCalcRes._2)
650+ let e = invoke(fca, "emit", [emitLpAmt], nil)
651+ if ((e == e))
652+ then {
653+ let el = match e {
654+ case legacy: Address =>
655+ invoke(legacy, "emit", [emitLpAmt], nil)
656+ case _ =>
657+ unit
658+ }
659+ if ((el == el))
660+ then {
661+ let sa = if ((amDiff > 0))
662+ then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
663+ else nil
664+ if ((sa == sa))
665+ then {
666+ let sp = if ((prDiff > 0))
667+ then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
668+ else nil
669+ if ((sp == sp))
670+ then {
671+ let lpTrnsfr = if (autoStake)
672+ then {
673+ let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
674+ if ((ss == ss))
675+ then nil
676+ else throw("Strict value is not equal to itself.")
677+ }
678+ else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
679+ let sendFeeToMatcher = if ((feeAmount > 0))
680+ then [ScriptTransfer(matcherAddress, feeAmount, fromBase58String(pmtAssetId))]
681+ else nil
682+ ((state ++ lpTrnsfr) ++ sendFeeToMatcher)
683+ }
684+ else throw("Strict value is not equal to itself.")
685+ }
686+ else throw("Strict value is not equal to itself.")
687+ }
688+ else throw("Strict value is not equal to itself.")
689+ }
690+ else throw("Strict value is not equal to itself.")
691+ }
692+ else throw("Strict value is not equal to itself.")
693+ }
694+ }
685695 }
686696
687697
735745 let txId58 = toBase58String(i.transactionId)
736746 let pmtAssetId = value(pmt.assetId)
737747 let pmtAmt = pmt.amount
738- let addonContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(ada()), "no addons")), "addon address in not valid")
739- let check = reentrantInvoke(addonContract, "ensureCanGetOneTkn", [toString(userAddress)], nil)
740- if ((check == check))
741- then if ((1000000000 > pmtAmt))
742- then throw("Min pmt 10 LP")
743- else if (if (if ((0 > slippage))
744- then true
745- else (0 > exchResult))
746- then true
747- else (0 > outAmount))
748- then throw("Wrong params")
749- else if ((lpId != toBase58String(pmtAssetId)))
750- then throw("Wrong LP")
751- else {
752- let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
753- let estimAmAmt = r._1
754- let estimPrAmt = r._2
755- let amBalance = getAccBalance(amId)
756- let prBalance = getAccBalance(prId)
757- let $t03039630853 = if ((outAssetId == amId))
758- then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
759- else if ((outAssetId == prId))
760- then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
761- else throw("wrong outAssetId")
762- let amBalanceNow = $t03039630853._1
763- let prBalanceNow = $t03039630853._2
764- let virtSwapInAm = $t03039630853._3
765- let virtSwapOutPr = $t03039630853._4
766- let virtSwapInPr = $t03039630853._5
767- let virtSwapOutAm = $t03039630853._6
768- let totalGet = $t03039630853._7
769- if (if ((0 > virtSwapInAm))
770- then true
771- else (0 > virtSwapInPr))
772- then throw("Wrong calc")
773- else {
774- let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
775- let D1 = invoke(gwxCntr, "calcD", [toString(((amBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((prBalanceNow + virtSwapOutPr) - virtSwapInPr)), A, Amult, Dconv], nil)
776- let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
777- if ((D0vsD1 == D0vsD1))
778- then {
779- let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
780- if ((finalRes == finalRes))
781- then {
782- let $t03155831662 = if ((outAssetId == amId))
783- then $Tuple2(toInt(finalRes._2), 0)
784- else $Tuple2(0, toInt(finalRes._2))
785- let outAm = $t03155831662._1
786- let outPr = $t03155831662._2
787- let curPrX18 = cpbi(t1(prBalance, prDcm), t1(amBalance, amDcm))
788- let curPr = f1(curPrX18, scale8)
789- let state = [ScriptTransfer(userAddress, (outAm + outPr), if ((outAssetId == "WAVES"))
790- then unit
791- 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)]
792- if ((state == state))
793- then {
794- let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
795- if ((burn == burn))
796- then state
797- else throw("Strict value is not equal to itself.")
798- }
799- else throw("Strict value is not equal to itself.")
800- }
801- else throw("Strict value is not equal to itself.")
802- }
803- else throw("Strict value is not equal to itself.")
804- }
805- }
806- else throw("Strict value is not equal to itself.")
748+ if ((1000000000 > pmtAmt))
749+ then throw("Min pmt 10 LP")
750+ else if (if (if ((0 > slippage))
751+ then true
752+ else (0 > exchResult))
753+ then true
754+ else (0 > outAmount))
755+ then throw("Wrong params")
756+ else if ((lpId != toBase58String(pmtAssetId)))
757+ then throw("Wrong LP")
758+ else {
759+ let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
760+ let estimAmAmt = r._1
761+ let estimPrAmt = r._2
762+ let amBalance = getAccBalance(amId)
763+ let prBalance = getAccBalance(prId)
764+ let $t03019530652 = if ((outAssetId == amId))
765+ then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
766+ else if ((outAssetId == prId))
767+ then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
768+ else throw("wrong outAssetId")
769+ let amBalanceNow = $t03019530652._1
770+ let prBalanceNow = $t03019530652._2
771+ let virtSwapInAm = $t03019530652._3
772+ let virtSwapOutPr = $t03019530652._4
773+ let virtSwapInPr = $t03019530652._5
774+ let virtSwapOutAm = $t03019530652._6
775+ let totalGet = $t03019530652._7
776+ if (if ((0 > virtSwapInAm))
777+ then true
778+ else (0 > virtSwapInPr))
779+ then throw("Wrong calc")
780+ else {
781+ let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
782+ let D1 = invoke(gwxCntr, "calcD", [toString(((amBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((prBalanceNow + virtSwapOutPr) - virtSwapInPr)), A, Amult, Dconv], nil)
783+ let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
784+ if ((D0vsD1 == D0vsD1))
785+ then {
786+ let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
787+ if ((finalRes == finalRes))
788+ then {
789+ let $t03135731461 = if ((outAssetId == amId))
790+ then $Tuple2(toInt(finalRes._2), 0)
791+ else $Tuple2(0, toInt(finalRes._2))
792+ let outAm = $t03135731461._1
793+ let outPr = $t03135731461._2
794+ let totalAmountRaw = (outAm + outPr)
795+ let $t03150131556 = takeFee(totalAmountRaw)
796+ let totalAmount = $t03150131556._1
797+ let feeAmount = $t03150131556._2
798+ let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
799+ then unit
800+ else fromBase58String(outAssetId)
801+ let sendFeeToMatcher = if ((feeAmount > 0))
802+ then [ScriptTransfer(matcherAddress, feeAmount, outAssetIdOrWaves)]
803+ else nil
804+ let curPrX18 = cpbi(t1(prBalance, prDcm), t1(amBalance, amDcm))
805+ let curPr = f1(curPrX18, scale8)
806+ 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)]
807+ if ((state == state))
808+ then {
809+ let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
810+ if ((burn == burn))
811+ then (state ++ sendFeeToMatcher)
812+ else throw("Strict value is not equal to itself.")
813+ }
814+ else throw("Strict value is not equal to itself.")
815+ }
816+ else throw("Strict value is not equal to itself.")
817+ }
818+ else throw("Strict value is not equal to itself.")
819+ }
820+ }
807821 }
808822
809823
Full:
OldNewDifferences
11 {-# 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)
9+
10+let thousand = 1000
911
1012 let zeroBigInt = toBigInt(0)
1113
1214 let oneBigInt = toBigInt(1)
1315
1416 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
1517
1618 let Amult = "100"
1719
1820 let Dconv = "1"
1921
2022 let SEP = "__"
2123
2224 let EMPTY = ""
2325
2426 let PoolActive = 1
2527
2628 let PoolPutDis = 2
2729
2830 let PoolMatcherDis = 3
2931
3032 let PoolShutdown = 4
3133
3234 let idxPoolAddress = 1
3335
3436 let idxPoolSt = 2
3537
3638 let idxLPAsId = 3
3739
3840 let idxAmAsId = 4
3941
4042 let idxPrAsId = 5
4143
4244 let idxAmtAsDcm = 6
4345
4446 let idxPriceAsDcm = 7
4547
4648 let idxIAmtAsId = 8
4749
4850 let idxIPriceAsId = 9
4951
5052 let idxFactStakCntr = 1
5153
5254 let idxFactSlippCntr = 7
5355
5456 let idxFactGwxRewCntr = 10
5557
56-let delay = "%s__delay"
58+let feePermilleDefault = 0
5759
5860 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
5961
6062
6163 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6264
6365
6466 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
6567
6668
6769 func abs (val) = if ((zeroBigInt > val))
6870 then -(val)
6971 else val
7072
7173
7274 func fc () = "%s__factoryContract"
7375
7476
7577 func mpk () = "%s__managerPublicKey"
7678
7779
7880 func pmpk () = "%s__pendingManagerPublicKey"
7981
8082
8183 func pl () = "%s%s__price__last"
8284
8385
8486 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
8587
8688
8789 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
8890
8991
9092 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
9193
9294
9395 func aa () = "%s__amountAsset"
9496
9597
9698 func pa () = "%s__priceAsset"
9799
98100
99101 func amp () = "%s__amp"
100102
101103
102104 func ada () = "%s__addonAddr"
103105
104106
105-func lgotc (caller) = makeString(["%s%s__lastGetOneTknCall", caller], SEP)
107+let keyFeePermille = "%s__feePermille"
106108
107-
108-func lsotc (caller) = makeString(["%s%s__lastPutOneTknCall", caller], SEP)
109-
109+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
126126 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
127127
128128
129129 func str (val) = match val {
130130 case valStr: String =>
131131 valStr
132132 case _ =>
133133 throw("fail cast to String")
134134 }
135135
136136
137137 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
138138
139139
140140 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
141141
142142
143143 let fca = addressFromStringValue(strf(this, fc()))
144144
145145 let A = strf(this, amp())
146146
147147 func igs () = valueOrElse(getBoolean(fca, aps()), false)
148148
149149
150150 func mp () = fromBase58String(strf(fca, mtpk()))
151151
152+
153+let matcherAddress = addressFromPublicKey(mp())
152154
153155 func gpc () = {
154156 let amtAs = strf(this, aa())
155157 let priceAs = strf(this, pa())
156158 let iPriceAs = intf(fca, mba(priceAs))
157159 let iAmtAs = intf(fca, mba(amtAs))
158160 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
159161 }
160162
161163
162164 func gfc () = split(strf(fca, fcfg()), SEP)
163165
164166
165167 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)
166168
167169
168170 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)
169171
170172
171173 func getAccBalance (assetId) = if ((assetId == "WAVES"))
172174 then wavesBalance(this).available
173175 else assetBalance(this, fromBase58String(assetId))
174176
175177
176178 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
177179
178180
179181 func vad (A1,A2,slippage) = {
180182 let diff = fraction((A1 - A2), scale8BigInt, A2)
181183 let pass = ((slippage - abs(diff)) > zeroBigInt)
182184 if (!(pass))
183185 then throw(("Big slpg: " + toString(diff)))
184186 else $Tuple2(pass, min([A1, A2]))
185187 }
186188
187189
188190 func vd (D1,D0,slpg) = {
189191 let diff = fraction(D0, scale8BigInt, D1)
190192 let fail = (slpg > diff)
191193 if (if (fail)
192194 then true
193195 else (D0 > D1))
194196 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
195197 else fail
196198 }
197199
198200
199201 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
200202 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
201203 let prAsAmtX18 = t1(prAmt, prAssetDcm)
202204 cpbi(prAsAmtX18, amtAsAmtX18)
203205 }
204206
205207
206208 func calcPrices (amAmt,prAmt,lpAmt) = {
207209 let cfg = gpc()
208210 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
209211 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
210212 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
211213 let amAmtX18 = t1(amAmt, amtAsDcm)
212214 let prAmtX18 = t1(prAmt, prAsDcm)
213215 let lpAmtX18 = t1(lpAmt, scale8)
214216 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
215217 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
216218 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
217219 }
218220
219221
220222 func calculatePrices (amAmt,prAmt,lpAmt) = {
221223 let p = calcPrices(amAmt, prAmt, lpAmt)
222224 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
223225 }
224226
225227
226228 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
227229 let cfg = gpc()
228230 let lpId = cfg[idxLPAsId]
229231 let amId = cfg[idxAmAsId]
230232 let prId = cfg[idxPrAsId]
231233 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
232234 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
233235 let sts = cfg[idxPoolSt]
234236 let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
235237 if ((lpId != pmtAssetId))
236238 then throw("Wrong pmt asset")
237239 else {
238240 let amBalance = getAccBalance(amId)
239241 let amBalanceX18 = t1(amBalance, amDcm)
240242 let prBalance = getAccBalance(prId)
241243 let prBalanceX18 = t1(prBalance, prDcm)
242244 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
243245 let curPrice = f1(curPriceX18, scale8)
244246 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
245247 let lpEmissX18 = t1(lpEmiss, scale8)
246248 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
247249 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
248250 let outAmAmt = f1(outAmAmtX18, amDcm)
249251 let outPrAmt = f1(outPrAmtX18, prDcm)
250252 let state = if ((txId58 == ""))
251253 then nil
252254 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
253255 then unit
254256 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
255257 then unit
256258 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)]
257259 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
258260 }
259261 }
260262
261263
262264 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,pmtAmt,pmtId) = {
263265 let cfg = gpc()
264266 let lpId = fromBase58String(cfg[idxLPAsId])
265267 let amIdStr = cfg[idxAmAsId]
266268 let prIdStr = cfg[idxPrAsId]
267269 let inAmIdStr = cfg[idxIAmtAsId]
268270 let inPrIdStr = cfg[idxIPriceAsId]
269271 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
270272 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
271273 let sts = cfg[idxPoolSt]
272274 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
273275 let amBalance = if (isEval)
274276 then getAccBalance(amIdStr)
275277 else if (if (isOneAsset)
276278 then (pmtId == amIdStr)
277279 else false)
278280 then (getAccBalance(amIdStr) - pmtAmt)
279281 else if (isOneAsset)
280282 then getAccBalance(amIdStr)
281283 else (getAccBalance(amIdStr) - inAmAmt)
282284 let prBalance = if (isEval)
283285 then getAccBalance(prIdStr)
284286 else if (if (isOneAsset)
285287 then (pmtId == prIdStr)
286288 else false)
287289 then (getAccBalance(prIdStr) - pmtAmt)
288290 else if (isOneAsset)
289291 then getAccBalance(prIdStr)
290292 else (getAccBalance(prIdStr) - inPrAmt)
291293 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
292294 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
293295 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
294296 let amBalanceX18 = t1(amBalance, amtDcm)
295297 let prBalanceX18 = t1(prBalance, priceDcm)
296298 let r = if ((lpEm == 0))
297299 then {
298300 let curPriceX18 = zeroBigInt
299301 let slippageX18 = zeroBigInt
300302 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
301303 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
302304 }
303305 else {
304306 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
305307 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
306308 let slippageX18 = t1(slippage, scale8)
307309 if (if ((curPriceX18 != zeroBigInt))
308310 then (slippageRealX18 > slippageX18)
309311 else false)
310312 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
311313 else {
312314 let lpEmissionX18 = t1(lpEm, scale8)
313315 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
314316 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
315317 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
316318 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
317319 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
318320 let expAmtAssetAmtX18 = expectedAmts._1
319321 let expPriceAssetAmtX18 = expectedAmts._2
320322 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
321323 $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
322324 }
323325 }
324326 let calcLpAmt = r._1
325327 let calcAmAssetPmt = r._2
326328 let calcPrAssetPmt = r._3
327329 let curPrice = f1(r._4, scale8)
328330 let slippageCalc = f1(r._5, scale8)
329331 if ((0 >= calcLpAmt))
330332 then throw("LP <= 0")
331333 else {
332334 let emitLpAmt = if (!(emitLp))
333335 then 0
334336 else calcLpAmt
335337 let amDiff = (inAmAmt - calcAmAssetPmt)
336338 let prDiff = (inPrAmt - calcPrAssetPmt)
337- let $t01553115876 = if (if (isOneAsset)
339+ let $t01551715862 = if (if (isOneAsset)
338340 then (pmtId == amIdStr)
339341 else false)
340342 then $Tuple2(pmtAmt, 0)
341343 else if (if (isOneAsset)
342344 then (pmtId == prIdStr)
343345 else false)
344346 then $Tuple2(0, pmtAmt)
345347 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
346- let writeAmAmt = $t01553115876._1
347- let writePrAmt = $t01553115876._2
348+ let writeAmAmt = $t01551715862._1
349+ let writePrAmt = $t01551715862._2
348350 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))]
349351 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
350352 }
351353 }
352354
353355
354356 func moa (order) = {
355357 let cfg = gpc()
356358 let amtAsId = cfg[idxAmAsId]
357359 let prAsId = cfg[idxPrAsId]
358360 let sts = parseIntValue(cfg[idxPoolSt])
359361 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
360362 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
361363 let accAmtAsBalance = getAccBalance(amtAsId)
362364 let accPrAsBalance = getAccBalance(prAsId)
363365 let curPriceX18 = if ((order.orderType == Buy))
364366 then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
365367 else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
366368 let curPrice = f1(curPriceX18, scale8)
367369 if (if (if (igs())
368370 then true
369371 else (sts == PoolMatcherDis))
370372 then true
371373 else (sts == PoolShutdown))
372374 then throw("Admin blocked")
373375 else {
374376 let orAmtAsset = order.assetPair.amountAsset
375377 let orAmtAsStr = if ((orAmtAsset == unit))
376378 then "WAVES"
377379 else toBase58String(value(orAmtAsset))
378380 let orPrAsset = order.assetPair.priceAsset
379381 let orPrAsStr = if ((orPrAsset == unit))
380382 then "WAVES"
381383 else toBase58String(value(orPrAsset))
382384 if (if ((orAmtAsStr != amtAsId))
383385 then true
384386 else (orPrAsStr != prAsId))
385387 then throw("Wr assets")
386388 else {
387389 let orderPrice = order.price
388390 let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
389391 let castOrderPrice = ts(orderPrice, scale8, priceDcm)
390392 let isOrderPriceValid = if ((order.orderType == Buy))
391393 then (curPrice >= castOrderPrice)
392394 else (castOrderPrice >= curPrice)
393395 true
394396 }
395397 }
396398 }
397399
398400
399401 func cg (i) = if ((size(i.payments) != 1))
400402 then throw("1 pmnt exp")
401403 else {
402404 let pmt = value(i.payments[0])
403405 let pmtAssetId = value(pmt.assetId)
404406 let pmtAmt = pmt.amount
405407 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
406408 let outAmAmt = r._1
407409 let outPrAmt = r._2
408410 let sts = parseIntValue(r._9)
409411 let state = r._10
410412 if (if (igs())
411413 then true
412414 else (sts == PoolShutdown))
413415 then throw(("Admin blocked: " + toString(sts)))
414416 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
415417 }
416418
417419
418420 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,pmtAmt,pmtId) = {
419421 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, false, emitLp, isOneAsset, pmtAmt, pmtId)
420422 let sts = parseIntValue(r._8)
421423 if (if (if (igs())
422424 then true
423425 else (sts == PoolPutDis))
424426 then true
425427 else (sts == PoolShutdown))
426428 then throw(("Blocked:" + toString(sts)))
427429 else r
430+ }
431+
432+
433+func takeFee (amount) = {
434+ let fee = fraction(amount, feePermille, thousand)
435+ $Tuple2((amount - fee), fee)
428436 }
429437
430438
431439 func m () = match getString(mpk()) {
432440 case s: String =>
433441 fromBase58String(s)
434442 case _: Unit =>
435443 unit
436444 case _ =>
437445 throw("Match error")
438446 }
439447
440448
441449 func pm () = match getString(pmpk()) {
442450 case s: String =>
443451 fromBase58String(s)
444452 case _: Unit =>
445453 unit
446454 case _ =>
447455 throw("Match error")
448456 }
449457
450458
451459 let pd = throw("Permission denied")
452460
453461 func mm (i) = match m() {
454462 case pk: ByteVector =>
455463 if ((i.callerPublicKey == pk))
456464 then true
457465 else pd
458466 case _: Unit =>
459467 if ((i.caller == this))
460468 then true
461469 else pd
462470 case _ =>
463471 throw("Match error")
464472 }
465473
466474
467475 @Callable(i)
468476 func constructor (fc) = {
469477 let c = mm(i)
470478 if ((c == c))
471479 then [StringEntry(fc(), fc)]
472480 else throw("Strict value is not equal to itself.")
473481 }
474482
475483
476484
477485 @Callable(i)
478486 func setManager (pendingManagerPublicKey) = {
479487 let c = mm(i)
480488 if ((c == c))
481489 then {
482490 let cm = fromBase58String(pendingManagerPublicKey)
483491 if ((cm == cm))
484492 then [StringEntry(pmpk(), pendingManagerPublicKey)]
485493 else throw("Strict value is not equal to itself.")
486494 }
487495 else throw("Strict value is not equal to itself.")
488496 }
489497
490498
491499
492500 @Callable(i)
493501 func confirmManager () = {
494502 let p = pm()
495503 let hpm = if (isDefined(p))
496504 then true
497505 else throw("No pending manager")
498506 if ((hpm == hpm))
499507 then {
500508 let cpm = if ((i.callerPublicKey == value(p)))
501509 then true
502510 else throw("You are not pending manager")
503511 if ((cpm == cpm))
504512 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
505513 else throw("Strict value is not equal to itself.")
506514 }
507515 else throw("Strict value is not equal to itself.")
508516 }
509517
510518
511519
512520 @Callable(i)
513521 func put (slip,autoStake) = {
514522 let factCfg = gfc()
515523 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
516524 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
517525 if ((0 > slip))
518526 then throw("Wrong slippage")
519527 else if ((size(i.payments) != 2))
520528 then throw("2 pmnts expd")
521529 else {
522530 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, "")
523531 let emitLpAmt = e._2
524532 let lpAssetId = e._7
525533 let state = e._9
526534 let amDiff = e._10
527535 let prDiff = e._11
528536 let amId = e._12
529537 let prId = e._13
530538 let r = invoke(fca, "emit", [emitLpAmt], nil)
531539 if ((r == r))
532540 then {
533541 let el = match r {
534542 case legacy: Address =>
535543 invoke(legacy, "emit", [emitLpAmt], nil)
536544 case _ =>
537545 unit
538546 }
539547 if ((el == el))
540548 then {
541549 let sa = if ((amDiff > 0))
542550 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
543551 else nil
544552 if ((sa == sa))
545553 then {
546554 let sp = if ((prDiff > 0))
547555 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
548556 else nil
549557 if ((sp == sp))
550558 then {
551559 let lpTrnsfr = if (autoStake)
552560 then {
553561 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
554562 if ((ss == ss))
555563 then nil
556564 else throw("Strict value is not equal to itself.")
557565 }
558566 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
559567 (state ++ lpTrnsfr)
560568 }
561569 else throw("Strict value is not equal to itself.")
562570 }
563571 else throw("Strict value is not equal to itself.")
564572 }
565573 else throw("Strict value is not equal to itself.")
566574 }
567575 else throw("Strict value is not equal to itself.")
568576 }
569577 }
570578
571579
572580
573581 @Callable(i)
574582 func putOneTkn (amAssetPart,prAssetPart,outLp,slippage,autoStake) = {
575583 let cfg = gfc()
576584 let stakingCntr = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wr st addr")
577585 let slipCntr = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wr sl addr")
578586 let gwxCntr = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wr gwx addr")
579587 let poolCfg = gpc()
580588 let amId = poolCfg[idxAmAsId]
581589 let prId = poolCfg[idxPrAsId]
582590 let amDcm = parseIntValue(poolCfg[idxAmtAsDcm])
583591 let prDcm = parseIntValue(poolCfg[idxPriceAsDcm])
584592 let addon = valueOrElse(getString(this, ada()), "")
585593 let userAddress = if ((addon == toString(i.caller)))
586594 then i.originCaller
587595 else i.caller
588- let addonContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(ada()), "no addons")), "addon address in not valid")
589- let check = reentrantInvoke(addonContract, "ensureCanPutOneTkn", [toString(userAddress)], nil)
590- if ((check == check))
591- then if (if (if (if ((0 >= slippage))
592- then true
593- else (0 >= amAssetPart))
594- then true
595- else (0 >= prAssetPart))
596- then true
597- else (0 >= outLp))
598- then throw("Wrong params")
599- else if ((size(i.payments) != 1))
600- then throw("1 pmnt expd")
601- else {
602- let pmt = value(i.payments[0])
603- let pmtAssetId = toBase58String(value(pmt.assetId))
604- let pmtAmt = pmt.amount
605- if ((10000000 > pmtAmt))
606- then throw("Wrong pmt amt")
607- else {
608- let amBalance = getAccBalance(amId)
609- let prBalance = getAccBalance(prId)
610- let $t02478925365 = if ((pmtAssetId == amId))
611- then if (if ((pmtAmt > amBalance))
596+ if (if (if (if ((0 >= slippage))
597+ then true
598+ else (0 >= amAssetPart))
599+ then true
600+ else (0 >= prAssetPart))
601+ then true
602+ else (0 >= outLp))
603+ then throw("Wrong params")
604+ else if ((size(i.payments) != 1))
605+ then throw("1 pmnt expd")
606+ else {
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 ((10000000 > pmtAmt))
614+ then throw("Wrong pmt amt")
615+ else {
616+ let amBalance = getAccBalance(amId)
617+ let prBalance = getAccBalance(prId)
618+ let $t02468125257 = if ((pmtAssetId == amId))
619+ then if (if ((pmtAmt > amBalance))
620+ then true
621+ else (amAssetPart > pmtAmt))
622+ then throw("invalid payment amount")
623+ else $Tuple6((amBalance - pmtAmt), prBalance, (pmtAmt - amAssetPart), prAssetPart, 0, 0)
624+ else if ((pmtAssetId == prId))
625+ then if (if ((pmtAmt > prBalance))
612626 then true
613- else (amAssetPart > pmtAmt))
627+ else (prAssetPart > pmtAmt))
614628 then throw("invalid payment amount")
615- else $Tuple6((amBalance - pmtAmt), prBalance, (pmtAmt - amAssetPart), prAssetPart, 0, 0)
616- else if ((pmtAssetId == prId))
617- then if (if ((pmtAmt > prBalance))
618- then true
619- else (prAssetPart > pmtAmt))
620- then throw("invalid payment amount")
621- else $Tuple6(amBalance, (prBalance - pmtAmt), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
622- else throw("wrong pmtAssetId")
623- let amBalanceNow = $t02478925365._1
624- let prBalanceNow = $t02478925365._2
625- let virtSwapInAm = $t02478925365._3
626- let virtSwapOutPr = $t02478925365._4
627- let virtSwapInPr = $t02478925365._5
628- let virtSwapOutAm = $t02478925365._6
629- let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
630- let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
631- let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
632- if ((D0vsD1 == D0vsD1))
633- then {
634- let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), slippage, true, true, pmtAmt, pmtAssetId)
635- let estimLP = estPut._2
636- let lpAssetId = estPut._7
637- let state = estPut._9
638- let amDiff = estPut._10
639- let prDiff = estPut._11
640- let lpCalcRes = vad(toBigInt(estimLP), toBigInt(outLp), toBigInt(slippage))
641- let emitLpAmt = toInt(lpCalcRes._2)
642- let e = invoke(fca, "emit", [emitLpAmt], nil)
643- if ((e == e))
644- then {
645- let el = match e {
646- case legacy: Address =>
647- invoke(legacy, "emit", [emitLpAmt], nil)
648- case _ =>
649- unit
650- }
651- if ((el == el))
652- then {
653- let sa = if ((amDiff > 0))
654- then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
655- else nil
656- if ((sa == sa))
657- then {
658- let sp = if ((prDiff > 0))
659- then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
660- else nil
661- if ((sp == sp))
662- then {
663- let lpTrnsfr = if (autoStake)
664- then {
665- let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
666- if ((ss == ss))
667- then nil
668- else throw("Strict value is not equal to itself.")
669- }
670- else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
671- (state ++ lpTrnsfr)
672- }
673- else throw("Strict value is not equal to itself.")
674- }
675- else throw("Strict value is not equal to itself.")
676- }
677- else throw("Strict value is not equal to itself.")
678- }
679- else throw("Strict value is not equal to itself.")
680- }
681- else throw("Strict value is not equal to itself.")
682- }
683- }
684- else throw("Strict value is not equal to itself.")
629+ else $Tuple6(amBalance, (prBalance - pmtAmt), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
630+ else throw("wrong pmtAssetId")
631+ let amBalanceNow = $t02468125257._1
632+ let prBalanceNow = $t02468125257._2
633+ let virtSwapInAm = $t02468125257._3
634+ let virtSwapOutPr = $t02468125257._4
635+ let virtSwapInPr = $t02468125257._5
636+ let virtSwapOutAm = $t02468125257._6
637+ let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
638+ let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
639+ let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
640+ if ((D0vsD1 == D0vsD1))
641+ then {
642+ let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), slippage, true, true, pmtAmt, pmtAssetId)
643+ let estimLP = estPut._2
644+ let lpAssetId = estPut._7
645+ let state = estPut._9
646+ let amDiff = estPut._10
647+ let prDiff = estPut._11
648+ let lpCalcRes = vad(toBigInt(estimLP), toBigInt(outLp), toBigInt(slippage))
649+ let emitLpAmt = toInt(lpCalcRes._2)
650+ let e = invoke(fca, "emit", [emitLpAmt], nil)
651+ if ((e == e))
652+ then {
653+ let el = match e {
654+ case legacy: Address =>
655+ invoke(legacy, "emit", [emitLpAmt], nil)
656+ case _ =>
657+ unit
658+ }
659+ if ((el == el))
660+ then {
661+ let sa = if ((amDiff > 0))
662+ then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
663+ else nil
664+ if ((sa == sa))
665+ then {
666+ let sp = if ((prDiff > 0))
667+ then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
668+ else nil
669+ if ((sp == sp))
670+ then {
671+ let lpTrnsfr = if (autoStake)
672+ then {
673+ let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
674+ if ((ss == ss))
675+ then nil
676+ else throw("Strict value is not equal to itself.")
677+ }
678+ else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
679+ let sendFeeToMatcher = if ((feeAmount > 0))
680+ then [ScriptTransfer(matcherAddress, feeAmount, fromBase58String(pmtAssetId))]
681+ else nil
682+ ((state ++ lpTrnsfr) ++ sendFeeToMatcher)
683+ }
684+ else throw("Strict value is not equal to itself.")
685+ }
686+ else throw("Strict value is not equal to itself.")
687+ }
688+ else throw("Strict value is not equal to itself.")
689+ }
690+ else throw("Strict value is not equal to itself.")
691+ }
692+ else throw("Strict value is not equal to itself.")
693+ }
694+ }
685695 }
686696
687697
688698
689699 @Callable(i)
690700 func putForFree (maxSlpg) = if ((0 > maxSlpg))
691701 then throw("Wrong slpg")
692702 else if ((size(i.payments) != 2))
693703 then throw("2 pmnts expd")
694704 else {
695705 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, "")
696706 estPut._9
697707 }
698708
699709
700710
701711 @Callable(i)
702712 func get () = {
703713 let r = cg(i)
704714 let outAmtAmt = r._1
705715 let outPrAmt = r._2
706716 let pmtAmt = r._3
707717 let pmtAssetId = r._4
708718 let state = r._5
709719 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
710720 if ((b == b))
711721 then state
712722 else throw("Strict value is not equal to itself.")
713723 }
714724
715725
716726
717727 @Callable(i)
718728 func getOneTkn (exchResult,notUsed,outAmount,outAssetId,slippage) = if ((size(i.payments) != 1))
719729 then throw("1 pmnt expd")
720730 else {
721731 let cfg = gpc()
722732 let lpId = cfg[idxLPAsId]
723733 let amId = cfg[idxAmAsId]
724734 let prId = cfg[idxPrAsId]
725735 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
726736 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
727737 let sts = cfg[idxPoolSt]
728738 let factCfg = gfc()
729739 let gwxCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wr sl addr")
730740 let pmt = value(i.payments[0])
731741 let addon = valueOrElse(getString(this, ada()), "")
732742 let userAddress = if ((addon == toString(i.caller)))
733743 then i.originCaller
734744 else i.caller
735745 let txId58 = toBase58String(i.transactionId)
736746 let pmtAssetId = value(pmt.assetId)
737747 let pmtAmt = pmt.amount
738- let addonContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(ada()), "no addons")), "addon address in not valid")
739- let check = reentrantInvoke(addonContract, "ensureCanGetOneTkn", [toString(userAddress)], nil)
740- if ((check == check))
741- then if ((1000000000 > pmtAmt))
742- then throw("Min pmt 10 LP")
743- else if (if (if ((0 > slippage))
744- then true
745- else (0 > exchResult))
746- then true
747- else (0 > outAmount))
748- then throw("Wrong params")
749- else if ((lpId != toBase58String(pmtAssetId)))
750- then throw("Wrong LP")
751- else {
752- let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
753- let estimAmAmt = r._1
754- let estimPrAmt = r._2
755- let amBalance = getAccBalance(amId)
756- let prBalance = getAccBalance(prId)
757- let $t03039630853 = if ((outAssetId == amId))
758- then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
759- else if ((outAssetId == prId))
760- then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
761- else throw("wrong outAssetId")
762- let amBalanceNow = $t03039630853._1
763- let prBalanceNow = $t03039630853._2
764- let virtSwapInAm = $t03039630853._3
765- let virtSwapOutPr = $t03039630853._4
766- let virtSwapInPr = $t03039630853._5
767- let virtSwapOutAm = $t03039630853._6
768- let totalGet = $t03039630853._7
769- if (if ((0 > virtSwapInAm))
770- then true
771- else (0 > virtSwapInPr))
772- then throw("Wrong calc")
773- else {
774- let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
775- let D1 = invoke(gwxCntr, "calcD", [toString(((amBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((prBalanceNow + virtSwapOutPr) - virtSwapInPr)), A, Amult, Dconv], nil)
776- let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
777- if ((D0vsD1 == D0vsD1))
778- then {
779- let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
780- if ((finalRes == finalRes))
781- then {
782- let $t03155831662 = if ((outAssetId == amId))
783- then $Tuple2(toInt(finalRes._2), 0)
784- else $Tuple2(0, toInt(finalRes._2))
785- let outAm = $t03155831662._1
786- let outPr = $t03155831662._2
787- let curPrX18 = cpbi(t1(prBalance, prDcm), t1(amBalance, amDcm))
788- let curPr = f1(curPrX18, scale8)
789- let state = [ScriptTransfer(userAddress, (outAm + outPr), if ((outAssetId == "WAVES"))
790- then unit
791- 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)]
792- if ((state == state))
793- then {
794- let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
795- if ((burn == burn))
796- then state
797- else throw("Strict value is not equal to itself.")
798- }
799- else throw("Strict value is not equal to itself.")
800- }
801- else throw("Strict value is not equal to itself.")
802- }
803- else throw("Strict value is not equal to itself.")
804- }
805- }
806- else throw("Strict value is not equal to itself.")
748+ if ((1000000000 > pmtAmt))
749+ then throw("Min pmt 10 LP")
750+ else if (if (if ((0 > slippage))
751+ then true
752+ else (0 > exchResult))
753+ then true
754+ else (0 > outAmount))
755+ then throw("Wrong params")
756+ else if ((lpId != toBase58String(pmtAssetId)))
757+ then throw("Wrong LP")
758+ else {
759+ let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
760+ let estimAmAmt = r._1
761+ let estimPrAmt = r._2
762+ let amBalance = getAccBalance(amId)
763+ let prBalance = getAccBalance(prId)
764+ let $t03019530652 = if ((outAssetId == amId))
765+ then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
766+ else if ((outAssetId == prId))
767+ then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
768+ else throw("wrong outAssetId")
769+ let amBalanceNow = $t03019530652._1
770+ let prBalanceNow = $t03019530652._2
771+ let virtSwapInAm = $t03019530652._3
772+ let virtSwapOutPr = $t03019530652._4
773+ let virtSwapInPr = $t03019530652._5
774+ let virtSwapOutAm = $t03019530652._6
775+ let totalGet = $t03019530652._7
776+ if (if ((0 > virtSwapInAm))
777+ then true
778+ else (0 > virtSwapInPr))
779+ then throw("Wrong calc")
780+ else {
781+ let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
782+ let D1 = invoke(gwxCntr, "calcD", [toString(((amBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((prBalanceNow + virtSwapOutPr) - virtSwapInPr)), A, Amult, Dconv], nil)
783+ let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
784+ if ((D0vsD1 == D0vsD1))
785+ then {
786+ let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
787+ if ((finalRes == finalRes))
788+ then {
789+ let $t03135731461 = if ((outAssetId == amId))
790+ then $Tuple2(toInt(finalRes._2), 0)
791+ else $Tuple2(0, toInt(finalRes._2))
792+ let outAm = $t03135731461._1
793+ let outPr = $t03135731461._2
794+ let totalAmountRaw = (outAm + outPr)
795+ let $t03150131556 = takeFee(totalAmountRaw)
796+ let totalAmount = $t03150131556._1
797+ let feeAmount = $t03150131556._2
798+ let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
799+ then unit
800+ else fromBase58String(outAssetId)
801+ let sendFeeToMatcher = if ((feeAmount > 0))
802+ then [ScriptTransfer(matcherAddress, feeAmount, outAssetIdOrWaves)]
803+ else nil
804+ let curPrX18 = cpbi(t1(prBalance, prDcm), t1(amBalance, amDcm))
805+ let curPr = f1(curPrX18, scale8)
806+ 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)]
807+ if ((state == state))
808+ then {
809+ let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
810+ if ((burn == burn))
811+ then (state ++ sendFeeToMatcher)
812+ else throw("Strict value is not equal to itself.")
813+ }
814+ else throw("Strict value is not equal to itself.")
815+ }
816+ else throw("Strict value is not equal to itself.")
817+ }
818+ else throw("Strict value is not equal to itself.")
819+ }
820+ }
807821 }
808822
809823
810824
811825 @Callable(i)
812826 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
813827 let r = cg(i)
814828 let outAmAmt = r._1
815829 let outPrAmt = r._2
816830 let pmtAmt = r._3
817831 let pmtAssetId = r._4
818832 let state = r._5
819833 if ((noLessThenAmtAsset > outAmAmt))
820834 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
821835 else if ((noLessThenPriceAsset > outPrAmt))
822836 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
823837 else {
824838 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
825839 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
826840 then state
827841 else throw("Strict value is not equal to itself.")
828842 }
829843 }
830844
831845
832846
833847 @Callable(i)
834848 func unstakeAndGet (amount) = {
835849 let checkPayments = if ((size(i.payments) != 0))
836850 then throw("No pmnts expd")
837851 else true
838852 if ((checkPayments == checkPayments))
839853 then {
840854 let cfg = gpc()
841855 let factoryCfg = gfc()
842856 let lpAssetId = fromBase58String(cfg[idxLPAsId])
843857 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
844858 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
845859 if ((unstakeInv == unstakeInv))
846860 then {
847861 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
848862 let sts = parseIntValue(r._9)
849863 let state = r._10
850864 let v = if (if (igs())
851865 then true
852866 else (sts == PoolShutdown))
853867 then throw(("Blocked: " + toString(sts)))
854868 else true
855869 if ((v == v))
856870 then {
857871 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
858872 if ((burnA == burnA))
859873 then state
860874 else throw("Strict value is not equal to itself.")
861875 }
862876 else throw("Strict value is not equal to itself.")
863877 }
864878 else throw("Strict value is not equal to itself.")
865879 }
866880 else throw("Strict value is not equal to itself.")
867881 }
868882
869883
870884
871885 @Callable(i)
872886 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
873887 then throw("denied")
874888 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
875889
876890
877891
878892 @Callable(i)
879893 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
880894 then pd
881895 else [StringEntry(k, v)]
882896
883897
884898
885899 @Callable(i)
886900 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
887901 then pd
888902 else [IntegerEntry(k, v)]
889903
890904
891905
892906 @Callable(i)
893907 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
894908
895909
896910
897911 @Callable(i)
898912 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
899913
900914
901915
902916 @Callable(i)
903917 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
904918 let pr = calcPrices(amAmt, prAmt, lpAmt)
905919 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
906920 }
907921
908922
909923
910924 @Callable(i)
911925 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
912926
913927
914928
915929 @Callable(i)
916930 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
917931
918932
919933
920934 @Callable(i)
921935 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
922936
923937
924938
925939 @Callable(i)
926940 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, ""))
927941
928942
929943
930944 @Callable(i)
931945 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
932946 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
933947 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
934948 }
935949
936950
937951 @Verifier(tx)
938952 func verify () = match tx {
939953 case order: Order =>
940954 let mtchPub = mp()
941955 let orV = moa(order)
942956 let sndrV = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
943957 let mtchV = sigVerify(order.bodyBytes, order.proofs[1], mtchPub)
944958 if (if (if (orV)
945959 then sndrV
946960 else false)
947961 then mtchV
948962 else false)
949963 then true
950964 else toe(orV, sndrV, mtchV)
951965 case _ =>
952966 let targetPublicKey = match m() {
953967 case pk: ByteVector =>
954968 pk
955969 case _: Unit =>
956970 tx.senderPublicKey
957971 case _ =>
958972 throw("Match error")
959973 }
960974 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
961975 }
962976

github/deemru/w8io/169f3d6 
127.30 ms