@galacticcouncil/sdk-next 0.5.0 → 0.6.0-pr169-b59fd8b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var yn=Object.create;var Ut=Object.defineProperty;var hn=Object.getOwnPropertyDescriptor;var Pn=Object.getOwnPropertyNames;var fn=Object.getPrototypeOf,Tn=Object.prototype.hasOwnProperty;var Ne=(c,t)=>()=>(c&&(t=c(c=0)),t);var S=(c,t)=>{for(var e in t)Ut(c,e,{get:t[e],enumerable:!0})},Gt=(c,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Pn(t))!Tn.call(c,s)&&s!==e&&Ut(c,s,{get:()=>t[s],enumerable:!(n=hn(t,s))||n.enumerable});return c},at=(c,t,e)=>(Gt(c,t,"default"),e&&Gt(e,t,"default")),se=(c,t,e)=>(e=c!=null?yn(fn(c)):{},Gt(t||!c||!c.__esModule?Ut(e,"default",{value:c,enumerable:!0}):e,c)),xn=c=>Gt(Ut({},"__esModule",{value:!0}),c);var Tt={};var Ue=Ne(()=>{at(Tt,require("@polkadot-api/ws-provider/node"))});var xt={};var We=Ne(()=>{at(xt,require("@polkadot-api/ws-provider/web"))});var $n={};S($n,{aave:()=>fe,api:()=>re,big:()=>b,client:()=>Te,const:()=>de,createSdkContext:()=>zn,erc20:()=>tt,error:()=>Ie,evm:()=>ue,fmt:()=>h,h160:()=>wt,json:()=>Z,math:()=>A,pool:()=>Be,sor:()=>Ce,tx:()=>Le,xc:()=>he});module.exports=xn($n);var re={};S(re,{Papi:()=>M,getWs:()=>In});var Ge=require("@galacticcouncil/descriptors");function He(c){switch(c){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var M=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(Ge.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");He(n)&&console.log(t,...e)}};var Ve=require("polkadot-api"),Xe=require("polkadot-api/polkadot-sdk-compat"),In=async c=>{let t=typeof c=="string"?c.split(","):c,s=(typeof window>"u"?(await Promise.resolve().then(()=>(Ue(),Tt))).getWsProvider:(await Promise.resolve().then(()=>(We(),xt))).getWsProvider)(t);return(0,Ve.createClient)((0,Xe.withPolkadotSdkCompat)(s))};var fe={};S(fe,{AAVE_GAS_LIMIT:()=>oe,AAVE_LENDING_POOL_ADDRESS:()=>Xt,AAVE_POOL_ABI:()=>ae,AAVE_POOL_DATA_PROVIDER:()=>Vt,AAVE_POOL_DATA_PROVIDER_ABI:()=>Wt,AAVE_POOL_PROXY:()=>ie,AAVE_ROUNDING_THRESHOLD:()=>ps,AAVE_UINT_256_MAX:()=>wn,AaveClient:()=>It,AaveUtils:()=>et});var ae=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"to",type:"address"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"interestRateMode",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"address",name:"onBehalfOf",type:"address"}],name:"borrow",outputs:[],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getUserAccountData",outputs:[{internalType:"uint256",name:"totalCollateralBase",type:"uint256"},{internalType:"uint256",name:"totalDebtBase",type:"uint256"},{internalType:"uint256",name:"availableBorrowsBase",type:"uint256"},{internalType:"uint256",name:"currentLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"ltv",type:"uint256"},{internalType:"uint256",name:"healthFactor",type:"uint256"}],stateMutability:"view",type:"function"}];var Wt=[{inputs:[{internalType:"contract IEACAggregatorProxy",name:"_networkBaseTokenPriceInUsdProxyAggregator",type:"address"},{internalType:"contract IEACAggregatorProxy",name:"_marketReferenceCurrencyPriceInUsdProxyAggregator",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"ETH_CURRENCY_UNIT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MKR_ADDRESS",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_bytes32",type:"bytes32"}],name:"bytes32ToString",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"decimals",type:"uint256"},{internalType:"uint256",name:"baseLTVasCollateral",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationBonus",type:"uint256"},{internalType:"uint256",name:"reserveFactor",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabled",type:"bool"},{internalType:"bool",name:"borrowingEnabled",type:"bool"},{internalType:"bool",name:"stableBorrowRateEnabled",type:"bool"},{internalType:"bool",name:"isActive",type:"bool"},{internalType:"bool",name:"isFrozen",type:"bool"},{internalType:"uint128",name:"liquidityIndex",type:"uint128"},{internalType:"uint128",name:"variableBorrowIndex",type:"uint128"},{internalType:"uint128",name:"liquidityRate",type:"uint128"},{internalType:"uint128",name:"variableBorrowRate",type:"uint128"},{internalType:"uint128",name:"stableBorrowRate",type:"uint128"},{internalType:"uint40",name:"lastUpdateTimestamp",type:"uint40"},{internalType:"address",name:"aTokenAddress",type:"address"},{internalType:"address",name:"stableDebtTokenAddress",type:"address"},{internalType:"address",name:"variableDebtTokenAddress",type:"address"},{internalType:"address",name:"interestRateStrategyAddress",type:"address"},{internalType:"uint256",name:"availableLiquidity",type:"uint256"},{internalType:"uint256",name:"totalPrincipalStableDebt",type:"uint256"},{internalType:"uint256",name:"averageStableRate",type:"uint256"},{internalType:"uint256",name:"stableDebtLastUpdateTimestamp",type:"uint256"},{internalType:"uint256",name:"totalScaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"priceInMarketReferenceCurrency",type:"uint256"},{internalType:"address",name:"priceOracle",type:"address"},{internalType:"uint256",name:"variableRateSlope1",type:"uint256"},{internalType:"uint256",name:"variableRateSlope2",type:"uint256"},{internalType:"uint256",name:"stableRateSlope1",type:"uint256"},{internalType:"uint256",name:"stableRateSlope2",type:"uint256"},{internalType:"uint256",name:"baseStableBorrowRate",type:"uint256"},{internalType:"uint256",name:"baseVariableBorrowRate",type:"uint256"},{internalType:"uint256",name:"optimalUsageRatio",type:"uint256"},{internalType:"bool",name:"isPaused",type:"bool"},{internalType:"bool",name:"isSiloedBorrowing",type:"bool"},{internalType:"uint128",name:"accruedToTreasury",type:"uint128"},{internalType:"uint128",name:"unbacked",type:"uint128"},{internalType:"uint128",name:"isolationModeTotalDebt",type:"uint128"},{internalType:"bool",name:"flashLoanEnabled",type:"bool"},{internalType:"uint256",name:"debtCeiling",type:"uint256"},{internalType:"uint256",name:"debtCeilingDecimals",type:"uint256"},{internalType:"uint8",name:"eModeCategoryId",type:"uint8"},{internalType:"uint256",name:"borrowCap",type:"uint256"},{internalType:"uint256",name:"supplyCap",type:"uint256"},{internalType:"uint16",name:"eModeLtv",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationThreshold",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationBonus",type:"uint16"},{internalType:"address",name:"eModePriceSource",type:"address"},{internalType:"string",name:"eModeLabel",type:"string"},{internalType:"bool",name:"borrowableInIsolation",type:"bool"}],internalType:"struct IUiPoolDataProviderV3.AggregatedReserveData[]",name:"",type:"tuple[]"},{components:[{internalType:"uint256",name:"marketReferenceCurrencyUnit",type:"uint256"},{internalType:"int256",name:"marketReferenceCurrencyPriceInUsd",type:"int256"},{internalType:"int256",name:"networkBaseTokenPriceInUsd",type:"int256"},{internalType:"uint8",name:"networkBaseTokenPriceDecimals",type:"uint8"}],internalType:"struct IUiPoolDataProviderV3.BaseCurrencyInfo",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"},{internalType:"address",name:"user",type:"address"}],name:"getUserReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"uint256",name:"scaledATokenBalance",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabledOnUser",type:"bool"},{internalType:"uint256",name:"stableBorrowRate",type:"uint256"},{internalType:"uint256",name:"scaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"principalStableDebt",type:"uint256"},{internalType:"uint256",name:"stableBorrowLastUpdateTimestamp",type:"uint256"}],internalType:"struct IUiPoolDataProviderV3.UserReserveData[]",name:"",type:"tuple[]"},{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"marketReferenceCurrencyPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"networkBaseTokenPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"}];var ie="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Vt="0x112b087b60C1a166130d59266363C45F8aa99db0",Xt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",oe=1000000n,ps=5,wn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var ue={};S(ue,{EvmClient:()=>L,evmMainnet:()=>le});var Ke=require("viem"),Ye=["https://hydration-rpc.n.dwellir.com","https://hydration.dotters.network","https://rpc.helikon.io/hydradx","https://hydration.ibp.network","https://rpc.cay.hydration.cloud","https://rpc.parm.hydration.cloud","https://rpc.roach.hydration.cloud","https://rpc.zipp.hydration.cloud","https://rpc.sin.hydration.cloud","https://rpc.coke.hydration.cloud"],je=["wss://hydration-rpc.n.dwellir.com","wss://hydration.dotters.network","wss://rpc.helikon.io/hydradx","wss://hydration.ibp.network","wss://rpc.cay.hydration.cloud","wss://rpc.parm.hydration.cloud","wss://rpc.roach.hydration.cloud","wss://rpc.zipp.hydration.cloud","wss://rpc.sin.hydration.cloud","wss://rpc.coke.hydration.cloud"],le=(0,Ke.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{public:{http:Ye,webSocket:je},default:{http:Ye,webSocket:je}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});var G=require("viem");var L=class{chain;constructor(t){this.chain=t||le}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}async getGasPrice(){return this.getProvider().getGasPrice()}getProvider(){return(0,G.createPublicClient)({chain:this.chain,transport:(0,G.http)()})}getWsProvider(){return(0,G.createPublicClient)({chain:this.chain,transport:(0,G.webSocket)()})}getSigner(t){return(0,G.createWalletClient)({account:t,chain:this.chain,transport:(0,G.custom)(window.ethereum)})}};var It=class{evmClient;constructor(t){this.evmClient=t??new L}async getReservesData(){return await this.evmClient.getProvider().readContract({abi:Wt,address:Vt,args:[Xt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.evmClient.getProvider().readContract({abi:Wt,address:Vt,args:[Xt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.evmClient.getProvider().readContract({abi:ae,address:ie,args:[t],functionName:"getUserAccountData"})}};var b={};S(b,{asBigInt:()=>vn,toBigInt:()=>On,toDecimal:()=>Sn});var J=se(require("big.js"));J.default.NE=-18;function Sn(c,t,e=6,n){let s=(0,J.default)(c.toString()),r=(0,J.default)(10).pow(t);return s.div(r).round(e,n).toString()}function On(c,t){let e=(0,J.default)(10).pow(t),s=(0,J.default)(c).mul(e).toFixed(0,J.default.roundDown);return BigInt(s)}function vn(c){return BigInt(c.round(0,J.default.roundDown).toFixed(0))}var tt={};S(tt,{ERC20:()=>ce});var ce=class{static fromAssetId(t){let e=Buffer.alloc(20,0);return e[15]=1,e.writeUInt32BE(t,16),"0x"+e.toString("hex")}static toAssetId(t){let e=Buffer.from(t.replace("0x",""),"hex");return e.length!==20||!this.isAssetAddress(t)?null:e.readUInt32BE(16)}static isAssetAddress(t){let e=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(t.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(e.subarray(0,16))}};var h={};S(h,{fromPermill:()=>_n,toDecimals:()=>Bn,toPct:()=>An});var ze=1e3;function An(c){let[t,e]=c;return t/e*100}function Bn(c){let[t,e]=c;return t/e}function _n(c){return[c/ze,ze]}var wt={};S(wt,{H160:()=>ye,isEvmAccount:()=>$e,isEvmAddress:()=>Qe,isSs58Address:()=>Je});var ot=require("polkadot-api"),ge=require("@polkadot-api/utils"),z=require("buffer");var de={};S(de,{HUB_ASSET_ID:()=>pe,HYDRATION_OMNIPOOL_ADDRESS:()=>Fn,HYDRATION_PARACHAIN_ID:()=>Rn,HYDRATION_SS58_PREFIX:()=>W,RUNTIME_DECIMALS:()=>q,SYSTEM_ASSET_DECIMALS:()=>me,SYSTEM_ASSET_ID:()=>K,TRADEABLE_DEFAULT:()=>it});var q=18,K=0,me=12,Rn=2034,W=63,Fn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",pe=1,it=15;var be="ETH\0";function $e(c){if(!c)return!1;try{let t=(0,ot.AccountId)().enc(c),e=z.Buffer.from(be);return z.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Qe(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function Je(c){try{return(0,ot.AccountId)(63).enc(c),!0}catch{return!1}}var ye=class c{static toAccount=t=>{let e=z.Buffer.from(t.slice(2),"hex"),n=z.Buffer.from(be),s=Uint8Array.from(z.Buffer.concat([n,e,z.Buffer.alloc(8)])),r=(0,ge.toHex)(s);return(0,ot.AccountId)(63).dec(r)};static fromAccount=t=>{let e=(0,ot.AccountId)().enc(t),n=z.Buffer.from(be),s=e.slice(n.length,-8);return"0x"+z.Buffer.from(s).toString("hex")};static fromSS58=t=>{let n=(0,ot.AccountId)().enc(t).slice(0,20);return(0,ge.toHex)(n)};static fromAny=t=>{if(Qe(t))return t;if($e(t))return c.fromAccount(t);if(Je(t))return c.fromSS58(t);throw new Error("Unknown address type")}};var Z={};S(Z,{findNestedKey:()=>En,findNestedObj:()=>Dn,jsonFormatter:()=>kn});var En=(c,t)=>{let e=[];return JSON.stringify(c,(n,s)=>(s&&s[t]&&e.push(s),s)),e[0]},Dn=(c,t,e)=>{let n;return JSON.stringify(c,(s,r)=>(r&&r[t]===e&&(n=r),r)),n},kn=(c,t)=>typeof t=="bigint"?t.toString():t;var A={};S(A,{calculateBuyFee:()=>qn,calculateDiffToAvg:()=>Cn,calculateDiffToRef:()=>Mn,calculateSellFee:()=>Ln,getFraction:()=>Nn});var V=se(require("big.js"));function Cn(c,t){let e=(0,V.default)(c.toString()),n=(0,V.default)(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Mn(c,t){if(t===0n)return 0;let e=(0,V.default)(c.toString()),n=(0,V.default)(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Ln(c,t){let e=(0,V.default)(c.toString()),n=(0,V.default)(t.toString());return(0,V.default)(1).minus(n.div(e)).mul(100).round(2).toNumber()}function qn(c,t){let e=(0,V.default)(c.toString());return(0,V.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Nn(c,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),s=BigInt(t*n);return c*s/BigInt(100*n)}var he={};S(he,{convertToId:()=>Hn});var Ze=require("buffer");function Hn(c){let e=Ze.Buffer.from(c.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Yt}=tt,{H160:Pe}=wt,Gn=1.01,Un=99999,Wn=10n**27n,Vn=10n**18n,et=class{client;constructor(t){let e=t??new L;this.client=new It(e)}async getSummary(t){let e=Pe.fromAny(t),[n,s,r]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[i]=n,[a,o]=s,[l,u,d,m,p,g]=r,P=b.toDecimal(g,18),y=[];for(let I of a){let f=I.underlyingAsset.toLowerCase(),T=i.find(({underlyingAsset:ne})=>ne.toLowerCase()===f);if(!T)throw new Error("Missing pool reserve for "+f);let v=I.scaledATokenBalance,F=T.liquidityIndex,k=T.priceInMarketReferenceCurrency,C=v*F/Wn,Nt=Number(o===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,Ht=T.usageAsCollateralEnabled&&I.usageAsCollateralEnabledOnUser&&I.scaledATokenBalance>0n,ee=Yt.toAssetId(f);y.push({aTokenBalance:C,decimals:Number(T.decimals),isCollateral:Ht,priceInRef:k,reserveId:ee,reserveAsset:f,reserveLiquidationThreshold:Nt})}return{healthFactor:Number(P),totalCollateral:l,totalDebt:u,reserves:y}}async hasBorrowPositions(t){let e=Pe.fromAny(t),n=await this.client.getUserAccountData(e),[s,r]=n;return r>0n}async getHealthFactor(t){let e=Pe.fromAny(t),n=await this.client.getUserAccountData(e),[s,r,i,a,o,l]=n,u=b.toDecimal(l,18);return Number(u)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:s,totalDebt:r,reserves:i}=await this.getSummary(t),a=Yt.fromAssetId(e),o=i.find(y=>y.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,isCollateral:u,priceInRef:d,reserveLiquidationThreshold:m}=o,p=b.toBigInt(n,l),g=u?p*d/10n**BigInt(l):0n,P=s-g;return P<=0n?0:this.calculateHealthFactor(P,m,r)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:s,totalDebt:r,reserves:i}=await this.getSummary(t),a=Yt.fromAssetId(e),o=i.find(P=>P.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,priceInRef:u,reserveLiquidationThreshold:d}=o,p=b.toBigInt(n,l)*u/10n**BigInt(l),g=s+p;return g<=0n?0:this.calculateHealthFactor(g,d,r)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:s,reserves:r}=await this.getSummary(t),i=Yt.fromAssetId(e),a=r.find(o=>o.reserveAsset===i);if(!a)throw new Error("Missing reserve ctx for "+i);return this.calculateWithdrawMax(a,n,s)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:s}=await this.getSummary(t),r={};for(let i of s){let a=this.calculateWithdrawMax(i,e,n);i.reserveId&&(r[i.reserveId]=a)}return r}calculateHealthFactor(t,e,n){if(n===0n)return Un;let s=10n**6n,r=b.toBigInt(e,18),i=t*r*s,a=n*Vn,o=i/a;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let s=b.toBigInt(t,18),r=b.toBigInt(e,18);return(s*n+r-1n)/r}calculateWithdrawMax(t,e,n){let{aTokenBalance:s,decimals:r,priceInRef:i,reserveLiquidationThreshold:a}=t,o=this.calculateRequiredCollateral(Gn,a,n),l=e-o;if(l<=0n)return{amount:0n,decimals:r};let u=l*10n**BigInt(r)/i;return{amount:s<u?s:u,decimals:r}}};var Te={};S(Te,{AssetClient:()=>lt,BalanceClient:()=>X,ChainParams:()=>ut});var lt=class extends M{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(t){super(t)}async queryShares(){let e=await this.api.query.Stableswap.Pools.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[r]=n;return[r,s]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[r]=n;return[r,s]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:s}=n;return this.SUPPORTED_TYPES.includes(s.type)}).map(({keyArgs:n,value:s})=>{let[r]=n;return[r,s]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[r]=n;return[r,s]}))}async mapToken(t,e,n,s){let{name:r,asset_type:i,is_sufficient:a,existential_deposit:o}=e,{symbol:l,decimals:u}=n.get(t)??{};return{id:t,name:r?.asText(),symbol:l,decimals:u,icon:l,type:i.type,isSufficient:a,location:s,existentialDeposit:o}}async mapBond(t,e,n,s){let[r,i]=s,{asset_type:a,is_sufficient:o,existential_deposit:l}=e,{symbol:u,decimals:d}=await this.mapToken(r,e,n),m=Number(i),p=new Intl.DateTimeFormat("en-GB"),g=[u,"Bond",p.format(m)].join(" ");return{id:t,name:g,symbol:u+"b",decimals:d,icon:u,type:a.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:r,maturity:m}}async mapShares(t,e,n,s){let{assets:r}=s,{name:i,symbol:a,asset_type:o,is_sufficient:l,existential_deposit:u}=e,d=await Promise.all(r.map(async g=>{let{symbol:P}=await this.mapToken(g,e,n);return[g,P]})),m=Object.fromEntries(d),p=Object.values(m);return{id:t,name:p.join(", "),symbol:a?.asText()||i?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:m}}async mapExternal(t,e,n,s){let r=await this.mapToken(t,e,new Map,s),i=n?.find(a=>a.internalId===r.id);return i?{...r,decimals:i.decimals,name:i.name,symbol:i.symbol,icon:i.symbol,isWhiteListed:i.isWhiteListed}:r}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,s,r,i]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),a=this.parseMetadata(n),o=[];for(let[l,u]of Array.from(n)){let d=s.get(l),{asset_type:m}=u,p;switch(m.type){case"Bond":let g=i.get(l);p=await this.mapBond(l,u,a,g);break;case"StableSwap":let P=r.get(l);p=await this.mapShares(l,u,a,P);break;case"External":p=await this.mapExternal(l,u,e,d);break;default:p=await this.mapToken(l,u,a,d)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};var w=require("rxjs");var X=class extends M{constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getTokenBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:{free:n,frozen:s}}=await e.getValue(t);return n-s}async getTokenBalance(t,e){let n=this.api.query.Tokens.Accounts,{free:s,frozen:r}=await n.getValue(t,e);return s-r}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),s=this.subscribeErc20Balance(t);return(0,w.combineLatest)([e,n,s]).pipe((0,w.debounceTime)(250),(0,w.map)(r=>r.flat()),(0,w.startWith)([]),(0,w.bufferCount)(2,1),(0,w.map)(([r,i],a)=>{if(a===0)return i;let o=r.reduce((u,d)=>(u.set(d.id,d.amount),u),new Map);return i.filter(u=>u.amount!==o.get(u.id))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,w.map)(n=>{let{free:s,frozen:r}=n.data;return{id:0,amount:s-r}}))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,w.map)(s=>{let{free:r,frozen:i}=s;return{id:e,amount:r-i}}))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,w.distinctUntilChanged)((n,s)=>!s.deltas),(0,w.map)(({deltas:n})=>{let s=[];return n?.deleted.forEach(r=>{let[i,a]=r.args;s.push({id:a,amount:0n})}),n?.upserted.forEach(r=>{let[i,a]=r.args,{free:o,frozen:l}=r.value;s.push({id:a,amount:o-l})}),s}))}subscribeErc20Balance(t,e){let n=new w.Subject,s=n.pipe((0,w.shareReplay)(1)),r=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:u}=l;return u.type==="Erc20"}).map(({keyArgs:l})=>{let[u]=l;return u}),i=async()=>{let o=e||await r(),l=async()=>{let m=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,amount:g}));n.next(m)};await l();let u=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>u.unsubscribe()},a;return i().then(o=>a=o),s.pipe((0,w.finalize)(()=>a?.()),(0,w.pairwise)(),(0,w.map)(([o,l],u)=>{if(u===0)return l;let d=o.reduce((p,g)=>(p.set(g.id,g.amount),p),new Map);return l.filter(p=>p.amount!==d.get(p.id))}),(0,w.distinctUntilChanged)((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let{free:n,frozen:s}=await this.api.apis.CurrenciesApi.account(e,t);return n-s}};var ut=class extends M{_minOrderBudget;_blockTime;constructor(t){super(t)}async getBlockTime(){if(this._blockTime===void 0){let t=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(t)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};var Ie={};S(Ie,{AssetNotFound:()=>xe,PoolNotFound:()=>St,RouteNotFound:()=>ct});var xe=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},St=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},ct=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var Be={};S(Be,{PoolContextProvider:()=>gt,PoolError:()=>nt,PoolFactory:()=>dt,PoolType:()=>E,aave:()=>Ae,lbp:()=>we,omni:()=>Se,stable:()=>Oe,xyk:()=>ve});var we={};S(we,{LbpMath:()=>U,LbpPool:()=>Ot,LbpPoolClient:()=>vt});var Y=require("@galacticcouncil/math-lbp"),U=class{static getSpotPrice(t,e,n,s,r){return(0,Y.get_spot_price)(t,e,n,s,r)}static calculateInGivenOut(t,e,n,s,r){return(0,Y.calculate_in_given_out)(t,e,n,s,r)}static calculateOutGivenIn(t,e,n,s,r){return(0,Y.calculate_out_given_in)(t,e,n,s,r)}static calculateLinearWeights(t,e,n,s,r){return(0,Y.calculate_linear_weights)(t,e,n,s,r)}static calculatePoolTradeFee(t,e,n){return(0,Y.calculate_pool_trade_fee)(t,e,n)}};var E=(r=>(r.Aave="Aave",r.LBP="LBP",r.Omni="Omnipool",r.Stable="Stableswap",r.XYK="XYK",r))(E||{}),nt=(r=>(r.InsufficientTradingAmount="InsufficientTradingAmount",r.MaxInRatioExceeded="MaxInRatioExceeded",r.MaxOutRatioExceeded="MaxOutRatioExceeded",r.TradeNotAllowed="TradeNotAllowed",r.UnknownError="UnknownError",r))(nt||{});var Ot=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,s,r,i,a){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r,this.fee=i,this.repayFeeApply=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),r=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:r.balance,decimalsIn:s.decimals,decimalsOut:r.decimals,weightIn:s.weight,weightOut:r.weight}}validateAndBuy(t,e,n){let s=this.tokens[0].id,r=[];e<this.minTradingLimit&&r.push("InsufficientTradingAmount");let i=t.balanceOut/this.maxOutRatio;if(e>i&&r.push("MaxOutRatioExceeded"),s===t.assetOut){let a=this.calculateTradeFee(e,n),o=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+a,u=this.calculateInGivenOut(t,l),d=t.balanceIn/this.maxInRatio;return u>d&&r.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:r}}else{let a=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return a>o&&r.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:r}}}validateAndSell(t,e,n){let s=this.tokens[0].id,r=[];e<this.minTradingLimit&&r.push("InsufficientTradingAmount");let i=t.balanceIn/this.maxInRatio;if(e>i&&r.push("MaxInRatioExceeded"),s===t.assetIn){let a=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return a>o&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:r}}else{let a=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(a,n),l=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),u=a-o,d=t.balanceOut/this.maxOutRatio;return u>d&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:u,feePct:l,errors:r}}}calculateInGivenOut(t,e){let n=U.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}calculateOutGivenIn(t,e){let n=U.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}spotPriceInGivenOut(t){let e=U.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=U.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=U.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};var en=require("polkadot-api"),st=require("rxjs");var tn=(c,t=new Map)=>e=>{let n;return t.has(e)?t.get(e):(t.set(e,n=c(e)),n)};var O=require("rxjs");var N=class extends X{override=[];mem=0;memPools=tn(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t){super(t)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=(0,O.from)(this.getPoolsMem()).pipe((0,O.switchMap)(e=>this.subscribe(e)),(0,O.combineLatestAll)());return(0,O.firstValueFrom)(t)}getSubscriber(){return(0,O.from)(this.getPoolsMem()).pipe((0,O.switchMap)(t=>this.subscribe(t)),(0,O.mergeAll)())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>(0,O.combineLatest)([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe((0,O.debounceTime)(250),(0,O.map)(([n,s])=>this.updatePool(n,s))))}subscribePoolBalance(t){if(t.type==="Aave")return(0,O.of)([]);let e=[this.subscribeTokensBalance(t.address)];if(this.hasSystemAsset(t)){let n=this.subscribeSystemBalance(t.address);e.push(n)}if(this.hasErc20Asset(t)){let n=t.tokens.filter(r=>r.type==="Erc20").map(r=>r.id),s=this.subscribeErc20Balance(t.address,n);e.push(s)}return(0,O.combineLatest)(e).pipe((0,O.map)(n=>n.map(s=>Array.isArray(s)?s:[s]).flat()))}hasSystemAsset(t){return t.tokens.some(e=>e.id===0)}hasErc20Asset(t){return t.tokens.some(e=>e.type==="Erc20")}hasValidAssets(t){return t.tokens.every(({id:e,decimals:n,balance:s})=>{let r=this.override.find(a=>a.id===e),i=!!n||!!r?.decimals;return s>0n&&i})}updatePool=(t,e)=>{let n=t.tokens.map(s=>{let r=e.find(a=>a.id===s.id),i=this.override.find(a=>a.id===s.id);return r?{...s,balance:r.amount,decimals:s.decimals||i?.decimals}:{...s,decimals:s.decimals||i?.decimals}});return{...t,tokens:n}}};var vt=class extends N{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),s=e?.relay_parent_number||0,r=t.filter(({value:i})=>e&&this.isActivePool(i,s)).map(async({keyArgs:i,value:a})=>{let[o]=i,l=o.toString(),u=await this.getPoolDelta(l,a,s);return{address:l,type:"LBP",fee:a.fee,...u,...n}});return Promise.all(r)}async getPoolDelta(t,e,n){let{start:s,end:r,assets:i,initial_weight:a,final_weight:o,repay_target:l,fee_collector:u}=e,d=U.calculateLinearWeights(s?s.toString():"0",r?r.toString():"0",a.toString(),o.toString(),n.toString()),[m,p]=i,g=BigInt(d),P=this.MAX_FINAL_WEIGHT-BigInt(g),[y,I,f,T,v]=await Promise.all([this.isRepayFeeApplied(m,l,u.toString()),this.getBalance(t,m),this.api.query.AssetRegistry.Assets.getValue(m),this.getBalance(t,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:y,tokens:[{id:m,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:I,weight:g,type:f?.asset_type.type},{id:p,decimals:v?.decimals,existentialDeposit:v?.existential_deposit,balance:T,weight:P,type:v?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:s}=t;return n&&s?e>=n&&e<s:!1}async isRepayFeeApplied(t,e,n){if(e===0n)return!1;try{return await this.getBalance(n,t)<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t){return{repayFee:await this.getRepayFee(),exchangeFee:t.fee}}getPoolType(){return"LBP"}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(en.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe((0,st.switchMap)(s=>s?this.getPoolDelta(t.address,n,s.relay_parent_number):(0,st.of)(t)),(0,st.map)(s=>Object.assign({},t,s))):(0,st.of)(t)}};var Se={};S(Se,{OmniMath:()=>B,OmniPool:()=>At,OmniPoolClient:()=>_t});var x=require("@galacticcouncil/math-omnipool"),rt=se(require("big.js")),B=class{static calculateSpotPrice(t,e,n,s){return(0,x.calculate_spot_price)(t,e,n,s)}static calculateLrnaSpotPrice(t,e){return(0,x.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,s,r,i,a,o,l){return(0,x.calculate_in_given_out)(t,e,n,s,r,i,a,o,l)}static calculateLrnaInGivenOut(t,e,n,s,r){return(0,x.calculate_lrna_in_given_out)(t,e,n,s,r)}static calculateOutGivenIn(t,e,n,s,r,i,a,o,l){return(0,x.calculate_out_given_in)(t,e,n,s,r,i,a,o,l)}static calculateOutGivenLrnaIn(t,e,n,s,r){return(0,x.calculate_out_given_lrna_in)(t,e,n,s,r)}static calculateShares(t,e,n,s){return(0,x.calculate_shares)(t,e,n,s)}static calculateLiquidityOut(t,e,n,s,r,i,a,o){return(0,x.calculate_liquidity_out)(t,e,n,s,r,i,a,o)}static calculateLiquidityLRNAOut(t,e,n,s,r,i,a,o){return(0,x.calculate_liquidity_lrna_out)(t,e,n,s,r,i,a,o)}static calculateCapDifference(t,e,n,s){let r=(0,rt.default)(e),i=(0,rt.default)(t),a=(0,rt.default)(s),o=(0,rt.default)(n),l=(0,rt.default)(10).pow(18),u=o.div(l);if(r.div(a).lt(u)){let m=u.times(a).minus(r).times(i),p=r.times((0,rt.default)(1).minus(u));return m.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,s){return(0,x.verify_asset_cap)(t,e,n,s)}static calculateLimitHubIn(t,e,n,s){return(0,x.calculate_liquidity_hub_in)(t,e,n,s)}static isSellAllowed(t){return(0,x.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,x.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,x.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,x.is_remove_liquidity_allowed)(t)}};var At=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,s,r,i){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r,this.hubAssetId=i}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),r=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:s.hubReserves,hubReservesOut:r.hubReserves,sharesIn:s.shares,sharesOut:r.shares,decimalsIn:s.decimals,decimalsOut:r.decimals,balanceIn:s.balance,balanceOut:r.balance,tradeableIn:s.tradeable,tradeableOut:r.tradeable,assetInEd:s.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),r=this.calculateInGivenOut(t,e,n),i=s===0n?0:A.calculateDiffToRef(r,s),a=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&a.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&a.push("MaxOutRatioExceeded");let d=t.balanceIn/this.maxInRatio;return r>d&&a.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:s,amountOut:e,feePct:i,errors:a}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,n),i=A.calculateDiffToRef(s,r),a=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&a.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&a.push("MaxInRatioExceeded");let d=t.balanceOut/this.maxOutRatio;return r>d&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:r,feePct:i,errors:a}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let s=B.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0",n?h.toDecimals(n.protocolFee).toString():"0"),r=BigInt(s);return r<0n?0n:r}calculateLrnaInGivenOut(t,e,n){let s=B.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0"),r=BigInt(s);return r<0n?0n:r}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let s=B.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0",n?h.toDecimals(n.protocolFee).toString():"0"),r=BigInt(s);return r<0n?0n:r}calculateOutGivenLrnaIn(t,e,n){let s=B.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0"),r=BigInt(s);return r<0n?0n:r}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=B.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=B.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=B.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=B.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var jt=require("polkadot-api"),nn=require("@polkadot-api/utils"),Bt=require("rxjs");var _t=class extends N{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,s,r,i,a]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:u,value:d})=>{let[m]=u,{hub_reserve:p,shares:g,tradable:P,cap:y,protocol_shares:I}=d,[f,T]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(m),this.getBalance(e,m)]);return{id:m,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:T,cap:y,hubReserves:p,protocolShares:I,shares:g,tradeable:P,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:i,tradeable:s,type:r?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...a}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=(0,nn.toHex)(e);return(0,jt.AccountId)(63).dec(n)}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t,e){let[n,s,r]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),i=n.min_fee+s.min_fee,a=n.max_fee+s.max_fee;if(r){let{asset_fee:o,protocol_fee:l}=r;return{assetFee:h.fromPermill(o),protocolFee:h.fromPermill(l),min:h.fromPermill(i),max:h.fromPermill(a)}}else return{assetFee:h.fromPermill(n.min_fee),protocolFee:h.fromPermill(s.min_fee),min:h.fromPermill(i),max:h.fromPermill(a)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(jt.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,Bt.distinctUntilChanged)((n,s)=>!s.deltas),(0,Bt.map)(({entries:n})=>n.map(s=>{let[r]=s.args,{hub_reserve:i,shares:a,tradable:o,cap:l,protocol_shares:u}=s.value,d=t.tokens.findIndex(p=>p.id===r);return{...t.tokens[d],cap:l,hubReserves:i,protocolShares:u,shares:a,tradeable:o}})),(0,Bt.map)(n=>{let s=t.tokens.find(r=>r.id===1);return{...t,tokens:[...n,s]}}))}};var Oe={};S(Oe,{StableMath:()=>D,StableSwap:()=>Rt,StableSwapClient:()=>Ft});var _=require("@galacticcouncil/math-stableswap"),D=class{static getPoolAddress(t){return(0,_.pool_account_name)(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,s,r){return(0,_.calculate_amplification)(t,e,n,s,r)}static calculateInGivenOut(t,e,n,s,r,i,a){return(0,_.calculate_in_given_out)(t,e,n,s,r,i,a)}static calculateAddOneAsset(t,e,n,s,r,i,a){return(0,_.calculate_add_one_asset)(t,e,n,s,r,i,a)}static calculateSharesForAmount(t,e,n,s,r,i,a){return(0,_.calculate_shares_for_amount)(t,e,n,s,r,i,a)}static calculateOutGivenIn(t,e,n,s,r,i,a){return(0,_.calculate_out_given_in)(t,e,n,s,r,i,a)}static calculateLiquidityOutOneAsset(t,e,n,s,r,i,a){return(0,_.calculate_liquidity_out_one_asset)(t,e,n,s,r,i,a)}static calculateShares(t,e,n,s,r,i){return(0,_.calculate_shares)(t,e,n,s,r,i)}static calculateSpotPriceWithFee(t,e,n,s,r,i,a,o){return(0,_.calculate_spot_price_with_fee)(t,e,n,s,r,i,a,o)}static recalculatePegs(t,e,n,s,r){return(0,_.recalculate_peg)(t,e,n,s,r)}};var Rt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.id,t.fee,t.totalIssuance)}constructor(t,e,n,s,r,i,a,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r,this.amplification=i,this.id=a,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),r=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:r.balance,decimalsIn:s.decimals,decimalsOut:r.decimals,tradeableIn:this.id===t?15:s.tradeable,tradeableOut:this.id===e?15:r.tradeable,assetInEd:s.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),r=this.calculateInGivenOut(t,e,n),i=h.toPct(n.fee),a=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&a.push("InsufficientTradingAmount"),{amountIn:r,calculatedIn:s,amountOut:e,feePct:i,errors:a}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,n),i=h.toPct(n.fee),a=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&a.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:s,amountOut:r,feePct:i,errors:a}}calculateIn(t,e,n){let s=D.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateAddOneAsset(t,e,n){let s=D.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateSharesForAmount(t,e,n){let s=D.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=D.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let s=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(s)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let s=D.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateWithdrawOneAsset(t,e,n){let s=D.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateShares(t,e,n){let s=D.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=D.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let s=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(s)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=D.defaultPegs(this.tokens.length-1);return JSON.stringify(t)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:s})=>({asset_id:e,amount:n,decimals:s}));return JSON.stringify(t,Z.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],Z.jsonFormatter)}};var Kt=require("polkadot-api"),sn=require("@polkadot-api/utils"),rn=require("@noble/hashes/blake2b"),mt=require("rxjs");var Xn=340282366920938463463374607431768211455n,Ft=class extends N{poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),s=t.map(async({keyArgs:r,value:i})=>{let[a]=r,o=this.getPoolAddress(a),[l,u]=await Promise.all([this.getPoolDelta(a,i,e),this.getPoolTokens(a,i)]);return this.poolsData.set(o,i),{address:o,id:a,type:"Stableswap",fee:h.fromPermill(i.fee),tokens:u,...l,...n}});return Promise.all(s)}async getPoolDelta(t,e,n){let{initial_amplification:s,final_amplification:r,initial_block:i,final_block:a}=e,o=D.calculateAmplification(s.toString(),r.toString(),i.toString(),a.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),s=e.assets.map(async a=>{let[o,l,u]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,a),this.api.query.AssetRegistry.Assets.getValue(a),this.getBalance(n,a)]);return{id:a,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:u,tradeable:o,type:l?.asset_type.type}}),r=await Promise.all(s),i=await this.api.query.AssetRegistry.Assets.getValue(t);return r.push({id:t,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:Xn,tradeable:15,type:i?.asset_type.type}),r}getPoolAddress(t){let e=D.getPoolAddress(t),n=(0,rn.blake2b)(e,{dkLen:32}),s=(0,sn.toHex)(n);return(0,Kt.AccountId)(63).dec(s)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolFees(t){return{fee:t.fee}}getPoolType(){return"Stableswap"}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(Kt.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?(0,mt.of)(t):e.watchValue("best").pipe((0,mt.switchMap)(s=>this.getPoolDelta(t.id,n,s)),(0,mt.map)(s=>Object.assign({},t,s)))}};var ve={};S(ve,{XykMath:()=>$,XykPool:()=>Et,XykPoolClient:()=>Dt});var R=require("@galacticcouncil/math-xyk"),$=class{static getSpotPrice(t,e,n){return(0,R.get_spot_price)(t,e,n)}static calculateInGivenOut(t,e,n){return(0,R.calculate_in_given_out)(t,e,n)}static calculateOutGivenIn(t,e,n){return(0,R.calculate_out_given_in)(t,e,n)}static calculatePoolTradeFee(t,e,n){return(0,R.calculate_pool_trade_fee)(t,e,n)}static calculateLiquidityIn(t,e,n){return(0,R.calculate_liquidity_in)(t,e,n)}static calculateSpotPrice(t,e){return(0,R.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,n,s){return(0,R.calculate_spot_price_with_fee)(t,e,n,s)}static calculateShares(t,e,n){return(0,R.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,s){return(0,R.calculate_liquidity_out_asset_a)(t,e,n,s)}static calculateLiquidityOutAssetB(t,e,n,s){return(0,R.calculate_liquidity_out_asset_b)(t,e,n,s)}};var Et=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,s,r){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),r=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:s.decimals,decimalsOut:r.decimals,balanceIn:s.balance,balanceOut:r.balance,assetInEd:s.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),r=this.calculateTradeFee(s,n),i=h.toPct(n.exchangeFee),a=s+r,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 a>u&&o.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:s,amountOut:e,feePct:i,errors:o}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),r=this.calculateTradeFee(s,n),i=h.toPct(n.exchangeFee),a=s-r,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 a>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:a,feePct:i,errors:o}}calculateInGivenOut(t,e){let n=$.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}calculateOutGivenIn(t,e){let n=$.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}spotPriceInGivenOut(t){let e=$.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=$.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=$.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};var an=require("polkadot-api"),on=require("rxjs");var Dt=class extends N{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),s=e.map(async({keyArgs:r,value:i})=>{let[a]=r,[o,l]=i,[u,d,m,p]=await Promise.all([this.getBalance(a,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(a,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:a,type:"XYK",tokens:[{id:o,decimals:d?.decimals,existentialDeposit:d?.existential_deposit,balance:u,type:d?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:m,type:p?.asset_type.type}],...n}});return Promise.all(s)}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}getPoolType(){return"XYK"}async isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(an.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,on.of)(t)}};var Ae={};S(Ae,{AavePool:()=>kt,AavePoolClient:()=>Ct});var kt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,s,r){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),r=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:r.balance,decimalsIn:s.decimals,decimalsOut:r.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),r=[];return e>t.balanceOut&&r.push("TradeNotAllowed"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:r}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),r=[];return s>t.balanceOut&&r.push("TradeNotAllowed"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:r}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};var un=require("polkadot-api"),cn=require("@polkadot-api/utils"),pt=require("rxjs"),mn=require("viem");var ln=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:Yn}=tt,jn=["Supply","Withdraw","Repay","Borrow"],Ct=class extends N{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:s,liqudity_in:r,liqudity_out:i})=>{let[a,o,l,u]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(s),this.api.query.AssetRegistry.AssetLocations.getValue(s)]);return{address:this.getPoolId(n,s),type:"Aave",tokens:[{id:n,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:r,location:o,type:a?.asset_type.type},{id:s,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:i,location:u,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:s,liqudity_out:r}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(i=>{let a=i.id===e.id?s:r;return{...i,balance:a}})}getPoolId(t,e){let n=t+"/"+e,s=new TextEncoder().encode(n.padEnd(32,"\0")),r=(0,cn.toHex)(s);return(0,un.AccountId)(63).dec(r)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(t,e){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(t){let[e,n]=t.tokens,s=this.getReserveH160Id(e),r=this.api.event.Router.Executed.watch(({asset_in:a,asset_out:o})=>a===n.id||o===n.id),i=this.api.event.EVM.Log.watch(({log:a})=>{let{topics:o,data:l}=a,u=o.map(g=>g.asHex()),d=l.asHex(),{eventName:m,args:p}=(0,mn.decodeEventLog)({abi:ln,topics:u,data:d});return jn.includes(m)&&p.reserve.toLowerCase()===s.toLowerCase()});return(0,pt.merge)([r,i]).pipe((0,pt.switchMap)(()=>this.getPoolDelta(t)),(0,pt.map)(a=>({...t,tokens:[...a]})))}getReserveH160Id(t){return t.type==="Erc20"?Z.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Yn.fromAssetId(t.id)}};var dt=class{static get(t){switch(t.type){case"Aave":return kt.fromPool(t);case"XYK":return Et.fromPool(t);case"Omnipool":return At.fromPool(t);case"LBP":return Ot.fromPool(t);case"Stableswap":return Rt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var j=require("rxjs");var gt=class extends M{lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=j.Subscription.EMPTY;omniSub=j.Subscription.EMPTY;stableSub=j.Subscription.EMPTY;xykSub=j.Subscription.EMPTY;aaveSub=j.Subscription.EMPTY;isReady=!1;isDestroyed=new j.Subject;constructor(t){super(t),this.lbpClient=new vt(t),this.omniClient=new _t(t),this.stableClient=new Ft(t),this.xykClient=new Dt(t),this.aaveClient=new Ct(t),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe((0,j.takeUntil)(this.isDestroyed)).subscribe(e=>{this.pools.set(e.address,e)})}withOmnipool(){return this.omniSub.unsubscribe(),this.omniSub=this.subscribe(this.omniClient),this.active.add("Omnipool"),this}withStableswap(){return this.stableSub.unsubscribe(),this.stableSub=this.subscribe(this.stableClient),this.active.add("Stableswap"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbpClient),this.active.add("LBP"),this}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aaveClient),this.active.add("Aave"),this}withXyk(t){return this.xykClient.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xykClient),this.active.add("XYK"),this}destroy(){this.isDestroyed.next(!0),this.isDestroyed.complete(),this.active.clear(),this.pools.clear(),this.isReady=!1}async getPools(){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let t=await Promise.all(this.clients.filter(e=>this.active.has(e.getPoolType())).map(e=>e.getPools()));return this.isReady=!0,t.flat()}async getPoolFees(t,e){let n=this.clients.find(s=>s.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new St(t.type)}};var Ce={};S(Ce,{DEFAULT_BLOCK_TIME:()=>pn,DEFAULT_MIN_BUDGET:()=>Fe,ORDER_MIN_BLOCK_PERIOD:()=>dn,Router:()=>bt,TWAP_BLOCK_PERIOD:()=>qt,TWAP_MAX_DURATION:()=>De,TWAP_MAX_PRICE_IMPACT:()=>Ee,TWAP_TX_MULTIPLIER:()=>Eo,TradeOrderError:()=>Re,TradeOrderType:()=>Qt,TradeRouteBuilder:()=>H,TradeRouter:()=>yt,TradeScheduler:()=>ht,TradeType:()=>$t});var zt=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 Kn=5,Mt=class{isNotVisited(t,e){let n=!0;return e.forEach(s=>{(s[0]===t[0]||s[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let s=[],r=new zt,i=[];for(i.push([e,""]),r.enqueue(i);r.size()>0;){let a=r.dequeue();if(a==null||a.length>Kn)return s;let o=a[a.length-1];(n===null||o[0]===n)&&s.push(a),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,a)){let d=[...a];d.push(u),r.enqueue(d)}})}return s}buildAndPopulateGraph(t,e){let n=new Map;for(let s of t)n.set(parseInt(s),[]);for(let[s,r,i]of e)n.get(r)?.push([i,s]);return n}};function _e(c){let t={};for(let e of c){let n=e.tokens.length;for(let s=0;s<n;s++){t[e.tokens[s].id]||(t[e.tokens[s].id]=[]);for(let r=0;r<n;r++){if(s==r)continue;let i=[e.address,e.tokens[s].id,e.tokens[r].id];t[e.tokens[s].id].push(i)}}}return t}var Lt=class{getProposals(t,e,n){let s=_e(n),r=Object.keys(s),i=r.map(u=>s[u]).flat(),a=new Mt,o=a.buildAndPopulateGraph(r,i),l=a.findPaths(o,t,e);return this.parsePaths(l)}parsePaths(t){let e=[];for(let n of t){let s=[];for(let r=0;r<n.length;r++){let i=n[r],a=n[r+1];if(a==null)break;s.push(this.toEdge(i,a))}e.push(s)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var bt=class{routeSuggester;routerOptions;ctx;defaultRouterOptions={useOnly:[]};constructor(t,e){this.ctx=t,this.routeSuggester=new Lt,this.routerOptions={...this.defaultRouterOptions,...e}}async getPools(){let t=await this.ctx.getPools(),e=this.routerOptions.useOnly;return e.length===0?t:t.filter(n=>e.includes(n.type))}async getRoutes(t,e){let n=await this.getPools();return this.validateInput(t,e,n),this.getPaths(t,e,n)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}validateInput(t,e,n){if(n.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let s=this.getAssets(n);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(n)}getAssets(t){let e=t.map(n=>n.tokens.map(s=>s.id)).flat().sort((n,s)=>n>s?1:-1);return new Set(e)}getPaths(t,e,n){let s=this.toPoolsMap(n);return this.routeSuggester.getProposals(t,e,n).filter(i=>this.validPath(i,s)).map(i=>this.toHops(i,s))}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,s)=>n&&s)}validEdge([t,e,n],s){return s.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,dt.get(e)]))}toHops(t,e){return t.map(([n,s,r])=>{let i=e.get(n);return{poolAddress:n,poolId:i?.id,pool:i?.type,assetIn:s,assetOut:r}})}};var $t=(e=>(e.Buy="Buy",e.Sell="Sell",e))($t||{}),Qt=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(Qt||{}),Re=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Re||{});var yt=class extends bt{isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,s)=>{let r=n[n.length-1].amountOut,i=s[s.length-1].amountOut;return r>i?-1:1});return e.find(n=>n.every(s=>s.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(r=>r.tradeFeeRange?.[0]??r.tradeFeePct).reduce((r,i)=>r+i),s=t.map(r=>r.tradeFeeRange?.[1]??r.tradeFeePct).reduce((r,i)=>r+i);return[n,s]}}getPoolFeeRange(t){let e=t.min?h.toPct(t.min):void 0,n=t.max?h.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}async getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetOutDecimals).reduce((a,o)=>a+o),s=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),r=n-e.assetOutDecimals,i=Math.pow(10,r);return s/BigInt(i)}async getSell(t,e,n,s){let r=await super.getPools(),i=super.validateInput(t,e,r),a=super.getPaths(t,e,r);if(a.length===0)throw new ct(t,e);let o;if(s)o=await this.toSellSwaps(n,s,i);else{let F=await Promise.all(a.map(k=>this.toSellSwaps(n,k,i)));o=this.findBestSellRoute(F)}let l=o[0],u=o[o.length-1],d=this.isDirectTrade(o),m=await this.getSellSpot(o),p=u.amountOut,g=d?u.calculatedOut:this.calculateDelta0Y(l.amountIn,o,i),P=g-p,y=this.getRouteFeeRange(o),I=d?u.tradeFeePct:A.calculateSellFee(g,p),f=Math.pow(10,l.assetInDecimals),T=l.amountIn*m/BigInt(f),v=A.calculateDiffToRef(g,T);return{type:"Sell",amountIn:l.amountIn,amountOut:u.amountOut,spotPrice:m,tradeFee:P,tradeFeePct:I,tradeFeeRange:y,priceImpactPct:v,swaps:o,toHuman(){return{type:"Sell",amountIn:b.toDecimal(l.amountIn,l.assetInDecimals),amountOut:b.toDecimal(u.amountOut,u.assetOutDecimals),spotPrice:b.toDecimal(m,u.assetOutDecimals),tradeFee:b.toDecimal(P,u.assetOutDecimals),tradeFeePct:I,tradeFeeRange:y,priceImpactPct:v,swaps:o.map(F=>F.toHuman())}}}}calculateDelta0Y(t,e,n){let s=[];for(let r=0;r<e.length;r++){let i=e[r],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;r>0?l=s[r-1]:l=t;let u=a.calculateOutGivenIn(o,l);s.push(u)}return s[s.length-1]}async toSellSwaps(t,e,n){let s=[];for(let r=0;r<e.length;r++){let i=e[r],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;r>0?l=s[r-1].amountOut:l=typeof t=="string"?b.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(a,o.assetOut),{amountOut:d,calculatedOut:m,feePct:p,errors:g}=a.validateAndSell(o,l,u),P=this.getPoolFeeRange(u),y=a.spotPriceOutGivenIn(o),I=Math.pow(10,o.decimalsIn),f=l*y/BigInt(I),T=A.calculateDiffToRef(m,f);s.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:d,calculatedOut:m,spotPrice:y,tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===i.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===i.assetIn},toHuman(){return{...i,amountIn:b.toDecimal(l,o.decimalsIn),amountOut:b.toDecimal(d,o.decimalsOut),calculatedOut:b.toDecimal(m,o.decimalsOut),spotPrice:b.toDecimal(y,o.decimalsOut),tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g}}})}return s}async getMostLiquidRoute(t,e){let n=await super.getPools(),s=super.validateInput(t,e,n),r=super.getPaths(t,e,n),o=n.filter(m=>m.tokens.some(p=>p.id===t&&p.id!==m.id)).map(m=>m.type==="Aave"?m.tokens:m.tokens.filter(p=>p.id===t)).map(m=>m.map(p=>p.balance).reduce((p,g)=>p+g)).sort((m,p)=>p<m?-1:1)[0],l=A.getFraction(o,.1),u=await Promise.all(r.map(m=>this.toSellSwaps(l,m,s)));return this.findBestSellRoute(u).map(m=>({poolAddress:m.poolAddress,poolId:m?.poolId,pool:m.pool,assetIn:m.assetIn,assetOut:m.assetOut}))}async getSpotPrice(t,e){let n=await super.getPools(),s=super.validateInput(t,e,n),r=await this.getMostLiquidRoute(t,e),i=await this.toSellSwaps("1",r,s),a=await this.getSellSpot(i),o=i[i.length-1].assetOutDecimals;return{amount:a,decimals:o}}findBestBuyRoute(t){let e=t.sort((n,s)=>{let r=n[0].amountIn,i=s[0].amountIn;return r>i?1:-1});return e.find(n=>n.every(s=>s.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}async getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetInDecimals).reduce((a,o)=>a+o),s=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),r=n-e.assetInDecimals,i=Math.pow(10,r);return s/BigInt(i)}async getBuy(t,e,n,s){let r=await super.getPools(),i=super.validateInput(t,e,r),a=super.getPaths(t,e,r);if(a.length===0)throw new ct(t,e);let o;if(s)o=await this.toBuySwaps(n,s,i);else{let F=await Promise.all(a.map(k=>this.toBuySwaps(n,k,i)));o=this.findBestBuyRoute(F)}let l=o[o.length-1],u=o[0],d=this.isDirectTrade(o),m=await this.getBuySpot(o),p=u.amountIn,g=d?u.calculatedIn:this.calculateDelta0X(l.amountOut,o,i),P=p-g,y=this.getRouteFeeRange(o),I=d?u.tradeFeePct:A.calculateBuyFee(g,p),f=Math.pow(10,l.assetOutDecimals),T=l.amountOut*m/BigInt(f),v;return g===0n?v=-100:v=A.calculateDiffToRef(T,g),{type:"Buy",amountOut:l.amountOut,amountIn:u.amountIn,spotPrice:m,tradeFee:P,tradeFeePct:I,tradeFeeRange:y,priceImpactPct:v,swaps:o,toHuman(){return{type:"Buy",amountOut:b.toDecimal(l.amountOut,l.assetOutDecimals),amountIn:b.toDecimal(u.amountIn,u.assetInDecimals),spotPrice:b.toDecimal(m,u.assetInDecimals),tradeFee:b.toDecimal(P,u.assetInDecimals),tradeFeePct:I,tradeFeeRange:y,priceImpactPct:v,swaps:o.map(F=>F.toHuman())}}}}calculateDelta0X(t,e,n){let s=[];for(let r=e.length-1;r>=0;r--){let i=e[r],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;r==e.length-1?l=t:l=s[0];let u=a.calculateInGivenOut(o,l);s.unshift(u)}return s[0]}async toBuySwaps(t,e,n){let s=[];for(let r=e.length-1;r>=0;r--){let i=e[r],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;r==e.length-1?l=typeof t=="string"?b.toBigInt(t,o.decimalsOut):t:l=s[0].amountIn;let u=await this.ctx.getPoolFees(a,o.assetOut),{amountIn:d,calculatedIn:m,feePct:p,errors:g}=a.validateAndBuy(o,l,u),P=this.getPoolFeeRange(u),y=a.spotPriceInGivenOut(o),I=Math.pow(10,o.decimalsOut),f=l*y/BigInt(I),T;m===0n?T=-100:T=A.calculateDiffToRef(f,m),s.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:d,calculatedIn:m,spotPrice:y,tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===i.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===i.assetIn},toHuman(){return{...i,amountOut:b.toDecimal(l,o.decimalsOut),amountIn:b.toDecimal(d,o.decimalsIn),calculatedIn:b.toDecimal(m,o.decimalsIn),spotPrice:b.toDecimal(y,o.decimalsIn),tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g}}})}return s}};var pn=6e3,Fe=1000000000000000n,qt=6,Ee=-5,De=216e5,Eo=3,dn=6;var ke=require("polkadot-api");var H=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:s,poolId:r})=>s==="Stableswap"?{pool:(0,ke.Enum)("Stableswap",r),asset_in:e,asset_out:n}:{pool:(0,ke.Enum)(s),asset_in:e,asset_out:n})}};var ht=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Fe})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,s,r){let[i,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:u}=a,d=l[0],m=l[l.length-1],{assetInDecimals:p}=d,{assetOutDecimals:g}=m,P=Math.abs(u),y=this.getMinimumTradeCount(o,i),I=this.getOptimalTradeCount(P),f=r?Math.round(s/r):I,T=Math.ceil(s/y),v=Math.round(s/I),F=Math.round(s/f),k=o/BigInt(f),C=await this.router.getBestSell(t,e,k),Q=o<i,Nt=[];Q&&Nt.push("OrderTooSmall");let Ht=C.amountOut*BigInt(f),ee=this.toBlockPeriod(F),ne=C.tradeFee*BigInt(f),bn=H.build(l),qe={assetIn:t,assetOut:e,errors:Nt,frequencyMin:T,frequencyOpt:v,frequency:F,tradeCount:f,tradeFee:ne,tradeImpactPct:C.priceImpactPct,tradePeriod:ee,tradeRoute:bn,type:"Dca"};return{...qe,amountIn:o,amountOut:Ht,tradeAmountIn:C.amountIn,tradeAmountOut:C.amountOut,toHuman(){return{...qe,amountIn:b.toDecimal(o,p),amountOut:b.toDecimal(Ht,g),tradeAmountIn:b.toDecimal(C.amountIn,p),tradeAmountOut:b.toDecimal(C.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),n=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let s=t+n/2n;return Number(s/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[s,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:i,swaps:a,priceImpactPct:o}=r,l=a[0],u=a[a.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),P=i/BigInt(g),y=await this.router.getBestSell(l.assetIn,u.assetOut,P),I=g===1,f=i<s,T=y.priceImpactPct<-5,v=[];f||I?v.push("OrderTooSmall"):T&&v.push("OrderImpactTooBig");let F=y.amountOut*BigInt(g),k=y.tradeFee*BigInt(g),C=H.build(a),Q={assetIn:t,assetOut:e,errors:v,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:C,type:"TwapSell"};return{...Q,amountIn:i,amountOut:F,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:k,toHuman(){return{...Q,amountIn:b.toDecimal(i,d),amountOut:b.toDecimal(F,m),tradeAmountIn:b.toDecimal(y.amountIn,d),tradeAmountOut:b.toDecimal(y.amountOut,m),tradeFee:b.toDecimal(k,m)}}}}async getTwapBuyOrder(t,e,n){let[s,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:i,swaps:a,priceImpactPct:o}=r,l=a[0],u=a[a.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),P=i/BigInt(g),y=await this.router.getBestBuy(l.assetIn,u.assetOut,P),I=y.amountIn*BigInt(g),f=g===1,T=I<s,v=y.priceImpactPct<-5,F=[];T||f?F.push("OrderTooSmall"):v&&F.push("OrderImpactTooBig");let k=y.tradeFee*BigInt(g),C=H.build(a),Q={assetIn:t,assetOut:e,errors:F,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:C,type:"TwapBuy"};return{...Q,amountIn:I,amountOut:i,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:k,toHuman(){return{...Q,amountIn:b.toDecimal(I,d),amountOut:b.toDecimal(i,m),tradeAmountIn:b.toDecimal(y.amountIn,d),tradeAmountOut:b.toDecimal(y.amountOut,m),tradeFee:b.toDecimal(k,d)}}}}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,n=Math.round(e);return Math.max(n,6)}};var Le={};S(Le,{TxBuilderFactory:()=>ft});var Me=require("polkadot-api");function gn(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var Pt=class extends M{evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evmClient=e??new L,this.balanceClient=new X(t),this.aaveUtils=new et(this.evmClient)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:n=>this.dryRun(n,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:oe})}async dryRun(t,e){let n=(0,Me.Enum)("Signed",t),s=(0,Me.Enum)("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(s,e.decodedCall),a=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(a){let o=gn(a.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var Jt=class extends Pt{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:s}=e[0],r=await this.balanceClient.getBalance(this.beneficiary,s);return t>=r-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],r=n[n.length-1],i=A.getFraction(t,this.slippagePct),a=s.assetIn,o=r.assetOut,l=t+i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.buy({asset_in:a,asset_out:o,amount:e,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:a,asset_out:o,amount_out:e,max_amount_in:l,route:H.build(n)}),this.wrapTx("RouterBuy",u)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],r=n[n.length-1],i=A.getFraction(e,this.slippagePct),a=s.assetIn,o=r.assetOut,l=e-i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.sell({asset_in:a,asset_out:o,amount:t,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:a,asset_out:o,amount_in:t,min_amount_out:l,route:H.build(n)}),s.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("RouterSell",u)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],s=e[e.length-1],r=A.getFraction(t,this.slippagePct),i=n.assetIn,a=s.assetOut,o=t-r,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:a,min_amount_out:o,route:H.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var Zt=require("polkadot-api");var te=class extends Pt{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradePeriod:r,tradeRoute:i}=this.order,a=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:r,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Zt.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:0n,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",a)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:r,tradePeriod:i,tradeRoute:a}=this.order,o=A.getFraction(r,this.slippagePct),l=r-o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Zt.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",u)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:r,tradePeriod:i,tradeRoute:a}=this.order,o=A.getFraction(s,this.slippagePct),l=s+o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Zt.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:r,max_amount_in:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",u)}};var ft=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e??new L}trade(t){return new Jt(this.client,this.evmClient).setTrade(t)}order(t){return new te(this.client,this.evmClient).setOrder(t)}};async function zn(c,t){let e=new ut(c),[n,s]=await Promise.all([e.getBlockTime(),e.getMinOrderBudget()]),r=t??new L,i=new gt(c).withAave().withOmnipool().withStableswap().withXyk(),a=new et(r),o=new yt(i),l=new ht(o,{blockTime:n,minBudgetInNative:s});return{api:{aave:a,router:o,scheduler:l},client:{asset:new lt(c),balance:new X(c),evm:r},ctx:{pool:i},tx:new ft(c,r),destroy:()=>{i.destroy()}}}0&&(module.exports={aave,api,big,client,const:null,createSdkContext,erc20,error,evm,fmt,h160,json,math,pool,sor,tx,xc});
|
|
1
|
+
"use strict";var _n=Object.create;var Kt=Object.defineProperty;var Rn=Object.getOwnPropertyDescriptor;var Fn=Object.getOwnPropertyNames;var En=Object.getPrototypeOf,Dn=Object.prototype.hasOwnProperty;var je=(c,t)=>()=>(c&&(t=c(c=0)),t);var O=(c,t)=>{for(var e in t)Kt(c,e,{get:t[e],enumerable:!0})},zt=(c,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Fn(t))!Dn.call(c,r)&&r!==e&&Kt(c,r,{get:()=>t[r],enumerable:!(n=Rn(t,r))||n.enumerable});return c},ut=(c,t,e)=>(zt(c,t,"default"),e&&zt(e,t,"default")),At=(c,t,e)=>(e=c!=null?_n(En(c)):{},zt(t||!c||!c.__esModule?Kt(e,"default",{value:c,enumerable:!0}):e,c)),Cn=c=>zt(Kt({},"__esModule",{value:!0}),c);var Bt={};var Qe=je(()=>{ut(Bt,require("@polkadot-api/ws-provider/node"))});var _t={};var $e=je(()=>{ut(_t,require("@polkadot-api/ws-provider/web"))});var mr={};O(mr,{aave:()=>ve,api:()=>ce,big:()=>y,client:()=>Ae,const:()=>fe,createSdkContext:()=>cr,erc20:()=>st,error:()=>_e,evm:()=>be,fmt:()=>h,h160:()=>Et,json:()=>nt,math:()=>B,pool:()=>ke,sor:()=>Ue,tx:()=>Ve,xc:()=>we});module.exports=Cn(mr);var ce={};O(ce,{Papi:()=>q,getWs:()=>kn});var Ke=require("@galacticcouncil/descriptors");function ze(c){switch(c){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var q=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(Ke.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");ze(n)&&console.log(t,...e)}};var Je=require("polkadot-api"),Ze=require("polkadot-api/polkadot-sdk-compat"),kn=async c=>{let t=typeof c=="string"?c.split(","):c,r=(typeof window>"u"?(await Promise.resolve().then(()=>(Qe(),Bt))).getWsProvider:(await Promise.resolve().then(()=>($e(),_t))).getWsProvider)(t);return(0,Je.createClient)((0,Ze.withPolkadotSdkCompat)(r))};var ve={};O(ve,{AAVE_GAS_LIMIT:()=>de,AAVE_LENDING_POOL_ADDRESS:()=>Jt,AAVE_POOL_ABI:()=>me,AAVE_POOL_DATA_PROVIDER:()=>$t,AAVE_POOL_DATA_PROVIDER_ABI:()=>Qt,AAVE_POOL_PROXY:()=>pe,AAVE_ROUNDING_THRESHOLD:()=>Ar,AAVE_UINT_256_MAX:()=>Mn,AaveClient:()=>Rt,AaveUtils:()=>it});var me=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"to",type:"address"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"interestRateMode",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"address",name:"onBehalfOf",type:"address"}],name:"borrow",outputs:[],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getUserAccountData",outputs:[{internalType:"uint256",name:"totalCollateralBase",type:"uint256"},{internalType:"uint256",name:"totalDebtBase",type:"uint256"},{internalType:"uint256",name:"availableBorrowsBase",type:"uint256"},{internalType:"uint256",name:"currentLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"ltv",type:"uint256"},{internalType:"uint256",name:"healthFactor",type:"uint256"}],stateMutability:"view",type:"function"}];var Qt=[{inputs:[{internalType:"contract IEACAggregatorProxy",name:"_networkBaseTokenPriceInUsdProxyAggregator",type:"address"},{internalType:"contract IEACAggregatorProxy",name:"_marketReferenceCurrencyPriceInUsdProxyAggregator",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"ETH_CURRENCY_UNIT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MKR_ADDRESS",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_bytes32",type:"bytes32"}],name:"bytes32ToString",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"decimals",type:"uint256"},{internalType:"uint256",name:"baseLTVasCollateral",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationBonus",type:"uint256"},{internalType:"uint256",name:"reserveFactor",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabled",type:"bool"},{internalType:"bool",name:"borrowingEnabled",type:"bool"},{internalType:"bool",name:"stableBorrowRateEnabled",type:"bool"},{internalType:"bool",name:"isActive",type:"bool"},{internalType:"bool",name:"isFrozen",type:"bool"},{internalType:"uint128",name:"liquidityIndex",type:"uint128"},{internalType:"uint128",name:"variableBorrowIndex",type:"uint128"},{internalType:"uint128",name:"liquidityRate",type:"uint128"},{internalType:"uint128",name:"variableBorrowRate",type:"uint128"},{internalType:"uint128",name:"stableBorrowRate",type:"uint128"},{internalType:"uint40",name:"lastUpdateTimestamp",type:"uint40"},{internalType:"address",name:"aTokenAddress",type:"address"},{internalType:"address",name:"stableDebtTokenAddress",type:"address"},{internalType:"address",name:"variableDebtTokenAddress",type:"address"},{internalType:"address",name:"interestRateStrategyAddress",type:"address"},{internalType:"uint256",name:"availableLiquidity",type:"uint256"},{internalType:"uint256",name:"totalPrincipalStableDebt",type:"uint256"},{internalType:"uint256",name:"averageStableRate",type:"uint256"},{internalType:"uint256",name:"stableDebtLastUpdateTimestamp",type:"uint256"},{internalType:"uint256",name:"totalScaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"priceInMarketReferenceCurrency",type:"uint256"},{internalType:"address",name:"priceOracle",type:"address"},{internalType:"uint256",name:"variableRateSlope1",type:"uint256"},{internalType:"uint256",name:"variableRateSlope2",type:"uint256"},{internalType:"uint256",name:"stableRateSlope1",type:"uint256"},{internalType:"uint256",name:"stableRateSlope2",type:"uint256"},{internalType:"uint256",name:"baseStableBorrowRate",type:"uint256"},{internalType:"uint256",name:"baseVariableBorrowRate",type:"uint256"},{internalType:"uint256",name:"optimalUsageRatio",type:"uint256"},{internalType:"bool",name:"isPaused",type:"bool"},{internalType:"bool",name:"isSiloedBorrowing",type:"bool"},{internalType:"uint128",name:"accruedToTreasury",type:"uint128"},{internalType:"uint128",name:"unbacked",type:"uint128"},{internalType:"uint128",name:"isolationModeTotalDebt",type:"uint128"},{internalType:"bool",name:"flashLoanEnabled",type:"bool"},{internalType:"uint256",name:"debtCeiling",type:"uint256"},{internalType:"uint256",name:"debtCeilingDecimals",type:"uint256"},{internalType:"uint8",name:"eModeCategoryId",type:"uint8"},{internalType:"uint256",name:"borrowCap",type:"uint256"},{internalType:"uint256",name:"supplyCap",type:"uint256"},{internalType:"uint16",name:"eModeLtv",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationThreshold",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationBonus",type:"uint16"},{internalType:"address",name:"eModePriceSource",type:"address"},{internalType:"string",name:"eModeLabel",type:"string"},{internalType:"bool",name:"borrowableInIsolation",type:"bool"}],internalType:"struct IUiPoolDataProviderV3.AggregatedReserveData[]",name:"",type:"tuple[]"},{components:[{internalType:"uint256",name:"marketReferenceCurrencyUnit",type:"uint256"},{internalType:"int256",name:"marketReferenceCurrencyPriceInUsd",type:"int256"},{internalType:"int256",name:"networkBaseTokenPriceInUsd",type:"int256"},{internalType:"uint8",name:"networkBaseTokenPriceDecimals",type:"uint8"}],internalType:"struct IUiPoolDataProviderV3.BaseCurrencyInfo",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"},{internalType:"address",name:"user",type:"address"}],name:"getUserReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"uint256",name:"scaledATokenBalance",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabledOnUser",type:"bool"},{internalType:"uint256",name:"stableBorrowRate",type:"uint256"},{internalType:"uint256",name:"scaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"principalStableDebt",type:"uint256"},{internalType:"uint256",name:"stableBorrowLastUpdateTimestamp",type:"uint256"}],internalType:"struct IUiPoolDataProviderV3.UserReserveData[]",name:"",type:"tuple[]"},{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"marketReferenceCurrencyPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"networkBaseTokenPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"}];var pe="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",$t="0x112b087b60C1a166130d59266363C45F8aa99db0",Jt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",de=1000000n,Ar=5,Mn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var be={};O(be,{EvmClient:()=>N,evmMainnet:()=>ge});var nn=require("viem"),tn=["https://hydration-rpc.n.dwellir.com","https://hydration.dotters.network","https://rpc.helikon.io/hydradx","https://hydration.ibp.network","https://rpc.cay.hydration.cloud","https://rpc.parm.hydration.cloud","https://rpc.roach.hydration.cloud","https://rpc.zipp.hydration.cloud","https://rpc.sin.hydration.cloud","https://rpc.coke.hydration.cloud"],en=["wss://hydration-rpc.n.dwellir.com","wss://hydration.dotters.network","wss://rpc.helikon.io/hydradx","wss://hydration.ibp.network","wss://rpc.cay.hydration.cloud","wss://rpc.parm.hydration.cloud","wss://rpc.roach.hydration.cloud","wss://rpc.zipp.hydration.cloud","wss://rpc.sin.hydration.cloud","wss://rpc.coke.hydration.cloud"],ge=(0,nn.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{public:{http:tn,webSocket:en},default:{http:tn,webSocket:en}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});var X=require("viem");var N=class{chain;constructor(t){this.chain=t||ge}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}async getGasPrice(){return this.getProvider().getGasPrice()}getProvider(){return(0,X.createPublicClient)({chain:this.chain,transport:(0,X.http)()})}getWsProvider(){return(0,X.createPublicClient)({chain:this.chain,transport:(0,X.webSocket)()})}getSigner(t){return(0,X.createWalletClient)({account:t,chain:this.chain,transport:(0,X.custom)(window.ethereum)})}};var Rt=class{evmClient;constructor(t){this.evmClient=t??new N}async getReservesData(){return await this.evmClient.getProvider().readContract({abi:Qt,address:$t,args:[Jt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.evmClient.getProvider().readContract({abi:Qt,address:$t,args:[Jt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.evmClient.getProvider().readContract({abi:me,address:pe,args:[t],functionName:"getUserAccountData"})}};var y={};O(y,{asBigInt:()=>Nn,toBigInt:()=>qn,toDecimal:()=>Ln});var et=At(require("big.js"));et.default.NE=-18;function Ln(c,t,e=6,n){let r=(0,et.default)(c.toString()),s=(0,et.default)(10).pow(t);return r.div(s).round(e,n).toString()}function qn(c,t){let e=(0,et.default)(10).pow(t),r=(0,et.default)(c).mul(e).toFixed(0,et.default.roundDown);return BigInt(r)}function Nn(c){return BigInt(c.round(0,et.default.roundDown).toFixed(0))}var st={};O(st,{ERC20:()=>ye});var ye=class{static fromAssetId(t){let e=Buffer.alloc(20,0);return e[15]=1,e.writeUInt32BE(t,16),"0x"+e.toString("hex")}static toAssetId(t){let e=Buffer.from(t.replace("0x",""),"hex");return e.length!==20||!this.isAssetAddress(t)?null:e.readUInt32BE(16)}static isAssetAddress(t){let e=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(t.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(e.subarray(0,16))}};var h={};O(h,{fromPermill:()=>Un,shiftNeg:()=>Ft,toDecimals:()=>Hn,toPct:()=>Gn});var sn=At(require("big.js")),rn=1e3;function Gn(c){let[t,e]=c;return t/e*100}function Hn(c){let[t,e]=c;return t/e}function Un(c){return[c/rn,rn]}function Ft(c,t){let e=(0,sn.default)(typeof c=="bigint"?c.toString():c);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Et={};O(Et,{H160:()=>Se,isEvmAccount:()=>an,isEvmAddress:()=>on,isSs58Address:()=>ln});var mt=require("polkadot-api"),Te=require("@polkadot-api/utils"),J=require("buffer");var fe={};O(fe,{HUB_ASSET_ID:()=>Pe,HYDRATION_OMNIPOOL_ADDRESS:()=>Vn,HYDRATION_PARACHAIN_ID:()=>Wn,HYDRATION_SS58_PREFIX:()=>G,RUNTIME_DECIMALS:()=>E,SYSTEM_ASSET_DECIMALS:()=>he,SYSTEM_ASSET_ID:()=>$,TRADEABLE_DEFAULT:()=>ct});var E=18,$=0,he=12,Wn=2034,G=63,Vn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Pe=1,ct=15;var xe="ETH\0";function an(c){if(!c)return!1;try{let t=(0,mt.AccountId)().enc(c),e=J.Buffer.from(xe);return J.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function on(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function ln(c){try{return(0,mt.AccountId)(63).enc(c),!0}catch{return!1}}var Se=class c{static toAccount=t=>{let e=J.Buffer.from(t.slice(2),"hex"),n=J.Buffer.from(xe),r=Uint8Array.from(J.Buffer.concat([n,e,J.Buffer.alloc(8)])),s=(0,Te.toHex)(r);return(0,mt.AccountId)(63).dec(s)};static fromAccount=t=>{let e=(0,mt.AccountId)().enc(t),n=J.Buffer.from(xe),r=e.slice(n.length,-8);return"0x"+J.Buffer.from(r).toString("hex")};static fromSS58=t=>{let n=(0,mt.AccountId)().enc(t).slice(0,20);return(0,Te.toHex)(n)};static fromAny=t=>{if(on(t))return t;if(an(t))return c.fromAccount(t);if(ln(t))return c.fromSS58(t);throw new Error("Unknown address type")}};var nt={};O(nt,{findNestedKey:()=>Yn,findNestedObj:()=>Xn,jsonFormatter:()=>jn});var Yn=(c,t)=>{let e=[];return JSON.stringify(c,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},Xn=(c,t,e)=>{let n;return JSON.stringify(c,(r,s)=>(s&&s[t]===e&&(n=s),s)),n},jn=(c,t)=>typeof t=="bigint"?t.toString():t;var B={};O(B,{calculateBuyFee:()=>$n,calculateDiffToAvg:()=>zn,calculateDiffToRef:()=>Kn,calculateSellFee:()=>Qn,getFraction:()=>Jn});var z=At(require("big.js"));function zn(c,t){let e=(0,z.default)(c.toString()),n=(0,z.default)(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Kn(c,t){if(t===0n)return 0;let e=(0,z.default)(c.toString()),n=(0,z.default)(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Qn(c,t){let e=(0,z.default)(c.toString()),n=(0,z.default)(t.toString());return(0,z.default)(1).minus(n.div(e)).mul(100).round(2).toNumber()}function $n(c,t){let e=(0,z.default)(c.toString());return(0,z.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Jn(c,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),r=BigInt(t*n);return c*r/BigInt(100*n)}var we={};O(we,{convertToId:()=>Zn});var un=require("buffer");function Zn(c){let e=un.Buffer.from(c.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Zt}=st,{H160:Ie}=Et,tr=1.01,er=99999,nr=10n**27n,rr=10n**18n,it=class{client;constructor(t){let e=t??new N;this.client=new Rt(e)}async getSummary(t){let e=Ie.fromAny(t),[n,r,s]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[i]=n,[a,o]=r,[l,u,d,m,p,g]=s,P=y.toDecimal(g,18),b=[];for(let S of a){let f=S.underlyingAsset.toLowerCase(),T=i.find(({underlyingAsset:rt})=>rt.toLowerCase()===f);if(!T)throw new Error("Missing pool reserve for "+f);let I=S.scaledATokenBalance,v=T.liquidityIndex,C=T.priceInMarketReferenceCurrency,k=I*v/nr,Y=Number(o===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,tt=T.usageAsCollateralEnabled&&S.usageAsCollateralEnabledOnUser&&S.scaledATokenBalance>0n,vt=Zt.toAssetId(f);b.push({aTokenBalance:k,decimals:Number(T.decimals),isCollateral:tt,priceInRef:C,reserveId:vt,reserveAsset:f,reserveLiquidationThreshold:Y})}return{healthFactor:Number(P),totalCollateral:l,totalDebt:u,reserves:b}}async hasBorrowPositions(t){let e=Ie.fromAny(t),n=await this.client.getUserAccountData(e),[r,s]=n;return s>0n}async getHealthFactor(t){let e=Ie.fromAny(t),n=await this.client.getUserAccountData(e),[r,s,i,a,o,l]=n,u=y.toDecimal(l,18);return Number(u)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:r,totalDebt:s,reserves:i}=await this.getSummary(t),a=Zt.fromAssetId(e),o=i.find(b=>b.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,isCollateral:u,priceInRef:d,reserveLiquidationThreshold:m}=o,p=y.toBigInt(n,l),g=u?p*d/10n**BigInt(l):0n,P=r-g;return P<=0n?0:this.calculateHealthFactor(P,m,s)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:s,reserves:i}=await this.getSummary(t),a=Zt.fromAssetId(e),o=i.find(P=>P.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,priceInRef:u,reserveLiquidationThreshold:d}=o,p=y.toBigInt(n,l)*u/10n**BigInt(l),g=r+p;return g<=0n?0:this.calculateHealthFactor(g,d,s)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:r,reserves:s}=await this.getSummary(t),i=Zt.fromAssetId(e),a=s.find(o=>o.reserveAsset===i);if(!a)throw new Error("Missing reserve ctx for "+i);return this.calculateWithdrawMax(a,n,r)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:r}=await this.getSummary(t),s={};for(let i of r){let a=this.calculateWithdrawMax(i,e,n);i.reserveId&&(s[i.reserveId]=a)}return s}calculateHealthFactor(t,e,n){if(n===0n)return er;let r=10n**6n,s=y.toBigInt(e,18),i=t*s*r,a=n*rr,o=i/a;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let r=y.toBigInt(t,18),s=y.toBigInt(e,18);return(r*n+s-1n)/s}calculateWithdrawMax(t,e,n){let{aTokenBalance:r,decimals:s,priceInRef:i,reserveLiquidationThreshold:a}=t,o=this.calculateRequiredCollateral(tr,a,n),l=e-o;if(l<=0n)return{amount:0n,decimals:s};let u=l*10n**BigInt(s)/i;return{amount:r<u?r:u,decimals:s}}};var Ae={};O(Ae,{AssetClient:()=>pt,BalanceClient:()=>H,ChainParams:()=>dt,LiquidityMining:()=>te});var pt=class extends q{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(t){super(t)}async queryShares(){let e=await this.api.query.Stableswap.Pools.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[s]=n;return[s,r]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[s]=n;return[s,r]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:r}=n;return this.SUPPORTED_TYPES.includes(r.type)}).map(({keyArgs:n,value:r})=>{let[s]=n;return[s,r]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[s]=n;return[s,r]}))}async mapToken(t,e,n,r){let{name:s,asset_type:i,is_sufficient:a,existential_deposit:o}=e,{symbol:l,decimals:u}=n.get(t)??{};return{id:t,name:s?.asText(),symbol:l,decimals:u,icon:l,type:i.type,isSufficient:a,location:r,existentialDeposit:o}}async mapBond(t,e,n,r){let[s,i]=r,{asset_type:a,is_sufficient:o,existential_deposit:l}=e,{symbol:u,decimals:d}=await this.mapToken(s,e,n),m=Number(i),p=new Intl.DateTimeFormat("en-GB"),g=[u,"Bond",p.format(m)].join(" ");return{id:t,name:g,symbol:u+"b",decimals:d,icon:u,type:a.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:s,maturity:m}}async mapShares(t,e,n,r){let{assets:s}=r,{name:i,symbol:a,asset_type:o,is_sufficient:l,existential_deposit:u}=e,d=await Promise.all(s.map(async g=>{let{symbol:P}=await this.mapToken(g,e,n);return[g,P]})),m=Object.fromEntries(d),p=Object.values(m);return{id:t,name:p.join(", "),symbol:a?.asText()||i?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:m}}async mapExternal(t,e,n,r){let s=await this.mapToken(t,e,new Map,r),i=n?.find(a=>a.internalId===s.id);return i?{...s,decimals:i.decimals,name:i.name,symbol:i.symbol,icon:i.symbol,isWhiteListed:i.isWhiteListed}:s}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,r,s,i]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),a=this.parseMetadata(n),o=[];for(let[l,u]of Array.from(n)){let d=r.get(l),{asset_type:m}=u,p;switch(m.type){case"Bond":let g=i.get(l);p=await this.mapBond(l,u,a,g);break;case"StableSwap":let P=s.get(l);p=await this.mapShares(l,u,a,P);break;case"External":p=await this.mapExternal(l,u,e,d);break;default:p=await this.mapToken(l,u,a,d)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};var w=require("rxjs");var H=class extends q{constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getTokenBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:{free:n,frozen:r}}=await e.getValue(t);return n-r}async getTokenBalance(t,e){let n=this.api.query.Tokens.Accounts,{free:r,frozen:s}=await n.getValue(t,e);return r-s}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),r=this.subscribeErc20Balance(t);return(0,w.combineLatest)([e,n,r]).pipe((0,w.debounceTime)(250),(0,w.map)(s=>s.flat()),(0,w.startWith)([]),(0,w.bufferCount)(2,1),(0,w.map)(([s,i],a)=>{if(a===0)return i;let o=s.reduce((u,d)=>(u.set(d.id,d.amount),u),new Map);return i.filter(u=>u.amount!==o.get(u.id))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,w.map)(n=>{let{free:r,frozen:s}=n.data;return{id:0,amount:r-s}}))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,w.map)(r=>{let{free:s,frozen:i}=r;return{id:e,amount:s-i}}))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,w.distinctUntilChanged)((n,r)=>!r.deltas),(0,w.map)(({deltas:n})=>{let r=[];return n?.deleted.forEach(s=>{let[i,a]=s.args;r.push({id:a,amount:0n})}),n?.upserted.forEach(s=>{let[i,a]=s.args,{free:o,frozen:l}=s.value;r.push({id:a,amount:o-l})}),r}))}subscribeErc20Balance(t,e){let n=new w.Subject,r=n.pipe((0,w.shareReplay)(1)),s=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:u}=l;return u.type==="Erc20"}).map(({keyArgs:l})=>{let[u]=l;return u}),i=async()=>{let o=e||await s(),l=async()=>{let m=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,amount:g}));n.next(m)};await l();let u=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>u.unsubscribe()},a;return i().then(o=>a=o),r.pipe((0,w.finalize)(()=>a?.()),(0,w.pairwise)(),(0,w.map)(([o,l],u)=>{if(u===0)return l;let d=o.reduce((p,g)=>(p.set(g.id,g.amount),p),new Map);return l.filter(p=>p.amount!==d.get(p.id))}),(0,w.distinctUntilChanged)((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let{free:n,frozen:r}=await this.api.apis.CurrenciesApi.account(e,t);return n-r}};var dt=class extends q{_minOrderBudget;_blockTime;constructor(t){super(t)}async getBlockTime(){if(this._blockTime===void 0){let t=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(t)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};var gt=require("polkadot-api"),Oe=require("@galacticcouncil/math-liquidity-mining"),M=At(require("big.js"));var sr=BigInt((0,M.default)(1).pow(18).toString()),ir=6,te=class extends q{balanceClient;omnipoolAssetIds=[];secondsInYear=(0,M.default)(365.2425).times(24).times(60).times(60);constructor(t){super(t),this.balanceClient=new H(t)}async getOraclePrice(t,e){let n=[t,e].sort((s,i)=>s-i);if(t===e)return sr;let r=await this.api.query.EmaOracle.Oracles.getValue(gt.Binary.fromText("omnipool"),n,(0,gt.Enum)("TenMinutes"));if(r){let{n:s,d:i}=r[0].price,a;return t<e?a=(0,Oe.fixed_from_rational)(s.toString(),i.toString()):a=(0,Oe.fixed_from_rational)(i.toString(),s.toString()),BigInt(a)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),r=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),s=Buffer.from([t]),i=Buffer.concat([n,r,s]),o="0x"+Buffer.concat([i,Buffer.alloc(32-i.length)]).toString("hex");return(0,gt.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let s=(0,M.default)(r).times(t.toString()).times(e.toString()).div(18);return s.gte(n.toString())?n.toString():s.toString()}getPoolYieldPerPeriod(t,e,n,r){let s=(0,M.default)(t.toString()).times(e),i=(0,M.default)(n.toString()).times(r);return s.div(i.toString()).toString()}farmData(t,e,n){let{yieldFarm:r,globalFarm:s,priceAdjustment:i,balance:a}=t,{multiplier:o,loyalty_curve:l}=r,{blocks_per_period:u,yield_per_period:d,total_shares_z:m,max_reward_per_period:p,pending_rewards:g,accumulated_paid_rewards:P,planned_yielding_periods:b,updated_at:S,incentivized_asset:f,reward_currency:T,price_adjustment:I}=s,v=Ft(i??I,18),C=Ft(o,18),k=Ft(l?.initial_reward_percentage??0,18),V=this.secondsInYear.div((0,M.default)(ir).times(u)).toString(),Y;if(m<0)Y=(0,M.default)(C).times(d.toString()).times(V).toString();else{let An=this.getGlobalRewardPerPeriod(m,d,p,v),Bn=this.getPoolYieldPerPeriod(An,C,m,v);Y=(0,M.default)(Bn).times(V).toString()}let tt=g+P,vt=p*BigInt(b),rt=a+tt,ue=rt-tt,Ot=(0,M.default)(ue.toString()).div(p.toString()),Ye=(0,M.default)(e).div(u.toString()).toString(),In=(m>=0?Ot.plus(S):Ot.plus(Ye)).toString(),vn=(0,M.default)(m.toString()).div((0,M.default)(p.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(v).toFixed(2),Xe=(0,M.default)(tt.toString()).div(rt.toString()).gte(.999);Y=Xe?"0":(0,M.default)(Y).div(n?2:1).times(100).toString();let On=k?(0,M.default)(Y).times(k).toString():void 0;return{apr:Y,minApr:On,isDistributed:Xe,estimatedEndPeriod:In,maxRewards:vt,incentivizedAsset:f,rewardCurrency:T,loyaltyCurve:l,currentPeriod:Ye,potMaxRewards:rt,fullness:vn}}async getOmnipoolFarms(t){let e=await this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(Number(t)),r=(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number,s=await Promise.all(e.map(async({keyArgs:i,value:a})=>{let[,o]=i,l=a,u=await this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(o),d=await this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(Number(t),o,l);if(!u||!d)return;let m=u.reward_currency,p=u.incentivized_asset,g=this.getFarmAddress(o),P=await this.getOraclePrice(m,p),b=await this.balanceClient.getTokenBalance(g,m);return{id:t,globalFarm:u,yieldFarm:d,priceAdjustment:P,balance:b}}));return r?s.map(i=>i?this.farmData(i,r):void 0):[]}async getIsolatedFarms(t){let e=await this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t),r=(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number,s=await Promise.all(e.map(async({keyArgs:i,value:a})=>{let[,o]=i,l=a,u=await this.api.query.XYKWarehouseLM.GlobalFarm.getValue(o),d=await this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,o,l);if(!u||!d)return;let m=u.reward_currency,p=u.incentivized_asset,g=this.getFarmAddress(o,!0),P=await this.getOraclePrice(m,p),b=await this.balanceClient.getBalance(g,m);return{id:t,globalFarm:u,yieldFarm:d,priceAdjustment:P,balance:b,farmAddress:g}}));return r?s.map(i=>i?this.farmData(i,r,!0):void 0):[]}};var _e={};O(_e,{AssetNotFound:()=>Be,PoolNotFound:()=>Dt,RouteNotFound:()=>bt});var Be=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},Dt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},bt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var ke={};O(ke,{PoolContextProvider:()=>ft,PoolError:()=>at,PoolFactory:()=>Pt,PoolType:()=>D,aave:()=>Ce,lbp:()=>Re,omni:()=>Fe,stable:()=>Ee,xyk:()=>De});var Re={};O(Re,{LbpMath:()=>j,LbpPool:()=>Ct,LbpPoolClient:()=>kt});var K=require("@galacticcouncil/math-lbp"),j=class{static getSpotPrice(t,e,n,r,s){return(0,K.get_spot_price)(t,e,n,r,s)}static calculateInGivenOut(t,e,n,r,s){return(0,K.calculate_in_given_out)(t,e,n,r,s)}static calculateOutGivenIn(t,e,n,r,s){return(0,K.calculate_out_given_in)(t,e,n,r,s)}static calculateLinearWeights(t,e,n,r,s){return(0,K.calculate_linear_weights)(t,e,n,r,s)}static calculatePoolTradeFee(t,e,n){return(0,K.calculate_pool_trade_fee)(t,e,n)}};var D=(s=>(s.Aave="Aave",s.LBP="LBP",s.Omni="Omnipool",s.Stable="Stableswap",s.XYK="XYK",s))(D||{}),at=(s=>(s.InsufficientTradingAmount="InsufficientTradingAmount",s.MaxInRatioExceeded="MaxInRatioExceeded",s.MaxOutRatioExceeded="MaxOutRatioExceeded",s.TradeNotAllowed="TradeNotAllowed",s.UnknownError="UnknownError",s))(at||{});var Ct=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,r,s,i,a){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s,this.fee=i,this.repayFeeApply=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:s.balance,decimalsIn:r.decimals,decimalsOut:s.decimals,weightIn:r.weight,weightOut:s.weight}}validateAndBuy(t,e,n){let r=this.tokens[0].id,s=[];e<this.minTradingLimit&&s.push("InsufficientTradingAmount");let i=t.balanceOut/this.maxOutRatio;if(e>i&&s.push("MaxOutRatioExceeded"),r===t.assetOut){let a=this.calculateTradeFee(e,n),o=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+a,u=this.calculateInGivenOut(t,l),d=t.balanceIn/this.maxInRatio;return u>d&&s.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:s}}else{let a=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return a>o&&s.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:s}}}validateAndSell(t,e,n){let r=this.tokens[0].id,s=[];e<this.minTradingLimit&&s.push("InsufficientTradingAmount");let i=t.balanceIn/this.maxInRatio;if(e>i&&s.push("MaxInRatioExceeded"),r===t.assetIn){let a=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return a>o&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:s}}else{let a=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(a,n),l=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),u=a-o,d=t.balanceOut/this.maxOutRatio;return u>d&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:u,feePct:l,errors:s}}}calculateInGivenOut(t,e){let n=j.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=j.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=j.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=j.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=j.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};var mn=require("polkadot-api"),ot=require("rxjs");var cn=(c,t=new Map)=>e=>{let n;return t.has(e)?t.get(e):(t.set(e,n=c(e)),n)};var A=require("rxjs");var U=class extends H{override=[];mem=0;memPools=cn(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t){super(t)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=(0,A.from)(this.getPoolsMem()).pipe((0,A.switchMap)(e=>this.subscribe(e)),(0,A.combineLatestAll)());return(0,A.firstValueFrom)(t)}getSubscriber(){return(0,A.from)(this.getPoolsMem()).pipe((0,A.switchMap)(t=>this.subscribe(t)),(0,A.mergeAll)())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>(0,A.combineLatest)([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe((0,A.debounceTime)(250),(0,A.map)(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return(0,A.of)([]);let e=[this.subscribeTokensBalance(t.address)];if(this.hasSystemAsset(t)){let n=this.subscribeSystemBalance(t.address);e.push(n)}if(this.hasErc20Asset(t)){let n=t.tokens.filter(s=>s.type==="Erc20").map(s=>s.id),r=this.subscribeErc20Balance(t.address,n);e.push(r)}return(0,A.combineLatest)(e).pipe((0,A.map)(n=>n.map(r=>Array.isArray(r)?r:[r]).flat()))}hasSystemAsset(t){return t.tokens.some(e=>e.id===0)}hasErc20Asset(t){return t.tokens.some(e=>e.type==="Erc20")}hasValidAssets(t){return t.tokens.every(({id:e,decimals:n,balance:r})=>{let s=this.override.find(a=>a.id===e),i=!!n||!!s?.decimals;return r>0n&&i})}updatePool=(t,e)=>{let n=t.tokens.map(r=>{let s=e.find(a=>a.id===r.id),i=this.override.find(a=>a.id===r.id);return s?{...r,balance:s.amount,decimals:r.decimals||i?.decimals}:{...r,decimals:r.decimals||i?.decimals}});return{...t,tokens:n}}};var kt=class extends U{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),r=e?.relay_parent_number||0,s=t.filter(({value:i})=>e&&this.isActivePool(i,r)).map(async({keyArgs:i,value:a})=>{let[o]=i,l=o.toString(),u=await this.getPoolDelta(l,a,r);return{address:l,type:"LBP",fee:a.fee,...u,...n}});return Promise.all(s)}async getPoolDelta(t,e,n){let{start:r,end:s,assets:i,initial_weight:a,final_weight:o,repay_target:l,fee_collector:u}=e,d=j.calculateLinearWeights(r?r.toString():"0",s?s.toString():"0",a.toString(),o.toString(),n.toString()),[m,p]=i,g=BigInt(d),P=this.MAX_FINAL_WEIGHT-BigInt(g),[b,S,f,T,I]=await Promise.all([this.isRepayFeeApplied(m,l,u.toString()),this.getBalance(t,m),this.api.query.AssetRegistry.Assets.getValue(m),this.getBalance(t,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:b,tokens:[{id:m,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:S,weight:g,type:f?.asset_type.type},{id:p,decimals:I?.decimals,existentialDeposit:I?.existential_deposit,balance:T,weight:P,type:I?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:r}=t;return n&&r?e>=n&&e<r:!1}async isRepayFeeApplied(t,e,n){if(e===0n)return!1;try{return await this.getBalance(n,t)<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t){return{repayFee:await this.getRepayFee(),exchangeFee:t.fee}}getPoolType(){return"LBP"}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(mn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe((0,ot.switchMap)(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):(0,ot.of)(t)),(0,ot.map)(r=>Object.assign({},t,r))):(0,ot.of)(t)}};var Fe={};O(Fe,{OmniMath:()=>_,OmniPool:()=>Mt,OmniPoolClient:()=>qt});var x=require("@galacticcouncil/math-omnipool"),lt=At(require("big.js")),_=class{static calculateSpotPrice(t,e,n,r){return(0,x.calculate_spot_price)(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return(0,x.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,r,s,i,a,o,l){return(0,x.calculate_in_given_out)(t,e,n,r,s,i,a,o,l)}static calculateLrnaInGivenOut(t,e,n,r,s){return(0,x.calculate_lrna_in_given_out)(t,e,n,r,s)}static calculateOutGivenIn(t,e,n,r,s,i,a,o,l){return(0,x.calculate_out_given_in)(t,e,n,r,s,i,a,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,s){return(0,x.calculate_out_given_lrna_in)(t,e,n,r,s)}static calculateShares(t,e,n,r){return(0,x.calculate_shares)(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,s,i,a,o){return(0,x.calculate_liquidity_out)(t,e,n,r,s,i,a,o)}static calculateLiquidityLRNAOut(t,e,n,r,s,i,a,o){return(0,x.calculate_liquidity_lrna_out)(t,e,n,r,s,i,a,o)}static calculateCapDifference(t,e,n,r){let s=(0,lt.default)(e),i=(0,lt.default)(t),a=(0,lt.default)(r),o=(0,lt.default)(n),l=(0,lt.default)(10).pow(18),u=o.div(l);if(s.div(a).lt(u)){let m=u.times(a).minus(s).times(i),p=s.times((0,lt.default)(1).minus(u));return m.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return(0,x.verify_asset_cap)(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return(0,x.calculate_liquidity_hub_in)(t,e,n,r)}static isSellAllowed(t){return(0,x.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,x.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,x.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,x.is_remove_liquidity_allowed)(t)}};var Mt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,r,s,i){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s,this.hubAssetId=i}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:r.hubReserves,hubReservesOut:s.hubReserves,sharesIn:r.shares,sharesOut:s.shares,decimalsIn:r.decimals,decimalsOut:s.decimals,balanceIn:r.balance,balanceOut:s.balance,tradeableIn:r.tradeable,tradeableOut:s.tradeable,assetInEd:r.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),s=this.calculateInGivenOut(t,e,n),i=r===0n?0:B.calculateDiffToRef(s,r),a=[],o=_.isSellAllowed(t.tradeableIn),l=_.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&a.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&a.push("MaxOutRatioExceeded");let d=t.balanceIn/this.maxInRatio;return s>d&&a.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:r,amountOut:e,feePct:i,errors:a}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),s=this.calculateOutGivenIn(t,e,n),i=B.calculateDiffToRef(r,s),a=[],o=_.isSellAllowed(t.tradeableIn),l=_.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&a.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&a.push("MaxInRatioExceeded");let d=t.balanceOut/this.maxOutRatio;return s>d&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:s,feePct:i,errors:a}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let r=_.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0",n?h.toDecimals(n.protocolFee).toString():"0"),s=BigInt(r);return s<0n?0n:s}calculateLrnaInGivenOut(t,e,n){let r=_.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0"),s=BigInt(r);return s<0n?0n:s}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let r=_.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0",n?h.toDecimals(n.protocolFee).toString():"0"),s=BigInt(r);return s<0n?0n:s}calculateOutGivenLrnaIn(t,e,n){let r=_.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0"),s=BigInt(r);return s<0n?0n:s}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=_.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=_.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=_.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=_.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var ee=require("polkadot-api"),pn=require("@polkadot-api/utils"),Lt=require("rxjs");var qt=class extends U{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,r,s,i,a]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:u,value:d})=>{let[m]=u,{hub_reserve:p,shares:g,tradable:P,cap:b,protocol_shares:S}=d,[f,T]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(m),this.getBalance(e,m)]);return{id:m,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:T,cap:b,hubReserves:p,protocolShares:S,shares:g,tradeable:P,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:i,tradeable:r,type:s?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...a}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=(0,pn.toHex)(e);return(0,ee.AccountId)(63).dec(n)}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t,e){let[n,r,s]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),i=n.min_fee+r.min_fee,a=n.max_fee+r.max_fee;if(s){let{asset_fee:o,protocol_fee:l}=s;return{assetFee:h.fromPermill(o),protocolFee:h.fromPermill(l),min:h.fromPermill(i),max:h.fromPermill(a)}}else return{assetFee:h.fromPermill(n.min_fee),protocolFee:h.fromPermill(r.min_fee),min:h.fromPermill(i),max:h.fromPermill(a)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(ee.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,Lt.distinctUntilChanged)((n,r)=>!r.deltas),(0,Lt.map)(({entries:n})=>n.map(r=>{let[s]=r.args,{hub_reserve:i,shares:a,tradable:o,cap:l,protocol_shares:u}=r.value,d=t.tokens.findIndex(p=>p.id===s);return{...t.tokens[d],cap:l,hubReserves:i,protocolShares:u,shares:a,tradeable:o}})),(0,Lt.map)(n=>{let r=t.tokens.find(s=>s.id===1);return{...t,tokens:[...n,r]}}))}};var Ee={};O(Ee,{StableMath:()=>L,StableSwap:()=>Nt,StableSwapClient:()=>Gt});var R=require("@galacticcouncil/math-stableswap"),L=class{static getPoolAddress(t){return(0,R.pool_account_name)(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,r,s){return(0,R.calculate_amplification)(t,e,n,r,s)}static calculateInGivenOut(t,e,n,r,s,i,a){return(0,R.calculate_in_given_out)(t,e,n,r,s,i,a)}static calculateAddOneAsset(t,e,n,r,s,i,a){return(0,R.calculate_add_one_asset)(t,e,n,r,s,i,a)}static calculateSharesForAmount(t,e,n,r,s,i,a){return(0,R.calculate_shares_for_amount)(t,e,n,r,s,i,a)}static calculateOutGivenIn(t,e,n,r,s,i,a){return(0,R.calculate_out_given_in)(t,e,n,r,s,i,a)}static calculateLiquidityOutOneAsset(t,e,n,r,s,i,a){return(0,R.calculate_liquidity_out_one_asset)(t,e,n,r,s,i,a)}static calculateShares(t,e,n,r,s,i){return(0,R.calculate_shares)(t,e,n,r,s,i)}static calculateSpotPriceWithFee(t,e,n,r,s,i,a,o){return(0,R.calculate_spot_price_with_fee)(t,e,n,r,s,i,a,o)}static recalculatePegs(t,e,n,r,s){return(0,R.recalculate_peg)(t,e,n,r,s)}};var Nt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.id,t.fee,t.totalIssuance)}constructor(t,e,n,r,s,i,a,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s,this.amplification=i,this.id=a,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:s.balance,decimalsIn:r.decimals,decimalsOut:s.decimals,tradeableIn:this.id===t?15:r.tradeable,tradeableOut:this.id===e?15:s.tradeable,assetInEd:r.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),s=this.calculateInGivenOut(t,e,n),i=h.toPct(n.fee),a=[],o=_.isSellAllowed(t.tradeableIn),l=_.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&a.push("InsufficientTradingAmount"),{amountIn:s,calculatedIn:r,amountOut:e,feePct:i,errors:a}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),s=this.calculateOutGivenIn(t,e,n),i=h.toPct(n.fee),a=[],o=_.isSellAllowed(t.tradeableIn),l=_.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&a.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:r,amountOut:s,feePct:i,errors:a}}calculateIn(t,e,n){let r=L.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateAddOneAsset(t,e,n){let r=L.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateSharesForAmount(t,e,n){let r=L.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=L.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let r=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let r=L.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateWithdrawOneAsset(t,e,n){let r=L.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateShares(t,e,n){let r=L.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=L.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let r=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=L.defaultPegs(this.tokens.length-1);return JSON.stringify(t)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:r})=>({asset_id:e,amount:n,decimals:r}));return JSON.stringify(t,nt.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],nt.jsonFormatter)}};var ne=require("polkadot-api"),dn=require("@polkadot-api/utils"),gn=require("@noble/hashes/blake2b"),yt=require("rxjs");var ar=340282366920938463463374607431768211455n,Gt=class extends U{poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),r=t.map(async({keyArgs:s,value:i})=>{let[a]=s,o=this.getPoolAddress(a),[l,u]=await Promise.all([this.getPoolDelta(a,i,e),this.getPoolTokens(a,i)]);return this.poolsData.set(o,i),{address:o,id:a,type:"Stableswap",fee:h.fromPermill(i.fee),tokens:u,...l,...n}});return Promise.all(r)}async getPoolDelta(t,e,n){let{initial_amplification:r,final_amplification:s,initial_block:i,final_block:a}=e,o=L.calculateAmplification(r.toString(),s.toString(),i.toString(),a.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),r=e.assets.map(async a=>{let[o,l,u]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,a),this.api.query.AssetRegistry.Assets.getValue(a),this.getBalance(n,a)]);return{id:a,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:u,tradeable:o,type:l?.asset_type.type}}),s=await Promise.all(r),i=await this.api.query.AssetRegistry.Assets.getValue(t);return s.push({id:t,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:ar,tradeable:15,type:i?.asset_type.type}),s}getPoolAddress(t){let e=L.getPoolAddress(t),n=(0,gn.blake2b)(e,{dkLen:32}),r=(0,dn.toHex)(n);return(0,ne.AccountId)(63).dec(r)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolFees(t){return{fee:t.fee}}getPoolType(){return"Stableswap"}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(ne.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?(0,yt.of)(t):e.watchValue("best").pipe((0,yt.switchMap)(r=>this.getPoolDelta(t.id,n,r)),(0,yt.map)(r=>Object.assign({},t,r)))}};var De={};O(De,{XykMath:()=>Z,XykPool:()=>Ht,XykPoolClient:()=>Ut});var F=require("@galacticcouncil/math-xyk"),Z=class{static getSpotPrice(t,e,n){return(0,F.get_spot_price)(t,e,n)}static calculateInGivenOut(t,e,n){return(0,F.calculate_in_given_out)(t,e,n)}static calculateOutGivenIn(t,e,n){return(0,F.calculate_out_given_in)(t,e,n)}static calculatePoolTradeFee(t,e,n){return(0,F.calculate_pool_trade_fee)(t,e,n)}static calculateLiquidityIn(t,e,n){return(0,F.calculate_liquidity_in)(t,e,n)}static calculateSpotPrice(t,e){return(0,F.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return(0,F.calculate_spot_price_with_fee)(t,e,n,r)}static calculateShares(t,e,n){return(0,F.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return(0,F.calculate_liquidity_out_asset_a)(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return(0,F.calculate_liquidity_out_asset_b)(t,e,n,r)}};var Ht=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,s){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:r.decimals,decimalsOut:s.decimals,balanceIn:r.balance,balanceOut:s.balance,assetInEd:r.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),s=this.calculateTradeFee(r,n),i=h.toPct(n.exchangeFee),a=r+s,o=[];(e<this.minTradingLimit||r<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return a>u&&o.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:i,errors:o}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),s=this.calculateTradeFee(r,n),i=h.toPct(n.exchangeFee),a=r-s,o=[];(e<this.minTradingLimit||r<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return a>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:i,errors:o}}calculateInGivenOut(t,e){let n=Z.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=Z.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=Z.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=Z.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=Z.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};var bn=require("polkadot-api"),yn=require("rxjs");var Ut=class extends U{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),r=e.map(async({keyArgs:s,value:i})=>{let[a]=s,[o,l]=i,[u,d,m,p]=await Promise.all([this.getBalance(a,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(a,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:a,type:"XYK",tokens:[{id:o,decimals:d?.decimals,existentialDeposit:d?.existential_deposit,balance:u,type:d?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:m,type:p?.asset_type.type}],...n}});return Promise.all(r)}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}getPoolType(){return"XYK"}async isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(bn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,yn.of)(t)}};var Ce={};O(Ce,{AavePool:()=>Wt,AavePoolClient:()=>Vt});var Wt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,s){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:s.balance,decimalsIn:r.decimals,decimalsOut:s.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),s=[];return e>t.balanceOut&&s.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),s=[];return r>t.balanceOut&&s.push("TradeNotAllowed"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:s}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};var Pn=require("polkadot-api"),fn=require("@polkadot-api/utils"),ht=require("rxjs"),Tn=require("viem");var hn=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:or}=st,lr=["Supply","Withdraw","Repay","Borrow"],Vt=class extends U{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:r,liqudity_in:s,liqudity_out:i})=>{let[a,o,l,u]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(r),this.api.query.AssetRegistry.AssetLocations.getValue(r)]);return{address:this.getPoolId(n,r),type:"Aave",tokens:[{id:n,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:s,location:o,type:a?.asset_type.type},{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:i,location:u,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:r,liqudity_out:s}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(i=>{let a=i.id===e.id?r:s;return{...i,balance:a}})}getPoolId(t,e){let n=t+"/"+e,r=new TextEncoder().encode(n.padEnd(32,"\0")),s=(0,fn.toHex)(r);return(0,Pn.AccountId)(63).dec(s)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(t,e){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(t){let[e,n]=t.tokens,r=this.getReserveH160Id(e),s=this.api.event.Router.Executed.watch(({asset_in:a,asset_out:o})=>a===n.id||o===n.id),i=this.api.event.EVM.Log.watch(({log:a})=>{let{topics:o,data:l}=a,u=o.map(g=>g.asHex()),d=l.asHex(),{eventName:m,args:p}=(0,Tn.decodeEventLog)({abi:hn,topics:u,data:d});return lr.includes(m)&&p.reserve.toLowerCase()===r.toLowerCase()});return(0,ht.merge)([s,i]).pipe((0,ht.switchMap)(()=>this.getPoolDelta(t)),(0,ht.map)(a=>({...t,tokens:[...a]})))}getReserveH160Id(t){return t.type==="Erc20"?nt.findNestedKey(t.location,"AccountKey20").AccountKey20.key:or.fromAssetId(t.id)}};var Pt=class{static get(t){switch(t.type){case"Aave":return Wt.fromPool(t);case"XYK":return Ht.fromPool(t);case"Omnipool":return Mt.fromPool(t);case"LBP":return Ct.fromPool(t);case"Stableswap":return Nt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var Q=require("rxjs");var ft=class extends q{lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=Q.Subscription.EMPTY;omniSub=Q.Subscription.EMPTY;stableSub=Q.Subscription.EMPTY;xykSub=Q.Subscription.EMPTY;aaveSub=Q.Subscription.EMPTY;isReady=!1;isDestroyed=new Q.Subject;constructor(t){super(t),this.lbpClient=new kt(t),this.omniClient=new qt(t),this.stableClient=new Gt(t),this.xykClient=new Ut(t),this.aaveClient=new Vt(t),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe((0,Q.takeUntil)(this.isDestroyed)).subscribe(e=>{this.pools.set(e.address,e)})}withOmnipool(){return this.omniSub.unsubscribe(),this.omniSub=this.subscribe(this.omniClient),this.active.add("Omnipool"),this}withStableswap(){return this.stableSub.unsubscribe(),this.stableSub=this.subscribe(this.stableClient),this.active.add("Stableswap"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbpClient),this.active.add("LBP"),this}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aaveClient),this.active.add("Aave"),this}withXyk(t){return this.xykClient.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xykClient),this.active.add("XYK"),this}destroy(){this.isDestroyed.next(!0),this.isDestroyed.complete(),this.active.clear(),this.pools.clear(),this.isReady=!1}async getPools(){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let t=await Promise.all(this.clients.filter(e=>this.active.has(e.getPoolType())).map(e=>e.getPools()));return this.isReady=!0,t.flat()}async getPoolFees(t,e){let n=this.clients.find(r=>r.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new Dt(t.type)}};var Ue={};O(Ue,{DEFAULT_BLOCK_TIME:()=>xn,DEFAULT_MIN_BUDGET:()=>qe,ORDER_MIN_BLOCK_PERIOD:()=>Sn,Router:()=>Tt,TWAP_BLOCK_PERIOD:()=>jt,TWAP_MAX_DURATION:()=>Ge,TWAP_MAX_PRICE_IMPACT:()=>Ne,TWAP_TX_MULTIPLIER:()=>el,TradeOrderError:()=>Le,TradeOrderType:()=>ie,TradeRouteBuilder:()=>W,TradeRouter:()=>xt,TradeScheduler:()=>St,TradeType:()=>se});var re=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 ur=5,Yt=class{isNotVisited(t,e){let n=!0;return e.forEach(r=>{(r[0]===t[0]||r[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let r=[],s=new re,i=[];for(i.push([e,""]),s.enqueue(i);s.size()>0;){let a=s.dequeue();if(a==null||a.length>ur)return r;let o=a[a.length-1];(n===null||o[0]===n)&&r.push(a),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,a)){let d=[...a];d.push(u),s.enqueue(d)}})}return r}buildAndPopulateGraph(t,e){let n=new Map;for(let r of t)n.set(parseInt(r),[]);for(let[r,s,i]of e)n.get(s)?.push([i,r]);return n}};function Me(c){let t={};for(let e of c){let n=e.tokens.length;for(let r=0;r<n;r++){t[e.tokens[r].id]||(t[e.tokens[r].id]=[]);for(let s=0;s<n;s++){if(r==s)continue;let i=[e.address,e.tokens[r].id,e.tokens[s].id];t[e.tokens[r].id].push(i)}}}return t}var Xt=class{getProposals(t,e,n){let r=Me(n),s=Object.keys(r),i=s.map(u=>r[u]).flat(),a=new Yt,o=a.buildAndPopulateGraph(s,i),l=a.findPaths(o,t,e);return this.parsePaths(l)}parsePaths(t){let e=[];for(let n of t){let r=[];for(let s=0;s<n.length;s++){let i=n[s],a=n[s+1];if(a==null)break;r.push(this.toEdge(i,a))}e.push(r)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var Tt=class{routeSuggester;routerOptions;ctx;defaultRouterOptions={useOnly:[]};constructor(t,e){this.ctx=t,this.routeSuggester=new Xt,this.routerOptions={...this.defaultRouterOptions,...e}}async getPools(){let t=await this.ctx.getPools(),e=this.routerOptions.useOnly;return e.length===0?t:t.filter(n=>e.includes(n.type))}async getRoutes(t,e){let n=await this.getPools();return this.validateInput(t,e,n),this.getPaths(t,e,n)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}validateInput(t,e,n){if(n.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let r=this.getAssets(n);if(!r.has(t))throw new Error(t+" is not supported asset");if(!r.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(r=>r.id)).flat().sort((n,r)=>n>r?1:-1);return new Set(e)}getPaths(t,e,n){let r=this.toPoolsMap(n);return this.routeSuggester.getProposals(t,e,n).filter(i=>this.validPath(i,r)).map(i=>this.toHops(i,r))}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,r)=>n&&r)}validEdge([t,e,n],r){return r.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,Pt.get(e)]))}toHops(t,e){return t.map(([n,r,s])=>{let i=e.get(n);return{poolAddress:n,poolId:i?.id,pool:i?.type,assetIn:r,assetOut:s}})}};var se=(e=>(e.Buy="Buy",e.Sell="Sell",e))(se||{}),ie=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(ie||{}),Le=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Le||{});var xt=class extends Tt{isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,r)=>{let s=n[n.length-1].amountOut,i=r[r.length-1].amountOut;return s>i?-1:1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(s=>s.tradeFeeRange?.[0]??s.tradeFeePct).reduce((s,i)=>s+i),r=t.map(s=>s.tradeFeeRange?.[1]??s.tradeFeePct).reduce((s,i)=>s+i);return[n,r]}}getPoolFeeRange(t){let e=t.min?h.toPct(t.min):void 0,n=t.max?h.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}async getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetOutDecimals).reduce((a,o)=>a+o),r=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),s=n-e.assetOutDecimals,i=Math.pow(10,s);return r/BigInt(i)}async getSell(t,e,n,r){let s=await super.getPools(),i=super.validateInput(t,e,s),a=super.getPaths(t,e,s);if(a.length===0)throw new bt(t,e);let o;if(r)o=await this.toSellSwaps(n,r,i);else{let v=await Promise.all(a.map(C=>this.toSellSwaps(n,C,i)));o=this.findBestSellRoute(v)}let l=o[0],u=o[o.length-1],d=this.isDirectTrade(o),m=await this.getSellSpot(o),p=u.amountOut,g=d?u.calculatedOut:this.calculateDelta0Y(l.amountIn,o,i),P=g-p,b=this.getRouteFeeRange(o),S=d?u.tradeFeePct:B.calculateSellFee(g,p),f=Math.pow(10,l.assetInDecimals),T=l.amountIn*m/BigInt(f),I=B.calculateDiffToRef(g,T);return{type:"Sell",amountIn:l.amountIn,amountOut:u.amountOut,spotPrice:m,tradeFee:P,tradeFeePct:S,tradeFeeRange:b,priceImpactPct:I,swaps:o,toHuman(){return{type:"Sell",amountIn:y.toDecimal(l.amountIn,l.assetInDecimals),amountOut:y.toDecimal(u.amountOut,u.assetOutDecimals),spotPrice:y.toDecimal(m,u.assetOutDecimals),tradeFee:y.toDecimal(P,u.assetOutDecimals),tradeFeePct:S,tradeFeeRange:b,priceImpactPct:I,swaps:o.map(v=>v.toHuman())}}}}calculateDelta0Y(t,e,n){let r=[];for(let s=0;s<e.length;s++){let i=e[s],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;s>0?l=r[s-1]:l=t;let u=a.calculateOutGivenIn(o,l);r.push(u)}return r[r.length-1]}async toSellSwaps(t,e,n){let r=[];for(let s=0;s<e.length;s++){let i=e[s],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;s>0?l=r[s-1].amountOut:l=typeof t=="string"?y.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(a,o.assetOut),{amountOut:d,calculatedOut:m,feePct:p,errors:g}=a.validateAndSell(o,l,u),P=this.getPoolFeeRange(u),b=a.spotPriceOutGivenIn(o),S=Math.pow(10,o.decimalsIn),f=l*b/BigInt(S),T=B.calculateDiffToRef(m,f);r.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:d,calculatedOut:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===i.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===i.assetIn},toHuman(){return{...i,amountIn:y.toDecimal(l,o.decimalsIn),amountOut:y.toDecimal(d,o.decimalsOut),calculatedOut:y.toDecimal(m,o.decimalsOut),spotPrice:y.toDecimal(b,o.decimalsOut),tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g}}})}return r}async getMostLiquidRoute(t,e){let n=await super.getPools(),r=super.validateInput(t,e,n),s=super.getPaths(t,e,n),o=n.filter(m=>m.tokens.some(p=>p.id===t&&p.id!==m.id)).map(m=>m.type==="Aave"?m.tokens:m.tokens.filter(p=>p.id===t)).map(m=>m.map(p=>p.balance).reduce((p,g)=>p+g)).sort((m,p)=>p<m?-1:1)[0],l=B.getFraction(o,.1),u=await Promise.all(s.map(m=>this.toSellSwaps(l,m,r)));return this.findBestSellRoute(u).map(m=>({poolAddress:m.poolAddress,poolId:m?.poolId,pool:m.pool,assetIn:m.assetIn,assetOut:m.assetOut}))}async getSpotPrice(t,e){let n=await super.getPools(),r=super.validateInput(t,e,n),s=await this.getMostLiquidRoute(t,e),i=await this.toSellSwaps("1",s,r),a=await this.getSellSpot(i),o=i[i.length-1].assetOutDecimals;return{amount:a,decimals:o}}findBestBuyRoute(t){let e=t.sort((n,r)=>{let s=n[0].amountIn,i=r[0].amountIn;return s>i?1:-1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}async getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetInDecimals).reduce((a,o)=>a+o),r=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),s=n-e.assetInDecimals,i=Math.pow(10,s);return r/BigInt(i)}async getBuy(t,e,n,r){let s=await super.getPools(),i=super.validateInput(t,e,s),a=super.getPaths(t,e,s);if(a.length===0)throw new bt(t,e);let o;if(r)o=await this.toBuySwaps(n,r,i);else{let v=await Promise.all(a.map(C=>this.toBuySwaps(n,C,i)));o=this.findBestBuyRoute(v)}let l=o[o.length-1],u=o[0],d=this.isDirectTrade(o),m=await this.getBuySpot(o),p=u.amountIn,g=d?u.calculatedIn:this.calculateDelta0X(l.amountOut,o,i),P=p-g,b=this.getRouteFeeRange(o),S=d?u.tradeFeePct:B.calculateBuyFee(g,p),f=Math.pow(10,l.assetOutDecimals),T=l.amountOut*m/BigInt(f),I;return g===0n?I=-100:I=B.calculateDiffToRef(T,g),{type:"Buy",amountOut:l.amountOut,amountIn:u.amountIn,spotPrice:m,tradeFee:P,tradeFeePct:S,tradeFeeRange:b,priceImpactPct:I,swaps:o,toHuman(){return{type:"Buy",amountOut:y.toDecimal(l.amountOut,l.assetOutDecimals),amountIn:y.toDecimal(u.amountIn,u.assetInDecimals),spotPrice:y.toDecimal(m,u.assetInDecimals),tradeFee:y.toDecimal(P,u.assetInDecimals),tradeFeePct:S,tradeFeeRange:b,priceImpactPct:I,swaps:o.map(v=>v.toHuman())}}}}calculateDelta0X(t,e,n){let r=[];for(let s=e.length-1;s>=0;s--){let i=e[s],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;s==e.length-1?l=t:l=r[0];let u=a.calculateInGivenOut(o,l);r.unshift(u)}return r[0]}async toBuySwaps(t,e,n){let r=[];for(let s=e.length-1;s>=0;s--){let i=e[s],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;s==e.length-1?l=typeof t=="string"?y.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let u=await this.ctx.getPoolFees(a,o.assetOut),{amountIn:d,calculatedIn:m,feePct:p,errors:g}=a.validateAndBuy(o,l,u),P=this.getPoolFeeRange(u),b=a.spotPriceInGivenOut(o),S=Math.pow(10,o.decimalsOut),f=l*b/BigInt(S),T;m===0n?T=-100:T=B.calculateDiffToRef(f,m),r.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:d,calculatedIn:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===i.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===i.assetIn},toHuman(){return{...i,amountOut:y.toDecimal(l,o.decimalsOut),amountIn:y.toDecimal(d,o.decimalsIn),calculatedIn:y.toDecimal(m,o.decimalsIn),spotPrice:y.toDecimal(b,o.decimalsIn),tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g}}})}return r}};var xn=6e3,qe=1000000000000000n,jt=6,Ne=-5,Ge=216e5,el=3,Sn=6;var He=require("polkadot-api");var W=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:s})=>r==="Stableswap"?{pool:(0,He.Enum)("Stableswap",s),asset_in:e,asset_out:n}:{pool:(0,He.Enum)(r),asset_in:e,asset_out:n})}};var St=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??qe})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,r,s){let[i,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:u}=a,d=l[0],m=l[l.length-1],{assetInDecimals:p}=d,{assetOutDecimals:g}=m,P=Math.abs(u),b=this.getMinimumTradeCount(o,i),S=this.getOptimalTradeCount(P),f=s?Math.round(r/s):S,T=Math.ceil(r/b),I=Math.round(r/S),v=Math.round(r/f),C=o/BigInt(f),k=await this.router.getBestSell(t,e,C),V=o<i,Y=[];V&&Y.push("OrderTooSmall");let tt=k.amountOut*BigInt(f),vt=this.toBlockPeriod(v),rt=k.tradeFee*BigInt(f),ue=W.build(l),Ot={assetIn:t,assetOut:e,errors:Y,frequencyMin:T,frequencyOpt:I,frequency:v,tradeCount:f,tradeFee:rt,tradeImpactPct:k.priceImpactPct,tradePeriod:vt,tradeRoute:ue,type:"Dca"};return{...Ot,amountIn:o,amountOut:tt,tradeAmountIn:k.amountIn,tradeAmountOut:k.amountOut,toHuman(){return{...Ot,amountIn:y.toDecimal(o,p),amountOut:y.toDecimal(tt,g),tradeAmountIn:y.toDecimal(k.amountIn,p),tradeAmountOut:y.toDecimal(k.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),n=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let r=t+n/2n;return Number(r/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[r,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:i,swaps:a,priceImpactPct:o}=s,l=a[0],u=a[a.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),P=i/BigInt(g),b=await this.router.getBestSell(l.assetIn,u.assetOut,P),S=g===1,f=i<r,T=b.priceImpactPct<-5,I=[];f||S?I.push("OrderTooSmall"):T&&I.push("OrderImpactTooBig");let v=b.amountOut*BigInt(g),C=b.tradeFee*BigInt(g),k=W.build(a),V={assetIn:t,assetOut:e,errors:I,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:k,type:"TwapSell"};return{...V,amountIn:i,amountOut:v,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:C,toHuman(){return{...V,amountIn:y.toDecimal(i,d),amountOut:y.toDecimal(v,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(C,m)}}}}async getTwapBuyOrder(t,e,n){let[r,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:i,swaps:a,priceImpactPct:o}=s,l=a[0],u=a[a.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),P=i/BigInt(g),b=await this.router.getBestBuy(l.assetIn,u.assetOut,P),S=b.amountIn*BigInt(g),f=g===1,T=S<r,I=b.priceImpactPct<-5,v=[];T||f?v.push("OrderTooSmall"):I&&v.push("OrderImpactTooBig");let C=b.tradeFee*BigInt(g),k=W.build(a),V={assetIn:t,assetOut:e,errors:v,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:k,type:"TwapBuy"};return{...V,amountIn:S,amountOut:i,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:C,toHuman(){return{...V,amountIn:y.toDecimal(S,d),amountOut:y.toDecimal(i,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(C,d)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let r=216e5/(this.blockTime*6);return Math.round(r)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,n=Math.round(e);return Math.max(n,6)}};var Ve={};O(Ve,{TxBuilderFactory:()=>It});var We=require("polkadot-api");function wn(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var wt=class extends q{evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evmClient=e??new N,this.balanceClient=new H(t),this.aaveUtils=new it(this.evmClient)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:n=>this.dryRun(n,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:de})}async dryRun(t,e){let n=(0,We.Enum)("Signed",t),r=(0,We.Enum)("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,e.decodedCall),a=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(a){let o=wn(a.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var ae=class extends wt{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:r}=e[0],s=await this.balanceClient.getBalance(this.beneficiary,r);return t>=s-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],s=n[n.length-1],i=B.getFraction(t,this.slippagePct),a=r.assetIn,o=s.assetOut,l=t+i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.buy({asset_in:a,asset_out:o,amount:e,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:a,asset_out:o,amount_out:e,max_amount_in:l,route:W.build(n)}),this.wrapTx("RouterBuy",u)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],s=n[n.length-1],i=B.getFraction(e,this.slippagePct),a=r.assetIn,o=s.assetOut,l=e-i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.sell({asset_in:a,asset_out:o,amount:t,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:a,asset_out:o,amount_in:t,min_amount_out:l,route:W.build(n)}),r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("RouterSell",u)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],r=e[e.length-1],s=B.getFraction(t,this.slippagePct),i=n.assetIn,a=r.assetOut,o=t-s,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:a,min_amount_out:o,route:W.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var oe=require("polkadot-api");var le=class extends wt{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradePeriod:s,tradeRoute:i}=this.order,a=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,oe.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:0n,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",a)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:s,tradePeriod:i,tradeRoute:a}=this.order,o=B.getFraction(s,this.slippagePct),l=s-o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,oe.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",u)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:s,tradePeriod:i,tradeRoute:a}=this.order,o=B.getFraction(r,this.slippagePct),l=r+o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,oe.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:s,max_amount_in:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",u)}};var It=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e??new N}trade(t){return new ae(this.client,this.evmClient).setTrade(t)}order(t){return new le(this.client,this.evmClient).setOrder(t)}};async function cr(c,t){let e=new dt(c),[n,r]=await Promise.all([e.getBlockTime(),e.getMinOrderBudget()]),s=t??new N,i=new ft(c).withAave().withOmnipool().withStableswap().withXyk(),a=new it(s),o=new xt(i),l=new St(o,{blockTime:n,minBudgetInNative:r});return{api:{aave:a,router:o,scheduler:l},client:{asset:new pt(c),balance:new H(c),evm:s},ctx:{pool:i},tx:new It(c,s),destroy:()=>{i.destroy()}}}0&&(module.exports={aave,api,big,client,const:null,createSdkContext,erc20,error,evm,fmt,h160,json,math,pool,sor,tx,xc});
|
package/build/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var Ge=Object.defineProperty;var w=(c,t)=>{for(var e in t)Ge(c,e,{get:t[e],enumerable:!0})};var ue={};w(ue,{Papi:()=>F,getWs:()=>Xe});import{hydration as Ue}from"@galacticcouncil/descriptors";function le(c){switch(c){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var F=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(Ue)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");le(n)&&console.log(t,...e)}};import{createClient as We}from"polkadot-api";import{withPolkadotSdkCompat as Ve}from"polkadot-api/polkadot-sdk-compat";var Xe=async c=>{let t=typeof c=="string"?c.split(","):c,s=(typeof window>"u"?(await import("polkadot-api/ws-provider/node")).getWsProvider:(await import("polkadot-api/ws-provider/web")).getWsProvider)(t);return We(Ve(s))};var xe={};w(xe,{AAVE_GAS_LIMIT:()=>Gt,AAVE_LENDING_POOL_ADDRESS:()=>_t,AAVE_POOL_ABI:()=>Nt,AAVE_POOL_DATA_PROVIDER:()=>Bt,AAVE_POOL_DATA_PROVIDER_ABI:()=>At,AAVE_POOL_PROXY:()=>Ht,AAVE_ROUNDING_THRESHOLD:()=>pr,AAVE_UINT_256_MAX:()=>Ye,AaveClient:()=>lt,AaveUtils:()=>Y});var Nt=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"to",type:"address"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"interestRateMode",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"address",name:"onBehalfOf",type:"address"}],name:"borrow",outputs:[],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getUserAccountData",outputs:[{internalType:"uint256",name:"totalCollateralBase",type:"uint256"},{internalType:"uint256",name:"totalDebtBase",type:"uint256"},{internalType:"uint256",name:"availableBorrowsBase",type:"uint256"},{internalType:"uint256",name:"currentLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"ltv",type:"uint256"},{internalType:"uint256",name:"healthFactor",type:"uint256"}],stateMutability:"view",type:"function"}];var At=[{inputs:[{internalType:"contract IEACAggregatorProxy",name:"_networkBaseTokenPriceInUsdProxyAggregator",type:"address"},{internalType:"contract IEACAggregatorProxy",name:"_marketReferenceCurrencyPriceInUsdProxyAggregator",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"ETH_CURRENCY_UNIT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MKR_ADDRESS",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_bytes32",type:"bytes32"}],name:"bytes32ToString",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"decimals",type:"uint256"},{internalType:"uint256",name:"baseLTVasCollateral",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationBonus",type:"uint256"},{internalType:"uint256",name:"reserveFactor",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabled",type:"bool"},{internalType:"bool",name:"borrowingEnabled",type:"bool"},{internalType:"bool",name:"stableBorrowRateEnabled",type:"bool"},{internalType:"bool",name:"isActive",type:"bool"},{internalType:"bool",name:"isFrozen",type:"bool"},{internalType:"uint128",name:"liquidityIndex",type:"uint128"},{internalType:"uint128",name:"variableBorrowIndex",type:"uint128"},{internalType:"uint128",name:"liquidityRate",type:"uint128"},{internalType:"uint128",name:"variableBorrowRate",type:"uint128"},{internalType:"uint128",name:"stableBorrowRate",type:"uint128"},{internalType:"uint40",name:"lastUpdateTimestamp",type:"uint40"},{internalType:"address",name:"aTokenAddress",type:"address"},{internalType:"address",name:"stableDebtTokenAddress",type:"address"},{internalType:"address",name:"variableDebtTokenAddress",type:"address"},{internalType:"address",name:"interestRateStrategyAddress",type:"address"},{internalType:"uint256",name:"availableLiquidity",type:"uint256"},{internalType:"uint256",name:"totalPrincipalStableDebt",type:"uint256"},{internalType:"uint256",name:"averageStableRate",type:"uint256"},{internalType:"uint256",name:"stableDebtLastUpdateTimestamp",type:"uint256"},{internalType:"uint256",name:"totalScaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"priceInMarketReferenceCurrency",type:"uint256"},{internalType:"address",name:"priceOracle",type:"address"},{internalType:"uint256",name:"variableRateSlope1",type:"uint256"},{internalType:"uint256",name:"variableRateSlope2",type:"uint256"},{internalType:"uint256",name:"stableRateSlope1",type:"uint256"},{internalType:"uint256",name:"stableRateSlope2",type:"uint256"},{internalType:"uint256",name:"baseStableBorrowRate",type:"uint256"},{internalType:"uint256",name:"baseVariableBorrowRate",type:"uint256"},{internalType:"uint256",name:"optimalUsageRatio",type:"uint256"},{internalType:"bool",name:"isPaused",type:"bool"},{internalType:"bool",name:"isSiloedBorrowing",type:"bool"},{internalType:"uint128",name:"accruedToTreasury",type:"uint128"},{internalType:"uint128",name:"unbacked",type:"uint128"},{internalType:"uint128",name:"isolationModeTotalDebt",type:"uint128"},{internalType:"bool",name:"flashLoanEnabled",type:"bool"},{internalType:"uint256",name:"debtCeiling",type:"uint256"},{internalType:"uint256",name:"debtCeilingDecimals",type:"uint256"},{internalType:"uint8",name:"eModeCategoryId",type:"uint8"},{internalType:"uint256",name:"borrowCap",type:"uint256"},{internalType:"uint256",name:"supplyCap",type:"uint256"},{internalType:"uint16",name:"eModeLtv",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationThreshold",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationBonus",type:"uint16"},{internalType:"address",name:"eModePriceSource",type:"address"},{internalType:"string",name:"eModeLabel",type:"string"},{internalType:"bool",name:"borrowableInIsolation",type:"bool"}],internalType:"struct IUiPoolDataProviderV3.AggregatedReserveData[]",name:"",type:"tuple[]"},{components:[{internalType:"uint256",name:"marketReferenceCurrencyUnit",type:"uint256"},{internalType:"int256",name:"marketReferenceCurrencyPriceInUsd",type:"int256"},{internalType:"int256",name:"networkBaseTokenPriceInUsd",type:"int256"},{internalType:"uint8",name:"networkBaseTokenPriceDecimals",type:"uint8"}],internalType:"struct IUiPoolDataProviderV3.BaseCurrencyInfo",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"},{internalType:"address",name:"user",type:"address"}],name:"getUserReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"uint256",name:"scaledATokenBalance",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabledOnUser",type:"bool"},{internalType:"uint256",name:"stableBorrowRate",type:"uint256"},{internalType:"uint256",name:"scaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"principalStableDebt",type:"uint256"},{internalType:"uint256",name:"stableBorrowLastUpdateTimestamp",type:"uint256"}],internalType:"struct IUiPoolDataProviderV3.UserReserveData[]",name:"",type:"tuple[]"},{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"marketReferenceCurrencyPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"networkBaseTokenPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"}];var Ht="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Bt="0x112b087b60C1a166130d59266363C45F8aa99db0",_t="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Gt=1000000n,pr=5,Ye=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var de={};w(de,{EvmClient:()=>E,evmMainnet:()=>Ut});import{defineChain as je}from"viem";var ce=["https://hydration-rpc.n.dwellir.com","https://hydration.dotters.network","https://rpc.helikon.io/hydradx","https://hydration.ibp.network","https://rpc.cay.hydration.cloud","https://rpc.parm.hydration.cloud","https://rpc.roach.hydration.cloud","https://rpc.zipp.hydration.cloud","https://rpc.sin.hydration.cloud","https://rpc.coke.hydration.cloud"],pe=["wss://hydration-rpc.n.dwellir.com","wss://hydration.dotters.network","wss://rpc.helikon.io/hydradx","wss://hydration.ibp.network","wss://rpc.cay.hydration.cloud","wss://rpc.parm.hydration.cloud","wss://rpc.roach.hydration.cloud","wss://rpc.zipp.hydration.cloud","wss://rpc.sin.hydration.cloud","wss://rpc.coke.hydration.cloud"],Ut=je({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{public:{http:ce,webSocket:pe},default:{http:ce,webSocket:pe}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});import{createPublicClient as me,createWalletClient as Ke,custom as ze,http as $e,webSocket as Qe}from"viem";var E=class{chain;constructor(t){this.chain=t||Ut}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}async getGasPrice(){return this.getProvider().getGasPrice()}getProvider(){return me({chain:this.chain,transport:$e()})}getWsProvider(){return me({chain:this.chain,transport:Qe()})}getSigner(t){return Ke({account:t,chain:this.chain,transport:ze(window.ethereum)})}};var lt=class{evmClient;constructor(t){this.evmClient=t??new E}async getReservesData(){return await this.evmClient.getProvider().readContract({abi:At,address:Bt,args:[_t],functionName:"getReservesData"})}async getUserReservesData(t){return await this.evmClient.getProvider().readContract({abi:At,address:Bt,args:[_t,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.evmClient.getProvider().readContract({abi:Nt,address:Ht,args:[t],functionName:"getUserAccountData"})}};var b={};w(b,{asBigInt:()=>tn,toBigInt:()=>Ze,toDecimal:()=>Je});import V from"big.js";V.NE=-18;function Je(c,t,e=6,n){let s=V(c.toString()),r=V(10).pow(t);return s.div(r).round(e,n).toString()}function Ze(c,t){let e=V(10).pow(t),s=V(c).mul(e).toFixed(0,V.roundDown);return BigInt(s)}function tn(c){return BigInt(c.round(0,V.roundDown).toFixed(0))}var K={};w(K,{ERC20:()=>Wt});var Wt=class{static fromAssetId(t){let e=Buffer.alloc(20,0);return e[15]=1,e.writeUInt32BE(t,16),"0x"+e.toString("hex")}static toAssetId(t){let e=Buffer.from(t.replace("0x",""),"hex");return e.length!==20||!this.isAssetAddress(t)?null:e.readUInt32BE(16)}static isAssetAddress(t){let e=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(t.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(e.subarray(0,16))}};var y={};w(y,{fromPermill:()=>sn,toDecimals:()=>nn,toPct:()=>en});var ge=1e3;function en(c){let[t,e]=c;return t/e*100}function nn(c){let[t,e]=c;return t/e}function sn(c){return[c/ge,ge]}var Rt={};w(Rt,{H160:()=>jt,isEvmAccount:()=>ye,isEvmAddress:()=>Pe,isSs58Address:()=>fe});import{AccountId as ut}from"polkadot-api";import{toHex as he}from"@polkadot-api/utils";import{Buffer as W}from"buffer";var be={};w(be,{HUB_ASSET_ID:()=>Xt,HYDRATION_OMNIPOOL_ADDRESS:()=>an,HYDRATION_PARACHAIN_ID:()=>rn,HYDRATION_SS58_PREFIX:()=>L,RUNTIME_DECIMALS:()=>D,SYSTEM_ASSET_DECIMALS:()=>Vt,SYSTEM_ASSET_ID:()=>N,TRADEABLE_DEFAULT:()=>z});var D=18,N=0,Vt=12,rn=2034,L=63,an="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Xt=1,z=15;var Yt="ETH\0";function ye(c){if(!c)return!1;try{let t=ut().enc(c),e=W.from(Yt);return W.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Pe(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function fe(c){try{return ut(63).enc(c),!0}catch{return!1}}var jt=class c{static toAccount=t=>{let e=W.from(t.slice(2),"hex"),n=W.from(Yt),s=Uint8Array.from(W.concat([n,e,W.alloc(8)])),r=he(s);return ut(63).dec(r)};static fromAccount=t=>{let e=ut().enc(t),n=W.from(Yt),s=e.slice(n.length,-8);return"0x"+W.from(s).toString("hex")};static fromSS58=t=>{let n=ut().enc(t).slice(0,20);return he(n)};static fromAny=t=>{if(Pe(t))return t;if(ye(t))return c.fromAccount(t);if(fe(t))return c.fromSS58(t);throw new Error("Unknown address type")}};var X={};w(X,{findNestedKey:()=>on,findNestedObj:()=>ln,jsonFormatter:()=>un});var on=(c,t)=>{let e=[];return JSON.stringify(c,(n,s)=>(s&&s[t]&&e.push(s),s)),e[0]},ln=(c,t,e)=>{let n;return JSON.stringify(c,(s,r)=>(r&&r[t]===e&&(n=r),r)),n},un=(c,t)=>typeof t=="bigint"?t.toString():t;var O={};w(O,{calculateBuyFee:()=>dn,calculateDiffToAvg:()=>cn,calculateDiffToRef:()=>pn,calculateSellFee:()=>mn,getFraction:()=>gn});import H from"big.js";function cn(c,t){let e=H(c.toString()),n=H(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function pn(c,t){if(t===0n)return 0;let e=H(c.toString()),n=H(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function mn(c,t){let e=H(c.toString()),n=H(t.toString());return H(1).minus(n.div(e)).mul(100).round(2).toNumber()}function dn(c,t){let e=H(c.toString());return H(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function gn(c,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),s=BigInt(t*n);return c*s/BigInt(100*n)}var Te={};w(Te,{convertToId:()=>hn});import{Buffer as bn}from"buffer";function hn(c){let e=bn.from(c.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Ft}=K,{H160:Kt}=Rt,yn=1.01,Pn=99999,fn=10n**27n,Tn=10n**18n,Y=class{client;constructor(t){let e=t??new E;this.client=new lt(e)}async getSummary(t){let e=Kt.fromAny(t),[n,s,r]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[i]=n,[a,o]=s,[l,u,d,p,m,g]=r,P=b.toDecimal(g,18),h=[];for(let x of a){let f=x.underlyingAsset.toLowerCase(),T=i.find(({underlyingAsset:qt})=>qt.toLowerCase()===f);if(!T)throw new Error("Missing pool reserve for "+f);let I=x.scaledATokenBalance,v=T.liquidityIndex,_=T.priceInMarketReferenceCurrency,R=I*v/fn,Ot=Number(o===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,vt=T.usageAsCollateralEnabled&&x.usageAsCollateralEnabledOnUser&&x.scaledATokenBalance>0n,Lt=Ft.toAssetId(f);h.push({aTokenBalance:R,decimals:Number(T.decimals),isCollateral:vt,priceInRef:_,reserveId:Lt,reserveAsset:f,reserveLiquidationThreshold:Ot})}return{healthFactor:Number(P),totalCollateral:l,totalDebt:u,reserves:h}}async hasBorrowPositions(t){let e=Kt.fromAny(t),n=await this.client.getUserAccountData(e),[s,r]=n;return r>0n}async getHealthFactor(t){let e=Kt.fromAny(t),n=await this.client.getUserAccountData(e),[s,r,i,a,o,l]=n,u=b.toDecimal(l,18);return Number(u)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:s,totalDebt:r,reserves:i}=await this.getSummary(t),a=Ft.fromAssetId(e),o=i.find(h=>h.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,isCollateral:u,priceInRef:d,reserveLiquidationThreshold:p}=o,m=b.toBigInt(n,l),g=u?m*d/10n**BigInt(l):0n,P=s-g;return P<=0n?0:this.calculateHealthFactor(P,p,r)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:s,totalDebt:r,reserves:i}=await this.getSummary(t),a=Ft.fromAssetId(e),o=i.find(P=>P.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,priceInRef:u,reserveLiquidationThreshold:d}=o,m=b.toBigInt(n,l)*u/10n**BigInt(l),g=s+m;return g<=0n?0:this.calculateHealthFactor(g,d,r)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:s,reserves:r}=await this.getSummary(t),i=Ft.fromAssetId(e),a=r.find(o=>o.reserveAsset===i);if(!a)throw new Error("Missing reserve ctx for "+i);return this.calculateWithdrawMax(a,n,s)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:s}=await this.getSummary(t),r={};for(let i of s){let a=this.calculateWithdrawMax(i,e,n);i.reserveId&&(r[i.reserveId]=a)}return r}calculateHealthFactor(t,e,n){if(n===0n)return Pn;let s=10n**6n,r=b.toBigInt(e,18),i=t*r*s,a=n*Tn,o=i/a;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let s=b.toBigInt(t,18),r=b.toBigInt(e,18);return(s*n+r-1n)/r}calculateWithdrawMax(t,e,n){let{aTokenBalance:s,decimals:r,priceInRef:i,reserveLiquidationThreshold:a}=t,o=this.calculateRequiredCollateral(yn,a,n),l=e-o;if(l<=0n)return{amount:0n,decimals:r};let u=l*10n**BigInt(r)/i;return{amount:s<u?s:u,decimals:r}}};var we={};w(we,{AssetClient:()=>$,BalanceClient:()=>q,ChainParams:()=>J});var $=class extends F{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(t){super(t)}async queryShares(){let e=await this.api.query.Stableswap.Pools.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[r]=n;return[r,s]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[r]=n;return[r,s]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:s}=n;return this.SUPPORTED_TYPES.includes(s.type)}).map(({keyArgs:n,value:s})=>{let[r]=n;return[r,s]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[r]=n;return[r,s]}))}async mapToken(t,e,n,s){let{name:r,asset_type:i,is_sufficient:a,existential_deposit:o}=e,{symbol:l,decimals:u}=n.get(t)??{};return{id:t,name:r?.asText(),symbol:l,decimals:u,icon:l,type:i.type,isSufficient:a,location:s,existentialDeposit:o}}async mapBond(t,e,n,s){let[r,i]=s,{asset_type:a,is_sufficient:o,existential_deposit:l}=e,{symbol:u,decimals:d}=await this.mapToken(r,e,n),p=Number(i),m=new Intl.DateTimeFormat("en-GB"),g=[u,"Bond",m.format(p)].join(" ");return{id:t,name:g,symbol:u+"b",decimals:d,icon:u,type:a.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:r,maturity:p}}async mapShares(t,e,n,s){let{assets:r}=s,{name:i,symbol:a,asset_type:o,is_sufficient:l,existential_deposit:u}=e,d=await Promise.all(r.map(async g=>{let{symbol:P}=await this.mapToken(g,e,n);return[g,P]})),p=Object.fromEntries(d),m=Object.values(p);return{id:t,name:m.join(", "),symbol:a?.asText()||i?.asText(),decimals:18,icon:m.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:p}}async mapExternal(t,e,n,s){let r=await this.mapToken(t,e,new Map,s),i=n?.find(a=>a.internalId===r.id);return i?{...r,decimals:i.decimals,name:i.name,symbol:i.symbol,icon:i.symbol,isWhiteListed:i.isWhiteListed}:r}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,s,r,i]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),a=this.parseMetadata(n),o=[];for(let[l,u]of Array.from(n)){let d=s.get(l),{asset_type:p}=u,m;switch(p.type){case"Bond":let g=i.get(l);m=await this.mapBond(l,u,a,g);break;case"StableSwap":let P=r.get(l);m=await this.mapShares(l,u,a,P);break;case"External":m=await this.mapExternal(l,u,e,d);break;default:m=await this.mapToken(l,u,a,d)}o.push(m)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};import{Subject as xn,bufferCount as In,combineLatest as wn,debounceTime as Sn,distinctUntilChanged as Ie,finalize as On,map as Q,pairwise as vn,shareReplay as An,startWith as Bn}from"rxjs";var q=class extends F{constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getTokenBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:{free:n,frozen:s}}=await e.getValue(t);return n-s}async getTokenBalance(t,e){let n=this.api.query.Tokens.Accounts,{free:s,frozen:r}=await n.getValue(t,e);return s-r}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),s=this.subscribeErc20Balance(t);return wn([e,n,s]).pipe(Sn(250),Q(r=>r.flat()),Bn([]),In(2,1),Q(([r,i],a)=>{if(a===0)return i;let o=r.reduce((u,d)=>(u.set(d.id,d.amount),u),new Map);return i.filter(u=>u.amount!==o.get(u.id))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe(Q(n=>{let{free:s,frozen:r}=n.data;return{id:0,amount:s-r}}))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(Q(s=>{let{free:r,frozen:i}=s;return{id:e,amount:r-i}}))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(Ie((n,s)=>!s.deltas),Q(({deltas:n})=>{let s=[];return n?.deleted.forEach(r=>{let[i,a]=r.args;s.push({id:a,amount:0n})}),n?.upserted.forEach(r=>{let[i,a]=r.args,{free:o,frozen:l}=r.value;s.push({id:a,amount:o-l})}),s}))}subscribeErc20Balance(t,e){let n=new xn,s=n.pipe(An(1)),r=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:u}=l;return u.type==="Erc20"}).map(({keyArgs:l})=>{let[u]=l;return u}),i=async()=>{let o=e||await r(),l=async()=>{let p=(await Promise.all(o.map(async m=>{let g=await this.getTokenBalanceData(t,m);return[m,g]}))).map(([m,g])=>({id:m,amount:g}));n.next(p)};await l();let u=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>u.unsubscribe()},a;return i().then(o=>a=o),s.pipe(On(()=>a?.()),vn(),Q(([o,l],u)=>{if(u===0)return l;let d=o.reduce((m,g)=>(m.set(g.id,g.amount),m),new Map);return l.filter(m=>m.amount!==d.get(m.id))}),Ie((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let{free:n,frozen:s}=await this.api.apis.CurrenciesApi.account(e,t);return n-s}};var J=class extends F{_minOrderBudget;_blockTime;constructor(t){super(t)}async getBlockTime(){if(this._blockTime===void 0){let t=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(t)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};var Se={};w(Se,{AssetNotFound:()=>zt,PoolNotFound:()=>ct,RouteNotFound:()=>Z});var zt=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},ct=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},Z=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var Ee={};w(Ee,{PoolContextProvider:()=>nt,PoolError:()=>j,PoolFactory:()=>et,PoolType:()=>A,aave:()=>te,lbp:()=>$t,omni:()=>Qt,stable:()=>Jt,xyk:()=>Zt});var $t={};w($t,{LbpMath:()=>M,LbpPool:()=>pt,LbpPoolClient:()=>mt});import{calculate_in_given_out as _n,calculate_out_given_in as Rn,calculate_linear_weights as Fn,calculate_pool_trade_fee as En,get_spot_price as Dn}from"@galacticcouncil/math-lbp";var M=class{static getSpotPrice(t,e,n,s,r){return Dn(t,e,n,s,r)}static calculateInGivenOut(t,e,n,s,r){return _n(t,e,n,s,r)}static calculateOutGivenIn(t,e,n,s,r){return Rn(t,e,n,s,r)}static calculateLinearWeights(t,e,n,s,r){return Fn(t,e,n,s,r)}static calculatePoolTradeFee(t,e,n){return En(t,e,n)}};var A=(r=>(r.Aave="Aave",r.LBP="LBP",r.Omni="Omnipool",r.Stable="Stableswap",r.XYK="XYK",r))(A||{}),j=(r=>(r.InsufficientTradingAmount="InsufficientTradingAmount",r.MaxInRatioExceeded="MaxInRatioExceeded",r.MaxOutRatioExceeded="MaxOutRatioExceeded",r.TradeNotAllowed="TradeNotAllowed",r.UnknownError="UnknownError",r))(j||{});var pt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,s,r,i,a){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r,this.fee=i,this.repayFeeApply=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),r=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:r.balance,decimalsIn:s.decimals,decimalsOut:r.decimals,weightIn:s.weight,weightOut:r.weight}}validateAndBuy(t,e,n){let s=this.tokens[0].id,r=[];e<this.minTradingLimit&&r.push("InsufficientTradingAmount");let i=t.balanceOut/this.maxOutRatio;if(e>i&&r.push("MaxOutRatioExceeded"),s===t.assetOut){let a=this.calculateTradeFee(e,n),o=y.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+a,u=this.calculateInGivenOut(t,l),d=t.balanceIn/this.maxInRatio;return u>d&&r.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:r}}else{let a=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return a>o&&r.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:r}}}validateAndSell(t,e,n){let s=this.tokens[0].id,r=[];e<this.minTradingLimit&&r.push("InsufficientTradingAmount");let i=t.balanceIn/this.maxInRatio;if(e>i&&r.push("MaxInRatioExceeded"),s===t.assetIn){let a=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return a>o&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:r}}else{let a=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(a,n),l=y.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),u=a-o,d=t.balanceOut/this.maxOutRatio;return u>d&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:u,feePct:l,errors:r}}}calculateInGivenOut(t,e){let n=M.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}calculateOutGivenIn(t,e){let n=M.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}spotPriceInGivenOut(t){let e=M.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=M.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=M.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Hn}from"polkadot-api";import{map as Gn,of as _e,switchMap as Un}from"rxjs";import{memoize1 as kn}from"@thi.ng/memoize";import{combineLatest as Oe,combineLatestAll as Cn,debounceTime as Mn,firstValueFrom as Ln,from as ve,map as Ae,mergeAll as qn,of as Nn,switchMap as Be}from"rxjs";var k=class extends q{override=[];mem=0;memPools=kn(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t){super(t)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=ve(this.getPoolsMem()).pipe(Be(e=>this.subscribe(e)),Cn());return Ln(t)}getSubscriber(){return ve(this.getPoolsMem()).pipe(Be(t=>this.subscribe(t)),qn())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>Oe([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe(Mn(250),Ae(([n,s])=>this.updatePool(n,s))))}subscribePoolBalance(t){if(t.type==="Aave")return Nn([]);let e=[this.subscribeTokensBalance(t.address)];if(this.hasSystemAsset(t)){let n=this.subscribeSystemBalance(t.address);e.push(n)}if(this.hasErc20Asset(t)){let n=t.tokens.filter(r=>r.type==="Erc20").map(r=>r.id),s=this.subscribeErc20Balance(t.address,n);e.push(s)}return Oe(e).pipe(Ae(n=>n.map(s=>Array.isArray(s)?s:[s]).flat()))}hasSystemAsset(t){return t.tokens.some(e=>e.id===0)}hasErc20Asset(t){return t.tokens.some(e=>e.type==="Erc20")}hasValidAssets(t){return t.tokens.every(({id:e,decimals:n,balance:s})=>{let r=this.override.find(a=>a.id===e),i=!!n||!!r?.decimals;return s>0n&&i})}updatePool=(t,e)=>{let n=t.tokens.map(s=>{let r=e.find(a=>a.id===s.id),i=this.override.find(a=>a.id===s.id);return r?{...s,balance:r.amount,decimals:s.decimals||i?.decimals}:{...s,decimals:s.decimals||i?.decimals}});return{...t,tokens:n}}};var mt=class extends k{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),s=e?.relay_parent_number||0,r=t.filter(({value:i})=>e&&this.isActivePool(i,s)).map(async({keyArgs:i,value:a})=>{let[o]=i,l=o.toString(),u=await this.getPoolDelta(l,a,s);return{address:l,type:"LBP",fee:a.fee,...u,...n}});return Promise.all(r)}async getPoolDelta(t,e,n){let{start:s,end:r,assets:i,initial_weight:a,final_weight:o,repay_target:l,fee_collector:u}=e,d=M.calculateLinearWeights(s?s.toString():"0",r?r.toString():"0",a.toString(),o.toString(),n.toString()),[p,m]=i,g=BigInt(d),P=this.MAX_FINAL_WEIGHT-BigInt(g),[h,x,f,T,I]=await Promise.all([this.isRepayFeeApplied(p,l,u.toString()),this.getBalance(t,p),this.api.query.AssetRegistry.Assets.getValue(p),this.getBalance(t,m),this.api.query.AssetRegistry.Assets.getValue(m)]);return{repayFeeApply:h,tokens:[{id:p,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:x,weight:g,type:f?.asset_type.type},{id:m,decimals:I?.decimals,existentialDeposit:I?.existential_deposit,balance:T,weight:P,type:I?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:s}=t;return n&&s?e>=n&&e<s:!1}async isRepayFeeApplied(t,e,n){if(e===0n)return!1;try{return await this.getBalance(n,t)<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t){return{repayFee:await this.getRepayFee(),exchangeFee:t.fee}}getPoolType(){return"LBP"}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(Hn.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe(Un(s=>s?this.getPoolDelta(t.address,n,s.relay_parent_number):_e(t)),Gn(s=>Object.assign({},t,s))):_e(t)}};var Qt={};w(Qt,{OmniMath:()=>S,OmniPool:()=>dt,OmniPoolClient:()=>gt});import{calculate_in_given_out as Wn,calculate_lrna_in_given_out as Vn,calculate_out_given_in as Xn,calculate_out_given_lrna_in as Yn,calculate_spot_price as jn,calculate_lrna_spot_price as Kn,calculate_shares as zn,calculate_liquidity_out as $n,calculate_liquidity_lrna_out as Qn,verify_asset_cap as Jn,calculate_liquidity_hub_in as Zn,is_sell_allowed as ts,is_buy_allowed as es,is_add_liquidity_allowed as ns,is_remove_liquidity_allowed as ss}from"@galacticcouncil/math-omnipool";import tt from"big.js";var S=class{static calculateSpotPrice(t,e,n,s){return jn(t,e,n,s)}static calculateLrnaSpotPrice(t,e){return Kn(t,e)}static calculateInGivenOut(t,e,n,s,r,i,a,o,l){return Wn(t,e,n,s,r,i,a,o,l)}static calculateLrnaInGivenOut(t,e,n,s,r){return Vn(t,e,n,s,r)}static calculateOutGivenIn(t,e,n,s,r,i,a,o,l){return Xn(t,e,n,s,r,i,a,o,l)}static calculateOutGivenLrnaIn(t,e,n,s,r){return Yn(t,e,n,s,r)}static calculateShares(t,e,n,s){return zn(t,e,n,s)}static calculateLiquidityOut(t,e,n,s,r,i,a,o){return $n(t,e,n,s,r,i,a,o)}static calculateLiquidityLRNAOut(t,e,n,s,r,i,a,o){return Qn(t,e,n,s,r,i,a,o)}static calculateCapDifference(t,e,n,s){let r=tt(e),i=tt(t),a=tt(s),o=tt(n),l=tt(10).pow(18),u=o.div(l);if(r.div(a).lt(u)){let p=u.times(a).minus(r).times(i),m=r.times(tt(1).minus(u));return p.div(m).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,s){return Jn(t,e,n,s)}static calculateLimitHubIn(t,e,n,s){return Zn(t,e,n,s)}static isSellAllowed(t){return ts(t)}static isBuyAllowed(t){return es(t)}static isAddLiquidityAllowed(t){return ns(t)}static isRemoveLiquidityAllowed(t){return ss(t)}};var dt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,s,r,i){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r,this.hubAssetId=i}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),r=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:s.hubReserves,hubReservesOut:r.hubReserves,sharesIn:s.shares,sharesOut:r.shares,decimalsIn:s.decimals,decimalsOut:r.decimals,balanceIn:s.balance,balanceOut:r.balance,tradeableIn:s.tradeable,tradeableOut:r.tradeable,assetInEd:s.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),r=this.calculateInGivenOut(t,e,n),i=s===0n?0:O.calculateDiffToRef(r,s),a=[],o=S.isSellAllowed(t.tradeableIn),l=S.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&a.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&a.push("MaxOutRatioExceeded");let d=t.balanceIn/this.maxInRatio;return r>d&&a.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:s,amountOut:e,feePct:i,errors:a}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,n),i=O.calculateDiffToRef(s,r),a=[],o=S.isSellAllowed(t.tradeableIn),l=S.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&a.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&a.push("MaxInRatioExceeded");let d=t.balanceOut/this.maxOutRatio;return r>d&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:r,feePct:i,errors:a}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let s=S.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?y.toDecimals(n.assetFee).toString():"0",n?y.toDecimals(n.protocolFee).toString():"0"),r=BigInt(s);return r<0n?0n:r}calculateLrnaInGivenOut(t,e,n){let s=S.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?y.toDecimals(n.assetFee).toString():"0"),r=BigInt(s);return r<0n?0n:r}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let s=S.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?y.toDecimals(n.assetFee).toString():"0",n?y.toDecimals(n.protocolFee).toString():"0"),r=BigInt(s);return r<0n?0n:r}calculateOutGivenLrnaIn(t,e,n){let s=S.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?y.toDecimals(n.assetFee).toString():"0"),r=BigInt(s);return r<0n?0n:r}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=S.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=S.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=S.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=S.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as rs,CompatibilityLevel as as}from"polkadot-api";import{toHex as is}from"@polkadot-api/utils";import{distinctUntilChanged as os,map as Re}from"rxjs";var gt=class extends k{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,s,r,i,a]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:u,value:d})=>{let[p]=u,{hub_reserve:m,shares:g,tradable:P,cap:h,protocol_shares:x}=d,[f,T]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(p),this.getBalance(e,p)]);return{id:p,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:T,cap:h,hubReserves:m,protocolShares:x,shares:g,tradeable:P,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:i,tradeable:s,type:r?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...a}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=is(e);return rs(63).dec(n)}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t,e){let[n,s,r]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),i=n.min_fee+s.min_fee,a=n.max_fee+s.max_fee;if(r){let{asset_fee:o,protocol_fee:l}=r;return{assetFee:y.fromPermill(o),protocolFee:y.fromPermill(l),min:y.fromPermill(i),max:y.fromPermill(a)}}else return{assetFee:y.fromPermill(n.min_fee),protocolFee:y.fromPermill(s.min_fee),min:y.fromPermill(i),max:y.fromPermill(a)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(as.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(os((n,s)=>!s.deltas),Re(({entries:n})=>n.map(s=>{let[r]=s.args,{hub_reserve:i,shares:a,tradable:o,cap:l,protocol_shares:u}=s.value,d=t.tokens.findIndex(m=>m.id===r);return{...t.tokens[d],cap:l,hubReserves:i,protocolShares:u,shares:a,tradeable:o}})),Re(n=>{let s=t.tokens.find(r=>r.id===1);return{...t,tokens:[...n,s]}}))}};var Jt={};w(Jt,{StableMath:()=>B,StableSwap:()=>bt,StableSwapClient:()=>ht});import{calculate_in_given_out as ls,calculate_out_given_in as us,calculate_amplification as cs,calculate_add_one_asset as ps,calculate_liquidity_out_one_asset as ms,calculate_shares as ds,calculate_shares_for_amount as gs,calculate_spot_price_with_fee as bs,pool_account_name as hs,recalculate_peg as ys}from"@galacticcouncil/math-stableswap";var B=class{static getPoolAddress(t){return hs(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,s,r){return cs(t,e,n,s,r)}static calculateInGivenOut(t,e,n,s,r,i,a){return ls(t,e,n,s,r,i,a)}static calculateAddOneAsset(t,e,n,s,r,i,a){return ps(t,e,n,s,r,i,a)}static calculateSharesForAmount(t,e,n,s,r,i,a){return gs(t,e,n,s,r,i,a)}static calculateOutGivenIn(t,e,n,s,r,i,a){return us(t,e,n,s,r,i,a)}static calculateLiquidityOutOneAsset(t,e,n,s,r,i,a){return ms(t,e,n,s,r,i,a)}static calculateShares(t,e,n,s,r,i){return ds(t,e,n,s,r,i)}static calculateSpotPriceWithFee(t,e,n,s,r,i,a,o){return bs(t,e,n,s,r,i,a,o)}static recalculatePegs(t,e,n,s,r){return ys(t,e,n,s,r)}};var bt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.id,t.fee,t.totalIssuance)}constructor(t,e,n,s,r,i,a,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r,this.amplification=i,this.id=a,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),r=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:r.balance,decimalsIn:s.decimals,decimalsOut:r.decimals,tradeableIn:this.id===t?15:s.tradeable,tradeableOut:this.id===e?15:r.tradeable,assetInEd:s.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),r=this.calculateInGivenOut(t,e,n),i=y.toPct(n.fee),a=[],o=S.isSellAllowed(t.tradeableIn),l=S.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&a.push("InsufficientTradingAmount"),{amountIn:r,calculatedIn:s,amountOut:e,feePct:i,errors:a}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,n),i=y.toPct(n.fee),a=[],o=S.isSellAllowed(t.tradeableIn),l=S.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&a.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:s,amountOut:r,feePct:i,errors:a}}calculateIn(t,e,n){let s=B.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?y.toDecimals(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateAddOneAsset(t,e,n){let s=B.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?y.toDecimals(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateSharesForAmount(t,e,n){let s=B.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?y.toDecimals(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=B.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let s=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(s)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let s=B.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?y.toDecimals(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateWithdrawOneAsset(t,e,n){let s=B.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?y.toDecimals(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateShares(t,e,n){let s=B.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?y.toDecimals(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=B.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let s=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(s)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=B.defaultPegs(this.tokens.length-1);return JSON.stringify(t)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:s})=>({asset_id:e,amount:n,decimals:s}));return JSON.stringify(t,X.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],X.jsonFormatter)}};import{AccountId as Ps,CompatibilityLevel as fs}from"polkadot-api";import{toHex as Ts}from"@polkadot-api/utils";import{blake2b as xs}from"@noble/hashes/blake2b";import{map as Is,of as ws,switchMap as Ss}from"rxjs";var Os=340282366920938463463374607431768211455n,ht=class extends k{poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),s=t.map(async({keyArgs:r,value:i})=>{let[a]=r,o=this.getPoolAddress(a),[l,u]=await Promise.all([this.getPoolDelta(a,i,e),this.getPoolTokens(a,i)]);return this.poolsData.set(o,i),{address:o,id:a,type:"Stableswap",fee:y.fromPermill(i.fee),tokens:u,...l,...n}});return Promise.all(s)}async getPoolDelta(t,e,n){let{initial_amplification:s,final_amplification:r,initial_block:i,final_block:a}=e,o=B.calculateAmplification(s.toString(),r.toString(),i.toString(),a.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),s=e.assets.map(async a=>{let[o,l,u]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,a),this.api.query.AssetRegistry.Assets.getValue(a),this.getBalance(n,a)]);return{id:a,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:u,tradeable:o,type:l?.asset_type.type}}),r=await Promise.all(s),i=await this.api.query.AssetRegistry.Assets.getValue(t);return r.push({id:t,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:Os,tradeable:15,type:i?.asset_type.type}),r}getPoolAddress(t){let e=B.getPoolAddress(t),n=xs(e,{dkLen:32}),s=Ts(n);return Ps(63).dec(s)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolFees(t){return{fee:t.fee}}getPoolType(){return"Stableswap"}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(fs.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?ws(t):e.watchValue("best").pipe(Ss(s=>this.getPoolDelta(t.id,n,s)),Is(s=>Object.assign({},t,s)))}};var Zt={};w(Zt,{XykMath:()=>G,XykPool:()=>yt,XykPoolClient:()=>Pt});import{calculate_in_given_out as vs,calculate_out_given_in as As,calculate_pool_trade_fee as Bs,get_spot_price as _s,calculate_liquidity_in as Rs,calculate_shares as Fs,calculate_spot_price as Es,calculate_spot_price_with_fee as Ds,calculate_liquidity_out_asset_a as ks,calculate_liquidity_out_asset_b as Cs}from"@galacticcouncil/math-xyk";var G=class{static getSpotPrice(t,e,n){return _s(t,e,n)}static calculateInGivenOut(t,e,n){return vs(t,e,n)}static calculateOutGivenIn(t,e,n){return As(t,e,n)}static calculatePoolTradeFee(t,e,n){return Bs(t,e,n)}static calculateLiquidityIn(t,e,n){return Rs(t,e,n)}static calculateSpotPrice(t,e){return Es(t,e)}static calculateSpotPriceWithFee(t,e,n,s){return Ds(t,e,n,s)}static calculateShares(t,e,n){return Fs(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,s){return ks(t,e,n,s)}static calculateLiquidityOutAssetB(t,e,n,s){return Cs(t,e,n,s)}};var yt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,s,r){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),r=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:s.decimals,decimalsOut:r.decimals,balanceIn:s.balance,balanceOut:r.balance,assetInEd:s.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),r=this.calculateTradeFee(s,n),i=y.toPct(n.exchangeFee),a=s+r,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 a>u&&o.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:s,amountOut:e,feePct:i,errors:o}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),r=this.calculateTradeFee(s,n),i=y.toPct(n.exchangeFee),a=s-r,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 a>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:a,feePct:i,errors:o}}calculateInGivenOut(t,e){let n=G.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}calculateOutGivenIn(t,e){let n=G.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}spotPriceInGivenOut(t){let e=G.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=G.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=G.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Ms}from"polkadot-api";import{of as Ls}from"rxjs";var Pt=class extends k{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),s=e.map(async({keyArgs:r,value:i})=>{let[a]=r,[o,l]=i,[u,d,p,m]=await Promise.all([this.getBalance(a,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(a,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:a,type:"XYK",tokens:[{id:o,decimals:d?.decimals,existentialDeposit:d?.existential_deposit,balance:u,type:d?.asset_type.type},{id:l,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:p,type:m?.asset_type.type}],...n}});return Promise.all(s)}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}getPoolType(){return"XYK"}async isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(Ms.BackwardsCompatible,e)}subscribePoolChange(t){return Ls(t)}};var te={};w(te,{AavePool:()=>ft,AavePoolClient:()=>Tt});var ft=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,s,r){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),r=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:r.balance,decimalsIn:s.decimals,decimalsOut:r.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),r=[];return e>t.balanceOut&&r.push("TradeNotAllowed"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:r}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),r=[];return s>t.balanceOut&&r.push("TradeNotAllowed"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:r}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};import{AccountId as qs}from"polkadot-api";import{toHex as Ns}from"@polkadot-api/utils";import{map as Hs,merge as Gs,switchMap as Us}from"rxjs";import{decodeEventLog as Ws}from"viem";var Fe=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:Vs}=K,Xs=["Supply","Withdraw","Repay","Borrow"],Tt=class extends k{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:s,liqudity_in:r,liqudity_out:i})=>{let[a,o,l,u]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(s),this.api.query.AssetRegistry.AssetLocations.getValue(s)]);return{address:this.getPoolId(n,s),type:"Aave",tokens:[{id:n,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:r,location:o,type:a?.asset_type.type},{id:s,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:i,location:u,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:s,liqudity_out:r}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(i=>{let a=i.id===e.id?s:r;return{...i,balance:a}})}getPoolId(t,e){let n=t+"/"+e,s=new TextEncoder().encode(n.padEnd(32,"\0")),r=Ns(s);return qs(63).dec(r)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(t,e){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(t){let[e,n]=t.tokens,s=this.getReserveH160Id(e),r=this.api.event.Router.Executed.watch(({asset_in:a,asset_out:o})=>a===n.id||o===n.id),i=this.api.event.EVM.Log.watch(({log:a})=>{let{topics:o,data:l}=a,u=o.map(g=>g.asHex()),d=l.asHex(),{eventName:p,args:m}=Ws({abi:Fe,topics:u,data:d});return Xs.includes(p)&&m.reserve.toLowerCase()===s.toLowerCase()});return Gs([r,i]).pipe(Us(()=>this.getPoolDelta(t)),Hs(a=>({...t,tokens:[...a]})))}getReserveH160Id(t){return t.type==="Erc20"?X.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Vs.fromAssetId(t.id)}};var et=class{static get(t){switch(t.type){case"Aave":return ft.fromPool(t);case"XYK":return yt.fromPool(t);case"Omnipool":return dt.fromPool(t);case"LBP":return pt.fromPool(t);case"Stableswap":return bt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as Ys,Subscription as xt,takeUntil as js}from"rxjs";var nt=class extends F{lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=xt.EMPTY;omniSub=xt.EMPTY;stableSub=xt.EMPTY;xykSub=xt.EMPTY;aaveSub=xt.EMPTY;isReady=!1;isDestroyed=new Ys;constructor(t){super(t),this.lbpClient=new mt(t),this.omniClient=new gt(t),this.stableClient=new ht(t),this.xykClient=new Pt(t),this.aaveClient=new Tt(t),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe(js(this.isDestroyed)).subscribe(e=>{this.pools.set(e.address,e)})}withOmnipool(){return this.omniSub.unsubscribe(),this.omniSub=this.subscribe(this.omniClient),this.active.add("Omnipool"),this}withStableswap(){return this.stableSub.unsubscribe(),this.stableSub=this.subscribe(this.stableClient),this.active.add("Stableswap"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbpClient),this.active.add("LBP"),this}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aaveClient),this.active.add("Aave"),this}withXyk(t){return this.xykClient.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xykClient),this.active.add("XYK"),this}destroy(){this.isDestroyed.next(!0),this.isDestroyed.complete(),this.active.clear(),this.pools.clear(),this.isReady=!1}async getPools(){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let t=await Promise.all(this.clients.filter(e=>this.active.has(e.getPoolType())).map(e=>e.getPools()));return this.isReady=!0,t.flat()}async getPoolFees(t,e){let n=this.clients.find(s=>s.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new ct(t.type)}};var Me={};w(Me,{DEFAULT_BLOCK_TIME:()=>De,DEFAULT_MIN_BUDGET:()=>se,ORDER_MIN_BLOCK_PERIOD:()=>ke,Router:()=>st,TWAP_BLOCK_PERIOD:()=>St,TWAP_MAX_DURATION:()=>ae,TWAP_MAX_PRICE_IMPACT:()=>re,TWAP_TX_MULTIPLIER:()=>ou,TradeOrderError:()=>ne,TradeOrderType:()=>kt,TradeRouteBuilder:()=>C,TradeRouter:()=>rt,TradeScheduler:()=>at,TradeType:()=>Dt});var Et=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 Ks=5,It=class{isNotVisited(t,e){let n=!0;return e.forEach(s=>{(s[0]===t[0]||s[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let s=[],r=new Et,i=[];for(i.push([e,""]),r.enqueue(i);r.size()>0;){let a=r.dequeue();if(a==null||a.length>Ks)return s;let o=a[a.length-1];(n===null||o[0]===n)&&s.push(a),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,a)){let d=[...a];d.push(u),r.enqueue(d)}})}return s}buildAndPopulateGraph(t,e){let n=new Map;for(let s of t)n.set(parseInt(s),[]);for(let[s,r,i]of e)n.get(r)?.push([i,s]);return n}};function ee(c){let t={};for(let e of c){let n=e.tokens.length;for(let s=0;s<n;s++){t[e.tokens[s].id]||(t[e.tokens[s].id]=[]);for(let r=0;r<n;r++){if(s==r)continue;let i=[e.address,e.tokens[s].id,e.tokens[r].id];t[e.tokens[s].id].push(i)}}}return t}var wt=class{getProposals(t,e,n){let s=ee(n),r=Object.keys(s),i=r.map(u=>s[u]).flat(),a=new It,o=a.buildAndPopulateGraph(r,i),l=a.findPaths(o,t,e);return this.parsePaths(l)}parsePaths(t){let e=[];for(let n of t){let s=[];for(let r=0;r<n.length;r++){let i=n[r],a=n[r+1];if(a==null)break;s.push(this.toEdge(i,a))}e.push(s)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var st=class{routeSuggester;routerOptions;ctx;defaultRouterOptions={useOnly:[]};constructor(t,e){this.ctx=t,this.routeSuggester=new wt,this.routerOptions={...this.defaultRouterOptions,...e}}async getPools(){let t=await this.ctx.getPools(),e=this.routerOptions.useOnly;return e.length===0?t:t.filter(n=>e.includes(n.type))}async getRoutes(t,e){let n=await this.getPools();return this.validateInput(t,e,n),this.getPaths(t,e,n)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}validateInput(t,e,n){if(n.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let s=this.getAssets(n);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(n)}getAssets(t){let e=t.map(n=>n.tokens.map(s=>s.id)).flat().sort((n,s)=>n>s?1:-1);return new Set(e)}getPaths(t,e,n){let s=this.toPoolsMap(n);return this.routeSuggester.getProposals(t,e,n).filter(i=>this.validPath(i,s)).map(i=>this.toHops(i,s))}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,s)=>n&&s)}validEdge([t,e,n],s){return s.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,et.get(e)]))}toHops(t,e){return t.map(([n,s,r])=>{let i=e.get(n);return{poolAddress:n,poolId:i?.id,pool:i?.type,assetIn:s,assetOut:r}})}};var Dt=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Dt||{}),kt=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(kt||{}),ne=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(ne||{});var rt=class extends st{isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,s)=>{let r=n[n.length-1].amountOut,i=s[s.length-1].amountOut;return r>i?-1:1});return e.find(n=>n.every(s=>s.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(r=>r.tradeFeeRange?.[0]??r.tradeFeePct).reduce((r,i)=>r+i),s=t.map(r=>r.tradeFeeRange?.[1]??r.tradeFeePct).reduce((r,i)=>r+i);return[n,s]}}getPoolFeeRange(t){let e=t.min?y.toPct(t.min):void 0,n=t.max?y.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}async getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetOutDecimals).reduce((a,o)=>a+o),s=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),r=n-e.assetOutDecimals,i=Math.pow(10,r);return s/BigInt(i)}async getSell(t,e,n,s){let r=await super.getPools(),i=super.validateInput(t,e,r),a=super.getPaths(t,e,r);if(a.length===0)throw new Z(t,e);let o;if(s)o=await this.toSellSwaps(n,s,i);else{let v=await Promise.all(a.map(_=>this.toSellSwaps(n,_,i)));o=this.findBestSellRoute(v)}let l=o[0],u=o[o.length-1],d=this.isDirectTrade(o),p=await this.getSellSpot(o),m=u.amountOut,g=d?u.calculatedOut:this.calculateDelta0Y(l.amountIn,o,i),P=g-m,h=this.getRouteFeeRange(o),x=d?u.tradeFeePct:O.calculateSellFee(g,m),f=Math.pow(10,l.assetInDecimals),T=l.amountIn*p/BigInt(f),I=O.calculateDiffToRef(g,T);return{type:"Sell",amountIn:l.amountIn,amountOut:u.amountOut,spotPrice:p,tradeFee:P,tradeFeePct:x,tradeFeeRange:h,priceImpactPct:I,swaps:o,toHuman(){return{type:"Sell",amountIn:b.toDecimal(l.amountIn,l.assetInDecimals),amountOut:b.toDecimal(u.amountOut,u.assetOutDecimals),spotPrice:b.toDecimal(p,u.assetOutDecimals),tradeFee:b.toDecimal(P,u.assetOutDecimals),tradeFeePct:x,tradeFeeRange:h,priceImpactPct:I,swaps:o.map(v=>v.toHuman())}}}}calculateDelta0Y(t,e,n){let s=[];for(let r=0;r<e.length;r++){let i=e[r],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;r>0?l=s[r-1]:l=t;let u=a.calculateOutGivenIn(o,l);s.push(u)}return s[s.length-1]}async toSellSwaps(t,e,n){let s=[];for(let r=0;r<e.length;r++){let i=e[r],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;r>0?l=s[r-1].amountOut:l=typeof t=="string"?b.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(a,o.assetOut),{amountOut:d,calculatedOut:p,feePct:m,errors:g}=a.validateAndSell(o,l,u),P=this.getPoolFeeRange(u),h=a.spotPriceOutGivenIn(o),x=Math.pow(10,o.decimalsIn),f=l*h/BigInt(x),T=O.calculateDiffToRef(p,f);s.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:d,calculatedOut:p,spotPrice:h,tradeFeePct:m,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===i.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===i.assetIn},toHuman(){return{...i,amountIn:b.toDecimal(l,o.decimalsIn),amountOut:b.toDecimal(d,o.decimalsOut),calculatedOut:b.toDecimal(p,o.decimalsOut),spotPrice:b.toDecimal(h,o.decimalsOut),tradeFeePct:m,tradeFeeRange:P,priceImpactPct:T,errors:g}}})}return s}async getMostLiquidRoute(t,e){let n=await super.getPools(),s=super.validateInput(t,e,n),r=super.getPaths(t,e,n),o=n.filter(p=>p.tokens.some(m=>m.id===t&&m.id!==p.id)).map(p=>p.type==="Aave"?p.tokens:p.tokens.filter(m=>m.id===t)).map(p=>p.map(m=>m.balance).reduce((m,g)=>m+g)).sort((p,m)=>m<p?-1:1)[0],l=O.getFraction(o,.1),u=await Promise.all(r.map(p=>this.toSellSwaps(l,p,s)));return this.findBestSellRoute(u).map(p=>({poolAddress:p.poolAddress,poolId:p?.poolId,pool:p.pool,assetIn:p.assetIn,assetOut:p.assetOut}))}async getSpotPrice(t,e){let n=await super.getPools(),s=super.validateInput(t,e,n),r=await this.getMostLiquidRoute(t,e),i=await this.toSellSwaps("1",r,s),a=await this.getSellSpot(i),o=i[i.length-1].assetOutDecimals;return{amount:a,decimals:o}}findBestBuyRoute(t){let e=t.sort((n,s)=>{let r=n[0].amountIn,i=s[0].amountIn;return r>i?1:-1});return e.find(n=>n.every(s=>s.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}async getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetInDecimals).reduce((a,o)=>a+o),s=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),r=n-e.assetInDecimals,i=Math.pow(10,r);return s/BigInt(i)}async getBuy(t,e,n,s){let r=await super.getPools(),i=super.validateInput(t,e,r),a=super.getPaths(t,e,r);if(a.length===0)throw new Z(t,e);let o;if(s)o=await this.toBuySwaps(n,s,i);else{let v=await Promise.all(a.map(_=>this.toBuySwaps(n,_,i)));o=this.findBestBuyRoute(v)}let l=o[o.length-1],u=o[0],d=this.isDirectTrade(o),p=await this.getBuySpot(o),m=u.amountIn,g=d?u.calculatedIn:this.calculateDelta0X(l.amountOut,o,i),P=m-g,h=this.getRouteFeeRange(o),x=d?u.tradeFeePct:O.calculateBuyFee(g,m),f=Math.pow(10,l.assetOutDecimals),T=l.amountOut*p/BigInt(f),I;return g===0n?I=-100:I=O.calculateDiffToRef(T,g),{type:"Buy",amountOut:l.amountOut,amountIn:u.amountIn,spotPrice:p,tradeFee:P,tradeFeePct:x,tradeFeeRange:h,priceImpactPct:I,swaps:o,toHuman(){return{type:"Buy",amountOut:b.toDecimal(l.amountOut,l.assetOutDecimals),amountIn:b.toDecimal(u.amountIn,u.assetInDecimals),spotPrice:b.toDecimal(p,u.assetInDecimals),tradeFee:b.toDecimal(P,u.assetInDecimals),tradeFeePct:x,tradeFeeRange:h,priceImpactPct:I,swaps:o.map(v=>v.toHuman())}}}}calculateDelta0X(t,e,n){let s=[];for(let r=e.length-1;r>=0;r--){let i=e[r],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;r==e.length-1?l=t:l=s[0];let u=a.calculateInGivenOut(o,l);s.unshift(u)}return s[0]}async toBuySwaps(t,e,n){let s=[];for(let r=e.length-1;r>=0;r--){let i=e[r],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;r==e.length-1?l=typeof t=="string"?b.toBigInt(t,o.decimalsOut):t:l=s[0].amountIn;let u=await this.ctx.getPoolFees(a,o.assetOut),{amountIn:d,calculatedIn:p,feePct:m,errors:g}=a.validateAndBuy(o,l,u),P=this.getPoolFeeRange(u),h=a.spotPriceInGivenOut(o),x=Math.pow(10,o.decimalsOut),f=l*h/BigInt(x),T;p===0n?T=-100:T=O.calculateDiffToRef(f,p),s.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:d,calculatedIn:p,spotPrice:h,tradeFeePct:m,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===i.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===i.assetIn},toHuman(){return{...i,amountOut:b.toDecimal(l,o.decimalsOut),amountIn:b.toDecimal(d,o.decimalsIn),calculatedIn:b.toDecimal(p,o.decimalsIn),spotPrice:b.toDecimal(h,o.decimalsIn),tradeFeePct:m,tradeFeeRange:P,priceImpactPct:T,errors:g}}})}return s}};var De=6e3,se=1000000000000000n,St=6,re=-5,ae=216e5,ou=3,ke=6;import{Enum as Ce}from"polkadot-api";var C=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:s,poolId:r})=>s==="Stableswap"?{pool:Ce("Stableswap",r),asset_in:e,asset_out:n}:{pool:Ce(s),asset_in:e,asset_out:n})}};var at=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??se})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,s,r){let[i,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:u}=a,d=l[0],p=l[l.length-1],{assetInDecimals:m}=d,{assetOutDecimals:g}=p,P=Math.abs(u),h=this.getMinimumTradeCount(o,i),x=this.getOptimalTradeCount(P),f=r?Math.round(s/r):x,T=Math.ceil(s/h),I=Math.round(s/x),v=Math.round(s/f),_=o/BigInt(f),R=await this.router.getBestSell(t,e,_),U=o<i,Ot=[];U&&Ot.push("OrderTooSmall");let vt=R.amountOut*BigInt(f),Lt=this.toBlockPeriod(v),qt=R.tradeFee*BigInt(f),He=C.build(l),oe={assetIn:t,assetOut:e,errors:Ot,frequencyMin:T,frequencyOpt:I,frequency:v,tradeCount:f,tradeFee:qt,tradeImpactPct:R.priceImpactPct,tradePeriod:Lt,tradeRoute:He,type:"Dca"};return{...oe,amountIn:o,amountOut:vt,tradeAmountIn:R.amountIn,tradeAmountOut:R.amountOut,toHuman(){return{...oe,amountIn:b.toDecimal(o,m),amountOut:b.toDecimal(vt,g),tradeAmountIn:b.toDecimal(R.amountIn,m),tradeAmountOut:b.toDecimal(R.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),n=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let s=t+n/2n;return Number(s/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[s,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:i,swaps:a,priceImpactPct:o}=r,l=a[0],u=a[a.length-1],{assetInDecimals:d}=l,{assetOutDecimals:p}=u,m=Math.abs(o),g=this.getTwapTradeCount(m),P=i/BigInt(g),h=await this.router.getBestSell(l.assetIn,u.assetOut,P),x=g===1,f=i<s,T=h.priceImpactPct<-5,I=[];f||x?I.push("OrderTooSmall"):T&&I.push("OrderImpactTooBig");let v=h.amountOut*BigInt(g),_=h.tradeFee*BigInt(g),R=C.build(a),U={assetIn:t,assetOut:e,errors:I,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:R,type:"TwapSell"};return{...U,amountIn:i,amountOut:v,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:_,toHuman(){return{...U,amountIn:b.toDecimal(i,d),amountOut:b.toDecimal(v,p),tradeAmountIn:b.toDecimal(h.amountIn,d),tradeAmountOut:b.toDecimal(h.amountOut,p),tradeFee:b.toDecimal(_,p)}}}}async getTwapBuyOrder(t,e,n){let[s,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:i,swaps:a,priceImpactPct:o}=r,l=a[0],u=a[a.length-1],{assetInDecimals:d}=l,{assetOutDecimals:p}=u,m=Math.abs(o),g=this.getTwapTradeCount(m),P=i/BigInt(g),h=await this.router.getBestBuy(l.assetIn,u.assetOut,P),x=h.amountIn*BigInt(g),f=g===1,T=x<s,I=h.priceImpactPct<-5,v=[];T||f?v.push("OrderTooSmall"):I&&v.push("OrderImpactTooBig");let _=h.tradeFee*BigInt(g),R=C.build(a),U={assetIn:t,assetOut:e,errors:v,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:R,type:"TwapBuy"};return{...U,amountIn:x,amountOut:i,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:_,toHuman(){return{...U,amountIn:b.toDecimal(x,d),amountOut:b.toDecimal(i,p),tradeAmountIn:b.toDecimal(h.amountIn,d),tradeAmountOut:b.toDecimal(h.amountOut,p),tradeFee:b.toDecimal(_,d)}}}}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,n=Math.round(e);return Math.max(n,6)}};var Ne={};w(Ne,{TxBuilderFactory:()=>ot});import{Enum as qe}from"polkadot-api";function Le(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var it=class extends F{evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evmClient=e??new E,this.balanceClient=new q(t),this.aaveUtils=new Y(this.evmClient)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:n=>this.dryRun(n,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:Gt})}async dryRun(t,e){let n=qe("Signed",t),s=qe("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(s,e.decodedCall),a=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(a){let o=Le(a.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var Ct=class extends it{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:s}=e[0],r=await this.balanceClient.getBalance(this.beneficiary,s);return t>=r-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],r=n[n.length-1],i=O.getFraction(t,this.slippagePct),a=s.assetIn,o=r.assetOut,l=t+i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.buy({asset_in:a,asset_out:o,amount:e,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:a,asset_out:o,amount_out:e,max_amount_in:l,route:C.build(n)}),this.wrapTx("RouterBuy",u)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],r=n[n.length-1],i=O.getFraction(e,this.slippagePct),a=s.assetIn,o=r.assetOut,l=e-i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.sell({asset_in:a,asset_out:o,amount:t,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:a,asset_out:o,amount_in:t,min_amount_out:l,route:C.build(n)}),s.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("RouterSell",u)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],s=e[e.length-1],r=O.getFraction(t,this.slippagePct),i=n.assetIn,a=s.assetOut,o=t-r,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:a,min_amount_out:o,route:C.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as ie}from"polkadot-api";var Mt=class extends it{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradePeriod:r,tradeRoute:i}=this.order,a=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:r,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:ie("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:0n,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",a)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:r,tradePeriod:i,tradeRoute:a}=this.order,o=O.getFraction(r,this.slippagePct),l=r-o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:ie("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",u)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:r,tradePeriod:i,tradeRoute:a}=this.order,o=O.getFraction(s,this.slippagePct),l=s+o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:ie("Buy",{asset_in:e,asset_out:n,amount_out:r,max_amount_in:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",u)}};var ot=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e??new E}trade(t){return new Ct(this.client,this.evmClient).setTrade(t)}order(t){return new Mt(this.client,this.evmClient).setOrder(t)}};async function ic(c,t){let e=new J(c),[n,s]=await Promise.all([e.getBlockTime(),e.getMinOrderBudget()]),r=t??new E,i=new nt(c).withAave().withOmnipool().withStableswap().withXyk(),a=new Y(r),o=new rt(i),l=new at(o,{blockTime:n,minBudgetInNative:s});return{api:{aave:a,router:o,scheduler:l},client:{asset:new $(c),balance:new q(c),evm:r},ctx:{pool:i},tx:new ot(c,r),destroy:()=>{i.destroy()}}}export{xe as aave,ue as api,b as big,we as client,be as const,ic as createSdkContext,K as erc20,Se as error,de as evm,y as fmt,Rt as h160,X as json,O as math,Ee as pool,Me as sor,Ne as tx,Te as xc};
|
|
1
|
+
var Je=Object.defineProperty;var I=(c,t)=>{for(var e in t)Je(c,e,{get:t[e],enumerable:!0})};var be={};I(be,{Papi:()=>E,getWs:()=>nn});import{hydration as Ze}from"@galacticcouncil/descriptors";function ge(c){switch(c){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var E=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(Ze)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");ge(n)&&console.log(t,...e)}};import{createClient as tn}from"polkadot-api";import{withPolkadotSdkCompat as en}from"polkadot-api/polkadot-sdk-compat";var nn=async c=>{let t=typeof c=="string"?c.split(","):c,r=(typeof window>"u"?(await import("polkadot-api/ws-provider/node")).getWsProvider:(await import("polkadot-api/ws-provider/web")).getWsProvider)(t);return tn(en(r))};var Ae={};I(Ae,{AAVE_GAS_LIMIT:()=>Xt,AAVE_LENDING_POOL_ADDRESS:()=>Ct,AAVE_POOL_ABI:()=>Vt,AAVE_POOL_DATA_PROVIDER:()=>Dt,AAVE_POOL_DATA_PROVIDER_ABI:()=>Et,AAVE_POOL_PROXY:()=>Yt,AAVE_ROUNDING_THRESHOLD:()=>Bs,AAVE_UINT_256_MAX:()=>rn,AaveClient:()=>gt,AaveUtils:()=>Q});var Vt=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"to",type:"address"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"interestRateMode",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"address",name:"onBehalfOf",type:"address"}],name:"borrow",outputs:[],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getUserAccountData",outputs:[{internalType:"uint256",name:"totalCollateralBase",type:"uint256"},{internalType:"uint256",name:"totalDebtBase",type:"uint256"},{internalType:"uint256",name:"availableBorrowsBase",type:"uint256"},{internalType:"uint256",name:"currentLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"ltv",type:"uint256"},{internalType:"uint256",name:"healthFactor",type:"uint256"}],stateMutability:"view",type:"function"}];var Et=[{inputs:[{internalType:"contract IEACAggregatorProxy",name:"_networkBaseTokenPriceInUsdProxyAggregator",type:"address"},{internalType:"contract IEACAggregatorProxy",name:"_marketReferenceCurrencyPriceInUsdProxyAggregator",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"ETH_CURRENCY_UNIT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MKR_ADDRESS",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_bytes32",type:"bytes32"}],name:"bytes32ToString",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"decimals",type:"uint256"},{internalType:"uint256",name:"baseLTVasCollateral",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationBonus",type:"uint256"},{internalType:"uint256",name:"reserveFactor",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabled",type:"bool"},{internalType:"bool",name:"borrowingEnabled",type:"bool"},{internalType:"bool",name:"stableBorrowRateEnabled",type:"bool"},{internalType:"bool",name:"isActive",type:"bool"},{internalType:"bool",name:"isFrozen",type:"bool"},{internalType:"uint128",name:"liquidityIndex",type:"uint128"},{internalType:"uint128",name:"variableBorrowIndex",type:"uint128"},{internalType:"uint128",name:"liquidityRate",type:"uint128"},{internalType:"uint128",name:"variableBorrowRate",type:"uint128"},{internalType:"uint128",name:"stableBorrowRate",type:"uint128"},{internalType:"uint40",name:"lastUpdateTimestamp",type:"uint40"},{internalType:"address",name:"aTokenAddress",type:"address"},{internalType:"address",name:"stableDebtTokenAddress",type:"address"},{internalType:"address",name:"variableDebtTokenAddress",type:"address"},{internalType:"address",name:"interestRateStrategyAddress",type:"address"},{internalType:"uint256",name:"availableLiquidity",type:"uint256"},{internalType:"uint256",name:"totalPrincipalStableDebt",type:"uint256"},{internalType:"uint256",name:"averageStableRate",type:"uint256"},{internalType:"uint256",name:"stableDebtLastUpdateTimestamp",type:"uint256"},{internalType:"uint256",name:"totalScaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"priceInMarketReferenceCurrency",type:"uint256"},{internalType:"address",name:"priceOracle",type:"address"},{internalType:"uint256",name:"variableRateSlope1",type:"uint256"},{internalType:"uint256",name:"variableRateSlope2",type:"uint256"},{internalType:"uint256",name:"stableRateSlope1",type:"uint256"},{internalType:"uint256",name:"stableRateSlope2",type:"uint256"},{internalType:"uint256",name:"baseStableBorrowRate",type:"uint256"},{internalType:"uint256",name:"baseVariableBorrowRate",type:"uint256"},{internalType:"uint256",name:"optimalUsageRatio",type:"uint256"},{internalType:"bool",name:"isPaused",type:"bool"},{internalType:"bool",name:"isSiloedBorrowing",type:"bool"},{internalType:"uint128",name:"accruedToTreasury",type:"uint128"},{internalType:"uint128",name:"unbacked",type:"uint128"},{internalType:"uint128",name:"isolationModeTotalDebt",type:"uint128"},{internalType:"bool",name:"flashLoanEnabled",type:"bool"},{internalType:"uint256",name:"debtCeiling",type:"uint256"},{internalType:"uint256",name:"debtCeilingDecimals",type:"uint256"},{internalType:"uint8",name:"eModeCategoryId",type:"uint8"},{internalType:"uint256",name:"borrowCap",type:"uint256"},{internalType:"uint256",name:"supplyCap",type:"uint256"},{internalType:"uint16",name:"eModeLtv",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationThreshold",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationBonus",type:"uint16"},{internalType:"address",name:"eModePriceSource",type:"address"},{internalType:"string",name:"eModeLabel",type:"string"},{internalType:"bool",name:"borrowableInIsolation",type:"bool"}],internalType:"struct IUiPoolDataProviderV3.AggregatedReserveData[]",name:"",type:"tuple[]"},{components:[{internalType:"uint256",name:"marketReferenceCurrencyUnit",type:"uint256"},{internalType:"int256",name:"marketReferenceCurrencyPriceInUsd",type:"int256"},{internalType:"int256",name:"networkBaseTokenPriceInUsd",type:"int256"},{internalType:"uint8",name:"networkBaseTokenPriceDecimals",type:"uint8"}],internalType:"struct IUiPoolDataProviderV3.BaseCurrencyInfo",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"},{internalType:"address",name:"user",type:"address"}],name:"getUserReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"uint256",name:"scaledATokenBalance",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabledOnUser",type:"bool"},{internalType:"uint256",name:"stableBorrowRate",type:"uint256"},{internalType:"uint256",name:"scaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"principalStableDebt",type:"uint256"},{internalType:"uint256",name:"stableBorrowLastUpdateTimestamp",type:"uint256"}],internalType:"struct IUiPoolDataProviderV3.UserReserveData[]",name:"",type:"tuple[]"},{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"marketReferenceCurrencyPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"networkBaseTokenPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"}];var Yt="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Dt="0x112b087b60C1a166130d59266363C45F8aa99db0",Ct="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Xt=1000000n,Bs=5,rn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var fe={};I(fe,{EvmClient:()=>C,evmMainnet:()=>jt});import{defineChain as sn}from"viem";var ye=["https://hydration-rpc.n.dwellir.com","https://hydration.dotters.network","https://rpc.helikon.io/hydradx","https://hydration.ibp.network","https://rpc.cay.hydration.cloud","https://rpc.parm.hydration.cloud","https://rpc.roach.hydration.cloud","https://rpc.zipp.hydration.cloud","https://rpc.sin.hydration.cloud","https://rpc.coke.hydration.cloud"],he=["wss://hydration-rpc.n.dwellir.com","wss://hydration.dotters.network","wss://rpc.helikon.io/hydradx","wss://hydration.ibp.network","wss://rpc.cay.hydration.cloud","wss://rpc.parm.hydration.cloud","wss://rpc.roach.hydration.cloud","wss://rpc.zipp.hydration.cloud","wss://rpc.sin.hydration.cloud","wss://rpc.coke.hydration.cloud"],jt=sn({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{public:{http:ye,webSocket:he},default:{http:ye,webSocket:he}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});import{createPublicClient as Pe,createWalletClient as an,custom as on,http as ln,webSocket as un}from"viem";var C=class{chain;constructor(t){this.chain=t||jt}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}async getGasPrice(){return this.getProvider().getGasPrice()}getProvider(){return Pe({chain:this.chain,transport:ln()})}getWsProvider(){return Pe({chain:this.chain,transport:un()})}getSigner(t){return an({account:t,chain:this.chain,transport:on(window.ethereum)})}};var gt=class{evmClient;constructor(t){this.evmClient=t??new C}async getReservesData(){return await this.evmClient.getProvider().readContract({abi:Et,address:Dt,args:[Ct],functionName:"getReservesData"})}async getUserReservesData(t){return await this.evmClient.getProvider().readContract({abi:Et,address:Dt,args:[Ct,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.evmClient.getProvider().readContract({abi:Vt,address:Yt,args:[t],functionName:"getUserAccountData"})}};var y={};I(y,{asBigInt:()=>pn,toBigInt:()=>mn,toDecimal:()=>cn});import K from"big.js";K.NE=-18;function cn(c,t,e=6,n){let r=K(c.toString()),s=K(10).pow(t);return r.div(s).round(e,n).toString()}function mn(c,t){let e=K(10).pow(t),r=K(c).mul(e).toFixed(0,K.roundDown);return BigInt(r)}function pn(c){return BigInt(c.round(0,K.roundDown).toFixed(0))}var J={};I(J,{ERC20:()=>Kt});var Kt=class{static fromAssetId(t){let e=Buffer.alloc(20,0);return e[15]=1,e.writeUInt32BE(t,16),"0x"+e.toString("hex")}static toAssetId(t){let e=Buffer.from(t.replace("0x",""),"hex");return e.length!==20||!this.isAssetAddress(t)?null:e.readUInt32BE(16)}static isAssetAddress(t){let e=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(t.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(e.subarray(0,16))}};var P={};I(P,{fromPermill:()=>yn,shiftNeg:()=>bt,toDecimals:()=>bn,toPct:()=>gn});import dn from"big.js";var Te=1e3;function gn(c){let[t,e]=c;return t/e*100}function bn(c){let[t,e]=c;return t/e}function yn(c){return[c/Te,Te]}function bt(c,t){let e=dn(typeof c=="bigint"?c.toString():c);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var kt={};I(kt,{H160:()=>Jt,isEvmAccount:()=>we,isEvmAddress:()=>Ie,isSs58Address:()=>ve});import{AccountId as yt}from"polkadot-api";import{toHex as Se}from"@polkadot-api/utils";import{Buffer as X}from"buffer";var xe={};I(xe,{HUB_ASSET_ID:()=>Qt,HYDRATION_OMNIPOOL_ADDRESS:()=>Pn,HYDRATION_PARACHAIN_ID:()=>hn,HYDRATION_SS58_PREFIX:()=>k,RUNTIME_DECIMALS:()=>A,SYSTEM_ASSET_DECIMALS:()=>zt,SYSTEM_ASSET_ID:()=>U,TRADEABLE_DEFAULT:()=>Z});var A=18,U=0,zt=12,hn=2034,k=63,Pn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Qt=1,Z=15;var $t="ETH\0";function we(c){if(!c)return!1;try{let t=yt().enc(c),e=X.from($t);return X.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Ie(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function ve(c){try{return yt(63).enc(c),!0}catch{return!1}}var Jt=class c{static toAccount=t=>{let e=X.from(t.slice(2),"hex"),n=X.from($t),r=Uint8Array.from(X.concat([n,e,X.alloc(8)])),s=Se(r);return yt(63).dec(s)};static fromAccount=t=>{let e=yt().enc(t),n=X.from($t),r=e.slice(n.length,-8);return"0x"+X.from(r).toString("hex")};static fromSS58=t=>{let n=yt().enc(t).slice(0,20);return Se(n)};static fromAny=t=>{if(Ie(t))return t;if(we(t))return c.fromAccount(t);if(ve(t))return c.fromSS58(t);throw new Error("Unknown address type")}};var z={};I(z,{findNestedKey:()=>fn,findNestedObj:()=>Tn,jsonFormatter:()=>xn});var fn=(c,t)=>{let e=[];return JSON.stringify(c,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},Tn=(c,t,e)=>{let n;return JSON.stringify(c,(r,s)=>(s&&s[t]===e&&(n=s),s)),n},xn=(c,t)=>typeof t=="bigint"?t.toString():t;var O={};I(O,{calculateBuyFee:()=>vn,calculateDiffToAvg:()=>Sn,calculateDiffToRef:()=>wn,calculateSellFee:()=>In,getFraction:()=>On});import W from"big.js";function Sn(c,t){let e=W(c.toString()),n=W(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function wn(c,t){if(t===0n)return 0;let e=W(c.toString()),n=W(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function In(c,t){let e=W(c.toString()),n=W(t.toString());return W(1).minus(n.div(e)).mul(100).round(2).toNumber()}function vn(c,t){let e=W(c.toString());return W(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function On(c,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),r=BigInt(t*n);return c*r/BigInt(100*n)}var Oe={};I(Oe,{convertToId:()=>Bn});import{Buffer as An}from"buffer";function Bn(c){let e=An.from(c.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Mt}=J,{H160:Zt}=kt,_n=1.01,Rn=99999,Fn=10n**27n,En=10n**18n,Q=class{client;constructor(t){let e=t??new C;this.client=new gt(e)}async getSummary(t){let e=Zt.fromAny(t),[n,r,s]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[i]=n,[a,o]=r,[l,u,d,m,p,g]=s,h=y.toDecimal(g,18),b=[];for(let x of a){let f=x.underlyingAsset.toLowerCase(),T=i.find(({underlyingAsset:j})=>j.toLowerCase()===f);if(!T)throw new Error("Missing pool reserve for "+f);let S=x.scaledATokenBalance,w=T.liquidityIndex,_=T.priceInMarketReferenceCurrency,R=S*w/Fn,G=Number(o===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,Y=T.usageAsCollateralEnabled&&x.usageAsCollateralEnabledOnUser&&x.scaledATokenBalance>0n,pt=Mt.toAssetId(f);b.push({aTokenBalance:R,decimals:Number(T.decimals),isCollateral:Y,priceInRef:_,reserveId:pt,reserveAsset:f,reserveLiquidationThreshold:G})}return{healthFactor:Number(h),totalCollateral:l,totalDebt:u,reserves:b}}async hasBorrowPositions(t){let e=Zt.fromAny(t),n=await this.client.getUserAccountData(e),[r,s]=n;return s>0n}async getHealthFactor(t){let e=Zt.fromAny(t),n=await this.client.getUserAccountData(e),[r,s,i,a,o,l]=n,u=y.toDecimal(l,18);return Number(u)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:r,totalDebt:s,reserves:i}=await this.getSummary(t),a=Mt.fromAssetId(e),o=i.find(b=>b.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,isCollateral:u,priceInRef:d,reserveLiquidationThreshold:m}=o,p=y.toBigInt(n,l),g=u?p*d/10n**BigInt(l):0n,h=r-g;return h<=0n?0:this.calculateHealthFactor(h,m,s)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:s,reserves:i}=await this.getSummary(t),a=Mt.fromAssetId(e),o=i.find(h=>h.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,priceInRef:u,reserveLiquidationThreshold:d}=o,p=y.toBigInt(n,l)*u/10n**BigInt(l),g=r+p;return g<=0n?0:this.calculateHealthFactor(g,d,s)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:r,reserves:s}=await this.getSummary(t),i=Mt.fromAssetId(e),a=s.find(o=>o.reserveAsset===i);if(!a)throw new Error("Missing reserve ctx for "+i);return this.calculateWithdrawMax(a,n,r)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:r}=await this.getSummary(t),s={};for(let i of r){let a=this.calculateWithdrawMax(i,e,n);i.reserveId&&(s[i.reserveId]=a)}return s}calculateHealthFactor(t,e,n){if(n===0n)return Rn;let r=10n**6n,s=y.toBigInt(e,18),i=t*s*r,a=n*En,o=i/a;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let r=y.toBigInt(t,18),s=y.toBigInt(e,18);return(r*n+s-1n)/s}calculateWithdrawMax(t,e,n){let{aTokenBalance:r,decimals:s,priceInRef:i,reserveLiquidationThreshold:a}=t,o=this.calculateRequiredCollateral(_n,a,n),l=e-o;if(l<=0n)return{amount:0n,decimals:s};let u=l*10n**BigInt(s)/i;return{amount:r<u?r:u,decimals:s}}};var Re={};I(Re,{AssetClient:()=>tt,BalanceClient:()=>M,ChainParams:()=>nt,LiquidityMining:()=>Lt});var tt=class extends E{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(t){super(t)}async queryShares(){let e=await this.api.query.Stableswap.Pools.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[s]=n;return[s,r]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[s]=n;return[s,r]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:r}=n;return this.SUPPORTED_TYPES.includes(r.type)}).map(({keyArgs:n,value:r})=>{let[s]=n;return[s,r]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[s]=n;return[s,r]}))}async mapToken(t,e,n,r){let{name:s,asset_type:i,is_sufficient:a,existential_deposit:o}=e,{symbol:l,decimals:u}=n.get(t)??{};return{id:t,name:s?.asText(),symbol:l,decimals:u,icon:l,type:i.type,isSufficient:a,location:r,existentialDeposit:o}}async mapBond(t,e,n,r){let[s,i]=r,{asset_type:a,is_sufficient:o,existential_deposit:l}=e,{symbol:u,decimals:d}=await this.mapToken(s,e,n),m=Number(i),p=new Intl.DateTimeFormat("en-GB"),g=[u,"Bond",p.format(m)].join(" ");return{id:t,name:g,symbol:u+"b",decimals:d,icon:u,type:a.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:s,maturity:m}}async mapShares(t,e,n,r){let{assets:s}=r,{name:i,symbol:a,asset_type:o,is_sufficient:l,existential_deposit:u}=e,d=await Promise.all(s.map(async g=>{let{symbol:h}=await this.mapToken(g,e,n);return[g,h]})),m=Object.fromEntries(d),p=Object.values(m);return{id:t,name:p.join(", "),symbol:a?.asText()||i?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:m}}async mapExternal(t,e,n,r){let s=await this.mapToken(t,e,new Map,r),i=n?.find(a=>a.internalId===s.id);return i?{...s,decimals:i.decimals,name:i.name,symbol:i.symbol,icon:i.symbol,isWhiteListed:i.isWhiteListed}:s}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,r,s,i]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),a=this.parseMetadata(n),o=[];for(let[l,u]of Array.from(n)){let d=r.get(l),{asset_type:m}=u,p;switch(m.type){case"Bond":let g=i.get(l);p=await this.mapBond(l,u,a,g);break;case"StableSwap":let h=s.get(l);p=await this.mapShares(l,u,a,h);break;case"External":p=await this.mapExternal(l,u,e,d);break;default:p=await this.mapToken(l,u,a,d)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};import{Subject as Dn,bufferCount as Cn,combineLatest as kn,debounceTime as Mn,distinctUntilChanged as Be,finalize as Ln,map as et,pairwise as qn,shareReplay as Nn,startWith as Gn}from"rxjs";var M=class extends E{constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getTokenBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:{free:n,frozen:r}}=await e.getValue(t);return n-r}async getTokenBalance(t,e){let n=this.api.query.Tokens.Accounts,{free:r,frozen:s}=await n.getValue(t,e);return r-s}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),r=this.subscribeErc20Balance(t);return kn([e,n,r]).pipe(Mn(250),et(s=>s.flat()),Gn([]),Cn(2,1),et(([s,i],a)=>{if(a===0)return i;let o=s.reduce((u,d)=>(u.set(d.id,d.amount),u),new Map);return i.filter(u=>u.amount!==o.get(u.id))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe(et(n=>{let{free:r,frozen:s}=n.data;return{id:0,amount:r-s}}))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(et(r=>{let{free:s,frozen:i}=r;return{id:e,amount:s-i}}))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(Be((n,r)=>!r.deltas),et(({deltas:n})=>{let r=[];return n?.deleted.forEach(s=>{let[i,a]=s.args;r.push({id:a,amount:0n})}),n?.upserted.forEach(s=>{let[i,a]=s.args,{free:o,frozen:l}=s.value;r.push({id:a,amount:o-l})}),r}))}subscribeErc20Balance(t,e){let n=new Dn,r=n.pipe(Nn(1)),s=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:u}=l;return u.type==="Erc20"}).map(({keyArgs:l})=>{let[u]=l;return u}),i=async()=>{let o=e||await s(),l=async()=>{let m=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,amount:g}));n.next(m)};await l();let u=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>u.unsubscribe()},a;return i().then(o=>a=o),r.pipe(Ln(()=>a?.()),qn(),et(([o,l],u)=>{if(u===0)return l;let d=o.reduce((p,g)=>(p.set(g.id,g.amount),p),new Map);return l.filter(p=>p.amount!==d.get(p.id))}),Be((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let{free:n,frozen:r}=await this.api.apis.CurrenciesApi.account(e,t);return n-r}};var nt=class extends E{_minOrderBudget;_blockTime;constructor(t){super(t)}async getBlockTime(){if(this._blockTime===void 0){let t=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(t)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};import{AccountId as Hn,Binary as Un,Enum as Wn}from"polkadot-api";import{fixed_from_rational as _e}from"@galacticcouncil/math-liquidity-mining";import D from"big.js";var Vn=BigInt(D(1).pow(18).toString()),Yn=6,Lt=class extends E{balanceClient;omnipoolAssetIds=[];secondsInYear=D(365.2425).times(24).times(60).times(60);constructor(t){super(t),this.balanceClient=new M(t)}async getOraclePrice(t,e){let n=[t,e].sort((s,i)=>s-i);if(t===e)return Vn;let r=await this.api.query.EmaOracle.Oracles.getValue(Un.fromText("omnipool"),n,Wn("TenMinutes"));if(r){let{n:s,d:i}=r[0].price,a;return t<e?a=_e(s.toString(),i.toString()):a=_e(i.toString(),s.toString()),BigInt(a)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),r=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),s=Buffer.from([t]),i=Buffer.concat([n,r,s]),o="0x"+Buffer.concat([i,Buffer.alloc(32-i.length)]).toString("hex");return Hn(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let s=D(r).times(t.toString()).times(e.toString()).div(18);return s.gte(n.toString())?n.toString():s.toString()}getPoolYieldPerPeriod(t,e,n,r){let s=D(t.toString()).times(e),i=D(n.toString()).times(r);return s.div(i.toString()).toString()}farmData(t,e,n){let{yieldFarm:r,globalFarm:s,priceAdjustment:i,balance:a}=t,{multiplier:o,loyalty_curve:l}=r,{blocks_per_period:u,yield_per_period:d,total_shares_z:m,max_reward_per_period:p,pending_rewards:g,accumulated_paid_rewards:h,planned_yielding_periods:b,updated_at:x,incentivized_asset:f,reward_currency:T,price_adjustment:S}=s,w=bt(i??S,18),_=bt(o,18),R=bt(l?.initial_reward_percentage??0,18),N=this.secondsInYear.div(D(Yn).times(u)).toString(),G;if(m<0)G=D(_).times(d.toString()).times(N).toString();else{let Qe=this.getGlobalRewardPerPeriod(m,d,p,w),$e=this.getPoolYieldPerPeriod(Qe,_,m,w);G=D($e).times(N).toString()}let Y=g+h,pt=p*BigInt(b),j=a+Y,Wt=j-Y,dt=D(Wt.toString()).div(p.toString()),pe=D(e).div(u.toString()).toString(),je=(m>=0?dt.plus(x):dt.plus(pe)).toString(),Ke=D(m.toString()).div(D(p.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(w).toFixed(2),de=D(Y.toString()).div(j.toString()).gte(.999);G=de?"0":D(G).div(n?2:1).times(100).toString();let ze=R?D(G).times(R).toString():void 0;return{apr:G,minApr:ze,isDistributed:de,estimatedEndPeriod:je,maxRewards:pt,incentivizedAsset:f,rewardCurrency:T,loyaltyCurve:l,currentPeriod:pe,potMaxRewards:j,fullness:Ke}}async getOmnipoolFarms(t){let e=await this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(Number(t)),r=(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number,s=await Promise.all(e.map(async({keyArgs:i,value:a})=>{let[,o]=i,l=a,u=await this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(o),d=await this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(Number(t),o,l);if(!u||!d)return;let m=u.reward_currency,p=u.incentivized_asset,g=this.getFarmAddress(o),h=await this.getOraclePrice(m,p),b=await this.balanceClient.getTokenBalance(g,m);return{id:t,globalFarm:u,yieldFarm:d,priceAdjustment:h,balance:b}}));return r?s.map(i=>i?this.farmData(i,r):void 0):[]}async getIsolatedFarms(t){let e=await this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t),r=(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number,s=await Promise.all(e.map(async({keyArgs:i,value:a})=>{let[,o]=i,l=a,u=await this.api.query.XYKWarehouseLM.GlobalFarm.getValue(o),d=await this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,o,l);if(!u||!d)return;let m=u.reward_currency,p=u.incentivized_asset,g=this.getFarmAddress(o,!0),h=await this.getOraclePrice(m,p),b=await this.balanceClient.getBalance(g,m);return{id:t,globalFarm:u,yieldFarm:d,priceAdjustment:h,balance:b,farmAddress:g}}));return r?s.map(i=>i?this.farmData(i,r,!0):void 0):[]}};var Fe={};I(Fe,{AssetNotFound:()=>te,PoolNotFound:()=>ht,RouteNotFound:()=>rt});var te=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},ht=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},rt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var Ne={};I(Ne,{PoolContextProvider:()=>at,PoolError:()=>$,PoolFactory:()=>it,PoolType:()=>B,aave:()=>ie,lbp:()=>ee,omni:()=>ne,stable:()=>re,xyk:()=>se});var ee={};I(ee,{LbpMath:()=>H,LbpPool:()=>Pt,LbpPoolClient:()=>ft});import{calculate_in_given_out as Xn,calculate_out_given_in as jn,calculate_linear_weights as Kn,calculate_pool_trade_fee as zn,get_spot_price as Qn}from"@galacticcouncil/math-lbp";var H=class{static getSpotPrice(t,e,n,r,s){return Qn(t,e,n,r,s)}static calculateInGivenOut(t,e,n,r,s){return Xn(t,e,n,r,s)}static calculateOutGivenIn(t,e,n,r,s){return jn(t,e,n,r,s)}static calculateLinearWeights(t,e,n,r,s){return Kn(t,e,n,r,s)}static calculatePoolTradeFee(t,e,n){return zn(t,e,n)}};var B=(s=>(s.Aave="Aave",s.LBP="LBP",s.Omni="Omnipool",s.Stable="Stableswap",s.XYK="XYK",s))(B||{}),$=(s=>(s.InsufficientTradingAmount="InsufficientTradingAmount",s.MaxInRatioExceeded="MaxInRatioExceeded",s.MaxOutRatioExceeded="MaxOutRatioExceeded",s.TradeNotAllowed="TradeNotAllowed",s.UnknownError="UnknownError",s))($||{});var Pt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,r,s,i,a){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s,this.fee=i,this.repayFeeApply=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:s.balance,decimalsIn:r.decimals,decimalsOut:s.decimals,weightIn:r.weight,weightOut:s.weight}}validateAndBuy(t,e,n){let r=this.tokens[0].id,s=[];e<this.minTradingLimit&&s.push("InsufficientTradingAmount");let i=t.balanceOut/this.maxOutRatio;if(e>i&&s.push("MaxOutRatioExceeded"),r===t.assetOut){let a=this.calculateTradeFee(e,n),o=P.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+a,u=this.calculateInGivenOut(t,l),d=t.balanceIn/this.maxInRatio;return u>d&&s.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:s}}else{let a=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return a>o&&s.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:s}}}validateAndSell(t,e,n){let r=this.tokens[0].id,s=[];e<this.minTradingLimit&&s.push("InsufficientTradingAmount");let i=t.balanceIn/this.maxInRatio;if(e>i&&s.push("MaxInRatioExceeded"),r===t.assetIn){let a=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return a>o&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:s}}else{let a=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(a,n),l=P.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),u=a-o,d=t.balanceOut/this.maxOutRatio;return u>d&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:u,feePct:l,errors:s}}}calculateInGivenOut(t,e){let n=H.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=H.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=H.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=H.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=H.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as rr}from"polkadot-api";import{map as sr,of as Me,switchMap as ir}from"rxjs";import{memoize1 as $n}from"@thi.ng/memoize";import{combineLatest as Ee,combineLatestAll as Jn,debounceTime as Zn,firstValueFrom as tr,from as De,map as Ce,mergeAll as er,of as nr,switchMap as ke}from"rxjs";var L=class extends M{override=[];mem=0;memPools=$n(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t){super(t)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=De(this.getPoolsMem()).pipe(ke(e=>this.subscribe(e)),Jn());return tr(t)}getSubscriber(){return De(this.getPoolsMem()).pipe(ke(t=>this.subscribe(t)),er())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>Ee([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe(Zn(250),Ce(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return nr([]);let e=[this.subscribeTokensBalance(t.address)];if(this.hasSystemAsset(t)){let n=this.subscribeSystemBalance(t.address);e.push(n)}if(this.hasErc20Asset(t)){let n=t.tokens.filter(s=>s.type==="Erc20").map(s=>s.id),r=this.subscribeErc20Balance(t.address,n);e.push(r)}return Ee(e).pipe(Ce(n=>n.map(r=>Array.isArray(r)?r:[r]).flat()))}hasSystemAsset(t){return t.tokens.some(e=>e.id===0)}hasErc20Asset(t){return t.tokens.some(e=>e.type==="Erc20")}hasValidAssets(t){return t.tokens.every(({id:e,decimals:n,balance:r})=>{let s=this.override.find(a=>a.id===e),i=!!n||!!s?.decimals;return r>0n&&i})}updatePool=(t,e)=>{let n=t.tokens.map(r=>{let s=e.find(a=>a.id===r.id),i=this.override.find(a=>a.id===r.id);return s?{...r,balance:s.amount,decimals:r.decimals||i?.decimals}:{...r,decimals:r.decimals||i?.decimals}});return{...t,tokens:n}}};var ft=class extends L{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),r=e?.relay_parent_number||0,s=t.filter(({value:i})=>e&&this.isActivePool(i,r)).map(async({keyArgs:i,value:a})=>{let[o]=i,l=o.toString(),u=await this.getPoolDelta(l,a,r);return{address:l,type:"LBP",fee:a.fee,...u,...n}});return Promise.all(s)}async getPoolDelta(t,e,n){let{start:r,end:s,assets:i,initial_weight:a,final_weight:o,repay_target:l,fee_collector:u}=e,d=H.calculateLinearWeights(r?r.toString():"0",s?s.toString():"0",a.toString(),o.toString(),n.toString()),[m,p]=i,g=BigInt(d),h=this.MAX_FINAL_WEIGHT-BigInt(g),[b,x,f,T,S]=await Promise.all([this.isRepayFeeApplied(m,l,u.toString()),this.getBalance(t,m),this.api.query.AssetRegistry.Assets.getValue(m),this.getBalance(t,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:b,tokens:[{id:m,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:x,weight:g,type:f?.asset_type.type},{id:p,decimals:S?.decimals,existentialDeposit:S?.existential_deposit,balance:T,weight:h,type:S?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:r}=t;return n&&r?e>=n&&e<r:!1}async isRepayFeeApplied(t,e,n){if(e===0n)return!1;try{return await this.getBalance(n,t)<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t){return{repayFee:await this.getRepayFee(),exchangeFee:t.fee}}getPoolType(){return"LBP"}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(rr.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe(ir(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):Me(t)),sr(r=>Object.assign({},t,r))):Me(t)}};var ne={};I(ne,{OmniMath:()=>v,OmniPool:()=>Tt,OmniPoolClient:()=>xt});import{calculate_in_given_out as ar,calculate_lrna_in_given_out as or,calculate_out_given_in as lr,calculate_out_given_lrna_in as ur,calculate_spot_price as cr,calculate_lrna_spot_price as mr,calculate_shares as pr,calculate_liquidity_out as dr,calculate_liquidity_lrna_out as gr,verify_asset_cap as br,calculate_liquidity_hub_in as yr,is_sell_allowed as hr,is_buy_allowed as Pr,is_add_liquidity_allowed as fr,is_remove_liquidity_allowed as Tr}from"@galacticcouncil/math-omnipool";import st from"big.js";var v=class{static calculateSpotPrice(t,e,n,r){return cr(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return mr(t,e)}static calculateInGivenOut(t,e,n,r,s,i,a,o,l){return ar(t,e,n,r,s,i,a,o,l)}static calculateLrnaInGivenOut(t,e,n,r,s){return or(t,e,n,r,s)}static calculateOutGivenIn(t,e,n,r,s,i,a,o,l){return lr(t,e,n,r,s,i,a,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,s){return ur(t,e,n,r,s)}static calculateShares(t,e,n,r){return pr(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,s,i,a,o){return dr(t,e,n,r,s,i,a,o)}static calculateLiquidityLRNAOut(t,e,n,r,s,i,a,o){return gr(t,e,n,r,s,i,a,o)}static calculateCapDifference(t,e,n,r){let s=st(e),i=st(t),a=st(r),o=st(n),l=st(10).pow(18),u=o.div(l);if(s.div(a).lt(u)){let m=u.times(a).minus(s).times(i),p=s.times(st(1).minus(u));return m.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return br(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return yr(t,e,n,r)}static isSellAllowed(t){return hr(t)}static isBuyAllowed(t){return Pr(t)}static isAddLiquidityAllowed(t){return fr(t)}static isRemoveLiquidityAllowed(t){return Tr(t)}};var Tt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,r,s,i){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s,this.hubAssetId=i}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:r.hubReserves,hubReservesOut:s.hubReserves,sharesIn:r.shares,sharesOut:s.shares,decimalsIn:r.decimals,decimalsOut:s.decimals,balanceIn:r.balance,balanceOut:s.balance,tradeableIn:r.tradeable,tradeableOut:s.tradeable,assetInEd:r.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),s=this.calculateInGivenOut(t,e,n),i=r===0n?0:O.calculateDiffToRef(s,r),a=[],o=v.isSellAllowed(t.tradeableIn),l=v.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&a.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&a.push("MaxOutRatioExceeded");let d=t.balanceIn/this.maxInRatio;return s>d&&a.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:r,amountOut:e,feePct:i,errors:a}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),s=this.calculateOutGivenIn(t,e,n),i=O.calculateDiffToRef(r,s),a=[],o=v.isSellAllowed(t.tradeableIn),l=v.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&a.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&a.push("MaxInRatioExceeded");let d=t.balanceOut/this.maxOutRatio;return s>d&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:s,feePct:i,errors:a}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let r=v.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?P.toDecimals(n.assetFee).toString():"0",n?P.toDecimals(n.protocolFee).toString():"0"),s=BigInt(r);return s<0n?0n:s}calculateLrnaInGivenOut(t,e,n){let r=v.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?P.toDecimals(n.assetFee).toString():"0"),s=BigInt(r);return s<0n?0n:s}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let r=v.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?P.toDecimals(n.assetFee).toString():"0",n?P.toDecimals(n.protocolFee).toString():"0"),s=BigInt(r);return s<0n?0n:s}calculateOutGivenLrnaIn(t,e,n){let r=v.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?P.toDecimals(n.assetFee).toString():"0"),s=BigInt(r);return s<0n?0n:s}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()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=v.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}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()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=v.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as xr,CompatibilityLevel as Sr}from"polkadot-api";import{toHex as wr}from"@polkadot-api/utils";import{distinctUntilChanged as Ir,map as Le}from"rxjs";var xt=class extends L{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,r,s,i,a]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:u,value:d})=>{let[m]=u,{hub_reserve:p,shares:g,tradable:h,cap:b,protocol_shares:x}=d,[f,T]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(m),this.getBalance(e,m)]);return{id:m,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:T,cap:b,hubReserves:p,protocolShares:x,shares:g,tradeable:h,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:i,tradeable:r,type:s?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...a}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=wr(e);return xr(63).dec(n)}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t,e){let[n,r,s]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),i=n.min_fee+r.min_fee,a=n.max_fee+r.max_fee;if(s){let{asset_fee:o,protocol_fee:l}=s;return{assetFee:P.fromPermill(o),protocolFee:P.fromPermill(l),min:P.fromPermill(i),max:P.fromPermill(a)}}else return{assetFee:P.fromPermill(n.min_fee),protocolFee:P.fromPermill(r.min_fee),min:P.fromPermill(i),max:P.fromPermill(a)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(Sr.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(Ir((n,r)=>!r.deltas),Le(({entries:n})=>n.map(r=>{let[s]=r.args,{hub_reserve:i,shares:a,tradable:o,cap:l,protocol_shares:u}=r.value,d=t.tokens.findIndex(p=>p.id===s);return{...t.tokens[d],cap:l,hubReserves:i,protocolShares:u,shares:a,tradeable:o}})),Le(n=>{let r=t.tokens.find(s=>s.id===1);return{...t,tokens:[...n,r]}}))}};var re={};I(re,{StableMath:()=>F,StableSwap:()=>St,StableSwapClient:()=>wt});import{calculate_in_given_out as vr,calculate_out_given_in as Or,calculate_amplification as Ar,calculate_add_one_asset as Br,calculate_liquidity_out_one_asset as _r,calculate_shares as Rr,calculate_shares_for_amount as Fr,calculate_spot_price_with_fee as Er,pool_account_name as Dr,recalculate_peg as Cr}from"@galacticcouncil/math-stableswap";var F=class{static getPoolAddress(t){return Dr(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,r,s){return Ar(t,e,n,r,s)}static calculateInGivenOut(t,e,n,r,s,i,a){return vr(t,e,n,r,s,i,a)}static calculateAddOneAsset(t,e,n,r,s,i,a){return Br(t,e,n,r,s,i,a)}static calculateSharesForAmount(t,e,n,r,s,i,a){return Fr(t,e,n,r,s,i,a)}static calculateOutGivenIn(t,e,n,r,s,i,a){return Or(t,e,n,r,s,i,a)}static calculateLiquidityOutOneAsset(t,e,n,r,s,i,a){return _r(t,e,n,r,s,i,a)}static calculateShares(t,e,n,r,s,i){return Rr(t,e,n,r,s,i)}static calculateSpotPriceWithFee(t,e,n,r,s,i,a,o){return Er(t,e,n,r,s,i,a,o)}static recalculatePegs(t,e,n,r,s){return Cr(t,e,n,r,s)}};var St=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.id,t.fee,t.totalIssuance)}constructor(t,e,n,r,s,i,a,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s,this.amplification=i,this.id=a,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:s.balance,decimalsIn:r.decimals,decimalsOut:s.decimals,tradeableIn:this.id===t?15:r.tradeable,tradeableOut:this.id===e?15:s.tradeable,assetInEd:r.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),s=this.calculateInGivenOut(t,e,n),i=P.toPct(n.fee),a=[],o=v.isSellAllowed(t.tradeableIn),l=v.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&a.push("InsufficientTradingAmount"),{amountIn:s,calculatedIn:r,amountOut:e,feePct:i,errors:a}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),s=this.calculateOutGivenIn(t,e,n),i=P.toPct(n.fee),a=[],o=v.isSellAllowed(t.tradeableIn),l=v.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&a.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:r,amountOut:s,feePct:i,errors:a}}calculateIn(t,e,n){let r=F.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateAddOneAsset(t,e,n){let r=F.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateSharesForAmount(t,e,n){let r=F.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=F.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let r=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let r=F.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateWithdrawOneAsset(t,e,n){let r=F.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateShares(t,e,n){let r=F.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=F.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let r=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=F.defaultPegs(this.tokens.length-1);return JSON.stringify(t)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:r})=>({asset_id:e,amount:n,decimals:r}));return JSON.stringify(t,z.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],z.jsonFormatter)}};import{AccountId as kr,CompatibilityLevel as Mr}from"polkadot-api";import{toHex as Lr}from"@polkadot-api/utils";import{blake2b as qr}from"@noble/hashes/blake2b";import{map as Nr,of as Gr,switchMap as Hr}from"rxjs";var Ur=340282366920938463463374607431768211455n,wt=class extends L{poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),r=t.map(async({keyArgs:s,value:i})=>{let[a]=s,o=this.getPoolAddress(a),[l,u]=await Promise.all([this.getPoolDelta(a,i,e),this.getPoolTokens(a,i)]);return this.poolsData.set(o,i),{address:o,id:a,type:"Stableswap",fee:P.fromPermill(i.fee),tokens:u,...l,...n}});return Promise.all(r)}async getPoolDelta(t,e,n){let{initial_amplification:r,final_amplification:s,initial_block:i,final_block:a}=e,o=F.calculateAmplification(r.toString(),s.toString(),i.toString(),a.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),r=e.assets.map(async a=>{let[o,l,u]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,a),this.api.query.AssetRegistry.Assets.getValue(a),this.getBalance(n,a)]);return{id:a,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:u,tradeable:o,type:l?.asset_type.type}}),s=await Promise.all(r),i=await this.api.query.AssetRegistry.Assets.getValue(t);return s.push({id:t,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:Ur,tradeable:15,type:i?.asset_type.type}),s}getPoolAddress(t){let e=F.getPoolAddress(t),n=qr(e,{dkLen:32}),r=Lr(n);return kr(63).dec(r)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolFees(t){return{fee:t.fee}}getPoolType(){return"Stableswap"}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(Mr.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?Gr(t):e.watchValue("best").pipe(Hr(r=>this.getPoolDelta(t.id,n,r)),Nr(r=>Object.assign({},t,r)))}};var se={};I(se,{XykMath:()=>V,XykPool:()=>It,XykPoolClient:()=>vt});import{calculate_in_given_out as Wr,calculate_out_given_in as Vr,calculate_pool_trade_fee as Yr,get_spot_price as Xr,calculate_liquidity_in as jr,calculate_shares as Kr,calculate_spot_price as zr,calculate_spot_price_with_fee as Qr,calculate_liquidity_out_asset_a as $r,calculate_liquidity_out_asset_b as Jr}from"@galacticcouncil/math-xyk";var V=class{static getSpotPrice(t,e,n){return Xr(t,e,n)}static calculateInGivenOut(t,e,n){return Wr(t,e,n)}static calculateOutGivenIn(t,e,n){return Vr(t,e,n)}static calculatePoolTradeFee(t,e,n){return Yr(t,e,n)}static calculateLiquidityIn(t,e,n){return jr(t,e,n)}static calculateSpotPrice(t,e){return zr(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return Qr(t,e,n,r)}static calculateShares(t,e,n){return Kr(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return $r(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return Jr(t,e,n,r)}};var It=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,s){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:r.decimals,decimalsOut:s.decimals,balanceIn:r.balance,balanceOut:s.balance,assetInEd:r.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),s=this.calculateTradeFee(r,n),i=P.toPct(n.exchangeFee),a=r+s,o=[];(e<this.minTradingLimit||r<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return a>u&&o.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:i,errors:o}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),s=this.calculateTradeFee(r,n),i=P.toPct(n.exchangeFee),a=r-s,o=[];(e<this.minTradingLimit||r<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return a>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:i,errors:o}}calculateInGivenOut(t,e){let n=V.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=V.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=V.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=V.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=V.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Zr}from"polkadot-api";import{of as ts}from"rxjs";var vt=class extends L{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),r=e.map(async({keyArgs:s,value:i})=>{let[a]=s,[o,l]=i,[u,d,m,p]=await Promise.all([this.getBalance(a,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(a,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:a,type:"XYK",tokens:[{id:o,decimals:d?.decimals,existentialDeposit:d?.existential_deposit,balance:u,type:d?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:m,type:p?.asset_type.type}],...n}});return Promise.all(r)}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}getPoolType(){return"XYK"}async isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(Zr.BackwardsCompatible,e)}subscribePoolChange(t){return ts(t)}};var ie={};I(ie,{AavePool:()=>Ot,AavePoolClient:()=>At});var Ot=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,s){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:s.balance,decimalsIn:r.decimals,decimalsOut:s.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),s=[];return e>t.balanceOut&&s.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),s=[];return r>t.balanceOut&&s.push("TradeNotAllowed"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:s}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};import{AccountId as es}from"polkadot-api";import{toHex as ns}from"@polkadot-api/utils";import{map as rs,merge as ss,switchMap as is}from"rxjs";import{decodeEventLog as as}from"viem";var qe=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:os}=J,ls=["Supply","Withdraw","Repay","Borrow"],At=class extends L{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:r,liqudity_in:s,liqudity_out:i})=>{let[a,o,l,u]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(r),this.api.query.AssetRegistry.AssetLocations.getValue(r)]);return{address:this.getPoolId(n,r),type:"Aave",tokens:[{id:n,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:s,location:o,type:a?.asset_type.type},{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:i,location:u,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:r,liqudity_out:s}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(i=>{let a=i.id===e.id?r:s;return{...i,balance:a}})}getPoolId(t,e){let n=t+"/"+e,r=new TextEncoder().encode(n.padEnd(32,"\0")),s=ns(r);return es(63).dec(s)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(t,e){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(t){let[e,n]=t.tokens,r=this.getReserveH160Id(e),s=this.api.event.Router.Executed.watch(({asset_in:a,asset_out:o})=>a===n.id||o===n.id),i=this.api.event.EVM.Log.watch(({log:a})=>{let{topics:o,data:l}=a,u=o.map(g=>g.asHex()),d=l.asHex(),{eventName:m,args:p}=as({abi:qe,topics:u,data:d});return ls.includes(m)&&p.reserve.toLowerCase()===r.toLowerCase()});return ss([s,i]).pipe(is(()=>this.getPoolDelta(t)),rs(a=>({...t,tokens:[...a]})))}getReserveH160Id(t){return t.type==="Erc20"?z.findNestedKey(t.location,"AccountKey20").AccountKey20.key:os.fromAssetId(t.id)}};var it=class{static get(t){switch(t.type){case"Aave":return Ot.fromPool(t);case"XYK":return It.fromPool(t);case"Omnipool":return Tt.fromPool(t);case"LBP":return Pt.fromPool(t);case"Stableswap":return St.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as us,Subscription as Bt,takeUntil as cs}from"rxjs";var at=class extends E{lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=Bt.EMPTY;omniSub=Bt.EMPTY;stableSub=Bt.EMPTY;xykSub=Bt.EMPTY;aaveSub=Bt.EMPTY;isReady=!1;isDestroyed=new us;constructor(t){super(t),this.lbpClient=new ft(t),this.omniClient=new xt(t),this.stableClient=new wt(t),this.xykClient=new vt(t),this.aaveClient=new At(t),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe(cs(this.isDestroyed)).subscribe(e=>{this.pools.set(e.address,e)})}withOmnipool(){return this.omniSub.unsubscribe(),this.omniSub=this.subscribe(this.omniClient),this.active.add("Omnipool"),this}withStableswap(){return this.stableSub.unsubscribe(),this.stableSub=this.subscribe(this.stableClient),this.active.add("Stableswap"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbpClient),this.active.add("LBP"),this}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aaveClient),this.active.add("Aave"),this}withXyk(t){return this.xykClient.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xykClient),this.active.add("XYK"),this}destroy(){this.isDestroyed.next(!0),this.isDestroyed.complete(),this.active.clear(),this.pools.clear(),this.isReady=!1}async getPools(){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let t=await Promise.all(this.clients.filter(e=>this.active.has(e.getPoolType())).map(e=>e.getPools()));return this.isReady=!0,t.flat()}async getPoolFees(t,e){let n=this.clients.find(r=>r.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new ht(t.type)}};var We={};I(We,{DEFAULT_BLOCK_TIME:()=>Ge,DEFAULT_MIN_BUDGET:()=>le,ORDER_MIN_BLOCK_PERIOD:()=>He,Router:()=>ot,TWAP_BLOCK_PERIOD:()=>Ft,TWAP_MAX_DURATION:()=>ce,TWAP_MAX_PRICE_IMPACT:()=>ue,TWAP_TX_MULTIPLIER:()=>Mu,TradeOrderError:()=>oe,TradeOrderType:()=>Gt,TradeRouteBuilder:()=>q,TradeRouter:()=>lt,TradeScheduler:()=>ut,TradeType:()=>Nt});var qt=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 ms=5,_t=class{isNotVisited(t,e){let n=!0;return e.forEach(r=>{(r[0]===t[0]||r[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let r=[],s=new qt,i=[];for(i.push([e,""]),s.enqueue(i);s.size()>0;){let a=s.dequeue();if(a==null||a.length>ms)return r;let o=a[a.length-1];(n===null||o[0]===n)&&r.push(a),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,a)){let d=[...a];d.push(u),s.enqueue(d)}})}return r}buildAndPopulateGraph(t,e){let n=new Map;for(let r of t)n.set(parseInt(r),[]);for(let[r,s,i]of e)n.get(s)?.push([i,r]);return n}};function ae(c){let t={};for(let e of c){let n=e.tokens.length;for(let r=0;r<n;r++){t[e.tokens[r].id]||(t[e.tokens[r].id]=[]);for(let s=0;s<n;s++){if(r==s)continue;let i=[e.address,e.tokens[r].id,e.tokens[s].id];t[e.tokens[r].id].push(i)}}}return t}var Rt=class{getProposals(t,e,n){let r=ae(n),s=Object.keys(r),i=s.map(u=>r[u]).flat(),a=new _t,o=a.buildAndPopulateGraph(s,i),l=a.findPaths(o,t,e);return this.parsePaths(l)}parsePaths(t){let e=[];for(let n of t){let r=[];for(let s=0;s<n.length;s++){let i=n[s],a=n[s+1];if(a==null)break;r.push(this.toEdge(i,a))}e.push(r)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var ot=class{routeSuggester;routerOptions;ctx;defaultRouterOptions={useOnly:[]};constructor(t,e){this.ctx=t,this.routeSuggester=new Rt,this.routerOptions={...this.defaultRouterOptions,...e}}async getPools(){let t=await this.ctx.getPools(),e=this.routerOptions.useOnly;return e.length===0?t:t.filter(n=>e.includes(n.type))}async getRoutes(t,e){let n=await this.getPools();return this.validateInput(t,e,n),this.getPaths(t,e,n)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}validateInput(t,e,n){if(n.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let r=this.getAssets(n);if(!r.has(t))throw new Error(t+" is not supported asset");if(!r.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(r=>r.id)).flat().sort((n,r)=>n>r?1:-1);return new Set(e)}getPaths(t,e,n){let r=this.toPoolsMap(n);return this.routeSuggester.getProposals(t,e,n).filter(i=>this.validPath(i,r)).map(i=>this.toHops(i,r))}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,r)=>n&&r)}validEdge([t,e,n],r){return r.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,it.get(e)]))}toHops(t,e){return t.map(([n,r,s])=>{let i=e.get(n);return{poolAddress:n,poolId:i?.id,pool:i?.type,assetIn:r,assetOut:s}})}};var Nt=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Nt||{}),Gt=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(Gt||{}),oe=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(oe||{});var lt=class extends ot{isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,r)=>{let s=n[n.length-1].amountOut,i=r[r.length-1].amountOut;return s>i?-1:1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(s=>s.tradeFeeRange?.[0]??s.tradeFeePct).reduce((s,i)=>s+i),r=t.map(s=>s.tradeFeeRange?.[1]??s.tradeFeePct).reduce((s,i)=>s+i);return[n,r]}}getPoolFeeRange(t){let e=t.min?P.toPct(t.min):void 0,n=t.max?P.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}async getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetOutDecimals).reduce((a,o)=>a+o),r=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),s=n-e.assetOutDecimals,i=Math.pow(10,s);return r/BigInt(i)}async getSell(t,e,n,r){let s=await super.getPools(),i=super.validateInput(t,e,s),a=super.getPaths(t,e,s);if(a.length===0)throw new rt(t,e);let o;if(r)o=await this.toSellSwaps(n,r,i);else{let w=await Promise.all(a.map(_=>this.toSellSwaps(n,_,i)));o=this.findBestSellRoute(w)}let l=o[0],u=o[o.length-1],d=this.isDirectTrade(o),m=await this.getSellSpot(o),p=u.amountOut,g=d?u.calculatedOut:this.calculateDelta0Y(l.amountIn,o,i),h=g-p,b=this.getRouteFeeRange(o),x=d?u.tradeFeePct:O.calculateSellFee(g,p),f=Math.pow(10,l.assetInDecimals),T=l.amountIn*m/BigInt(f),S=O.calculateDiffToRef(g,T);return{type:"Sell",amountIn:l.amountIn,amountOut:u.amountOut,spotPrice:m,tradeFee:h,tradeFeePct:x,tradeFeeRange:b,priceImpactPct:S,swaps:o,toHuman(){return{type:"Sell",amountIn:y.toDecimal(l.amountIn,l.assetInDecimals),amountOut:y.toDecimal(u.amountOut,u.assetOutDecimals),spotPrice:y.toDecimal(m,u.assetOutDecimals),tradeFee:y.toDecimal(h,u.assetOutDecimals),tradeFeePct:x,tradeFeeRange:b,priceImpactPct:S,swaps:o.map(w=>w.toHuman())}}}}calculateDelta0Y(t,e,n){let r=[];for(let s=0;s<e.length;s++){let i=e[s],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;s>0?l=r[s-1]:l=t;let u=a.calculateOutGivenIn(o,l);r.push(u)}return r[r.length-1]}async toSellSwaps(t,e,n){let r=[];for(let s=0;s<e.length;s++){let i=e[s],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;s>0?l=r[s-1].amountOut:l=typeof t=="string"?y.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(a,o.assetOut),{amountOut:d,calculatedOut:m,feePct:p,errors:g}=a.validateAndSell(o,l,u),h=this.getPoolFeeRange(u),b=a.spotPriceOutGivenIn(o),x=Math.pow(10,o.decimalsIn),f=l*b/BigInt(x),T=O.calculateDiffToRef(m,f);r.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:d,calculatedOut:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:h,priceImpactPct:T,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===i.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===i.assetIn},toHuman(){return{...i,amountIn:y.toDecimal(l,o.decimalsIn),amountOut:y.toDecimal(d,o.decimalsOut),calculatedOut:y.toDecimal(m,o.decimalsOut),spotPrice:y.toDecimal(b,o.decimalsOut),tradeFeePct:p,tradeFeeRange:h,priceImpactPct:T,errors:g}}})}return r}async getMostLiquidRoute(t,e){let n=await super.getPools(),r=super.validateInput(t,e,n),s=super.getPaths(t,e,n),o=n.filter(m=>m.tokens.some(p=>p.id===t&&p.id!==m.id)).map(m=>m.type==="Aave"?m.tokens:m.tokens.filter(p=>p.id===t)).map(m=>m.map(p=>p.balance).reduce((p,g)=>p+g)).sort((m,p)=>p<m?-1:1)[0],l=O.getFraction(o,.1),u=await Promise.all(s.map(m=>this.toSellSwaps(l,m,r)));return this.findBestSellRoute(u).map(m=>({poolAddress:m.poolAddress,poolId:m?.poolId,pool:m.pool,assetIn:m.assetIn,assetOut:m.assetOut}))}async getSpotPrice(t,e){let n=await super.getPools(),r=super.validateInput(t,e,n),s=await this.getMostLiquidRoute(t,e),i=await this.toSellSwaps("1",s,r),a=await this.getSellSpot(i),o=i[i.length-1].assetOutDecimals;return{amount:a,decimals:o}}findBestBuyRoute(t){let e=t.sort((n,r)=>{let s=n[0].amountIn,i=r[0].amountIn;return s>i?1:-1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}async getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetInDecimals).reduce((a,o)=>a+o),r=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),s=n-e.assetInDecimals,i=Math.pow(10,s);return r/BigInt(i)}async getBuy(t,e,n,r){let s=await super.getPools(),i=super.validateInput(t,e,s),a=super.getPaths(t,e,s);if(a.length===0)throw new rt(t,e);let o;if(r)o=await this.toBuySwaps(n,r,i);else{let w=await Promise.all(a.map(_=>this.toBuySwaps(n,_,i)));o=this.findBestBuyRoute(w)}let l=o[o.length-1],u=o[0],d=this.isDirectTrade(o),m=await this.getBuySpot(o),p=u.amountIn,g=d?u.calculatedIn:this.calculateDelta0X(l.amountOut,o,i),h=p-g,b=this.getRouteFeeRange(o),x=d?u.tradeFeePct:O.calculateBuyFee(g,p),f=Math.pow(10,l.assetOutDecimals),T=l.amountOut*m/BigInt(f),S;return g===0n?S=-100:S=O.calculateDiffToRef(T,g),{type:"Buy",amountOut:l.amountOut,amountIn:u.amountIn,spotPrice:m,tradeFee:h,tradeFeePct:x,tradeFeeRange:b,priceImpactPct:S,swaps:o,toHuman(){return{type:"Buy",amountOut:y.toDecimal(l.amountOut,l.assetOutDecimals),amountIn:y.toDecimal(u.amountIn,u.assetInDecimals),spotPrice:y.toDecimal(m,u.assetInDecimals),tradeFee:y.toDecimal(h,u.assetInDecimals),tradeFeePct:x,tradeFeeRange:b,priceImpactPct:S,swaps:o.map(w=>w.toHuman())}}}}calculateDelta0X(t,e,n){let r=[];for(let s=e.length-1;s>=0;s--){let i=e[s],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;s==e.length-1?l=t:l=r[0];let u=a.calculateInGivenOut(o,l);r.unshift(u)}return r[0]}async toBuySwaps(t,e,n){let r=[];for(let s=e.length-1;s>=0;s--){let i=e[s],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;s==e.length-1?l=typeof t=="string"?y.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let u=await this.ctx.getPoolFees(a,o.assetOut),{amountIn:d,calculatedIn:m,feePct:p,errors:g}=a.validateAndBuy(o,l,u),h=this.getPoolFeeRange(u),b=a.spotPriceInGivenOut(o),x=Math.pow(10,o.decimalsOut),f=l*b/BigInt(x),T;m===0n?T=-100:T=O.calculateDiffToRef(f,m),r.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:d,calculatedIn:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:h,priceImpactPct:T,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===i.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===i.assetIn},toHuman(){return{...i,amountOut:y.toDecimal(l,o.decimalsOut),amountIn:y.toDecimal(d,o.decimalsIn),calculatedIn:y.toDecimal(m,o.decimalsIn),spotPrice:y.toDecimal(b,o.decimalsIn),tradeFeePct:p,tradeFeeRange:h,priceImpactPct:T,errors:g}}})}return r}};var Ge=6e3,le=1000000000000000n,Ft=6,ue=-5,ce=216e5,Mu=3,He=6;import{Enum as Ue}from"polkadot-api";var q=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:s})=>r==="Stableswap"?{pool:Ue("Stableswap",s),asset_in:e,asset_out:n}:{pool:Ue(r),asset_in:e,asset_out:n})}};var ut=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??le})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,r,s){let[i,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:u}=a,d=l[0],m=l[l.length-1],{assetInDecimals:p}=d,{assetOutDecimals:g}=m,h=Math.abs(u),b=this.getMinimumTradeCount(o,i),x=this.getOptimalTradeCount(h),f=s?Math.round(r/s):x,T=Math.ceil(r/b),S=Math.round(r/x),w=Math.round(r/f),_=o/BigInt(f),R=await this.router.getBestSell(t,e,_),N=o<i,G=[];N&&G.push("OrderTooSmall");let Y=R.amountOut*BigInt(f),pt=this.toBlockPeriod(w),j=R.tradeFee*BigInt(f),Wt=q.build(l),dt={assetIn:t,assetOut:e,errors:G,frequencyMin:T,frequencyOpt:S,frequency:w,tradeCount:f,tradeFee:j,tradeImpactPct:R.priceImpactPct,tradePeriod:pt,tradeRoute:Wt,type:"Dca"};return{...dt,amountIn:o,amountOut:Y,tradeAmountIn:R.amountIn,tradeAmountOut:R.amountOut,toHuman(){return{...dt,amountIn:y.toDecimal(o,p),amountOut:y.toDecimal(Y,g),tradeAmountIn:y.toDecimal(R.amountIn,p),tradeAmountOut:y.toDecimal(R.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),n=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let r=t+n/2n;return Number(r/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[r,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:i,swaps:a,priceImpactPct:o}=s,l=a[0],u=a[a.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),h=i/BigInt(g),b=await this.router.getBestSell(l.assetIn,u.assetOut,h),x=g===1,f=i<r,T=b.priceImpactPct<-5,S=[];f||x?S.push("OrderTooSmall"):T&&S.push("OrderImpactTooBig");let w=b.amountOut*BigInt(g),_=b.tradeFee*BigInt(g),R=q.build(a),N={assetIn:t,assetOut:e,errors:S,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:R,type:"TwapSell"};return{...N,amountIn:i,amountOut:w,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:_,toHuman(){return{...N,amountIn:y.toDecimal(i,d),amountOut:y.toDecimal(w,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(_,m)}}}}async getTwapBuyOrder(t,e,n){let[r,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:i,swaps:a,priceImpactPct:o}=s,l=a[0],u=a[a.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),h=i/BigInt(g),b=await this.router.getBestBuy(l.assetIn,u.assetOut,h),x=b.amountIn*BigInt(g),f=g===1,T=x<r,S=b.priceImpactPct<-5,w=[];T||f?w.push("OrderTooSmall"):S&&w.push("OrderImpactTooBig");let _=b.tradeFee*BigInt(g),R=q.build(a),N={assetIn:t,assetOut:e,errors:w,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:R,type:"TwapBuy"};return{...N,amountIn:x,amountOut:i,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:_,toHuman(){return{...N,amountIn:y.toDecimal(x,d),amountOut:y.toDecimal(i,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(_,d)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let r=216e5/(this.blockTime*6);return Math.round(r)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,n=Math.round(e);return Math.max(n,6)}};var Xe={};I(Xe,{TxBuilderFactory:()=>mt});import{Enum as Ye}from"polkadot-api";function Ve(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var ct=class extends E{evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evmClient=e??new C,this.balanceClient=new M(t),this.aaveUtils=new Q(this.evmClient)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:n=>this.dryRun(n,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:Xt})}async dryRun(t,e){let n=Ye("Signed",t),r=Ye("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,e.decodedCall),a=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(a){let o=Ve(a.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var Ht=class extends ct{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:r}=e[0],s=await this.balanceClient.getBalance(this.beneficiary,r);return t>=s-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],s=n[n.length-1],i=O.getFraction(t,this.slippagePct),a=r.assetIn,o=s.assetOut,l=t+i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.buy({asset_in:a,asset_out:o,amount:e,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:a,asset_out:o,amount_out:e,max_amount_in:l,route:q.build(n)}),this.wrapTx("RouterBuy",u)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],s=n[n.length-1],i=O.getFraction(e,this.slippagePct),a=r.assetIn,o=s.assetOut,l=e-i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.sell({asset_in:a,asset_out:o,amount:t,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:a,asset_out:o,amount_in:t,min_amount_out:l,route:q.build(n)}),r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("RouterSell",u)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],r=e[e.length-1],s=O.getFraction(t,this.slippagePct),i=n.assetIn,a=r.assetOut,o=t-s,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:a,min_amount_out:o,route:q.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as me}from"polkadot-api";var Ut=class extends ct{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradePeriod:s,tradeRoute:i}=this.order,a=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:me("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:0n,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",a)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:s,tradePeriod:i,tradeRoute:a}=this.order,o=O.getFraction(s,this.slippagePct),l=s-o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:me("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",u)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:s,tradePeriod:i,tradeRoute:a}=this.order,o=O.getFraction(r,this.slippagePct),l=r+o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:me("Buy",{asset_in:e,asset_out:n,amount_out:s,max_amount_in:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",u)}};var mt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e??new C}trade(t){return new Ht(this.client,this.evmClient).setTrade(t)}order(t){return new Ut(this.client,this.evmClient).setOrder(t)}};async function kc(c,t){let e=new nt(c),[n,r]=await Promise.all([e.getBlockTime(),e.getMinOrderBudget()]),s=t??new C,i=new at(c).withAave().withOmnipool().withStableswap().withXyk(),a=new Q(s),o=new lt(i),l=new ut(o,{blockTime:n,minBudgetInNative:r});return{api:{aave:a,router:o,scheduler:l},client:{asset:new tt(c),balance:new M(c),evm:s},ctx:{pool:i},tx:new mt(c,s),destroy:()=>{i.destroy()}}}export{Ae as aave,be as api,y as big,Re as client,xe as const,kc as createSdkContext,J as erc20,Fe as error,fe as evm,P as fmt,kt as h160,z as json,O as math,Ne as pool,We as sor,Xe as tx,Oe as xc};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { PolkadotClient } from 'polkadot-api';
|
|
2
|
+
import { Papi } from '../api';
|
|
3
|
+
import { BalanceClient } from './BalanceClient';
|
|
4
|
+
export declare class LiquidityMining extends Papi {
|
|
5
|
+
protected readonly balanceClient: BalanceClient;
|
|
6
|
+
protected omnipoolAssetIds: string[];
|
|
7
|
+
private secondsInYear;
|
|
8
|
+
constructor(client: PolkadotClient);
|
|
9
|
+
getOraclePrice(rewardCurrency: number, incentivizedAsset: number): Promise<bigint | undefined>;
|
|
10
|
+
private getFarmAddress;
|
|
11
|
+
private getGlobalRewardPerPeriod;
|
|
12
|
+
private getPoolYieldPerPeriod;
|
|
13
|
+
private farmData;
|
|
14
|
+
getOmnipoolFarms(id: string): Promise<({
|
|
15
|
+
apr: string;
|
|
16
|
+
minApr: string | undefined;
|
|
17
|
+
isDistributed: boolean;
|
|
18
|
+
estimatedEndPeriod: string;
|
|
19
|
+
maxRewards: bigint;
|
|
20
|
+
incentivizedAsset: number;
|
|
21
|
+
rewardCurrency: number;
|
|
22
|
+
loyaltyCurve: {
|
|
23
|
+
initial_reward_percentage: bigint;
|
|
24
|
+
scale_coef: number;
|
|
25
|
+
} | undefined;
|
|
26
|
+
currentPeriod: string;
|
|
27
|
+
potMaxRewards: bigint;
|
|
28
|
+
fullness: string;
|
|
29
|
+
} | undefined)[]>;
|
|
30
|
+
getIsolatedFarms(id: string): Promise<({
|
|
31
|
+
apr: string;
|
|
32
|
+
minApr: string | undefined;
|
|
33
|
+
isDistributed: boolean;
|
|
34
|
+
estimatedEndPeriod: string;
|
|
35
|
+
maxRewards: bigint;
|
|
36
|
+
incentivizedAsset: number;
|
|
37
|
+
rewardCurrency: number;
|
|
38
|
+
loyaltyCurve: {
|
|
39
|
+
initial_reward_percentage: bigint;
|
|
40
|
+
scale_coef: number;
|
|
41
|
+
} | undefined;
|
|
42
|
+
currentPeriod: string;
|
|
43
|
+
potMaxRewards: bigint;
|
|
44
|
+
fullness: string;
|
|
45
|
+
} | undefined)[]>;
|
|
46
|
+
}
|
|
@@ -2,3 +2,4 @@ import { PoolFee } from '../pool';
|
|
|
2
2
|
export declare function toPct(fee: PoolFee): number;
|
|
3
3
|
export declare function toDecimals(fee: PoolFee): number;
|
|
4
4
|
export declare function fromPermill(permill: number): PoolFee;
|
|
5
|
+
export declare function shiftNeg(amount: string | number | bigint, decimals: number): string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@galacticcouncil/sdk-next",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0-pr169-b59fd8b",
|
|
4
4
|
"description": "Galactic next gen sdk (papi)",
|
|
5
5
|
"author": "GalacticCouncil",
|
|
6
6
|
"repository": {
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"@types/big.js": "^6.2.2"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@galacticcouncil/descriptors": "
|
|
38
|
+
"@galacticcouncil/descriptors": "1.4.0-pr169-b59fd8b",
|
|
39
39
|
"@galacticcouncil/math-lbp": "^1.2.0",
|
|
40
40
|
"@galacticcouncil/math-liquidity-mining": "^1.2.0",
|
|
41
41
|
"@galacticcouncil/math-omnipool": "^1.3.0",
|