@galacticcouncil/sdk-next 1.3.0 → 1.4.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.
@@ -0,0 +1,111 @@
1
+ export declare const FACTORY_ABI: readonly [{
2
+ readonly name: "getPool";
3
+ readonly type: "function";
4
+ readonly stateMutability: "view";
5
+ readonly inputs: readonly [{
6
+ readonly type: "address";
7
+ readonly name: "tokenA";
8
+ }, {
9
+ readonly type: "address";
10
+ readonly name: "tokenB";
11
+ }, {
12
+ readonly type: "uint24";
13
+ readonly name: "fee";
14
+ }];
15
+ readonly outputs: readonly [{
16
+ readonly type: "address";
17
+ readonly name: "pool";
18
+ }];
19
+ }];
20
+ export declare const POOL_ABI: readonly [{
21
+ readonly name: "slot0";
22
+ readonly type: "function";
23
+ readonly stateMutability: "view";
24
+ readonly inputs: readonly [];
25
+ readonly outputs: readonly [{
26
+ readonly type: "uint160";
27
+ readonly name: "sqrtPriceX96";
28
+ }, {
29
+ readonly type: "int24";
30
+ readonly name: "tick";
31
+ }, {
32
+ readonly type: "uint16";
33
+ readonly name: "observationIndex";
34
+ }, {
35
+ readonly type: "uint16";
36
+ readonly name: "observationCardinality";
37
+ }, {
38
+ readonly type: "uint16";
39
+ readonly name: "observationCardinalityNext";
40
+ }, {
41
+ readonly type: "uint8";
42
+ readonly name: "feeProtocol";
43
+ }, {
44
+ readonly type: "bool";
45
+ readonly name: "unlocked";
46
+ }];
47
+ }, {
48
+ readonly name: "liquidity";
49
+ readonly type: "function";
50
+ readonly stateMutability: "view";
51
+ readonly inputs: readonly [];
52
+ readonly outputs: readonly [{
53
+ readonly type: "uint128";
54
+ }];
55
+ }, {
56
+ readonly name: "tickBitmap";
57
+ readonly type: "function";
58
+ readonly stateMutability: "view";
59
+ readonly inputs: readonly [{
60
+ readonly type: "int16";
61
+ readonly name: "wordPosition";
62
+ }];
63
+ readonly outputs: readonly [{
64
+ readonly type: "uint256";
65
+ }];
66
+ }, {
67
+ readonly name: "ticks";
68
+ readonly type: "function";
69
+ readonly stateMutability: "view";
70
+ readonly inputs: readonly [{
71
+ readonly type: "int24";
72
+ readonly name: "tick";
73
+ }];
74
+ readonly outputs: readonly [{
75
+ readonly type: "uint128";
76
+ readonly name: "liquidityGross";
77
+ }, {
78
+ readonly type: "int128";
79
+ readonly name: "liquidityNet";
80
+ }, {
81
+ readonly type: "uint256";
82
+ readonly name: "feeGrowthOutside0X128";
83
+ }, {
84
+ readonly type: "uint256";
85
+ readonly name: "feeGrowthOutside1X128";
86
+ }, {
87
+ readonly type: "int56";
88
+ readonly name: "tickCumulativeOutside";
89
+ }, {
90
+ readonly type: "uint160";
91
+ readonly name: "secondsPerLiquidityOutsideX128";
92
+ }, {
93
+ readonly type: "uint32";
94
+ readonly name: "secondsOutside";
95
+ }, {
96
+ readonly type: "bool";
97
+ readonly name: "initialized";
98
+ }];
99
+ }];
100
+ export declare const ERC20_ABI: readonly [{
101
+ readonly name: "balanceOf";
102
+ readonly type: "function";
103
+ readonly stateMutability: "view";
104
+ readonly inputs: readonly [{
105
+ readonly type: "address";
106
+ readonly name: "account";
107
+ }];
108
+ readonly outputs: readonly [{
109
+ readonly type: "uint256";
110
+ }];
111
+ }];
@@ -0,0 +1,7 @@
1
+ export declare const UNISWAP_V3_FACTORY = "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0";
2
+ export type V3PoolConfig = {
3
+ assetA: number;
4
+ assetB: number;
5
+ fee: number;
6
+ };
7
+ export declare const V3_POOLS: V3PoolConfig[];
@@ -0,0 +1,5 @@
1
+ export * from './types';
2
+ export * from './const';
3
+ export * from './UniswapV3Math';
4
+ export * from './UniswapV3Pool';
5
+ export * from './UniswapV3PoolClient';
@@ -0,0 +1,21 @@
1
+ import { PoolBase, PoolFee, PoolFees } from '../types';
2
+ export type V3Tick = {
3
+ index: number;
4
+ liquidityNet: bigint;
5
+ liquidityGross: bigint;
6
+ };
7
+ export type V3PoolState = {
8
+ fee: number;
9
+ sqrtPriceX96: bigint;
10
+ tick: number;
11
+ liquidity: bigint;
12
+ tickSpacing: number;
13
+ ticks: V3Tick[];
14
+ };
15
+ export interface UniswapV3PoolBase extends PoolBase, V3PoolState {
16
+ token0: number;
17
+ token1: number;
18
+ }
19
+ export type UniswapV3PoolFees = PoolFees & {
20
+ fee: PoolFee;
21
+ };
@@ -1 +1 @@
1
- "use strict";var Te=Object.create;var St=Object.defineProperty;var ve=Object.getOwnPropertyDescriptor;var we=Object.getOwnPropertyNames;var Ie=Object.getPrototypeOf,Oe=Object.prototype.hasOwnProperty;var tt=(c,t)=>{for(var e in t)St(c,e,{get:t[e],enumerable:!0})},Zt=(c,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of we(t))!Oe.call(c,s)&&s!==e&&St(c,s,{get:()=>t[s],enumerable:!(a=ve(t,s))||a.enumerable});return c};var Tt=(c,t,e)=>(e=c!=null?Te(Ie(c)):{},Zt(t||!c||!c.__esModule?St(e,"default",{value:c,enumerable:!0}):e,c)),xe=c=>Zt(St({},"__esModule",{value:!0}),c);var wa={};tt(wa,{DCA_TIME_RESERVE:()=>be,DEFAULT_BLOCK_TIME:()=>ge,DEFAULT_MIN_BUDGET:()=>Kt,ORDER_MIN_BLOCK_PERIOD:()=>he,Router:()=>lt,TWAP_EXECUTION_INTERVAL:()=>ft,TWAP_MAX_DURATION:()=>jt,TWAP_MAX_PRICE_IMPACT:()=>zt,TWAP_TX_MULTIPLIER:()=>nu,TradeOrderError:()=>Xt,TradeOrderType:()=>Yt,TradeRouteBuilder:()=>V,TradeRouter:()=>ct,TradeScheduler:()=>kt,TradeType:()=>Wt});module.exports=xe(wa);var ut=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,pt=class{isNotVisited(t,e){let a=!0;return e.forEach(s=>{(s[0]===t[0]||s[1]===t[1])&&(a=!1)}),a}findPaths(t,e,a){let s=[],n=new ut,i=[];for(i.push([e,""]),n.enqueue(i);n.size()>0;){let r=n.dequeue();if(!r||r.length>Ae)continue;let o=r[r.length-1];(a===null||o[0]===a)&&s.push(r),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,r)){let m=[...r];m.push(u),n.enqueue(m)}})}return s}findShortestPaths(t,e,a){let s=[],n=new ut,i=[];i.push([e,""]),n.enqueue(i);let r=1/0;for(;n.size()>0;){let o=n.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===a){o.length<r?(r=o.length,s.length=0,s.push(o)):o.length===r&&s.push(o);continue}let u=t.get(l[0]);for(let m of u??[])this.isNotVisited(m,o)&&n.enqueue([...o,m])}return s}buildAndPopulateGraph(t,e){let a=new Map;for(let s of t)a.set(parseInt(s),[]);for(let[s,n,i]of e)a.get(n)?.push([i,s]);return a}};function Mt(c){let t={};for(let e of c){let a=e.tokens.length;for(let s=0;s<a;s++){t[e.tokens[s].id]||(t[e.tokens[s].id]=[]);for(let n=0;n<a;n++){if(s==n)continue;let i=[e.address,e.tokens[s].id,e.tokens[n].id];t[e.tokens[s].id].push(i)}}}return t}var N=require("@galacticcouncil/math-lbp"),G=class{static getSpotPrice(t,e,a,s,n){return(0,N.get_spot_price)(t,e,a,s,n)}static calculateInGivenOut(t,e,a,s,n){return(0,N.calculate_in_given_out)(t,e,a,s,n)}static calculateOutGivenIn(t,e,a,s,n){return(0,N.calculate_out_given_in)(t,e,a,s,n)}static calculateLinearWeights(t,e,a,s,n){return(0,N.calculate_linear_weights)(t,e,a,s,n)}static calculatePoolTradeFee(t,e,a){return(0,N.calculate_pool_trade_fee)(t,e,a)}};var et=require("@galacticcouncil/common");var vt={};tt(vt,{withTimeout:()=>Be});function Be(c,t,e="timeout"){return new Promise((a,s)=>{let n=setTimeout(()=>s(new Error(e)),t);c.then(i=>{clearTimeout(n),a(i)},i=>{clearTimeout(n),s(i)})})}var k={};tt(k,{divSpot:()=>Fe,getFraction:()=>Re,mulScaled:()=>te,mulSpot:()=>Ee});var Dt=require("@galacticcouncil/common");function te(c,t,e,a,s){let n=e+a-s,i=c*t;return n>0?i/BigInt(10)**BigInt(n):n<0?i*BigInt(10)**BigInt(-n):i}function Ee(c,t,e,a){return te(c,t,e,Dt.RUNTIME_DECIMALS,a)}function Fe(c,t,e,a){if(t===0n)return 0n;let s=BigInt(10)**BigInt(Dt.RUNTIME_DECIMALS+a-e);return c*s/t}function Re(c,t,e=2){if(t<.01||t>100)throw new Error("Supported range is from 0.01% - 100%");let a=BigInt(10)**BigInt(e),s=BigInt(Math.round(t*Number(a)));return c*s/(BigInt(100)*a)}var f={};tt(f,{FeeUtils:()=>Lt,shiftNeg:()=>Ce});var ee=Tt(require("big.js"));var Lt=class c{static toPct(t){let[e,a]=t;return c.safeDivide(e*100,a)}static toRaw(t){let[e,a]=t;return c.safeDivide(e,a)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,a=12){let s=10**a;return Math.round(t*s/e)/s}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 mt={};tt(mt,{findNestedKey:()=>ke,findNestedObj:()=>Me,jsonFormatter:()=>De});var ke=(c,t)=>{let e=[];return JSON.stringify(c,(a,s)=>(s&&s[t]&&e.push(s),s)),e[0]},Me=(c,t,e)=>{let a;return JSON.stringify(c,(s,n)=>(n&&n[t]===e&&(a=n),n)),a},De=(c,t)=>typeof t=="bigint"?t.toString():t;var B={};tt(B,{calculateBuyFee:()=>qe,calculateDiffToAvg:()=>Le,calculateDiffToRef:()=>Ne,calculateSellFee:()=>He});var H=Tt(require("big.js"));function Le(c,t){let e=(0,H.default)(c.toString()),a=(0,H.default)(t.toString());return e.minus(a).abs().div(e.plus(a).div(2)).mul(100).round(2).toNumber()}function Ne(c,t){if(t===0n)return 0;let e=(0,H.default)(c.toString()),a=(0,H.default)(t.toString());return e.minus(a).div(a).mul(100).round(2).toNumber()}function He(c,t){if(c===0n)return 0;let e=(0,H.default)(c.toString()),a=(0,H.default)(t.toString());return(0,H.default)(1).minus(a.div(e)).mul(100).round(2).toNumber()}function qe(c,t){if(c===0n)return 0;let e=(0,H.default)(c.toString());return(0,H.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}var{FeeUtils:ae}=f,wt=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 a=new Map(this.tokens.map(i=>[i.id,i])),s=a.get(t),n=a.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:n.balance,decimalsIn:s.decimals,decimalsOut:n.decimals,weightIn:s.weight,weightOut:n.weight}}validateAndBuy(t,e,a){let s=this.tokens[0].id,n=[];e<this.minTradingLimit&&n.push("InsufficientTradingAmount");let i=t.balanceOut/this.maxOutRatio;if(e>i&&n.push("MaxOutRatioExceeded"),s===t.assetOut){let r=this.calculateTradeFee(e,a),o=ae.toPct(this.repayFeeApply?a.repayFee:a.exchangeFee),l=e+r,u=this.calculateInGivenOut(t,l),m=t.balanceIn/this.maxInRatio;return u>m&&n.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:n}}else{let r=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return r>o&&n.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:n}}}validateAndSell(t,e,a){let s=this.tokens[0].id,n=[];e<this.minTradingLimit&&n.push("InsufficientTradingAmount");let i=t.balanceIn/this.maxInRatio;if(e>i&&n.push("MaxInRatioExceeded"),s===t.assetIn){let r=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return r>o&&n.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:n}}else{let r=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(r,a),l=ae.toPct(this.repayFeeApply?a.repayFee:a.exchangeFee),u=r-o,m=t.balanceOut/this.maxOutRatio;return u>m&&n.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:u,feePct:l,errors:n}}}calculateInGivenOut(t,e){let a=G.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(a);return s<0n?0n:s}calculateOutGivenIn(t,e){let a=G.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(a);return s<0n?0n:s}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 a=G.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(a)}};var Ye=require("polkadot-api"),At=require("rxjs");var U=require("rxjs"),R=require("rxjs/operators");var qt=require("@galacticcouncil/descriptors");var se=require("@galacticcouncil/common"),Ht=require("rxjs");var It=require("rxjs"),Y=require("rxjs/operators");var{logger:Za}=se.log;var Ge=require("polkadot-api/ws"),Ue=require("polkadot-api/logs-provider");var Ve=require("polkadot-api");var ne=require("@galacticcouncil/common"),xt=require("rxjs"),M=require("rxjs/operators");var{logger:fs}=ne.log;var We=require("rxjs");var ie=require("@galacticcouncil/common");var _s={Aave:"AAVE",LBP:"LBP",Omnipool:"OMNI",Stableswap:"STBL",XYK:"XYK",HSM:"HSM"},{logger:Cs}=ie.log;var{withTimeout:js}=vt;var b=require("@galacticcouncil/math-omnipool"),j=Tt(require("big.js")),v=class{static calculateSpotPrice(t,e,a,s){return(0,b.calculate_spot_price)(t,e,a,s)}static calculateLrnaSpotPrice(t,e){return(0,b.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,a,s,n,i,r,o,l,u){return(0,b.calculate_in_given_out)(t,e,a,s,n,i,r,o,l,u)}static calculateLrnaInGivenOut(t,e,a,s,n,i){return(0,b.calculate_lrna_in_given_out)(t,e,a,s,n,i)}static calculateOutGivenIn(t,e,a,s,n,i,r,o,l,u){return(0,b.calculate_out_given_in)(t,e,a,s,n,i,r,o,l,u)}static calculateOutGivenLrnaIn(t,e,a,s,n,i){return(0,b.calculate_out_given_lrna_in)(t,e,a,s,n,i)}static calculateShares(t,e,a,s){return(0,b.calculate_shares)(t,e,a,s)}static calculateLiquidityOut(t,e,a,s,n,i,r,o){return(0,b.calculate_liquidity_out)(t,e,a,s,n,i,r,o)}static calculateLiquidityLRNAOut(t,e,a,s,n,i,r,o){return(0,b.calculate_liquidity_lrna_out)(t,e,a,s,n,i,r,o)}static calculateCapDifference(t,e,a,s){let n=(0,j.default)(e),i=(0,j.default)(t),r=(0,j.default)(s),o=(0,j.default)(a),l=(0,j.default)(10).pow(18),u=o.div(l);if(n.div(r).lt(u)){let h=u.times(r).minus(n).times(i),d=n.times((0,j.default)(1).minus(u));return h.div(d).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,a,s){return(0,b.calculate_liquidity_hub_in)(t,e,a,s)}static isSellAllowed(t){return(0,b.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,b.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,b.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,b.is_remove_liquidity_allowed)(t)}static recalculateAssetFee(t,e,a,s,n,i,r,o,l,u,m){return(0,b.recalculate_asset_fee)(t,e,a,s,n,i,r,o,l,u,m)}static recalculateProtocolFee(t,e,a,s,n,i,r,o,l,u,m){return(0,b.recalculate_protocol_fee)(t,e,a,s,n,i,r,o,l,u,m)}static verifyAssetCap(t,e,a,s){return(0,b.verify_asset_cap)(t,e,a,s)}};var re=require("@galacticcouncil/common");var{FeeUtils:q}=f,Bt=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 a=new Map(this.tokens.map(i=>[i.id,i])),s=a.get(t),n=a.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:s.hubReserves,hubReservesOut:n.hubReserves,sharesIn:s.shares,sharesOut:n.shares,decimalsIn:s.decimals,decimalsOut:n.decimals,balanceIn:s.balance,balanceOut:n.balance,tradeableIn:s.tradeable,tradeableOut:n.tradeable,assetInEd:s.existentialDeposit,assetOutEd:n.existentialDeposit}}validateAndBuy(t,e,a){let s=this.calculateInGivenOut(t,e),n=this.calculateInGivenOut(t,e,a),i=s===0n?0:B.calculateBuyFee(s,n),r=[],o=v.isSellAllowed(t.tradeableIn),l=v.isBuyAllowed(t.tradeableOut);(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&r.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&r.push("MaxOutRatioExceeded");let m=t.balanceIn/this.maxInRatio;return n>m&&r.push("MaxInRatioExceeded"),{amountIn:n,calculatedIn:s,amountOut:e,feePct:i,errors:r}}validateAndSell(t,e,a){let s=this.calculateOutGivenIn(t,e),n=this.calculateOutGivenIn(t,e,a),i=B.calculateSellFee(s,n),r=[],o=v.isSellAllowed(t.tradeableIn),l=v.isBuyAllowed(t.tradeableOut);(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&r.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&r.push("MaxInRatioExceeded");let m=t.balanceOut/this.maxOutRatio;return n>m&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:n,feePct:i,errors:r}}calculateInGivenOut(t,e,a){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,a);let s=v.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),a?q.toRaw(a.assetFee).toString():"0",a?q.toRaw(a.protocolFee).toString():"0",a?q.toRaw(a.maxSlipFee).toString():"0"),n=BigInt(s);return n<0n?0n:n}calculateLrnaInGivenOut(t,e,a){let s=v.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),a?q.toRaw(a.assetFee).toString():"0",a?q.toRaw(a.maxSlipFee).toString():"0"),n=BigInt(s);return n<0n?0n:n}calculateOutGivenIn(t,e,a){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,a);let s=v.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),a?q.toRaw(a.assetFee).toString():"0",a?q.toRaw(a.protocolFee).toString():"0",a?q.toRaw(a.maxSlipFee).toString():"0"),n=BigInt(s);return n<0n?0n:n}calculateOutGivenLrnaIn(t,e,a){let s=v.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),a?q.toRaw(a.assetFee).toString():"0",a?q.toRaw(a.maxSlipFee).toString():"0"),n=BigInt(s);return n<0n?0n:n}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=v.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=v.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=v.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=v.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}normalizeSpot(t,e,a){let s=e-a;if(s===0)return t;let n=re.big.pow10(Math.abs(s));return s>0?t*n:t/n}};var Q=require("polkadot-api"),Qe=require("@polkadot-api/utils"),J=require("rxjs"),Je=require("@galacticcouncil/common");var{FeeUtils:An}=f;var{FeeUtils:Gn}=f,Un=Q.Binary.toHex(Q.Binary.fromText("omnipool")),Vn=(0,Q.Enum)("Short");var O=require("@galacticcouncil/math-stableswap"),C=class{static getPoolAddress(t){return(0,O.pool_account_name)(t)}static defaultPegs(t){let e=[];for(let a=0;a<t;a++)e.push(["1","1"]);return e}static calculateAmplification(t,e,a,s,n){return(0,O.calculate_amplification)(t,e,a,s,n)}static calculateInGivenOut(t,e,a,s,n,i,r){return(0,O.calculate_in_given_out)(t,e,a,s,n,i,r)}static calculateAddOneAsset(t,e,a,s,n,i,r){return(0,O.calculate_add_one_asset)(t,e,a,s,n,i,r)}static calculateSharesForAmount(t,e,a,s,n,i,r){return(0,O.calculate_shares_for_amount)(t,e,a,s,n,i,r)}static calculateOutGivenIn(t,e,a,s,n,i,r){return(0,O.calculate_out_given_in)(t,e,a,s,n,i,r)}static calculateLiquidityOutOneAsset(t,e,a,s,n,i,r){return(0,O.calculate_liquidity_out_one_asset)(t,e,a,s,n,i,r)}static calculateShares(t,e,a,s,n,i){return(0,O.calculate_shares)(t,e,a,s,n,i)}static calculateSpotPriceWithFee(t,e,a,s,n,i,r,o){return(0,O.calculate_spot_price_with_fee)(t,e,a,s,n,i,r,o)}static recalculatePegs(t,e,a,s,n,i){let r=(0,O.recalculate_peg)(t,e,a,s,n,i);return JSON.parse(r)}};var bt=require("@galacticcouncil/common");var{FeeUtils:at}=f,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 a=new Map(this.tokens.map(i=>[i.id,i])),s=a.get(t),n=a.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:n.balance,decimalsIn:s.decimals,decimalsOut:n.decimals,tradeableIn:this.id===t?15:s.tradeable,tradeableOut:this.id===e?15:n.tradeable,assetInEd:s.existentialDeposit,assetOutEd:n.existentialDeposit}}validateAndBuy(t,e,a){let s=this.calculateInGivenOut(t,e),n=this.calculateInGivenOut(t,e,a),i=s===0n?0:B.calculateBuyFee(s,n),r=[],o=v.isSellAllowed(t.tradeableIn),l=v.isBuyAllowed(t.tradeableOut);return(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&r.push("InsufficientTradingAmount"),{amountIn:n,calculatedIn:s,amountOut:e,feePct:i,errors:r}}validateAndSell(t,e,a){let s=this.calculateOutGivenIn(t,e),n=this.calculateOutGivenIn(t,e,a),i=B.calculateSellFee(s,n),r=[],o=v.isSellAllowed(t.tradeableIn),l=v.isBuyAllowed(t.tradeableOut);return(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&r.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:s,amountOut:n,feePct:i,errors:r}}calculateIn(t,e,a){let s=C.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),a?at.toRaw(a.fee).toString():"0",this.getPegs()),n=BigInt(s);return n<0n?0n:n}calculateAddOneAsset(t,e,a){let s=C.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),a?at.toRaw(a.fee).toString():"0",this.getPegs()),n=BigInt(s);return n<0n?0n:n}calculateSharesForAmount(t,e,a){let s=C.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),a?at.toRaw(a.fee).toString():"0",this.getPegs()),n=BigInt(s);return n<0n?0n:n}calculateInGivenOut(t,e,a){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,a):t.assetIn==this.id?this.calculateSharesForAmount(t,e,a):this.calculateIn(t,e,a)}spotPriceInGivenOut(t){let e=C.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,a){let s=C.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),a?at.toRaw(a.fee).toString():"0",this.getPegs()),n=BigInt(s);return n<0n?0n:n}calculateWithdrawOneAsset(t,e,a){let s=C.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),a?at.toRaw(a.fee).toString():"0",this.getPegs()),n=BigInt(s);return n<0n?0n:n}calculateShares(t,e,a){let s=C.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),a?at.toRaw(a.fee).toString():"0",this.getPegs()),n=BigInt(s);return n<0n?0n:n}calculateOutGivenIn(t,e,a){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,a):t.assetOut==this.id?this.calculateShares(t,e,a):this.calculateOut(t,e,a)}spotPriceOutGivenIn(t){let e=C.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:a,decimals:s})=>({asset_id:e,amount:a,decimals:s}));return JSON.stringify(t,mt.jsonFormatter)}getAssets(t,e){let a={asset_id:Number(t),amount:e.toString()};return JSON.stringify([a],mt.jsonFormatter)}normalizeSpot(t,e,a,s,n){return e?t*bt.big.pow10(bt.RUNTIME_DECIMALS-n):a?t/bt.big.pow10(n-s):t}};var oe=require("polkadot-api"),na=require("@polkadot-api/utils"),ia=require("@noble/hashes/blake2b"),nt=require("rxjs"),le=require("@galacticcouncil/common");var ta=require("polkadot-api"),ea=require("viem");var{FeeUtils:Ri}=f;var{FeeUtils:Ji}=f;var x=require("@galacticcouncil/math-xyk"),X=class{static getSpotPrice(t,e,a){return(0,x.get_spot_price)(t,e,a)}static calculateInGivenOut(t,e,a){return(0,x.calculate_in_given_out)(t,e,a)}static calculateOutGivenIn(t,e,a){return(0,x.calculate_out_given_in)(t,e,a)}static calculatePoolTradeFee(t,e,a){return(0,x.calculate_pool_trade_fee)(t,e,a)}static calculateLiquidityIn(t,e,a){return(0,x.calculate_liquidity_in)(t,e,a)}static calculateSpotPrice(t,e){return(0,x.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,a,s){return(0,x.calculate_spot_price_with_fee)(t,e,a,s)}static calculateShares(t,e,a){return(0,x.calculate_shares)(t,e,a)}static calculateLiquidityOutAssetA(t,e,a,s){return(0,x.calculate_liquidity_out_asset_a)(t,e,a,s)}static calculateLiquidityOutAssetB(t,e,a,s){return(0,x.calculate_liquidity_out_asset_b)(t,e,a,s)}};var ue=require("@galacticcouncil/common");var{FeeUtils:ce}=f,Et=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 a=new Map(this.tokens.map(i=>[i.id,i])),s=a.get(t),n=a.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:s.decimals,decimalsOut:n.decimals,balanceIn:s.balance,balanceOut:n.balance,assetInEd:s.existentialDeposit,assetOutEd:n.existentialDeposit}}validateAndBuy(t,e,a){let s=this.calculateInGivenOut(t,e),n=this.calculateTradeFee(s,a),i=ce.toPct(a.exchangeFee),r=s+n,o=[];(e<this.minTradingLimit||s<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return r>u&&o.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:s,amountOut:e,feePct:i,errors:o}}validateAndSell(t,e,a){let s=this.calculateOutGivenIn(t,e),n=this.calculateTradeFee(s,a),i=ce.toPct(a.exchangeFee),r=s-n,o=[];(e<this.minTradingLimit||s<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return r>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:r,feePct:i,errors:o}}calculateInGivenOut(t,e){let a=X.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(a);return s<0n?0n:s}calculateOutGivenIn(t,e){let a=X.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(a);return s<0n?0n:s}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 a=X.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(a)}normalizeSpot(t,e,a){let s=e-a;if(s===0)return t;let n=ue.big.pow10(Math.abs(s));return s>0?t*n:t/n}};var oa=require("polkadot-api"),la=require("rxjs");var it=require("@galacticcouncil/common");var Ft=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 a=new Map(this.tokens.map(i=>[i.id,i])),s=a.get(t),n=a.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:n.balance,decimalsIn:s.decimals,decimalsOut:n.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,a){let s=this.calculateInGivenOut(t,e),n=[];return e>t.balanceOut&&n.push("TradeNotAllowed"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:n}}validateAndSell(t,e,a){let s=this.calculateOutGivenIn(t,e),n=[];return s>t.balanceOut&&n.push("TradeNotAllowed"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:n}}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 ga=require("polkadot-api"),ba=require("@polkadot-api/utils"),Rt=require("rxjs"),Ut=require("@galacticcouncil/common");var $r=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var pa=require("polkadot-api"),ma=require("viem");var da=Tt(require("big.js")),ht=require("@galacticcouncil/common");var{ERC20:so}=ht.erc20,{H160:no}=ht.h160;var io=10n**27n;var{ERC20:wo}=Ut.erc20;var A=require("@galacticcouncil/math-hsm"),D=class{static calculateCollateralInGivenHollarOut(t,e,a){return(0,A.calculate_collateral_in_given_hollar_out)(t,e,a)}static calculateCollateralOutGivenHollarIn(t,e,a){return(0,A.calculate_collateral_out_given_hollar_in)(t,e,a)}static calculateHollarOutGivenCollateralIn(t,e,a){return(0,A.calculate_hollar_out_given_collateral_in)(t,e,a)}static calculateHollarInGivenCollateralOut(t,e,a){return(0,A.calculate_hollar_in_given_collateral_out)(t,e,a)}static calculateImbalance(t,e,a){return(0,A.calculate_imbalance)(t,e,a)}static calculateBuybackLimit(t,e){return(0,A.calculate_buyback_limit)(t,e)}static calculateBuybackPriceWithFee(t,e,a){return(0,A.calculate_buyback_price_with_fee)(t,e,a)}static calculateMaxPrice(t,e){return(0,A.calculate_max_price)(t,e)}};var E=require("@galacticcouncil/common");var{FeeUtils:rt}=f,_t=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,a){let s=this.parsePair(t.assetOut,t.assetIn),n=super.calculateInGivenOut(s,e,{fee:this.fee}),i=this.calculateBuybackLimit(t);e>i&&a.push("MaxBuyBackExceeded");let r=this.calculateMaxPrice(t);return this.calculateBuyPrice(t,e,n)>r&&a.push("MaxBuyPriceExceeded"),n>this.collateralBalance&&a.push("InsufficientCollateral"),a}validateTradeHollarOut(t,e,a){return this.collateralBalance+t>this.maxInHolding&&a.push("MaxHoldingExceeded"),e>this.hsmMintCapacity&&a.push("FacilitatorCapacityExceeded"),a}validateTradeConstraints(t,e,a){let s=[];return t.assetIn===this.hollarId?this.validateTradeHollarIn(t,e,s):this.validateTradeHollarOut(e,a,s)}validateAndBuy(t,e){let a=this.calculateInGivenOut(t,e),s=this.validateTradeConstraints(t,a,e);return{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:s}}validateAndSell(t,e){let a=this.calculateOutGivenIn(t,e),s=this.validateTradeConstraints(t,e,a);return{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:s}}calculateHollarInGivenCollateralOut(t,e){let a=super.calculateInGivenOut(t,e,{fee:this.fee}),s=D.calculateHollarInGivenCollateralOut(e.toString(),a.toString(),rt.toRaw(this.buyBackFee).toString());return BigInt(s)}calculateCollateralInGivenHollarOut(t){let e=this.getCollateralPeg(),a=D.calculateCollateralInGivenHollarOut(t.toString(),JSON.stringify(e),rt.toRaw(this.purchaseFee).toString());return BigInt(a)}calculateInGivenOut(t,e){return t.assetOut==this.hollarId?this.calculateCollateralInGivenHollarOut(e):this.calculateHollarInGivenCollateralOut(t,e)}calculateCollateralOutGivenHollarIn(t,e){let a=super.calculateOutGivenIn(t,e,{fee:this.fee}),s=D.calculateCollateralOutGivenHollarIn(e.toString(),a.toString(),rt.toRaw(this.buyBackFee).toString());return BigInt(s)}calculateHollarOutGivenCollateralIn(t){let e=this.getCollateralPeg(),a=D.calculateHollarOutGivenCollateralIn(t.toString(),JSON.stringify(e),rt.toRaw(this.purchaseFee).toString());return BigInt(a)}calculateOutGivenIn(t,e){return t.assetIn==this.hollarId?this.calculateCollateralOutGivenHollarIn(t,e):this.calculateHollarOutGivenCollateralIn(e)}calculateImbalance(t){let e=this.getCollateralPeg(),a=D.calculateImbalance(t.balanceIn.toString(),JSON.stringify(e),t.balanceOut.toString());return BigInt(a)}calculateBuybackLimit(t){let e=this.calculateImbalance(t),a=D.calculateBuybackLimit(e.toString(),rt.toRaw(this.buyBackRate).toString());return BigInt(a)}calculateBuyPrice(t,e,a){let s=D.calculateBuybackPriceWithFee(a.toString(),e.toString(),rt.toRaw(this.buyBackFee).toString()),[n,i]=JSON.parse(s),r=E.big.pow10(t.decimalsIn+E.RUNTIME_DECIMALS-t.decimalsOut);return BigInt(n)*r/BigInt(i)}calculateMaxPrice(t){let e=this.getCollateralPeg(),a=D.calculateMaxPrice(JSON.stringify(e),this.maxBuyPriceCoefficient.toString()),[s,n]=JSON.parse(a),i=E.big.pow10(E.RUNTIME_DECIMALS-t.decimalsOut);return BigInt(s)*i/BigInt(n)}spotPriceInGivenOut(t){let e=E.big.toBigInt(1,t.decimalsOut),s=this.calculateInGivenOut(t,e)*E.big.pow10(E.RUNTIME_DECIMALS-t.decimalsOut);return this.normalizeSpotPrice(s,t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){let e=E.big.toBigInt(1,t.decimalsIn),s=this.calculateOutGivenIn(t,e)*E.big.pow10(E.RUNTIME_DECIMALS-t.decimalsIn);return this.normalizeSpotPrice(s,t.decimalsIn,t.decimalsOut)}getCollateralPeg(){let t=this.tokens.findIndex(s=>s.id!==this.hollarId),e=this.pegs[t],a=this.tokens[t].decimals;return this.isDefaultPeg(e)?[E.big.toBigInt(1,18).toString(),E.big.toBigInt(1,a).toString()]:e}isDefaultPeg(t){let[e,a]=t;return Array.isArray(t)&&t.length===2&&e==="1"&&a==="1"}normalizeSpotPrice(t,e,a){let s=e-a;if(s===0)return t;let n=E.big.pow10(Math.abs(s));return s>0?t*n:t/n}};var pe=require("polkadot-api"),Sa=require("@polkadot-api/utils"),ot=require("rxjs"),Vt=require("@galacticcouncil/common");var Pa=require("polkadot-api"),fa=require("viem");var{FeeUtils:rl}=f,{H160:ol}=Vt.h160;var yt=class{static get(t){switch(t.type){case"Aave":return Ft.fromPool(t);case"XYK":return Et.fromPool(t);case"Omnipool":return Bt.fromPool(t);case"LBP":return wt.fromPool(t);case"Stableswap":return st.fromPool(t);case"HSM":return _t.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var me=require("@galacticcouncil/common"),$t=require("rxjs");var Ct=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var{logger:zl}=me.log;var Pt=class{getProposals(t,e,a){let s=a.filter(p=>p.type==="XYK"),n=a.filter(p=>p.type!=="XYK"),i=new Set(n.map(p=>p.tokens).flat().map(p=>p.id)),r=i.has(t),o=i.has(e),l=new pt,u=p=>{let y=Mt(p),T=Object.keys(y),L=T.flatMap(_=>y[_]);return l.buildAndPopulateGraph(T,L)};if(!r&&!o){let p=s.filter(L=>L.tokens.find(_=>_.id===t)||L.tokens.find(_=>_.id===e)),y=u(p),T=l.findPaths(y,t,e);return this.parsePaths(T)}if(r&&o){let p=u(n),y=l.findPaths(p,t,e);return this.parsePaths(y)}let m=r?e:t,h=s.filter(p=>p.tokens.some(y=>y.id===m));if(h.length===0)return[];let d=[...n,...h],S=u(d),g=l.findPaths(S,t,e);return this.parsePaths(g)}parsePaths(t){let e=[];for(let a of t){let s=[];for(let n=0;n<a.length;n++){let i=a[n],r=a[n+1];if(r==null)break;s.push(this.toEdge(i,r))}e.push(s)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var lt=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,a){return`${t}->${e}::${a.length}`}applyPoolFilter(t){let{useOnly:e=[],exclude:a=[]}=this.filter,s=new Set(e),n=new Set(a);return t.filter(i=>n.has(i.type)?!1:s.size>0?s.has(i.type):!0)}async getPools(){let t=await this.ctx.getPools();return this.applyPoolFilter(t)}async getRoutes(t,e){let a=await this.getPools();return this.validateInput(t,e,a),this.getPaths(t,e,a)}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(s=>s!==t).map(s=>this.getRoutes(s,t)))).filter(s=>s.length>0).map(([s])=>s[0].assetIn).sort()}validateInput(t,e,a){if(a.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let s=this.getAssets(a);if(!s.has(t))throw new Error(t+" is not supported asset");if(!s.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(a)}getAssets(t){let e=t.map(a=>a.tokens.map(s=>s.id)).flat().sort((a,s)=>a>s?1:-1);return new Set(e)}getPaths(t,e,a){let s=this.toPoolsMap(a);return this.getProposals(t,e,a).filter(i=>this.validPath(i,s)).map(i=>this.toHops(i,s))}getProposals(t,e,a){let s=this.buildRouteKey(t,e,a);if(this.routeProposals.has(s))return this.routeProposals.get(s);let n=this.routeSuggester.getProposals(t,e,a);return this.routeProposals.set(s,n),n}validPath(t,e){return t.length>0&&t.map(a=>this.validEdge(a,e)).reduce((a,s)=>a&&s)}validEdge([t,e,a],s){return s.get(t)?.validatePair(e,a)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,yt.get(e)]))}toHops(t,e){return t.map(([a,s,n])=>{let i=e.get(a);return{poolAddress:a,poolId:i?.id,pool:i?.type,assetIn:s,assetOut:n}})}};var P=require("@galacticcouncil/common");var Wt=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Wt||{}),Yt=(a=>(a.Dca="Dca",a.TwapSell="TwapSell",a.TwapBuy="TwapBuy",a))(Yt||{}),Xt=(a=>(a.OrderTooSmall="OrderTooSmall",a.OrderTooBig="OrderTooBig",a.OrderImpactTooBig="OrderImpactTooBig",a))(Xt||{});var{FeeUtils:de}=f,ct=class extends lt{mlr;constructor(t){super(t),this.mlr=new Map}onFilterChanged(){this.mlr.clear()}buildCtxSync(t,e,a){let s=super.validateInput(t,e,a),n=super.getPaths(t,e,a);if(!n.length)throw new Ct(t,e);return{paths:n,pools:a,poolsMap:s}}async withCtx(t,e,a){let s=await super.getPools(),n=this.buildCtxSync(t,e,s);return a(n)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((a,s)=>{let n=a[a.length-1].amountOut,i=s[s.length-1].amountOut;return n>i?-1:1});return e.find(a=>a.every(s=>s.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(a=>a.tradeFeeRange).length>0){let a=t.map(n=>n.tradeFeeRange?.[0]??n.tradeFeePct).reduce((n,i)=>n+i),s=t.map(n=>n.tradeFeeRange?.[1]??n.tradeFeePct).reduce((n,i)=>n+i);return[a,s]}}getPoolFeeRange(t,e){let a=t.min?de.toPct(t.min):void 0,s=t.max?de.toPct(t.max):void 0;if(a&&s)return[a,Math.max(s,e)]}async getBestSell(t,e,a){return this.getSell(t,e,a)}getSellSpot(t){let e=t[t.length-1];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getSell(t,e,a,s){return this.withCtx(t,e,async({paths:n,poolsMap:i})=>{let r;if(s)r=await this.toSellSwaps(a,s,i);else{let o=n.map(u=>this.toSellSwaps(a,u,i)),l=await Promise.all(o);r=this.findBestSellRoute(l)}return this.buildSell(i,r)})}async getSells(t,e,a){return this.withCtx(t,e,async({paths:s,poolsMap:n})=>{let i=s.map(o=>this.toSellSwaps(a,o,n));return(await Promise.all(i)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildSell(n,o)).sort((o,l)=>o.amountOut>l.amountOut?-1:1)})}buildSell(t,e){let a=e[0],s=e[e.length-1],n=this.isDirectTrade(e),i=this.getSellSpot(e),r=s.amountOut,o=n?s.calculatedOut:this.calculateDelta0Y(a.amountIn,e,t),l=o-r,u=this.getRouteFeeRange(e),m=n?s.tradeFeePct:B.calculateSellFee(o,r),h=k.mulSpot(a.amountIn,i,a.assetInDecimals,s.assetOutDecimals),d=B.calculateDiffToRef(o,h);return{type:"Sell",amountIn:a.amountIn,amountOut:s.amountOut,spotPrice:i,tradeFee:l,tradeFeePct:m,tradeFeeRange:u,priceImpactPct:d,swaps:e,toHuman(){return{type:"Sell",amountIn:P.big.toDecimal(a.amountIn,a.assetInDecimals),amountOut:P.big.toDecimal(s.amountOut,s.assetOutDecimals),spotPrice:P.big.toDecimal(i,P.RUNTIME_DECIMALS),tradeFee:P.big.toDecimal(l,s.assetOutDecimals),tradeFeePct:m,tradeFeeRange:u,priceImpactPct:d,swaps:e.map(S=>S.toHuman())}}}}calculateSpot(t){return t.map(e=>e.spotPrice).reduce((e,a)=>e*a/10n**BigInt(P.RUNTIME_DECIMALS))}calculateDelta0Y(t,e,a){let s=[];for(let n=0;n<e.length;n++){let i=e[n],r=a.get(i.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(i.assetIn,i.assetOut),l;n>0?l=s[n-1]:l=t;let u=r.calculateOutGivenIn(o,l);s.push(u)}return s[s.length-1]}async calculateMostLiquidRoute(t,e,a){let{paths:s,pools:n,poolsMap:i}=a,l=n.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,y)=>p+y)).sort((g,p)=>p<g?-1:1)[0],u=k.getFraction(l,.1),m=await Promise.all(s.map(g=>this.toSellSwaps(u,g,i))),d=this.findBestSellRoute(m).map(g=>({poolAddress:g.poolAddress,poolId:g?.poolId,pool:g.pool,assetIn:g.assetIn,assetOut:g.assetOut})),S=this.buildRouteKey(t,e,n);return this.mlr.set(S,d),d}async toSellSwaps(t,e,a){let s=[];for(let n=0;n<e.length;n++){let i=e[n],r=a.get(i.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(i.assetIn,i.assetOut),l;n>0?l=s[n-1].amountOut:l=typeof t=="string"?P.big.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(o,r),{amountOut:m,calculatedOut:h,feePct:d,errors:S}=r.validateAndSell(o,l,u),g=this.getPoolFeeRange(u,d),p=r.spotPriceOutGivenIn(o),y=k.mulSpot(l,p,o.decimalsIn,o.decimalsOut),T=B.calculateDiffToRef(h,y);s.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:m,calculatedOut:h,spotPrice:p,tradeFeePct:d,tradeFeeRange:g,priceImpactPct:T,errors:S,isSupply(){return r.type==="Aave"&&r.tokens[0].id===i.assetIn},isWithdraw(){return r.type==="Aave"&&r.tokens[1].id===i.assetIn},toHuman(){return{...i,amountIn:P.big.toDecimal(l,o.decimalsIn),amountOut:P.big.toDecimal(m,o.decimalsOut),calculatedOut:P.big.toDecimal(h,o.decimalsOut),spotPrice:P.big.toDecimal(p,P.RUNTIME_DECIMALS),tradeFeePct:d,tradeFeeRange:g,priceImpactPct:T,errors:S}}})}return s}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async a=>{let s=this.buildRouteKey(t,e,a.pools),n=this.mlr.get(s);return n||this.calculateMostLiquidRoute(t,e,a)})}async getSpotPrice(t,e){return this.withCtx(t,e,async a=>{let{pools:s,poolsMap:n}=a,i=this.buildRouteKey(t,e,s),r=this.mlr.get(i);r||(r=await this.calculateMostLiquidRoute(t,e,a));let o=await this.toSellSwaps("1",r,n);return{amount:this.getSellSpot(o),decimals:P.RUNTIME_DECIMALS}}).catch(()=>{})}findBestBuyRoute(t){let e=t.sort((a,s)=>{let n=a[0].amountIn,i=s[0].amountIn;return n>i?1:-1});return e.find(a=>a.every(s=>s.errors.length==0))||e[0]}async getBestBuy(t,e,a){return this.getBuy(t,e,a)}getBuySpot(t){let e=t[0];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getBuy(t,e,a,s){return this.withCtx(t,e,async({paths:n,poolsMap:i})=>{let r;if(s)r=await this.toBuySwaps(a,s,i);else{let o=n.map(u=>this.toBuySwaps(a,u,i)),l=await Promise.all(o);r=this.findBestBuyRoute(l)}return this.buildBuy(i,r)})}async getBuys(t,e,a){return this.withCtx(t,e,async({paths:s,poolsMap:n})=>{let i=s.map(o=>this.toBuySwaps(a,o,n));return(await Promise.all(i)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildBuy(n,o)).sort((o,l)=>o.amountIn>l.amountIn?1:-1)})}buildBuy(t,e){let a=e[e.length-1],s=e[0],n=this.isDirectTrade(e),i=this.getBuySpot(e),r=s.amountIn,o=n?s.calculatedIn:this.calculateDelta0X(a.amountOut,e,t),l=r-o,u=this.getRouteFeeRange(e),m=n?s.tradeFeePct:B.calculateBuyFee(o,r),h=k.mulSpot(a.amountOut,i,a.assetOutDecimals,s.assetInDecimals),d;return o===0n?d=-100:d=B.calculateDiffToRef(h,o),{type:"Buy",amountOut:a.amountOut,amountIn:s.amountIn,spotPrice:i,tradeFee:l,tradeFeePct:m,tradeFeeRange:u,priceImpactPct:d,swaps:e,toHuman(){return{type:"Buy",amountOut:P.big.toDecimal(a.amountOut,a.assetOutDecimals),amountIn:P.big.toDecimal(s.amountIn,s.assetInDecimals),spotPrice:P.big.toDecimal(i,P.RUNTIME_DECIMALS),tradeFee:P.big.toDecimal(l,s.assetInDecimals),tradeFeePct:m,tradeFeeRange:u,priceImpactPct:d,swaps:e.map(S=>S.toHuman())}}}}calculateDelta0X(t,e,a){let s=[];for(let n=e.length-1;n>=0;n--){let i=e[n],r=a.get(i.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(i.assetIn,i.assetOut),l;n==e.length-1?l=t:l=s[0];let u=r.calculateInGivenOut(o,l);s.unshift(u)}return s[0]}async toBuySwaps(t,e,a){let s=[];for(let n=e.length-1;n>=0;n--){let i=e[n],r=a.get(i.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(i.assetIn,i.assetOut),l;n==e.length-1?l=typeof t=="string"?P.big.toBigInt(t,o.decimalsOut):t:l=s[0].amountIn;let u=await this.ctx.getPoolFees(o,r),{amountIn:m,calculatedIn:h,feePct:d,errors:S}=r.validateAndBuy(o,l,u),g=this.getPoolFeeRange(u,d),p=r.spotPriceInGivenOut(o),y=k.mulSpot(l,p,o.decimalsOut,o.decimalsIn),T;h===0n?T=-100:T=B.calculateDiffToRef(y,h),s.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:m,calculatedIn:h,spotPrice:p,tradeFeePct:d,tradeFeeRange:g,priceImpactPct:T,errors:S,isSupply(){return r.type==="Aave"&&r.tokens[0].id===i.assetIn},isWithdraw(){return r.type==="Aave"&&r.tokens[1].id===i.assetIn},toHuman(){return{...i,amountOut:P.big.toDecimal(l,o.decimalsOut),amountIn:P.big.toDecimal(m,o.decimalsIn),calculatedIn:P.big.toDecimal(h,o.decimalsIn),spotPrice:P.big.toDecimal(p,P.RUNTIME_DECIMALS),tradeFeePct:d,tradeFeeRange:g,priceImpactPct:T,errors:S}}})}return s}};var w=require("@galacticcouncil/common");var ge=6e3,Kt=1000000000000000n,ft=6,zt=-5,jt=216e5,nu=3,be=.1,he=6;var Qt=require("polkadot-api");var V=class{static build(t){return t.map(({assetIn:e,assetOut:a,pool:s,poolId:n})=>s==="Stableswap"?{pool:(0,Qt.Enum)("Stableswap",n),asset_in:e,asset_out:a}:{pool:(0,Qt.Enum)(s),asset_in:e,asset_out:a})}};var kt=class{schedulerOptions;router;constructor(t,e={}){this.router=new ct(t),this.router.withFilter({exclude:["HSM"]}),this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Kt})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,a,s,n){let i=await this.router.getBestSell(t,e,a),{amountIn:r,swaps:o,priceImpactPct:l}=i,u=o[0],m=o[o.length-1],{assetInDecimals:h}=u,{assetOutDecimals:d}=m,S=Math.abs(l),g=await this.getMinimumOrderBudget(t,h),p=this.getOptimalTradeCount(S),y=this.getMaximumTradeCount(r,g,s),T=n||Math.min(p,y),L=Math.round(s/T),_=r/BigInt(T),F=await this.router.getBestSell(t,e,_),K=r<g,$=[];K&&$.push("OrderTooSmall");let Z=await this.getAssetOutEd(m),W=F.amountOut*BigInt(T),Pe=this.toBlockPeriod(L),fe=F.tradeFee*BigInt(T),Se=V.build(o),Jt={assetIn:t,assetOut:e,assetOutEd:Z,errors:$,maxTradeCount:y,tradeCount:T,tradeFee:fe,tradeImpactPct:F.priceImpactPct,tradePeriod:Pe,tradeRoute:Se,type:"Dca"};return{...Jt,amountIn:r,amountOut:W,tradeAmountIn:F.amountIn,tradeAmountOut:F.amountOut,toHuman(){return{...Jt,amountIn:w.big.toDecimal(r,h),amountOut:w.big.toDecimal(W,d),assetOutEd:w.big.toDecimal(Z,d),tradeAmountIn:w.big.toDecimal(F.amountIn,h),tradeAmountOut:w.big.toDecimal(F.amountOut,d)}}}}async getMinimumOrderBudget(t,e){if(0===t)return this.minOrderBudget;let a=await this.router.getSpotPrice(0,t);if(a)return k.mulSpot(this.minOrderBudget,a.amount,12,e);let s=await this.router.getSpotPrice(t,0);if(s)return k.divSpot(this.minOrderBudget,s.amount,12,e);throw new Error("Unable to calculate order budget")}getMaximumTradeCount(t,e,a){let s=e*2n/10n;if(s===0n)return 0;let n=Number(t/s),i=Math.floor(a/this.blockTime),r=Math.max(0,Math.floor(i*(1-.1)));return Math.min(n,r)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getOpenBudgetDcaOrder(t,e,a,s){let n=await this.router.getBestSell(t,e,a),{swaps:i}=n,r=i[0],o=i[i.length-1],{assetInDecimals:l}=r,{assetOutDecimals:u}=o,m=await this.getMinimumOrderBudget(t,l),h=n.amountIn<m,d=[];h&&d.push("OrderTooSmall");let S=await this.getAssetOutEd(o),g=this.toBlockPeriod(s),p=V.build(i),y={assetIn:t,assetOut:e,assetOutEd:S,errors:d,maxTradeCount:0,tradeCount:0,tradeFee:n.tradeFee,tradeImpactPct:n.priceImpactPct,tradePeriod:g,tradeRoute:p,type:"Dca"};return{...y,amountIn:0n,amountOut:0n,tradeAmountIn:n.amountIn,tradeAmountOut:n.amountOut,toHuman(){return{...y,amountIn:"0",amountOut:"0",assetOutEd:w.big.toDecimal(S,u),tradeAmountIn:w.big.toDecimal(n.amountIn,l),tradeAmountOut:w.big.toDecimal(n.amountOut,u)}}}}async getTwapSellOrder(t,e,a){let s=await this.router.getBestSell(t,e,a),{amountIn:n,swaps:i,priceImpactPct:r}=s,o=i[0],l=i[i.length-1],{assetInDecimals:u}=o,{assetOutDecimals:m}=l,h=Math.abs(r),d=this.getTwapTradeCount(h),S=n/BigInt(d),[g,p]=await Promise.all([this.getMinimumOrderBudget(t,u),this.router.getBestSell(o.assetIn,l.assetOut,S)]),y=d===1,T=n<g,L=p.priceImpactPct<-5,_=[];T||y?_.push("OrderTooSmall"):L&&_.push("OrderImpactTooBig");let F=await this.getAssetOutEd(l),K=p.amountOut*BigInt(d),$=p.tradeFee*BigInt(d),Z=V.build(i),W={assetIn:t,assetOut:e,assetOutEd:F,errors:_,tradeCount:d,tradeImpactPct:p.priceImpactPct,tradePeriod:6,tradeRoute:Z,type:"TwapSell"};return{...W,amountIn:n,amountOut:K,tradeAmountIn:p.amountIn,tradeAmountOut:p.amountOut,tradeFee:$,toHuman(){return{...W,amountIn:w.big.toDecimal(n,u),amountOut:w.big.toDecimal(K,m),assetOutEd:w.big.toDecimal(F,m),tradeAmountIn:w.big.toDecimal(p.amountIn,u),tradeAmountOut:w.big.toDecimal(p.amountOut,m),tradeFee:w.big.toDecimal($,m)}}}}async getTwapBuyOrder(t,e,a){let s=await this.router.getBestBuy(t,e,a),{amountOut:n,swaps:i,priceImpactPct:r}=s,o=i[0],l=i[i.length-1],{assetInDecimals:u}=o,{assetOutDecimals:m}=l,h=Math.abs(r),d=this.getTwapTradeCount(h),S=n/BigInt(d),[g,p]=await Promise.all([this.getMinimumOrderBudget(t,u),this.router.getBestBuy(o.assetIn,l.assetOut,S)]),y=p.amountIn*BigInt(d),T=d===1,L=y<g,_=p.priceImpactPct<-5,F=[];L||T?F.push("OrderTooSmall"):_&&F.push("OrderImpactTooBig");let K=await this.getAssetOutEd(l),$=p.tradeFee*BigInt(d),Z=V.build(i),W={assetIn:t,assetOut:e,assetOutEd:K,errors:F,tradeCount:d,tradeImpactPct:p.priceImpactPct,tradePeriod:6,tradeRoute:Z,type:"TwapBuy"};return{...W,amountIn:y,amountOut:n,tradeAmountIn:p.amountIn,tradeAmountOut:p.amountOut,tradeFee:$,toHuman(){return{...W,amountIn:w.big.toDecimal(y,u),amountOut:w.big.toDecimal(n,m),assetOutEd:w.big.toDecimal(K,m),tradeAmountIn:w.big.toDecimal(p.amountIn,u),tradeAmountOut:w.big.toDecimal(p.amountOut,m),tradeFee:w.big.toDecimal($,u)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let s=216e5/(this.blockTime*6);return Math.round(s)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,a=Math.round(e);return Math.max(a,6)}async getAssetOutEd(t){let s=(await this.router.getPools()).find(n=>n.address===t.poolAddress)?.tokens.find(n=>n.id===t.assetOut);if(!s)throw new Error(`Asset ${t.assetOut} not found in pool ${t.poolAddress}`);return s.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});
1
+ "use strict";var Me=Object.create;var Ot=Object.defineProperty;var De=Object.getOwnPropertyDescriptor;var Le=Object.getOwnPropertyNames;var qe=Object.getPrototypeOf,Ne=Object.prototype.hasOwnProperty;var at=(c,t)=>{for(var e in t)Ot(c,e,{get:t[e],enumerable:!0})},le=(c,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Le(t))!Ne.call(c,s)&&s!==e&&Ot(c,s,{get:()=>t[s],enumerable:!(a=De(t,s))||a.enumerable});return c};var bt=(c,t,e)=>(e=c!=null?Me(qe(c)):{},le(t||!c||!c.__esModule?Ot(e,"default",{value:c,enumerable:!0}):e,c)),He=c=>le(Ot({},"__esModule",{value:!0}),c);var Va={};at(Va,{DCA_TIME_RESERVE:()=>Ee,DEFAULT_BLOCK_TIME:()=>Be,DEFAULT_MIN_BUDGET:()=>ie,ORDER_MIN_BLOCK_PERIOD:()=>Re,Router:()=>dt,TWAP_EXECUTION_INTERVAL:()=>vt,TWAP_MAX_DURATION:()=>re,TWAP_MAX_PRICE_IMPACT:()=>ne,TWAP_TX_MULTIPLIER:()=>nm,TradeOrderError:()=>se,TradeOrderType:()=>ae,TradeRouteBuilder:()=>Y,TradeRouter:()=>gt,TradeScheduler:()=>Gt,TradeType:()=>ee});module.exports=He(Va);var ht=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 Ge=10,yt=class{isNotVisited(t,e){let a=!0;return e.forEach(s=>{(s[0]===t[0]||s[1]===t[1])&&(a=!1)}),a}findPaths(t,e,a){let s=[],i=new ht,n=[];for(n.push([e,""]),i.enqueue(n);i.size()>0;){let r=i.dequeue();if(!r||r.length>Ge)continue;let o=r[r.length-1];(a===null||o[0]===a)&&s.push(r),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,r)){let m=[...r];m.push(u),i.enqueue(m)}})}return s}findShortestPaths(t,e,a){let s=[],i=new ht,n=[];n.push([e,""]),i.enqueue(n);let r=1/0;for(;i.size()>0;){let o=i.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===a){o.length<r?(r=o.length,s.length=0,s.push(o)):o.length===r&&s.push(o);continue}let u=t.get(l[0]);for(let m of u??[])this.isNotVisited(m,o)&&i.enqueue([...o,m])}return s}buildAndPopulateGraph(t,e){let a=new Map;for(let s of t)a.set(parseInt(s),[]);for(let[s,i,n]of e)a.get(i)?.push([n,s]);return a}};function Vt(c){let t={};for(let e of c){let a=e.tokens.length;for(let s=0;s<a;s++){t[e.tokens[s].id]||(t[e.tokens[s].id]=[]);for(let i=0;i<a;i++){if(s==i)continue;let n=[e.address,e.tokens[s].id,e.tokens[i].id];t[e.tokens[s].id].push(n)}}}return t}var V=require("@galacticcouncil/math-lbp"),$=class{static getSpotPrice(t,e,a,s,i){return(0,V.get_spot_price)(t,e,a,s,i)}static calculateInGivenOut(t,e,a,s,i){return(0,V.calculate_in_given_out)(t,e,a,s,i)}static calculateOutGivenIn(t,e,a,s,i){return(0,V.calculate_out_given_in)(t,e,a,s,i)}static calculateLinearWeights(t,e,a,s,i){return(0,V.calculate_linear_weights)(t,e,a,s,i)}static calculatePoolTradeFee(t,e,a){return(0,V.calculate_pool_trade_fee)(t,e,a)}};var st=require("@galacticcouncil/common");var xt={};at(xt,{withTimeout:()=>Ve});function Ve(c,t,e="timeout"){return new Promise((a,s)=>{let i=setTimeout(()=>s(new Error(e)),t);c.then(n=>{clearTimeout(i),a(n)},n=>{clearTimeout(i),s(n)})})}var q={};at(q,{divSpot:()=>We,getFraction:()=>$e,mulScaled:()=>ce,mulSpot:()=>Ue});var Ut=require("@galacticcouncil/common");function ce(c,t,e,a,s){let i=e+a-s,n=c*t;return i>0?n/BigInt(10)**BigInt(i):i<0?n*BigInt(10)**BigInt(-i):n}function Ue(c,t,e,a){return ce(c,t,e,Ut.RUNTIME_DECIMALS,a)}function We(c,t,e,a){if(t===0n)return 0n;let s=BigInt(10)**BigInt(Ut.RUNTIME_DECIMALS+a-e);return c*s/t}function $e(c,t,e=2){if(t<.01||t>100)throw new Error("Supported range is from 0.01% - 100%");let a=BigInt(10)**BigInt(e),s=BigInt(Math.round(t*Number(a)));return c*s/(BigInt(100)*a)}var I={};at(I,{FeeUtils:()=>Wt,shiftNeg:()=>Ye});var ue=bt(require("big.js"));var Wt=class c{static toPct(t){let[e,a]=t;return c.safeDivide(e*100,a)}static toRaw(t){let[e,a]=t;return c.safeDivide(e,a)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,a=12){let s=10**a;return Math.round(t*s/e)/s}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Ye(c,t){let e=(0,ue.default)(typeof c=="bigint"?c.toString():c);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var ft={};at(ft,{findNestedKey:()=>Ke,findNestedObj:()=>ze,jsonFormatter:()=>je});var Ke=(c,t)=>{let e=[];return JSON.stringify(c,(a,s)=>(s&&s[t]&&e.push(s),s)),e[0]},ze=(c,t,e)=>{let a;return JSON.stringify(c,(s,i)=>(i&&i[t]===e&&(a=i),i)),a},je=(c,t)=>typeof t=="bigint"?t.toString():t;var B={};at(B,{calculateBuyFee:()=>ta,calculateDiffToAvg:()=>Qe,calculateDiffToRef:()=>Je,calculateSellFee:()=>Ze});var U=bt(require("big.js"));function Qe(c,t){let e=(0,U.default)(c.toString()),a=(0,U.default)(t.toString());return e.minus(a).abs().div(e.plus(a).div(2)).mul(100).round(2).toNumber()}function Je(c,t){if(t===0n)return 0;let e=(0,U.default)(c.toString()),a=(0,U.default)(t.toString());return e.minus(a).div(a).mul(100).round(2).toNumber()}function Ze(c,t){if(c===0n)return 0;let e=(0,U.default)(c.toString()),a=(0,U.default)(t.toString());return(0,U.default)(1).minus(a.div(e)).mul(100).round(2).toNumber()}function ta(c,t){if(c===0n)return 0;let e=(0,U.default)(c.toString());return(0,U.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}var{FeeUtils:me}=I,At=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 a=new Map(this.tokens.map(n=>[n.id,n])),s=a.get(t),i=a.get(e);if(s==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:s.balance,balanceOut:i.balance,decimalsIn:s.decimals,decimalsOut:i.decimals,weightIn:s.weight,weightOut:i.weight}}validateAndBuy(t,e,a){let s=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let n=t.balanceOut/this.maxOutRatio;if(e>n&&i.push("MaxOutRatioExceeded"),s===t.assetOut){let r=this.calculateTradeFee(e,a),o=me.toPct(this.repayFeeApply?a.repayFee:a.exchangeFee),l=e+r,u=this.calculateInGivenOut(t,l),m=t.balanceIn/this.maxInRatio;return u>m&&i.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:i}}else{let r=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return r>o&&i.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:i}}}validateAndSell(t,e,a){let s=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let n=t.balanceIn/this.maxInRatio;if(e>n&&i.push("MaxInRatioExceeded"),s===t.assetIn){let r=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return r>o&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:i}}else{let r=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(r,a),l=me.toPct(this.repayFeeApply?a.repayFee:a.exchangeFee),u=r-o,m=t.balanceOut/this.maxOutRatio;return u>m&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:u,feePct:l,errors:i}}}calculateInGivenOut(t,e){let a=$.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(a);return s<0n?0n:s}calculateOutGivenIn(t,e){let a=$.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(a);return s<0n?0n:s}spotPriceInGivenOut(t){let e=$.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),st.big.toBigInt(1,st.RUNTIME_DECIMALS).toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=$.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),st.big.toBigInt(1,st.RUNTIME_DECIMALS).toString());return BigInt(e)}calculateTradeFee(t,e){let a=$.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(a)}};var ra=require("polkadot-api"),_t=require("rxjs");var X=require("rxjs"),C=require("rxjs/operators");var Yt=require("@galacticcouncil/descriptors");var pe=require("@galacticcouncil/common"),Xt=require("rxjs");var Bt=require("rxjs"),z=require("rxjs/operators");var{logger:fs}=pe.log;var ea=require("polkadot-api/ws"),aa=require("polkadot-api/logs-provider");var sa=require("polkadot-api");var de=require("@galacticcouncil/common"),Rt=require("rxjs"),N=require("rxjs/operators");var{logger:qs}=de.log;var na=require("rxjs");var ge=require("@galacticcouncil/common");var Qs={Aave:"AAVE",LBP:"LBP",Omnipool:"OMNI",Stableswap:"STBL",XYK:"XYK",HSM:"HSM",UniswapV3:"UNIV3"},{logger:Js}=ge.log;var{withTimeout:bi}=xt;var b=require("@galacticcouncil/math-omnipool"),J=bt(require("big.js")),v=class{static calculateSpotPrice(t,e,a,s){return(0,b.calculate_spot_price)(t,e,a,s)}static calculateLrnaSpotPrice(t,e){return(0,b.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,a,s,i,n,r,o,l,u){return(0,b.calculate_in_given_out)(t,e,a,s,i,n,r,o,l,u)}static calculateLrnaInGivenOut(t,e,a,s,i,n){return(0,b.calculate_lrna_in_given_out)(t,e,a,s,i,n)}static calculateOutGivenIn(t,e,a,s,i,n,r,o,l,u){return(0,b.calculate_out_given_in)(t,e,a,s,i,n,r,o,l,u)}static calculateOutGivenLrnaIn(t,e,a,s,i,n){return(0,b.calculate_out_given_lrna_in)(t,e,a,s,i,n)}static calculateShares(t,e,a,s){return(0,b.calculate_shares)(t,e,a,s)}static calculateLiquidityOut(t,e,a,s,i,n,r,o){return(0,b.calculate_liquidity_out)(t,e,a,s,i,n,r,o)}static calculateLiquidityLRNAOut(t,e,a,s,i,n,r,o){return(0,b.calculate_liquidity_lrna_out)(t,e,a,s,i,n,r,o)}static calculateCapDifference(t,e,a,s){let i=(0,J.default)(e),n=(0,J.default)(t),r=(0,J.default)(s),o=(0,J.default)(a),l=(0,J.default)(10).pow(18),u=o.div(l);if(i.div(r).lt(u)){let h=u.times(r).minus(i).times(n),d=i.times((0,J.default)(1).minus(u));return h.div(d).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,a,s){return(0,b.calculate_liquidity_hub_in)(t,e,a,s)}static isSellAllowed(t){return(0,b.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,b.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,b.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,b.is_remove_liquidity_allowed)(t)}static recalculateAssetFee(t,e,a,s,i,n,r,o,l,u,m){return(0,b.recalculate_asset_fee)(t,e,a,s,i,n,r,o,l,u,m)}static recalculateProtocolFee(t,e,a,s,i,n,r,o,l,u,m){return(0,b.recalculate_protocol_fee)(t,e,a,s,i,n,r,o,l,u,m)}static verifyAssetCap(t,e,a,s){return(0,b.verify_asset_cap)(t,e,a,s)}};var be=require("@galacticcouncil/common");var{FeeUtils:W}=I,Ft=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 a=new Map(this.tokens.map(n=>[n.id,n])),s=a.get(t),i=a.get(e);if(s==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:s.hubReserves,hubReservesOut:i.hubReserves,sharesIn:s.shares,sharesOut:i.shares,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:s.balance,balanceOut:i.balance,tradeableIn:s.tradeable,tradeableOut:i.tradeable,assetInEd:s.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,a){let s=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,a),n=s===0n?0:B.calculateBuyFee(s,i),r=[],o=v.isSellAllowed(t.tradeableIn),l=v.isBuyAllowed(t.tradeableOut);(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&r.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&r.push("MaxOutRatioExceeded");let m=t.balanceIn/this.maxInRatio;return i>m&&r.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:e,feePct:n,errors:r}}validateAndSell(t,e,a){let s=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,a),n=B.calculateSellFee(s,i),r=[],o=v.isSellAllowed(t.tradeableIn),l=v.isBuyAllowed(t.tradeableOut);(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&r.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&r.push("MaxInRatioExceeded");let m=t.balanceOut/this.maxOutRatio;return i>m&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:i,feePct:n,errors:r}}calculateInGivenOut(t,e,a){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,a);let s=v.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),a?W.toRaw(a.assetFee).toString():"0",a?W.toRaw(a.protocolFee).toString():"0",a?W.toRaw(a.maxSlipFee).toString():"0"),i=BigInt(s);return i<0n?0n:i}calculateLrnaInGivenOut(t,e,a){let s=v.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),a?W.toRaw(a.assetFee).toString():"0",a?W.toRaw(a.maxSlipFee).toString():"0"),i=BigInt(s);return i<0n?0n:i}calculateOutGivenIn(t,e,a){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,a);let s=v.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),a?W.toRaw(a.assetFee).toString():"0",a?W.toRaw(a.protocolFee).toString():"0",a?W.toRaw(a.maxSlipFee).toString():"0"),i=BigInt(s);return i<0n?0n:i}calculateOutGivenLrnaIn(t,e,a){let s=v.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),a?W.toRaw(a.assetFee).toString():"0",a?W.toRaw(a.maxSlipFee).toString():"0"),i=BigInt(s);return i<0n?0n:i}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=v.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=v.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=v.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=v.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}normalizeSpot(t,e,a){let s=e-a;if(s===0)return t;let i=be.big.pow10(Math.abs(s));return s>0?t*i:t/i}};var Z=require("polkadot-api"),ma=require("@polkadot-api/utils"),tt=require("rxjs"),pa=require("@galacticcouncil/common");var{FeeUtils:$i}=I;var{FeeUtils:rn}=I,on=Z.Binary.toHex(Z.Binary.fromText("omnipool")),ln=(0,Z.Enum)("Short");var x=require("@galacticcouncil/math-stableswap"),M=class{static getPoolAddress(t){return(0,x.pool_account_name)(t)}static defaultPegs(t){let e=[];for(let a=0;a<t;a++)e.push(["1","1"]);return e}static calculateAmplification(t,e,a,s,i){return(0,x.calculate_amplification)(t,e,a,s,i)}static calculateInGivenOut(t,e,a,s,i,n,r){return(0,x.calculate_in_given_out)(t,e,a,s,i,n,r)}static calculateAddOneAsset(t,e,a,s,i,n,r){return(0,x.calculate_add_one_asset)(t,e,a,s,i,n,r)}static calculateSharesForAmount(t,e,a,s,i,n,r){return(0,x.calculate_shares_for_amount)(t,e,a,s,i,n,r)}static calculateOutGivenIn(t,e,a,s,i,n,r){return(0,x.calculate_out_given_in)(t,e,a,s,i,n,r)}static calculateLiquidityOutOneAsset(t,e,a,s,i,n,r){return(0,x.calculate_liquidity_out_one_asset)(t,e,a,s,i,n,r)}static calculateShares(t,e,a,s,i,n){return(0,x.calculate_shares)(t,e,a,s,i,n)}static calculateSpotPriceWithFee(t,e,a,s,i,n,r,o){return(0,x.calculate_spot_price_with_fee)(t,e,a,s,i,n,r,o)}static recalculatePegs(t,e,a,s,i,n){let r=(0,x.recalculate_peg)(t,e,a,s,i,n);return JSON.parse(r)}};var Pt=require("@galacticcouncil/common");var{FeeUtils:rt}=I,ot=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 a=new Map(this.tokens.map(n=>[n.id,n])),s=a.get(t),i=a.get(e);if(s==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:s.balance,balanceOut:i.balance,decimalsIn:s.decimals,decimalsOut:i.decimals,tradeableIn:this.id===t?15:s.tradeable,tradeableOut:this.id===e?15:i.tradeable,assetInEd:s.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,a){let s=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,a),n=s===0n?0:B.calculateBuyFee(s,i),r=[],o=v.isSellAllowed(t.tradeableIn),l=v.isBuyAllowed(t.tradeableOut);return(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&r.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:s,amountOut:e,feePct:n,errors:r}}validateAndSell(t,e,a){let s=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,a),n=B.calculateSellFee(s,i),r=[],o=v.isSellAllowed(t.tradeableIn),l=v.isBuyAllowed(t.tradeableOut);return(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&r.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:s,amountOut:i,feePct:n,errors:r}}calculateIn(t,e,a){let s=M.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),a?rt.toRaw(a.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateAddOneAsset(t,e,a){let s=M.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),a?rt.toRaw(a.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateSharesForAmount(t,e,a){let s=M.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),a?rt.toRaw(a.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateInGivenOut(t,e,a){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,a):t.assetIn==this.id?this.calculateSharesForAmount(t,e,a):this.calculateIn(t,e,a)}spotPriceInGivenOut(t){let e=M.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,a){let s=M.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),a?rt.toRaw(a.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateWithdrawOneAsset(t,e,a){let s=M.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),a?rt.toRaw(a.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateShares(t,e,a){let s=M.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),a?rt.toRaw(a.fee).toString():"0",this.getPegs()),i=BigInt(s);return i<0n?0n:i}calculateOutGivenIn(t,e,a){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,a):t.assetOut==this.id?this.calculateShares(t,e,a):this.calculateOut(t,e,a)}spotPriceOutGivenIn(t){let e=M.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:a,decimals:s})=>({asset_id:e,amount:a,decimals:s}));return JSON.stringify(t,ft.jsonFormatter)}getAssets(t,e){let a={asset_id:Number(t),amount:e.toString()};return JSON.stringify([a],ft.jsonFormatter)}normalizeSpot(t,e,a,s,i){return e?t*Pt.big.pow10(Pt.RUNTIME_DECIMALS-i):a?t/Pt.big.pow10(i-s):t}};var he=require("polkadot-api"),fa=require("@polkadot-api/utils"),Pa=require("@noble/hashes/blake2b"),lt=require("rxjs"),ye=require("@galacticcouncil/common");var ga=require("polkadot-api"),ba=require("viem");var{FeeUtils:jn}=I;var{FeeUtils:yr}=I;var A=require("@galacticcouncil/math-xyk"),j=class{static getSpotPrice(t,e,a){return(0,A.get_spot_price)(t,e,a)}static calculateInGivenOut(t,e,a){return(0,A.calculate_in_given_out)(t,e,a)}static calculateOutGivenIn(t,e,a){return(0,A.calculate_out_given_in)(t,e,a)}static calculatePoolTradeFee(t,e,a){return(0,A.calculate_pool_trade_fee)(t,e,a)}static calculateLiquidityIn(t,e,a){return(0,A.calculate_liquidity_in)(t,e,a)}static calculateSpotPrice(t,e){return(0,A.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,a,s){return(0,A.calculate_spot_price_with_fee)(t,e,a,s)}static calculateShares(t,e,a){return(0,A.calculate_shares)(t,e,a)}static calculateLiquidityOutAssetA(t,e,a,s){return(0,A.calculate_liquidity_out_asset_a)(t,e,a,s)}static calculateLiquidityOutAssetB(t,e,a,s){return(0,A.calculate_liquidity_out_asset_b)(t,e,a,s)}};var Pe=require("@galacticcouncil/common");var{FeeUtils:fe}=I,kt=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 a=new Map(this.tokens.map(n=>[n.id,n])),s=a.get(t),i=a.get(e);if(s==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:s.decimals,decimalsOut:i.decimals,balanceIn:s.balance,balanceOut:i.balance,assetInEd:s.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,a){let s=this.calculateInGivenOut(t,e),i=this.calculateTradeFee(s,a),n=fe.toPct(a.exchangeFee),r=s+i,o=[];(e<this.minTradingLimit||s<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return r>u&&o.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:s,amountOut:e,feePct:n,errors:o}}validateAndSell(t,e,a){let s=this.calculateOutGivenIn(t,e),i=this.calculateTradeFee(s,a),n=fe.toPct(a.exchangeFee),r=s-i,o=[];(e<this.minTradingLimit||s<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return r>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:r,feePct:n,errors:o}}calculateInGivenOut(t,e){let a=j.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(a);return s<0n?0n:s}calculateOutGivenIn(t,e){let a=j.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(a);return s<0n?0n:s}spotPriceInGivenOut(t){let e=j.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){let e=j.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}calculateTradeFee(t,e){let a=j.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(a)}normalizeSpot(t,e,a){let s=e-a;if(s===0)return t;let i=Pe.big.pow10(Math.abs(s));return s>0?t*i:t/i}};var Ta=require("polkadot-api"),Ia=require("rxjs");var ct=require("@galacticcouncil/common");var Ct=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 a=new Map(this.tokens.map(n=>[n.id,n])),s=a.get(t),i=a.get(e);if(s==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:s.balance,balanceOut:i.balance,decimalsIn:s.decimals,decimalsOut:i.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,a){let s=this.calculateInGivenOut(t,e),i=[];return e>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:i}}validateAndSell(t,e,a){let s=this.calculateOutGivenIn(t,e),i=[];return s>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:i}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){return ct.big.toBigInt(1,ct.RUNTIME_DECIMALS)}spotPriceOutGivenIn(t){return ct.big.toBigInt(1,ct.RUNTIME_DECIMALS)}calculateTradeFee(t,e){return 0n}};var Ba=require("polkadot-api"),Ea=require("@polkadot-api/utils"),Mt=require("rxjs"),zt=require("@galacticcouncil/common");var co=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Oa=require("polkadot-api"),xa=require("viem");var Aa=bt(require("big.js")),St=require("@galacticcouncil/common");var{ERC20:wo}=St.erc20,{H160:vo}=St.h160;var Oo=10n**27n;var{ERC20:Vo}=zt.erc20;var F=require("@galacticcouncil/math-hsm"),H=class{static calculateCollateralInGivenHollarOut(t,e,a){return(0,F.calculate_collateral_in_given_hollar_out)(t,e,a)}static calculateCollateralOutGivenHollarIn(t,e,a){return(0,F.calculate_collateral_out_given_hollar_in)(t,e,a)}static calculateHollarOutGivenCollateralIn(t,e,a){return(0,F.calculate_hollar_out_given_collateral_in)(t,e,a)}static calculateHollarInGivenCollateralOut(t,e,a){return(0,F.calculate_hollar_in_given_collateral_out)(t,e,a)}static calculateImbalance(t,e,a){return(0,F.calculate_imbalance)(t,e,a)}static calculateBuybackLimit(t,e){return(0,F.calculate_buyback_limit)(t,e)}static calculateBuybackPriceWithFee(t,e,a){return(0,F.calculate_buyback_price_with_fee)(t,e,a)}static calculateMaxPrice(t,e){return(0,F.calculate_max_price)(t,e)}};var k=require("@galacticcouncil/common");var{FeeUtils:ut}=I,Dt=class c extends ot{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,a){let s=this.parsePair(t.assetOut,t.assetIn),i=super.calculateInGivenOut(s,e,{fee:this.fee}),n=this.calculateBuybackLimit(t);e>n&&a.push("MaxBuyBackExceeded");let r=this.calculateMaxPrice(t);return this.calculateBuyPrice(t,e,i)>r&&a.push("MaxBuyPriceExceeded"),i>this.collateralBalance&&a.push("InsufficientCollateral"),a}validateTradeHollarOut(t,e,a){return this.collateralBalance+t>this.maxInHolding&&a.push("MaxHoldingExceeded"),e>this.hsmMintCapacity&&a.push("FacilitatorCapacityExceeded"),a}validateTradeConstraints(t,e,a){let s=[];return t.assetIn===this.hollarId?this.validateTradeHollarIn(t,e,s):this.validateTradeHollarOut(e,a,s)}validateAndBuy(t,e){let a=this.calculateInGivenOut(t,e),s=this.validateTradeConstraints(t,a,e);return{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:s}}validateAndSell(t,e){let a=this.calculateOutGivenIn(t,e),s=this.validateTradeConstraints(t,e,a);return{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:s}}calculateHollarInGivenCollateralOut(t,e){let a=super.calculateInGivenOut(t,e,{fee:this.fee}),s=H.calculateHollarInGivenCollateralOut(e.toString(),a.toString(),ut.toRaw(this.buyBackFee).toString());return BigInt(s)}calculateCollateralInGivenHollarOut(t){let e=this.getCollateralPeg(),a=H.calculateCollateralInGivenHollarOut(t.toString(),JSON.stringify(e),ut.toRaw(this.purchaseFee).toString());return BigInt(a)}calculateInGivenOut(t,e){return t.assetOut==this.hollarId?this.calculateCollateralInGivenHollarOut(e):this.calculateHollarInGivenCollateralOut(t,e)}calculateCollateralOutGivenHollarIn(t,e){let a=super.calculateOutGivenIn(t,e,{fee:this.fee}),s=H.calculateCollateralOutGivenHollarIn(e.toString(),a.toString(),ut.toRaw(this.buyBackFee).toString());return BigInt(s)}calculateHollarOutGivenCollateralIn(t){let e=this.getCollateralPeg(),a=H.calculateHollarOutGivenCollateralIn(t.toString(),JSON.stringify(e),ut.toRaw(this.purchaseFee).toString());return BigInt(a)}calculateOutGivenIn(t,e){return t.assetIn==this.hollarId?this.calculateCollateralOutGivenHollarIn(t,e):this.calculateHollarOutGivenCollateralIn(e)}calculateImbalance(t){let e=this.getCollateralPeg(),a=H.calculateImbalance(t.balanceIn.toString(),JSON.stringify(e),t.balanceOut.toString());return BigInt(a)}calculateBuybackLimit(t){let e=this.calculateImbalance(t),a=H.calculateBuybackLimit(e.toString(),ut.toRaw(this.buyBackRate).toString());return BigInt(a)}calculateBuyPrice(t,e,a){let s=H.calculateBuybackPriceWithFee(a.toString(),e.toString(),ut.toRaw(this.buyBackFee).toString()),[i,n]=JSON.parse(s),r=k.big.pow10(t.decimalsIn+k.RUNTIME_DECIMALS-t.decimalsOut);return BigInt(i)*r/BigInt(n)}calculateMaxPrice(t){let e=this.getCollateralPeg(),a=H.calculateMaxPrice(JSON.stringify(e),this.maxBuyPriceCoefficient.toString()),[s,i]=JSON.parse(a),n=k.big.pow10(k.RUNTIME_DECIMALS-t.decimalsOut);return BigInt(s)*n/BigInt(i)}spotPriceInGivenOut(t){let e=k.big.toBigInt(1,t.decimalsOut),s=this.calculateInGivenOut(t,e)*k.big.pow10(k.RUNTIME_DECIMALS-t.decimalsOut);return this.normalizeSpotPrice(s,t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){let e=k.big.toBigInt(1,t.decimalsIn),s=this.calculateOutGivenIn(t,e)*k.big.pow10(k.RUNTIME_DECIMALS-t.decimalsIn);return this.normalizeSpotPrice(s,t.decimalsIn,t.decimalsOut)}getCollateralPeg(){let t=this.tokens.findIndex(s=>s.id!==this.hollarId),e=this.pegs[t],a=this.tokens[t].decimals;return this.isDefaultPeg(e)?[k.big.toBigInt(1,18).toString(),k.big.toBigInt(1,a).toString()]:e}isDefaultPeg(t){let[e,a]=t;return Array.isArray(t)&&t.length===2&&e==="1"&&a==="1"}normalizeSpotPrice(t,e,a){let s=e-a;if(s===0)return t;let i=k.big.pow10(Math.abs(s));return s>0?t*i:t/i}};var Se=require("polkadot-api"),Ca=require("@polkadot-api/utils"),mt=require("rxjs"),jt=require("@galacticcouncil/common");var Fa=require("polkadot-api"),ka=require("viem");var{FeeUtils:Ol}=I,{H160:xl}=jt.h160;var f=bt(require("jsbi")),E=require("@uniswap/v3-sdk"),Qt=f.default.BigInt(0),Te=f.default.BigInt(1),Jt=f.default.BigInt(-1),Tt=class c{static calculateOutGivenIn(t,e,a){if(a<=0n||t.liquidity<=0n)return 0n;let s=c.computeSwap(t,e,f.default.BigInt(a.toString())),i=f.default.multiply(s.amountCalculated,Jt);return BigInt(i.toString())}static calculateInGivenOut(t,e,a){if(a<=0n||t.liquidity<=0n)return 0n;let s=c.computeSwap(t,e,f.default.multiply(f.default.BigInt(a.toString()),Jt));return BigInt(s.amountCalculated.toString())}static computeSwap(t,e,a){let s=c.buildTicks(t.ticks),i=t.tickSpacing,n=t.fee,r=e?f.default.add(E.TickMath.MIN_SQRT_RATIO,Te):f.default.subtract(E.TickMath.MAX_SQRT_RATIO,Te),o=f.default.greaterThanOrEqual(a,Qt),l=a,u=Qt,m=f.default.BigInt(t.sqrtPriceX96.toString()),h=t.tick,d=f.default.BigInt(t.liquidity.toString());for(;f.default.notEqual(l,Qt)&&f.default.notEqual(m,r);){let S=m,[g,p]=E.TickList.nextInitializedTickWithinOneWord(s,h,e,i);g<E.TickMath.MIN_TICK?g=E.TickMath.MIN_TICK:g>E.TickMath.MAX_TICK&&(g=E.TickMath.MAX_TICK);let y=E.TickMath.getSqrtRatioAtTick(g),T=(e?f.default.lessThan(y,r):f.default.greaterThan(y,r))?r:y,[D,_,R,G]=E.SwapMath.computeSwapStep(m,T,d,l,n);if(m=D,o?(l=f.default.subtract(l,f.default.add(_,G)),u=f.default.subtract(u,R)):(l=f.default.add(l,R),u=f.default.add(u,f.default.add(_,G))),f.default.equal(m,y)){if(p){let L=E.TickList.getTick(s,g).liquidityNet;e&&(L=f.default.multiply(L,Jt)),d=E.LiquidityMath.addDelta(d,L)}h=e?g-1:g}else f.default.notEqual(m,S)&&(h=E.TickMath.getTickAtSqrtRatio(m))}return{amountCalculated:u,sqrtPriceX96:m,liquidity:d,tick:h}}static buildTicks(t){return t.map(e=>new E.Tick({index:e.index,liquidityGross:e.liquidityGross.toString(),liquidityNet:e.liquidityNet.toString()})).sort((e,a)=>e.index-a.index)}};var ve=require("@galacticcouncil/common");var Da=1e6,Ie=10n**BigInt(ve.RUNTIME_DECIMALS),we=192n,pt=class c{type;address;id;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;token0;token1;sqrtPriceX96;tick;liquidity;tickSpacing;ticks;static fromPool(t){return new c(t)}constructor(t){this.type="UniswapV3",this.address=t.address,this.id=t.id,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.fee=t.fee,this.token0=t.token0,this.token1=t.token1,this.sqrtPriceX96=t.sqrtPriceX96,this.tick=t.tick,this.liquidity=t.liquidity,this.tickSpacing=t.tickSpacing,this.ticks=t.ticks}validatePair(t,e){let a=s=>s===this.token0||s===this.token1;return a(t)&&a(e)&&t!==e}parsePair(t,e){let a=new Map(this.tokens.map(n=>[n.id,n])),s=a.get(t),i=a.get(e);if(s==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:s.decimals,decimalsOut:i.decimals,balanceIn:s.balance,balanceOut:i.balance,assetInEd:s.existentialDeposit,assetOutEd:i.existentialDeposit}}calculateInGivenOut(t,e,a){return Tt.calculateInGivenOut(this.toState(a!=null),this.isZeroForOne(t.assetIn),e)}calculateOutGivenIn(t,e,a){return Tt.calculateOutGivenIn(this.toState(a!=null),this.isZeroForOne(t.assetIn),e)}spotPriceOutGivenIn(t){let e=this.spotOutPerIn(this.isZeroForOne(t.assetIn));return this.normalizeSpot(e,t.decimalsIn,t.decimalsOut)}spotPriceInGivenOut(t){let e=this.spotOutPerIn(!this.isZeroForOne(t.assetIn));return this.normalizeSpot(e,t.decimalsOut,t.decimalsIn)}validateAndSell(t,e,a){let s=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,this.fees()),n=B.calculateSellFee(s,i),r=[];(e<this.minTradingLimit||s<t.assetOutEd)&&r.push("InsufficientTradingAmount");let o=t.balanceIn/this.maxInRatio;e>o&&r.push("MaxInRatioExceeded");let l=t.balanceOut/this.maxOutRatio;return i>l&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:i,feePct:n,errors:r}}validateAndBuy(t,e,a){let s=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,this.fees()),n=B.calculateBuyFee(s,i),r=[];(e<this.minTradingLimit||s<t.assetInEd)&&r.push("InsufficientTradingAmount");let o=t.balanceOut/this.maxOutRatio;e>o&&r.push("MaxOutRatioExceeded");let l=t.balanceIn/this.maxInRatio;return i>l&&r.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:e,feePct:n,errors:r}}fees(){return{fee:[this.fee,Da]}}isZeroForOne(t){return t===this.token0}toState(t){return{fee:t?this.fee:0,sqrtPriceX96:this.sqrtPriceX96,tick:this.tick,liquidity:this.liquidity,tickSpacing:this.tickSpacing,ticks:this.ticks}}spotOutPerIn(t){let e=this.sqrtPriceX96*this.sqrtPriceX96;if(e===0n)return 0n;let a=e*Ie>>we;return t?a:(Ie<<we)/e}normalizeSpot(t,e,a){let s=e-a;if(s===0)return t;let i=10n**BigInt(Math.abs(s));return s>0?t*i:t/i}};var qt=require("rxjs"),Oe=require("@galacticcouncil/common"),Zt=require("@uniswap/v3-sdk");var Lt=require("viem"),La=(0,Lt.parseAbi)(["function getPool(address tokenA, address tokenB, uint24 fee) view returns (address pool)"]),qa=(0,Lt.parseAbi)(["function slot0() view returns (uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, uint8 feeProtocol, bool unlocked)","function liquidity() view returns (uint128)","function tickBitmap(int16 wordPosition) view returns (uint256)","function ticks(int24 tick) view returns (uint128 liquidityGross, int128 liquidityNet, uint256 feeGrowthOutside0X128, uint256 feeGrowthOutside1X128, int56 tickCumulativeOutside, uint160 secondsPerLiquidityOutsideX128, uint32 secondsOutside, bool initialized)"]),Na=(0,Lt.parseAbi)(["function balanceOf(address account) view returns (uint256)"]);var{ERC20:ec}=Oe.erc20;var It=class{static get(t){switch(t.type){case"Aave":return Ct.fromPool(t);case"XYK":return kt.fromPool(t);case"Omnipool":return Ft.fromPool(t);case"LBP":return At.fromPool(t);case"Stableswap":return ot.fromPool(t);case"HSM":return Dt.fromPool(t);case"UniswapV3":return pt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var xe=require("@galacticcouncil/common"),te=require("rxjs");var Nt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var{logger:zc}=xe.log;var wt=class{getProposals(t,e,a){let s=a.filter(p=>p.type==="XYK"),i=a.filter(p=>p.type!=="XYK"),n=new Set(i.map(p=>p.tokens).flat().map(p=>p.id)),r=n.has(t),o=n.has(e),l=new yt,u=p=>{let y=Vt(p),T=Object.keys(y),D=T.flatMap(_=>y[_]);return l.buildAndPopulateGraph(T,D)};if(!r&&!o){let p=s.filter(D=>D.tokens.find(_=>_.id===t)||D.tokens.find(_=>_.id===e)),y=u(p),T=l.findPaths(y,t,e);return this.parsePaths(T)}if(r&&o){let p=u(i),y=l.findPaths(p,t,e);return this.parsePaths(y)}let m=r?e:t,h=s.filter(p=>p.tokens.some(y=>y.id===m));if(h.length===0)return[];let d=[...i,...h],S=u(d),g=l.findPaths(S,t,e);return this.parsePaths(g)}parsePaths(t){let e=[];for(let a of t){let s=[];for(let i=0;i<a.length;i++){let n=a[i],r=a[i+1];if(r==null)break;s.push(this.toEdge(n,r))}e.push(s)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var dt=class{routeSuggester;routeProposals;ctx;filter={};constructor(t){this.ctx=t,this.routeSuggester=new wt,this.routeProposals=new Map}async withFilter(t){this.filter=t||{},this.routeProposals.clear(),this.onFilterChanged()}onFilterChanged(){}buildRouteKey(t,e,a){return`${t}->${e}::${a.length}`}applyPoolFilter(t){let{useOnly:e=[],exclude:a=[]}=this.filter,s=new Set(e),i=new Set(a);return t.filter(n=>i.has(n.type)?!1:s.size>0?s.has(n.type):!0)}async getPools(){let t=await this.ctx.getPools();return this.applyPoolFilter(t)}async getRoutes(t,e){let a=await this.getPools();return this.validateInput(t,e,a),this.getPaths(t,e,a)}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(s=>s!==t).map(s=>this.getRoutes(s,t)))).filter(s=>s.length>0).map(([s])=>s[0].assetIn).sort()}validateInput(t,e,a){if(a.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let s=this.getAssets(a);if(!s.has(t))throw new Error(t+" is not supported asset");if(!s.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(a)}getAssets(t){let e=t.map(a=>a.tokens.map(s=>s.id)).flat().sort((a,s)=>a>s?1:-1);return new Set(e)}getPaths(t,e,a){let s=this.toPoolsMap(a);return this.getProposals(t,e,a).filter(n=>this.validPath(n,s)).map(n=>this.toHops(n,s))}getProposals(t,e,a){let s=this.buildRouteKey(t,e,a);if(this.routeProposals.has(s))return this.routeProposals.get(s);let i=this.routeSuggester.getProposals(t,e,a);return this.routeProposals.set(s,i),i}validPath(t,e){return t.length>0&&t.map(a=>this.validEdge(a,e)).reduce((a,s)=>a&&s)}validEdge([t,e,a],s){return s.get(t)?.validatePair(e,a)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,It.get(e)]))}toHops(t,e){return t.map(([a,s,i])=>{let n=e.get(a),r={poolAddress:a,poolId:n?.id,pool:n?.type,assetIn:s,assetOut:i};return n instanceof pt&&(r.fee=n.fee),r})}};var P=require("@galacticcouncil/common");var ee=(e=>(e.Buy="Buy",e.Sell="Sell",e))(ee||{}),ae=(a=>(a.Dca="Dca",a.TwapSell="TwapSell",a.TwapBuy="TwapBuy",a))(ae||{}),se=(a=>(a.OrderTooSmall="OrderTooSmall",a.OrderTooBig="OrderTooBig",a.OrderImpactTooBig="OrderImpactTooBig",a))(se||{});var{FeeUtils:Ae}=I,gt=class extends dt{mlr;constructor(t){super(t),this.mlr=new Map}onFilterChanged(){this.mlr.clear()}buildCtxSync(t,e,a){let s=super.validateInput(t,e,a),i=super.getPaths(t,e,a);if(!i.length)throw new Nt(t,e);return{paths:i,pools:a,poolsMap:s}}async withCtx(t,e,a){let s=await super.getPools(),i=this.buildCtxSync(t,e,s);return a(i)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((a,s)=>{let i=a[a.length-1].amountOut,n=s[s.length-1].amountOut;return i>n?-1:1});return e.find(a=>a.every(s=>s.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(a=>a.tradeFeeRange).length>0){let a=t.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,n)=>i+n),s=t.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,n)=>i+n);return[a,s]}}getPoolFeeRange(t,e){let a=t.min?Ae.toPct(t.min):void 0,s=t.max?Ae.toPct(t.max):void 0;if(a&&s)return[a,Math.max(s,e)]}async getBestSell(t,e,a){return this.getSell(t,e,a)}getSellSpot(t){let e=t[t.length-1];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getSell(t,e,a,s){return this.withCtx(t,e,async({paths:i,poolsMap:n})=>{let r;if(s)r=await this.toSellSwaps(a,s,n);else{let o=i.map(u=>this.toSellSwaps(a,u,n)),l=await Promise.all(o);r=this.findBestSellRoute(l)}return this.buildSell(n,r)})}async getSells(t,e,a){return this.withCtx(t,e,async({paths:s,poolsMap:i})=>{let n=s.map(o=>this.toSellSwaps(a,o,i));return(await Promise.all(n)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildSell(i,o)).sort((o,l)=>o.amountOut>l.amountOut?-1:1)})}buildSell(t,e){let a=e[0],s=e[e.length-1],i=this.isDirectTrade(e),n=this.getSellSpot(e),r=s.amountOut,o=i?s.calculatedOut:this.calculateDelta0Y(a.amountIn,e,t),l=o-r,u=this.getRouteFeeRange(e),m=i?s.tradeFeePct:B.calculateSellFee(o,r),h=q.mulSpot(a.amountIn,n,a.assetInDecimals,s.assetOutDecimals),d=B.calculateDiffToRef(o,h);return{type:"Sell",amountIn:a.amountIn,amountOut:s.amountOut,spotPrice:n,tradeFee:l,tradeFeePct:m,tradeFeeRange:u,priceImpactPct:d,swaps:e,toHuman(){return{type:"Sell",amountIn:P.big.toDecimal(a.amountIn,a.assetInDecimals),amountOut:P.big.toDecimal(s.amountOut,s.assetOutDecimals),spotPrice:P.big.toDecimal(n,P.RUNTIME_DECIMALS),tradeFee:P.big.toDecimal(l,s.assetOutDecimals),tradeFeePct:m,tradeFeeRange:u,priceImpactPct:d,swaps:e.map(S=>S.toHuman())}}}}calculateSpot(t){return t.map(e=>e.spotPrice).reduce((e,a)=>e*a/10n**BigInt(P.RUNTIME_DECIMALS))}calculateDelta0Y(t,e,a){let s=[];for(let i=0;i<e.length;i++){let n=e[i],r=a.get(n.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(n.assetIn,n.assetOut),l;i>0?l=s[i-1]:l=t;let u=r.calculateOutGivenIn(o,l);s.push(u)}return s[s.length-1]}async calculateMostLiquidRoute(t,e,a){let{paths:s,pools:i,poolsMap:n}=a,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,y)=>p+y)).sort((g,p)=>p<g?-1:1)[0],u=q.getFraction(l,.1),m=await Promise.all(s.map(g=>this.toSellSwaps(u,g,n))),d=this.findBestSellRoute(m).map(g=>({poolAddress:g.poolAddress,poolId:g?.poolId,pool:g.pool,assetIn:g.assetIn,assetOut:g.assetOut})),S=this.buildRouteKey(t,e,i);return this.mlr.set(S,d),d}async toSellSwaps(t,e,a){let s=[];for(let i=0;i<e.length;i++){let n=e[i],r=a.get(n.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(n.assetIn,n.assetOut),l;i>0?l=s[i-1].amountOut:l=typeof t=="string"?P.big.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(o,r),{amountOut:m,calculatedOut:h,feePct:d,errors:S}=r.validateAndSell(o,l,u),g=this.getPoolFeeRange(u,d),p=r.spotPriceOutGivenIn(o),y=q.mulSpot(l,p,o.decimalsIn,o.decimalsOut),T=B.calculateDiffToRef(h,y);s.push({...n,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:m,calculatedOut:h,spotPrice:p,tradeFeePct:d,tradeFeeRange:g,priceImpactPct:T,errors:S,isSupply(){return r.type==="Aave"&&r.tokens[0].id===n.assetIn},isWithdraw(){return r.type==="Aave"&&r.tokens[1].id===n.assetIn},toHuman(){return{...n,amountIn:P.big.toDecimal(l,o.decimalsIn),amountOut:P.big.toDecimal(m,o.decimalsOut),calculatedOut:P.big.toDecimal(h,o.decimalsOut),spotPrice:P.big.toDecimal(p,P.RUNTIME_DECIMALS),tradeFeePct:d,tradeFeeRange:g,priceImpactPct:T,errors:S}}})}return s}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async a=>{let s=this.buildRouteKey(t,e,a.pools),i=this.mlr.get(s);return i||this.calculateMostLiquidRoute(t,e,a)})}async getSpotPrice(t,e){return this.withCtx(t,e,async a=>{let{pools:s,poolsMap:i}=a,n=this.buildRouteKey(t,e,s),r=this.mlr.get(n);r||(r=await this.calculateMostLiquidRoute(t,e,a));let o=await this.toSellSwaps("1",r,i);return{amount:this.getSellSpot(o),decimals:P.RUNTIME_DECIMALS}}).catch(()=>{})}findBestBuyRoute(t){let e=t.sort((a,s)=>{let i=a[0].amountIn,n=s[0].amountIn;return i>n?1:-1});return e.find(a=>a.every(s=>s.errors.length==0))||e[0]}async getBestBuy(t,e,a){return this.getBuy(t,e,a)}getBuySpot(t){let e=t[0];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getBuy(t,e,a,s){return this.withCtx(t,e,async({paths:i,poolsMap:n})=>{let r;if(s)r=await this.toBuySwaps(a,s,n);else{let o=i.map(u=>this.toBuySwaps(a,u,n)),l=await Promise.all(o);r=this.findBestBuyRoute(l)}return this.buildBuy(n,r)})}async getBuys(t,e,a){return this.withCtx(t,e,async({paths:s,poolsMap:i})=>{let n=s.map(o=>this.toBuySwaps(a,o,i));return(await Promise.all(n)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildBuy(i,o)).sort((o,l)=>o.amountIn>l.amountIn?1:-1)})}buildBuy(t,e){let a=e[e.length-1],s=e[0],i=this.isDirectTrade(e),n=this.getBuySpot(e),r=s.amountIn,o=i?s.calculatedIn:this.calculateDelta0X(a.amountOut,e,t),l=r-o,u=this.getRouteFeeRange(e),m=i?s.tradeFeePct:B.calculateBuyFee(o,r),h=q.mulSpot(a.amountOut,n,a.assetOutDecimals,s.assetInDecimals),d;return o===0n?d=-100:d=B.calculateDiffToRef(h,o),{type:"Buy",amountOut:a.amountOut,amountIn:s.amountIn,spotPrice:n,tradeFee:l,tradeFeePct:m,tradeFeeRange:u,priceImpactPct:d,swaps:e,toHuman(){return{type:"Buy",amountOut:P.big.toDecimal(a.amountOut,a.assetOutDecimals),amountIn:P.big.toDecimal(s.amountIn,s.assetInDecimals),spotPrice:P.big.toDecimal(n,P.RUNTIME_DECIMALS),tradeFee:P.big.toDecimal(l,s.assetInDecimals),tradeFeePct:m,tradeFeeRange:u,priceImpactPct:d,swaps:e.map(S=>S.toHuman())}}}}calculateDelta0X(t,e,a){let s=[];for(let i=e.length-1;i>=0;i--){let n=e[i],r=a.get(n.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(n.assetIn,n.assetOut),l;i==e.length-1?l=t:l=s[0];let u=r.calculateInGivenOut(o,l);s.unshift(u)}return s[0]}async toBuySwaps(t,e,a){let s=[];for(let i=e.length-1;i>=0;i--){let n=e[i],r=a.get(n.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(n.assetIn,n.assetOut),l;i==e.length-1?l=typeof t=="string"?P.big.toBigInt(t,o.decimalsOut):t:l=s[0].amountIn;let u=await this.ctx.getPoolFees(o,r),{amountIn:m,calculatedIn:h,feePct:d,errors:S}=r.validateAndBuy(o,l,u),g=this.getPoolFeeRange(u,d),p=r.spotPriceInGivenOut(o),y=q.mulSpot(l,p,o.decimalsOut,o.decimalsIn),T;h===0n?T=-100:T=B.calculateDiffToRef(y,h),s.unshift({...n,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:m,calculatedIn:h,spotPrice:p,tradeFeePct:d,tradeFeeRange:g,priceImpactPct:T,errors:S,isSupply(){return r.type==="Aave"&&r.tokens[0].id===n.assetIn},isWithdraw(){return r.type==="Aave"&&r.tokens[1].id===n.assetIn},toHuman(){return{...n,amountOut:P.big.toDecimal(l,o.decimalsOut),amountIn:P.big.toDecimal(m,o.decimalsIn),calculatedIn:P.big.toDecimal(h,o.decimalsIn),spotPrice:P.big.toDecimal(p,P.RUNTIME_DECIMALS),tradeFeePct:d,tradeFeeRange:g,priceImpactPct:T,errors:S}}})}return s}};var O=require("@galacticcouncil/common");var Be=6e3,ie=1000000000000000n,vt=6,ne=-5,re=216e5,nm=3,Ee=.1,Re=6;var Ht=require("polkadot-api");var Y=class{static build(t){return t.map(({assetIn:e,assetOut:a,pool:s,poolId:i,fee:n})=>s==="Stableswap"?{pool:(0,Ht.Enum)("Stableswap",i),asset_in:e,asset_out:a}:s==="UniswapV3"?{pool:(0,Ht.Enum)("UniswapV3",n),asset_in:e,asset_out:a}:{pool:(0,Ht.Enum)(s),asset_in:e,asset_out:a})}};var Gt=class{schedulerOptions;router;constructor(t,e={}){this.router=new gt(t),this.router.withFilter({exclude:["HSM"]}),this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??ie})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,a,s,i){let n=await this.router.getBestSell(t,e,a),{amountIn:r,swaps:o,priceImpactPct:l}=n,u=o[0],m=o[o.length-1],{assetInDecimals:h}=u,{assetOutDecimals:d}=m,S=Math.abs(l),g=await this.getMinimumOrderBudget(t,h),p=this.getOptimalTradeCount(S),y=this.getMaximumTradeCount(r,g,s),T=i||Math.min(p,y),D=Math.round(s/T),_=r/BigInt(T),R=await this.router.getBestSell(t,e,_),G=r<g,L=[];G&&L.push("OrderTooSmall");let et=await this.getAssetOutEd(m),K=R.amountOut*BigInt(T),Fe=this.toBlockPeriod(D),ke=R.tradeFee*BigInt(T),Ce=Y.build(o),oe={assetIn:t,assetOut:e,assetOutEd:et,errors:L,maxTradeCount:y,tradeCount:T,tradeFee:ke,tradeImpactPct:R.priceImpactPct,tradePeriod:Fe,tradeRoute:Ce,type:"Dca"};return{...oe,amountIn:r,amountOut:K,tradeAmountIn:R.amountIn,tradeAmountOut:R.amountOut,toHuman(){return{...oe,amountIn:O.big.toDecimal(r,h),amountOut:O.big.toDecimal(K,d),assetOutEd:O.big.toDecimal(et,d),tradeAmountIn:O.big.toDecimal(R.amountIn,h),tradeAmountOut:O.big.toDecimal(R.amountOut,d)}}}}async getMinimumOrderBudget(t,e){if(0===t)return this.minOrderBudget;let a=await this.router.getSpotPrice(0,t);if(a)return q.mulSpot(this.minOrderBudget,a.amount,12,e);let s=await this.router.getSpotPrice(t,0);if(s)return q.divSpot(this.minOrderBudget,s.amount,12,e);throw new Error("Unable to calculate order budget")}getMaximumTradeCount(t,e,a){let s=e*2n/10n;if(s===0n)return 0;let i=Number(t/s),n=Math.floor(a/this.blockTime),r=Math.max(0,Math.floor(n*(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,a,s){let i=await this.router.getBestSell(t,e,a),{swaps:n}=i,r=n[0],o=n[n.length-1],{assetInDecimals:l}=r,{assetOutDecimals:u}=o,m=await this.getMinimumOrderBudget(t,l),h=i.amountIn<m,d=[];h&&d.push("OrderTooSmall");let S=await this.getAssetOutEd(o),g=this.toBlockPeriod(s),p=Y.build(n),y={assetIn:t,assetOut:e,assetOutEd:S,errors:d,maxTradeCount:0,tradeCount:0,tradeFee:i.tradeFee,tradeImpactPct:i.priceImpactPct,tradePeriod:g,tradeRoute:p,type:"Dca"};return{...y,amountIn:0n,amountOut:0n,tradeAmountIn:i.amountIn,tradeAmountOut:i.amountOut,toHuman(){return{...y,amountIn:"0",amountOut:"0",assetOutEd:O.big.toDecimal(S,u),tradeAmountIn:O.big.toDecimal(i.amountIn,l),tradeAmountOut:O.big.toDecimal(i.amountOut,u)}}}}async getTwapSellOrder(t,e,a){let s=await this.router.getBestSell(t,e,a),{amountIn:i,swaps:n,priceImpactPct:r}=s,o=n[0],l=n[n.length-1],{assetInDecimals:u}=o,{assetOutDecimals:m}=l,h=Math.abs(r),d=this.getTwapTradeCount(h),S=i/BigInt(d),[g,p]=await Promise.all([this.getMinimumOrderBudget(t,u),this.router.getBestSell(o.assetIn,l.assetOut,S)]),y=d===1,T=i<g,D=p.priceImpactPct<-5,_=[];T||y?_.push("OrderTooSmall"):D&&_.push("OrderImpactTooBig");let R=await this.getAssetOutEd(l),G=p.amountOut*BigInt(d),L=p.tradeFee*BigInt(d),et=Y.build(n),K={assetIn:t,assetOut:e,assetOutEd:R,errors:_,tradeCount:d,tradeImpactPct:p.priceImpactPct,tradePeriod:6,tradeRoute:et,type:"TwapSell"};return{...K,amountIn:i,amountOut:G,tradeAmountIn:p.amountIn,tradeAmountOut:p.amountOut,tradeFee:L,toHuman(){return{...K,amountIn:O.big.toDecimal(i,u),amountOut:O.big.toDecimal(G,m),assetOutEd:O.big.toDecimal(R,m),tradeAmountIn:O.big.toDecimal(p.amountIn,u),tradeAmountOut:O.big.toDecimal(p.amountOut,m),tradeFee:O.big.toDecimal(L,m)}}}}async getTwapBuyOrder(t,e,a){let s=await this.router.getBestBuy(t,e,a),{amountOut:i,swaps:n,priceImpactPct:r}=s,o=n[0],l=n[n.length-1],{assetInDecimals:u}=o,{assetOutDecimals:m}=l,h=Math.abs(r),d=this.getTwapTradeCount(h),S=i/BigInt(d),[g,p]=await Promise.all([this.getMinimumOrderBudget(t,u),this.router.getBestBuy(o.assetIn,l.assetOut,S)]),y=p.amountIn*BigInt(d),T=d===1,D=y<g,_=p.priceImpactPct<-5,R=[];D||T?R.push("OrderTooSmall"):_&&R.push("OrderImpactTooBig");let G=await this.getAssetOutEd(l),L=p.tradeFee*BigInt(d),et=Y.build(n),K={assetIn:t,assetOut:e,assetOutEd:G,errors:R,tradeCount:d,tradeImpactPct:p.priceImpactPct,tradePeriod:6,tradeRoute:et,type:"TwapBuy"};return{...K,amountIn:y,amountOut:i,tradeAmountIn:p.amountIn,tradeAmountOut:p.amountOut,tradeFee:L,toHuman(){return{...K,amountIn:O.big.toDecimal(y,u),amountOut:O.big.toDecimal(i,m),assetOutEd:O.big.toDecimal(G,m),tradeAmountIn:O.big.toDecimal(p.amountIn,u),tradeAmountOut:O.big.toDecimal(p.amountOut,m),tradeFee:O.big.toDecimal(L,u)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let s=216e5/(this.blockTime*6);return Math.round(s)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,a=Math.round(e);return Math.max(a,6)}async getAssetOutEd(t){let s=(await this.router.getPools()).find(i=>i.address===t.poolAddress)?.tokens.find(i=>i.id===t.assetOut);if(!s)throw new Error(`Asset ${t.assetOut} not found in pool ${t.poolAddress}`);return s.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});