@galacticcouncil/sdk-next 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/api/Papi.d.ts +2 -1
- package/build/client/index.cjs +1 -1
- package/build/client/index.mjs +1 -1
- package/build/farm/index.cjs +1 -1
- package/build/farm/index.mjs +1 -1
- package/build/index.cjs +1 -1
- package/build/index.mjs +1 -1
- package/build/pool/index.cjs +1 -1
- package/build/pool/index.mjs +1 -1
- package/build/sor/TradeScheduler.d.ts +10 -0
- package/build/sor/index.cjs +1 -1
- package/build/sor/index.mjs +1 -1
- package/build/sor/types.d.ts +1 -0
- package/build/staking/index.cjs +1 -1
- package/build/staking/index.mjs +1 -1
- package/build/tx/IntentLimitTxBuilder.d.ts +21 -0
- package/build/tx/IntentMarketTxBuilder.d.ts +15 -0
- package/build/tx/IntentOrderTxBuilder.d.ts +17 -0
- package/build/tx/TxBuilderFactory.d.ts +6 -0
- package/build/tx/index.cjs +1 -1
- package/build/tx/index.mjs +1 -1
- package/package.json +2 -2
package/build/sor/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var Ie=Object.create;var yt=Object.defineProperty;var we=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var xe=Object.getPrototypeOf,Te=Object.prototype.hasOwnProperty;var Z=(c,t)=>{for(var e in t)yt(c,e,{get:t[e],enumerable:!0})},jt=(c,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of Oe(t))!Te.call(c,a)&&a!==e&&yt(c,a,{get:()=>t[a],enumerable:!(s=we(t,a))||s.enumerable});return c};var Rt=(c,t,e)=>(e=c!=null?Ie(xe(c)):{},jt(t||!c||!c.__esModule?yt(e,"default",{value:c,enumerable:!0}):e,c)),ve=c=>jt(yt({},"__esModule",{value:!0}),c);var ds={};Z(ds,{DCA_TIME_RESERVE:()=>he,DEFAULT_BLOCK_TIME:()=>ge,DEFAULT_MIN_BUDGET:()=>$t,ORDER_MIN_BLOCK_PERIOD:()=>be,Router:()=>nt,TWAP_EXECUTION_INTERVAL:()=>Pt,TWAP_MAX_DURATION:()=>Yt,TWAP_MAX_PRICE_IMPACT:()=>Xt,TWAP_TX_MULTIPLIER:()=>Hl,TradeOrderError:()=>Wt,TradeOrderType:()=>Ut,TradeRouteBuilder:()=>U,TradeRouter:()=>rt,TradeScheduler:()=>Et,TradeType:()=>Vt});module.exports=ve(ds);var lt=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Be=10,ct=class{isNotVisited(t,e){let s=!0;return e.forEach(a=>{(a[0]===t[0]||a[1]===t[1])&&(s=!1)}),s}findPaths(t,e,s){let a=[],i=new lt,o=[];for(o.push([e,""]),i.enqueue(o);i.size()>0;){let n=i.dequeue();if(!n||n.length>Be)continue;let r=n[n.length-1];(s===null||r[0]===s)&&a.push(n),t.get(r[0])?.forEach(u=>{if(this.isNotVisited(u,n)){let p=[...n];p.push(u),i.enqueue(p)}})}return a}findShortestPaths(t,e,s){let a=[],i=new lt,o=[];o.push([e,""]),i.enqueue(o);let n=1/0;for(;i.size()>0;){let r=i.dequeue();if(!r)continue;let l=r[r.length-1];if(l[0]===s){r.length<n?(n=r.length,a.length=0,a.push(r)):r.length===n&&a.push(r);continue}let u=t.get(l[0]);for(let p of u??[])this.isNotVisited(p,r)&&i.enqueue([...r,p])}return a}buildAndPopulateGraph(t,e){let s=new Map;for(let a of t)s.set(parseInt(a),[]);for(let[a,i,o]of e)s.get(i)?.push([o,a]);return s}};function kt(c){let t={};for(let e of c){let s=e.tokens.length;for(let a=0;a<s;a++){t[e.tokens[a].id]||(t[e.tokens[a].id]=[]);for(let i=0;i<s;i++){if(a==i)continue;let o=[e.address,e.tokens[a].id,e.tokens[i].id];t[e.tokens[a].id].push(o)}}}return t}var H=require("@galacticcouncil/math-lbp"),G=class{static getSpotPrice(t,e,s,a,i){return(0,H.get_spot_price)(t,e,s,a,i)}static calculateInGivenOut(t,e,s,a,i){return(0,H.calculate_in_given_out)(t,e,s,a,i)}static calculateOutGivenIn(t,e,s,a,i){return(0,H.calculate_out_given_in)(t,e,s,a,i)}static calculateLinearWeights(t,e,s,a,i){return(0,H.calculate_linear_weights)(t,e,s,a,i)}static calculatePoolTradeFee(t,e,s){return(0,H.calculate_pool_trade_fee)(t,e,s)}};var tt=require("@galacticcouncil/common");var ft={};Z(ft,{withTimeout:()=>Ae});function Ae(c,t,e="timeout"){return new Promise((s,a)=>{let i=setTimeout(()=>a(new Error(e)),t);c.then(o=>{clearTimeout(i),s(o)},o=>{clearTimeout(i),a(o)})})}var C={};Z(C,{divSpot:()=>_e,getFraction:()=>Ee,mulScaled:()=>Qt,mulSpot:()=>Fe});var Ct=require("@galacticcouncil/common");function Qt(c,t,e,s,a){let i=e+s-a,o=c*t;return i>0?o/BigInt(10)**BigInt(i):i<0?o*BigInt(10)**BigInt(-i):o}function Fe(c,t,e,s){return Qt(c,t,e,Ct.RUNTIME_DECIMALS,s)}function _e(c,t,e,s){if(t===0n)return 0n;let a=BigInt(10)**BigInt(Ct.RUNTIME_DECIMALS+s-e);return c*a/t}function Ee(c,t,e=2){if(t<.01||t>100)throw new Error("Supported range is from 0.01% - 100%");let s=BigInt(10)**BigInt(e),a=BigInt(Math.round(t*Number(s)));return c*a/(BigInt(100)*s)}var S={};Z(S,{FeeUtils:()=>Mt,shiftNeg:()=>ke});var Zt=Rt(require("big.js"));var Mt=class c{static toPct(t){let[e,s]=t;return c.safeDivide(e*100,s)}static toRaw(t){let[e,s]=t;return c.safeDivide(e,s)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,s=12){let a=10**s;return Math.round(t*a/e)/a}static safeRound(t){return parseFloat(t.toPrecision(15))}};function ke(c,t){let e=(0,Zt.default)(typeof c=="bigint"?c.toString():c);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var ut={};Z(ut,{findNestedKey:()=>Ce,findNestedObj:()=>Me,jsonFormatter:()=>Le});var Ce=(c,t)=>{let e=[];return JSON.stringify(c,(s,a)=>(a&&a[t]&&e.push(a),a)),e[0]},Me=(c,t,e)=>{let s;return JSON.stringify(c,(a,i)=>(i&&i[t]===e&&(s=i),i)),s},Le=(c,t)=>typeof t=="bigint"?t.toString():t;var A={};Z(A,{calculateBuyFee:()=>qe,calculateDiffToAvg:()=>De,calculateDiffToRef:()=>He,calculateSellFee:()=>Ne});var N=Rt(require("big.js"));function De(c,t){let e=(0,N.default)(c.toString()),s=(0,N.default)(t.toString());return e.minus(s).abs().div(e.plus(s).div(2)).mul(100).round(2).toNumber()}function He(c,t){if(t===0n)return 0;let e=(0,N.default)(c.toString()),s=(0,N.default)(t.toString());return e.minus(s).div(s).mul(100).round(2).toNumber()}function Ne(c,t){if(c===0n)return 0;let e=(0,N.default)(c.toString()),s=(0,N.default)(t.toString());return(0,N.default)(1).minus(s.div(e)).mul(100).round(2).toNumber()}function qe(c,t){if(c===0n)return 0;let e=(0,N.default)(c.toString());return(0,N.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}var{FeeUtils:te}=S,St=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new c(t)}constructor(t){this.type="LBP",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.fee=t.fee,this.repayFeeApply=t.repayFeeApply}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:i.balance,decimalsIn:a.decimals,decimalsOut:i.decimals,weightIn:a.weight,weightOut:i.weight}}validateAndBuy(t,e,s){let a=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let o=t.balanceOut/this.maxOutRatio;if(e>o&&i.push("MaxOutRatioExceeded"),a===t.assetOut){let n=this.calculateTradeFee(e,s),r=te.toPct(this.repayFeeApply?s.repayFee:s.exchangeFee),l=e+n,u=this.calculateInGivenOut(t,l),p=t.balanceIn/this.maxInRatio;return u>p&&i.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:r,errors:i}}else{let n=this.calculateInGivenOut(t,e),r=t.balanceIn/this.maxInRatio;return n>r&&i.push("MaxInRatioExceeded"),{amountIn:n,calculatedIn:n,amountOut:e,feePct:0,errors:i}}}validateAndSell(t,e,s){let a=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let o=t.balanceIn/this.maxInRatio;if(e>o&&i.push("MaxInRatioExceeded"),a===t.assetIn){let n=this.calculateOutGivenIn(t,e),r=t.balanceOut/this.maxOutRatio;return n>r&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:n,amountOut:n,feePct:0,errors:i}}else{let n=this.calculateOutGivenIn(t,e),r=this.calculateTradeFee(n,s),l=te.toPct(this.repayFeeApply?s.repayFee:s.exchangeFee),u=n-r,p=t.balanceOut/this.maxOutRatio;return u>p&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:n,amountOut:u,feePct:l,errors:i}}}calculateInGivenOut(t,e){let s=G.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),a=BigInt(s);return a<0n?0n:a}calculateOutGivenIn(t,e){let s=G.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),a=BigInt(s);return a<0n?0n:a}spotPriceInGivenOut(t){let e=G.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),tt.big.toBigInt(1,tt.RUNTIME_DECIMALS).toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=G.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),tt.big.toBigInt(1,tt.RUNTIME_DECIMALS).toString());return BigInt(e)}calculateTradeFee(t,e){let s=G.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(s)}};var Xe=require("polkadot-api"),xt=require("rxjs");var V=require("rxjs"),E=require("rxjs/operators");var se=require("@galacticcouncil/descriptors");var ee=require("@galacticcouncil/common"),Lt=require("rxjs");var It=require("rxjs"),$=require("rxjs/operators");var{logger:Us}=ee.log;var Ge=require("polkadot-api/ws"),Ve=require("polkadot-api/logs-provider");var Ue=require("polkadot-api");var ae=require("@galacticcouncil/common"),Ot=require("rxjs"),M=require("rxjs/operators");var{logger:ca}=ae.log;var $e=require("rxjs");var ie=require("@galacticcouncil/common");var wa={Aave:"AAVE",LBP:"LBP",Omnipool:"OMNI",Stableswap:"STBL",XYK:"XYK",HSM:"HSM"},{logger:Oa}=ie.log;var{withTimeout:qa}=ft;var h=require("@galacticcouncil/math-omnipool"),K=Rt(require("big.js")),w=class{static calculateSpotPrice(t,e,s,a){return(0,h.calculate_spot_price)(t,e,s,a)}static calculateLrnaSpotPrice(t,e){return(0,h.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,s,a,i,o,n,r,l,u){return(0,h.calculate_in_given_out)(t,e,s,a,i,o,n,r,l,u)}static calculateLrnaInGivenOut(t,e,s,a,i,o){return(0,h.calculate_lrna_in_given_out)(t,e,s,a,i,o)}static calculateOutGivenIn(t,e,s,a,i,o,n,r,l,u){return(0,h.calculate_out_given_in)(t,e,s,a,i,o,n,r,l,u)}static calculateOutGivenLrnaIn(t,e,s,a,i,o){return(0,h.calculate_out_given_lrna_in)(t,e,s,a,i,o)}static calculateShares(t,e,s,a){return(0,h.calculate_shares)(t,e,s,a)}static calculateLiquidityOut(t,e,s,a,i,o,n,r){return(0,h.calculate_liquidity_out)(t,e,s,a,i,o,n,r)}static calculateLiquidityLRNAOut(t,e,s,a,i,o,n,r){return(0,h.calculate_liquidity_lrna_out)(t,e,s,a,i,o,n,r)}static calculateCapDifference(t,e,s,a){let i=(0,K.default)(e),o=(0,K.default)(t),n=(0,K.default)(a),r=(0,K.default)(s),l=(0,K.default)(10).pow(18),u=r.div(l);if(i.div(n).lt(u)){let b=u.times(n).minus(i).times(o),d=i.times((0,K.default)(1).minus(u));return b.div(d).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,s,a){return(0,h.calculate_liquidity_hub_in)(t,e,s,a)}static isSellAllowed(t){return(0,h.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,h.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,h.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,h.is_remove_liquidity_allowed)(t)}static recalculateAssetFee(t,e,s,a,i,o,n,r,l,u,p){return(0,h.recalculate_asset_fee)(t,e,s,a,i,o,n,r,l,u,p)}static recalculateProtocolFee(t,e,s,a,i,o,n,r,l,u,p){return(0,h.recalculate_protocol_fee)(t,e,s,a,i,o,n,r,l,u,p)}static verifyAssetCap(t,e,s,a){return(0,h.verify_asset_cap)(t,e,s,a)}};var oe=require("@galacticcouncil/common");var{FeeUtils:q}=S,Tt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new c(t)}constructor(t){this.type="Omnipool",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.hubAssetId=t.hubAssetId}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:a.hubReserves,hubReservesOut:i.hubReserves,sharesIn:a.shares,sharesOut:i.shares,decimalsIn:a.decimals,decimalsOut:i.decimals,balanceIn:a.balance,balanceOut:i.balance,tradeableIn:a.tradeable,tradeableOut:i.tradeable,assetInEd:a.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,s){let a=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,s),o=a===0n?0:A.calculateBuyFee(a,i),n=[],r=w.isSellAllowed(t.tradeableIn),l=w.isBuyAllowed(t.tradeableOut);(!r||!l)&&n.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&n.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&n.push("MaxOutRatioExceeded");let p=t.balanceIn/this.maxInRatio;return i>p&&n.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:a,amountOut:e,feePct:o,errors:n}}validateAndSell(t,e,s){let a=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,s),o=A.calculateSellFee(a,i),n=[],r=w.isSellAllowed(t.tradeableIn),l=w.isBuyAllowed(t.tradeableOut);(!r||!l)&&n.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&n.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&n.push("MaxInRatioExceeded");let p=t.balanceOut/this.maxOutRatio;return i>p&&n.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:i,feePct:o,errors:n}}calculateInGivenOut(t,e,s){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,s);let a=w.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?q.toRaw(s.assetFee).toString():"0",s?q.toRaw(s.protocolFee).toString():"0",s?q.toRaw(s.maxSlipFee).toString():"0"),i=BigInt(a);return i<0n?0n:i}calculateLrnaInGivenOut(t,e,s){let a=w.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?q.toRaw(s.assetFee).toString():"0",s?q.toRaw(s.maxSlipFee).toString():"0"),i=BigInt(a);return i<0n?0n:i}calculateOutGivenIn(t,e,s){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,s);let a=w.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?q.toRaw(s.assetFee).toString():"0",s?q.toRaw(s.protocolFee).toString():"0",s?q.toRaw(s.maxSlipFee).toString():"0"),i=BigInt(a);return i<0n?0n:i}calculateOutGivenLrnaIn(t,e,s){let a=w.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?q.toRaw(s.assetFee).toString():"0",s?q.toRaw(s.maxSlipFee).toString():"0"),i=BigInt(a);return i<0n?0n:i}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=w.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceLrnaInGivenOut(t){let e=w.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=w.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}spotPriceOutGivenLrnaIn(t){let e=w.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}normalizeSpot(t,e,s){let a=e-s;if(a===0)return t;let i=oe.big.pow10(Math.abs(a));return a>0?t*i:t/i}};var j=require("polkadot-api"),je=require("@polkadot-api/utils"),Q=require("rxjs"),Qe=require("@galacticcouncil/common");var{FeeUtils:bi}=S;var{FeeUtils:Ei}=S,Ri=j.Binary.toHex(j.Binary.fromText("omnipool")),ki=(0,j.Enum)("Short");var x=require("@galacticcouncil/math-stableswap"),k=class{static getPoolAddress(t){return(0,x.pool_account_name)(t)}static defaultPegs(t){let e=[];for(let s=0;s<t;s++)e.push(["1","1"]);return e}static calculateAmplification(t,e,s,a,i){return(0,x.calculate_amplification)(t,e,s,a,i)}static calculateInGivenOut(t,e,s,a,i,o,n){return(0,x.calculate_in_given_out)(t,e,s,a,i,o,n)}static calculateAddOneAsset(t,e,s,a,i,o,n){return(0,x.calculate_add_one_asset)(t,e,s,a,i,o,n)}static calculateSharesForAmount(t,e,s,a,i,o,n){return(0,x.calculate_shares_for_amount)(t,e,s,a,i,o,n)}static calculateOutGivenIn(t,e,s,a,i,o,n){return(0,x.calculate_out_given_in)(t,e,s,a,i,o,n)}static calculateLiquidityOutOneAsset(t,e,s,a,i,o,n){return(0,x.calculate_liquidity_out_one_asset)(t,e,s,a,i,o,n)}static calculateShares(t,e,s,a,i,o){return(0,x.calculate_shares)(t,e,s,a,i,o)}static calculateSpotPriceWithFee(t,e,s,a,i,o,n,r){return(0,x.calculate_spot_price_with_fee)(t,e,s,a,i,o,n,r)}static recalculatePegs(t,e,s,a,i,o){let n=(0,x.recalculate_peg)(t,e,s,a,i,o);return JSON.parse(n)}};var dt=require("@galacticcouncil/common");var{FeeUtils:et}=S,st=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;isRampPeriod;id;fee;totalIssuance;pegs;static fromPool(t){return new c(t)}constructor(t){this.type="Stableswap",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.amplification=t.amplification,this.isRampPeriod=t.isRampPeriod,this.id=t.id,this.fee=t.fee,this.totalIssuance=t.totalIssuance,this.pegs=t.pegs}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:i.balance,decimalsIn:a.decimals,decimalsOut:i.decimals,tradeableIn:this.id===t?15:a.tradeable,tradeableOut:this.id===e?15:i.tradeable,assetInEd:a.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,s){let a=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,s),o=a===0n?0:A.calculateBuyFee(a,i),n=[],r=w.isSellAllowed(t.tradeableIn),l=w.isBuyAllowed(t.tradeableOut);return(!r||!l)&&n.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&n.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:a,amountOut:e,feePct:o,errors:n}}validateAndSell(t,e,s){let a=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,s),o=A.calculateSellFee(a,i),n=[],r=w.isSellAllowed(t.tradeableIn),l=w.isBuyAllowed(t.tradeableOut);return(!r||!l)&&n.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&n.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:a,amountOut:i,feePct:o,errors:n}}calculateIn(t,e,s){let a=k.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),s?et.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateAddOneAsset(t,e,s){let a=k.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),s?et.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateSharesForAmount(t,e,s){let a=k.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),s?et.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateInGivenOut(t,e,s){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,s):t.assetIn==this.id?this.calculateSharesForAmount(t,e,s):this.calculateIn(t,e,s)}spotPriceInGivenOut(t){let e=k.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());return this.normalizeSpot(BigInt(e),t.assetOut===this.id,t.assetIn===this.id,t.decimalsOut,t.decimalsIn)}calculateOut(t,e,s){let a=k.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),s?et.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateWithdrawOneAsset(t,e,s){let a=k.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),s?et.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateShares(t,e,s){let a=k.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),s?et.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateOutGivenIn(t,e,s){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,s):t.assetOut==this.id?this.calculateShares(t,e,s):this.calculateOut(t,e,s)}spotPriceOutGivenIn(t){let e=k.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());return this.normalizeSpot(BigInt(e),t.assetIn===this.id,t.assetOut===this.id,t.decimalsIn,t.decimalsOut)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:s,decimals:a})=>({asset_id:e,amount:s,decimals:a}));return JSON.stringify(t,ut.jsonFormatter)}getAssets(t,e){let s={asset_id:Number(t),amount:e.toString()};return JSON.stringify([s],ut.jsonFormatter)}normalizeSpot(t,e,s,a,i){return e?t*dt.big.pow10(dt.RUNTIME_DECIMALS-i):s?t/dt.big.pow10(i-a):t}};var ne=require("polkadot-api"),Ze=require("@polkadot-api/utils"),ts=require("@noble/hashes/blake2b"),gt=require("rxjs"),re=require("@galacticcouncil/common");var{FeeUtils:go}=S;var T=require("@galacticcouncil/math-xyk"),X=class{static getSpotPrice(t,e,s){return(0,T.get_spot_price)(t,e,s)}static calculateInGivenOut(t,e,s){return(0,T.calculate_in_given_out)(t,e,s)}static calculateOutGivenIn(t,e,s){return(0,T.calculate_out_given_in)(t,e,s)}static calculatePoolTradeFee(t,e,s){return(0,T.calculate_pool_trade_fee)(t,e,s)}static calculateLiquidityIn(t,e,s){return(0,T.calculate_liquidity_in)(t,e,s)}static calculateSpotPrice(t,e){return(0,T.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,s,a){return(0,T.calculate_spot_price_with_fee)(t,e,s,a)}static calculateShares(t,e,s){return(0,T.calculate_shares)(t,e,s)}static calculateLiquidityOutAssetA(t,e,s,a){return(0,T.calculate_liquidity_out_asset_a)(t,e,s,a)}static calculateLiquidityOutAssetB(t,e,s,a){return(0,T.calculate_liquidity_out_asset_b)(t,e,s,a)}};var ce=require("@galacticcouncil/common");var{FeeUtils:le}=S,vt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t)}constructor(t){this.type="XYK",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:a.decimals,decimalsOut:i.decimals,balanceIn:a.balance,balanceOut:i.balance,assetInEd:a.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,s){let a=this.calculateInGivenOut(t,e),i=this.calculateTradeFee(a,s),o=le.toPct(s.exchangeFee),n=a+i,r=[];(e<this.minTradingLimit||a<t.assetInEd)&&r.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&r.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return n>u&&r.push("MaxInRatioExceeded"),{amountIn:n,calculatedIn:a,amountOut:e,feePct:o,errors:r}}validateAndSell(t,e,s){let a=this.calculateOutGivenIn(t,e),i=this.calculateTradeFee(a,s),o=le.toPct(s.exchangeFee),n=a-i,r=[];(e<this.minTradingLimit||a<t.assetOutEd)&&r.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&r.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return n>u&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:n,feePct:o,errors:r}}calculateInGivenOut(t,e){let s=X.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(s);return a<0n?0n:a}calculateOutGivenIn(t,e){let s=X.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(s);return a<0n?0n:a}spotPriceInGivenOut(t){let e=X.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){let e=X.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}calculateTradeFee(t,e){let s=X.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(s)}normalizeSpot(t,e,s){let a=e-s;if(a===0)return t;let i=ce.big.pow10(Math.abs(a));return a>0?t*i:t/i}};var ss=require("polkadot-api"),as=require("rxjs");var at=require("@galacticcouncil/common");var Bt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t)}constructor(t){this.type="Aave",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:i.balance,decimalsIn:a.decimals,decimalsOut:i.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,s){let a=this.calculateInGivenOut(t,e),i=[];return e>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:i}}validateAndSell(t,e,s){let a=this.calculateOutGivenIn(t,e),i=[];return a>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:i}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){return at.big.toBigInt(1,at.RUNTIME_DECIMALS)}spotPriceOutGivenIn(t){return at.big.toBigInt(1,at.RUNTIME_DECIMALS)}calculateTradeFee(t,e){return 0n}};var ue=require("polkadot-api"),os=require("@polkadot-api/utils"),At=require("rxjs"),ns=require("viem"),Ht=require("@galacticcouncil/common");var{ERC20:un}=Ht.erc20;var B=require("@galacticcouncil/math-hsm"),L=class{static calculateCollateralInGivenHollarOut(t,e,s){return(0,B.calculate_collateral_in_given_hollar_out)(t,e,s)}static calculateCollateralOutGivenHollarIn(t,e,s){return(0,B.calculate_collateral_out_given_hollar_in)(t,e,s)}static calculateHollarOutGivenCollateralIn(t,e,s){return(0,B.calculate_hollar_out_given_collateral_in)(t,e,s)}static calculateHollarInGivenCollateralOut(t,e,s){return(0,B.calculate_hollar_in_given_collateral_out)(t,e,s)}static calculateImbalance(t,e,s){return(0,B.calculate_imbalance)(t,e,s)}static calculateBuybackLimit(t,e){return(0,B.calculate_buyback_limit)(t,e)}static calculateBuybackPriceWithFee(t,e,s){return(0,B.calculate_buyback_price_with_fee)(t,e,s)}static calculateMaxPrice(t,e){return(0,B.calculate_max_price)(t,e)}};var F=require("@galacticcouncil/common");var{FeeUtils:it}=S,Ft=class c extends st{hsmAddress;hsmMintCapacity;hollarId;hollarH160;collateralId;collateralBalance;maxBuyPriceCoefficient;maxInHolding;purchaseFee;buyBackFee;buyBackRate;static fromPool(t){return new c(t)}constructor(t){super(t),this.type="HSM",this.hsmAddress=t.hsmAddress,this.hsmMintCapacity=t.hsmMintCapacity,this.hollarId=t.hollarId,this.hollarH160=t.hollarH160,this.collateralId=t.collateralId,this.collateralBalance=t.collateralBalance,this.maxBuyPriceCoefficient=t.maxBuyPriceCoefficient,this.maxInHolding=t.maxInHolding,this.purchaseFee=t.purchaseFee,this.buyBackFee=t.buyBackFee,this.buyBackRate=t.buyBackRate}validatePair(t,e){return!0}parsePair(t,e){return super.parsePair(t,e)}validateTradeHollarIn(t,e,s){let a=this.parsePair(t.assetOut,t.assetIn),i=super.calculateInGivenOut(a,e,{fee:this.fee}),o=this.calculateBuybackLimit(t);e>o&&s.push("MaxBuyBackExceeded");let n=this.calculateMaxPrice(t);return this.calculateBuyPrice(t,e,i)>n&&s.push("MaxBuyPriceExceeded"),i>this.collateralBalance&&s.push("InsufficientCollateral"),s}validateTradeHollarOut(t,e,s){return this.collateralBalance+t>this.maxInHolding&&s.push("MaxHoldingExceeded"),e>this.hsmMintCapacity&&s.push("FacilitatorCapacityExceeded"),s}validateTradeConstraints(t,e,s){let a=[];return t.assetIn===this.hollarId?this.validateTradeHollarIn(t,e,a):this.validateTradeHollarOut(e,s,a)}validateAndBuy(t,e){let s=this.calculateInGivenOut(t,e),a=this.validateTradeConstraints(t,s,e);return{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:a}}validateAndSell(t,e){let s=this.calculateOutGivenIn(t,e),a=this.validateTradeConstraints(t,e,s);return{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:a}}calculateHollarInGivenCollateralOut(t,e){let s=super.calculateInGivenOut(t,e,{fee:this.fee}),a=L.calculateHollarInGivenCollateralOut(e.toString(),s.toString(),it.toRaw(this.buyBackFee).toString());return BigInt(a)}calculateCollateralInGivenHollarOut(t){let e=this.getCollateralPeg(),s=L.calculateCollateralInGivenHollarOut(t.toString(),JSON.stringify(e),it.toRaw(this.purchaseFee).toString());return BigInt(s)}calculateInGivenOut(t,e){return t.assetOut==this.hollarId?this.calculateCollateralInGivenHollarOut(e):this.calculateHollarInGivenCollateralOut(t,e)}calculateCollateralOutGivenHollarIn(t,e){let s=super.calculateOutGivenIn(t,e,{fee:this.fee}),a=L.calculateCollateralOutGivenHollarIn(e.toString(),s.toString(),it.toRaw(this.buyBackFee).toString());return BigInt(a)}calculateHollarOutGivenCollateralIn(t){let e=this.getCollateralPeg(),s=L.calculateHollarOutGivenCollateralIn(t.toString(),JSON.stringify(e),it.toRaw(this.purchaseFee).toString());return BigInt(s)}calculateOutGivenIn(t,e){return t.assetIn==this.hollarId?this.calculateCollateralOutGivenHollarIn(t,e):this.calculateHollarOutGivenCollateralIn(e)}calculateImbalance(t){let e=this.getCollateralPeg(),s=L.calculateImbalance(t.balanceIn.toString(),JSON.stringify(e),t.balanceOut.toString());return BigInt(s)}calculateBuybackLimit(t){let e=this.calculateImbalance(t),s=L.calculateBuybackLimit(e.toString(),it.toRaw(this.buyBackRate).toString());return BigInt(s)}calculateBuyPrice(t,e,s){let a=L.calculateBuybackPriceWithFee(s.toString(),e.toString(),it.toRaw(this.buyBackFee).toString()),[i,o]=JSON.parse(a),n=F.big.pow10(t.decimalsIn+F.RUNTIME_DECIMALS-t.decimalsOut);return BigInt(i)*n/BigInt(o)}calculateMaxPrice(t){let e=this.getCollateralPeg(),s=L.calculateMaxPrice(JSON.stringify(e),this.maxBuyPriceCoefficient.toString()),[a,i]=JSON.parse(s),o=F.big.pow10(F.RUNTIME_DECIMALS-t.decimalsOut);return BigInt(a)*o/BigInt(i)}spotPriceInGivenOut(t){let e=F.big.toBigInt(1,t.decimalsOut),a=this.calculateInGivenOut(t,e)*F.big.pow10(F.RUNTIME_DECIMALS-t.decimalsOut);return this.normalizeSpotPrice(a,t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){let e=F.big.toBigInt(1,t.decimalsIn),a=this.calculateOutGivenIn(t,e)*F.big.pow10(F.RUNTIME_DECIMALS-t.decimalsIn);return this.normalizeSpotPrice(a,t.decimalsIn,t.decimalsOut)}getCollateralPeg(){let t=this.tokens.findIndex(a=>a.id!==this.hollarId),e=this.pegs[t],s=this.tokens[t].decimals;return this.isDefaultPeg(e)?[F.big.toBigInt(1,18).toString(),F.big.toBigInt(1,s).toString()]:e}isDefaultPeg(t){let[e,s]=t;return Array.isArray(t)&&t.length===2&&e==="1"&&s==="1"}normalizeSpotPrice(t,e,s){let a=e-s;if(a===0)return t;let i=F.big.pow10(Math.abs(a));return a>0?t*i:t/i}};var Nt=require("polkadot-api"),cs=require("@polkadot-api/utils"),ot=require("rxjs"),us=require("viem"),qt=require("@galacticcouncil/common");var{FeeUtils:qn}=S,{H160:Gn}=qt.h160;var ht=class{static get(t){switch(t.type){case"Aave":return Bt.fromPool(t);case"XYK":return vt.fromPool(t);case"Omnipool":return Tt.fromPool(t);case"LBP":return St.fromPool(t);case"Stableswap":return st.fromPool(t);case"HSM":return Ft.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var pe=require("@galacticcouncil/common"),Gt=require("rxjs");var _t=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var{logger:Fr}=pe.log;var bt=class{getProposals(t,e,s){let a=s.filter(m=>m.type==="XYK"),i=s.filter(m=>m.type!=="XYK"),o=new Set(i.map(m=>m.tokens).flat().map(m=>m.id)),n=o.has(t),r=o.has(e),l=new ct,u=m=>{let y=kt(m),f=Object.keys(y),D=f.flatMap(R=>y[R]);return l.buildAndPopulateGraph(f,D)};if(!n&&!r){let m=a.filter(D=>D.tokens.find(R=>R.id===t)||D.tokens.find(R=>R.id===e)),y=u(m),f=l.findPaths(y,t,e);return this.parsePaths(f)}if(n&&r){let m=u(i),y=l.findPaths(m,t,e);return this.parsePaths(y)}let p=n?e:t,b=a.filter(m=>m.tokens.some(y=>y.id===p));if(b.length===0)return[];let d=[...i,...b],I=u(d),g=l.findPaths(I,t,e);return this.parsePaths(g)}parsePaths(t){let e=[];for(let s of t){let a=[];for(let i=0;i<s.length;i++){let o=s[i],n=s[i+1];if(n==null)break;a.push(this.toEdge(o,n))}e.push(a)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var nt=class{routeSuggester;routeProposals;ctx;filter={};constructor(t){this.ctx=t,this.routeSuggester=new bt,this.routeProposals=new Map}async withFilter(t){this.filter=t||{},this.routeProposals.clear(),this.onFilterChanged()}onFilterChanged(){}buildRouteKey(t,e,s){return`${t}->${e}::${s.length}`}applyPoolFilter(t){let{useOnly:e=[],exclude:s=[]}=this.filter,a=new Set(e),i=new Set(s);return t.filter(o=>i.has(o.type)?!1:a.size>0?a.has(o.type):!0)}async getPools(){let t=await this.ctx.getPools();return this.applyPoolFilter(t)}async getRoutes(t,e){let s=await this.getPools();return this.validateInput(t,e,s),this.getPaths(t,e,s)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}async getRouteableAssets(t){let e=await this.getTradeableAssets();return(await Promise.all(e.filter(a=>a!==t).map(a=>this.getRoutes(a,t)))).filter(a=>a.length>0).map(([a])=>a[0].assetIn).sort()}validateInput(t,e,s){if(s.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let a=this.getAssets(s);if(!a.has(t))throw new Error(t+" is not supported asset");if(!a.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(s)}getAssets(t){let e=t.map(s=>s.tokens.map(a=>a.id)).flat().sort((s,a)=>s>a?1:-1);return new Set(e)}getPaths(t,e,s){let a=this.toPoolsMap(s);return this.getProposals(t,e,s).filter(o=>this.validPath(o,a)).map(o=>this.toHops(o,a))}getProposals(t,e,s){let a=this.buildRouteKey(t,e,s);if(this.routeProposals.has(a))return this.routeProposals.get(a);let i=this.routeSuggester.getProposals(t,e,s);return this.routeProposals.set(a,i),i}validPath(t,e){return t.length>0&&t.map(s=>this.validEdge(s,e)).reduce((s,a)=>s&&a)}validEdge([t,e,s],a){return a.get(t)?.validatePair(e,s)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,ht.get(e)]))}toHops(t,e){return t.map(([s,a,i])=>{let o=e.get(s);return{poolAddress:s,poolId:o?.id,pool:o?.type,assetIn:a,assetOut:i}})}};var P=require("@galacticcouncil/common");var Vt=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Vt||{}),Ut=(s=>(s.Dca="Dca",s.TwapSell="TwapSell",s.TwapBuy="TwapBuy",s))(Ut||{}),Wt=(s=>(s.OrderTooSmall="OrderTooSmall",s.OrderTooBig="OrderTooBig",s.OrderImpactTooBig="OrderImpactTooBig",s))(Wt||{});var{FeeUtils:de}=S,rt=class extends nt{mlr;constructor(t){super(t),this.mlr=new Map}onFilterChanged(){this.mlr.clear()}buildCtxSync(t,e,s){let a=super.validateInput(t,e,s),i=super.getPaths(t,e,s);if(!i.length)throw new _t(t,e);return{paths:i,pools:s,poolsMap:a}}async withCtx(t,e,s){let a=await super.getPools(),i=this.buildCtxSync(t,e,a);return s(i)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((s,a)=>{let i=s[s.length-1].amountOut,o=a[a.length-1].amountOut;return i>o?-1:1});return e.find(s=>s.every(a=>a.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(s=>s.tradeFeeRange).length>0){let s=t.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,o)=>i+o),a=t.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,o)=>i+o);return[s,a]}}getPoolFeeRange(t,e){let s=t.min?de.toPct(t.min):void 0,a=t.max?de.toPct(t.max):void 0;if(s&&a)return[s,Math.max(a,e)]}async getBestSell(t,e,s){return this.getSell(t,e,s)}getSellSpot(t){let e=t[t.length-1];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getSell(t,e,s,a){return this.withCtx(t,e,async({paths:i,poolsMap:o})=>{let n;if(a)n=await this.toSellSwaps(s,a,o);else{let r=i.map(u=>this.toSellSwaps(s,u,o)),l=await Promise.all(r);n=this.findBestSellRoute(l)}return this.buildSell(o,n)})}async getSells(t,e,s){return this.withCtx(t,e,async({paths:a,poolsMap:i})=>{let o=a.map(r=>this.toSellSwaps(s,r,i));return(await Promise.all(o)).filter(r=>r.every(l=>l.errors.length==0)).map(r=>this.buildSell(i,r)).sort((r,l)=>r.amountOut>l.amountOut?-1:1)})}buildSell(t,e){let s=e[0],a=e[e.length-1],i=this.isDirectTrade(e),o=this.getSellSpot(e),n=a.amountOut,r=i?a.calculatedOut:this.calculateDelta0Y(s.amountIn,e,t),l=r-n,u=this.getRouteFeeRange(e),p=i?a.tradeFeePct:A.calculateSellFee(r,n),b=C.mulSpot(s.amountIn,o,s.assetInDecimals,a.assetOutDecimals),d=A.calculateDiffToRef(r,b);return{type:"Sell",amountIn:s.amountIn,amountOut:a.amountOut,spotPrice:o,tradeFee:l,tradeFeePct:p,tradeFeeRange:u,priceImpactPct:d,swaps:e,toHuman(){return{type:"Sell",amountIn:P.big.toDecimal(s.amountIn,s.assetInDecimals),amountOut:P.big.toDecimal(a.amountOut,a.assetOutDecimals),spotPrice:P.big.toDecimal(o,P.RUNTIME_DECIMALS),tradeFee:P.big.toDecimal(l,a.assetOutDecimals),tradeFeePct:p,tradeFeeRange:u,priceImpactPct:d,swaps:e.map(I=>I.toHuman())}}}}calculateSpot(t){return t.map(e=>e.spotPrice).reduce((e,s)=>e*s/10n**BigInt(P.RUNTIME_DECIMALS))}calculateDelta0Y(t,e,s){let a=[];for(let i=0;i<e.length;i++){let o=e[i],n=s.get(o.poolAddress);if(n==null)throw new Error("Pool does not exit");let r=n.parsePair(o.assetIn,o.assetOut),l;i>0?l=a[i-1]:l=t;let u=n.calculateOutGivenIn(r,l);a.push(u)}return a[a.length-1]}async calculateMostLiquidRoute(t,e,s){let{paths:a,pools:i,poolsMap:o}=s,l=i.filter(g=>g.tokens.some(m=>m.id===t)).map(g=>g.type==="Aave"?g.tokens:g.tokens.filter(m=>m.id===t)).map(g=>g.map(m=>m.balance).reduce((m,y)=>m+y)).sort((g,m)=>m<g?-1:1)[0],u=C.getFraction(l,.1),p=await Promise.all(a.map(g=>this.toSellSwaps(u,g,o))),d=this.findBestSellRoute(p).map(g=>({poolAddress:g.poolAddress,poolId:g?.poolId,pool:g.pool,assetIn:g.assetIn,assetOut:g.assetOut})),I=this.buildRouteKey(t,e,i);return this.mlr.set(I,d),d}async toSellSwaps(t,e,s){let a=[];for(let i=0;i<e.length;i++){let o=e[i],n=s.get(o.poolAddress);if(n==null)throw new Error("Pool does not exit");let r=n.parsePair(o.assetIn,o.assetOut),l;i>0?l=a[i-1].amountOut:l=typeof t=="string"?P.big.toBigInt(t,r.decimalsIn):t;let u=await this.ctx.getPoolFees(r,n),{amountOut:p,calculatedOut:b,feePct:d,errors:I}=n.validateAndSell(r,l,u),g=this.getPoolFeeRange(u,d),m=n.spotPriceOutGivenIn(r),y=C.mulSpot(l,m,r.decimalsIn,r.decimalsOut),f=A.calculateDiffToRef(b,y);a.push({...o,assetInDecimals:r.decimalsIn,assetOutDecimals:r.decimalsOut,amountIn:l,amountOut:p,calculatedOut:b,spotPrice:m,tradeFeePct:d,tradeFeeRange:g,priceImpactPct:f,errors:I,isSupply(){return n.type==="Aave"&&n.tokens[0].id===o.assetIn},isWithdraw(){return n.type==="Aave"&&n.tokens[1].id===o.assetIn},toHuman(){return{...o,amountIn:P.big.toDecimal(l,r.decimalsIn),amountOut:P.big.toDecimal(p,r.decimalsOut),calculatedOut:P.big.toDecimal(b,r.decimalsOut),spotPrice:P.big.toDecimal(m,P.RUNTIME_DECIMALS),tradeFeePct:d,tradeFeeRange:g,priceImpactPct:f,errors:I}}})}return a}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async s=>{let a=this.buildRouteKey(t,e,s.pools),i=this.mlr.get(a);return i||this.calculateMostLiquidRoute(t,e,s)})}async getSpotPrice(t,e){return this.withCtx(t,e,async s=>{let{pools:a,poolsMap:i}=s,o=this.buildRouteKey(t,e,a),n=this.mlr.get(o);n||(n=await this.calculateMostLiquidRoute(t,e,s));let r=await this.toSellSwaps("1",n,i);return{amount:this.getSellSpot(r),decimals:P.RUNTIME_DECIMALS}}).catch(()=>{})}findBestBuyRoute(t){let e=t.sort((s,a)=>{let i=s[0].amountIn,o=a[0].amountIn;return i>o?1:-1});return e.find(s=>s.every(a=>a.errors.length==0))||e[0]}async getBestBuy(t,e,s){return this.getBuy(t,e,s)}getBuySpot(t){let e=t[0];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getBuy(t,e,s,a){return this.withCtx(t,e,async({paths:i,poolsMap:o})=>{let n;if(a)n=await this.toBuySwaps(s,a,o);else{let r=i.map(u=>this.toBuySwaps(s,u,o)),l=await Promise.all(r);n=this.findBestBuyRoute(l)}return this.buildBuy(o,n)})}async getBuys(t,e,s){return this.withCtx(t,e,async({paths:a,poolsMap:i})=>{let o=a.map(r=>this.toBuySwaps(s,r,i));return(await Promise.all(o)).filter(r=>r.every(l=>l.errors.length==0)).map(r=>this.buildBuy(i,r)).sort((r,l)=>r.amountIn>l.amountIn?1:-1)})}buildBuy(t,e){let s=e[e.length-1],a=e[0],i=this.isDirectTrade(e),o=this.getBuySpot(e),n=a.amountIn,r=i?a.calculatedIn:this.calculateDelta0X(s.amountOut,e,t),l=n-r,u=this.getRouteFeeRange(e),p=i?a.tradeFeePct:A.calculateBuyFee(r,n),b=C.mulSpot(s.amountOut,o,s.assetOutDecimals,a.assetInDecimals),d;return r===0n?d=-100:d=A.calculateDiffToRef(b,r),{type:"Buy",amountOut:s.amountOut,amountIn:a.amountIn,spotPrice:o,tradeFee:l,tradeFeePct:p,tradeFeeRange:u,priceImpactPct:d,swaps:e,toHuman(){return{type:"Buy",amountOut:P.big.toDecimal(s.amountOut,s.assetOutDecimals),amountIn:P.big.toDecimal(a.amountIn,a.assetInDecimals),spotPrice:P.big.toDecimal(o,P.RUNTIME_DECIMALS),tradeFee:P.big.toDecimal(l,a.assetInDecimals),tradeFeePct:p,tradeFeeRange:u,priceImpactPct:d,swaps:e.map(I=>I.toHuman())}}}}calculateDelta0X(t,e,s){let a=[];for(let i=e.length-1;i>=0;i--){let o=e[i],n=s.get(o.poolAddress);if(n==null)throw new Error("Pool does not exit");let r=n.parsePair(o.assetIn,o.assetOut),l;i==e.length-1?l=t:l=a[0];let u=n.calculateInGivenOut(r,l);a.unshift(u)}return a[0]}async toBuySwaps(t,e,s){let a=[];for(let i=e.length-1;i>=0;i--){let o=e[i],n=s.get(o.poolAddress);if(n==null)throw new Error("Pool does not exit");let r=n.parsePair(o.assetIn,o.assetOut),l;i==e.length-1?l=typeof t=="string"?P.big.toBigInt(t,r.decimalsOut):t:l=a[0].amountIn;let u=await this.ctx.getPoolFees(r,n),{amountIn:p,calculatedIn:b,feePct:d,errors:I}=n.validateAndBuy(r,l,u),g=this.getPoolFeeRange(u,d),m=n.spotPriceInGivenOut(r),y=C.mulSpot(l,m,r.decimalsOut,r.decimalsIn),f;b===0n?f=-100:f=A.calculateDiffToRef(y,b),a.unshift({...o,assetInDecimals:r.decimalsIn,assetOutDecimals:r.decimalsOut,amountOut:l,amountIn:p,calculatedIn:b,spotPrice:m,tradeFeePct:d,tradeFeeRange:g,priceImpactPct:f,errors:I,isSupply(){return n.type==="Aave"&&n.tokens[0].id===o.assetIn},isWithdraw(){return n.type==="Aave"&&n.tokens[1].id===o.assetIn},toHuman(){return{...o,amountOut:P.big.toDecimal(l,r.decimalsOut),amountIn:P.big.toDecimal(p,r.decimalsIn),calculatedIn:P.big.toDecimal(b,r.decimalsIn),spotPrice:P.big.toDecimal(m,P.RUNTIME_DECIMALS),tradeFeePct:d,tradeFeeRange:g,priceImpactPct:f,errors:I}}})}return a}};var v=require("@galacticcouncil/common");var ge=6e3,$t=1000000000000000n,Pt=6,Xt=-5,Yt=216e5,Hl=3,he=.1,be=6;var zt=require("polkadot-api");var U=class{static build(t){return t.map(({assetIn:e,assetOut:s,pool:a,poolId:i})=>a==="Stableswap"?{pool:(0,zt.Enum)("Stableswap",i),asset_in:e,asset_out:s}:{pool:(0,zt.Enum)(a),asset_in:e,asset_out:s})}};var Et=class{schedulerOptions;router;constructor(t,e={}){this.router=new rt(t),this.router.withFilter({exclude:["HSM"]}),this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??$t})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,s,a,i){let o=await this.router.getBestSell(t,e,s),{amountIn:n,swaps:r,priceImpactPct:l}=o,u=r[0],p=r[r.length-1],{assetInDecimals:b}=u,{assetOutDecimals:d}=p,I=Math.abs(l),g=await this.getMinimumOrderBudget(t,b),m=this.getOptimalTradeCount(I),y=this.getMaximumTradeCount(n,g,a),f=i||Math.min(m,y),D=Math.round(a/f),R=n/BigInt(f),_=await this.router.getBestSell(t,e,R),Y=n<g,J=[];Y&&J.push("OrderTooSmall");let W=_.amountOut*BigInt(f),ye=this.toBlockPeriod(D),fe=_.tradeFee*BigInt(f),Se=U.build(r),Kt={assetIn:t,assetOut:e,errors:J,maxTradeCount:y,tradeCount:f,tradeFee:fe,tradeImpactPct:_.priceImpactPct,tradePeriod:ye,tradeRoute:Se,type:"Dca"};return{...Kt,amountIn:n,amountOut:W,tradeAmountIn:_.amountIn,tradeAmountOut:_.amountOut,toHuman(){return{...Kt,amountIn:v.big.toDecimal(n,b),amountOut:v.big.toDecimal(W,d),tradeAmountIn:v.big.toDecimal(_.amountIn,b),tradeAmountOut:v.big.toDecimal(_.amountOut,d)}}}}async getMinimumOrderBudget(t,e){if(0===t)return this.minOrderBudget;let s=await this.router.getSpotPrice(0,t);if(s)return C.mulSpot(this.minOrderBudget,s.amount,12,e);let a=await this.router.getSpotPrice(t,0);if(a)return C.divSpot(this.minOrderBudget,a.amount,12,e);throw new Error("Unable to calculate order budget")}getMaximumTradeCount(t,e,s){let a=e*2n/10n;if(a===0n)return 0;let i=Number(t/a),o=Math.floor(s/this.blockTime),n=Math.max(0,Math.floor(o*(1-.1)));return Math.min(i,n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getOpenBudgetDcaOrder(t,e,s,a){let i=await this.router.getBestSell(t,e,s),{swaps:o}=i,n=o[0],r=o[o.length-1],{assetInDecimals:l}=n,{assetOutDecimals:u}=r,p=await this.getMinimumOrderBudget(t,l),b=i.amountIn<p,d=[];b&&d.push("OrderTooSmall");let I=this.toBlockPeriod(a),g=U.build(o),m={assetIn:t,assetOut:e,errors:d,maxTradeCount:0,tradeCount:0,tradeFee:i.tradeFee,tradeImpactPct:i.priceImpactPct,tradePeriod:I,tradeRoute:g,type:"Dca"};return{...m,amountIn:0n,amountOut:0n,tradeAmountIn:i.amountIn,tradeAmountOut:i.amountOut,toHuman(){return{...m,amountIn:"0",amountOut:"0",tradeAmountIn:v.big.toDecimal(i.amountIn,l),tradeAmountOut:v.big.toDecimal(i.amountOut,u)}}}}async getTwapSellOrder(t,e,s){let a=await this.router.getBestSell(t,e,s),{amountIn:i,swaps:o,priceImpactPct:n}=a,r=o[0],l=o[o.length-1],{assetInDecimals:u}=r,{assetOutDecimals:p}=l,b=Math.abs(n),d=this.getTwapTradeCount(b),I=i/BigInt(d),[g,m]=await Promise.all([this.getMinimumOrderBudget(t,u),this.router.getBestSell(r.assetIn,l.assetOut,I)]),y=d===1,f=i<g,D=m.priceImpactPct<-5,R=[];f||y?R.push("OrderTooSmall"):D&&R.push("OrderImpactTooBig");let _=m.amountOut*BigInt(d),Y=m.tradeFee*BigInt(d),J=U.build(o),W={assetIn:t,assetOut:e,errors:R,tradeCount:d,tradeImpactPct:m.priceImpactPct,tradePeriod:6,tradeRoute:J,type:"TwapSell"};return{...W,amountIn:i,amountOut:_,tradeAmountIn:m.amountIn,tradeAmountOut:m.amountOut,tradeFee:Y,toHuman(){return{...W,amountIn:v.big.toDecimal(i,u),amountOut:v.big.toDecimal(_,p),tradeAmountIn:v.big.toDecimal(m.amountIn,u),tradeAmountOut:v.big.toDecimal(m.amountOut,p),tradeFee:v.big.toDecimal(Y,p)}}}}async getTwapBuyOrder(t,e,s){let a=await this.router.getBestBuy(t,e,s),{amountOut:i,swaps:o,priceImpactPct:n}=a,r=o[0],l=o[o.length-1],{assetInDecimals:u}=r,{assetOutDecimals:p}=l,b=Math.abs(n),d=this.getTwapTradeCount(b),I=i/BigInt(d),[g,m]=await Promise.all([this.getMinimumOrderBudget(t,u),this.router.getBestBuy(r.assetIn,l.assetOut,I)]),y=m.amountIn*BigInt(d),f=d===1,D=y<g,R=m.priceImpactPct<-5,_=[];D||f?_.push("OrderTooSmall"):R&&_.push("OrderImpactTooBig");let Y=m.tradeFee*BigInt(d),J=U.build(o),W={assetIn:t,assetOut:e,errors:_,tradeCount:d,tradeImpactPct:m.priceImpactPct,tradePeriod:6,tradeRoute:J,type:"TwapBuy"};return{...W,amountIn:y,amountOut:i,tradeAmountIn:m.amountIn,tradeAmountOut:m.amountOut,tradeFee:Y,toHuman(){return{...W,amountIn:v.big.toDecimal(y,u),amountOut:v.big.toDecimal(i,p),tradeAmountIn:v.big.toDecimal(m.amountIn,u),tradeAmountOut:v.big.toDecimal(m.amountOut,p),tradeFee:v.big.toDecimal(Y,u)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let a=216e5/(this.blockTime*6);return Math.round(a)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,s=Math.round(e);return Math.max(s,6)}};0&&(module.exports={DCA_TIME_RESERVE,DEFAULT_BLOCK_TIME,DEFAULT_MIN_BUDGET,ORDER_MIN_BLOCK_PERIOD,Router,TWAP_EXECUTION_INTERVAL,TWAP_MAX_DURATION,TWAP_MAX_PRICE_IMPACT,TWAP_TX_MULTIPLIER,TradeOrderError,TradeOrderType,TradeRouteBuilder,TradeRouter,TradeScheduler,TradeType});
|
|
1
|
+
"use strict";var Oe=Object.create;var ft=Object.defineProperty;var we=Object.getOwnPropertyDescriptor;var xe=Object.getOwnPropertyNames;var Te=Object.getPrototypeOf,ve=Object.prototype.hasOwnProperty;var tt=(c,t)=>{for(var e in t)ft(c,e,{get:t[e],enumerable:!0})},Jt=(c,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of xe(t))!ve.call(c,a)&&a!==e&&ft(c,a,{get:()=>t[a],enumerable:!(s=we(t,a))||s.enumerable});return c};var kt=(c,t,e)=>(e=c!=null?Oe(Te(c)):{},Jt(t||!c||!c.__esModule?ft(e,"default",{value:c,enumerable:!0}):e,c)),Be=c=>Jt(ft({},"__esModule",{value:!0}),c);var gs={};tt(gs,{DCA_TIME_RESERVE:()=>be,DEFAULT_BLOCK_TIME:()=>he,DEFAULT_MIN_BUDGET:()=>Yt,ORDER_MIN_BLOCK_PERIOD:()=>Pe,Router:()=>rt,TWAP_EXECUTION_INTERVAL:()=>yt,TWAP_MAX_DURATION:()=>Kt,TWAP_MAX_PRICE_IMPACT:()=>zt,TWAP_TX_MULTIPLIER:()=>Nl,TradeOrderError:()=>Xt,TradeOrderType:()=>$t,TradeRouteBuilder:()=>U,TradeRouter:()=>lt,TradeScheduler:()=>Rt,TradeType:()=>Wt});module.exports=Be(gs);var ct=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Ae=10,ut=class{isNotVisited(t,e){let s=!0;return e.forEach(a=>{(a[0]===t[0]||a[1]===t[1])&&(s=!1)}),s}findPaths(t,e,s){let a=[],i=new ct,o=[];for(o.push([e,""]),i.enqueue(o);i.size()>0;){let n=i.dequeue();if(!n||n.length>Ae)continue;let r=n[n.length-1];(s===null||r[0]===s)&&a.push(n),t.get(r[0])?.forEach(u=>{if(this.isNotVisited(u,n)){let m=[...n];m.push(u),i.enqueue(m)}})}return a}findShortestPaths(t,e,s){let a=[],i=new ct,o=[];o.push([e,""]),i.enqueue(o);let n=1/0;for(;i.size()>0;){let r=i.dequeue();if(!r)continue;let l=r[r.length-1];if(l[0]===s){r.length<n?(n=r.length,a.length=0,a.push(r)):r.length===n&&a.push(r);continue}let u=t.get(l[0]);for(let m of u??[])this.isNotVisited(m,r)&&i.enqueue([...r,m])}return a}buildAndPopulateGraph(t,e){let s=new Map;for(let a of t)s.set(parseInt(a),[]);for(let[a,i,o]of e)s.get(i)?.push([o,a]);return s}};function Ct(c){let t={};for(let e of c){let s=e.tokens.length;for(let a=0;a<s;a++){t[e.tokens[a].id]||(t[e.tokens[a].id]=[]);for(let i=0;i<s;i++){if(a==i)continue;let o=[e.address,e.tokens[a].id,e.tokens[i].id];t[e.tokens[a].id].push(o)}}}return t}var H=require("@galacticcouncil/math-lbp"),G=class{static getSpotPrice(t,e,s,a,i){return(0,H.get_spot_price)(t,e,s,a,i)}static calculateInGivenOut(t,e,s,a,i){return(0,H.calculate_in_given_out)(t,e,s,a,i)}static calculateOutGivenIn(t,e,s,a,i){return(0,H.calculate_out_given_in)(t,e,s,a,i)}static calculateLinearWeights(t,e,s,a,i){return(0,H.calculate_linear_weights)(t,e,s,a,i)}static calculatePoolTradeFee(t,e,s){return(0,H.calculate_pool_trade_fee)(t,e,s)}};var et=require("@galacticcouncil/common");var St={};tt(St,{withTimeout:()=>Fe});function Fe(c,t,e="timeout"){return new Promise((s,a)=>{let i=setTimeout(()=>a(new Error(e)),t);c.then(o=>{clearTimeout(i),s(o)},o=>{clearTimeout(i),a(o)})})}var C={};tt(C,{divSpot:()=>Ee,getFraction:()=>Re,mulScaled:()=>Zt,mulSpot:()=>_e});var Mt=require("@galacticcouncil/common");function Zt(c,t,e,s,a){let i=e+s-a,o=c*t;return i>0?o/BigInt(10)**BigInt(i):i<0?o*BigInt(10)**BigInt(-i):o}function _e(c,t,e,s){return Zt(c,t,e,Mt.RUNTIME_DECIMALS,s)}function Ee(c,t,e,s){if(t===0n)return 0n;let a=BigInt(10)**BigInt(Mt.RUNTIME_DECIMALS+s-e);return c*a/t}function Re(c,t,e=2){if(t<.01||t>100)throw new Error("Supported range is from 0.01% - 100%");let s=BigInt(10)**BigInt(e),a=BigInt(Math.round(t*Number(s)));return c*a/(BigInt(100)*s)}var I={};tt(I,{FeeUtils:()=>Lt,shiftNeg:()=>Ce});var ee=kt(require("big.js"));var Lt=class c{static toPct(t){let[e,s]=t;return c.safeDivide(e*100,s)}static toRaw(t){let[e,s]=t;return c.safeDivide(e,s)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,s=12){let a=10**s;return Math.round(t*a/e)/a}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Ce(c,t){let e=(0,ee.default)(typeof c=="bigint"?c.toString():c);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var pt={};tt(pt,{findNestedKey:()=>Me,findNestedObj:()=>Le,jsonFormatter:()=>De});var Me=(c,t)=>{let e=[];return JSON.stringify(c,(s,a)=>(a&&a[t]&&e.push(a),a)),e[0]},Le=(c,t,e)=>{let s;return JSON.stringify(c,(a,i)=>(i&&i[t]===e&&(s=i),i)),s},De=(c,t)=>typeof t=="bigint"?t.toString():t;var A={};tt(A,{calculateBuyFee:()=>Ge,calculateDiffToAvg:()=>He,calculateDiffToRef:()=>Ne,calculateSellFee:()=>qe});var N=kt(require("big.js"));function He(c,t){let e=(0,N.default)(c.toString()),s=(0,N.default)(t.toString());return e.minus(s).abs().div(e.plus(s).div(2)).mul(100).round(2).toNumber()}function Ne(c,t){if(t===0n)return 0;let e=(0,N.default)(c.toString()),s=(0,N.default)(t.toString());return e.minus(s).div(s).mul(100).round(2).toNumber()}function qe(c,t){if(c===0n)return 0;let e=(0,N.default)(c.toString()),s=(0,N.default)(t.toString());return(0,N.default)(1).minus(s.div(e)).mul(100).round(2).toNumber()}function Ge(c,t){if(c===0n)return 0;let e=(0,N.default)(c.toString());return(0,N.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}var{FeeUtils:se}=I,It=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new c(t)}constructor(t){this.type="LBP",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.fee=t.fee,this.repayFeeApply=t.repayFeeApply}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:i.balance,decimalsIn:a.decimals,decimalsOut:i.decimals,weightIn:a.weight,weightOut:i.weight}}validateAndBuy(t,e,s){let a=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let o=t.balanceOut/this.maxOutRatio;if(e>o&&i.push("MaxOutRatioExceeded"),a===t.assetOut){let n=this.calculateTradeFee(e,s),r=se.toPct(this.repayFeeApply?s.repayFee:s.exchangeFee),l=e+n,u=this.calculateInGivenOut(t,l),m=t.balanceIn/this.maxInRatio;return u>m&&i.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:r,errors:i}}else{let n=this.calculateInGivenOut(t,e),r=t.balanceIn/this.maxInRatio;return n>r&&i.push("MaxInRatioExceeded"),{amountIn:n,calculatedIn:n,amountOut:e,feePct:0,errors:i}}}validateAndSell(t,e,s){let a=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let o=t.balanceIn/this.maxInRatio;if(e>o&&i.push("MaxInRatioExceeded"),a===t.assetIn){let n=this.calculateOutGivenIn(t,e),r=t.balanceOut/this.maxOutRatio;return n>r&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:n,amountOut:n,feePct:0,errors:i}}else{let n=this.calculateOutGivenIn(t,e),r=this.calculateTradeFee(n,s),l=se.toPct(this.repayFeeApply?s.repayFee:s.exchangeFee),u=n-r,m=t.balanceOut/this.maxOutRatio;return u>m&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:n,amountOut:u,feePct:l,errors:i}}}calculateInGivenOut(t,e){let s=G.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),a=BigInt(s);return a<0n?0n:a}calculateOutGivenIn(t,e){let s=G.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),a=BigInt(s);return a<0n?0n:a}spotPriceInGivenOut(t){let e=G.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),et.big.toBigInt(1,et.RUNTIME_DECIMALS).toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=G.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),et.big.toBigInt(1,et.RUNTIME_DECIMALS).toString());return BigInt(e)}calculateTradeFee(t,e){let s=G.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(s)}};var Ye=require("polkadot-api"),Tt=require("rxjs");var V=require("rxjs"),E=require("rxjs/operators");var Ht=require("@galacticcouncil/descriptors");var ae=require("@galacticcouncil/common"),Dt=require("rxjs");var Ot=require("rxjs"),X=require("rxjs/operators");var{logger:Ws}=ae.log;var Ve=require("polkadot-api/ws"),Ue=require("polkadot-api/logs-provider");var We=require("polkadot-api");var ie=require("@galacticcouncil/common"),xt=require("rxjs"),M=require("rxjs/operators");var{logger:ua}=ie.log;var Xe=require("rxjs");var oe=require("@galacticcouncil/common");var wa={Aave:"AAVE",LBP:"LBP",Omnipool:"OMNI",Stableswap:"STBL",XYK:"XYK",HSM:"HSM"},{logger:xa}=oe.log;var{withTimeout:Ga}=St;var h=require("@galacticcouncil/math-omnipool"),j=kt(require("big.js")),O=class{static calculateSpotPrice(t,e,s,a){return(0,h.calculate_spot_price)(t,e,s,a)}static calculateLrnaSpotPrice(t,e){return(0,h.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,s,a,i,o,n,r,l,u){return(0,h.calculate_in_given_out)(t,e,s,a,i,o,n,r,l,u)}static calculateLrnaInGivenOut(t,e,s,a,i,o){return(0,h.calculate_lrna_in_given_out)(t,e,s,a,i,o)}static calculateOutGivenIn(t,e,s,a,i,o,n,r,l,u){return(0,h.calculate_out_given_in)(t,e,s,a,i,o,n,r,l,u)}static calculateOutGivenLrnaIn(t,e,s,a,i,o){return(0,h.calculate_out_given_lrna_in)(t,e,s,a,i,o)}static calculateShares(t,e,s,a){return(0,h.calculate_shares)(t,e,s,a)}static calculateLiquidityOut(t,e,s,a,i,o,n,r){return(0,h.calculate_liquidity_out)(t,e,s,a,i,o,n,r)}static calculateLiquidityLRNAOut(t,e,s,a,i,o,n,r){return(0,h.calculate_liquidity_lrna_out)(t,e,s,a,i,o,n,r)}static calculateCapDifference(t,e,s,a){let i=(0,j.default)(e),o=(0,j.default)(t),n=(0,j.default)(a),r=(0,j.default)(s),l=(0,j.default)(10).pow(18),u=r.div(l);if(i.div(n).lt(u)){let b=u.times(n).minus(i).times(o),d=i.times((0,j.default)(1).minus(u));return b.div(d).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,s,a){return(0,h.calculate_liquidity_hub_in)(t,e,s,a)}static isSellAllowed(t){return(0,h.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,h.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,h.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,h.is_remove_liquidity_allowed)(t)}static recalculateAssetFee(t,e,s,a,i,o,n,r,l,u,m){return(0,h.recalculate_asset_fee)(t,e,s,a,i,o,n,r,l,u,m)}static recalculateProtocolFee(t,e,s,a,i,o,n,r,l,u,m){return(0,h.recalculate_protocol_fee)(t,e,s,a,i,o,n,r,l,u,m)}static verifyAssetCap(t,e,s,a){return(0,h.verify_asset_cap)(t,e,s,a)}};var ne=require("@galacticcouncil/common");var{FeeUtils:q}=I,vt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new c(t)}constructor(t){this.type="Omnipool",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.hubAssetId=t.hubAssetId}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:a.hubReserves,hubReservesOut:i.hubReserves,sharesIn:a.shares,sharesOut:i.shares,decimalsIn:a.decimals,decimalsOut:i.decimals,balanceIn:a.balance,balanceOut:i.balance,tradeableIn:a.tradeable,tradeableOut:i.tradeable,assetInEd:a.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,s){let a=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,s),o=a===0n?0:A.calculateBuyFee(a,i),n=[],r=O.isSellAllowed(t.tradeableIn),l=O.isBuyAllowed(t.tradeableOut);(!r||!l)&&n.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&n.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&n.push("MaxOutRatioExceeded");let m=t.balanceIn/this.maxInRatio;return i>m&&n.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:a,amountOut:e,feePct:o,errors:n}}validateAndSell(t,e,s){let a=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,s),o=A.calculateSellFee(a,i),n=[],r=O.isSellAllowed(t.tradeableIn),l=O.isBuyAllowed(t.tradeableOut);(!r||!l)&&n.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&n.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&n.push("MaxInRatioExceeded");let m=t.balanceOut/this.maxOutRatio;return i>m&&n.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:i,feePct:o,errors:n}}calculateInGivenOut(t,e,s){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,s);let a=O.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?q.toRaw(s.assetFee).toString():"0",s?q.toRaw(s.protocolFee).toString():"0",s?q.toRaw(s.maxSlipFee).toString():"0"),i=BigInt(a);return i<0n?0n:i}calculateLrnaInGivenOut(t,e,s){let a=O.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?q.toRaw(s.assetFee).toString():"0",s?q.toRaw(s.maxSlipFee).toString():"0"),i=BigInt(a);return i<0n?0n:i}calculateOutGivenIn(t,e,s){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,s);let a=O.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?q.toRaw(s.assetFee).toString():"0",s?q.toRaw(s.protocolFee).toString():"0",s?q.toRaw(s.maxSlipFee).toString():"0"),i=BigInt(a);return i<0n?0n:i}calculateOutGivenLrnaIn(t,e,s){let a=O.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?q.toRaw(s.assetFee).toString():"0",s?q.toRaw(s.maxSlipFee).toString():"0"),i=BigInt(a);return i<0n?0n:i}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=O.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceLrnaInGivenOut(t){let e=O.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=O.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}spotPriceOutGivenLrnaIn(t){let e=O.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}normalizeSpot(t,e,s){let a=e-s;if(a===0)return t;let i=ne.big.pow10(Math.abs(a));return a>0?t*i:t/i}};var Q=require("polkadot-api"),Qe=require("@polkadot-api/utils"),J=require("rxjs"),Je=require("@galacticcouncil/common");var{FeeUtils:Pi}=I;var{FeeUtils:Ri}=I,ki=Q.Binary.toHex(Q.Binary.fromText("omnipool")),Ci=(0,Q.Enum)("Short");var T=require("@galacticcouncil/math-stableswap"),k=class{static getPoolAddress(t){return(0,T.pool_account_name)(t)}static defaultPegs(t){let e=[];for(let s=0;s<t;s++)e.push(["1","1"]);return e}static calculateAmplification(t,e,s,a,i){return(0,T.calculate_amplification)(t,e,s,a,i)}static calculateInGivenOut(t,e,s,a,i,o,n){return(0,T.calculate_in_given_out)(t,e,s,a,i,o,n)}static calculateAddOneAsset(t,e,s,a,i,o,n){return(0,T.calculate_add_one_asset)(t,e,s,a,i,o,n)}static calculateSharesForAmount(t,e,s,a,i,o,n){return(0,T.calculate_shares_for_amount)(t,e,s,a,i,o,n)}static calculateOutGivenIn(t,e,s,a,i,o,n){return(0,T.calculate_out_given_in)(t,e,s,a,i,o,n)}static calculateLiquidityOutOneAsset(t,e,s,a,i,o,n){return(0,T.calculate_liquidity_out_one_asset)(t,e,s,a,i,o,n)}static calculateShares(t,e,s,a,i,o){return(0,T.calculate_shares)(t,e,s,a,i,o)}static calculateSpotPriceWithFee(t,e,s,a,i,o,n,r){return(0,T.calculate_spot_price_with_fee)(t,e,s,a,i,o,n,r)}static recalculatePegs(t,e,s,a,i,o){let n=(0,T.recalculate_peg)(t,e,s,a,i,o);return JSON.parse(n)}};var gt=require("@galacticcouncil/common");var{FeeUtils:st}=I,at=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;isRampPeriod;id;fee;totalIssuance;pegs;static fromPool(t){return new c(t)}constructor(t){this.type="Stableswap",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.amplification=t.amplification,this.isRampPeriod=t.isRampPeriod,this.id=t.id,this.fee=t.fee,this.totalIssuance=t.totalIssuance,this.pegs=t.pegs}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:i.balance,decimalsIn:a.decimals,decimalsOut:i.decimals,tradeableIn:this.id===t?15:a.tradeable,tradeableOut:this.id===e?15:i.tradeable,assetInEd:a.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,s){let a=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,s),o=a===0n?0:A.calculateBuyFee(a,i),n=[],r=O.isSellAllowed(t.tradeableIn),l=O.isBuyAllowed(t.tradeableOut);return(!r||!l)&&n.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&n.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:a,amountOut:e,feePct:o,errors:n}}validateAndSell(t,e,s){let a=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,s),o=A.calculateSellFee(a,i),n=[],r=O.isSellAllowed(t.tradeableIn),l=O.isBuyAllowed(t.tradeableOut);return(!r||!l)&&n.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&n.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:a,amountOut:i,feePct:o,errors:n}}calculateIn(t,e,s){let a=k.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),s?st.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateAddOneAsset(t,e,s){let a=k.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),s?st.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateSharesForAmount(t,e,s){let a=k.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),s?st.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateInGivenOut(t,e,s){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,s):t.assetIn==this.id?this.calculateSharesForAmount(t,e,s):this.calculateIn(t,e,s)}spotPriceInGivenOut(t){let e=k.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());return this.normalizeSpot(BigInt(e),t.assetOut===this.id,t.assetIn===this.id,t.decimalsOut,t.decimalsIn)}calculateOut(t,e,s){let a=k.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),s?st.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateWithdrawOneAsset(t,e,s){let a=k.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),s?st.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateShares(t,e,s){let a=k.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),s?st.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateOutGivenIn(t,e,s){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,s):t.assetOut==this.id?this.calculateShares(t,e,s):this.calculateOut(t,e,s)}spotPriceOutGivenIn(t){let e=k.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());return this.normalizeSpot(BigInt(e),t.assetIn===this.id,t.assetOut===this.id,t.decimalsIn,t.decimalsOut)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:s,decimals:a})=>({asset_id:e,amount:s,decimals:a}));return JSON.stringify(t,pt.jsonFormatter)}getAssets(t,e){let s={asset_id:Number(t),amount:e.toString()};return JSON.stringify([s],pt.jsonFormatter)}normalizeSpot(t,e,s,a,i){return e?t*gt.big.pow10(gt.RUNTIME_DECIMALS-i):s?t/gt.big.pow10(i-a):t}};var re=require("polkadot-api"),ts=require("@polkadot-api/utils"),es=require("@noble/hashes/blake2b"),ht=require("rxjs"),le=require("@galacticcouncil/common");var{FeeUtils:ho}=I;var v=require("@galacticcouncil/math-xyk"),Y=class{static getSpotPrice(t,e,s){return(0,v.get_spot_price)(t,e,s)}static calculateInGivenOut(t,e,s){return(0,v.calculate_in_given_out)(t,e,s)}static calculateOutGivenIn(t,e,s){return(0,v.calculate_out_given_in)(t,e,s)}static calculatePoolTradeFee(t,e,s){return(0,v.calculate_pool_trade_fee)(t,e,s)}static calculateLiquidityIn(t,e,s){return(0,v.calculate_liquidity_in)(t,e,s)}static calculateSpotPrice(t,e){return(0,v.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,s,a){return(0,v.calculate_spot_price_with_fee)(t,e,s,a)}static calculateShares(t,e,s){return(0,v.calculate_shares)(t,e,s)}static calculateLiquidityOutAssetA(t,e,s,a){return(0,v.calculate_liquidity_out_asset_a)(t,e,s,a)}static calculateLiquidityOutAssetB(t,e,s,a){return(0,v.calculate_liquidity_out_asset_b)(t,e,s,a)}};var ue=require("@galacticcouncil/common");var{FeeUtils:ce}=I,Bt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t)}constructor(t){this.type="XYK",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:a.decimals,decimalsOut:i.decimals,balanceIn:a.balance,balanceOut:i.balance,assetInEd:a.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,s){let a=this.calculateInGivenOut(t,e),i=this.calculateTradeFee(a,s),o=ce.toPct(s.exchangeFee),n=a+i,r=[];(e<this.minTradingLimit||a<t.assetInEd)&&r.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&r.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return n>u&&r.push("MaxInRatioExceeded"),{amountIn:n,calculatedIn:a,amountOut:e,feePct:o,errors:r}}validateAndSell(t,e,s){let a=this.calculateOutGivenIn(t,e),i=this.calculateTradeFee(a,s),o=ce.toPct(s.exchangeFee),n=a-i,r=[];(e<this.minTradingLimit||a<t.assetOutEd)&&r.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&r.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return n>u&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:n,feePct:o,errors:r}}calculateInGivenOut(t,e){let s=Y.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(s);return a<0n?0n:a}calculateOutGivenIn(t,e){let s=Y.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(s);return a<0n?0n:a}spotPriceInGivenOut(t){let e=Y.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){let e=Y.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}calculateTradeFee(t,e){let s=Y.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(s)}normalizeSpot(t,e,s){let a=e-s;if(a===0)return t;let i=ue.big.pow10(Math.abs(a));return a>0?t*i:t/i}};var as=require("polkadot-api"),is=require("rxjs");var it=require("@galacticcouncil/common");var At=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t)}constructor(t){this.type="Aave",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:i.balance,decimalsIn:a.decimals,decimalsOut:i.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,s){let a=this.calculateInGivenOut(t,e),i=[];return e>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:i}}validateAndSell(t,e,s){let a=this.calculateOutGivenIn(t,e),i=[];return a>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:i}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){return it.big.toBigInt(1,it.RUNTIME_DECIMALS)}spotPriceOutGivenIn(t){return it.big.toBigInt(1,it.RUNTIME_DECIMALS)}calculateTradeFee(t,e){return 0n}};var pe=require("polkadot-api"),ns=require("@polkadot-api/utils"),Ft=require("rxjs"),rs=require("viem"),qt=require("@galacticcouncil/common");var{ERC20:pn}=qt.erc20;var B=require("@galacticcouncil/math-hsm"),L=class{static calculateCollateralInGivenHollarOut(t,e,s){return(0,B.calculate_collateral_in_given_hollar_out)(t,e,s)}static calculateCollateralOutGivenHollarIn(t,e,s){return(0,B.calculate_collateral_out_given_hollar_in)(t,e,s)}static calculateHollarOutGivenCollateralIn(t,e,s){return(0,B.calculate_hollar_out_given_collateral_in)(t,e,s)}static calculateHollarInGivenCollateralOut(t,e,s){return(0,B.calculate_hollar_in_given_collateral_out)(t,e,s)}static calculateImbalance(t,e,s){return(0,B.calculate_imbalance)(t,e,s)}static calculateBuybackLimit(t,e){return(0,B.calculate_buyback_limit)(t,e)}static calculateBuybackPriceWithFee(t,e,s){return(0,B.calculate_buyback_price_with_fee)(t,e,s)}static calculateMaxPrice(t,e){return(0,B.calculate_max_price)(t,e)}};var F=require("@galacticcouncil/common");var{FeeUtils:ot}=I,_t=class c extends at{hsmAddress;hsmMintCapacity;hollarId;hollarH160;collateralId;collateralBalance;maxBuyPriceCoefficient;maxInHolding;purchaseFee;buyBackFee;buyBackRate;static fromPool(t){return new c(t)}constructor(t){super(t),this.type="HSM",this.hsmAddress=t.hsmAddress,this.hsmMintCapacity=t.hsmMintCapacity,this.hollarId=t.hollarId,this.hollarH160=t.hollarH160,this.collateralId=t.collateralId,this.collateralBalance=t.collateralBalance,this.maxBuyPriceCoefficient=t.maxBuyPriceCoefficient,this.maxInHolding=t.maxInHolding,this.purchaseFee=t.purchaseFee,this.buyBackFee=t.buyBackFee,this.buyBackRate=t.buyBackRate}validatePair(t,e){return!0}parsePair(t,e){return super.parsePair(t,e)}validateTradeHollarIn(t,e,s){let a=this.parsePair(t.assetOut,t.assetIn),i=super.calculateInGivenOut(a,e,{fee:this.fee}),o=this.calculateBuybackLimit(t);e>o&&s.push("MaxBuyBackExceeded");let n=this.calculateMaxPrice(t);return this.calculateBuyPrice(t,e,i)>n&&s.push("MaxBuyPriceExceeded"),i>this.collateralBalance&&s.push("InsufficientCollateral"),s}validateTradeHollarOut(t,e,s){return this.collateralBalance+t>this.maxInHolding&&s.push("MaxHoldingExceeded"),e>this.hsmMintCapacity&&s.push("FacilitatorCapacityExceeded"),s}validateTradeConstraints(t,e,s){let a=[];return t.assetIn===this.hollarId?this.validateTradeHollarIn(t,e,a):this.validateTradeHollarOut(e,s,a)}validateAndBuy(t,e){let s=this.calculateInGivenOut(t,e),a=this.validateTradeConstraints(t,s,e);return{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:a}}validateAndSell(t,e){let s=this.calculateOutGivenIn(t,e),a=this.validateTradeConstraints(t,e,s);return{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:a}}calculateHollarInGivenCollateralOut(t,e){let s=super.calculateInGivenOut(t,e,{fee:this.fee}),a=L.calculateHollarInGivenCollateralOut(e.toString(),s.toString(),ot.toRaw(this.buyBackFee).toString());return BigInt(a)}calculateCollateralInGivenHollarOut(t){let e=this.getCollateralPeg(),s=L.calculateCollateralInGivenHollarOut(t.toString(),JSON.stringify(e),ot.toRaw(this.purchaseFee).toString());return BigInt(s)}calculateInGivenOut(t,e){return t.assetOut==this.hollarId?this.calculateCollateralInGivenHollarOut(e):this.calculateHollarInGivenCollateralOut(t,e)}calculateCollateralOutGivenHollarIn(t,e){let s=super.calculateOutGivenIn(t,e,{fee:this.fee}),a=L.calculateCollateralOutGivenHollarIn(e.toString(),s.toString(),ot.toRaw(this.buyBackFee).toString());return BigInt(a)}calculateHollarOutGivenCollateralIn(t){let e=this.getCollateralPeg(),s=L.calculateHollarOutGivenCollateralIn(t.toString(),JSON.stringify(e),ot.toRaw(this.purchaseFee).toString());return BigInt(s)}calculateOutGivenIn(t,e){return t.assetIn==this.hollarId?this.calculateCollateralOutGivenHollarIn(t,e):this.calculateHollarOutGivenCollateralIn(e)}calculateImbalance(t){let e=this.getCollateralPeg(),s=L.calculateImbalance(t.balanceIn.toString(),JSON.stringify(e),t.balanceOut.toString());return BigInt(s)}calculateBuybackLimit(t){let e=this.calculateImbalance(t),s=L.calculateBuybackLimit(e.toString(),ot.toRaw(this.buyBackRate).toString());return BigInt(s)}calculateBuyPrice(t,e,s){let a=L.calculateBuybackPriceWithFee(s.toString(),e.toString(),ot.toRaw(this.buyBackFee).toString()),[i,o]=JSON.parse(a),n=F.big.pow10(t.decimalsIn+F.RUNTIME_DECIMALS-t.decimalsOut);return BigInt(i)*n/BigInt(o)}calculateMaxPrice(t){let e=this.getCollateralPeg(),s=L.calculateMaxPrice(JSON.stringify(e),this.maxBuyPriceCoefficient.toString()),[a,i]=JSON.parse(s),o=F.big.pow10(F.RUNTIME_DECIMALS-t.decimalsOut);return BigInt(a)*o/BigInt(i)}spotPriceInGivenOut(t){let e=F.big.toBigInt(1,t.decimalsOut),a=this.calculateInGivenOut(t,e)*F.big.pow10(F.RUNTIME_DECIMALS-t.decimalsOut);return this.normalizeSpotPrice(a,t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){let e=F.big.toBigInt(1,t.decimalsIn),a=this.calculateOutGivenIn(t,e)*F.big.pow10(F.RUNTIME_DECIMALS-t.decimalsIn);return this.normalizeSpotPrice(a,t.decimalsIn,t.decimalsOut)}getCollateralPeg(){let t=this.tokens.findIndex(a=>a.id!==this.hollarId),e=this.pegs[t],s=this.tokens[t].decimals;return this.isDefaultPeg(e)?[F.big.toBigInt(1,18).toString(),F.big.toBigInt(1,s).toString()]:e}isDefaultPeg(t){let[e,s]=t;return Array.isArray(t)&&t.length===2&&e==="1"&&s==="1"}normalizeSpotPrice(t,e,s){let a=e-s;if(a===0)return t;let i=F.big.pow10(Math.abs(a));return a>0?t*i:t/i}};var Gt=require("polkadot-api"),us=require("@polkadot-api/utils"),nt=require("rxjs"),ps=require("viem"),Vt=require("@galacticcouncil/common");var{FeeUtils:Gn}=I,{H160:Vn}=Vt.h160;var bt=class{static get(t){switch(t.type){case"Aave":return At.fromPool(t);case"XYK":return Bt.fromPool(t);case"Omnipool":return vt.fromPool(t);case"LBP":return It.fromPool(t);case"Stableswap":return at.fromPool(t);case"HSM":return _t.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var de=require("@galacticcouncil/common"),Ut=require("rxjs");var Et=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var{logger:_r}=de.log;var Pt=class{getProposals(t,e,s){let a=s.filter(p=>p.type==="XYK"),i=s.filter(p=>p.type!=="XYK"),o=new Set(i.map(p=>p.tokens).flat().map(p=>p.id)),n=o.has(t),r=o.has(e),l=new ut,u=p=>{let P=Ct(p),S=Object.keys(P),D=S.flatMap(R=>P[R]);return l.buildAndPopulateGraph(S,D)};if(!n&&!r){let p=a.filter(D=>D.tokens.find(R=>R.id===t)||D.tokens.find(R=>R.id===e)),P=u(p),S=l.findPaths(P,t,e);return this.parsePaths(S)}if(n&&r){let p=u(i),P=l.findPaths(p,t,e);return this.parsePaths(P)}let m=n?e:t,b=a.filter(p=>p.tokens.some(P=>P.id===m));if(b.length===0)return[];let d=[...i,...b],f=u(d),g=l.findPaths(f,t,e);return this.parsePaths(g)}parsePaths(t){let e=[];for(let s of t){let a=[];for(let i=0;i<s.length;i++){let o=s[i],n=s[i+1];if(n==null)break;a.push(this.toEdge(o,n))}e.push(a)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var rt=class{routeSuggester;routeProposals;ctx;filter={};constructor(t){this.ctx=t,this.routeSuggester=new Pt,this.routeProposals=new Map}async withFilter(t){this.filter=t||{},this.routeProposals.clear(),this.onFilterChanged()}onFilterChanged(){}buildRouteKey(t,e,s){return`${t}->${e}::${s.length}`}applyPoolFilter(t){let{useOnly:e=[],exclude:s=[]}=this.filter,a=new Set(e),i=new Set(s);return t.filter(o=>i.has(o.type)?!1:a.size>0?a.has(o.type):!0)}async getPools(){let t=await this.ctx.getPools();return this.applyPoolFilter(t)}async getRoutes(t,e){let s=await this.getPools();return this.validateInput(t,e,s),this.getPaths(t,e,s)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}async getRouteableAssets(t){let e=await this.getTradeableAssets();return(await Promise.all(e.filter(a=>a!==t).map(a=>this.getRoutes(a,t)))).filter(a=>a.length>0).map(([a])=>a[0].assetIn).sort()}validateInput(t,e,s){if(s.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let a=this.getAssets(s);if(!a.has(t))throw new Error(t+" is not supported asset");if(!a.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(s)}getAssets(t){let e=t.map(s=>s.tokens.map(a=>a.id)).flat().sort((s,a)=>s>a?1:-1);return new Set(e)}getPaths(t,e,s){let a=this.toPoolsMap(s);return this.getProposals(t,e,s).filter(o=>this.validPath(o,a)).map(o=>this.toHops(o,a))}getProposals(t,e,s){let a=this.buildRouteKey(t,e,s);if(this.routeProposals.has(a))return this.routeProposals.get(a);let i=this.routeSuggester.getProposals(t,e,s);return this.routeProposals.set(a,i),i}validPath(t,e){return t.length>0&&t.map(s=>this.validEdge(s,e)).reduce((s,a)=>s&&a)}validEdge([t,e,s],a){return a.get(t)?.validatePair(e,s)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,bt.get(e)]))}toHops(t,e){return t.map(([s,a,i])=>{let o=e.get(s);return{poolAddress:s,poolId:o?.id,pool:o?.type,assetIn:a,assetOut:i}})}};var y=require("@galacticcouncil/common");var Wt=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Wt||{}),$t=(s=>(s.Dca="Dca",s.TwapSell="TwapSell",s.TwapBuy="TwapBuy",s))($t||{}),Xt=(s=>(s.OrderTooSmall="OrderTooSmall",s.OrderTooBig="OrderTooBig",s.OrderImpactTooBig="OrderImpactTooBig",s))(Xt||{});var{FeeUtils:ge}=I,lt=class extends rt{mlr;constructor(t){super(t),this.mlr=new Map}onFilterChanged(){this.mlr.clear()}buildCtxSync(t,e,s){let a=super.validateInput(t,e,s),i=super.getPaths(t,e,s);if(!i.length)throw new Et(t,e);return{paths:i,pools:s,poolsMap:a}}async withCtx(t,e,s){let a=await super.getPools(),i=this.buildCtxSync(t,e,a);return s(i)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((s,a)=>{let i=s[s.length-1].amountOut,o=a[a.length-1].amountOut;return i>o?-1:1});return e.find(s=>s.every(a=>a.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(s=>s.tradeFeeRange).length>0){let s=t.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,o)=>i+o),a=t.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,o)=>i+o);return[s,a]}}getPoolFeeRange(t,e){let s=t.min?ge.toPct(t.min):void 0,a=t.max?ge.toPct(t.max):void 0;if(s&&a)return[s,Math.max(a,e)]}async getBestSell(t,e,s){return this.getSell(t,e,s)}getSellSpot(t){let e=t[t.length-1];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getSell(t,e,s,a){return this.withCtx(t,e,async({paths:i,poolsMap:o})=>{let n;if(a)n=await this.toSellSwaps(s,a,o);else{let r=i.map(u=>this.toSellSwaps(s,u,o)),l=await Promise.all(r);n=this.findBestSellRoute(l)}return this.buildSell(o,n)})}async getSells(t,e,s){return this.withCtx(t,e,async({paths:a,poolsMap:i})=>{let o=a.map(r=>this.toSellSwaps(s,r,i));return(await Promise.all(o)).filter(r=>r.every(l=>l.errors.length==0)).map(r=>this.buildSell(i,r)).sort((r,l)=>r.amountOut>l.amountOut?-1:1)})}buildSell(t,e){let s=e[0],a=e[e.length-1],i=this.isDirectTrade(e),o=this.getSellSpot(e),n=a.amountOut,r=i?a.calculatedOut:this.calculateDelta0Y(s.amountIn,e,t),l=r-n,u=this.getRouteFeeRange(e),m=i?a.tradeFeePct:A.calculateSellFee(r,n),b=C.mulSpot(s.amountIn,o,s.assetInDecimals,a.assetOutDecimals),d=A.calculateDiffToRef(r,b);return{type:"Sell",amountIn:s.amountIn,amountOut:a.amountOut,spotPrice:o,tradeFee:l,tradeFeePct:m,tradeFeeRange:u,priceImpactPct:d,swaps:e,toHuman(){return{type:"Sell",amountIn:y.big.toDecimal(s.amountIn,s.assetInDecimals),amountOut:y.big.toDecimal(a.amountOut,a.assetOutDecimals),spotPrice:y.big.toDecimal(o,y.RUNTIME_DECIMALS),tradeFee:y.big.toDecimal(l,a.assetOutDecimals),tradeFeePct:m,tradeFeeRange:u,priceImpactPct:d,swaps:e.map(f=>f.toHuman())}}}}calculateSpot(t){return t.map(e=>e.spotPrice).reduce((e,s)=>e*s/10n**BigInt(y.RUNTIME_DECIMALS))}calculateDelta0Y(t,e,s){let a=[];for(let i=0;i<e.length;i++){let o=e[i],n=s.get(o.poolAddress);if(n==null)throw new Error("Pool does not exit");let r=n.parsePair(o.assetIn,o.assetOut),l;i>0?l=a[i-1]:l=t;let u=n.calculateOutGivenIn(r,l);a.push(u)}return a[a.length-1]}async calculateMostLiquidRoute(t,e,s){let{paths:a,pools:i,poolsMap:o}=s,l=i.filter(g=>g.tokens.some(p=>p.id===t)).map(g=>g.type==="Aave"?g.tokens:g.tokens.filter(p=>p.id===t)).map(g=>g.map(p=>p.balance).reduce((p,P)=>p+P)).sort((g,p)=>p<g?-1:1)[0],u=C.getFraction(l,.1),m=await Promise.all(a.map(g=>this.toSellSwaps(u,g,o))),d=this.findBestSellRoute(m).map(g=>({poolAddress:g.poolAddress,poolId:g?.poolId,pool:g.pool,assetIn:g.assetIn,assetOut:g.assetOut})),f=this.buildRouteKey(t,e,i);return this.mlr.set(f,d),d}async toSellSwaps(t,e,s){let a=[];for(let i=0;i<e.length;i++){let o=e[i],n=s.get(o.poolAddress);if(n==null)throw new Error("Pool does not exit");let r=n.parsePair(o.assetIn,o.assetOut),l;i>0?l=a[i-1].amountOut:l=typeof t=="string"?y.big.toBigInt(t,r.decimalsIn):t;let u=await this.ctx.getPoolFees(r,n),{amountOut:m,calculatedOut:b,feePct:d,errors:f}=n.validateAndSell(r,l,u),g=this.getPoolFeeRange(u,d),p=n.spotPriceOutGivenIn(r),P=C.mulSpot(l,p,r.decimalsIn,r.decimalsOut),S=A.calculateDiffToRef(b,P);a.push({...o,assetInDecimals:r.decimalsIn,assetOutDecimals:r.decimalsOut,amountIn:l,amountOut:m,calculatedOut:b,spotPrice:p,tradeFeePct:d,tradeFeeRange:g,priceImpactPct:S,errors:f,isSupply(){return n.type==="Aave"&&n.tokens[0].id===o.assetIn},isWithdraw(){return n.type==="Aave"&&n.tokens[1].id===o.assetIn},toHuman(){return{...o,amountIn:y.big.toDecimal(l,r.decimalsIn),amountOut:y.big.toDecimal(m,r.decimalsOut),calculatedOut:y.big.toDecimal(b,r.decimalsOut),spotPrice:y.big.toDecimal(p,y.RUNTIME_DECIMALS),tradeFeePct:d,tradeFeeRange:g,priceImpactPct:S,errors:f}}})}return a}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async s=>{let a=this.buildRouteKey(t,e,s.pools),i=this.mlr.get(a);return i||this.calculateMostLiquidRoute(t,e,s)})}async getSpotPrice(t,e){return this.withCtx(t,e,async s=>{let{pools:a,poolsMap:i}=s,o=this.buildRouteKey(t,e,a),n=this.mlr.get(o);n||(n=await this.calculateMostLiquidRoute(t,e,s));let r=await this.toSellSwaps("1",n,i);return{amount:this.getSellSpot(r),decimals:y.RUNTIME_DECIMALS}}).catch(()=>{})}findBestBuyRoute(t){let e=t.sort((s,a)=>{let i=s[0].amountIn,o=a[0].amountIn;return i>o?1:-1});return e.find(s=>s.every(a=>a.errors.length==0))||e[0]}async getBestBuy(t,e,s){return this.getBuy(t,e,s)}getBuySpot(t){let e=t[0];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getBuy(t,e,s,a){return this.withCtx(t,e,async({paths:i,poolsMap:o})=>{let n;if(a)n=await this.toBuySwaps(s,a,o);else{let r=i.map(u=>this.toBuySwaps(s,u,o)),l=await Promise.all(r);n=this.findBestBuyRoute(l)}return this.buildBuy(o,n)})}async getBuys(t,e,s){return this.withCtx(t,e,async({paths:a,poolsMap:i})=>{let o=a.map(r=>this.toBuySwaps(s,r,i));return(await Promise.all(o)).filter(r=>r.every(l=>l.errors.length==0)).map(r=>this.buildBuy(i,r)).sort((r,l)=>r.amountIn>l.amountIn?1:-1)})}buildBuy(t,e){let s=e[e.length-1],a=e[0],i=this.isDirectTrade(e),o=this.getBuySpot(e),n=a.amountIn,r=i?a.calculatedIn:this.calculateDelta0X(s.amountOut,e,t),l=n-r,u=this.getRouteFeeRange(e),m=i?a.tradeFeePct:A.calculateBuyFee(r,n),b=C.mulSpot(s.amountOut,o,s.assetOutDecimals,a.assetInDecimals),d;return r===0n?d=-100:d=A.calculateDiffToRef(b,r),{type:"Buy",amountOut:s.amountOut,amountIn:a.amountIn,spotPrice:o,tradeFee:l,tradeFeePct:m,tradeFeeRange:u,priceImpactPct:d,swaps:e,toHuman(){return{type:"Buy",amountOut:y.big.toDecimal(s.amountOut,s.assetOutDecimals),amountIn:y.big.toDecimal(a.amountIn,a.assetInDecimals),spotPrice:y.big.toDecimal(o,y.RUNTIME_DECIMALS),tradeFee:y.big.toDecimal(l,a.assetInDecimals),tradeFeePct:m,tradeFeeRange:u,priceImpactPct:d,swaps:e.map(f=>f.toHuman())}}}}calculateDelta0X(t,e,s){let a=[];for(let i=e.length-1;i>=0;i--){let o=e[i],n=s.get(o.poolAddress);if(n==null)throw new Error("Pool does not exit");let r=n.parsePair(o.assetIn,o.assetOut),l;i==e.length-1?l=t:l=a[0];let u=n.calculateInGivenOut(r,l);a.unshift(u)}return a[0]}async toBuySwaps(t,e,s){let a=[];for(let i=e.length-1;i>=0;i--){let o=e[i],n=s.get(o.poolAddress);if(n==null)throw new Error("Pool does not exit");let r=n.parsePair(o.assetIn,o.assetOut),l;i==e.length-1?l=typeof t=="string"?y.big.toBigInt(t,r.decimalsOut):t:l=a[0].amountIn;let u=await this.ctx.getPoolFees(r,n),{amountIn:m,calculatedIn:b,feePct:d,errors:f}=n.validateAndBuy(r,l,u),g=this.getPoolFeeRange(u,d),p=n.spotPriceInGivenOut(r),P=C.mulSpot(l,p,r.decimalsOut,r.decimalsIn),S;b===0n?S=-100:S=A.calculateDiffToRef(P,b),a.unshift({...o,assetInDecimals:r.decimalsIn,assetOutDecimals:r.decimalsOut,amountOut:l,amountIn:m,calculatedIn:b,spotPrice:p,tradeFeePct:d,tradeFeeRange:g,priceImpactPct:S,errors:f,isSupply(){return n.type==="Aave"&&n.tokens[0].id===o.assetIn},isWithdraw(){return n.type==="Aave"&&n.tokens[1].id===o.assetIn},toHuman(){return{...o,amountOut:y.big.toDecimal(l,r.decimalsOut),amountIn:y.big.toDecimal(m,r.decimalsIn),calculatedIn:y.big.toDecimal(b,r.decimalsIn),spotPrice:y.big.toDecimal(p,y.RUNTIME_DECIMALS),tradeFeePct:d,tradeFeeRange:g,priceImpactPct:S,errors:f}}})}return a}};var w=require("@galacticcouncil/common");var he=6e3,Yt=1000000000000000n,yt=6,zt=-5,Kt=216e5,Nl=3,be=.1,Pe=6;var jt=require("polkadot-api");var U=class{static build(t){return t.map(({assetIn:e,assetOut:s,pool:a,poolId:i})=>a==="Stableswap"?{pool:(0,jt.Enum)("Stableswap",i),asset_in:e,asset_out:s}:{pool:(0,jt.Enum)(a),asset_in:e,asset_out:s})}};var Rt=class{schedulerOptions;router;constructor(t,e={}){this.router=new lt(t),this.router.withFilter({exclude:["HSM"]}),this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Yt})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,s,a,i){let o=await this.router.getBestSell(t,e,s),{amountIn:n,swaps:r,priceImpactPct:l}=o,u=r[0],m=r[r.length-1],{assetInDecimals:b}=u,{assetOutDecimals:d}=m,f=Math.abs(l),g=await this.getMinimumOrderBudget(t,b),p=this.getOptimalTradeCount(f),P=this.getMaximumTradeCount(n,g,a),S=i||Math.min(p,P),D=Math.round(a/S),R=n/BigInt(S),_=await this.router.getBestSell(t,e,R),z=n<g,W=[];z&&W.push("OrderTooSmall");let Z=await this.getAssetOutEd(m),$=_.amountOut*BigInt(S),fe=this.toBlockPeriod(D),Se=_.tradeFee*BigInt(S),Ie=U.build(r),Qt={assetIn:t,assetOut:e,assetOutEd:Z,errors:W,maxTradeCount:P,tradeCount:S,tradeFee:Se,tradeImpactPct:_.priceImpactPct,tradePeriod:fe,tradeRoute:Ie,type:"Dca"};return{...Qt,amountIn:n,amountOut:$,tradeAmountIn:_.amountIn,tradeAmountOut:_.amountOut,toHuman(){return{...Qt,amountIn:w.big.toDecimal(n,b),amountOut:w.big.toDecimal($,d),assetOutEd:w.big.toDecimal(Z,d),tradeAmountIn:w.big.toDecimal(_.amountIn,b),tradeAmountOut:w.big.toDecimal(_.amountOut,d)}}}}async getMinimumOrderBudget(t,e){if(0===t)return this.minOrderBudget;let s=await this.router.getSpotPrice(0,t);if(s)return C.mulSpot(this.minOrderBudget,s.amount,12,e);let a=await this.router.getSpotPrice(t,0);if(a)return C.divSpot(this.minOrderBudget,a.amount,12,e);throw new Error("Unable to calculate order budget")}getMaximumTradeCount(t,e,s){let a=e*2n/10n;if(a===0n)return 0;let i=Number(t/a),o=Math.floor(s/this.blockTime),n=Math.max(0,Math.floor(o*(1-.1)));return Math.min(i,n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getOpenBudgetDcaOrder(t,e,s,a){let i=await this.router.getBestSell(t,e,s),{swaps:o}=i,n=o[0],r=o[o.length-1],{assetInDecimals:l}=n,{assetOutDecimals:u}=r,m=await this.getMinimumOrderBudget(t,l),b=i.amountIn<m,d=[];b&&d.push("OrderTooSmall");let f=await this.getAssetOutEd(r),g=this.toBlockPeriod(a),p=U.build(o),P={assetIn:t,assetOut:e,assetOutEd:f,errors:d,maxTradeCount:0,tradeCount:0,tradeFee:i.tradeFee,tradeImpactPct:i.priceImpactPct,tradePeriod:g,tradeRoute:p,type:"Dca"};return{...P,amountIn:0n,amountOut:0n,tradeAmountIn:i.amountIn,tradeAmountOut:i.amountOut,toHuman(){return{...P,amountIn:"0",amountOut:"0",assetOutEd:w.big.toDecimal(f,u),tradeAmountIn:w.big.toDecimal(i.amountIn,l),tradeAmountOut:w.big.toDecimal(i.amountOut,u)}}}}async getTwapSellOrder(t,e,s){let a=await this.router.getBestSell(t,e,s),{amountIn:i,swaps:o,priceImpactPct:n}=a,r=o[0],l=o[o.length-1],{assetInDecimals:u}=r,{assetOutDecimals:m}=l,b=Math.abs(n),d=this.getTwapTradeCount(b),f=i/BigInt(d),[g,p]=await Promise.all([this.getMinimumOrderBudget(t,u),this.router.getBestSell(r.assetIn,l.assetOut,f)]),P=d===1,S=i<g,D=p.priceImpactPct<-5,R=[];S||P?R.push("OrderTooSmall"):D&&R.push("OrderImpactTooBig");let _=await this.getAssetOutEd(l),z=p.amountOut*BigInt(d),W=p.tradeFee*BigInt(d),Z=U.build(o),$={assetIn:t,assetOut:e,assetOutEd:_,errors:R,tradeCount:d,tradeImpactPct:p.priceImpactPct,tradePeriod:6,tradeRoute:Z,type:"TwapSell"};return{...$,amountIn:i,amountOut:z,tradeAmountIn:p.amountIn,tradeAmountOut:p.amountOut,tradeFee:W,toHuman(){return{...$,amountIn:w.big.toDecimal(i,u),amountOut:w.big.toDecimal(z,m),assetOutEd:w.big.toDecimal(_,m),tradeAmountIn:w.big.toDecimal(p.amountIn,u),tradeAmountOut:w.big.toDecimal(p.amountOut,m),tradeFee:w.big.toDecimal(W,m)}}}}async getTwapBuyOrder(t,e,s){let a=await this.router.getBestBuy(t,e,s),{amountOut:i,swaps:o,priceImpactPct:n}=a,r=o[0],l=o[o.length-1],{assetInDecimals:u}=r,{assetOutDecimals:m}=l,b=Math.abs(n),d=this.getTwapTradeCount(b),f=i/BigInt(d),[g,p]=await Promise.all([this.getMinimumOrderBudget(t,u),this.router.getBestBuy(r.assetIn,l.assetOut,f)]),P=p.amountIn*BigInt(d),S=d===1,D=P<g,R=p.priceImpactPct<-5,_=[];D||S?_.push("OrderTooSmall"):R&&_.push("OrderImpactTooBig");let z=await this.getAssetOutEd(l),W=p.tradeFee*BigInt(d),Z=U.build(o),$={assetIn:t,assetOut:e,assetOutEd:z,errors:_,tradeCount:d,tradeImpactPct:p.priceImpactPct,tradePeriod:6,tradeRoute:Z,type:"TwapBuy"};return{...$,amountIn:P,amountOut:i,tradeAmountIn:p.amountIn,tradeAmountOut:p.amountOut,tradeFee:W,toHuman(){return{...$,amountIn:w.big.toDecimal(P,u),amountOut:w.big.toDecimal(i,m),assetOutEd:w.big.toDecimal(z,m),tradeAmountIn:w.big.toDecimal(p.amountIn,u),tradeAmountOut:w.big.toDecimal(p.amountOut,m),tradeFee:w.big.toDecimal(W,u)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let a=216e5/(this.blockTime*6);return Math.round(a)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,s=Math.round(e);return Math.max(s,6)}async getAssetOutEd(t){let a=(await this.router.getPools()).find(i=>i.address===t.poolAddress)?.tokens.find(i=>i.id===t.assetOut);if(!a)throw new Error(`Asset ${t.assetOut} not found in pool ${t.poolAddress}`);return a.existentialDeposit}};0&&(module.exports={DCA_TIME_RESERVE,DEFAULT_BLOCK_TIME,DEFAULT_MIN_BUDGET,ORDER_MIN_BLOCK_PERIOD,Router,TWAP_EXECUTION_INTERVAL,TWAP_MAX_DURATION,TWAP_MAX_PRICE_IMPACT,TWAP_TX_MULTIPLIER,TradeOrderError,TradeOrderType,TradeRouteBuilder,TradeRouter,TradeScheduler,TradeType});
|
package/build/sor/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var Wt=Object.defineProperty;var $=(u,t)=>{for(var e in t)Wt(u,e,{get:t[e],enumerable:!0})};import Xt from"buffer";typeof window<"u"&&(window.Buffer=Xt.Buffer);var Y=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var $t=10,z=class{isNotVisited(t,e){let s=!0;return e.forEach(a=>{(a[0]===t[0]||a[1]===t[1])&&(s=!1)}),s}findPaths(t,e,s){let a=[],i=new Y,o=[];for(o.push([e,""]),i.enqueue(o);i.size()>0;){let r=i.dequeue();if(!r||r.length>$t)continue;let n=r[r.length-1];(s===null||n[0]===s)&&a.push(r),t.get(n[0])?.forEach(c=>{if(this.isNotVisited(c,r)){let p=[...r];p.push(c),i.enqueue(p)}})}return a}findShortestPaths(t,e,s){let a=[],i=new Y,o=[];o.push([e,""]),i.enqueue(o);let r=1/0;for(;i.size()>0;){let n=i.dequeue();if(!n)continue;let l=n[n.length-1];if(l[0]===s){n.length<r?(r=n.length,a.length=0,a.push(n)):n.length===r&&a.push(n);continue}let c=t.get(l[0]);for(let p of c??[])this.isNotVisited(p,n)&&i.enqueue([...n,p])}return a}buildAndPopulateGraph(t,e){let s=new Map;for(let a of t)s.set(parseInt(a),[]);for(let[a,i,o]of e)s.get(i)?.push([o,a]);return s}};function pt(u){let t={};for(let e of u){let s=e.tokens.length;for(let a=0;a<s;a++){t[e.tokens[a].id]||(t[e.tokens[a].id]=[]);for(let i=0;i<s;i++){if(a==i)continue;let o=[e.address,e.tokens[a].id,e.tokens[i].id];t[e.tokens[a].id].push(o)}}}return t}import{calculate_in_given_out as Yt,calculate_out_given_in as zt,calculate_linear_weights as Kt,calculate_pool_trade_fee as jt,get_spot_price as Qt}from"@galacticcouncil/math-lbp";var R=class{static getSpotPrice(t,e,s,a,i){return Qt(t,e,s,a,i)}static calculateInGivenOut(t,e,s,a,i){return Yt(t,e,s,a,i)}static calculateOutGivenIn(t,e,s,a,i){return zt(t,e,s,a,i)}static calculateLinearWeights(t,e,s,a,i){return Kt(t,e,s,a,i)}static calculatePoolTradeFee(t,e,s){return jt(t,e,s)}};import{big as xt,RUNTIME_DECIMALS as Ot}from"@galacticcouncil/common";var at={};$(at,{withTimeout:()=>Jt});function Jt(u,t,e="timeout"){return new Promise((s,a)=>{let i=setTimeout(()=>a(new Error(e)),t);u.then(o=>{clearTimeout(i),s(o)},o=>{clearTimeout(i),a(o)})})}var A={};$(A,{divSpot:()=>te,getFraction:()=>ee,mulScaled:()=>St,mulSpot:()=>Zt});import{RUNTIME_DECIMALS as ft}from"@galacticcouncil/common";function St(u,t,e,s,a){let i=e+s-a,o=u*t;return i>0?o/BigInt(10)**BigInt(i):i<0?o*BigInt(10)**BigInt(-i):o}function Zt(u,t,e,s){return St(u,t,e,ft,s)}function te(u,t,e,s){if(t===0n)return 0n;let a=BigInt(10)**BigInt(ft+s-e);return u*a/t}function ee(u,t,e=2){if(t<.01||t>100)throw new Error("Supported range is from 0.01% - 100%");let s=BigInt(10)**BigInt(e),a=BigInt(Math.round(t*Number(s)));return u*a/(BigInt(100)*s)}var y={};$(y,{FeeUtils:()=>dt,shiftNeg:()=>ie});import ae from"big.js";var dt=class u{static toPct(t){let[e,s]=t;return u.safeDivide(e*100,s)}static toRaw(t){let[e,s]=t;return u.safeDivide(e,s)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,s=12){let a=10**s;return Math.round(t*a/e)/a}static safeRound(t){return parseFloat(t.toPrecision(15))}};function ie(u,t){let e=ae(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var K={};$(K,{findNestedKey:()=>oe,findNestedObj:()=>re,jsonFormatter:()=>ne});var oe=(u,t)=>{let e=[];return JSON.stringify(u,(s,a)=>(a&&a[t]&&e.push(a),a)),e[0]},re=(u,t,e)=>{let s;return JSON.stringify(u,(a,i)=>(i&&i[t]===e&&(s=i),i)),s},ne=(u,t)=>typeof t=="bigint"?t.toString():t;var w={};$(w,{calculateBuyFee:()=>me,calculateDiffToAvg:()=>le,calculateDiffToRef:()=>ce,calculateSellFee:()=>ue});import k from"big.js";function le(u,t){let e=k(u.toString()),s=k(t.toString());return e.minus(s).abs().div(e.plus(s).div(2)).mul(100).round(2).toNumber()}function ce(u,t){if(t===0n)return 0;let e=k(u.toString()),s=k(t.toString());return e.minus(s).div(s).mul(100).round(2).toNumber()}function ue(u,t){if(u===0n)return 0;let e=k(u.toString()),s=k(t.toString());return k(1).minus(s.div(e)).mul(100).round(2).toNumber()}function me(u,t){if(u===0n)return 0;let e=k(u.toString());return k(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}import{TLRUCache as js}from"@thi.ng/cache";var{FeeUtils:wt}=y,it=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new u(t)}constructor(t){this.type="LBP",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.fee=t.fee,this.repayFeeApply=t.repayFeeApply}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:i.balance,decimalsIn:a.decimals,decimalsOut:i.decimals,weightIn:a.weight,weightOut:i.weight}}validateAndBuy(t,e,s){let a=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let o=t.balanceOut/this.maxOutRatio;if(e>o&&i.push("MaxOutRatioExceeded"),a===t.assetOut){let r=this.calculateTradeFee(e,s),n=wt.toPct(this.repayFeeApply?s.repayFee:s.exchangeFee),l=e+r,c=this.calculateInGivenOut(t,l),p=t.balanceIn/this.maxInRatio;return c>p&&i.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:n,errors:i}}else{let r=this.calculateInGivenOut(t,e),n=t.balanceIn/this.maxInRatio;return r>n&&i.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:i}}}validateAndSell(t,e,s){let a=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let o=t.balanceIn/this.maxInRatio;if(e>o&&i.push("MaxInRatioExceeded"),a===t.assetIn){let r=this.calculateOutGivenIn(t,e),n=t.balanceOut/this.maxOutRatio;return r>n&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:i}}else{let r=this.calculateOutGivenIn(t,e),n=this.calculateTradeFee(r,s),l=wt.toPct(this.repayFeeApply?s.repayFee:s.exchangeFee),c=r-n,p=t.balanceOut/this.maxOutRatio;return c>p&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:c,feePct:l,errors:i}}}calculateInGivenOut(t,e){let s=R.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),a=BigInt(s);return a<0n?0n:a}calculateOutGivenIn(t,e){let s=R.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),a=BigInt(s);return a<0n?0n:a}spotPriceInGivenOut(t){let e=R.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),xt.toBigInt(1,Ot).toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=R.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),xt.toBigInt(1,Ot).toString());return BigInt(e)}calculateTradeFee(t,e){let s=R.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(s)}};import{CompatibilityLevel as rr}from"polkadot-api";import{Subscription as lr,distinctUntilChanged as cr,filter as ur,map as mr}from"rxjs";import{memoize1 as ho}from"@thi.ng/memoize";import{TLRUCache as Po}from"@thi.ng/cache";import{ReplaySubject as Io,Subscription as xo,combineLatest as Oo,defer as wo,from as To,interval as vo,merge as Bo,of as Ao,EMPTY as Fo}from"rxjs";import{bufferCount as Eo,bufferTime as Ro,catchError as ko,filter as Co,finalize as Mo,map as Lo,pairwise as Do,repeat as Ho,skip as No,share as qo,startWith as Go,switchMap as Vo,tap as Uo,throttleTime as Wo}from"rxjs/operators";import{hydration as $a,hydrationNext as Ya}from"@galacticcouncil/descriptors";import{log as pe}from"@galacticcouncil/common";import{map as Da,shareReplay as Ha,tap as Na}from"rxjs";import{defer as ya,from as fa,of as Sa,timer as Ia}from"rxjs";import{catchError as Oa,distinctUntilChanged as wa,expand as Ta,map as va,shareReplay as Ba,skip as Aa,switchMap as Fa,timeout as _a}from"rxjs/operators";var{logger:Ga}=pe;import{getWsProvider as Ja}from"polkadot-api/ws";import{withLogsRecorder as ti}from"polkadot-api/logs-provider";import{Binary as hi}from"polkadot-api";import{log as de}from"@galacticcouncil/common";import{combineLatest as xi,concat as Oi,defer as wi,from as Ti}from"rxjs";import{bufferCount as Bi,distinctUntilChanged as Ai,debounceTime as Fi,map as _i,retry as Ei,startWith as Ri,switchMap as ki,tap as Ci,take as Mi,skip as Li,connect as Di}from"rxjs/operators";var{logger:Gi}=de;import{BehaviorSubject as eo}from"rxjs";import{log as he}from"@galacticcouncil/common";var no={Aave:"AAVE",LBP:"LBP",Omnipool:"OMNI",Stableswap:"STBL",XYK:"XYK",HSM:"HSM"},{logger:lo}=he;var{withTimeout:sr}=at;import{calculate_in_given_out as Pe,calculate_lrna_in_given_out as ye,calculate_out_given_in as fe,calculate_out_given_lrna_in as Se,calculate_spot_price as Ie,calculate_lrna_spot_price as xe,calculate_shares as Oe,calculate_liquidity_out as we,calculate_liquidity_lrna_out as Te,verify_asset_cap as ve,calculate_liquidity_hub_in as Be,is_sell_allowed as Ae,is_buy_allowed as Fe,is_add_liquidity_allowed as _e,is_remove_liquidity_allowed as Ee,recalculate_asset_fee as Re,recalculate_protocol_fee as ke}from"@galacticcouncil/math-omnipool";import G from"big.js";var S=class{static calculateSpotPrice(t,e,s,a){return Ie(t,e,s,a)}static calculateLrnaSpotPrice(t,e){return xe(t,e)}static calculateInGivenOut(t,e,s,a,i,o,r,n,l,c){return Pe(t,e,s,a,i,o,r,n,l,c)}static calculateLrnaInGivenOut(t,e,s,a,i,o){return ye(t,e,s,a,i,o)}static calculateOutGivenIn(t,e,s,a,i,o,r,n,l,c){return fe(t,e,s,a,i,o,r,n,l,c)}static calculateOutGivenLrnaIn(t,e,s,a,i,o){return Se(t,e,s,a,i,o)}static calculateShares(t,e,s,a){return Oe(t,e,s,a)}static calculateLiquidityOut(t,e,s,a,i,o,r,n){return we(t,e,s,a,i,o,r,n)}static calculateLiquidityLRNAOut(t,e,s,a,i,o,r,n){return Te(t,e,s,a,i,o,r,n)}static calculateCapDifference(t,e,s,a){let i=G(e),o=G(t),r=G(a),n=G(s),l=G(10).pow(18),c=n.div(l);if(i.div(r).lt(c)){let h=c.times(r).minus(i).times(o),d=i.times(G(1).minus(c));return h.div(d).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,s,a){return Be(t,e,s,a)}static isSellAllowed(t){return Ae(t)}static isBuyAllowed(t){return Fe(t)}static isAddLiquidityAllowed(t){return _e(t)}static isRemoveLiquidityAllowed(t){return Ee(t)}static recalculateAssetFee(t,e,s,a,i,o,r,n,l,c,p){return Re(t,e,s,a,i,o,r,n,l,c,p)}static recalculateProtocolFee(t,e,s,a,i,o,r,n,l,c,p){return ke(t,e,s,a,i,o,r,n,l,c,p)}static verifyAssetCap(t,e,s,a){return ve(t,e,s,a)}};import{big as Ce}from"@galacticcouncil/common";var{FeeUtils:E}=y,rt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new u(t)}constructor(t){this.type="Omnipool",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.hubAssetId=t.hubAssetId}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:a.hubReserves,hubReservesOut:i.hubReserves,sharesIn:a.shares,sharesOut:i.shares,decimalsIn:a.decimals,decimalsOut:i.decimals,balanceIn:a.balance,balanceOut:i.balance,tradeableIn:a.tradeable,tradeableOut:i.tradeable,assetInEd:a.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,s){let a=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,s),o=a===0n?0:w.calculateBuyFee(a,i),r=[],n=S.isSellAllowed(t.tradeableIn),l=S.isBuyAllowed(t.tradeableOut);(!n||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&r.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&r.push("MaxOutRatioExceeded");let p=t.balanceIn/this.maxInRatio;return i>p&&r.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:a,amountOut:e,feePct:o,errors:r}}validateAndSell(t,e,s){let a=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,s),o=w.calculateSellFee(a,i),r=[],n=S.isSellAllowed(t.tradeableIn),l=S.isBuyAllowed(t.tradeableOut);(!n||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&r.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&r.push("MaxInRatioExceeded");let p=t.balanceOut/this.maxOutRatio;return i>p&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:i,feePct:o,errors:r}}calculateInGivenOut(t,e,s){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,s);let a=S.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?E.toRaw(s.assetFee).toString():"0",s?E.toRaw(s.protocolFee).toString():"0",s?E.toRaw(s.maxSlipFee).toString():"0"),i=BigInt(a);return i<0n?0n:i}calculateLrnaInGivenOut(t,e,s){let a=S.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?E.toRaw(s.assetFee).toString():"0",s?E.toRaw(s.maxSlipFee).toString():"0"),i=BigInt(a);return i<0n?0n:i}calculateOutGivenIn(t,e,s){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,s);let a=S.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?E.toRaw(s.assetFee).toString():"0",s?E.toRaw(s.protocolFee).toString():"0",s?E.toRaw(s.maxSlipFee).toString():"0"),i=BigInt(a);return i<0n?0n:i}calculateOutGivenLrnaIn(t,e,s){let a=S.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?E.toRaw(s.assetFee).toString():"0",s?E.toRaw(s.maxSlipFee).toString():"0"),i=BigInt(a);return i<0n?0n:i}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=S.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceLrnaInGivenOut(t){let e=S.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=S.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}spotPriceOutGivenLrnaIn(t){let e=S.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}normalizeSpot(t,e,s){let a=e-s;if(a===0)return t;let i=Ce.pow10(Math.abs(a));return a>0?t*i:t/i}};import{AccountId as an,Binary as Tt,CompatibilityLevel as on,Enum as De}from"polkadot-api";import{toHex as ln}from"@polkadot-api/utils";import{Subscription as un,distinctUntilChanged as mn,filter as pn,finalize as dn,map as gn,merge as hn,tap as bn}from"rxjs";import{HYDRATION_SS58_PREFIX as yn}from"@galacticcouncil/common";var{FeeUtils:zr}=y;var{FeeUtils:Bn}=y,An=Tt.toHex(Tt.fromText("omnipool")),Fn=De("Short");import{calculate_in_given_out as Ne,calculate_out_given_in as qe,calculate_amplification as Ge,calculate_add_one_asset as Ve,calculate_liquidity_out_one_asset as Ue,calculate_shares as We,calculate_shares_for_amount as Xe,calculate_spot_price_with_fee as $e,pool_account_name as Ye,recalculate_peg as ze}from"@galacticcouncil/math-stableswap";var B=class{static getPoolAddress(t){return Ye(t)}static defaultPegs(t){let e=[];for(let s=0;s<t;s++)e.push(["1","1"]);return e}static calculateAmplification(t,e,s,a,i){return Ge(t,e,s,a,i)}static calculateInGivenOut(t,e,s,a,i,o,r){return Ne(t,e,s,a,i,o,r)}static calculateAddOneAsset(t,e,s,a,i,o,r){return Ve(t,e,s,a,i,o,r)}static calculateSharesForAmount(t,e,s,a,i,o,r){return Xe(t,e,s,a,i,o,r)}static calculateOutGivenIn(t,e,s,a,i,o,r){return qe(t,e,s,a,i,o,r)}static calculateLiquidityOutOneAsset(t,e,s,a,i,o,r){return Ue(t,e,s,a,i,o,r)}static calculateShares(t,e,s,a,i,o){return We(t,e,s,a,i,o)}static calculateSpotPriceWithFee(t,e,s,a,i,o,r,n){return $e(t,e,s,a,i,o,r,n)}static recalculatePegs(t,e,s,a,i,o){let r=ze(t,e,s,a,i,o);return JSON.parse(r)}};import{RUNTIME_DECIMALS as Ke,big as vt}from"@galacticcouncil/common";var{FeeUtils:V}=y,U=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;isRampPeriod;id;fee;totalIssuance;pegs;static fromPool(t){return new u(t)}constructor(t){this.type="Stableswap",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.amplification=t.amplification,this.isRampPeriod=t.isRampPeriod,this.id=t.id,this.fee=t.fee,this.totalIssuance=t.totalIssuance,this.pegs=t.pegs}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:i.balance,decimalsIn:a.decimals,decimalsOut:i.decimals,tradeableIn:this.id===t?15:a.tradeable,tradeableOut:this.id===e?15:i.tradeable,assetInEd:a.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,s){let a=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,s),o=a===0n?0:w.calculateBuyFee(a,i),r=[],n=S.isSellAllowed(t.tradeableIn),l=S.isBuyAllowed(t.tradeableOut);return(!n||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&r.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:a,amountOut:e,feePct:o,errors:r}}validateAndSell(t,e,s){let a=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,s),o=w.calculateSellFee(a,i),r=[],n=S.isSellAllowed(t.tradeableIn),l=S.isBuyAllowed(t.tradeableOut);return(!n||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&r.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:a,amountOut:i,feePct:o,errors:r}}calculateIn(t,e,s){let a=B.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),s?V.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateAddOneAsset(t,e,s){let a=B.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),s?V.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateSharesForAmount(t,e,s){let a=B.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),s?V.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateInGivenOut(t,e,s){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,s):t.assetIn==this.id?this.calculateSharesForAmount(t,e,s):this.calculateIn(t,e,s)}spotPriceInGivenOut(t){let e=B.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());return this.normalizeSpot(BigInt(e),t.assetOut===this.id,t.assetIn===this.id,t.decimalsOut,t.decimalsIn)}calculateOut(t,e,s){let a=B.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),s?V.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateWithdrawOneAsset(t,e,s){let a=B.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),s?V.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateShares(t,e,s){let a=B.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),s?V.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateOutGivenIn(t,e,s){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,s):t.assetOut==this.id?this.calculateShares(t,e,s):this.calculateOut(t,e,s)}spotPriceOutGivenIn(t){let e=B.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());return this.normalizeSpot(BigInt(e),t.assetIn===this.id,t.assetOut===this.id,t.decimalsIn,t.decimalsOut)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:s,decimals:a})=>({asset_id:e,amount:s,decimals:a}));return JSON.stringify(t,K.jsonFormatter)}getAssets(t,e){let s={asset_id:Number(t),amount:e.toString()};return JSON.stringify([s],K.jsonFormatter)}normalizeSpot(t,e,s,a,i){return e?t*vt.pow10(Ke-i):s?t/vt.pow10(i-a):t}};import{AccountId as nl,CompatibilityLevel as ll}from"polkadot-api";import{toHex as ul}from"@polkadot-api/utils";import{blake2b as pl}from"@noble/hashes/blake2b";import{Subscription as gl,distinctUntilChanged as hl,map as bl,merge as Pl,tap as yl}from"rxjs";import{HYDRATION_SS58_PREFIX as Sl,RUNTIME_DECIMALS as Il}from"@galacticcouncil/common";var{FeeUtils:Rl}=y;import{calculate_in_given_out as Qe,calculate_out_given_in as Je,calculate_pool_trade_fee as Ze,get_spot_price as ts,calculate_liquidity_in as es,calculate_shares as ss,calculate_spot_price as as,calculate_spot_price_with_fee as is,calculate_liquidity_out_asset_a as os,calculate_liquidity_out_asset_b as rs}from"@galacticcouncil/math-xyk";var L=class{static getSpotPrice(t,e,s){return ts(t,e,s)}static calculateInGivenOut(t,e,s){return Qe(t,e,s)}static calculateOutGivenIn(t,e,s){return Je(t,e,s)}static calculatePoolTradeFee(t,e,s){return Ze(t,e,s)}static calculateLiquidityIn(t,e,s){return es(t,e,s)}static calculateSpotPrice(t,e){return as(t,e)}static calculateSpotPriceWithFee(t,e,s,a){return is(t,e,s,a)}static calculateShares(t,e,s){return ss(t,e,s)}static calculateLiquidityOutAssetA(t,e,s,a){return os(t,e,s,a)}static calculateLiquidityOutAssetB(t,e,s,a){return rs(t,e,s,a)}};import{big as ns}from"@galacticcouncil/common";var{FeeUtils:Bt}=y,nt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t)}constructor(t){this.type="XYK",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:a.decimals,decimalsOut:i.decimals,balanceIn:a.balance,balanceOut:i.balance,assetInEd:a.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,s){let a=this.calculateInGivenOut(t,e),i=this.calculateTradeFee(a,s),o=Bt.toPct(s.exchangeFee),r=a+i,n=[];(e<this.minTradingLimit||a<t.assetInEd)&&n.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&n.push("MaxOutRatioExceeded");let c=t.balanceIn/this.maxInRatio;return r>c&&n.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:a,amountOut:e,feePct:o,errors:n}}validateAndSell(t,e,s){let a=this.calculateOutGivenIn(t,e),i=this.calculateTradeFee(a,s),o=Bt.toPct(s.exchangeFee),r=a-i,n=[];(e<this.minTradingLimit||a<t.assetOutEd)&&n.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&n.push("MaxInRatioExceeded");let c=t.balanceOut/this.maxOutRatio;return r>c&&n.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:r,feePct:o,errors:n}}calculateInGivenOut(t,e){let s=L.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(s);return a<0n?0n:a}calculateOutGivenIn(t,e){let s=L.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(s);return a<0n?0n:a}spotPriceInGivenOut(t){let e=L.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){let e=L.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}calculateTradeFee(t,e){let s=L.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(s)}normalizeSpot(t,e,s){let a=e-s;if(a===0)return t;let i=ns.pow10(Math.abs(a));return a>0?t*i:t/i}};import{CompatibilityLevel as ic}from"polkadot-api";import{Subscription as rc}from"rxjs";import{big as At,RUNTIME_DECIMALS as Ft}from"@galacticcouncil/common";var lt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t)}constructor(t){this.type="Aave",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:i.balance,decimalsIn:a.decimals,decimalsOut:i.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,s){let a=this.calculateInGivenOut(t,e),i=[];return e>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:i}}validateAndSell(t,e,s){let a=this.calculateOutGivenIn(t,e),i=[];return a>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:i}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){return At.toBigInt(1,Ft)}spotPriceOutGivenIn(t){return At.toBigInt(1,Ft)}calculateTradeFee(t,e){return 0n}};import{AccountId as Hc,Binary as Nc}from"polkadot-api";import{toHex as Gc}from"@polkadot-api/utils";import{Subscription as Uc,filter as Wc,map as Xc,mergeMap as $c}from"rxjs";import{decodeEventLog as zc}from"viem";import{erc20 as cs,HYDRATION_SS58_PREFIX as jc}from"@galacticcouncil/common";var{ERC20:au}=cs;import{calculate_collateral_in_given_hollar_out as ms,calculate_collateral_out_given_hollar_in as ps,calculate_hollar_in_given_collateral_out as ds,calculate_hollar_out_given_collateral_in as gs,calculate_imbalance as hs,calculate_max_price as bs,calculate_buyback_limit as Ps,calculate_buyback_price_with_fee as ys}from"@galacticcouncil/math-hsm";var F=class{static calculateCollateralInGivenHollarOut(t,e,s){return ms(t,e,s)}static calculateCollateralOutGivenHollarIn(t,e,s){return ps(t,e,s)}static calculateHollarOutGivenCollateralIn(t,e,s){return gs(t,e,s)}static calculateHollarInGivenCollateralOut(t,e,s){return ds(t,e,s)}static calculateImbalance(t,e,s){return hs(t,e,s)}static calculateBuybackLimit(t,e){return Ps(t,e)}static calculateBuybackPriceWithFee(t,e,s){return ys(t,e,s)}static calculateMaxPrice(t,e){return bs(t,e)}};import{big as C,RUNTIME_DECIMALS as ct}from"@galacticcouncil/common";var{FeeUtils:W}=y,ut=class u extends U{hsmAddress;hsmMintCapacity;hollarId;hollarH160;collateralId;collateralBalance;maxBuyPriceCoefficient;maxInHolding;purchaseFee;buyBackFee;buyBackRate;static fromPool(t){return new u(t)}constructor(t){super(t),this.type="HSM",this.hsmAddress=t.hsmAddress,this.hsmMintCapacity=t.hsmMintCapacity,this.hollarId=t.hollarId,this.hollarH160=t.hollarH160,this.collateralId=t.collateralId,this.collateralBalance=t.collateralBalance,this.maxBuyPriceCoefficient=t.maxBuyPriceCoefficient,this.maxInHolding=t.maxInHolding,this.purchaseFee=t.purchaseFee,this.buyBackFee=t.buyBackFee,this.buyBackRate=t.buyBackRate}validatePair(t,e){return!0}parsePair(t,e){return super.parsePair(t,e)}validateTradeHollarIn(t,e,s){let a=this.parsePair(t.assetOut,t.assetIn),i=super.calculateInGivenOut(a,e,{fee:this.fee}),o=this.calculateBuybackLimit(t);e>o&&s.push("MaxBuyBackExceeded");let r=this.calculateMaxPrice(t);return this.calculateBuyPrice(t,e,i)>r&&s.push("MaxBuyPriceExceeded"),i>this.collateralBalance&&s.push("InsufficientCollateral"),s}validateTradeHollarOut(t,e,s){return this.collateralBalance+t>this.maxInHolding&&s.push("MaxHoldingExceeded"),e>this.hsmMintCapacity&&s.push("FacilitatorCapacityExceeded"),s}validateTradeConstraints(t,e,s){let a=[];return t.assetIn===this.hollarId?this.validateTradeHollarIn(t,e,a):this.validateTradeHollarOut(e,s,a)}validateAndBuy(t,e){let s=this.calculateInGivenOut(t,e),a=this.validateTradeConstraints(t,s,e);return{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:a}}validateAndSell(t,e){let s=this.calculateOutGivenIn(t,e),a=this.validateTradeConstraints(t,e,s);return{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:a}}calculateHollarInGivenCollateralOut(t,e){let s=super.calculateInGivenOut(t,e,{fee:this.fee}),a=F.calculateHollarInGivenCollateralOut(e.toString(),s.toString(),W.toRaw(this.buyBackFee).toString());return BigInt(a)}calculateCollateralInGivenHollarOut(t){let e=this.getCollateralPeg(),s=F.calculateCollateralInGivenHollarOut(t.toString(),JSON.stringify(e),W.toRaw(this.purchaseFee).toString());return BigInt(s)}calculateInGivenOut(t,e){return t.assetOut==this.hollarId?this.calculateCollateralInGivenHollarOut(e):this.calculateHollarInGivenCollateralOut(t,e)}calculateCollateralOutGivenHollarIn(t,e){let s=super.calculateOutGivenIn(t,e,{fee:this.fee}),a=F.calculateCollateralOutGivenHollarIn(e.toString(),s.toString(),W.toRaw(this.buyBackFee).toString());return BigInt(a)}calculateHollarOutGivenCollateralIn(t){let e=this.getCollateralPeg(),s=F.calculateHollarOutGivenCollateralIn(t.toString(),JSON.stringify(e),W.toRaw(this.purchaseFee).toString());return BigInt(s)}calculateOutGivenIn(t,e){return t.assetIn==this.hollarId?this.calculateCollateralOutGivenHollarIn(t,e):this.calculateHollarOutGivenCollateralIn(e)}calculateImbalance(t){let e=this.getCollateralPeg(),s=F.calculateImbalance(t.balanceIn.toString(),JSON.stringify(e),t.balanceOut.toString());return BigInt(s)}calculateBuybackLimit(t){let e=this.calculateImbalance(t),s=F.calculateBuybackLimit(e.toString(),W.toRaw(this.buyBackRate).toString());return BigInt(s)}calculateBuyPrice(t,e,s){let a=F.calculateBuybackPriceWithFee(s.toString(),e.toString(),W.toRaw(this.buyBackFee).toString()),[i,o]=JSON.parse(a),r=C.pow10(t.decimalsIn+ct-t.decimalsOut);return BigInt(i)*r/BigInt(o)}calculateMaxPrice(t){let e=this.getCollateralPeg(),s=F.calculateMaxPrice(JSON.stringify(e),this.maxBuyPriceCoefficient.toString()),[a,i]=JSON.parse(s),o=C.pow10(ct-t.decimalsOut);return BigInt(a)*o/BigInt(i)}spotPriceInGivenOut(t){let e=C.toBigInt(1,t.decimalsOut),a=this.calculateInGivenOut(t,e)*C.pow10(ct-t.decimalsOut);return this.normalizeSpotPrice(a,t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){let e=C.toBigInt(1,t.decimalsIn),a=this.calculateOutGivenIn(t,e)*C.pow10(ct-t.decimalsIn);return this.normalizeSpotPrice(a,t.decimalsIn,t.decimalsOut)}getCollateralPeg(){let t=this.tokens.findIndex(a=>a.id!==this.hollarId),e=this.pegs[t],s=this.tokens[t].decimals;return this.isDefaultPeg(e)?[C.toBigInt(1,18).toString(),C.toBigInt(1,s).toString()]:e}isDefaultPeg(t){let[e,s]=t;return Array.isArray(t)&&t.length===2&&e==="1"&&s==="1"}normalizeSpotPrice(t,e,s){let a=e-s;if(a===0)return t;let i=C.pow10(Math.abs(a));return a>0?t*i:t/i}};import{AccountId as Mu,Binary as Lu,CompatibilityLevel as Du}from"polkadot-api";import{toHex as qu}from"@polkadot-api/utils";import{Subscription as Uu,combineLatest as Wu,filter as Xu,map as $u,mergeMap as Yu,pairwise as zu}from"rxjs";import{decodeEventLog as ju}from"viem";import{h160 as Ss,HYDRATION_SS58_PREFIX as Ju}from"@galacticcouncil/common";var{FeeUtils:om}=y,{H160:rm}=Ss;var J=class{static get(t){switch(t.type){case"Aave":return lt.fromPool(t);case"XYK":return nt.fromPool(t);case"Omnipool":return rt.fromPool(t);case"LBP":return it.fromPool(t);case"Stableswap":return U.fromPool(t);case"HSM":return ut.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{log as Os}from"@galacticcouncil/common";import{Subject as Hm,Subscription as Nm,takeUntil as qm}from"rxjs";var mt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var{logger:ap}=Os;var Z=class{getProposals(t,e,s){let a=s.filter(m=>m.type==="XYK"),i=s.filter(m=>m.type!=="XYK"),o=new Set(i.map(m=>m.tokens).flat().map(m=>m.id)),r=o.has(t),n=o.has(e),l=new z,c=m=>{let b=pt(m),P=Object.keys(b),_=P.flatMap(v=>b[v]);return l.buildAndPopulateGraph(P,_)};if(!r&&!n){let m=a.filter(_=>_.tokens.find(v=>v.id===t)||_.tokens.find(v=>v.id===e)),b=c(m),P=l.findPaths(b,t,e);return this.parsePaths(P)}if(r&&n){let m=c(i),b=l.findPaths(m,t,e);return this.parsePaths(b)}let p=r?e:t,h=a.filter(m=>m.tokens.some(b=>b.id===p));if(h.length===0)return[];let d=[...i,...h],f=c(d),g=l.findPaths(f,t,e);return this.parsePaths(g)}parsePaths(t){let e=[];for(let s of t){let a=[];for(let i=0;i<s.length;i++){let o=s[i],r=s[i+1];if(r==null)break;a.push(this.toEdge(o,r))}e.push(a)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var tt=class{routeSuggester;routeProposals;ctx;filter={};constructor(t){this.ctx=t,this.routeSuggester=new Z,this.routeProposals=new Map}async withFilter(t){this.filter=t||{},this.routeProposals.clear(),this.onFilterChanged()}onFilterChanged(){}buildRouteKey(t,e,s){return`${t}->${e}::${s.length}`}applyPoolFilter(t){let{useOnly:e=[],exclude:s=[]}=this.filter,a=new Set(e),i=new Set(s);return t.filter(o=>i.has(o.type)?!1:a.size>0?a.has(o.type):!0)}async getPools(){let t=await this.ctx.getPools();return this.applyPoolFilter(t)}async getRoutes(t,e){let s=await this.getPools();return this.validateInput(t,e,s),this.getPaths(t,e,s)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}async getRouteableAssets(t){let e=await this.getTradeableAssets();return(await Promise.all(e.filter(a=>a!==t).map(a=>this.getRoutes(a,t)))).filter(a=>a.length>0).map(([a])=>a[0].assetIn).sort()}validateInput(t,e,s){if(s.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let a=this.getAssets(s);if(!a.has(t))throw new Error(t+" is not supported asset");if(!a.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(s)}getAssets(t){let e=t.map(s=>s.tokens.map(a=>a.id)).flat().sort((s,a)=>s>a?1:-1);return new Set(e)}getPaths(t,e,s){let a=this.toPoolsMap(s);return this.getProposals(t,e,s).filter(o=>this.validPath(o,a)).map(o=>this.toHops(o,a))}getProposals(t,e,s){let a=this.buildRouteKey(t,e,s);if(this.routeProposals.has(a))return this.routeProposals.get(a);let i=this.routeSuggester.getProposals(t,e,s);return this.routeProposals.set(a,i),i}validPath(t,e){return t.length>0&&t.map(s=>this.validEdge(s,e)).reduce((s,a)=>s&&a)}validEdge([t,e,s],a){return a.get(t)?.validatePair(e,s)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,J.get(e)]))}toHops(t,e){return t.map(([s,a,i])=>{let o=e.get(s);return{poolAddress:s,poolId:o?.id,pool:o?.type,assetIn:a,assetOut:i}})}};import{big as x,RUNTIME_DECIMALS as X}from"@galacticcouncil/common";var Et=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Et||{}),Rt=(s=>(s.Dca="Dca",s.TwapSell="TwapSell",s.TwapBuy="TwapBuy",s))(Rt||{}),kt=(s=>(s.OrderTooSmall="OrderTooSmall",s.OrderTooBig="OrderTooBig",s.OrderImpactTooBig="OrderImpactTooBig",s))(kt||{});var{FeeUtils:Ct}=y,et=class extends tt{mlr;constructor(t){super(t),this.mlr=new Map}onFilterChanged(){this.mlr.clear()}buildCtxSync(t,e,s){let a=super.validateInput(t,e,s),i=super.getPaths(t,e,s);if(!i.length)throw new mt(t,e);return{paths:i,pools:s,poolsMap:a}}async withCtx(t,e,s){let a=await super.getPools(),i=this.buildCtxSync(t,e,a);return s(i)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((s,a)=>{let i=s[s.length-1].amountOut,o=a[a.length-1].amountOut;return i>o?-1:1});return e.find(s=>s.every(a=>a.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(s=>s.tradeFeeRange).length>0){let s=t.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,o)=>i+o),a=t.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,o)=>i+o);return[s,a]}}getPoolFeeRange(t,e){let s=t.min?Ct.toPct(t.min):void 0,a=t.max?Ct.toPct(t.max):void 0;if(s&&a)return[s,Math.max(a,e)]}async getBestSell(t,e,s){return this.getSell(t,e,s)}getSellSpot(t){let e=t[t.length-1];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getSell(t,e,s,a){return this.withCtx(t,e,async({paths:i,poolsMap:o})=>{let r;if(a)r=await this.toSellSwaps(s,a,o);else{let n=i.map(c=>this.toSellSwaps(s,c,o)),l=await Promise.all(n);r=this.findBestSellRoute(l)}return this.buildSell(o,r)})}async getSells(t,e,s){return this.withCtx(t,e,async({paths:a,poolsMap:i})=>{let o=a.map(n=>this.toSellSwaps(s,n,i));return(await Promise.all(o)).filter(n=>n.every(l=>l.errors.length==0)).map(n=>this.buildSell(i,n)).sort((n,l)=>n.amountOut>l.amountOut?-1:1)})}buildSell(t,e){let s=e[0],a=e[e.length-1],i=this.isDirectTrade(e),o=this.getSellSpot(e),r=a.amountOut,n=i?a.calculatedOut:this.calculateDelta0Y(s.amountIn,e,t),l=n-r,c=this.getRouteFeeRange(e),p=i?a.tradeFeePct:w.calculateSellFee(n,r),h=A.mulSpot(s.amountIn,o,s.assetInDecimals,a.assetOutDecimals),d=w.calculateDiffToRef(n,h);return{type:"Sell",amountIn:s.amountIn,amountOut:a.amountOut,spotPrice:o,tradeFee:l,tradeFeePct:p,tradeFeeRange:c,priceImpactPct:d,swaps:e,toHuman(){return{type:"Sell",amountIn:x.toDecimal(s.amountIn,s.assetInDecimals),amountOut:x.toDecimal(a.amountOut,a.assetOutDecimals),spotPrice:x.toDecimal(o,X),tradeFee:x.toDecimal(l,a.assetOutDecimals),tradeFeePct:p,tradeFeeRange:c,priceImpactPct:d,swaps:e.map(f=>f.toHuman())}}}}calculateSpot(t){return t.map(e=>e.spotPrice).reduce((e,s)=>e*s/10n**BigInt(X))}calculateDelta0Y(t,e,s){let a=[];for(let i=0;i<e.length;i++){let o=e[i],r=s.get(o.poolAddress);if(r==null)throw new Error("Pool does not exit");let n=r.parsePair(o.assetIn,o.assetOut),l;i>0?l=a[i-1]:l=t;let c=r.calculateOutGivenIn(n,l);a.push(c)}return a[a.length-1]}async calculateMostLiquidRoute(t,e,s){let{paths:a,pools:i,poolsMap:o}=s,l=i.filter(g=>g.tokens.some(m=>m.id===t)).map(g=>g.type==="Aave"?g.tokens:g.tokens.filter(m=>m.id===t)).map(g=>g.map(m=>m.balance).reduce((m,b)=>m+b)).sort((g,m)=>m<g?-1:1)[0],c=A.getFraction(l,.1),p=await Promise.all(a.map(g=>this.toSellSwaps(c,g,o))),d=this.findBestSellRoute(p).map(g=>({poolAddress:g.poolAddress,poolId:g?.poolId,pool:g.pool,assetIn:g.assetIn,assetOut:g.assetOut})),f=this.buildRouteKey(t,e,i);return this.mlr.set(f,d),d}async toSellSwaps(t,e,s){let a=[];for(let i=0;i<e.length;i++){let o=e[i],r=s.get(o.poolAddress);if(r==null)throw new Error("Pool does not exit");let n=r.parsePair(o.assetIn,o.assetOut),l;i>0?l=a[i-1].amountOut:l=typeof t=="string"?x.toBigInt(t,n.decimalsIn):t;let c=await this.ctx.getPoolFees(n,r),{amountOut:p,calculatedOut:h,feePct:d,errors:f}=r.validateAndSell(n,l,c),g=this.getPoolFeeRange(c,d),m=r.spotPriceOutGivenIn(n),b=A.mulSpot(l,m,n.decimalsIn,n.decimalsOut),P=w.calculateDiffToRef(h,b);a.push({...o,assetInDecimals:n.decimalsIn,assetOutDecimals:n.decimalsOut,amountIn:l,amountOut:p,calculatedOut:h,spotPrice:m,tradeFeePct:d,tradeFeeRange:g,priceImpactPct:P,errors:f,isSupply(){return r.type==="Aave"&&r.tokens[0].id===o.assetIn},isWithdraw(){return r.type==="Aave"&&r.tokens[1].id===o.assetIn},toHuman(){return{...o,amountIn:x.toDecimal(l,n.decimalsIn),amountOut:x.toDecimal(p,n.decimalsOut),calculatedOut:x.toDecimal(h,n.decimalsOut),spotPrice:x.toDecimal(m,X),tradeFeePct:d,tradeFeeRange:g,priceImpactPct:P,errors:f}}})}return a}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async s=>{let a=this.buildRouteKey(t,e,s.pools),i=this.mlr.get(a);return i||this.calculateMostLiquidRoute(t,e,s)})}async getSpotPrice(t,e){return this.withCtx(t,e,async s=>{let{pools:a,poolsMap:i}=s,o=this.buildRouteKey(t,e,a),r=this.mlr.get(o);r||(r=await this.calculateMostLiquidRoute(t,e,s));let n=await this.toSellSwaps("1",r,i);return{amount:this.getSellSpot(n),decimals:X}}).catch(()=>{})}findBestBuyRoute(t){let e=t.sort((s,a)=>{let i=s[0].amountIn,o=a[0].amountIn;return i>o?1:-1});return e.find(s=>s.every(a=>a.errors.length==0))||e[0]}async getBestBuy(t,e,s){return this.getBuy(t,e,s)}getBuySpot(t){let e=t[0];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getBuy(t,e,s,a){return this.withCtx(t,e,async({paths:i,poolsMap:o})=>{let r;if(a)r=await this.toBuySwaps(s,a,o);else{let n=i.map(c=>this.toBuySwaps(s,c,o)),l=await Promise.all(n);r=this.findBestBuyRoute(l)}return this.buildBuy(o,r)})}async getBuys(t,e,s){return this.withCtx(t,e,async({paths:a,poolsMap:i})=>{let o=a.map(n=>this.toBuySwaps(s,n,i));return(await Promise.all(o)).filter(n=>n.every(l=>l.errors.length==0)).map(n=>this.buildBuy(i,n)).sort((n,l)=>n.amountIn>l.amountIn?1:-1)})}buildBuy(t,e){let s=e[e.length-1],a=e[0],i=this.isDirectTrade(e),o=this.getBuySpot(e),r=a.amountIn,n=i?a.calculatedIn:this.calculateDelta0X(s.amountOut,e,t),l=r-n,c=this.getRouteFeeRange(e),p=i?a.tradeFeePct:w.calculateBuyFee(n,r),h=A.mulSpot(s.amountOut,o,s.assetOutDecimals,a.assetInDecimals),d;return n===0n?d=-100:d=w.calculateDiffToRef(h,n),{type:"Buy",amountOut:s.amountOut,amountIn:a.amountIn,spotPrice:o,tradeFee:l,tradeFeePct:p,tradeFeeRange:c,priceImpactPct:d,swaps:e,toHuman(){return{type:"Buy",amountOut:x.toDecimal(s.amountOut,s.assetOutDecimals),amountIn:x.toDecimal(a.amountIn,a.assetInDecimals),spotPrice:x.toDecimal(o,X),tradeFee:x.toDecimal(l,a.assetInDecimals),tradeFeePct:p,tradeFeeRange:c,priceImpactPct:d,swaps:e.map(f=>f.toHuman())}}}}calculateDelta0X(t,e,s){let a=[];for(let i=e.length-1;i>=0;i--){let o=e[i],r=s.get(o.poolAddress);if(r==null)throw new Error("Pool does not exit");let n=r.parsePair(o.assetIn,o.assetOut),l;i==e.length-1?l=t:l=a[0];let c=r.calculateInGivenOut(n,l);a.unshift(c)}return a[0]}async toBuySwaps(t,e,s){let a=[];for(let i=e.length-1;i>=0;i--){let o=e[i],r=s.get(o.poolAddress);if(r==null)throw new Error("Pool does not exit");let n=r.parsePair(o.assetIn,o.assetOut),l;i==e.length-1?l=typeof t=="string"?x.toBigInt(t,n.decimalsOut):t:l=a[0].amountIn;let c=await this.ctx.getPoolFees(n,r),{amountIn:p,calculatedIn:h,feePct:d,errors:f}=r.validateAndBuy(n,l,c),g=this.getPoolFeeRange(c,d),m=r.spotPriceInGivenOut(n),b=A.mulSpot(l,m,n.decimalsOut,n.decimalsIn),P;h===0n?P=-100:P=w.calculateDiffToRef(b,h),a.unshift({...o,assetInDecimals:n.decimalsIn,assetOutDecimals:n.decimalsOut,amountOut:l,amountIn:p,calculatedIn:h,spotPrice:m,tradeFeePct:d,tradeFeeRange:g,priceImpactPct:P,errors:f,isSupply(){return r.type==="Aave"&&r.tokens[0].id===o.assetIn},isWithdraw(){return r.type==="Aave"&&r.tokens[1].id===o.assetIn},toHuman(){return{...o,amountOut:x.toDecimal(l,n.decimalsOut),amountIn:x.toDecimal(p,n.decimalsIn),calculatedIn:x.toDecimal(h,n.decimalsIn),spotPrice:x.toDecimal(m,X),tradeFeePct:d,tradeFeeRange:g,priceImpactPct:P,errors:f}}})}return a}};import{big as O}from"@galacticcouncil/common";var Mt=6e3,Lt=1000000000000000n,st=6,ht=-5,bt=216e5,Id=3,Dt=.1,Ht=6;import{Enum as Nt}from"polkadot-api";var D=class{static build(t){return t.map(({assetIn:e,assetOut:s,pool:a,poolId:i})=>a==="Stableswap"?{pool:Nt("Stableswap",i),asset_in:e,asset_out:s}:{pool:Nt(a),asset_in:e,asset_out:s})}};var Pt=class{schedulerOptions;router;constructor(t,e={}){this.router=new et(t),this.router.withFilter({exclude:["HSM"]}),this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Lt})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,s,a,i){let o=await this.router.getBestSell(t,e,s),{amountIn:r,swaps:n,priceImpactPct:l}=o,c=n[0],p=n[n.length-1],{assetInDecimals:h}=c,{assetOutDecimals:d}=p,f=Math.abs(l),g=await this.getMinimumOrderBudget(t,h),m=this.getOptimalTradeCount(f),b=this.getMaximumTradeCount(r,g,a),P=i||Math.min(m,b),_=Math.round(a/P),v=r/BigInt(P),T=await this.router.getBestSell(t,e,v),H=r<g,q=[];H&&q.push("OrderTooSmall");let M=T.amountOut*BigInt(P),Gt=this.toBlockPeriod(_),Vt=T.tradeFee*BigInt(P),Ut=D.build(n),yt={assetIn:t,assetOut:e,errors:q,maxTradeCount:b,tradeCount:P,tradeFee:Vt,tradeImpactPct:T.priceImpactPct,tradePeriod:Gt,tradeRoute:Ut,type:"Dca"};return{...yt,amountIn:r,amountOut:M,tradeAmountIn:T.amountIn,tradeAmountOut:T.amountOut,toHuman(){return{...yt,amountIn:O.toDecimal(r,h),amountOut:O.toDecimal(M,d),tradeAmountIn:O.toDecimal(T.amountIn,h),tradeAmountOut:O.toDecimal(T.amountOut,d)}}}}async getMinimumOrderBudget(t,e){if(0===t)return this.minOrderBudget;let s=await this.router.getSpotPrice(0,t);if(s)return A.mulSpot(this.minOrderBudget,s.amount,12,e);let a=await this.router.getSpotPrice(t,0);if(a)return A.divSpot(this.minOrderBudget,a.amount,12,e);throw new Error("Unable to calculate order budget")}getMaximumTradeCount(t,e,s){let a=e*2n/10n;if(a===0n)return 0;let i=Number(t/a),o=Math.floor(s/this.blockTime),r=Math.max(0,Math.floor(o*(1-.1)));return Math.min(i,r)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getOpenBudgetDcaOrder(t,e,s,a){let i=await this.router.getBestSell(t,e,s),{swaps:o}=i,r=o[0],n=o[o.length-1],{assetInDecimals:l}=r,{assetOutDecimals:c}=n,p=await this.getMinimumOrderBudget(t,l),h=i.amountIn<p,d=[];h&&d.push("OrderTooSmall");let f=this.toBlockPeriod(a),g=D.build(o),m={assetIn:t,assetOut:e,errors:d,maxTradeCount:0,tradeCount:0,tradeFee:i.tradeFee,tradeImpactPct:i.priceImpactPct,tradePeriod:f,tradeRoute:g,type:"Dca"};return{...m,amountIn:0n,amountOut:0n,tradeAmountIn:i.amountIn,tradeAmountOut:i.amountOut,toHuman(){return{...m,amountIn:"0",amountOut:"0",tradeAmountIn:O.toDecimal(i.amountIn,l),tradeAmountOut:O.toDecimal(i.amountOut,c)}}}}async getTwapSellOrder(t,e,s){let a=await this.router.getBestSell(t,e,s),{amountIn:i,swaps:o,priceImpactPct:r}=a,n=o[0],l=o[o.length-1],{assetInDecimals:c}=n,{assetOutDecimals:p}=l,h=Math.abs(r),d=this.getTwapTradeCount(h),f=i/BigInt(d),[g,m]=await Promise.all([this.getMinimumOrderBudget(t,c),this.router.getBestSell(n.assetIn,l.assetOut,f)]),b=d===1,P=i<g,_=m.priceImpactPct<-5,v=[];P||b?v.push("OrderTooSmall"):_&&v.push("OrderImpactTooBig");let T=m.amountOut*BigInt(d),H=m.tradeFee*BigInt(d),q=D.build(o),M={assetIn:t,assetOut:e,errors:v,tradeCount:d,tradeImpactPct:m.priceImpactPct,tradePeriod:6,tradeRoute:q,type:"TwapSell"};return{...M,amountIn:i,amountOut:T,tradeAmountIn:m.amountIn,tradeAmountOut:m.amountOut,tradeFee:H,toHuman(){return{...M,amountIn:O.toDecimal(i,c),amountOut:O.toDecimal(T,p),tradeAmountIn:O.toDecimal(m.amountIn,c),tradeAmountOut:O.toDecimal(m.amountOut,p),tradeFee:O.toDecimal(H,p)}}}}async getTwapBuyOrder(t,e,s){let a=await this.router.getBestBuy(t,e,s),{amountOut:i,swaps:o,priceImpactPct:r}=a,n=o[0],l=o[o.length-1],{assetInDecimals:c}=n,{assetOutDecimals:p}=l,h=Math.abs(r),d=this.getTwapTradeCount(h),f=i/BigInt(d),[g,m]=await Promise.all([this.getMinimumOrderBudget(t,c),this.router.getBestBuy(n.assetIn,l.assetOut,f)]),b=m.amountIn*BigInt(d),P=d===1,_=b<g,v=m.priceImpactPct<-5,T=[];_||P?T.push("OrderTooSmall"):v&&T.push("OrderImpactTooBig");let H=m.tradeFee*BigInt(d),q=D.build(o),M={assetIn:t,assetOut:e,errors:T,tradeCount:d,tradeImpactPct:m.priceImpactPct,tradePeriod:6,tradeRoute:q,type:"TwapBuy"};return{...M,amountIn:b,amountOut:i,tradeAmountIn:m.amountIn,tradeAmountOut:m.amountOut,tradeFee:H,toHuman(){return{...M,amountIn:O.toDecimal(b,c),amountOut:O.toDecimal(i,p),tradeAmountIn:O.toDecimal(m.amountIn,c),tradeAmountOut:O.toDecimal(m.amountOut,p),tradeFee:O.toDecimal(H,c)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let a=216e5/(this.blockTime*6);return Math.round(a)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,s=Math.round(e);return Math.max(s,6)}};export{Dt as DCA_TIME_RESERVE,Mt as DEFAULT_BLOCK_TIME,Lt as DEFAULT_MIN_BUDGET,Ht as ORDER_MIN_BLOCK_PERIOD,tt as Router,st as TWAP_EXECUTION_INTERVAL,bt as TWAP_MAX_DURATION,ht as TWAP_MAX_PRICE_IMPACT,Id as TWAP_TX_MULTIPLIER,kt as TradeOrderError,Rt as TradeOrderType,D as TradeRouteBuilder,et as TradeRouter,Pt as TradeScheduler,Et as TradeType};
|
|
1
|
+
var $t=Object.defineProperty;var Y=(u,t)=>{for(var e in t)$t(u,e,{get:t[e],enumerable:!0})};import Xt from"buffer";typeof window<"u"&&(window.Buffer=Xt.Buffer);var z=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Yt=10,K=class{isNotVisited(t,e){let s=!0;return e.forEach(a=>{(a[0]===t[0]||a[1]===t[1])&&(s=!1)}),s}findPaths(t,e,s){let a=[],i=new z,o=[];for(o.push([e,""]),i.enqueue(o);i.size()>0;){let r=i.dequeue();if(!r||r.length>Yt)continue;let n=r[r.length-1];(s===null||n[0]===s)&&a.push(r),t.get(n[0])?.forEach(c=>{if(this.isNotVisited(c,r)){let m=[...r];m.push(c),i.enqueue(m)}})}return a}findShortestPaths(t,e,s){let a=[],i=new z,o=[];o.push([e,""]),i.enqueue(o);let r=1/0;for(;i.size()>0;){let n=i.dequeue();if(!n)continue;let l=n[n.length-1];if(l[0]===s){n.length<r?(r=n.length,a.length=0,a.push(n)):n.length===r&&a.push(n);continue}let c=t.get(l[0]);for(let m of c??[])this.isNotVisited(m,n)&&i.enqueue([...n,m])}return a}buildAndPopulateGraph(t,e){let s=new Map;for(let a of t)s.set(parseInt(a),[]);for(let[a,i,o]of e)s.get(i)?.push([o,a]);return s}};function dt(u){let t={};for(let e of u){let s=e.tokens.length;for(let a=0;a<s;a++){t[e.tokens[a].id]||(t[e.tokens[a].id]=[]);for(let i=0;i<s;i++){if(a==i)continue;let o=[e.address,e.tokens[a].id,e.tokens[i].id];t[e.tokens[a].id].push(o)}}}return t}import{calculate_in_given_out as zt,calculate_out_given_in as Kt,calculate_linear_weights as jt,calculate_pool_trade_fee as Qt,get_spot_price as Jt}from"@galacticcouncil/math-lbp";var R=class{static getSpotPrice(t,e,s,a,i){return Jt(t,e,s,a,i)}static calculateInGivenOut(t,e,s,a,i){return zt(t,e,s,a,i)}static calculateOutGivenIn(t,e,s,a,i){return Kt(t,e,s,a,i)}static calculateLinearWeights(t,e,s,a,i){return jt(t,e,s,a,i)}static calculatePoolTradeFee(t,e,s){return Qt(t,e,s)}};import{big as xt,RUNTIME_DECIMALS as wt}from"@galacticcouncil/common";var it={};Y(it,{withTimeout:()=>Zt});function Zt(u,t,e="timeout"){return new Promise((s,a)=>{let i=setTimeout(()=>a(new Error(e)),t);u.then(o=>{clearTimeout(i),s(o)},o=>{clearTimeout(i),a(o)})})}var A={};Y(A,{divSpot:()=>ee,getFraction:()=>se,mulScaled:()=>It,mulSpot:()=>te});import{RUNTIME_DECIMALS as St}from"@galacticcouncil/common";function It(u,t,e,s,a){let i=e+s-a,o=u*t;return i>0?o/BigInt(10)**BigInt(i):i<0?o*BigInt(10)**BigInt(-i):o}function te(u,t,e,s){return It(u,t,e,St,s)}function ee(u,t,e,s){if(t===0n)return 0n;let a=BigInt(10)**BigInt(St+s-e);return u*a/t}function se(u,t,e=2){if(t<.01||t>100)throw new Error("Supported range is from 0.01% - 100%");let s=BigInt(10)**BigInt(e),a=BigInt(Math.round(t*Number(s)));return u*a/(BigInt(100)*s)}var f={};Y(f,{FeeUtils:()=>gt,shiftNeg:()=>oe});import ie from"big.js";var gt=class u{static toPct(t){let[e,s]=t;return u.safeDivide(e*100,s)}static toRaw(t){let[e,s]=t;return u.safeDivide(e,s)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,s=12){let a=10**s;return Math.round(t*a/e)/a}static safeRound(t){return parseFloat(t.toPrecision(15))}};function oe(u,t){let e=ie(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var j={};Y(j,{findNestedKey:()=>re,findNestedObj:()=>ne,jsonFormatter:()=>le});var re=(u,t)=>{let e=[];return JSON.stringify(u,(s,a)=>(a&&a[t]&&e.push(a),a)),e[0]},ne=(u,t,e)=>{let s;return JSON.stringify(u,(a,i)=>(i&&i[t]===e&&(s=i),i)),s},le=(u,t)=>typeof t=="bigint"?t.toString():t;var w={};Y(w,{calculateBuyFee:()=>me,calculateDiffToAvg:()=>ce,calculateDiffToRef:()=>ue,calculateSellFee:()=>pe});import k from"big.js";function ce(u,t){let e=k(u.toString()),s=k(t.toString());return e.minus(s).abs().div(e.plus(s).div(2)).mul(100).round(2).toNumber()}function ue(u,t){if(t===0n)return 0;let e=k(u.toString()),s=k(t.toString());return e.minus(s).div(s).mul(100).round(2).toNumber()}function pe(u,t){if(u===0n)return 0;let e=k(u.toString()),s=k(t.toString());return k(1).minus(s.div(e)).mul(100).round(2).toNumber()}function me(u,t){if(u===0n)return 0;let e=k(u.toString());return k(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}import{TLRUCache as Qs}from"@thi.ng/cache";var{FeeUtils:Tt}=f,ot=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new u(t)}constructor(t){this.type="LBP",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.fee=t.fee,this.repayFeeApply=t.repayFeeApply}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:i.balance,decimalsIn:a.decimals,decimalsOut:i.decimals,weightIn:a.weight,weightOut:i.weight}}validateAndBuy(t,e,s){let a=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let o=t.balanceOut/this.maxOutRatio;if(e>o&&i.push("MaxOutRatioExceeded"),a===t.assetOut){let r=this.calculateTradeFee(e,s),n=Tt.toPct(this.repayFeeApply?s.repayFee:s.exchangeFee),l=e+r,c=this.calculateInGivenOut(t,l),m=t.balanceIn/this.maxInRatio;return c>m&&i.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:n,errors:i}}else{let r=this.calculateInGivenOut(t,e),n=t.balanceIn/this.maxInRatio;return r>n&&i.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:i}}}validateAndSell(t,e,s){let a=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let o=t.balanceIn/this.maxInRatio;if(e>o&&i.push("MaxInRatioExceeded"),a===t.assetIn){let r=this.calculateOutGivenIn(t,e),n=t.balanceOut/this.maxOutRatio;return r>n&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:i}}else{let r=this.calculateOutGivenIn(t,e),n=this.calculateTradeFee(r,s),l=Tt.toPct(this.repayFeeApply?s.repayFee:s.exchangeFee),c=r-n,m=t.balanceOut/this.maxOutRatio;return c>m&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:c,feePct:l,errors:i}}}calculateInGivenOut(t,e){let s=R.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),a=BigInt(s);return a<0n?0n:a}calculateOutGivenIn(t,e){let s=R.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),a=BigInt(s);return a<0n?0n:a}spotPriceInGivenOut(t){let e=R.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),xt.toBigInt(1,wt).toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=R.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),xt.toBigInt(1,wt).toString());return BigInt(e)}calculateTradeFee(t,e){let s=R.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(s)}};import{CompatibilityLevel as lr}from"polkadot-api";import{Subscription as ur,distinctUntilChanged as pr,filter as mr,map as dr}from"rxjs";import{memoize1 as Po}from"@thi.ng/memoize";import{TLRUCache as fo}from"@thi.ng/cache";import{ReplaySubject as xo,Subscription as wo,combineLatest as To,defer as vo,from as Bo,interval as Ao,merge as Fo,of as Eo,EMPTY as _o}from"rxjs";import{bufferCount as ko,bufferTime as Co,catchError as Mo,filter as Lo,finalize as Do,map as Ho,pairwise as No,repeat as qo,skip as Go,share as Vo,startWith as Uo,switchMap as Wo,tap as $o,throttleTime as Xo}from"rxjs/operators";import{hydration as Ya,hydrationNext as za,hydrationIce as Ka}from"@galacticcouncil/descriptors";import{log as de}from"@galacticcouncil/common";import{map as Ha,shareReplay as Na,tap as qa}from"rxjs";import{defer as fa,from as Sa,of as Ia,timer as Oa}from"rxjs";import{catchError as wa,distinctUntilChanged as Ta,expand as va,map as Ba,shareReplay as Aa,skip as Fa,switchMap as Ea,timeout as _a}from"rxjs/operators";var{logger:Va}=de;import{getWsProvider as ti}from"polkadot-api/ws";import{withLogsRecorder as si}from"polkadot-api/logs-provider";import{Binary as Pi}from"polkadot-api";import{log as ge}from"@galacticcouncil/common";import{combineLatest as wi,concat as Ti,defer as vi,from as Bi}from"rxjs";import{bufferCount as Fi,distinctUntilChanged as Ei,debounceTime as _i,map as Ri,retry as ki,startWith as Ci,switchMap as Mi,tap as Li,take as Di,skip as Hi,connect as Ni}from"rxjs/operators";var{logger:Ui}=ge;import{BehaviorSubject as ao}from"rxjs";import{log as be}from"@galacticcouncil/common";var co={Aave:"AAVE",LBP:"LBP",Omnipool:"OMNI",Stableswap:"STBL",XYK:"XYK",HSM:"HSM"},{logger:uo}=be;var{withTimeout:ir}=it;import{calculate_in_given_out as ye,calculate_lrna_in_given_out as fe,calculate_out_given_in as Se,calculate_out_given_lrna_in as Ie,calculate_spot_price as Oe,calculate_lrna_spot_price as xe,calculate_shares as we,calculate_liquidity_out as Te,calculate_liquidity_lrna_out as ve,verify_asset_cap as Be,calculate_liquidity_hub_in as Ae,is_sell_allowed as Fe,is_buy_allowed as Ee,is_add_liquidity_allowed as _e,is_remove_liquidity_allowed as Re,recalculate_asset_fee as ke,recalculate_protocol_fee as Ce}from"@galacticcouncil/math-omnipool";import V from"big.js";var S=class{static calculateSpotPrice(t,e,s,a){return Oe(t,e,s,a)}static calculateLrnaSpotPrice(t,e){return xe(t,e)}static calculateInGivenOut(t,e,s,a,i,o,r,n,l,c){return ye(t,e,s,a,i,o,r,n,l,c)}static calculateLrnaInGivenOut(t,e,s,a,i,o){return fe(t,e,s,a,i,o)}static calculateOutGivenIn(t,e,s,a,i,o,r,n,l,c){return Se(t,e,s,a,i,o,r,n,l,c)}static calculateOutGivenLrnaIn(t,e,s,a,i,o){return Ie(t,e,s,a,i,o)}static calculateShares(t,e,s,a){return we(t,e,s,a)}static calculateLiquidityOut(t,e,s,a,i,o,r,n){return Te(t,e,s,a,i,o,r,n)}static calculateLiquidityLRNAOut(t,e,s,a,i,o,r,n){return ve(t,e,s,a,i,o,r,n)}static calculateCapDifference(t,e,s,a){let i=V(e),o=V(t),r=V(a),n=V(s),l=V(10).pow(18),c=n.div(l);if(i.div(r).lt(c)){let h=c.times(r).minus(i).times(o),d=i.times(V(1).minus(c));return h.div(d).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,s,a){return Ae(t,e,s,a)}static isSellAllowed(t){return Fe(t)}static isBuyAllowed(t){return Ee(t)}static isAddLiquidityAllowed(t){return _e(t)}static isRemoveLiquidityAllowed(t){return Re(t)}static recalculateAssetFee(t,e,s,a,i,o,r,n,l,c,m){return ke(t,e,s,a,i,o,r,n,l,c,m)}static recalculateProtocolFee(t,e,s,a,i,o,r,n,l,c,m){return Ce(t,e,s,a,i,o,r,n,l,c,m)}static verifyAssetCap(t,e,s,a){return Be(t,e,s,a)}};import{big as Me}from"@galacticcouncil/common";var{FeeUtils:_}=f,nt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new u(t)}constructor(t){this.type="Omnipool",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.hubAssetId=t.hubAssetId}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:a.hubReserves,hubReservesOut:i.hubReserves,sharesIn:a.shares,sharesOut:i.shares,decimalsIn:a.decimals,decimalsOut:i.decimals,balanceIn:a.balance,balanceOut:i.balance,tradeableIn:a.tradeable,tradeableOut:i.tradeable,assetInEd:a.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,s){let a=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,s),o=a===0n?0:w.calculateBuyFee(a,i),r=[],n=S.isSellAllowed(t.tradeableIn),l=S.isBuyAllowed(t.tradeableOut);(!n||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&r.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&r.push("MaxOutRatioExceeded");let m=t.balanceIn/this.maxInRatio;return i>m&&r.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:a,amountOut:e,feePct:o,errors:r}}validateAndSell(t,e,s){let a=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,s),o=w.calculateSellFee(a,i),r=[],n=S.isSellAllowed(t.tradeableIn),l=S.isBuyAllowed(t.tradeableOut);(!n||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&r.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&r.push("MaxInRatioExceeded");let m=t.balanceOut/this.maxOutRatio;return i>m&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:i,feePct:o,errors:r}}calculateInGivenOut(t,e,s){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,s);let a=S.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?_.toRaw(s.assetFee).toString():"0",s?_.toRaw(s.protocolFee).toString():"0",s?_.toRaw(s.maxSlipFee).toString():"0"),i=BigInt(a);return i<0n?0n:i}calculateLrnaInGivenOut(t,e,s){let a=S.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?_.toRaw(s.assetFee).toString():"0",s?_.toRaw(s.maxSlipFee).toString():"0"),i=BigInt(a);return i<0n?0n:i}calculateOutGivenIn(t,e,s){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,s);let a=S.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?_.toRaw(s.assetFee).toString():"0",s?_.toRaw(s.protocolFee).toString():"0",s?_.toRaw(s.maxSlipFee).toString():"0"),i=BigInt(a);return i<0n?0n:i}calculateOutGivenLrnaIn(t,e,s){let a=S.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?_.toRaw(s.assetFee).toString():"0",s?_.toRaw(s.maxSlipFee).toString():"0"),i=BigInt(a);return i<0n?0n:i}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=S.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceLrnaInGivenOut(t){let e=S.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=S.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}spotPriceOutGivenLrnaIn(t){let e=S.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}normalizeSpot(t,e,s){let a=e-s;if(a===0)return t;let i=Me.pow10(Math.abs(a));return a>0?t*i:t/i}};import{AccountId as rn,Binary as vt,CompatibilityLevel as nn,Enum as He}from"polkadot-api";import{toHex as un}from"@polkadot-api/utils";import{Subscription as mn,distinctUntilChanged as dn,filter as gn,finalize as hn,map as bn,merge as Pn,tap as yn}from"rxjs";import{HYDRATION_SS58_PREFIX as Sn}from"@galacticcouncil/common";var{FeeUtils:jr}=f;var{FeeUtils:Fn}=f,En=vt.toHex(vt.fromText("omnipool")),_n=He("Short");import{calculate_in_given_out as qe,calculate_out_given_in as Ge,calculate_amplification as Ve,calculate_add_one_asset as Ue,calculate_liquidity_out_one_asset as We,calculate_shares as $e,calculate_shares_for_amount as Xe,calculate_spot_price_with_fee as Ye,pool_account_name as ze,recalculate_peg as Ke}from"@galacticcouncil/math-stableswap";var B=class{static getPoolAddress(t){return ze(t)}static defaultPegs(t){let e=[];for(let s=0;s<t;s++)e.push(["1","1"]);return e}static calculateAmplification(t,e,s,a,i){return Ve(t,e,s,a,i)}static calculateInGivenOut(t,e,s,a,i,o,r){return qe(t,e,s,a,i,o,r)}static calculateAddOneAsset(t,e,s,a,i,o,r){return Ue(t,e,s,a,i,o,r)}static calculateSharesForAmount(t,e,s,a,i,o,r){return Xe(t,e,s,a,i,o,r)}static calculateOutGivenIn(t,e,s,a,i,o,r){return Ge(t,e,s,a,i,o,r)}static calculateLiquidityOutOneAsset(t,e,s,a,i,o,r){return We(t,e,s,a,i,o,r)}static calculateShares(t,e,s,a,i,o){return $e(t,e,s,a,i,o)}static calculateSpotPriceWithFee(t,e,s,a,i,o,r,n){return Ye(t,e,s,a,i,o,r,n)}static recalculatePegs(t,e,s,a,i,o){let r=Ke(t,e,s,a,i,o);return JSON.parse(r)}};import{RUNTIME_DECIMALS as je,big as Bt}from"@galacticcouncil/common";var{FeeUtils:U}=f,W=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;isRampPeriod;id;fee;totalIssuance;pegs;static fromPool(t){return new u(t)}constructor(t){this.type="Stableswap",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.amplification=t.amplification,this.isRampPeriod=t.isRampPeriod,this.id=t.id,this.fee=t.fee,this.totalIssuance=t.totalIssuance,this.pegs=t.pegs}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:i.balance,decimalsIn:a.decimals,decimalsOut:i.decimals,tradeableIn:this.id===t?15:a.tradeable,tradeableOut:this.id===e?15:i.tradeable,assetInEd:a.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,s){let a=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,s),o=a===0n?0:w.calculateBuyFee(a,i),r=[],n=S.isSellAllowed(t.tradeableIn),l=S.isBuyAllowed(t.tradeableOut);return(!n||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&r.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:a,amountOut:e,feePct:o,errors:r}}validateAndSell(t,e,s){let a=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,s),o=w.calculateSellFee(a,i),r=[],n=S.isSellAllowed(t.tradeableIn),l=S.isBuyAllowed(t.tradeableOut);return(!n||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&r.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:a,amountOut:i,feePct:o,errors:r}}calculateIn(t,e,s){let a=B.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),s?U.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateAddOneAsset(t,e,s){let a=B.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),s?U.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateSharesForAmount(t,e,s){let a=B.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),s?U.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateInGivenOut(t,e,s){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,s):t.assetIn==this.id?this.calculateSharesForAmount(t,e,s):this.calculateIn(t,e,s)}spotPriceInGivenOut(t){let e=B.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());return this.normalizeSpot(BigInt(e),t.assetOut===this.id,t.assetIn===this.id,t.decimalsOut,t.decimalsIn)}calculateOut(t,e,s){let a=B.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),s?U.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateWithdrawOneAsset(t,e,s){let a=B.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),s?U.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateShares(t,e,s){let a=B.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),s?U.toRaw(s.fee).toString():"0",this.getPegs()),i=BigInt(a);return i<0n?0n:i}calculateOutGivenIn(t,e,s){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,s):t.assetOut==this.id?this.calculateShares(t,e,s):this.calculateOut(t,e,s)}spotPriceOutGivenIn(t){let e=B.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());return this.normalizeSpot(BigInt(e),t.assetIn===this.id,t.assetOut===this.id,t.decimalsIn,t.decimalsOut)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:s,decimals:a})=>({asset_id:e,amount:s,decimals:a}));return JSON.stringify(t,j.jsonFormatter)}getAssets(t,e){let s={asset_id:Number(t),amount:e.toString()};return JSON.stringify([s],j.jsonFormatter)}normalizeSpot(t,e,s,a,i){return e?t*Bt.pow10(je-i):s?t/Bt.pow10(i-a):t}};import{AccountId as cl,CompatibilityLevel as ul}from"polkadot-api";import{toHex as ml}from"@polkadot-api/utils";import{blake2b as gl}from"@noble/hashes/blake2b";import{Subscription as bl,distinctUntilChanged as Pl,map as yl,merge as fl,tap as Sl}from"rxjs";import{HYDRATION_SS58_PREFIX as Ol,RUNTIME_DECIMALS as xl}from"@galacticcouncil/common";var{FeeUtils:Cl}=f;import{calculate_in_given_out as Je,calculate_out_given_in as Ze,calculate_pool_trade_fee as ts,get_spot_price as es,calculate_liquidity_in as ss,calculate_shares as as,calculate_spot_price as is,calculate_spot_price_with_fee as os,calculate_liquidity_out_asset_a as rs,calculate_liquidity_out_asset_b as ns}from"@galacticcouncil/math-xyk";var D=class{static getSpotPrice(t,e,s){return es(t,e,s)}static calculateInGivenOut(t,e,s){return Je(t,e,s)}static calculateOutGivenIn(t,e,s){return Ze(t,e,s)}static calculatePoolTradeFee(t,e,s){return ts(t,e,s)}static calculateLiquidityIn(t,e,s){return ss(t,e,s)}static calculateSpotPrice(t,e){return is(t,e)}static calculateSpotPriceWithFee(t,e,s,a){return os(t,e,s,a)}static calculateShares(t,e,s){return as(t,e,s)}static calculateLiquidityOutAssetA(t,e,s,a){return rs(t,e,s,a)}static calculateLiquidityOutAssetB(t,e,s,a){return ns(t,e,s,a)}};import{big as ls}from"@galacticcouncil/common";var{FeeUtils:At}=f,lt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t)}constructor(t){this.type="XYK",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:a.decimals,decimalsOut:i.decimals,balanceIn:a.balance,balanceOut:i.balance,assetInEd:a.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,s){let a=this.calculateInGivenOut(t,e),i=this.calculateTradeFee(a,s),o=At.toPct(s.exchangeFee),r=a+i,n=[];(e<this.minTradingLimit||a<t.assetInEd)&&n.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&n.push("MaxOutRatioExceeded");let c=t.balanceIn/this.maxInRatio;return r>c&&n.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:a,amountOut:e,feePct:o,errors:n}}validateAndSell(t,e,s){let a=this.calculateOutGivenIn(t,e),i=this.calculateTradeFee(a,s),o=At.toPct(s.exchangeFee),r=a-i,n=[];(e<this.minTradingLimit||a<t.assetOutEd)&&n.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&n.push("MaxInRatioExceeded");let c=t.balanceOut/this.maxOutRatio;return r>c&&n.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:r,feePct:o,errors:n}}calculateInGivenOut(t,e){let s=D.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(s);return a<0n?0n:a}calculateOutGivenIn(t,e){let s=D.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(s);return a<0n?0n:a}spotPriceInGivenOut(t){let e=D.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){let e=D.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}calculateTradeFee(t,e){let s=D.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(s)}normalizeSpot(t,e,s){let a=e-s;if(a===0)return t;let i=ls.pow10(Math.abs(a));return a>0?t*i:t/i}};import{CompatibilityLevel as rc}from"polkadot-api";import{Subscription as lc}from"rxjs";import{big as Ft,RUNTIME_DECIMALS as Et}from"@galacticcouncil/common";var ct=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t)}constructor(t){this.type="Aave",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(o=>[o.id,o])),a=s.get(t),i=s.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:i.balance,decimalsIn:a.decimals,decimalsOut:i.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,s){let a=this.calculateInGivenOut(t,e),i=[];return e>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:i}}validateAndSell(t,e,s){let a=this.calculateOutGivenIn(t,e),i=[];return a>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:i}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){return Ft.toBigInt(1,Et)}spotPriceOutGivenIn(t){return Ft.toBigInt(1,Et)}calculateTradeFee(t,e){return 0n}};import{AccountId as qc,Binary as Gc}from"polkadot-api";import{toHex as Uc}from"@polkadot-api/utils";import{Subscription as $c,filter as Xc,map as Yc,mergeMap as zc}from"rxjs";import{decodeEventLog as jc}from"viem";import{erc20 as us,HYDRATION_SS58_PREFIX as Jc}from"@galacticcouncil/common";var{ERC20:ou}=us;import{calculate_collateral_in_given_hollar_out as ms,calculate_collateral_out_given_hollar_in as ds,calculate_hollar_in_given_collateral_out as gs,calculate_hollar_out_given_collateral_in as hs,calculate_imbalance as bs,calculate_max_price as Ps,calculate_buyback_limit as ys,calculate_buyback_price_with_fee as fs}from"@galacticcouncil/math-hsm";var F=class{static calculateCollateralInGivenHollarOut(t,e,s){return ms(t,e,s)}static calculateCollateralOutGivenHollarIn(t,e,s){return ds(t,e,s)}static calculateHollarOutGivenCollateralIn(t,e,s){return hs(t,e,s)}static calculateHollarInGivenCollateralOut(t,e,s){return gs(t,e,s)}static calculateImbalance(t,e,s){return bs(t,e,s)}static calculateBuybackLimit(t,e){return ys(t,e)}static calculateBuybackPriceWithFee(t,e,s){return fs(t,e,s)}static calculateMaxPrice(t,e){return Ps(t,e)}};import{big as C,RUNTIME_DECIMALS as ut}from"@galacticcouncil/common";var{FeeUtils:$}=f,pt=class u extends W{hsmAddress;hsmMintCapacity;hollarId;hollarH160;collateralId;collateralBalance;maxBuyPriceCoefficient;maxInHolding;purchaseFee;buyBackFee;buyBackRate;static fromPool(t){return new u(t)}constructor(t){super(t),this.type="HSM",this.hsmAddress=t.hsmAddress,this.hsmMintCapacity=t.hsmMintCapacity,this.hollarId=t.hollarId,this.hollarH160=t.hollarH160,this.collateralId=t.collateralId,this.collateralBalance=t.collateralBalance,this.maxBuyPriceCoefficient=t.maxBuyPriceCoefficient,this.maxInHolding=t.maxInHolding,this.purchaseFee=t.purchaseFee,this.buyBackFee=t.buyBackFee,this.buyBackRate=t.buyBackRate}validatePair(t,e){return!0}parsePair(t,e){return super.parsePair(t,e)}validateTradeHollarIn(t,e,s){let a=this.parsePair(t.assetOut,t.assetIn),i=super.calculateInGivenOut(a,e,{fee:this.fee}),o=this.calculateBuybackLimit(t);e>o&&s.push("MaxBuyBackExceeded");let r=this.calculateMaxPrice(t);return this.calculateBuyPrice(t,e,i)>r&&s.push("MaxBuyPriceExceeded"),i>this.collateralBalance&&s.push("InsufficientCollateral"),s}validateTradeHollarOut(t,e,s){return this.collateralBalance+t>this.maxInHolding&&s.push("MaxHoldingExceeded"),e>this.hsmMintCapacity&&s.push("FacilitatorCapacityExceeded"),s}validateTradeConstraints(t,e,s){let a=[];return t.assetIn===this.hollarId?this.validateTradeHollarIn(t,e,a):this.validateTradeHollarOut(e,s,a)}validateAndBuy(t,e){let s=this.calculateInGivenOut(t,e),a=this.validateTradeConstraints(t,s,e);return{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:a}}validateAndSell(t,e){let s=this.calculateOutGivenIn(t,e),a=this.validateTradeConstraints(t,e,s);return{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:a}}calculateHollarInGivenCollateralOut(t,e){let s=super.calculateInGivenOut(t,e,{fee:this.fee}),a=F.calculateHollarInGivenCollateralOut(e.toString(),s.toString(),$.toRaw(this.buyBackFee).toString());return BigInt(a)}calculateCollateralInGivenHollarOut(t){let e=this.getCollateralPeg(),s=F.calculateCollateralInGivenHollarOut(t.toString(),JSON.stringify(e),$.toRaw(this.purchaseFee).toString());return BigInt(s)}calculateInGivenOut(t,e){return t.assetOut==this.hollarId?this.calculateCollateralInGivenHollarOut(e):this.calculateHollarInGivenCollateralOut(t,e)}calculateCollateralOutGivenHollarIn(t,e){let s=super.calculateOutGivenIn(t,e,{fee:this.fee}),a=F.calculateCollateralOutGivenHollarIn(e.toString(),s.toString(),$.toRaw(this.buyBackFee).toString());return BigInt(a)}calculateHollarOutGivenCollateralIn(t){let e=this.getCollateralPeg(),s=F.calculateHollarOutGivenCollateralIn(t.toString(),JSON.stringify(e),$.toRaw(this.purchaseFee).toString());return BigInt(s)}calculateOutGivenIn(t,e){return t.assetIn==this.hollarId?this.calculateCollateralOutGivenHollarIn(t,e):this.calculateHollarOutGivenCollateralIn(e)}calculateImbalance(t){let e=this.getCollateralPeg(),s=F.calculateImbalance(t.balanceIn.toString(),JSON.stringify(e),t.balanceOut.toString());return BigInt(s)}calculateBuybackLimit(t){let e=this.calculateImbalance(t),s=F.calculateBuybackLimit(e.toString(),$.toRaw(this.buyBackRate).toString());return BigInt(s)}calculateBuyPrice(t,e,s){let a=F.calculateBuybackPriceWithFee(s.toString(),e.toString(),$.toRaw(this.buyBackFee).toString()),[i,o]=JSON.parse(a),r=C.pow10(t.decimalsIn+ut-t.decimalsOut);return BigInt(i)*r/BigInt(o)}calculateMaxPrice(t){let e=this.getCollateralPeg(),s=F.calculateMaxPrice(JSON.stringify(e),this.maxBuyPriceCoefficient.toString()),[a,i]=JSON.parse(s),o=C.pow10(ut-t.decimalsOut);return BigInt(a)*o/BigInt(i)}spotPriceInGivenOut(t){let e=C.toBigInt(1,t.decimalsOut),a=this.calculateInGivenOut(t,e)*C.pow10(ut-t.decimalsOut);return this.normalizeSpotPrice(a,t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){let e=C.toBigInt(1,t.decimalsIn),a=this.calculateOutGivenIn(t,e)*C.pow10(ut-t.decimalsIn);return this.normalizeSpotPrice(a,t.decimalsIn,t.decimalsOut)}getCollateralPeg(){let t=this.tokens.findIndex(a=>a.id!==this.hollarId),e=this.pegs[t],s=this.tokens[t].decimals;return this.isDefaultPeg(e)?[C.toBigInt(1,18).toString(),C.toBigInt(1,s).toString()]:e}isDefaultPeg(t){let[e,s]=t;return Array.isArray(t)&&t.length===2&&e==="1"&&s==="1"}normalizeSpotPrice(t,e,s){let a=e-s;if(a===0)return t;let i=C.pow10(Math.abs(a));return a>0?t*i:t/i}};import{AccountId as Du,Binary as Hu,CompatibilityLevel as Nu}from"polkadot-api";import{toHex as Vu}from"@polkadot-api/utils";import{Subscription as $u,combineLatest as Xu,filter as Yu,map as zu,mergeMap as Ku,pairwise as ju}from"rxjs";import{decodeEventLog as Ju}from"viem";import{h160 as Is,HYDRATION_SS58_PREFIX as tp}from"@galacticcouncil/common";var{FeeUtils:np}=f,{H160:lp}=Is;var Z=class{static get(t){switch(t.type){case"Aave":return ct.fromPool(t);case"XYK":return lt.fromPool(t);case"Omnipool":return nt.fromPool(t);case"LBP":return ot.fromPool(t);case"Stableswap":return W.fromPool(t);case"HSM":return pt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{log as ws}from"@galacticcouncil/common";import{Subject as qp,Subscription as Gp,takeUntil as Vp}from"rxjs";var mt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var{logger:om}=ws;var tt=class{getProposals(t,e,s){let a=s.filter(p=>p.type==="XYK"),i=s.filter(p=>p.type!=="XYK"),o=new Set(i.map(p=>p.tokens).flat().map(p=>p.id)),r=o.has(t),n=o.has(e),l=new K,c=p=>{let b=dt(p),y=Object.keys(b),E=y.flatMap(v=>b[v]);return l.buildAndPopulateGraph(y,E)};if(!r&&!n){let p=a.filter(E=>E.tokens.find(v=>v.id===t)||E.tokens.find(v=>v.id===e)),b=c(p),y=l.findPaths(b,t,e);return this.parsePaths(y)}if(r&&n){let p=c(i),b=l.findPaths(p,t,e);return this.parsePaths(b)}let m=r?e:t,h=a.filter(p=>p.tokens.some(b=>b.id===m));if(h.length===0)return[];let d=[...i,...h],P=c(d),g=l.findPaths(P,t,e);return this.parsePaths(g)}parsePaths(t){let e=[];for(let s of t){let a=[];for(let i=0;i<s.length;i++){let o=s[i],r=s[i+1];if(r==null)break;a.push(this.toEdge(o,r))}e.push(a)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var et=class{routeSuggester;routeProposals;ctx;filter={};constructor(t){this.ctx=t,this.routeSuggester=new tt,this.routeProposals=new Map}async withFilter(t){this.filter=t||{},this.routeProposals.clear(),this.onFilterChanged()}onFilterChanged(){}buildRouteKey(t,e,s){return`${t}->${e}::${s.length}`}applyPoolFilter(t){let{useOnly:e=[],exclude:s=[]}=this.filter,a=new Set(e),i=new Set(s);return t.filter(o=>i.has(o.type)?!1:a.size>0?a.has(o.type):!0)}async getPools(){let t=await this.ctx.getPools();return this.applyPoolFilter(t)}async getRoutes(t,e){let s=await this.getPools();return this.validateInput(t,e,s),this.getPaths(t,e,s)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}async getRouteableAssets(t){let e=await this.getTradeableAssets();return(await Promise.all(e.filter(a=>a!==t).map(a=>this.getRoutes(a,t)))).filter(a=>a.length>0).map(([a])=>a[0].assetIn).sort()}validateInput(t,e,s){if(s.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let a=this.getAssets(s);if(!a.has(t))throw new Error(t+" is not supported asset");if(!a.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(s)}getAssets(t){let e=t.map(s=>s.tokens.map(a=>a.id)).flat().sort((s,a)=>s>a?1:-1);return new Set(e)}getPaths(t,e,s){let a=this.toPoolsMap(s);return this.getProposals(t,e,s).filter(o=>this.validPath(o,a)).map(o=>this.toHops(o,a))}getProposals(t,e,s){let a=this.buildRouteKey(t,e,s);if(this.routeProposals.has(a))return this.routeProposals.get(a);let i=this.routeSuggester.getProposals(t,e,s);return this.routeProposals.set(a,i),i}validPath(t,e){return t.length>0&&t.map(s=>this.validEdge(s,e)).reduce((s,a)=>s&&a)}validEdge([t,e,s],a){return a.get(t)?.validatePair(e,s)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,Z.get(e)]))}toHops(t,e){return t.map(([s,a,i])=>{let o=e.get(s);return{poolAddress:s,poolId:o?.id,pool:o?.type,assetIn:a,assetOut:i}})}};import{big as x,RUNTIME_DECIMALS as X}from"@galacticcouncil/common";var Rt=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Rt||{}),kt=(s=>(s.Dca="Dca",s.TwapSell="TwapSell",s.TwapBuy="TwapBuy",s))(kt||{}),Ct=(s=>(s.OrderTooSmall="OrderTooSmall",s.OrderTooBig="OrderTooBig",s.OrderImpactTooBig="OrderImpactTooBig",s))(Ct||{});var{FeeUtils:Mt}=f,st=class extends et{mlr;constructor(t){super(t),this.mlr=new Map}onFilterChanged(){this.mlr.clear()}buildCtxSync(t,e,s){let a=super.validateInput(t,e,s),i=super.getPaths(t,e,s);if(!i.length)throw new mt(t,e);return{paths:i,pools:s,poolsMap:a}}async withCtx(t,e,s){let a=await super.getPools(),i=this.buildCtxSync(t,e,a);return s(i)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((s,a)=>{let i=s[s.length-1].amountOut,o=a[a.length-1].amountOut;return i>o?-1:1});return e.find(s=>s.every(a=>a.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(s=>s.tradeFeeRange).length>0){let s=t.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,o)=>i+o),a=t.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,o)=>i+o);return[s,a]}}getPoolFeeRange(t,e){let s=t.min?Mt.toPct(t.min):void 0,a=t.max?Mt.toPct(t.max):void 0;if(s&&a)return[s,Math.max(a,e)]}async getBestSell(t,e,s){return this.getSell(t,e,s)}getSellSpot(t){let e=t[t.length-1];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getSell(t,e,s,a){return this.withCtx(t,e,async({paths:i,poolsMap:o})=>{let r;if(a)r=await this.toSellSwaps(s,a,o);else{let n=i.map(c=>this.toSellSwaps(s,c,o)),l=await Promise.all(n);r=this.findBestSellRoute(l)}return this.buildSell(o,r)})}async getSells(t,e,s){return this.withCtx(t,e,async({paths:a,poolsMap:i})=>{let o=a.map(n=>this.toSellSwaps(s,n,i));return(await Promise.all(o)).filter(n=>n.every(l=>l.errors.length==0)).map(n=>this.buildSell(i,n)).sort((n,l)=>n.amountOut>l.amountOut?-1:1)})}buildSell(t,e){let s=e[0],a=e[e.length-1],i=this.isDirectTrade(e),o=this.getSellSpot(e),r=a.amountOut,n=i?a.calculatedOut:this.calculateDelta0Y(s.amountIn,e,t),l=n-r,c=this.getRouteFeeRange(e),m=i?a.tradeFeePct:w.calculateSellFee(n,r),h=A.mulSpot(s.amountIn,o,s.assetInDecimals,a.assetOutDecimals),d=w.calculateDiffToRef(n,h);return{type:"Sell",amountIn:s.amountIn,amountOut:a.amountOut,spotPrice:o,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:d,swaps:e,toHuman(){return{type:"Sell",amountIn:x.toDecimal(s.amountIn,s.assetInDecimals),amountOut:x.toDecimal(a.amountOut,a.assetOutDecimals),spotPrice:x.toDecimal(o,X),tradeFee:x.toDecimal(l,a.assetOutDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:d,swaps:e.map(P=>P.toHuman())}}}}calculateSpot(t){return t.map(e=>e.spotPrice).reduce((e,s)=>e*s/10n**BigInt(X))}calculateDelta0Y(t,e,s){let a=[];for(let i=0;i<e.length;i++){let o=e[i],r=s.get(o.poolAddress);if(r==null)throw new Error("Pool does not exit");let n=r.parsePair(o.assetIn,o.assetOut),l;i>0?l=a[i-1]:l=t;let c=r.calculateOutGivenIn(n,l);a.push(c)}return a[a.length-1]}async calculateMostLiquidRoute(t,e,s){let{paths:a,pools:i,poolsMap:o}=s,l=i.filter(g=>g.tokens.some(p=>p.id===t)).map(g=>g.type==="Aave"?g.tokens:g.tokens.filter(p=>p.id===t)).map(g=>g.map(p=>p.balance).reduce((p,b)=>p+b)).sort((g,p)=>p<g?-1:1)[0],c=A.getFraction(l,.1),m=await Promise.all(a.map(g=>this.toSellSwaps(c,g,o))),d=this.findBestSellRoute(m).map(g=>({poolAddress:g.poolAddress,poolId:g?.poolId,pool:g.pool,assetIn:g.assetIn,assetOut:g.assetOut})),P=this.buildRouteKey(t,e,i);return this.mlr.set(P,d),d}async toSellSwaps(t,e,s){let a=[];for(let i=0;i<e.length;i++){let o=e[i],r=s.get(o.poolAddress);if(r==null)throw new Error("Pool does not exit");let n=r.parsePair(o.assetIn,o.assetOut),l;i>0?l=a[i-1].amountOut:l=typeof t=="string"?x.toBigInt(t,n.decimalsIn):t;let c=await this.ctx.getPoolFees(n,r),{amountOut:m,calculatedOut:h,feePct:d,errors:P}=r.validateAndSell(n,l,c),g=this.getPoolFeeRange(c,d),p=r.spotPriceOutGivenIn(n),b=A.mulSpot(l,p,n.decimalsIn,n.decimalsOut),y=w.calculateDiffToRef(h,b);a.push({...o,assetInDecimals:n.decimalsIn,assetOutDecimals:n.decimalsOut,amountIn:l,amountOut:m,calculatedOut:h,spotPrice:p,tradeFeePct:d,tradeFeeRange:g,priceImpactPct:y,errors:P,isSupply(){return r.type==="Aave"&&r.tokens[0].id===o.assetIn},isWithdraw(){return r.type==="Aave"&&r.tokens[1].id===o.assetIn},toHuman(){return{...o,amountIn:x.toDecimal(l,n.decimalsIn),amountOut:x.toDecimal(m,n.decimalsOut),calculatedOut:x.toDecimal(h,n.decimalsOut),spotPrice:x.toDecimal(p,X),tradeFeePct:d,tradeFeeRange:g,priceImpactPct:y,errors:P}}})}return a}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async s=>{let a=this.buildRouteKey(t,e,s.pools),i=this.mlr.get(a);return i||this.calculateMostLiquidRoute(t,e,s)})}async getSpotPrice(t,e){return this.withCtx(t,e,async s=>{let{pools:a,poolsMap:i}=s,o=this.buildRouteKey(t,e,a),r=this.mlr.get(o);r||(r=await this.calculateMostLiquidRoute(t,e,s));let n=await this.toSellSwaps("1",r,i);return{amount:this.getSellSpot(n),decimals:X}}).catch(()=>{})}findBestBuyRoute(t){let e=t.sort((s,a)=>{let i=s[0].amountIn,o=a[0].amountIn;return i>o?1:-1});return e.find(s=>s.every(a=>a.errors.length==0))||e[0]}async getBestBuy(t,e,s){return this.getBuy(t,e,s)}getBuySpot(t){let e=t[0];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getBuy(t,e,s,a){return this.withCtx(t,e,async({paths:i,poolsMap:o})=>{let r;if(a)r=await this.toBuySwaps(s,a,o);else{let n=i.map(c=>this.toBuySwaps(s,c,o)),l=await Promise.all(n);r=this.findBestBuyRoute(l)}return this.buildBuy(o,r)})}async getBuys(t,e,s){return this.withCtx(t,e,async({paths:a,poolsMap:i})=>{let o=a.map(n=>this.toBuySwaps(s,n,i));return(await Promise.all(o)).filter(n=>n.every(l=>l.errors.length==0)).map(n=>this.buildBuy(i,n)).sort((n,l)=>n.amountIn>l.amountIn?1:-1)})}buildBuy(t,e){let s=e[e.length-1],a=e[0],i=this.isDirectTrade(e),o=this.getBuySpot(e),r=a.amountIn,n=i?a.calculatedIn:this.calculateDelta0X(s.amountOut,e,t),l=r-n,c=this.getRouteFeeRange(e),m=i?a.tradeFeePct:w.calculateBuyFee(n,r),h=A.mulSpot(s.amountOut,o,s.assetOutDecimals,a.assetInDecimals),d;return n===0n?d=-100:d=w.calculateDiffToRef(h,n),{type:"Buy",amountOut:s.amountOut,amountIn:a.amountIn,spotPrice:o,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:d,swaps:e,toHuman(){return{type:"Buy",amountOut:x.toDecimal(s.amountOut,s.assetOutDecimals),amountIn:x.toDecimal(a.amountIn,a.assetInDecimals),spotPrice:x.toDecimal(o,X),tradeFee:x.toDecimal(l,a.assetInDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:d,swaps:e.map(P=>P.toHuman())}}}}calculateDelta0X(t,e,s){let a=[];for(let i=e.length-1;i>=0;i--){let o=e[i],r=s.get(o.poolAddress);if(r==null)throw new Error("Pool does not exit");let n=r.parsePair(o.assetIn,o.assetOut),l;i==e.length-1?l=t:l=a[0];let c=r.calculateInGivenOut(n,l);a.unshift(c)}return a[0]}async toBuySwaps(t,e,s){let a=[];for(let i=e.length-1;i>=0;i--){let o=e[i],r=s.get(o.poolAddress);if(r==null)throw new Error("Pool does not exit");let n=r.parsePair(o.assetIn,o.assetOut),l;i==e.length-1?l=typeof t=="string"?x.toBigInt(t,n.decimalsOut):t:l=a[0].amountIn;let c=await this.ctx.getPoolFees(n,r),{amountIn:m,calculatedIn:h,feePct:d,errors:P}=r.validateAndBuy(n,l,c),g=this.getPoolFeeRange(c,d),p=r.spotPriceInGivenOut(n),b=A.mulSpot(l,p,n.decimalsOut,n.decimalsIn),y;h===0n?y=-100:y=w.calculateDiffToRef(b,h),a.unshift({...o,assetInDecimals:n.decimalsIn,assetOutDecimals:n.decimalsOut,amountOut:l,amountIn:m,calculatedIn:h,spotPrice:p,tradeFeePct:d,tradeFeeRange:g,priceImpactPct:y,errors:P,isSupply(){return r.type==="Aave"&&r.tokens[0].id===o.assetIn},isWithdraw(){return r.type==="Aave"&&r.tokens[1].id===o.assetIn},toHuman(){return{...o,amountOut:x.toDecimal(l,n.decimalsOut),amountIn:x.toDecimal(m,n.decimalsIn),calculatedIn:x.toDecimal(h,n.decimalsIn),spotPrice:x.toDecimal(p,X),tradeFeePct:d,tradeFeeRange:g,priceImpactPct:y,errors:P}}})}return a}};import{big as O}from"@galacticcouncil/common";var Lt=6e3,Dt=1000000000000000n,at=6,bt=-5,Pt=216e5,xd=3,Ht=.1,Nt=6;import{Enum as qt}from"polkadot-api";var H=class{static build(t){return t.map(({assetIn:e,assetOut:s,pool:a,poolId:i})=>a==="Stableswap"?{pool:qt("Stableswap",i),asset_in:e,asset_out:s}:{pool:qt(a),asset_in:e,asset_out:s})}};var yt=class{schedulerOptions;router;constructor(t,e={}){this.router=new st(t),this.router.withFilter({exclude:["HSM"]}),this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Dt})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,s,a,i){let o=await this.router.getBestSell(t,e,s),{amountIn:r,swaps:n,priceImpactPct:l}=o,c=n[0],m=n[n.length-1],{assetInDecimals:h}=c,{assetOutDecimals:d}=m,P=Math.abs(l),g=await this.getMinimumOrderBudget(t,h),p=this.getOptimalTradeCount(P),b=this.getMaximumTradeCount(r,g,a),y=i||Math.min(p,b),E=Math.round(a/y),v=r/BigInt(y),T=await this.router.getBestSell(t,e,v),N=r<g,M=[];N&&M.push("OrderTooSmall");let G=await this.getAssetOutEd(m),L=T.amountOut*BigInt(y),Vt=this.toBlockPeriod(E),Ut=T.tradeFee*BigInt(y),Wt=H.build(n),ft={assetIn:t,assetOut:e,assetOutEd:G,errors:M,maxTradeCount:b,tradeCount:y,tradeFee:Ut,tradeImpactPct:T.priceImpactPct,tradePeriod:Vt,tradeRoute:Wt,type:"Dca"};return{...ft,amountIn:r,amountOut:L,tradeAmountIn:T.amountIn,tradeAmountOut:T.amountOut,toHuman(){return{...ft,amountIn:O.toDecimal(r,h),amountOut:O.toDecimal(L,d),assetOutEd:O.toDecimal(G,d),tradeAmountIn:O.toDecimal(T.amountIn,h),tradeAmountOut:O.toDecimal(T.amountOut,d)}}}}async getMinimumOrderBudget(t,e){if(0===t)return this.minOrderBudget;let s=await this.router.getSpotPrice(0,t);if(s)return A.mulSpot(this.minOrderBudget,s.amount,12,e);let a=await this.router.getSpotPrice(t,0);if(a)return A.divSpot(this.minOrderBudget,a.amount,12,e);throw new Error("Unable to calculate order budget")}getMaximumTradeCount(t,e,s){let a=e*2n/10n;if(a===0n)return 0;let i=Number(t/a),o=Math.floor(s/this.blockTime),r=Math.max(0,Math.floor(o*(1-.1)));return Math.min(i,r)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getOpenBudgetDcaOrder(t,e,s,a){let i=await this.router.getBestSell(t,e,s),{swaps:o}=i,r=o[0],n=o[o.length-1],{assetInDecimals:l}=r,{assetOutDecimals:c}=n,m=await this.getMinimumOrderBudget(t,l),h=i.amountIn<m,d=[];h&&d.push("OrderTooSmall");let P=await this.getAssetOutEd(n),g=this.toBlockPeriod(a),p=H.build(o),b={assetIn:t,assetOut:e,assetOutEd:P,errors:d,maxTradeCount:0,tradeCount:0,tradeFee:i.tradeFee,tradeImpactPct:i.priceImpactPct,tradePeriod:g,tradeRoute:p,type:"Dca"};return{...b,amountIn:0n,amountOut:0n,tradeAmountIn:i.amountIn,tradeAmountOut:i.amountOut,toHuman(){return{...b,amountIn:"0",amountOut:"0",assetOutEd:O.toDecimal(P,c),tradeAmountIn:O.toDecimal(i.amountIn,l),tradeAmountOut:O.toDecimal(i.amountOut,c)}}}}async getTwapSellOrder(t,e,s){let a=await this.router.getBestSell(t,e,s),{amountIn:i,swaps:o,priceImpactPct:r}=a,n=o[0],l=o[o.length-1],{assetInDecimals:c}=n,{assetOutDecimals:m}=l,h=Math.abs(r),d=this.getTwapTradeCount(h),P=i/BigInt(d),[g,p]=await Promise.all([this.getMinimumOrderBudget(t,c),this.router.getBestSell(n.assetIn,l.assetOut,P)]),b=d===1,y=i<g,E=p.priceImpactPct<-5,v=[];y||b?v.push("OrderTooSmall"):E&&v.push("OrderImpactTooBig");let T=await this.getAssetOutEd(l),N=p.amountOut*BigInt(d),M=p.tradeFee*BigInt(d),G=H.build(o),L={assetIn:t,assetOut:e,assetOutEd:T,errors:v,tradeCount:d,tradeImpactPct:p.priceImpactPct,tradePeriod:6,tradeRoute:G,type:"TwapSell"};return{...L,amountIn:i,amountOut:N,tradeAmountIn:p.amountIn,tradeAmountOut:p.amountOut,tradeFee:M,toHuman(){return{...L,amountIn:O.toDecimal(i,c),amountOut:O.toDecimal(N,m),assetOutEd:O.toDecimal(T,m),tradeAmountIn:O.toDecimal(p.amountIn,c),tradeAmountOut:O.toDecimal(p.amountOut,m),tradeFee:O.toDecimal(M,m)}}}}async getTwapBuyOrder(t,e,s){let a=await this.router.getBestBuy(t,e,s),{amountOut:i,swaps:o,priceImpactPct:r}=a,n=o[0],l=o[o.length-1],{assetInDecimals:c}=n,{assetOutDecimals:m}=l,h=Math.abs(r),d=this.getTwapTradeCount(h),P=i/BigInt(d),[g,p]=await Promise.all([this.getMinimumOrderBudget(t,c),this.router.getBestBuy(n.assetIn,l.assetOut,P)]),b=p.amountIn*BigInt(d),y=d===1,E=b<g,v=p.priceImpactPct<-5,T=[];E||y?T.push("OrderTooSmall"):v&&T.push("OrderImpactTooBig");let N=await this.getAssetOutEd(l),M=p.tradeFee*BigInt(d),G=H.build(o),L={assetIn:t,assetOut:e,assetOutEd:N,errors:T,tradeCount:d,tradeImpactPct:p.priceImpactPct,tradePeriod:6,tradeRoute:G,type:"TwapBuy"};return{...L,amountIn:b,amountOut:i,tradeAmountIn:p.amountIn,tradeAmountOut:p.amountOut,tradeFee:M,toHuman(){return{...L,amountIn:O.toDecimal(b,c),amountOut:O.toDecimal(i,m),assetOutEd:O.toDecimal(N,m),tradeAmountIn:O.toDecimal(p.amountIn,c),tradeAmountOut:O.toDecimal(p.amountOut,m),tradeFee:O.toDecimal(M,c)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let a=216e5/(this.blockTime*6);return Math.round(a)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,s=Math.round(e);return Math.max(s,6)}async getAssetOutEd(t){let a=(await this.router.getPools()).find(i=>i.address===t.poolAddress)?.tokens.find(i=>i.id===t.assetOut);if(!a)throw new Error(`Asset ${t.assetOut} not found in pool ${t.poolAddress}`);return a.existentialDeposit}};export{Ht as DCA_TIME_RESERVE,Lt as DEFAULT_BLOCK_TIME,Dt as DEFAULT_MIN_BUDGET,Nt as ORDER_MIN_BLOCK_PERIOD,et as Router,at as TWAP_EXECUTION_INTERVAL,Pt as TWAP_MAX_DURATION,bt as TWAP_MAX_PRICE_IMPACT,xd as TWAP_TX_MULTIPLIER,Ct as TradeOrderError,kt as TradeOrderType,H as TradeRouteBuilder,st as TradeRouter,yt as TradeScheduler,Rt as TradeType};
|
package/build/sor/types.d.ts
CHANGED
package/build/staking/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var et=Object.create;var
|
|
1
|
+
"use strict";var et=Object.create;var v=Object.defineProperty;var nt=Object.getOwnPropertyDescriptor;var ot=Object.getOwnPropertyNames;var it=Object.getPrototypeOf,at=Object.prototype.hasOwnProperty;var rt=(n,t)=>{for(var e in t)v(n,e,{get:t[e],enumerable:!0})},$=(n,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let c of ot(t))!at.call(n,c)&&c!==e&&v(n,c,{get:()=>t[c],enumerable:!(o=nt(t,c))||o.enumerable});return n};var st=(n,t,e)=>(e=n!=null?et(it(n)):{},$(t||!n||!n.__esModule?v(e,"default",{value:n,enumerable:!0}):e,n)),ct=n=>$(v({},"__esModule",{value:!0}),n);var gt={};rt(gt,{BIG_10:()=>G,BIG_BILL:()=>N,StakingApi:()=>O,StakingClient:()=>E});module.exports=ct(gt);var l=require("@galacticcouncil/math-staking"),d=st(require("big.js"));var x={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},z=n=>Object.keys(x).includes(n);var F=require("polkadot-api"),Y=require("@polkadot-api/utils"),j=require("@galacticcouncil/common");function X(n){let t=("modl"+n).padEnd(32,"\0"),e=new TextEncoder().encode(t),o=(0,Y.toHex)(e);return(0,F.AccountId)(j.HYDRATION_SS58_PREFIX).dec(o)}var A="20000000000000000",_="2000",G=(0,d.default)(10),N=(0,d.default)(G.pow(12)),O=class{client;balance;constructor(t,e){this.client=t,this.balance=e}async getPotBalance(){let t=await this.client.getPalletId(),e=X(t);return await this.balance.getBalance(e,0)}async getStakingPosition(t){let[e,o]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]);if(!e)return;let c=e.created_at,i=await o.reduce(async(a,[p,r])=>{let g=await a,S=p,f=r.amount,h=r.conviction.type.toLowerCase(),u=await this.client.getReferendumInfo(S);return u&&(u.type==="Approved"||u.type==="Rejected")&&z(h)&&g.push({id:S,amount:f,conviction:h}),g},Promise.resolve([]));return{stake:e.stake,rewardPerStake:e.reward_per_stake,createdAt:c,actionPoints:e.action_points,accumulatedUnpaidRewards:e.accumulated_unpaid_rewards,accumulatedSlashPoints:e.accumulated_slash_points,accumulatedLockedRewards:e.accumulated_locked_rewards,votes:i}}async getStake(t){let e=await this.client.getNFTCollectionId(),[o,c]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),i=c.find(a=>a)?.itemId;return{totalStake:o?.total_stake,accumulatedRewardPerStake:o?.accumulated_reward_per_stake,potReservedBalance:o?.pot_reserved_balance,positionId:i,stakePosition:i?await this.getStakingPosition(i):void 0}}getCurrentActionPoints(t,e,o,c){let i=(0,d.default)(0),a=(0,d.default)(0),p=x.locked6x,r=(0,d.default)(o.toString()).mul(p),g=100,S=[];t.forEach(u=>{let k=x[u.conviction],w=c.includes(u.id.toString());w&&S.push(u.id.toString());let b=(0,d.default)(u.amount.toString()).mul(g).div(r);i=i.plus(Math.floor(b.mul(k).toNumber())),a=a.plus(Math.floor(b.mul(w?p:k).toNumber()))});let f=Math.floor((0,d.default)(o.toString()).mul(p).mul(g).div(r).toNumber());c.forEach(u=>{S.includes(u)||(a=a.plus(f))});let h={democracyVote:1};return i=i.mul(h.democracyVote),i=i.plus(e.toString()||"0"),a=a.mul(h.democracyVote),a=a.plus(e.toString()||"0"),{currentActionPoints:i.toString(),maxActionPoints:a.toString()}}async getRewards(t,e,o){let c=await this.getStake(t),{potReservedBalance:i,accumulatedRewardPerStake:a,totalStake:p,stakePosition:r}=c;if(!r)return;let[g,S,f,h,u,k,w]=await Promise.all([this.getPotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getTimePointsPerPeriod(),this.client.getTimePointsWeight(),this.client.getActionPointsWeight(),this.client.getSixBlockSince()]),b=(0,d.default)(g.transferable.toString()).minus(i.toString()),Q=b.gt(0)&&p>0?(0,l.calculate_accumulated_rps)(a.toString(),b.toString(),p.toString()):a.toString(),I=(0,l.calculate_period_number)(S.toString(),o,w),R=(0,l.calculate_period_number)(S.toString(),r.createdAt.toString(),w),Z=(0,l.calculate_rewards)(Q,r.rewardPerStake.toString(),r.stake.toString()),L=this.getCurrentActionPoints(r.votes,r.actionPoints,r.stake,e),M=(0,l.calculate_points)(R,I,h.toString(),u.toString(),L.currentActionPoints,k.toString(),r.accumulatedSlashPoints.toString()),B=(0,l.sigmoid)(M,A,_),W=(()=>{if(!e.length)return;let tt=(0,l.calculate_points)(R,I,h.toString(),u.toString(),L.maxActionPoints.toString(),k.toString(),r.accumulatedSlashPoints.toString());return(0,l.sigmoid)(tt,A,_)})(),q=(0,d.default)(Z).plus(r.accumulatedUnpaidRewards.toString()).plus(r.accumulatedLockedRewards.toString());if((0,d.default)(I).minus(R).lte(f.toString()))return{rewards:"0",payablePercentage:B,extraPayablePercentage:W,constants:{a:A,b:_}};let D=(0,l.calculate_percentage_amount)(q.toString(),B),U=(0,d.default)(r.accumulatedLockedRewards.toString()),H=U.gt(D)?U:(0,d.default)(D);return{rewards:H.div(N).toString(),maxRewards:q.div(N).toString(),allocatedRewardsPercentage:H.div(q).mul(100).toNumber(),points:M,payablePercentage:B,extraPayablePercentage:W,constants:{a:A,b:_}}}};var V=require("polkadot-api");var P=require("@galacticcouncil/descriptors");var K=require("@galacticcouncil/common"),y=require("rxjs");var m=require("rxjs"),s=require("rxjs/operators");function J(n,{intervalMs:t=5e3,rpcTimeoutMs:e=1e4}={}){let o=()=>(0,m.defer)(()=>(0,m.from)(n._request("system_health",[]))).pipe((0,s.timeout)({first:e}),(0,s.map)(()=>"online"),(0,s.catchError)(()=>(0,m.of)("offline")));return(0,m.of)({state:"offline",delayMs:0}).pipe((0,s.expand)(i=>(0,m.timer)(i.delayMs).pipe((0,s.switchMap)(o),(0,s.map)(a=>({state:a,delayMs:t})))),(0,s.skip)(1),(0,s.map)(i=>i.state),(0,s.distinctUntilChanged)(),(0,s.shareReplay)({bufferSize:1,refCount:!0}))}var{logger:ut}=K.log,C=class n{static instance=null;bestBlock$;finalizedBlock$;connection$;constructor(t){this.bestBlock$=this.watched("watcher(bestBlock)",t.getUnsafeApi().query.System.Number.watchValue({at:"best"}).pipe((0,y.map)(({value:e})=>e))),this.finalizedBlock$=this.watched("watcher(finalizedBlock)",t.finalizedBlock$),this.connection$=this.watched("watcher(connection)",J(t))}static getInstance(t){return this.instance||(this.instance=new n(t)),this.instance}watched(t,e){return e.pipe((0,y.tap)({error:o=>ut.error(t,o)}),(0,y.shareReplay)({bufferSize:1,refCount:!0}))}};var T=class{client;api;apiNext;apiIce;watcher;at;constructor(t,e){this.client=t,this.api=this.client.getTypedApi(P.hydration),this.apiNext=this.client.getTypedApi(P.hydrationNext),this.apiIce=this.client.getTypedApi(P.hydrationIce),this.watcher=C.getInstance(this.client),this.at=e??"best"}};var dt=require("polkadot-api/ws"),pt=require("polkadot-api/logs-provider");var E=class extends T{async getPalletId(){let t=this.api.constants.Staking.PalletId,e=await t();return V.Binary.toText(V.Binary.fromHex(e))}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:a})=>{let[p,r,g]=a;return{address:p,collectionId:r,itemId:g}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getTimePointsPerPeriod(){let t=this.api.constants.Staking.TimePointsPerPeriod;return await t()}async getTimePointsWeight(){let t=this.api.constants.Staking.TimePointsWeight;return await t()/1e6}async getActionPointsWeight(){let t=this.api.constants.Staking.ActionPointsWeight;return await t()/1e9}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};0&&(module.exports={BIG_10,BIG_BILL,StakingApi,StakingClient});
|
package/build/staking/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import X from"buffer";typeof window<"u"&&(window.Buffer=X.Buffer);import{calculate_accumulated_rps as Z,calculate_percentage_amount as tt,calculate_period_number as E,calculate_points as L,calculate_rewards as et,sigmoid as M}from"@galacticcouncil/math-staking";import s from"big.js";var
|
|
1
|
+
import X from"buffer";typeof window<"u"&&(window.Buffer=X.Buffer);import{calculate_accumulated_rps as Z,calculate_percentage_amount as tt,calculate_period_number as E,calculate_points as L,calculate_rewards as et,sigmoid as M}from"@galacticcouncil/math-staking";import s from"big.js";var f={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},O=c=>Object.keys(f).includes(c);import{AccountId as G}from"polkadot-api";import{toHex as J}from"@polkadot-api/utils";import{HYDRATION_SS58_PREFIX as K}from"@galacticcouncil/common";function V(c){let t=("modl"+c).padEnd(32,"\0"),e=new TextEncoder().encode(t),n=J(e);return G(K).dec(n)}var P="20000000000000000",k="2000",nt=s(10),W=s(nt.pow(12)),D=class{client;balance;constructor(t,e){this.client=t,this.balance=e}async getPotBalance(){let t=await this.client.getPalletId(),e=V(t);return await this.balance.getBalance(e,0)}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]);if(!e)return;let l=e.created_at,o=await n.reduce(async(i,[u,a])=>{let d=await i,p=u,m=a.amount,g=a.conviction.type.toLowerCase(),r=await this.client.getReferendumInfo(p);return r&&(r.type==="Approved"||r.type==="Rejected")&&O(g)&&d.push({id:p,amount:m,conviction:g}),d},Promise.resolve([]));return{stake:e.stake,rewardPerStake:e.reward_per_stake,createdAt:l,actionPoints:e.action_points,accumulatedUnpaidRewards:e.accumulated_unpaid_rewards,accumulatedSlashPoints:e.accumulated_slash_points,accumulatedLockedRewards:e.accumulated_locked_rewards,votes:o}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,l]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),o=l.find(i=>i)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:o,stakePosition:o?await this.getStakingPosition(o):void 0}}getCurrentActionPoints(t,e,n,l){let o=s(0),i=s(0),u=f.locked6x,a=s(n.toString()).mul(u),d=100,p=[];t.forEach(r=>{let S=f[r.conviction],y=l.includes(r.id.toString());y&&p.push(r.id.toString());let h=s(r.amount.toString()).mul(d).div(a);o=o.plus(Math.floor(h.mul(S).toNumber())),i=i.plus(Math.floor(h.mul(y?u:S).toNumber()))});let m=Math.floor(s(n.toString()).mul(u).mul(d).div(a).toNumber());l.forEach(r=>{p.includes(r)||(i=i.plus(m))});let g={democracyVote:1};return o=o.mul(g.democracyVote),o=o.plus(e.toString()||"0"),i=i.mul(g.democracyVote),i=i.plus(e.toString()||"0"),{currentActionPoints:o.toString(),maxActionPoints:i.toString()}}async getRewards(t,e,n){let l=await this.getStake(t),{potReservedBalance:o,accumulatedRewardPerStake:i,totalStake:u,stakePosition:a}=l;if(!a)return;let[d,p,m,g,r,S,y]=await Promise.all([this.getPotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getTimePointsPerPeriod(),this.client.getTimePointsWeight(),this.client.getActionPointsWeight(),this.client.getSixBlockSince()]),h=s(d.transferable.toString()).minus(o.toString()),F=h.gt(0)&&u>0?Z(i.toString(),h.toString(),u.toString()):i.toString(),v=E(p.toString(),n,y),x=E(p.toString(),a.createdAt.toString(),y),Y=et(F,a.rewardPerStake.toString(),a.stake.toString()),T=this.getCurrentActionPoints(a.votes,a.actionPoints,a.stake,e),I=L(x,v,g.toString(),r.toString(),T.currentActionPoints,S.toString(),a.accumulatedSlashPoints.toString()),A=M(I,P,k),R=(()=>{if(!e.length)return;let j=L(x,v,g.toString(),r.toString(),T.maxActionPoints.toString(),S.toString(),a.accumulatedSlashPoints.toString());return M(j,P,k)})(),_=s(Y).plus(a.accumulatedUnpaidRewards.toString()).plus(a.accumulatedLockedRewards.toString());if(s(v).minus(x).lte(m.toString()))return{rewards:"0",payablePercentage:A,extraPayablePercentage:R,constants:{a:P,b:k}};let B=tt(_.toString(),A),q=s(a.accumulatedLockedRewards.toString()),N=q.gt(B)?q:s(B);return{rewards:N.div(W).toString(),maxRewards:_.div(W).toString(),allocatedRewardsPercentage:N.div(_).mul(100).toNumber(),points:I,payablePercentage:A,extraPayablePercentage:R,constants:{a:P,b:k}}}};import{Binary as $}from"polkadot-api";import{hydration as ft,hydrationNext as Pt,hydrationIce as kt}from"@galacticcouncil/descriptors";import{log as gt}from"@galacticcouncil/common";import{map as mt,shareReplay as St,tap as yt}from"rxjs";import{defer as ot,from as it,of as U,timer as at}from"rxjs";import{catchError as rt,distinctUntilChanged as st,expand as ct,map as C,shareReplay as lt,skip as ut,switchMap as dt,timeout as pt}from"rxjs/operators";function H(c,{intervalMs:t=5e3,rpcTimeoutMs:e=1e4}={}){let n=()=>ot(()=>it(c._request("system_health",[]))).pipe(pt({first:e}),C(()=>"online"),rt(()=>U("offline")));return U({state:"offline",delayMs:0}).pipe(ct(o=>at(o.delayMs).pipe(dt(n),C(i=>({state:i,delayMs:t})))),ut(1),C(o=>o.state),st(),lt({bufferSize:1,refCount:!0}))}var{logger:ht}=gt,w=class c{static instance=null;bestBlock$;finalizedBlock$;connection$;constructor(t){this.bestBlock$=this.watched("watcher(bestBlock)",t.getUnsafeApi().query.System.Number.watchValue({at:"best"}).pipe(mt(({value:e})=>e))),this.finalizedBlock$=this.watched("watcher(finalizedBlock)",t.finalizedBlock$),this.connection$=this.watched("watcher(connection)",H(t))}static getInstance(t){return this.instance||(this.instance=new c(t)),this.instance}watched(t,e){return e.pipe(yt({error:n=>ht.error(t,n)}),St({bufferSize:1,refCount:!0}))}};var b=class{client;api;apiNext;apiIce;watcher;at;constructor(t,e){this.client=t,this.api=this.client.getTypedApi(ft),this.apiNext=this.client.getTypedApi(Pt),this.apiIce=this.client.getTypedApi(kt),this.watcher=w.getInstance(this.client),this.at=e??"best"}};import{getWsProvider as ee}from"polkadot-api/ws";import{withLogsRecorder as oe}from"polkadot-api/logs-provider";var z=class extends b{async getPalletId(){let t=this.api.constants.Staking.PalletId,e=await t();return $.toText($.fromHex(e))}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:i})=>{let[u,a,d]=i;return{address:u,collectionId:a,itemId:d}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getTimePointsPerPeriod(){let t=this.api.constants.Staking.TimePointsPerPeriod;return await t()}async getTimePointsWeight(){let t=this.api.constants.Staking.TimePointsWeight;return await t()/1e6}async getActionPointsWeight(){let t=this.api.constants.Staking.ActionPointsWeight;return await t()/1e9}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};export{nt as BIG_10,W as BIG_BILL,D as StakingApi,z as StakingClient};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Trade } from '../sor';
|
|
2
|
+
import { TxBuilder } from './TxBuilder';
|
|
3
|
+
import { Tx } from './types';
|
|
4
|
+
export declare class IntentLimitTxBuilder extends TxBuilder {
|
|
5
|
+
private _trade?;
|
|
6
|
+
private _beneficiary?;
|
|
7
|
+
private _minAmountOut?;
|
|
8
|
+
private _deadline?;
|
|
9
|
+
private _partial;
|
|
10
|
+
setTrade(trade: Trade): this;
|
|
11
|
+
withBeneficiary(beneficiary: string): this;
|
|
12
|
+
withPartial(partial: boolean): this;
|
|
13
|
+
withMinAmountOut(amount: bigint): this;
|
|
14
|
+
withDeadline(deadline: bigint): this;
|
|
15
|
+
private get trade();
|
|
16
|
+
private get beneficiary();
|
|
17
|
+
private get partial();
|
|
18
|
+
private get minAmountOut();
|
|
19
|
+
private get deadline();
|
|
20
|
+
build(): Promise<Tx>;
|
|
21
|
+
}
|