@galacticcouncil/sdk-next 0.6.0-pr188-5d7828c → 0.6.0-pr188-d6464e7

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 hn=Object.create;var Ut=Object.defineProperty;var Pn=Object.getOwnPropertyDescriptor;var fn=Object.getOwnPropertyNames;var Tn=Object.getPrototypeOf,xn=Object.prototype.hasOwnProperty;var He=(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 fn(t))!xn.call(c,s)&&s!==e&&Ut(c,s,{get:()=>t[s],enumerable:!(n=Pn(t,s))||n.enumerable});return c},at=(c,t,e)=>(Gt(c,t,"default"),e&&Gt(e,t,"default")),re=(c,t,e)=>(e=c!=null?hn(Tn(c)):{},Gt(t||!c||!c.__esModule?Ut(e,"default",{value:c,enumerable:!0}):e,c)),In=c=>Gt(Ut({},"__esModule",{value:!0}),c);var Tt={};var We=He(()=>{at(Tt,require("@polkadot-api/ws-provider/node"))});var xt={};var Ve=He(()=>{at(xt,require("@polkadot-api/ws-provider/web"))});var Qn={};S(Qn,{aave:()=>Te,api:()=>ae,big:()=>b,client:()=>xe,const:()=>ge,createSdkContext:()=>$n,erc20:()=>tt,error:()=>we,evm:()=>ce,fmt:()=>h,h160:()=>wt,json:()=>Z,math:()=>A,pool:()=>_e,sor:()=>Me,tx:()=>qe,xc:()=>Pe});module.exports=In(Qn);var ae={};S(ae,{Papi:()=>M,getWs:()=>wn});var Ue=require("@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 M=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(Ue.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Ge(n)&&console.log(t,...e)}};var Xe=require("polkadot-api"),Ye=require("polkadot-api/polkadot-sdk-compat"),wn=async c=>{let t=typeof c=="string"?c.split(","):c,s=(typeof window>"u"?(await Promise.resolve().then(()=>(We(),Tt))).getWsProvider:(await Promise.resolve().then(()=>(Ve(),xt))).getWsProvider)(t);return(0,Xe.createClient)((0,Ye.withPolkadotSdkCompat)(s))};var Te={};S(Te,{AAVE_GAS_LIMIT:()=>le,AAVE_LENDING_POOL_ADDRESS:()=>Xt,AAVE_POOL_ABI:()=>ie,AAVE_POOL_DATA_PROVIDER:()=>Vt,AAVE_POOL_DATA_PROVIDER_ABI:()=>Wt,AAVE_POOL_PROXY:()=>oe,AAVE_ROUNDING_THRESHOLD:()=>ds,AAVE_UINT_256_MAX:()=>Sn,AaveClient:()=>It,AaveUtils:()=>et});var ie=[{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 oe="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Vt="0x112b087b60C1a166130d59266363C45F8aa99db0",Xt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",le=1000000n,ds=5,Sn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var ce={};S(ce,{EvmClient:()=>L,evmMainnet:()=>ue});var ze=require("viem"),je=["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"],Ke=["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"],ue=(0,ze.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{public:{http:je,webSocket:Ke},default:{http:je,webSocket:Ke}},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||ue}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:ie,address:oe,args:[t],functionName:"getUserAccountData"})}};var b={};S(b,{asBigInt:()=>An,toBigInt:()=>vn,toDecimal:()=>On});var J=re(require("big.js"));J.default.NE=-18;function On(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 vn(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 An(c){return BigInt(c.round(0,J.default.roundDown).toFixed(0))}var tt={};S(tt,{ERC20:()=>pe});var pe=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:()=>Rn,toDecimals:()=>_n,toPct:()=>Bn});var $e=1e3;function Bn(c){let[t,e]=c;return t/e*100}function _n(c){let[t,e]=c;return t/e}function Rn(c){return[c/$e,$e]}var wt={};S(wt,{H160:()=>he,isEvmAccount:()=>Qe,isEvmAddress:()=>Je,isSs58Address:()=>Ze});var ot=require("polkadot-api"),be=require("@polkadot-api/utils"),z=require("buffer");var ge={};S(ge,{HUB_ASSET_ID:()=>de,HYDRATION_OMNIPOOL_ADDRESS:()=>En,HYDRATION_PARACHAIN_ID:()=>Fn,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,Fn=2034,W=63,En="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",de=1,it=15;var ye="ETH\0";function Qe(c){if(!c)return!1;try{let t=(0,ot.AccountId)().enc(c),e=z.Buffer.from(ye);return z.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Je(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function Ze(c){try{return(0,ot.AccountId)(63).enc(c),!0}catch{return!1}}var he=class c{static toAccount=t=>{let e=z.Buffer.from(t.slice(2),"hex"),n=z.Buffer.from(ye),s=Uint8Array.from(z.Buffer.concat([n,e,z.Buffer.alloc(8)])),r=(0,be.toHex)(s);return(0,ot.AccountId)(63).dec(r)};static fromAccount=t=>{let e=(0,ot.AccountId)().enc(t),n=z.Buffer.from(ye),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,be.toHex)(n)};static fromAny=t=>{if(Je(t))return t;if(Qe(t))return c.fromAccount(t);if(Ze(t))return c.fromSS58(t);throw new Error("Unknown address type")}};var Z={};S(Z,{findNestedKey:()=>Dn,findNestedObj:()=>kn,jsonFormatter:()=>Cn});var Dn=(c,t)=>{let e=[];return JSON.stringify(c,(n,s)=>(s&&s[t]&&e.push(s),s)),e[0]},kn=(c,t,e)=>{let n;return JSON.stringify(c,(s,r)=>(r&&r[t]===e&&(n=r),r)),n},Cn=(c,t)=>typeof t=="bigint"?t.toString():t;var A={};S(A,{calculateBuyFee:()=>Nn,calculateDiffToAvg:()=>Mn,calculateDiffToRef:()=>Ln,calculateSellFee:()=>qn,getFraction:()=>Hn});var V=re(require("big.js"));function Mn(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 Ln(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 qn(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 Nn(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 Hn(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 Pe={};S(Pe,{convertToId:()=>Gn});var tn=require("buffer");function Gn(c){let e=tn.Buffer.from(c.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Yt}=tt,{H160:fe}=wt,Un=1.01,Wn=99999,Vn=10n**27n,Xn=10n**18n,et=class{client;constructor(t){let e=t??new L;this.client=new It(e)}async getSummary(t){let e=fe.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),y=[];for(let I of a){let f=I.underlyingAsset.toLowerCase(),T=i.find(({underlyingAsset:se})=>se.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/Vn,Nt=Number(o===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,Ht=T.usageAsCollateralEnabled&&I.usageAsCollateralEnabledOnUser&&I.scaledATokenBalance>0n,ne=Yt.toAssetId(f);y.push({aTokenBalance:C,decimals:Number(T.decimals),isCollateral:Ht,priceInRef:k,reserveId:ne,reserveAsset:f,reserveLiquidationThreshold:Nt})}return{healthFactor:Number(P),totalCollateral:l,totalDebt:u,reserves:y}}async hasBorrowPositions(t){let e=fe.fromAny(t),n=await this.client.getUserAccountData(e),[s,r]=n;return r>0n}async getHealthFactor(t){let e=fe.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: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=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,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=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 Wn;let s=10n**6n,r=b.toBigInt(e,18),i=t*r*s,a=n*Xn,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(Un,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 xe={};S(xe,{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),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)}};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 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((0,w.finalize)(()=>a?.()),(0,w.pairwise)(),(0,w.map)(([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))}),(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 we={};S(we,{AssetNotFound:()=>Ie,PoolNotFound:()=>St,RouteNotFound:()=>ct});var Ie=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 _e={};S(_e,{PoolContextProvider:()=>gt,PoolError:()=>nt,PoolFactory:()=>dt,PoolType:()=>E,aave:()=>Be,lbp:()=>Se,omni:()=>Oe,stable:()=>ve,xyk:()=>Ae});var Se={};S(Se,{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 nn=require("polkadot-api"),st=require("rxjs");var en=(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=en(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()),[p,m]=i,g=BigInt(d),P=this.MAX_FINAL_WEIGHT-BigInt(g),[y,I,f,T,v]=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:y,tokens:[{id:p,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:I,weight:g,type:f?.asset_type.type},{id:m,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(nn.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 Oe={};S(Oe,{OmniMath:()=>B,OmniPool:()=>At,OmniPoolClient:()=>_t});var x=require("@galacticcouncil/math-omnipool"),rt=re(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 p=u.times(a).minus(r).times(i),m=r.times((0,rt.default)(1).minus(u));return p.div(m).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"),sn=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[p]=u,{hub_reserve:m,shares:g,tradable:P,cap:y,protocol_shares:I}=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:y,hubReserves:m,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,sn.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(m=>m.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 ve={};S(ve,{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"),rn=require("@polkadot-api/utils"),an=require("@noble/hashes/blake2b"),pt=require("rxjs");var Yn=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:Yn,tradeable:15,type:i?.asset_type.type}),r}getPoolAddress(t){let e=D.getPoolAddress(t),n=(0,an.blake2b)(e,{dkLen:32}),s=(0,rn.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,pt.of)(t):e.watchValue("best").pipe((0,pt.switchMap)(s=>this.getPoolDelta(t.id,n,s)),(0,pt.map)(s=>Object.assign({},t,s)))}};var Ae={};S(Ae,{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 on=require("polkadot-api"),ln=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,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(on.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,ln.of)(t)}};var Be={};S(Be,{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 cn=require("polkadot-api"),pn=require("@polkadot-api/utils"),mt=require("rxjs"),mn=require("viem");var un=[{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:jn}=tt,Kn=["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,pn.toHex)(s);return(0,cn.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:p,args:m}=(0,mn.decodeEventLog)({abi:un,topics:u,data:d});return Kn.includes(p)&&m.reserve.toLowerCase()===s.toLowerCase()});return(0,mt.merge)([r,i]).pipe((0,mt.switchMap)(()=>this.getPoolDelta(t)),(0,mt.map)(a=>({...t,tokens:[...a]})))}getReserveH160Id(t){return t.type==="Erc20"?Z.findNestedKey(t.location,"AccountKey20").AccountKey20.key:jn.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 Me={};S(Me,{DEFAULT_BLOCK_TIME:()=>dn,DEFAULT_MIN_BUDGET:()=>Ee,ORDER_MIN_BLOCK_PERIOD:()=>gn,Router:()=>bt,TWAP_BLOCK_PERIOD:()=>qt,TWAP_MAX_DURATION:()=>ke,TWAP_MAX_PRICE_IMPACT:()=>De,TWAP_TX_MULTIPLIER:()=>Do,TradeOrderError:()=>Fe,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 zn=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>zn)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 Re(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=Re(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||{}),Fe=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Fe||{});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),p=await this.getSellSpot(o),m=u.amountOut,g=d?u.calculatedOut:this.calculateDelta0Y(l.amountIn,o,i),P=g-m,y=this.getRouteFeeRange(o),I=d?u.tradeFeePct:A.calculateSellFee(g,m),f=Math.pow(10,l.assetInDecimals),T=l.amountIn*p/BigInt(f),v=A.calculateDiffToRef(g,T);return{type:"Sell",amountIn:l.amountIn,amountOut:u.amountOut,spotPrice:p,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(p,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:p,feePct:m,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(p,f);s.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:d,calculatedOut:p,spotPrice:y,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(y,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=A.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 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),p=await this.getBuySpot(o),m=u.amountIn,g=d?u.calculatedIn:this.calculateDelta0X(l.amountOut,o,i),P=m-g,y=this.getRouteFeeRange(o),I=d?u.tradeFeePct:A.calculateBuyFee(g,m),f=Math.pow(10,l.assetOutDecimals),T=l.amountOut*p/BigInt(f),v;return g===0n?v=-100:v=A.calculateDiffToRef(T,g),{type:"Buy",amountOut:l.amountOut,amountIn:u.amountIn,spotPrice:p,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(p,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:p,feePct:m,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;p===0n?T=-100:T=A.calculateDiffToRef(f,p),s.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:d,calculatedIn:p,spotPrice:y,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(y,o.decimalsIn),tradeFeePct:m,tradeFeeRange:P,priceImpactPct:T,errors:g}}})}return s}};var dn=6e3,Ee=1000000000000000n,qt=6,De=-5,ke=216e5,Do=3,gn=6;var Ce=require("polkadot-api");var H=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:s,poolId:r})=>s==="Stableswap"?{pool:(0,Ce.Enum)("Stableswap",r),asset_in:e,asset_out:n}:{pool:(0,Ce.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??Ee})}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),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),ne=this.toBlockPeriod(F),se=C.tradeFee*BigInt(f),yn=H.build(l),Ne={assetIn:t,assetOut:e,errors:Nt,frequencyMin:T,frequencyOpt:v,frequency:F,tradeCount:f,tradeFee:se,tradeImpactPct:C.priceImpactPct,tradePeriod:ne,tradeRoute:yn,type:"Dca"};return{...Ne,amountIn:o,amountOut:Ht,tradeAmountIn:C.amountIn,tradeAmountOut:C.amountOut,toHuman(){return{...Ne,amountIn:b.toDecimal(o,m),amountOut:b.toDecimal(Ht,g),tradeAmountIn:b.toDecimal(C.amountIn,m),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:p}=u,m=Math.abs(o),g=this.getTwapTradeCount(m),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,p),tradeAmountIn:b.toDecimal(y.amountIn,d),tradeAmountOut:b.toDecimal(y.amountOut,p),tradeFee:b.toDecimal(k,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),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,p),tradeAmountIn:b.toDecimal(y.amountIn,d),tradeAmountOut:b.toDecimal(y.amountOut,p),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 qe={};S(qe,{TxBuilderFactory:()=>ft});var Le=require("polkadot-api");function bn(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:le})}async dryRun(t,e){let n=(0,Le.Enum)("Signed",t),s=(0,Le.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=bn(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)}};var ee=require("staking");async function $n(c,t,e){let n=new ut(c),[s,r]=await Promise.all([n.getBlockTime(),n.getMinOrderBudget()]),i=t??new L,a=new gt(c).withAave().withOmnipool().withStableswap().withXyk(),o=new et(i),l=new yt(a),u=new ht(l,{blockTime:s,minBudgetInNative:r}),d=new ee.StakingApi(e??new ee.StakingClient(c));return{api:{aave:o,router:l,scheduler:u,staking:d},client:{asset:new lt(c),balance:new X(c),evm:i},ctx:{pool:a},tx:new ft(c,i),destroy:()=>{a.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 Bn=Object.create;var Wt=Object.defineProperty;var _n=Object.getOwnPropertyDescriptor;var Rn=Object.getOwnPropertyNames;var kn=Object.getPrototypeOf,Fn=Object.prototype.hasOwnProperty;var Xe=(c,t)=>()=>(c&&(t=c(c=0)),t);var I=(c,t)=>{for(var e in t)Wt(c,e,{get:t[e],enumerable:!0})},Vt=(c,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Rn(t))!Fn.call(c,s)&&s!==e&&Wt(c,s,{get:()=>t[s],enumerable:!(n=_n(t,s))||n.enumerable});return c},ot=(c,t,e)=>(Vt(c,t,"default"),e&&Vt(e,t,"default")),Xt=(c,t,e)=>(e=c!=null?Bn(kn(c)):{},Vt(t||!c||!c.__esModule?Wt(e,"default",{value:c,enumerable:!0}):e,c)),En=c=>Vt(Wt({},"__esModule",{value:!0}),c);var St={};var Ke=Xe(()=>{ot(St,require("@polkadot-api/ws-provider/node"))});var wt={};var ze=Xe(()=>{ot(wt,require("@polkadot-api/ws-provider/web"))});var us={};I(us,{aave:()=>Se,api:()=>oe,big:()=>b,client:()=>we,const:()=>ye,createSdkContext:()=>ls,erc20:()=>tt,error:()=>ve,evm:()=>pe,fmt:()=>h,h160:()=>vt,json:()=>Z,math:()=>A,pool:()=>ke,sor:()=>qe,staking:()=>Ge,tx:()=>Ve,xc:()=>Te});module.exports=En(us);var oe={};I(oe,{Papi:()=>M,getWs:()=>Dn});var je=require("@galacticcouncil/descriptors");function Ye(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(je.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Ye(n)&&console.log(t,...e)}};var $e=require("polkadot-api"),Qe=require("polkadot-api/polkadot-sdk-compat"),Dn=async c=>{let t=typeof c=="string"?c.split(","):c,s=(typeof window>"u"?(await Promise.resolve().then(()=>(Ke(),St))).getWsProvider:(await Promise.resolve().then(()=>(ze(),wt))).getWsProvider)(t);return(0,$e.createClient)((0,Qe.withPolkadotSdkCompat)(s))};var Se={};I(Se,{AAVE_GAS_LIMIT:()=>ce,AAVE_LENDING_POOL_ADDRESS:()=>Kt,AAVE_POOL_ABI:()=>le,AAVE_POOL_DATA_PROVIDER:()=>jt,AAVE_POOL_DATA_PROVIDER_ABI:()=>Yt,AAVE_POOL_PROXY:()=>ue,AAVE_ROUNDING_THRESHOLD:()=>vs,AAVE_UINT_256_MAX:()=>Cn,AaveClient:()=>It,AaveUtils:()=>et});var le=[{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 Yt=[{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 ue="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",jt="0x112b087b60C1a166130d59266363C45F8aa99db0",Kt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",ce=1000000n,vs=5,Cn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var pe={};I(pe,{EvmClient:()=>L,evmMainnet:()=>me});var tn=require("viem"),Je=["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"],Ze=["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"],me=(0,tn.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{public:{http:Je,webSocket:Ze},default:{http:Je,webSocket:Ze}},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||me}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:Yt,address:jt,args:[Kt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.evmClient.getProvider().readContract({abi:Yt,address:jt,args:[Kt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.evmClient.getProvider().readContract({abi:le,address:ue,args:[t],functionName:"getUserAccountData"})}};var b={};I(b,{asBigInt:()=>qn,toBigInt:()=>Ln,toDecimal:()=>Mn});var J=Xt(require("big.js"));J.default.NE=-18;function Mn(c,t,e=6,n){let s=(0,J.default)(c.toString()),a=(0,J.default)(10).pow(t);return s.div(a).round(e,n).toString()}function Ln(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 qn(c){return BigInt(c.round(0,J.default.roundDown).toFixed(0))}var tt={};I(tt,{ERC20:()=>de});var de=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={};I(h,{fromPermill:()=>Gn,toDecimals:()=>Hn,toPct:()=>Nn});var en=1e3;function Nn(c){let[t,e]=c;return t/e*100}function Hn(c){let[t,e]=c;return t/e}function Gn(c){return[c/en,en]}var vt={};I(vt,{H160:()=>fe,isEvmAccount:()=>nn,isEvmAddress:()=>sn,isSs58Address:()=>an});var ut=require("polkadot-api"),he=require("@polkadot-api/utils"),z=require("buffer");var ye={};I(ye,{HUB_ASSET_ID:()=>be,HYDRATION_OMNIPOOL_ADDRESS:()=>Vn,HYDRATION_PARACHAIN_ID:()=>Un,HYDRATION_SS58_PREFIX:()=>V,RUNTIME_DECIMALS:()=>q,SYSTEM_ASSET_DECIMALS:()=>ge,SYSTEM_ASSET_ID:()=>K,TRADEABLE_DEFAULT:()=>lt});var q=18,K=0,ge=12,Un=2034,V=63,Vn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",be=1,lt=15;var Pe="ETH\0";function nn(c){if(!c)return!1;try{let t=(0,ut.AccountId)().enc(c),e=z.Buffer.from(Pe);return z.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function sn(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function an(c){try{return(0,ut.AccountId)(63).enc(c),!0}catch{return!1}}var fe=class c{static toAccount=t=>{let e=z.Buffer.from(t.slice(2),"hex"),n=z.Buffer.from(Pe),s=Uint8Array.from(z.Buffer.concat([n,e,z.Buffer.alloc(8)])),a=(0,he.toHex)(s);return(0,ut.AccountId)(63).dec(a)};static fromAccount=t=>{let e=(0,ut.AccountId)().enc(t),n=z.Buffer.from(Pe),s=e.slice(n.length,-8);return"0x"+z.Buffer.from(s).toString("hex")};static fromSS58=t=>{let n=(0,ut.AccountId)().enc(t).slice(0,20);return(0,he.toHex)(n)};static fromAny=t=>{if(sn(t))return t;if(nn(t))return c.fromAccount(t);if(an(t))return c.fromSS58(t);throw new Error("Unknown address type")}};var Z={};I(Z,{findNestedKey:()=>Wn,findNestedObj:()=>Xn,jsonFormatter:()=>Yn});var Wn=(c,t)=>{let e=[];return JSON.stringify(c,(n,s)=>(s&&s[t]&&e.push(s),s)),e[0]},Xn=(c,t,e)=>{let n;return JSON.stringify(c,(s,a)=>(a&&a[t]===e&&(n=a),a)),n},Yn=(c,t)=>typeof t=="bigint"?t.toString():t;var A={};I(A,{calculateBuyFee:()=>$n,calculateDiffToAvg:()=>jn,calculateDiffToRef:()=>Kn,calculateSellFee:()=>zn,getFraction:()=>Qn});var W=Xt(require("big.js"));function jn(c,t){let e=(0,W.default)(c.toString()),n=(0,W.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,W.default)(c.toString()),n=(0,W.default)(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function zn(c,t){let e=(0,W.default)(c.toString()),n=(0,W.default)(t.toString());return(0,W.default)(1).minus(n.div(e)).mul(100).round(2).toNumber()}function $n(c,t){let e=(0,W.default)(c.toString());return(0,W.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Qn(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={};I(Te,{convertToId:()=>Jn});var rn=require("buffer");function Jn(c){let e=rn.Buffer.from(c.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:zt}=tt,{H160:xe}=vt,Zn=1.01,ts=99999,es=10n**27n,ns=10n**18n,et=class{client;constructor(t){let e=t??new L;this.client=new It(e)}async getSummary(t){let e=xe.fromAny(t),[n,s,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[r]=n,[i,o]=s,[l,u,d,m,p,g]=a,P=b.toDecimal(g,18),y=[];for(let S of i){let f=S.underlyingAsset.toLowerCase(),T=r.find(({underlyingAsset:re})=>re.toLowerCase()===f);if(!T)throw new Error("Missing pool reserve for "+f);let O=S.scaledATokenBalance,k=T.liquidityIndex,D=T.priceInMarketReferenceCurrency,C=O*k/es,Gt=Number(o===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,Ut=T.usageAsCollateralEnabled&&S.usageAsCollateralEnabledOnUser&&S.scaledATokenBalance>0n,ie=zt.toAssetId(f);y.push({aTokenBalance:C,decimals:Number(T.decimals),isCollateral:Ut,priceInRef:D,reserveId:ie,reserveAsset:f,reserveLiquidationThreshold:Gt})}return{healthFactor:Number(P),totalCollateral:l,totalDebt:u,reserves:y}}async hasBorrowPositions(t){let e=xe.fromAny(t),n=await this.client.getUserAccountData(e),[s,a]=n;return a>0n}async getHealthFactor(t){let e=xe.fromAny(t),n=await this.client.getUserAccountData(e),[s,a,r,i,o,l]=n,u=b.toDecimal(l,18);return Number(u)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:s,totalDebt:a,reserves:r}=await this.getSummary(t),i=zt.fromAssetId(e),o=r.find(y=>y.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);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,a)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:s,totalDebt:a,reserves:r}=await this.getSummary(t),i=zt.fromAssetId(e),o=r.find(P=>P.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);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,a)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:s,reserves:a}=await this.getSummary(t),r=zt.fromAssetId(e),i=a.find(o=>o.reserveAsset===r);if(!i)throw new Error("Missing reserve ctx for "+r);return this.calculateWithdrawMax(i,n,s)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:s}=await this.getSummary(t),a={};for(let r of s){let i=this.calculateWithdrawMax(r,e,n);r.reserveId&&(a[r.reserveId]=i)}return a}calculateHealthFactor(t,e,n){if(n===0n)return ts;let s=10n**6n,a=b.toBigInt(e,18),r=t*a*s,i=n*ns,o=r/i;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let s=b.toBigInt(t,18),a=b.toBigInt(e,18);return(s*n+a-1n)/a}calculateWithdrawMax(t,e,n){let{aTokenBalance:s,decimals:a,priceInRef:r,reserveLiquidationThreshold:i}=t,o=this.calculateRequiredCollateral(Zn,i,n),l=e-o;if(l<=0n)return{amount:0n,decimals:a};let u=l*10n**BigInt(a)/r;return{amount:s<u?s:u,decimals:a}}};var we={};I(we,{AssetClient:()=>ct,BalanceClient:()=>X,ChainParams:()=>mt});var ct=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[a]=n;return[a,s]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[a]=n;return[a,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[a]=n;return[a,s]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[a]=n;return[a,s]}))}async mapToken(t,e,n,s){let{name:a,asset_type:r,is_sufficient:i,existential_deposit:o}=e,{symbol:l,decimals:u}=n.get(t)??{};return{id:t,name:a?.asText(),symbol:l,decimals:u,icon:l,type:r.type,isSufficient:i,location:s,existentialDeposit:o}}async mapBond(t,e,n,s){let[a,r]=s,{asset_type:i,is_sufficient:o,existential_deposit:l}=e,{symbol:u,decimals:d}=await this.mapToken(a,e,n),m=Number(r),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:i.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:a,maturity:m}}async mapShares(t,e,n,s){let{assets:a}=s,{name:r,symbol:i,asset_type:o,is_sufficient:l,existential_deposit:u}=e,d=await Promise.all(a.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:i?.asText()||r?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:m}}async mapExternal(t,e,n,s){let a=await this.mapToken(t,e,new Map,s),r=n?.find(i=>i.internalId===a.id);return r?{...a,decimals:r.decimals,name:r.name,symbol:r.symbol,icon:r.symbol,isWhiteListed:r.isWhiteListed}:a}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,a,r]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),i=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=r.get(l);p=await this.mapBond(l,u,i,g);break;case"StableSwap":let P=a.get(l);p=await this.mapShares(l,u,i,P);break;case"External":p=await this.mapExternal(l,u,e,d);break;default:p=await this.mapToken(l,u,i,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:a}=await n.getValue(t,e);return s-a}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)(a=>a.flat()),(0,w.startWith)([]),(0,w.bufferCount)(2,1),(0,w.map)(([a,r],i)=>{if(i===0)return r;let o=a.reduce((u,d)=>(u.set(d.id,d.amount),u),new Map);return r.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:a}=n.data;return{id:0,amount:s-a}}))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,w.map)(s=>{let{free:a,frozen:r}=s;return{id:e,amount:a-r}}))}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(a=>{let[r,i]=a.args;s.push({id:i,amount:0n})}),n?.upserted.forEach(a=>{let[r,i]=a.args,{free:o,frozen:l}=a.value;s.push({id:i,amount:o-l})}),s}))}subscribeErc20Balance(t,e){let n=new w.Subject,s=n.pipe((0,w.shareReplay)(1)),a=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}),r=async()=>{let o=e||await a(),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()},i;return r().then(o=>i=o),s.pipe((0,w.finalize)(()=>i?.()),(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 mt=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 ve={};I(ve,{AssetNotFound:()=>Ie,PoolNotFound:()=>Ot,RouteNotFound:()=>pt});var Ie=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},Ot=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},pt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var ke={};I(ke,{PoolContextProvider:()=>yt,PoolError:()=>nt,PoolFactory:()=>bt,PoolType:()=>F,aave:()=>Re,lbp:()=>Oe,omni:()=>Ae,stable:()=>Be,xyk:()=>_e});var Oe={};I(Oe,{LbpMath:()=>U,LbpPool:()=>At,LbpPoolClient:()=>Bt});var Y=require("@galacticcouncil/math-lbp"),U=class{static getSpotPrice(t,e,n,s,a){return(0,Y.get_spot_price)(t,e,n,s,a)}static calculateInGivenOut(t,e,n,s,a){return(0,Y.calculate_in_given_out)(t,e,n,s,a)}static calculateOutGivenIn(t,e,n,s,a){return(0,Y.calculate_out_given_in)(t,e,n,s,a)}static calculateLinearWeights(t,e,n,s,a){return(0,Y.calculate_linear_weights)(t,e,n,s,a)}static calculatePoolTradeFee(t,e,n){return(0,Y.calculate_pool_trade_fee)(t,e,n)}};var F=(a=>(a.Aave="Aave",a.LBP="LBP",a.Omni="Omnipool",a.Stable="Stableswap",a.XYK="XYK",a))(F||{}),nt=(a=>(a.InsufficientTradingAmount="InsufficientTradingAmount",a.MaxInRatioExceeded="MaxInRatioExceeded",a.MaxOutRatioExceeded="MaxOutRatioExceeded",a.TradeNotAllowed="TradeNotAllowed",a.UnknownError="UnknownError",a))(nt||{});var At=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,a,r,i){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a,this.fee=r,this.repayFeeApply=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:a.balance,decimalsIn:s.decimals,decimalsOut:a.decimals,weightIn:s.weight,weightOut:a.weight}}validateAndBuy(t,e,n){let s=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let r=t.balanceOut/this.maxOutRatio;if(e>r&&a.push("MaxOutRatioExceeded"),s===t.assetOut){let i=this.calculateTradeFee(e,n),o=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+i,u=this.calculateInGivenOut(t,l),d=t.balanceIn/this.maxInRatio;return u>d&&a.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:a}}else{let i=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return i>o&&a.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:i,amountOut:e,feePct:0,errors:a}}}validateAndSell(t,e,n){let s=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let r=t.balanceIn/this.maxInRatio;if(e>r&&a.push("MaxInRatioExceeded"),s===t.assetIn){let i=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return i>o&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:i,feePct:0,errors:a}}else{let i=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(i,n),l=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),u=i-o,d=t.balanceOut/this.maxOutRatio;return u>d&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:u,feePct:l,errors:a}}}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 ln=require("polkadot-api"),st=require("rxjs");var on=(c,t=new Map)=>e=>{let n;return t.has(e)?t.get(e):(t.set(e,n=c(e)),n)};var v=require("rxjs");var N=class extends X{override=[];mem=0;memPools=on(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,v.from)(this.getPoolsMem()).pipe((0,v.switchMap)(e=>this.subscribe(e)),(0,v.combineLatestAll)());return(0,v.firstValueFrom)(t)}getSubscriber(){return(0,v.from)(this.getPoolsMem()).pipe((0,v.switchMap)(t=>this.subscribe(t)),(0,v.mergeAll)())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>(0,v.combineLatest)([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe((0,v.debounceTime)(250),(0,v.map)(([n,s])=>this.updatePool(n,s))))}subscribePoolBalance(t){if(t.type==="Aave")return(0,v.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(a=>a.type==="Erc20").map(a=>a.id),s=this.subscribeErc20Balance(t.address,n);e.push(s)}return(0,v.combineLatest)(e).pipe((0,v.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 a=this.override.find(i=>i.id===e),r=!!n||!!a?.decimals;return s>0n&&r})}updatePool=(t,e)=>{let n=t.tokens.map(s=>{let a=e.find(i=>i.id===s.id),r=this.override.find(i=>i.id===s.id);return a?{...s,balance:a.amount,decimals:s.decimals||r?.decimals}:{...s,decimals:s.decimals||r?.decimals}});return{...t,tokens:n}}};var Bt=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,a=t.filter(({value:r})=>e&&this.isActivePool(r,s)).map(async({keyArgs:r,value:i})=>{let[o]=r,l=o.toString(),u=await this.getPoolDelta(l,i,s);return{address:l,type:"LBP",fee:i.fee,...u,...n}});return Promise.all(a)}async getPoolDelta(t,e,n){let{start:s,end:a,assets:r,initial_weight:i,final_weight:o,repay_target:l,fee_collector:u}=e,d=U.calculateLinearWeights(s?s.toString():"0",a?a.toString():"0",i.toString(),o.toString(),n.toString()),[m,p]=r,g=BigInt(d),P=this.MAX_FINAL_WEIGHT-BigInt(g),[y,S,f,T,O]=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:S,weight:g,type:f?.asset_type.type},{id:p,decimals:O?.decimals,existentialDeposit:O?.existential_deposit,balance:T,weight:P,type:O?.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(ln.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 Ae={};I(Ae,{OmniMath:()=>B,OmniPool:()=>_t,OmniPoolClient:()=>kt});var x=require("@galacticcouncil/math-omnipool"),at=Xt(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,a,r,i,o,l){return(0,x.calculate_in_given_out)(t,e,n,s,a,r,i,o,l)}static calculateLrnaInGivenOut(t,e,n,s,a){return(0,x.calculate_lrna_in_given_out)(t,e,n,s,a)}static calculateOutGivenIn(t,e,n,s,a,r,i,o,l){return(0,x.calculate_out_given_in)(t,e,n,s,a,r,i,o,l)}static calculateOutGivenLrnaIn(t,e,n,s,a){return(0,x.calculate_out_given_lrna_in)(t,e,n,s,a)}static calculateShares(t,e,n,s){return(0,x.calculate_shares)(t,e,n,s)}static calculateLiquidityOut(t,e,n,s,a,r,i,o){return(0,x.calculate_liquidity_out)(t,e,n,s,a,r,i,o)}static calculateLiquidityLRNAOut(t,e,n,s,a,r,i,o){return(0,x.calculate_liquidity_lrna_out)(t,e,n,s,a,r,i,o)}static calculateCapDifference(t,e,n,s){let a=(0,at.default)(e),r=(0,at.default)(t),i=(0,at.default)(s),o=(0,at.default)(n),l=(0,at.default)(10).pow(18),u=o.div(l);if(a.div(i).lt(u)){let m=u.times(i).minus(a).times(r),p=a.times((0,at.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 _t=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,a,r){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a,this.hubAssetId=r}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:s.hubReserves,hubReservesOut:a.hubReserves,sharesIn:s.shares,sharesOut:a.shares,decimalsIn:s.decimals,decimalsOut:a.decimals,balanceIn:s.balance,balanceOut:a.balance,tradeableIn:s.tradeable,tradeableOut:a.tradeable,assetInEd:s.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),r=s===0n?0:A.calculateDiffToRef(a,s),i=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&i.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&i.push("MaxOutRatioExceeded");let d=t.balanceIn/this.maxInRatio;return a>d&&i.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:s,amountOut:e,feePct:r,errors:i}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),r=A.calculateDiffToRef(s,a),i=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&i.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&i.push("MaxInRatioExceeded");let d=t.balanceOut/this.maxOutRatio;return a>d&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:a,feePct:r,errors:i}}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"),a=BigInt(s);return a<0n?0n:a}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"),a=BigInt(s);return a<0n?0n:a}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"),a=BigInt(s);return a<0n?0n:a}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"),a=BigInt(s);return a<0n?0n:a}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 $t=require("polkadot-api"),un=require("@polkadot-api/utils"),Rt=require("rxjs");var kt=class extends N{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,s,a,r,i]=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: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:y,hubReserves:p,protocolShares:S,shares:g,tradeable:P,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:r,tradeable:s,type:a?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...i}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=(0,un.toHex)(e);return(0,$t.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,a]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),r=n.min_fee+s.min_fee,i=n.max_fee+s.max_fee;if(a){let{asset_fee:o,protocol_fee:l}=a;return{assetFee:h.fromPermill(o),protocolFee:h.fromPermill(l),min:h.fromPermill(r),max:h.fromPermill(i)}}else return{assetFee:h.fromPermill(n.min_fee),protocolFee:h.fromPermill(s.min_fee),min:h.fromPermill(r),max:h.fromPermill(i)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible($t.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,Rt.distinctUntilChanged)((n,s)=>!s.deltas),(0,Rt.map)(({entries:n})=>n.map(s=>{let[a]=s.args,{hub_reserve:r,shares:i,tradable:o,cap:l,protocol_shares:u}=s.value,d=t.tokens.findIndex(p=>p.id===a);return{...t.tokens[d],cap:l,hubReserves:r,protocolShares:u,shares:i,tradeable:o}})),(0,Rt.map)(n=>{let s=t.tokens.find(a=>a.id===1);return{...t,tokens:[...n,s]}}))}};var Be={};I(Be,{StableMath:()=>E,StableSwap:()=>Ft,StableSwapClient:()=>Et});var _=require("@galacticcouncil/math-stableswap"),E=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,a){return(0,_.calculate_amplification)(t,e,n,s,a)}static calculateInGivenOut(t,e,n,s,a,r,i){return(0,_.calculate_in_given_out)(t,e,n,s,a,r,i)}static calculateAddOneAsset(t,e,n,s,a,r,i){return(0,_.calculate_add_one_asset)(t,e,n,s,a,r,i)}static calculateSharesForAmount(t,e,n,s,a,r,i){return(0,_.calculate_shares_for_amount)(t,e,n,s,a,r,i)}static calculateOutGivenIn(t,e,n,s,a,r,i){return(0,_.calculate_out_given_in)(t,e,n,s,a,r,i)}static calculateLiquidityOutOneAsset(t,e,n,s,a,r,i){return(0,_.calculate_liquidity_out_one_asset)(t,e,n,s,a,r,i)}static calculateShares(t,e,n,s,a,r){return(0,_.calculate_shares)(t,e,n,s,a,r)}static calculateSpotPriceWithFee(t,e,n,s,a,r,i,o){return(0,_.calculate_spot_price_with_fee)(t,e,n,s,a,r,i,o)}static recalculatePegs(t,e,n,s,a){return(0,_.recalculate_peg)(t,e,n,s,a)}};var Ft=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,a,r,i,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a,this.amplification=r,this.id=i,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:a.balance,decimalsIn:s.decimals,decimalsOut:a.decimals,tradeableIn:this.id===t?15:s.tradeable,tradeableOut:this.id===e?15:a.tradeable,assetInEd:s.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),r=h.toPct(n.fee),i=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&i.push("InsufficientTradingAmount"),{amountIn:a,calculatedIn:s,amountOut:e,feePct:r,errors:i}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),r=h.toPct(n.fee),i=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&i.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:s,amountOut:a,feePct:r,errors:i}}calculateIn(t,e,n){let s=E.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateAddOneAsset(t,e,n){let s=E.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateSharesForAmount(t,e,n){let s=E.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}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=E.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=E.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateWithdrawOneAsset(t,e,n){let s=E.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateShares(t,e,n){let s=E.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}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=E.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=E.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 Qt=require("polkadot-api"),cn=require("@polkadot-api/utils"),mn=require("@noble/hashes/blake2b"),dt=require("rxjs");var ss=340282366920938463463374607431768211455n,Et=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:a,value:r})=>{let[i]=a,o=this.getPoolAddress(i),[l,u]=await Promise.all([this.getPoolDelta(i,r,e),this.getPoolTokens(i,r)]);return this.poolsData.set(o,r),{address:o,id:i,type:"Stableswap",fee:h.fromPermill(r.fee),tokens:u,...l,...n}});return Promise.all(s)}async getPoolDelta(t,e,n){let{initial_amplification:s,final_amplification:a,initial_block:r,final_block:i}=e,o=E.calculateAmplification(s.toString(),a.toString(),r.toString(),i.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 i=>{let[o,l,u]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,i),this.api.query.AssetRegistry.Assets.getValue(i),this.getBalance(n,i)]);return{id:i,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:u,tradeable:o,type:l?.asset_type.type}}),a=await Promise.all(s),r=await this.api.query.AssetRegistry.Assets.getValue(t);return a.push({id:t,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:ss,tradeable:15,type:r?.asset_type.type}),a}getPoolAddress(t){let e=E.getPoolAddress(t),n=(0,mn.blake2b)(e,{dkLen:32}),s=(0,cn.toHex)(n);return(0,Qt.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(Qt.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?(0,dt.of)(t):e.watchValue("best").pipe((0,dt.switchMap)(s=>this.getPoolDelta(t.id,n,s)),(0,dt.map)(s=>Object.assign({},t,s)))}};var _e={};I(_e,{XykMath:()=>$,XykPool:()=>Dt,XykPoolClient:()=>Ct});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 Dt=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,a){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:s.decimals,decimalsOut:a.decimals,balanceIn:s.balance,balanceOut:a.balance,assetInEd:s.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=this.calculateTradeFee(s,n),r=h.toPct(n.exchangeFee),i=s+a,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 i>u&&o.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:e,feePct:r,errors:o}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=this.calculateTradeFee(s,n),r=h.toPct(n.exchangeFee),i=s-a,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 i>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:i,feePct:r,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 pn=require("polkadot-api"),dn=require("rxjs");var Ct=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:a,value:r})=>{let[i]=a,[o,l]=r,[u,d,m,p]=await Promise.all([this.getBalance(i,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(i,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:i,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(pn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,dn.of)(t)}};var Re={};I(Re,{AavePool:()=>Mt,AavePoolClient:()=>Lt});var Mt=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,a){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:a.balance,decimalsIn:s.decimals,decimalsOut:a.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=[];return e>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:a}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=[];return s>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:a}}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 bn=require("polkadot-api"),yn=require("@polkadot-api/utils"),gt=require("rxjs"),hn=require("viem");var gn=[{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:as}=tt,is=["Supply","Withdraw","Repay","Borrow"],Lt=class extends N{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:s,liqudity_in:a,liqudity_out:r})=>{let[i,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:i?.decimals,existentialDeposit:i?.existential_deposit,balance:a,location:o,type:i?.asset_type.type},{id:s,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:r,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:a}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(r=>{let i=r.id===e.id?s:a;return{...r,balance:i}})}getPoolId(t,e){let n=t+"/"+e,s=new TextEncoder().encode(n.padEnd(32,"\0")),a=(0,yn.toHex)(s);return(0,bn.AccountId)(63).dec(a)}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),a=this.api.event.Router.Executed.watch(({asset_in:i,asset_out:o})=>i===n.id||o===n.id),r=this.api.event.EVM.Log.watch(({log:i})=>{let{topics:o,data:l}=i,u=o.map(g=>g.asHex()),d=l.asHex(),{eventName:m,args:p}=(0,hn.decodeEventLog)({abi:gn,topics:u,data:d});return is.includes(m)&&p.reserve.toLowerCase()===s.toLowerCase()});return(0,gt.merge)([a,r]).pipe((0,gt.switchMap)(()=>this.getPoolDelta(t)),(0,gt.map)(i=>({...t,tokens:[...i]})))}getReserveH160Id(t){return t.type==="Erc20"?Z.findNestedKey(t.location,"AccountKey20").AccountKey20.key:as.fromAssetId(t.id)}};var bt=class{static get(t){switch(t.type){case"Aave":return Mt.fromPool(t);case"XYK":return Dt.fromPool(t);case"Omnipool":return _t.fromPool(t);case"LBP":return At.fromPool(t);case"Stableswap":return Ft.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var j=require("rxjs");var yt=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 Bt(t),this.omniClient=new kt(t),this.stableClient=new Et(t),this.xykClient=new Ct(t),this.aaveClient=new Lt(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 Ot(t.type)}};var qe={};I(qe,{DEFAULT_BLOCK_TIME:()=>Pn,DEFAULT_MIN_BUDGET:()=>De,ORDER_MIN_BLOCK_PERIOD:()=>fn,Router:()=>ht,TWAP_BLOCK_PERIOD:()=>Ht,TWAP_MAX_DURATION:()=>Me,TWAP_MAX_PRICE_IMPACT:()=>Ce,TWAP_TX_MULTIPLIER:()=>Xo,TradeOrderError:()=>Ee,TradeOrderType:()=>te,TradeRouteBuilder:()=>H,TradeRouter:()=>Pt,TradeScheduler:()=>ft,TradeType:()=>Zt});var Jt=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 rs=5,qt=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=[],a=new Jt,r=[];for(r.push([e,""]),a.enqueue(r);a.size()>0;){let i=a.dequeue();if(i==null||i.length>rs)return s;let o=i[i.length-1];(n===null||o[0]===n)&&s.push(i),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,i)){let d=[...i];d.push(u),a.enqueue(d)}})}return s}buildAndPopulateGraph(t,e){let n=new Map;for(let s of t)n.set(parseInt(s),[]);for(let[s,a,r]of e)n.get(a)?.push([r,s]);return n}};function Fe(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 a=0;a<n;a++){if(s==a)continue;let r=[e.address,e.tokens[s].id,e.tokens[a].id];t[e.tokens[s].id].push(r)}}}return t}var Nt=class{getProposals(t,e,n){let s=Fe(n),a=Object.keys(s),r=a.map(u=>s[u]).flat(),i=new qt,o=i.buildAndPopulateGraph(a,r),l=i.findPaths(o,t,e);return this.parsePaths(l)}parsePaths(t){let e=[];for(let n of t){let s=[];for(let a=0;a<n.length;a++){let r=n[a],i=n[a+1];if(i==null)break;s.push(this.toEdge(r,i))}e.push(s)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var ht=class{routeSuggester;routerOptions;ctx;defaultRouterOptions={useOnly:[]};constructor(t,e){this.ctx=t,this.routeSuggester=new Nt,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(r=>this.validPath(r,s)).map(r=>this.toHops(r,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,bt.get(e)]))}toHops(t,e){return t.map(([n,s,a])=>{let r=e.get(n);return{poolAddress:n,poolId:r?.id,pool:r?.type,assetIn:s,assetOut:a}})}};var Zt=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Zt||{}),te=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(te||{}),Ee=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Ee||{});var Pt=class extends ht{isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,s)=>{let a=n[n.length-1].amountOut,r=s[s.length-1].amountOut;return a>r?-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(a=>a.tradeFeeRange?.[0]??a.tradeFeePct).reduce((a,r)=>a+r),s=t.map(a=>a.tradeFeeRange?.[1]??a.tradeFeePct).reduce((a,r)=>a+r);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(i=>i.assetOutDecimals).reduce((i,o)=>i+o),s=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),a=n-e.assetOutDecimals,r=Math.pow(10,a);return s/BigInt(r)}async getSell(t,e,n,s){let a=await super.getPools(),r=super.validateInput(t,e,a),i=super.getPaths(t,e,a);if(i.length===0)throw new pt(t,e);let o;if(s)o=await this.toSellSwaps(n,s,r);else{let k=await Promise.all(i.map(D=>this.toSellSwaps(n,D,r)));o=this.findBestSellRoute(k)}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,r),P=g-p,y=this.getRouteFeeRange(o),S=d?u.tradeFeePct:A.calculateSellFee(g,p),f=Math.pow(10,l.assetInDecimals),T=l.amountIn*m/BigInt(f),O=A.calculateDiffToRef(g,T);return{type:"Sell",amountIn:l.amountIn,amountOut:u.amountOut,spotPrice:m,tradeFee:P,tradeFeePct:S,tradeFeeRange:y,priceImpactPct:O,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:S,tradeFeeRange:y,priceImpactPct:O,swaps:o.map(k=>k.toHuman())}}}}calculateDelta0Y(t,e,n){let s=[];for(let a=0;a<e.length;a++){let r=e[a],i=n.get(r.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(r.assetIn,r.assetOut),l;a>0?l=s[a-1]:l=t;let u=i.calculateOutGivenIn(o,l);s.push(u)}return s[s.length-1]}async toSellSwaps(t,e,n){let s=[];for(let a=0;a<e.length;a++){let r=e[a],i=n.get(r.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(r.assetIn,r.assetOut),l;a>0?l=s[a-1].amountOut:l=typeof t=="string"?b.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(i,o.assetOut),{amountOut:d,calculatedOut:m,feePct:p,errors:g}=i.validateAndSell(o,l,u),P=this.getPoolFeeRange(u),y=i.spotPriceOutGivenIn(o),S=Math.pow(10,o.decimalsIn),f=l*y/BigInt(S),T=A.calculateDiffToRef(m,f);s.push({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:d,calculatedOut:m,spotPrice:y,tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===r.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===r.assetIn},toHuman(){return{...r,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),a=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(a.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),a=await this.getMostLiquidRoute(t,e),r=await this.toSellSwaps("1",a,s),i=await this.getSellSpot(r),o=r[r.length-1].assetOutDecimals;return{amount:i,decimals:o}}findBestBuyRoute(t){let e=t.sort((n,s)=>{let a=n[0].amountIn,r=s[0].amountIn;return a>r?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(i=>i.assetInDecimals).reduce((i,o)=>i+o),s=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),a=n-e.assetInDecimals,r=Math.pow(10,a);return s/BigInt(r)}async getBuy(t,e,n,s){let a=await super.getPools(),r=super.validateInput(t,e,a),i=super.getPaths(t,e,a);if(i.length===0)throw new pt(t,e);let o;if(s)o=await this.toBuySwaps(n,s,r);else{let k=await Promise.all(i.map(D=>this.toBuySwaps(n,D,r)));o=this.findBestBuyRoute(k)}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,r),P=p-g,y=this.getRouteFeeRange(o),S=d?u.tradeFeePct:A.calculateBuyFee(g,p),f=Math.pow(10,l.assetOutDecimals),T=l.amountOut*m/BigInt(f),O;return g===0n?O=-100:O=A.calculateDiffToRef(T,g),{type:"Buy",amountOut:l.amountOut,amountIn:u.amountIn,spotPrice:m,tradeFee:P,tradeFeePct:S,tradeFeeRange:y,priceImpactPct:O,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:S,tradeFeeRange:y,priceImpactPct:O,swaps:o.map(k=>k.toHuman())}}}}calculateDelta0X(t,e,n){let s=[];for(let a=e.length-1;a>=0;a--){let r=e[a],i=n.get(r.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(r.assetIn,r.assetOut),l;a==e.length-1?l=t:l=s[0];let u=i.calculateInGivenOut(o,l);s.unshift(u)}return s[0]}async toBuySwaps(t,e,n){let s=[];for(let a=e.length-1;a>=0;a--){let r=e[a],i=n.get(r.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(r.assetIn,r.assetOut),l;a==e.length-1?l=typeof t=="string"?b.toBigInt(t,o.decimalsOut):t:l=s[0].amountIn;let u=await this.ctx.getPoolFees(i,o.assetOut),{amountIn:d,calculatedIn:m,feePct:p,errors:g}=i.validateAndBuy(o,l,u),P=this.getPoolFeeRange(u),y=i.spotPriceInGivenOut(o),S=Math.pow(10,o.decimalsOut),f=l*y/BigInt(S),T;m===0n?T=-100:T=A.calculateDiffToRef(f,m),s.unshift({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:d,calculatedIn:m,spotPrice:y,tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===r.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===r.assetIn},toHuman(){return{...r,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,De=1000000000000000n,Ht=6,Ce=-5,Me=216e5,Xo=3,fn=6;var Le=require("polkadot-api");var H=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:s,poolId:a})=>s==="Stableswap"?{pool:(0,Le.Enum)("Stableswap",a),asset_in:e,asset_out:n}:{pool:(0,Le.Enum)(s),asset_in:e,asset_out:n})}};var ft=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??De})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,s,a){let[r,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:u}=i,d=l[0],m=l[l.length-1],{assetInDecimals:p}=d,{assetOutDecimals:g}=m,P=Math.abs(u),y=this.getMinimumTradeCount(o,r),S=this.getOptimalTradeCount(P),f=a?Math.round(s/a):S,T=Math.ceil(s/y),O=Math.round(s/S),k=Math.round(s/f),D=o/BigInt(f),C=await this.router.getBestSell(t,e,D),Q=o<r,Gt=[];Q&&Gt.push("OrderTooSmall");let Ut=C.amountOut*BigInt(f),ie=this.toBlockPeriod(k),re=C.tradeFee*BigInt(f),An=H.build(l),We={assetIn:t,assetOut:e,errors:Gt,frequencyMin:T,frequencyOpt:O,frequency:k,tradeCount:f,tradeFee:re,tradeImpactPct:C.priceImpactPct,tradePeriod:ie,tradeRoute:An,type:"Dca"};return{...We,amountIn:o,amountOut:Ut,tradeAmountIn:C.amountIn,tradeAmountOut:C.amountOut,toHuman(){return{...We,amountIn:b.toDecimal(o,p),amountOut:b.toDecimal(Ut,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,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:r,swaps:i,priceImpactPct:o}=a,l=i[0],u=i[i.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),P=r/BigInt(g),y=await this.router.getBestSell(l.assetIn,u.assetOut,P),S=g===1,f=r<s,T=y.priceImpactPct<-5,O=[];f||S?O.push("OrderTooSmall"):T&&O.push("OrderImpactTooBig");let k=y.amountOut*BigInt(g),D=y.tradeFee*BigInt(g),C=H.build(i),Q={assetIn:t,assetOut:e,errors:O,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:C,type:"TwapSell"};return{...Q,amountIn:r,amountOut:k,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:D,toHuman(){return{...Q,amountIn:b.toDecimal(r,d),amountOut:b.toDecimal(k,m),tradeAmountIn:b.toDecimal(y.amountIn,d),tradeAmountOut:b.toDecimal(y.amountOut,m),tradeFee:b.toDecimal(D,m)}}}}async getTwapBuyOrder(t,e,n){let[s,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:r,swaps:i,priceImpactPct:o}=a,l=i[0],u=i[i.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),P=r/BigInt(g),y=await this.router.getBestBuy(l.assetIn,u.assetOut,P),S=y.amountIn*BigInt(g),f=g===1,T=S<s,O=y.priceImpactPct<-5,k=[];T||f?k.push("OrderTooSmall"):O&&k.push("OrderImpactTooBig");let D=y.tradeFee*BigInt(g),C=H.build(i),Q={assetIn:t,assetOut:e,errors:k,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:C,type:"TwapBuy"};return{...Q,amountIn:S,amountOut:r,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:D,toHuman(){return{...Q,amountIn:b.toDecimal(S,d),amountOut:b.toDecimal(r,m),tradeAmountIn:b.toDecimal(y.amountIn,d),tradeAmountOut:b.toDecimal(y.amountOut,m),tradeFee:b.toDecimal(D,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 Ge={};I(Ge,{BIG_10:()=>wn,BIG_BILL:()=>In,StakingApi:()=>Ne,StakingClient:()=>He});var Tn=require("consts"),xn=require("@polkadot/util-crypto"),Sn=require("@polkadot/util"),rt=require("@galacticcouncil/math-staking"),it=Xt(require("big.js")),wn=(0,it.default)(10),In=(0,it.default)(wn.pow(12));function os(c){return(0,xn.encodeAddress)((0,Sn.stringToU8a)(("modl"+c).padEnd(32,"\0")),Tn.HYDRATION_SS58_PREFIX)}var Ne=class{client;constructor(t){this.client=t}async getFreePotBalance(){let t=await this.client.getPalletId(),e=os(t);return this.client.getBalance(e)}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]),s=e?.created_at,a=await n.reduce(async(r,[i,o])=>{let l=await r,u=i,d=o.amount,m=o.conviction.toString(),p=await this.client.getReferendumInfo(u);return p&&(p.type==="Approved"||p.type==="Rejected")&&l.push({id:u,amount:d,conviction:m}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt:s,actionPoints:e?.action_points,accumulatedUnpaidRewards:e?.accumulated_unpaid_rewards,accumulatedSlashPoints:e?.accumulated_slash_points,accumulatedLockedRewards:e?.accumulated_locked_rewards,votes:a}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,s]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),a=s.find(r=>r)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:a,stakePosition:a?await this.getStakingPosition(a):void 0}}async getRewards(t){let e=await this.getStake(t),{potReservedBalance:n,accumulatedRewardPerStake:s,totalStake:a,stakePosition:r}=e;if(!r)return;let[i,o,l,u,d]=await Promise.all([this.client.getBlockNumber(),this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),m=(0,it.default)(o.toString()).minus(n.toString()),p=s.toString(),g=i.toString(),P=(0,it.default)(g).plus(1).toString();m.gt(0)&&a>0&&(p=(0,rt.calculate_accumulated_rps)(s.toString(),m.toString(),a.toString()));let y=(0,rt.calculate_period_number)(l.toString(),g,d??P),S=(0,rt.calculate_period_number)(l.toString(),r.createdAt?.toString()??"",d??P),f=(0,rt.calculate_rewards)(p,r.rewardPerStake?.toString()??"",r.stake?.toString()??""),T=(0,it.default)(f).plus(r.accumulatedUnpaidRewards?.toString()||"0").plus(r.accumulatedLockedRewards?.toString()||"0");if(!(0,it.default)(y).minus(S).lte(u.toString()))return T.div(In).toString()}};var vn=require("api"),He=class extends vn.Papi{async getBalance(t){return(await this.api.query.System.Account.getValue(t)).data.free}async getBlockNumber(){return await this.api.query.System.Number.getValue({at:"best"})}async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:r})=>{let[i,o,l]=r;return{address:i,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var Ve={};I(Ve,{TxBuilderFactory:()=>xt});var Ue=require("polkadot-api");function On(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var Tt=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:ce})}async dryRun(t,e){let n=(0,Ue.Enum)("Signed",t),s=(0,Ue.Enum)("system",n),r=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(s,e.decodedCall),i=r.success&&!r.value.execution_result.success?r.value.execution_result.value.error:null;if(i){let o=On(i.value);throw new Error("Dry run execution error!",{cause:o})}return r}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var ee=class extends Tt{_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],a=await this.balanceClient.getBalance(this.beneficiary,s);return t>=a-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],a=n[n.length-1],r=A.getFraction(t,this.slippagePct),i=s.assetIn,o=a.assetOut,l=t+r,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.buy({asset_in:i,asset_out:o,amount:e,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:i,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],a=n[n.length-1],r=A.getFraction(e,this.slippagePct),i=s.assetIn,o=a.assetOut,l=e-r,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.sell({asset_in:i,asset_out:o,amount:t,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:i,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],a=A.getFraction(t,this.slippagePct),r=n.assetIn,i=s.assetOut,o=t-a,l=this.api.tx.Router.sell_all({asset_in:r,asset_out:i,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 ne=require("polkadot-api");var se=class extends Tt{_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:a,tradeRoute:r}=this.order,i=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:a,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,ne.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:0n,route:r})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",i)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:a,tradePeriod:r,tradeRoute:i}=this.order,o=A.getFraction(a,this.slippagePct),l=a-o,u=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,ne.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:l,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",u)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:a,tradePeriod:r,tradeRoute:i}=this.order,o=A.getFraction(s,this.slippagePct),l=s+o,u=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,ne.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:a,max_amount_in:l,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",u)}};var xt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e??new L}trade(t){return new ee(this.client,this.evmClient).setTrade(t)}order(t){return new se(this.client,this.evmClient).setOrder(t)}};var ae=require("staking");async function ls(c,t,e){let n=new mt(c),[s,a]=await Promise.all([n.getBlockTime(),n.getMinOrderBudget()]),r=t??new L,i=new yt(c).withAave().withOmnipool().withStableswap().withXyk(),o=new et(r),l=new Pt(i),u=new ft(l,{blockTime:s,minBudgetInNative:a}),d=new ae.StakingApi(e??new ae.StakingClient(c));return{api:{aave:o,router:l,scheduler:u,staking:d},client:{asset:new ct(c),balance:new X(c),evm:r},ctx:{pool:i},tx:new xt(c,r),destroy:()=>{i.destroy()}}}0&&(module.exports={aave,api,big,client,const:null,createSdkContext,erc20,error,evm,fmt,h160,json,math,pool,sor,staking,tx,xc});
package/build/index.mjs CHANGED
@@ -1 +1 @@
1
- var Xe=Object.defineProperty;var w=(c,t)=>{for(var e in t)Xe(c,e,{get:t[e],enumerable:!0})};var pe={};w(pe,{Papi:()=>_,getWs:()=>ze});import{hydration as Ye}from"@galacticcouncil/descriptors";function me(c){switch(c){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var _=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(Ye)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");me(n)&&console.log(t,...e)}};import{createClient as je}from"polkadot-api";import{withPolkadotSdkCompat as Ke}from"polkadot-api/polkadot-sdk-compat";var ze=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 je(Ke(s))};var Ie={};w(Ie,{AAVE_GAS_LIMIT:()=>Wt,AAVE_LENDING_POOL_ADDRESS:()=>Rt,AAVE_POOL_ABI:()=>Ut,AAVE_POOL_DATA_PROVIDER:()=>_t,AAVE_POOL_DATA_PROVIDER_ABI:()=>Bt,AAVE_POOL_PROXY:()=>Vt,AAVE_ROUNDING_THRESHOLD:()=>Sa,AAVE_UINT_256_MAX:()=>$e,AaveClient:()=>ut,AaveUtils:()=>Y});var Ut=[{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 Bt=[{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 Vt="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",_t="0x112b087b60C1a166130d59266363C45F8aa99db0",Rt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Wt=1000000n,Sa=5,$e=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var ye={};w(ye,{EvmClient:()=>F,evmMainnet:()=>Xt});import{defineChain as Qe}from"viem";var de=["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"],ge=["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"],Xt=Qe({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{public:{http:de,webSocket:ge},default:{http:de,webSocket:ge}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});import{createPublicClient as be,createWalletClient as Je,custom as Ze,http as tn,webSocket as en}from"viem";var F=class{chain;constructor(t){this.chain=t||Xt}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 be({chain:this.chain,transport:tn()})}getWsProvider(){return be({chain:this.chain,transport:en()})}getSigner(t){return Je({account:t,chain:this.chain,transport:Ze(window.ethereum)})}};var ut=class{evmClient;constructor(t){this.evmClient=t??new F}async getReservesData(){return await this.evmClient.getProvider().readContract({abi:Bt,address:_t,args:[Rt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.evmClient.getProvider().readContract({abi:Bt,address:_t,args:[Rt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.evmClient.getProvider().readContract({abi:Ut,address:Vt,args:[t],functionName:"getUserAccountData"})}};var y={};w(y,{asBigInt:()=>an,toBigInt:()=>sn,toDecimal:()=>nn});import W from"big.js";W.NE=-18;function nn(c,t,e=6,n){let s=W(c.toString()),a=W(10).pow(t);return s.div(a).round(e,n).toString()}function sn(c,t){let e=W(10).pow(t),s=W(c).mul(e).toFixed(0,W.roundDown);return BigInt(s)}function an(c){return BigInt(c.round(0,W.roundDown).toFixed(0))}var K={};w(K,{ERC20:()=>Yt});var Yt=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={};w(h,{fromPermill:()=>ln,toDecimals:()=>on,toPct:()=>rn});var he=1e3;function rn(c){let[t,e]=c;return t/e*100}function on(c){let[t,e]=c;return t/e}function ln(c){return[c/he,he]}var kt={};w(kt,{H160:()=>$t,isEvmAccount:()=>Te,isEvmAddress:()=>xe,isSs58Address:()=>Se});import{AccountId as ct}from"polkadot-api";import{toHex as fe}from"@polkadot-api/utils";import{Buffer as V}from"buffer";var Pe={};w(Pe,{HUB_ASSET_ID:()=>Kt,HYDRATION_OMNIPOOL_ADDRESS:()=>cn,HYDRATION_PARACHAIN_ID:()=>un,HYDRATION_SS58_PREFIX:()=>D,RUNTIME_DECIMALS:()=>E,SYSTEM_ASSET_DECIMALS:()=>jt,SYSTEM_ASSET_ID:()=>N,TRADEABLE_DEFAULT:()=>z});var E=18,N=0,jt=12,un=2034,D=63,cn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Kt=1,z=15;var zt="ETH\0";function Te(c){if(!c)return!1;try{let t=ct().enc(c),e=V.from(zt);return V.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function xe(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function Se(c){try{return ct(63).enc(c),!0}catch{return!1}}var $t=class c{static toAccount=t=>{let e=V.from(t.slice(2),"hex"),n=V.from(zt),s=Uint8Array.from(V.concat([n,e,V.alloc(8)])),a=fe(s);return ct(63).dec(a)};static fromAccount=t=>{let e=ct().enc(t),n=V.from(zt),s=e.slice(n.length,-8);return"0x"+V.from(s).toString("hex")};static fromSS58=t=>{let n=ct().enc(t).slice(0,20);return fe(n)};static fromAny=t=>{if(xe(t))return t;if(Te(t))return c.fromAccount(t);if(Se(t))return c.fromSS58(t);throw new Error("Unknown address type")}};var X={};w(X,{findNestedKey:()=>mn,findNestedObj:()=>pn,jsonFormatter:()=>dn});var mn=(c,t)=>{let e=[];return JSON.stringify(c,(n,s)=>(s&&s[t]&&e.push(s),s)),e[0]},pn=(c,t,e)=>{let n;return JSON.stringify(c,(s,a)=>(a&&a[t]===e&&(n=a),a)),n},dn=(c,t)=>typeof t=="bigint"?t.toString():t;var v={};w(v,{calculateBuyFee:()=>hn,calculateDiffToAvg:()=>gn,calculateDiffToRef:()=>bn,calculateSellFee:()=>yn,getFraction:()=>Pn});import H from"big.js";function gn(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 bn(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 yn(c,t){let e=H(c.toString()),n=H(t.toString());return H(1).minus(n.div(e)).mul(100).round(2).toNumber()}function hn(c,t){let e=H(c.toString());return H(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Pn(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 we={};w(we,{convertToId:()=>Tn});import{Buffer as fn}from"buffer";function Tn(c){let e=fn.from(c.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Ft}=K,{H160:Qt}=kt,xn=1.01,Sn=99999,wn=10n**27n,In=10n**18n,Y=class{client;constructor(t){let e=t??new F;this.client=new ut(e)}async getSummary(t){let e=Qt.fromAny(t),[n,s,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[r]=n,[i,o]=s,[l,u,d,m,p,g]=a,P=y.toDecimal(g,18),b=[];for(let x of i){let f=x.underlyingAsset.toLowerCase(),T=r.find(({underlyingAsset:Gt})=>Gt.toLowerCase()===f);if(!T)throw new Error("Missing pool reserve for "+f);let S=x.scaledATokenBalance,O=T.liquidityIndex,R=T.priceInMarketReferenceCurrency,k=S*O/wn,Ot=Number(o===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,At=T.usageAsCollateralEnabled&&x.usageAsCollateralEnabledOnUser&&x.scaledATokenBalance>0n,Ht=Ft.toAssetId(f);b.push({aTokenBalance:k,decimals:Number(T.decimals),isCollateral:At,priceInRef:R,reserveId:Ht,reserveAsset:f,reserveLiquidationThreshold:Ot})}return{healthFactor:Number(P),totalCollateral:l,totalDebt:u,reserves:b}}async hasBorrowPositions(t){let e=Qt.fromAny(t),n=await this.client.getUserAccountData(e),[s,a]=n;return a>0n}async getHealthFactor(t){let e=Qt.fromAny(t),n=await this.client.getUserAccountData(e),[s,a,r,i,o,l]=n,u=y.toDecimal(l,18);return Number(u)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:s,totalDebt:a,reserves:r}=await this.getSummary(t),i=Ft.fromAssetId(e),o=r.find(b=>b.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,isCollateral:u,priceInRef:d,reserveLiquidationThreshold:m}=o,p=y.toBigInt(n,l),g=u?p*d/10n**BigInt(l):0n,P=s-g;return P<=0n?0:this.calculateHealthFactor(P,m,a)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:s,totalDebt:a,reserves:r}=await this.getSummary(t),i=Ft.fromAssetId(e),o=r.find(P=>P.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,priceInRef:u,reserveLiquidationThreshold:d}=o,p=y.toBigInt(n,l)*u/10n**BigInt(l),g=s+p;return g<=0n?0:this.calculateHealthFactor(g,d,a)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:s,reserves:a}=await this.getSummary(t),r=Ft.fromAssetId(e),i=a.find(o=>o.reserveAsset===r);if(!i)throw new Error("Missing reserve ctx for "+r);return this.calculateWithdrawMax(i,n,s)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:s}=await this.getSummary(t),a={};for(let r of s){let i=this.calculateWithdrawMax(r,e,n);r.reserveId&&(a[r.reserveId]=i)}return a}calculateHealthFactor(t,e,n){if(n===0n)return Sn;let s=10n**6n,a=y.toBigInt(e,18),r=t*a*s,i=n*In,o=r/i;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let s=y.toBigInt(t,18),a=y.toBigInt(e,18);return(s*n+a-1n)/a}calculateWithdrawMax(t,e,n){let{aTokenBalance:s,decimals:a,priceInRef:r,reserveLiquidationThreshold:i}=t,o=this.calculateRequiredCollateral(xn,i,n),l=e-o;if(l<=0n)return{amount:0n,decimals:a};let u=l*10n**BigInt(a)/r;return{amount:s<u?s:u,decimals:a}}};var Oe={};w(Oe,{AssetClient:()=>$,BalanceClient:()=>q,ChainParams:()=>J});var $=class extends _{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[a]=n;return[a,s]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[a]=n;return[a,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[a]=n;return[a,s]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[a]=n;return[a,s]}))}async mapToken(t,e,n,s){let{name:a,asset_type:r,is_sufficient:i,existential_deposit:o}=e,{symbol:l,decimals:u}=n.get(t)??{};return{id:t,name:a?.asText(),symbol:l,decimals:u,icon:l,type:r.type,isSufficient:i,location:s,existentialDeposit:o}}async mapBond(t,e,n,s){let[a,r]=s,{asset_type:i,is_sufficient:o,existential_deposit:l}=e,{symbol:u,decimals:d}=await this.mapToken(a,e,n),m=Number(r),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:i.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:a,maturity:m}}async mapShares(t,e,n,s){let{assets:a}=s,{name:r,symbol:i,asset_type:o,is_sufficient:l,existential_deposit:u}=e,d=await Promise.all(a.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:i?.asText()||r?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:m}}async mapExternal(t,e,n,s){let a=await this.mapToken(t,e,new Map,s),r=n?.find(i=>i.internalId===a.id);return r?{...a,decimals:r.decimals,name:r.name,symbol:r.symbol,icon:r.symbol,isWhiteListed:r.isWhiteListed}:a}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,a,r]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),i=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=r.get(l);p=await this.mapBond(l,u,i,g);break;case"StableSwap":let P=a.get(l);p=await this.mapShares(l,u,i,P);break;case"External":p=await this.mapExternal(l,u,e,d);break;default:p=await this.mapToken(l,u,i,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 vn,bufferCount as On,combineLatest as An,debounceTime as Bn,distinctUntilChanged as ve,finalize as _n,map as Q,pairwise as Rn,shareReplay as kn,startWith as Fn}from"rxjs";var q=class extends _{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:a}=await n.getValue(t,e);return s-a}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 An([e,n,s]).pipe(Bn(250),Q(a=>a.flat()),Fn([]),On(2,1),Q(([a,r],i)=>{if(i===0)return r;let o=a.reduce((u,d)=>(u.set(d.id,d.amount),u),new Map);return r.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:a}=n.data;return{id:0,amount:s-a}}))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(Q(s=>{let{free:a,frozen:r}=s;return{id:e,amount:a-r}}))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(ve((n,s)=>!s.deltas),Q(({deltas:n})=>{let s=[];return n?.deleted.forEach(a=>{let[r,i]=a.args;s.push({id:i,amount:0n})}),n?.upserted.forEach(a=>{let[r,i]=a.args,{free:o,frozen:l}=a.value;s.push({id:i,amount:o-l})}),s}))}subscribeErc20Balance(t,e){let n=new vn,s=n.pipe(kn(1)),a=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}),r=async()=>{let o=e||await a(),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()},i;return r().then(o=>i=o),s.pipe(_n(()=>i?.()),Rn(),Q(([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))}),ve((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 _{_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 Ae={};w(Ae,{AssetNotFound:()=>Jt,PoolNotFound:()=>mt,RouteNotFound:()=>Z});var Jt=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},mt=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 Ce={};w(Ce,{PoolContextProvider:()=>nt,PoolError:()=>j,PoolFactory:()=>et,PoolType:()=>A,aave:()=>se,lbp:()=>Zt,omni:()=>te,stable:()=>ee,xyk:()=>ne});var Zt={};w(Zt,{LbpMath:()=>L,LbpPool:()=>pt,LbpPoolClient:()=>dt});import{calculate_in_given_out as En,calculate_out_given_in as Dn,calculate_linear_weights as Cn,calculate_pool_trade_fee as Mn,get_spot_price as Ln}from"@galacticcouncil/math-lbp";var L=class{static getSpotPrice(t,e,n,s,a){return Ln(t,e,n,s,a)}static calculateInGivenOut(t,e,n,s,a){return En(t,e,n,s,a)}static calculateOutGivenIn(t,e,n,s,a){return Dn(t,e,n,s,a)}static calculateLinearWeights(t,e,n,s,a){return Cn(t,e,n,s,a)}static calculatePoolTradeFee(t,e,n){return Mn(t,e,n)}};var A=(a=>(a.Aave="Aave",a.LBP="LBP",a.Omni="Omnipool",a.Stable="Stableswap",a.XYK="XYK",a))(A||{}),j=(a=>(a.InsufficientTradingAmount="InsufficientTradingAmount",a.MaxInRatioExceeded="MaxInRatioExceeded",a.MaxOutRatioExceeded="MaxOutRatioExceeded",a.TradeNotAllowed="TradeNotAllowed",a.UnknownError="UnknownError",a))(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,a,r,i){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a,this.fee=r,this.repayFeeApply=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:a.balance,decimalsIn:s.decimals,decimalsOut:a.decimals,weightIn:s.weight,weightOut:a.weight}}validateAndBuy(t,e,n){let s=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let r=t.balanceOut/this.maxOutRatio;if(e>r&&a.push("MaxOutRatioExceeded"),s===t.assetOut){let i=this.calculateTradeFee(e,n),o=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+i,u=this.calculateInGivenOut(t,l),d=t.balanceIn/this.maxInRatio;return u>d&&a.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:a}}else{let i=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return i>o&&a.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:i,amountOut:e,feePct:0,errors:a}}}validateAndSell(t,e,n){let s=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let r=t.balanceIn/this.maxInRatio;if(e>r&&a.push("MaxInRatioExceeded"),s===t.assetIn){let i=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return i>o&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:i,feePct:0,errors:a}}else{let i=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(i,n),l=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),u=i-o,d=t.balanceOut/this.maxOutRatio;return u>d&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:u,feePct:l,errors:a}}}calculateInGivenOut(t,e){let n=L.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=L.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=L.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=L.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=L.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 Wn}from"polkadot-api";import{map as Xn,of as Fe,switchMap as Yn}from"rxjs";import{memoize1 as qn}from"@thi.ng/memoize";import{combineLatest as Be,combineLatestAll as Nn,debounceTime as Hn,firstValueFrom as Gn,from as _e,map as Re,mergeAll as Un,of as Vn,switchMap as ke}from"rxjs";var C=class extends q{override=[];mem=0;memPools=qn(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=_e(this.getPoolsMem()).pipe(ke(e=>this.subscribe(e)),Nn());return Gn(t)}getSubscriber(){return _e(this.getPoolsMem()).pipe(ke(t=>this.subscribe(t)),Un())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>Be([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe(Hn(250),Re(([n,s])=>this.updatePool(n,s))))}subscribePoolBalance(t){if(t.type==="Aave")return Vn([]);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(a=>a.type==="Erc20").map(a=>a.id),s=this.subscribeErc20Balance(t.address,n);e.push(s)}return Be(e).pipe(Re(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 a=this.override.find(i=>i.id===e),r=!!n||!!a?.decimals;return s>0n&&r})}updatePool=(t,e)=>{let n=t.tokens.map(s=>{let a=e.find(i=>i.id===s.id),r=this.override.find(i=>i.id===s.id);return a?{...s,balance:a.amount,decimals:s.decimals||r?.decimals}:{...s,decimals:s.decimals||r?.decimals}});return{...t,tokens:n}}};var dt=class extends C{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,a=t.filter(({value:r})=>e&&this.isActivePool(r,s)).map(async({keyArgs:r,value:i})=>{let[o]=r,l=o.toString(),u=await this.getPoolDelta(l,i,s);return{address:l,type:"LBP",fee:i.fee,...u,...n}});return Promise.all(a)}async getPoolDelta(t,e,n){let{start:s,end:a,assets:r,initial_weight:i,final_weight:o,repay_target:l,fee_collector:u}=e,d=L.calculateLinearWeights(s?s.toString():"0",a?a.toString():"0",i.toString(),o.toString(),n.toString()),[m,p]=r,g=BigInt(d),P=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:P,type:S?.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(Wn.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe(Yn(s=>s?this.getPoolDelta(t.address,n,s.relay_parent_number):Fe(t)),Xn(s=>Object.assign({},t,s))):Fe(t)}};var te={};w(te,{OmniMath:()=>I,OmniPool:()=>gt,OmniPoolClient:()=>bt});import{calculate_in_given_out as jn,calculate_lrna_in_given_out as Kn,calculate_out_given_in as zn,calculate_out_given_lrna_in as $n,calculate_spot_price as Qn,calculate_lrna_spot_price as Jn,calculate_shares as Zn,calculate_liquidity_out as ts,calculate_liquidity_lrna_out as es,verify_asset_cap as ns,calculate_liquidity_hub_in as ss,is_sell_allowed as as,is_buy_allowed as is,is_add_liquidity_allowed as rs,is_remove_liquidity_allowed as os}from"@galacticcouncil/math-omnipool";import tt from"big.js";var I=class{static calculateSpotPrice(t,e,n,s){return Qn(t,e,n,s)}static calculateLrnaSpotPrice(t,e){return Jn(t,e)}static calculateInGivenOut(t,e,n,s,a,r,i,o,l){return jn(t,e,n,s,a,r,i,o,l)}static calculateLrnaInGivenOut(t,e,n,s,a){return Kn(t,e,n,s,a)}static calculateOutGivenIn(t,e,n,s,a,r,i,o,l){return zn(t,e,n,s,a,r,i,o,l)}static calculateOutGivenLrnaIn(t,e,n,s,a){return $n(t,e,n,s,a)}static calculateShares(t,e,n,s){return Zn(t,e,n,s)}static calculateLiquidityOut(t,e,n,s,a,r,i,o){return ts(t,e,n,s,a,r,i,o)}static calculateLiquidityLRNAOut(t,e,n,s,a,r,i,o){return es(t,e,n,s,a,r,i,o)}static calculateCapDifference(t,e,n,s){let a=tt(e),r=tt(t),i=tt(s),o=tt(n),l=tt(10).pow(18),u=o.div(l);if(a.div(i).lt(u)){let m=u.times(i).minus(a).times(r),p=a.times(tt(1).minus(u));return m.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,s){return ns(t,e,n,s)}static calculateLimitHubIn(t,e,n,s){return ss(t,e,n,s)}static isSellAllowed(t){return as(t)}static isBuyAllowed(t){return is(t)}static isAddLiquidityAllowed(t){return rs(t)}static isRemoveLiquidityAllowed(t){return os(t)}};var gt=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,a,r){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a,this.hubAssetId=r}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:s.hubReserves,hubReservesOut:a.hubReserves,sharesIn:s.shares,sharesOut:a.shares,decimalsIn:s.decimals,decimalsOut:a.decimals,balanceIn:s.balance,balanceOut:a.balance,tradeableIn:s.tradeable,tradeableOut:a.tradeable,assetInEd:s.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),r=s===0n?0:v.calculateDiffToRef(a,s),i=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&i.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&i.push("MaxOutRatioExceeded");let d=t.balanceIn/this.maxInRatio;return a>d&&i.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:s,amountOut:e,feePct:r,errors:i}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),r=v.calculateDiffToRef(s,a),i=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&i.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&i.push("MaxInRatioExceeded");let d=t.balanceOut/this.maxOutRatio;return a>d&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:a,feePct:r,errors:i}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let s=I.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"),a=BigInt(s);return a<0n?0n:a}calculateLrnaInGivenOut(t,e,n){let s=I.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0"),a=BigInt(s);return a<0n?0n:a}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let s=I.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"),a=BigInt(s);return a<0n?0n:a}calculateOutGivenLrnaIn(t,e,n){let s=I.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0"),a=BigInt(s);return a<0n?0n:a}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=I.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=I.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=I.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=I.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as ls,CompatibilityLevel as us}from"polkadot-api";import{toHex as cs}from"@polkadot-api/utils";import{distinctUntilChanged as ms,map as Ee}from"rxjs";var bt=class extends C{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,s,a,r,i]=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: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:P,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:r,tradeable:s,type:a?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...i}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=cs(e);return ls(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,a]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),r=n.min_fee+s.min_fee,i=n.max_fee+s.max_fee;if(a){let{asset_fee:o,protocol_fee:l}=a;return{assetFee:h.fromPermill(o),protocolFee:h.fromPermill(l),min:h.fromPermill(r),max:h.fromPermill(i)}}else return{assetFee:h.fromPermill(n.min_fee),protocolFee:h.fromPermill(s.min_fee),min:h.fromPermill(r),max:h.fromPermill(i)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(us.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(ms((n,s)=>!s.deltas),Ee(({entries:n})=>n.map(s=>{let[a]=s.args,{hub_reserve:r,shares:i,tradable:o,cap:l,protocol_shares:u}=s.value,d=t.tokens.findIndex(p=>p.id===a);return{...t.tokens[d],cap:l,hubReserves:r,protocolShares:u,shares:i,tradeable:o}})),Ee(n=>{let s=t.tokens.find(a=>a.id===1);return{...t,tokens:[...n,s]}}))}};var ee={};w(ee,{StableMath:()=>B,StableSwap:()=>yt,StableSwapClient:()=>ht});import{calculate_in_given_out as ps,calculate_out_given_in as ds,calculate_amplification as gs,calculate_add_one_asset as bs,calculate_liquidity_out_one_asset as ys,calculate_shares as hs,calculate_shares_for_amount as Ps,calculate_spot_price_with_fee as fs,pool_account_name as Ts,recalculate_peg as xs}from"@galacticcouncil/math-stableswap";var B=class{static getPoolAddress(t){return Ts(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,a){return gs(t,e,n,s,a)}static calculateInGivenOut(t,e,n,s,a,r,i){return ps(t,e,n,s,a,r,i)}static calculateAddOneAsset(t,e,n,s,a,r,i){return bs(t,e,n,s,a,r,i)}static calculateSharesForAmount(t,e,n,s,a,r,i){return Ps(t,e,n,s,a,r,i)}static calculateOutGivenIn(t,e,n,s,a,r,i){return ds(t,e,n,s,a,r,i)}static calculateLiquidityOutOneAsset(t,e,n,s,a,r,i){return ys(t,e,n,s,a,r,i)}static calculateShares(t,e,n,s,a,r){return hs(t,e,n,s,a,r)}static calculateSpotPriceWithFee(t,e,n,s,a,r,i,o){return fs(t,e,n,s,a,r,i,o)}static recalculatePegs(t,e,n,s,a){return xs(t,e,n,s,a)}};var yt=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,a,r,i,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a,this.amplification=r,this.id=i,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:a.balance,decimalsIn:s.decimals,decimalsOut:a.decimals,tradeableIn:this.id===t?15:s.tradeable,tradeableOut:this.id===e?15:a.tradeable,assetInEd:s.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),r=h.toPct(n.fee),i=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&i.push("InsufficientTradingAmount"),{amountIn:a,calculatedIn:s,amountOut:e,feePct:r,errors:i}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),r=h.toPct(n.fee),i=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&i.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:s,amountOut:a,feePct:r,errors:i}}calculateIn(t,e,n){let s=B.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateAddOneAsset(t,e,n){let s=B.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateSharesForAmount(t,e,n){let s=B.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}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?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateWithdrawOneAsset(t,e,n){let s=B.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateShares(t,e,n){let s=B.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}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 Ss,CompatibilityLevel as ws}from"polkadot-api";import{toHex as Is}from"@polkadot-api/utils";import{blake2b as vs}from"@noble/hashes/blake2b";import{map as Os,of as As,switchMap as Bs}from"rxjs";var _s=340282366920938463463374607431768211455n,ht=class extends C{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:a,value:r})=>{let[i]=a,o=this.getPoolAddress(i),[l,u]=await Promise.all([this.getPoolDelta(i,r,e),this.getPoolTokens(i,r)]);return this.poolsData.set(o,r),{address:o,id:i,type:"Stableswap",fee:h.fromPermill(r.fee),tokens:u,...l,...n}});return Promise.all(s)}async getPoolDelta(t,e,n){let{initial_amplification:s,final_amplification:a,initial_block:r,final_block:i}=e,o=B.calculateAmplification(s.toString(),a.toString(),r.toString(),i.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 i=>{let[o,l,u]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,i),this.api.query.AssetRegistry.Assets.getValue(i),this.getBalance(n,i)]);return{id:i,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:u,tradeable:o,type:l?.asset_type.type}}),a=await Promise.all(s),r=await this.api.query.AssetRegistry.Assets.getValue(t);return a.push({id:t,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:_s,tradeable:15,type:r?.asset_type.type}),a}getPoolAddress(t){let e=B.getPoolAddress(t),n=vs(e,{dkLen:32}),s=Is(n);return Ss(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(ws.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?As(t):e.watchValue("best").pipe(Bs(s=>this.getPoolDelta(t.id,n,s)),Os(s=>Object.assign({},t,s)))}};var ne={};w(ne,{XykMath:()=>G,XykPool:()=>Pt,XykPoolClient:()=>ft});import{calculate_in_given_out as Rs,calculate_out_given_in as ks,calculate_pool_trade_fee as Fs,get_spot_price as Es,calculate_liquidity_in as Ds,calculate_shares as Cs,calculate_spot_price as Ms,calculate_spot_price_with_fee as Ls,calculate_liquidity_out_asset_a as qs,calculate_liquidity_out_asset_b as Ns}from"@galacticcouncil/math-xyk";var G=class{static getSpotPrice(t,e,n){return Es(t,e,n)}static calculateInGivenOut(t,e,n){return Rs(t,e,n)}static calculateOutGivenIn(t,e,n){return ks(t,e,n)}static calculatePoolTradeFee(t,e,n){return Fs(t,e,n)}static calculateLiquidityIn(t,e,n){return Ds(t,e,n)}static calculateSpotPrice(t,e){return Ms(t,e)}static calculateSpotPriceWithFee(t,e,n,s){return Ls(t,e,n,s)}static calculateShares(t,e,n){return Cs(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,s){return qs(t,e,n,s)}static calculateLiquidityOutAssetB(t,e,n,s){return Ns(t,e,n,s)}};var Pt=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,a){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:s.decimals,decimalsOut:a.decimals,balanceIn:s.balance,balanceOut:a.balance,assetInEd:s.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=this.calculateTradeFee(s,n),r=h.toPct(n.exchangeFee),i=s+a,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 i>u&&o.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:e,feePct:r,errors:o}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=this.calculateTradeFee(s,n),r=h.toPct(n.exchangeFee),i=s-a,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 i>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:i,feePct:r,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 Hs}from"polkadot-api";import{of as Gs}from"rxjs";var ft=class extends C{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),s=e.map(async({keyArgs:a,value:r})=>{let[i]=a,[o,l]=r,[u,d,m,p]=await Promise.all([this.getBalance(i,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(i,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:i,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(Hs.BackwardsCompatible,e)}subscribePoolChange(t){return Gs(t)}};var se={};w(se,{AavePool:()=>Tt,AavePoolClient:()=>xt});var Tt=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,a){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:a.balance,decimalsIn:s.decimals,decimalsOut:a.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=[];return e>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:a}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=[];return s>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:a}}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 Us}from"polkadot-api";import{toHex as Vs}from"@polkadot-api/utils";import{map as Ws,merge as Xs,switchMap as Ys}from"rxjs";import{decodeEventLog as js}from"viem";var De=[{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:Ks}=K,zs=["Supply","Withdraw","Repay","Borrow"],xt=class extends C{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:s,liqudity_in:a,liqudity_out:r})=>{let[i,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:i?.decimals,existentialDeposit:i?.existential_deposit,balance:a,location:o,type:i?.asset_type.type},{id:s,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:r,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:a}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(r=>{let i=r.id===e.id?s:a;return{...r,balance:i}})}getPoolId(t,e){let n=t+"/"+e,s=new TextEncoder().encode(n.padEnd(32,"\0")),a=Vs(s);return Us(63).dec(a)}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),a=this.api.event.Router.Executed.watch(({asset_in:i,asset_out:o})=>i===n.id||o===n.id),r=this.api.event.EVM.Log.watch(({log:i})=>{let{topics:o,data:l}=i,u=o.map(g=>g.asHex()),d=l.asHex(),{eventName:m,args:p}=js({abi:De,topics:u,data:d});return zs.includes(m)&&p.reserve.toLowerCase()===s.toLowerCase()});return Xs([a,r]).pipe(Ys(()=>this.getPoolDelta(t)),Ws(i=>({...t,tokens:[...i]})))}getReserveH160Id(t){return t.type==="Erc20"?X.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Ks.fromAssetId(t.id)}};var et=class{static get(t){switch(t.type){case"Aave":return Tt.fromPool(t);case"XYK":return Pt.fromPool(t);case"Omnipool":return gt.fromPool(t);case"LBP":return pt.fromPool(t);case"Stableswap":return yt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as $s,Subscription as St,takeUntil as Qs}from"rxjs";var nt=class extends _{lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=St.EMPTY;omniSub=St.EMPTY;stableSub=St.EMPTY;xykSub=St.EMPTY;aaveSub=St.EMPTY;isReady=!1;isDestroyed=new $s;constructor(t){super(t),this.lbpClient=new dt(t),this.omniClient=new bt(t),this.stableClient=new ht(t),this.xykClient=new ft(t),this.aaveClient=new xt(t),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe(Qs(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 mt(t.type)}};var Ne={};w(Ne,{DEFAULT_BLOCK_TIME:()=>Me,DEFAULT_MIN_BUDGET:()=>re,ORDER_MIN_BLOCK_PERIOD:()=>Le,Router:()=>st,TWAP_BLOCK_PERIOD:()=>vt,TWAP_MAX_DURATION:()=>le,TWAP_MAX_PRICE_IMPACT:()=>oe,TWAP_TX_MULTIPLIER:()=>Pu,TradeOrderError:()=>ie,TradeOrderType:()=>Ct,TradeRouteBuilder:()=>M,TradeRouter:()=>at,TradeScheduler:()=>it,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 Js=5,wt=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=[],a=new Et,r=[];for(r.push([e,""]),a.enqueue(r);a.size()>0;){let i=a.dequeue();if(i==null||i.length>Js)return s;let o=i[i.length-1];(n===null||o[0]===n)&&s.push(i),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,i)){let d=[...i];d.push(u),a.enqueue(d)}})}return s}buildAndPopulateGraph(t,e){let n=new Map;for(let s of t)n.set(parseInt(s),[]);for(let[s,a,r]of e)n.get(a)?.push([r,s]);return n}};function ae(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 a=0;a<n;a++){if(s==a)continue;let r=[e.address,e.tokens[s].id,e.tokens[a].id];t[e.tokens[s].id].push(r)}}}return t}var It=class{getProposals(t,e,n){let s=ae(n),a=Object.keys(s),r=a.map(u=>s[u]).flat(),i=new wt,o=i.buildAndPopulateGraph(a,r),l=i.findPaths(o,t,e);return this.parsePaths(l)}parsePaths(t){let e=[];for(let n of t){let s=[];for(let a=0;a<n.length;a++){let r=n[a],i=n[a+1];if(i==null)break;s.push(this.toEdge(r,i))}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 It,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(r=>this.validPath(r,s)).map(r=>this.toHops(r,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,a])=>{let r=e.get(n);return{poolAddress:n,poolId:r?.id,pool:r?.type,assetIn:s,assetOut:a}})}};var Dt=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Dt||{}),Ct=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(Ct||{}),ie=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(ie||{});var at=class extends st{isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,s)=>{let a=n[n.length-1].amountOut,r=s[s.length-1].amountOut;return a>r?-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(a=>a.tradeFeeRange?.[0]??a.tradeFeePct).reduce((a,r)=>a+r),s=t.map(a=>a.tradeFeeRange?.[1]??a.tradeFeePct).reduce((a,r)=>a+r);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(i=>i.assetOutDecimals).reduce((i,o)=>i+o),s=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),a=n-e.assetOutDecimals,r=Math.pow(10,a);return s/BigInt(r)}async getSell(t,e,n,s){let a=await super.getPools(),r=super.validateInput(t,e,a),i=super.getPaths(t,e,a);if(i.length===0)throw new Z(t,e);let o;if(s)o=await this.toSellSwaps(n,s,r);else{let O=await Promise.all(i.map(R=>this.toSellSwaps(n,R,r)));o=this.findBestSellRoute(O)}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,r),P=g-p,b=this.getRouteFeeRange(o),x=d?u.tradeFeePct:v.calculateSellFee(g,p),f=Math.pow(10,l.assetInDecimals),T=l.amountIn*m/BigInt(f),S=v.calculateDiffToRef(g,T);return{type:"Sell",amountIn:l.amountIn,amountOut:u.amountOut,spotPrice:m,tradeFee:P,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(P,u.assetOutDecimals),tradeFeePct:x,tradeFeeRange:b,priceImpactPct:S,swaps:o.map(O=>O.toHuman())}}}}calculateDelta0Y(t,e,n){let s=[];for(let a=0;a<e.length;a++){let r=e[a],i=n.get(r.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(r.assetIn,r.assetOut),l;a>0?l=s[a-1]:l=t;let u=i.calculateOutGivenIn(o,l);s.push(u)}return s[s.length-1]}async toSellSwaps(t,e,n){let s=[];for(let a=0;a<e.length;a++){let r=e[a],i=n.get(r.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(r.assetIn,r.assetOut),l;a>0?l=s[a-1].amountOut:l=typeof t=="string"?y.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(i,o.assetOut),{amountOut:d,calculatedOut:m,feePct:p,errors:g}=i.validateAndSell(o,l,u),P=this.getPoolFeeRange(u),b=i.spotPriceOutGivenIn(o),x=Math.pow(10,o.decimalsIn),f=l*b/BigInt(x),T=v.calculateDiffToRef(m,f);s.push({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:d,calculatedOut:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===r.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===r.assetIn},toHuman(){return{...r,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 s}async getMostLiquidRoute(t,e){let n=await super.getPools(),s=super.validateInput(t,e,n),a=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=v.getFraction(o,.1),u=await Promise.all(a.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),a=await this.getMostLiquidRoute(t,e),r=await this.toSellSwaps("1",a,s),i=await this.getSellSpot(r),o=r[r.length-1].assetOutDecimals;return{amount:i,decimals:o}}findBestBuyRoute(t){let e=t.sort((n,s)=>{let a=n[0].amountIn,r=s[0].amountIn;return a>r?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(i=>i.assetInDecimals).reduce((i,o)=>i+o),s=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),a=n-e.assetInDecimals,r=Math.pow(10,a);return s/BigInt(r)}async getBuy(t,e,n,s){let a=await super.getPools(),r=super.validateInput(t,e,a),i=super.getPaths(t,e,a);if(i.length===0)throw new Z(t,e);let o;if(s)o=await this.toBuySwaps(n,s,r);else{let O=await Promise.all(i.map(R=>this.toBuySwaps(n,R,r)));o=this.findBestBuyRoute(O)}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,r),P=p-g,b=this.getRouteFeeRange(o),x=d?u.tradeFeePct:v.calculateBuyFee(g,p),f=Math.pow(10,l.assetOutDecimals),T=l.amountOut*m/BigInt(f),S;return g===0n?S=-100:S=v.calculateDiffToRef(T,g),{type:"Buy",amountOut:l.amountOut,amountIn:u.amountIn,spotPrice:m,tradeFee:P,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(P,u.assetInDecimals),tradeFeePct:x,tradeFeeRange:b,priceImpactPct:S,swaps:o.map(O=>O.toHuman())}}}}calculateDelta0X(t,e,n){let s=[];for(let a=e.length-1;a>=0;a--){let r=e[a],i=n.get(r.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(r.assetIn,r.assetOut),l;a==e.length-1?l=t:l=s[0];let u=i.calculateInGivenOut(o,l);s.unshift(u)}return s[0]}async toBuySwaps(t,e,n){let s=[];for(let a=e.length-1;a>=0;a--){let r=e[a],i=n.get(r.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(r.assetIn,r.assetOut),l;a==e.length-1?l=typeof t=="string"?y.toBigInt(t,o.decimalsOut):t:l=s[0].amountIn;let u=await this.ctx.getPoolFees(i,o.assetOut),{amountIn:d,calculatedIn:m,feePct:p,errors:g}=i.validateAndBuy(o,l,u),P=this.getPoolFeeRange(u),b=i.spotPriceInGivenOut(o),x=Math.pow(10,o.decimalsOut),f=l*b/BigInt(x),T;m===0n?T=-100:T=v.calculateDiffToRef(f,m),s.unshift({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:d,calculatedIn:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===r.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===r.assetIn},toHuman(){return{...r,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 s}};var Me=6e3,re=1000000000000000n,vt=6,oe=-5,le=216e5,Pu=3,Le=6;import{Enum as qe}from"polkadot-api";var M=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:s,poolId:a})=>s==="Stableswap"?{pool:qe("Stableswap",a),asset_in:e,asset_out:n}:{pool:qe(s),asset_in:e,asset_out:n})}};var it=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??re})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,s,a){let[r,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:u}=i,d=l[0],m=l[l.length-1],{assetInDecimals:p}=d,{assetOutDecimals:g}=m,P=Math.abs(u),b=this.getMinimumTradeCount(o,r),x=this.getOptimalTradeCount(P),f=a?Math.round(s/a):x,T=Math.ceil(s/b),S=Math.round(s/x),O=Math.round(s/f),R=o/BigInt(f),k=await this.router.getBestSell(t,e,R),U=o<r,Ot=[];U&&Ot.push("OrderTooSmall");let At=k.amountOut*BigInt(f),Ht=this.toBlockPeriod(O),Gt=k.tradeFee*BigInt(f),We=M.build(l),ce={assetIn:t,assetOut:e,errors:Ot,frequencyMin:T,frequencyOpt:S,frequency:O,tradeCount:f,tradeFee:Gt,tradeImpactPct:k.priceImpactPct,tradePeriod:Ht,tradeRoute:We,type:"Dca"};return{...ce,amountIn:o,amountOut:At,tradeAmountIn:k.amountIn,tradeAmountOut:k.amountOut,toHuman(){return{...ce,amountIn:y.toDecimal(o,p),amountOut:y.toDecimal(At,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 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,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:r,swaps:i,priceImpactPct:o}=a,l=i[0],u=i[i.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),P=r/BigInt(g),b=await this.router.getBestSell(l.assetIn,u.assetOut,P),x=g===1,f=r<s,T=b.priceImpactPct<-5,S=[];f||x?S.push("OrderTooSmall"):T&&S.push("OrderImpactTooBig");let O=b.amountOut*BigInt(g),R=b.tradeFee*BigInt(g),k=M.build(i),U={assetIn:t,assetOut:e,errors:S,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:k,type:"TwapSell"};return{...U,amountIn:r,amountOut:O,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:R,toHuman(){return{...U,amountIn:y.toDecimal(r,d),amountOut:y.toDecimal(O,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(R,m)}}}}async getTwapBuyOrder(t,e,n){let[s,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:r,swaps:i,priceImpactPct:o}=a,l=i[0],u=i[i.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),P=r/BigInt(g),b=await this.router.getBestBuy(l.assetIn,u.assetOut,P),x=b.amountIn*BigInt(g),f=g===1,T=x<s,S=b.priceImpactPct<-5,O=[];T||f?O.push("OrderTooSmall"):S&&O.push("OrderImpactTooBig");let R=b.tradeFee*BigInt(g),k=M.build(i),U={assetIn:t,assetOut:e,errors:O,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:k,type:"TwapBuy"};return{...U,amountIn:x,amountOut:r,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:R,toHuman(){return{...U,amountIn:y.toDecimal(x,d),amountOut:y.toDecimal(r,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(R,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 Ue={};w(Ue,{TxBuilderFactory:()=>ot});import{Enum as Ge}from"polkadot-api";function He(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var rt=class extends _{evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evmClient=e??new F,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:Wt})}async dryRun(t,e){let n=Ge("Signed",t),s=Ge("system",n),r=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(s,e.decodedCall),i=r.success&&!r.value.execution_result.success?r.value.execution_result.value.error:null;if(i){let o=He(i.value);throw new Error("Dry run execution error!",{cause:o})}return r}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var Mt=class extends rt{_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],a=await this.balanceClient.getBalance(this.beneficiary,s);return t>=a-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],a=n[n.length-1],r=v.getFraction(t,this.slippagePct),i=s.assetIn,o=a.assetOut,l=t+r,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.buy({asset_in:i,asset_out:o,amount:e,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:i,asset_out:o,amount_out:e,max_amount_in:l,route:M.build(n)}),this.wrapTx("RouterBuy",u)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],a=n[n.length-1],r=v.getFraction(e,this.slippagePct),i=s.assetIn,o=a.assetOut,l=e-r,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.sell({asset_in:i,asset_out:o,amount:t,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:i,asset_out:o,amount_in:t,min_amount_out:l,route:M.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],a=v.getFraction(t,this.slippagePct),r=n.assetIn,i=s.assetOut,o=t-a,l=this.api.tx.Router.sell_all({asset_in:r,asset_out:i,min_amount_out:o,route:M.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as ue}from"polkadot-api";var Lt=class extends rt{_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:a,tradeRoute:r}=this.order,i=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:a,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:ue("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:0n,route:r})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",i)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:a,tradePeriod:r,tradeRoute:i}=this.order,o=v.getFraction(a,this.slippagePct),l=a-o,u=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:ue("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:l,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",u)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:a,tradePeriod:r,tradeRoute:i}=this.order,o=v.getFraction(s,this.slippagePct),l=s+o,u=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:ue("Buy",{asset_in:e,asset_out:n,amount_out:a,max_amount_in:l,route:i})},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 F}trade(t){return new Mt(this.client,this.evmClient).setTrade(t)}order(t){return new Lt(this.client,this.evmClient).setOrder(t)}};import{encodeAddress as Zs}from"@polkadot/util-crypto";import{stringToU8a as ta}from"@polkadot/util";import{calculate_accumulated_rps as ea,calculate_period_number as Ve,calculate_rewards as na}from"@galacticcouncil/math-staking";import lt from"big.js";var sa=lt(10),aa=lt(sa.pow(12));function ia(c){return Zs(ta(("modl"+c).padEnd(32,"\0")),63)}var qt=class{client;constructor(t){this.client=t}async getFreePotBalance(){let t=await this.client.getPalletId(),e=ia(t);return this.client.getBalance(e)}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]),s=e?.created_at,a=await n.reduce(async(r,[i,o])=>{let l=await r,u=i,d=o.amount,m=o.conviction.toString(),p=await this.client.getReferendumInfo(u);return p&&(p.type==="Approved"||p.type==="Rejected")&&l.push({id:u,amount:d,conviction:m}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt:s,actionPoints:e?.action_points,accumulatedUnpaidRewards:e?.accumulated_unpaid_rewards,accumulatedSlashPoints:e?.accumulated_slash_points,accumulatedLockedRewards:e?.accumulated_locked_rewards,votes:a}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,s]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),a=s.find(r=>r)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:a,stakePosition:a?await this.getStakingPosition(a):void 0}}async getRewards(t){let e=await this.getStake(t),{potReservedBalance:n,accumulatedRewardPerStake:s,totalStake:a,stakePosition:r}=e;if(!r)return;let[i,o,l,u,d]=await Promise.all([this.client.getBlockNumber(),this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),m=lt(o.toString()).minus(n.toString()),p=s.toString(),g=i.toString(),P=lt(g).plus(1).toString();m.gt(0)&&a>0&&(p=ea(s.toString(),m.toString(),a.toString()));let b=Ve(l.toString(),g,d??P),x=Ve(l.toString(),r.createdAt?.toString()??"",d??P),f=na(p,r.rewardPerStake?.toString()??"",r.stake?.toString()??""),T=lt(f).plus(r.accumulatedUnpaidRewards?.toString()||"0").plus(r.accumulatedLockedRewards?.toString()||"0");if(!lt(b).minus(x).lte(u.toString()))return T.div(aa).toString()}};var Nt=class extends _{async getBalance(t){return(await this.api.query.System.Account.getValue(t)).data.free}async getBlockNumber(){return await this.api.query.System.Number.getValue({at:"best"})}async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:r})=>{let[i,o,l]=r;return{address:i,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};async function _c(c,t,e){let n=new J(c),[s,a]=await Promise.all([n.getBlockTime(),n.getMinOrderBudget()]),r=t??new F,i=new nt(c).withAave().withOmnipool().withStableswap().withXyk(),o=new Y(r),l=new at(i),u=new it(l,{blockTime:s,minBudgetInNative:a}),d=new qt(e??new Nt(c));return{api:{aave:o,router:l,scheduler:u,staking:d},client:{asset:new $(c),balance:new q(c),evm:r},ctx:{pool:i},tx:new ot(c,r),destroy:()=>{i.destroy()}}}export{Ie as aave,pe as api,y as big,Oe as client,Pe as const,_c as createSdkContext,K as erc20,Ae as error,ye as evm,h as fmt,kt as h160,X as json,v as math,Ce as pool,Ne as sor,Ue as tx,we as xc};
1
+ var Ke=Object.defineProperty;var S=(c,t)=>{for(var e in t)Ke(c,e,{get:t[e],enumerable:!0})};var pe={};S(pe,{Papi:()=>_,getWs:()=>Je});import{hydration as ze}from"@galacticcouncil/descriptors";function me(c){switch(c){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var _=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");me(n)&&console.log(t,...e)}};import{createClient as $e}from"polkadot-api";import{withPolkadotSdkCompat as Qe}from"polkadot-api/polkadot-sdk-compat";var Je=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 $e(Qe(s))};var Ie={};S(Ie,{AAVE_GAS_LIMIT:()=>Wt,AAVE_LENDING_POOL_ADDRESS:()=>Ft,AAVE_POOL_ABI:()=>Ut,AAVE_POOL_DATA_PROVIDER:()=>kt,AAVE_POOL_DATA_PROVIDER_ABI:()=>Rt,AAVE_POOL_PROXY:()=>Vt,AAVE_ROUNDING_THRESHOLD:()=>wa,AAVE_UINT_256_MAX:()=>Ze,AaveClient:()=>ut,AaveUtils:()=>Y});var Ut=[{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 Rt=[{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 Vt="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",kt="0x112b087b60C1a166130d59266363C45F8aa99db0",Ft="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Wt=1000000n,wa=5,Ze=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var ye={};S(ye,{EvmClient:()=>F,evmMainnet:()=>Xt});import{defineChain as tn}from"viem";var de=["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"],ge=["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"],Xt=tn({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{public:{http:de,webSocket:ge},default:{http:de,webSocket:ge}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});import{createPublicClient as be,createWalletClient as en,custom as nn,http as sn,webSocket as an}from"viem";var F=class{chain;constructor(t){this.chain=t||Xt}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 be({chain:this.chain,transport:sn()})}getWsProvider(){return be({chain:this.chain,transport:an()})}getSigner(t){return en({account:t,chain:this.chain,transport:nn(window.ethereum)})}};var ut=class{evmClient;constructor(t){this.evmClient=t??new F}async getReservesData(){return await this.evmClient.getProvider().readContract({abi:Rt,address:kt,args:[Ft],functionName:"getReservesData"})}async getUserReservesData(t){return await this.evmClient.getProvider().readContract({abi:Rt,address:kt,args:[Ft,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.evmClient.getProvider().readContract({abi:Ut,address:Vt,args:[t],functionName:"getUserAccountData"})}};var y={};S(y,{asBigInt:()=>ln,toBigInt:()=>on,toDecimal:()=>rn});import W from"big.js";W.NE=-18;function rn(c,t,e=6,n){let s=W(c.toString()),a=W(10).pow(t);return s.div(a).round(e,n).toString()}function on(c,t){let e=W(10).pow(t),s=W(c).mul(e).toFixed(0,W.roundDown);return BigInt(s)}function ln(c){return BigInt(c.round(0,W.roundDown).toFixed(0))}var K={};S(K,{ERC20:()=>Yt});var Yt=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:()=>mn,toDecimals:()=>cn,toPct:()=>un});var he=1e3;function un(c){let[t,e]=c;return t/e*100}function cn(c){let[t,e]=c;return t/e}function mn(c){return[c/he,he]}var Et={};S(Et,{H160:()=>$t,isEvmAccount:()=>Te,isEvmAddress:()=>xe,isSs58Address:()=>Se});import{AccountId as ct}from"polkadot-api";import{toHex as fe}from"@polkadot-api/utils";import{Buffer as V}from"buffer";var Pe={};S(Pe,{HUB_ASSET_ID:()=>Kt,HYDRATION_OMNIPOOL_ADDRESS:()=>dn,HYDRATION_PARACHAIN_ID:()=>pn,HYDRATION_SS58_PREFIX:()=>D,RUNTIME_DECIMALS:()=>E,SYSTEM_ASSET_DECIMALS:()=>jt,SYSTEM_ASSET_ID:()=>N,TRADEABLE_DEFAULT:()=>z});var E=18,N=0,jt=12,pn=2034,D=63,dn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Kt=1,z=15;var zt="ETH\0";function Te(c){if(!c)return!1;try{let t=ct().enc(c),e=V.from(zt);return V.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function xe(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function Se(c){try{return ct(63).enc(c),!0}catch{return!1}}var $t=class c{static toAccount=t=>{let e=V.from(t.slice(2),"hex"),n=V.from(zt),s=Uint8Array.from(V.concat([n,e,V.alloc(8)])),a=fe(s);return ct(63).dec(a)};static fromAccount=t=>{let e=ct().enc(t),n=V.from(zt),s=e.slice(n.length,-8);return"0x"+V.from(s).toString("hex")};static fromSS58=t=>{let n=ct().enc(t).slice(0,20);return fe(n)};static fromAny=t=>{if(xe(t))return t;if(Te(t))return c.fromAccount(t);if(Se(t))return c.fromSS58(t);throw new Error("Unknown address type")}};var X={};S(X,{findNestedKey:()=>gn,findNestedObj:()=>bn,jsonFormatter:()=>yn});var gn=(c,t)=>{let e=[];return JSON.stringify(c,(n,s)=>(s&&s[t]&&e.push(s),s)),e[0]},bn=(c,t,e)=>{let n;return JSON.stringify(c,(s,a)=>(a&&a[t]===e&&(n=a),a)),n},yn=(c,t)=>typeof t=="bigint"?t.toString():t;var v={};S(v,{calculateBuyFee:()=>Tn,calculateDiffToAvg:()=>hn,calculateDiffToRef:()=>Pn,calculateSellFee:()=>fn,getFraction:()=>xn});import H from"big.js";function hn(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 fn(c,t){let e=H(c.toString()),n=H(t.toString());return H(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Tn(c,t){let e=H(c.toString());return H(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function xn(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 we={};S(we,{convertToId:()=>wn});import{Buffer as Sn}from"buffer";function wn(c){let e=Sn.from(c.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Dt}=K,{H160:Qt}=Et,In=1.01,vn=99999,On=10n**27n,An=10n**18n,Y=class{client;constructor(t){let e=t??new F;this.client=new ut(e)}async getSummary(t){let e=Qt.fromAny(t),[n,s,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[r]=n,[i,o]=s,[l,u,d,m,p,g]=a,P=y.toDecimal(g,18),b=[];for(let x of i){let f=x.underlyingAsset.toLowerCase(),T=r.find(({underlyingAsset:Gt})=>Gt.toLowerCase()===f);if(!T)throw new Error("Missing pool reserve for "+f);let w=x.scaledATokenBalance,O=T.liquidityIndex,R=T.priceInMarketReferenceCurrency,k=w*O/On,Bt=Number(o===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,_t=T.usageAsCollateralEnabled&&x.usageAsCollateralEnabledOnUser&&x.scaledATokenBalance>0n,Ht=Dt.toAssetId(f);b.push({aTokenBalance:k,decimals:Number(T.decimals),isCollateral:_t,priceInRef:R,reserveId:Ht,reserveAsset:f,reserveLiquidationThreshold:Bt})}return{healthFactor:Number(P),totalCollateral:l,totalDebt:u,reserves:b}}async hasBorrowPositions(t){let e=Qt.fromAny(t),n=await this.client.getUserAccountData(e),[s,a]=n;return a>0n}async getHealthFactor(t){let e=Qt.fromAny(t),n=await this.client.getUserAccountData(e),[s,a,r,i,o,l]=n,u=y.toDecimal(l,18);return Number(u)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:s,totalDebt:a,reserves:r}=await this.getSummary(t),i=Dt.fromAssetId(e),o=r.find(b=>b.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,isCollateral:u,priceInRef:d,reserveLiquidationThreshold:m}=o,p=y.toBigInt(n,l),g=u?p*d/10n**BigInt(l):0n,P=s-g;return P<=0n?0:this.calculateHealthFactor(P,m,a)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:s,totalDebt:a,reserves:r}=await this.getSummary(t),i=Dt.fromAssetId(e),o=r.find(P=>P.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,priceInRef:u,reserveLiquidationThreshold:d}=o,p=y.toBigInt(n,l)*u/10n**BigInt(l),g=s+p;return g<=0n?0:this.calculateHealthFactor(g,d,a)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:s,reserves:a}=await this.getSummary(t),r=Dt.fromAssetId(e),i=a.find(o=>o.reserveAsset===r);if(!i)throw new Error("Missing reserve ctx for "+r);return this.calculateWithdrawMax(i,n,s)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:s}=await this.getSummary(t),a={};for(let r of s){let i=this.calculateWithdrawMax(r,e,n);r.reserveId&&(a[r.reserveId]=i)}return a}calculateHealthFactor(t,e,n){if(n===0n)return vn;let s=10n**6n,a=y.toBigInt(e,18),r=t*a*s,i=n*An,o=r/i;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let s=y.toBigInt(t,18),a=y.toBigInt(e,18);return(s*n+a-1n)/a}calculateWithdrawMax(t,e,n){let{aTokenBalance:s,decimals:a,priceInRef:r,reserveLiquidationThreshold:i}=t,o=this.calculateRequiredCollateral(In,i,n),l=e-o;if(l<=0n)return{amount:0n,decimals:a};let u=l*10n**BigInt(a)/r;return{amount:s<u?s:u,decimals:a}}};var Oe={};S(Oe,{AssetClient:()=>$,BalanceClient:()=>q,ChainParams:()=>J});var $=class extends _{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[a]=n;return[a,s]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[a]=n;return[a,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[a]=n;return[a,s]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[a]=n;return[a,s]}))}async mapToken(t,e,n,s){let{name:a,asset_type:r,is_sufficient:i,existential_deposit:o}=e,{symbol:l,decimals:u}=n.get(t)??{};return{id:t,name:a?.asText(),symbol:l,decimals:u,icon:l,type:r.type,isSufficient:i,location:s,existentialDeposit:o}}async mapBond(t,e,n,s){let[a,r]=s,{asset_type:i,is_sufficient:o,existential_deposit:l}=e,{symbol:u,decimals:d}=await this.mapToken(a,e,n),m=Number(r),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:i.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:a,maturity:m}}async mapShares(t,e,n,s){let{assets:a}=s,{name:r,symbol:i,asset_type:o,is_sufficient:l,existential_deposit:u}=e,d=await Promise.all(a.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:i?.asText()||r?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:m}}async mapExternal(t,e,n,s){let a=await this.mapToken(t,e,new Map,s),r=n?.find(i=>i.internalId===a.id);return r?{...a,decimals:r.decimals,name:r.name,symbol:r.symbol,icon:r.symbol,isWhiteListed:r.isWhiteListed}:a}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,a,r]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),i=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=r.get(l);p=await this.mapBond(l,u,i,g);break;case"StableSwap":let P=a.get(l);p=await this.mapShares(l,u,i,P);break;case"External":p=await this.mapExternal(l,u,e,d);break;default:p=await this.mapToken(l,u,i,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 Bn,bufferCount as _n,combineLatest as Rn,debounceTime as kn,distinctUntilChanged as ve,finalize as Fn,map as Q,pairwise as En,shareReplay as Dn,startWith as Cn}from"rxjs";var q=class extends _{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:a}=await n.getValue(t,e);return s-a}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 Rn([e,n,s]).pipe(kn(250),Q(a=>a.flat()),Cn([]),_n(2,1),Q(([a,r],i)=>{if(i===0)return r;let o=a.reduce((u,d)=>(u.set(d.id,d.amount),u),new Map);return r.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:a}=n.data;return{id:0,amount:s-a}}))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(Q(s=>{let{free:a,frozen:r}=s;return{id:e,amount:a-r}}))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(ve((n,s)=>!s.deltas),Q(({deltas:n})=>{let s=[];return n?.deleted.forEach(a=>{let[r,i]=a.args;s.push({id:i,amount:0n})}),n?.upserted.forEach(a=>{let[r,i]=a.args,{free:o,frozen:l}=a.value;s.push({id:i,amount:o-l})}),s}))}subscribeErc20Balance(t,e){let n=new Bn,s=n.pipe(Dn(1)),a=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}),r=async()=>{let o=e||await a(),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()},i;return r().then(o=>i=o),s.pipe(Fn(()=>i?.()),En(),Q(([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))}),ve((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 _{_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 Ae={};S(Ae,{AssetNotFound:()=>Jt,PoolNotFound:()=>mt,RouteNotFound:()=>Z});var Jt=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},mt=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 Ce={};S(Ce,{PoolContextProvider:()=>nt,PoolError:()=>j,PoolFactory:()=>et,PoolType:()=>A,aave:()=>se,lbp:()=>Zt,omni:()=>te,stable:()=>ee,xyk:()=>ne});var Zt={};S(Zt,{LbpMath:()=>L,LbpPool:()=>pt,LbpPoolClient:()=>dt});import{calculate_in_given_out as Mn,calculate_out_given_in as Ln,calculate_linear_weights as qn,calculate_pool_trade_fee as Nn,get_spot_price as Hn}from"@galacticcouncil/math-lbp";var L=class{static getSpotPrice(t,e,n,s,a){return Hn(t,e,n,s,a)}static calculateInGivenOut(t,e,n,s,a){return Mn(t,e,n,s,a)}static calculateOutGivenIn(t,e,n,s,a){return Ln(t,e,n,s,a)}static calculateLinearWeights(t,e,n,s,a){return qn(t,e,n,s,a)}static calculatePoolTradeFee(t,e,n){return Nn(t,e,n)}};var A=(a=>(a.Aave="Aave",a.LBP="LBP",a.Omni="Omnipool",a.Stable="Stableswap",a.XYK="XYK",a))(A||{}),j=(a=>(a.InsufficientTradingAmount="InsufficientTradingAmount",a.MaxInRatioExceeded="MaxInRatioExceeded",a.MaxOutRatioExceeded="MaxOutRatioExceeded",a.TradeNotAllowed="TradeNotAllowed",a.UnknownError="UnknownError",a))(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,a,r,i){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a,this.fee=r,this.repayFeeApply=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:a.balance,decimalsIn:s.decimals,decimalsOut:a.decimals,weightIn:s.weight,weightOut:a.weight}}validateAndBuy(t,e,n){let s=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let r=t.balanceOut/this.maxOutRatio;if(e>r&&a.push("MaxOutRatioExceeded"),s===t.assetOut){let i=this.calculateTradeFee(e,n),o=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+i,u=this.calculateInGivenOut(t,l),d=t.balanceIn/this.maxInRatio;return u>d&&a.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:a}}else{let i=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return i>o&&a.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:i,amountOut:e,feePct:0,errors:a}}}validateAndSell(t,e,n){let s=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let r=t.balanceIn/this.maxInRatio;if(e>r&&a.push("MaxInRatioExceeded"),s===t.assetIn){let i=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return i>o&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:i,feePct:0,errors:a}}else{let i=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(i,n),l=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),u=i-o,d=t.balanceOut/this.maxOutRatio;return u>d&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:u,feePct:l,errors:a}}}calculateInGivenOut(t,e){let n=L.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=L.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=L.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=L.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=L.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 jn}from"polkadot-api";import{map as Kn,of as Fe,switchMap as zn}from"rxjs";import{memoize1 as Gn}from"@thi.ng/memoize";import{combineLatest as Be,combineLatestAll as Un,debounceTime as Vn,firstValueFrom as Wn,from as _e,map as Re,mergeAll as Xn,of as Yn,switchMap as ke}from"rxjs";var C=class extends q{override=[];mem=0;memPools=Gn(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=_e(this.getPoolsMem()).pipe(ke(e=>this.subscribe(e)),Un());return Wn(t)}getSubscriber(){return _e(this.getPoolsMem()).pipe(ke(t=>this.subscribe(t)),Xn())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>Be([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe(Vn(250),Re(([n,s])=>this.updatePool(n,s))))}subscribePoolBalance(t){if(t.type==="Aave")return Yn([]);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(a=>a.type==="Erc20").map(a=>a.id),s=this.subscribeErc20Balance(t.address,n);e.push(s)}return Be(e).pipe(Re(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 a=this.override.find(i=>i.id===e),r=!!n||!!a?.decimals;return s>0n&&r})}updatePool=(t,e)=>{let n=t.tokens.map(s=>{let a=e.find(i=>i.id===s.id),r=this.override.find(i=>i.id===s.id);return a?{...s,balance:a.amount,decimals:s.decimals||r?.decimals}:{...s,decimals:s.decimals||r?.decimals}});return{...t,tokens:n}}};var dt=class extends C{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,a=t.filter(({value:r})=>e&&this.isActivePool(r,s)).map(async({keyArgs:r,value:i})=>{let[o]=r,l=o.toString(),u=await this.getPoolDelta(l,i,s);return{address:l,type:"LBP",fee:i.fee,...u,...n}});return Promise.all(a)}async getPoolDelta(t,e,n){let{start:s,end:a,assets:r,initial_weight:i,final_weight:o,repay_target:l,fee_collector:u}=e,d=L.calculateLinearWeights(s?s.toString():"0",a?a.toString():"0",i.toString(),o.toString(),n.toString()),[m,p]=r,g=BigInt(d),P=this.MAX_FINAL_WEIGHT-BigInt(g),[b,x,f,T,w]=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:w?.decimals,existentialDeposit:w?.existential_deposit,balance:T,weight:P,type:w?.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(jn.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe(zn(s=>s?this.getPoolDelta(t.address,n,s.relay_parent_number):Fe(t)),Kn(s=>Object.assign({},t,s))):Fe(t)}};var te={};S(te,{OmniMath:()=>I,OmniPool:()=>gt,OmniPoolClient:()=>bt});import{calculate_in_given_out as $n,calculate_lrna_in_given_out as Qn,calculate_out_given_in as Jn,calculate_out_given_lrna_in as Zn,calculate_spot_price as ts,calculate_lrna_spot_price as es,calculate_shares as ns,calculate_liquidity_out as ss,calculate_liquidity_lrna_out as as,verify_asset_cap as is,calculate_liquidity_hub_in as rs,is_sell_allowed as os,is_buy_allowed as ls,is_add_liquidity_allowed as us,is_remove_liquidity_allowed as cs}from"@galacticcouncil/math-omnipool";import tt from"big.js";var I=class{static calculateSpotPrice(t,e,n,s){return ts(t,e,n,s)}static calculateLrnaSpotPrice(t,e){return es(t,e)}static calculateInGivenOut(t,e,n,s,a,r,i,o,l){return $n(t,e,n,s,a,r,i,o,l)}static calculateLrnaInGivenOut(t,e,n,s,a){return Qn(t,e,n,s,a)}static calculateOutGivenIn(t,e,n,s,a,r,i,o,l){return Jn(t,e,n,s,a,r,i,o,l)}static calculateOutGivenLrnaIn(t,e,n,s,a){return Zn(t,e,n,s,a)}static calculateShares(t,e,n,s){return ns(t,e,n,s)}static calculateLiquidityOut(t,e,n,s,a,r,i,o){return ss(t,e,n,s,a,r,i,o)}static calculateLiquidityLRNAOut(t,e,n,s,a,r,i,o){return as(t,e,n,s,a,r,i,o)}static calculateCapDifference(t,e,n,s){let a=tt(e),r=tt(t),i=tt(s),o=tt(n),l=tt(10).pow(18),u=o.div(l);if(a.div(i).lt(u)){let m=u.times(i).minus(a).times(r),p=a.times(tt(1).minus(u));return m.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,s){return is(t,e,n,s)}static calculateLimitHubIn(t,e,n,s){return rs(t,e,n,s)}static isSellAllowed(t){return os(t)}static isBuyAllowed(t){return ls(t)}static isAddLiquidityAllowed(t){return us(t)}static isRemoveLiquidityAllowed(t){return cs(t)}};var gt=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,a,r){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a,this.hubAssetId=r}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:s.hubReserves,hubReservesOut:a.hubReserves,sharesIn:s.shares,sharesOut:a.shares,decimalsIn:s.decimals,decimalsOut:a.decimals,balanceIn:s.balance,balanceOut:a.balance,tradeableIn:s.tradeable,tradeableOut:a.tradeable,assetInEd:s.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),r=s===0n?0:v.calculateDiffToRef(a,s),i=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&i.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&i.push("MaxOutRatioExceeded");let d=t.balanceIn/this.maxInRatio;return a>d&&i.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:s,amountOut:e,feePct:r,errors:i}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),r=v.calculateDiffToRef(s,a),i=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&i.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&i.push("MaxInRatioExceeded");let d=t.balanceOut/this.maxOutRatio;return a>d&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:a,feePct:r,errors:i}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let s=I.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"),a=BigInt(s);return a<0n?0n:a}calculateLrnaInGivenOut(t,e,n){let s=I.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0"),a=BigInt(s);return a<0n?0n:a}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let s=I.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"),a=BigInt(s);return a<0n?0n:a}calculateOutGivenLrnaIn(t,e,n){let s=I.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0"),a=BigInt(s);return a<0n?0n:a}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=I.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=I.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=I.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=I.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as ms,CompatibilityLevel as ps}from"polkadot-api";import{toHex as ds}from"@polkadot-api/utils";import{distinctUntilChanged as gs,map as Ee}from"rxjs";var bt=class extends C{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,s,a,r,i]=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: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:P,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:r,tradeable:s,type:a?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...i}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=ds(e);return ms(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,a]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),r=n.min_fee+s.min_fee,i=n.max_fee+s.max_fee;if(a){let{asset_fee:o,protocol_fee:l}=a;return{assetFee:h.fromPermill(o),protocolFee:h.fromPermill(l),min:h.fromPermill(r),max:h.fromPermill(i)}}else return{assetFee:h.fromPermill(n.min_fee),protocolFee:h.fromPermill(s.min_fee),min:h.fromPermill(r),max:h.fromPermill(i)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(ps.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(gs((n,s)=>!s.deltas),Ee(({entries:n})=>n.map(s=>{let[a]=s.args,{hub_reserve:r,shares:i,tradable:o,cap:l,protocol_shares:u}=s.value,d=t.tokens.findIndex(p=>p.id===a);return{...t.tokens[d],cap:l,hubReserves:r,protocolShares:u,shares:i,tradeable:o}})),Ee(n=>{let s=t.tokens.find(a=>a.id===1);return{...t,tokens:[...n,s]}}))}};var ee={};S(ee,{StableMath:()=>B,StableSwap:()=>yt,StableSwapClient:()=>ht});import{calculate_in_given_out as bs,calculate_out_given_in as ys,calculate_amplification as hs,calculate_add_one_asset as Ps,calculate_liquidity_out_one_asset as fs,calculate_shares as Ts,calculate_shares_for_amount as xs,calculate_spot_price_with_fee as Ss,pool_account_name as ws,recalculate_peg as Is}from"@galacticcouncil/math-stableswap";var B=class{static getPoolAddress(t){return ws(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,a){return hs(t,e,n,s,a)}static calculateInGivenOut(t,e,n,s,a,r,i){return bs(t,e,n,s,a,r,i)}static calculateAddOneAsset(t,e,n,s,a,r,i){return Ps(t,e,n,s,a,r,i)}static calculateSharesForAmount(t,e,n,s,a,r,i){return xs(t,e,n,s,a,r,i)}static calculateOutGivenIn(t,e,n,s,a,r,i){return ys(t,e,n,s,a,r,i)}static calculateLiquidityOutOneAsset(t,e,n,s,a,r,i){return fs(t,e,n,s,a,r,i)}static calculateShares(t,e,n,s,a,r){return Ts(t,e,n,s,a,r)}static calculateSpotPriceWithFee(t,e,n,s,a,r,i,o){return Ss(t,e,n,s,a,r,i,o)}static recalculatePegs(t,e,n,s,a){return Is(t,e,n,s,a)}};var yt=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,a,r,i,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a,this.amplification=r,this.id=i,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:a.balance,decimalsIn:s.decimals,decimalsOut:a.decimals,tradeableIn:this.id===t?15:s.tradeable,tradeableOut:this.id===e?15:a.tradeable,assetInEd:s.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),r=h.toPct(n.fee),i=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&i.push("InsufficientTradingAmount"),{amountIn:a,calculatedIn:s,amountOut:e,feePct:r,errors:i}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),r=h.toPct(n.fee),i=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&i.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:s,amountOut:a,feePct:r,errors:i}}calculateIn(t,e,n){let s=B.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateAddOneAsset(t,e,n){let s=B.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateSharesForAmount(t,e,n){let s=B.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}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?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateWithdrawOneAsset(t,e,n){let s=B.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateShares(t,e,n){let s=B.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}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 vs,CompatibilityLevel as Os}from"polkadot-api";import{toHex as As}from"@polkadot-api/utils";import{blake2b as Bs}from"@noble/hashes/blake2b";import{map as _s,of as Rs,switchMap as ks}from"rxjs";var Fs=340282366920938463463374607431768211455n,ht=class extends C{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:a,value:r})=>{let[i]=a,o=this.getPoolAddress(i),[l,u]=await Promise.all([this.getPoolDelta(i,r,e),this.getPoolTokens(i,r)]);return this.poolsData.set(o,r),{address:o,id:i,type:"Stableswap",fee:h.fromPermill(r.fee),tokens:u,...l,...n}});return Promise.all(s)}async getPoolDelta(t,e,n){let{initial_amplification:s,final_amplification:a,initial_block:r,final_block:i}=e,o=B.calculateAmplification(s.toString(),a.toString(),r.toString(),i.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 i=>{let[o,l,u]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,i),this.api.query.AssetRegistry.Assets.getValue(i),this.getBalance(n,i)]);return{id:i,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:u,tradeable:o,type:l?.asset_type.type}}),a=await Promise.all(s),r=await this.api.query.AssetRegistry.Assets.getValue(t);return a.push({id:t,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:Fs,tradeable:15,type:r?.asset_type.type}),a}getPoolAddress(t){let e=B.getPoolAddress(t),n=Bs(e,{dkLen:32}),s=As(n);return vs(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(Os.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?Rs(t):e.watchValue("best").pipe(ks(s=>this.getPoolDelta(t.id,n,s)),_s(s=>Object.assign({},t,s)))}};var ne={};S(ne,{XykMath:()=>G,XykPool:()=>Pt,XykPoolClient:()=>ft});import{calculate_in_given_out as Es,calculate_out_given_in as Ds,calculate_pool_trade_fee as Cs,get_spot_price as Ms,calculate_liquidity_in as Ls,calculate_shares as qs,calculate_spot_price as Ns,calculate_spot_price_with_fee as Hs,calculate_liquidity_out_asset_a as Gs,calculate_liquidity_out_asset_b as Us}from"@galacticcouncil/math-xyk";var G=class{static getSpotPrice(t,e,n){return Ms(t,e,n)}static calculateInGivenOut(t,e,n){return Es(t,e,n)}static calculateOutGivenIn(t,e,n){return Ds(t,e,n)}static calculatePoolTradeFee(t,e,n){return Cs(t,e,n)}static calculateLiquidityIn(t,e,n){return Ls(t,e,n)}static calculateSpotPrice(t,e){return Ns(t,e)}static calculateSpotPriceWithFee(t,e,n,s){return Hs(t,e,n,s)}static calculateShares(t,e,n){return qs(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,s){return Gs(t,e,n,s)}static calculateLiquidityOutAssetB(t,e,n,s){return Us(t,e,n,s)}};var Pt=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,a){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:s.decimals,decimalsOut:a.decimals,balanceIn:s.balance,balanceOut:a.balance,assetInEd:s.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=this.calculateTradeFee(s,n),r=h.toPct(n.exchangeFee),i=s+a,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 i>u&&o.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:e,feePct:r,errors:o}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=this.calculateTradeFee(s,n),r=h.toPct(n.exchangeFee),i=s-a,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 i>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:i,feePct:r,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 Vs}from"polkadot-api";import{of as Ws}from"rxjs";var ft=class extends C{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),s=e.map(async({keyArgs:a,value:r})=>{let[i]=a,[o,l]=r,[u,d,m,p]=await Promise.all([this.getBalance(i,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(i,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:i,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(Vs.BackwardsCompatible,e)}subscribePoolChange(t){return Ws(t)}};var se={};S(se,{AavePool:()=>Tt,AavePoolClient:()=>xt});var Tt=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,a){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:a.balance,decimalsIn:s.decimals,decimalsOut:a.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=[];return e>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:a}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=[];return s>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:a}}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 Xs}from"polkadot-api";import{toHex as Ys}from"@polkadot-api/utils";import{map as js,merge as Ks,switchMap as zs}from"rxjs";import{decodeEventLog as $s}from"viem";var De=[{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:Qs}=K,Js=["Supply","Withdraw","Repay","Borrow"],xt=class extends C{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:s,liqudity_in:a,liqudity_out:r})=>{let[i,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:i?.decimals,existentialDeposit:i?.existential_deposit,balance:a,location:o,type:i?.asset_type.type},{id:s,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:r,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:a}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(r=>{let i=r.id===e.id?s:a;return{...r,balance:i}})}getPoolId(t,e){let n=t+"/"+e,s=new TextEncoder().encode(n.padEnd(32,"\0")),a=Ys(s);return Xs(63).dec(a)}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),a=this.api.event.Router.Executed.watch(({asset_in:i,asset_out:o})=>i===n.id||o===n.id),r=this.api.event.EVM.Log.watch(({log:i})=>{let{topics:o,data:l}=i,u=o.map(g=>g.asHex()),d=l.asHex(),{eventName:m,args:p}=$s({abi:De,topics:u,data:d});return Js.includes(m)&&p.reserve.toLowerCase()===s.toLowerCase()});return Ks([a,r]).pipe(zs(()=>this.getPoolDelta(t)),js(i=>({...t,tokens:[...i]})))}getReserveH160Id(t){return t.type==="Erc20"?X.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Qs.fromAssetId(t.id)}};var et=class{static get(t){switch(t.type){case"Aave":return Tt.fromPool(t);case"XYK":return Pt.fromPool(t);case"Omnipool":return gt.fromPool(t);case"LBP":return pt.fromPool(t);case"Stableswap":return yt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as Zs,Subscription as St,takeUntil as ta}from"rxjs";var nt=class extends _{lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=St.EMPTY;omniSub=St.EMPTY;stableSub=St.EMPTY;xykSub=St.EMPTY;aaveSub=St.EMPTY;isReady=!1;isDestroyed=new Zs;constructor(t){super(t),this.lbpClient=new dt(t),this.omniClient=new bt(t),this.stableClient=new ht(t),this.xykClient=new ft(t),this.aaveClient=new xt(t),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe(ta(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 mt(t.type)}};var Ne={};S(Ne,{DEFAULT_BLOCK_TIME:()=>Me,DEFAULT_MIN_BUDGET:()=>re,ORDER_MIN_BLOCK_PERIOD:()=>Le,Router:()=>st,TWAP_BLOCK_PERIOD:()=>vt,TWAP_MAX_DURATION:()=>le,TWAP_MAX_PRICE_IMPACT:()=>oe,TWAP_TX_MULTIPLIER:()=>fu,TradeOrderError:()=>ie,TradeOrderType:()=>Lt,TradeRouteBuilder:()=>M,TradeRouter:()=>at,TradeScheduler:()=>it,TradeType:()=>Mt});var Ct=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var ea=5,wt=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=[],a=new Ct,r=[];for(r.push([e,""]),a.enqueue(r);a.size()>0;){let i=a.dequeue();if(i==null||i.length>ea)return s;let o=i[i.length-1];(n===null||o[0]===n)&&s.push(i),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,i)){let d=[...i];d.push(u),a.enqueue(d)}})}return s}buildAndPopulateGraph(t,e){let n=new Map;for(let s of t)n.set(parseInt(s),[]);for(let[s,a,r]of e)n.get(a)?.push([r,s]);return n}};function ae(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 a=0;a<n;a++){if(s==a)continue;let r=[e.address,e.tokens[s].id,e.tokens[a].id];t[e.tokens[s].id].push(r)}}}return t}var It=class{getProposals(t,e,n){let s=ae(n),a=Object.keys(s),r=a.map(u=>s[u]).flat(),i=new wt,o=i.buildAndPopulateGraph(a,r),l=i.findPaths(o,t,e);return this.parsePaths(l)}parsePaths(t){let e=[];for(let n of t){let s=[];for(let a=0;a<n.length;a++){let r=n[a],i=n[a+1];if(i==null)break;s.push(this.toEdge(r,i))}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 It,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(r=>this.validPath(r,s)).map(r=>this.toHops(r,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,a])=>{let r=e.get(n);return{poolAddress:n,poolId:r?.id,pool:r?.type,assetIn:s,assetOut:a}})}};var Mt=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Mt||{}),Lt=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(Lt||{}),ie=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(ie||{});var at=class extends st{isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,s)=>{let a=n[n.length-1].amountOut,r=s[s.length-1].amountOut;return a>r?-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(a=>a.tradeFeeRange?.[0]??a.tradeFeePct).reduce((a,r)=>a+r),s=t.map(a=>a.tradeFeeRange?.[1]??a.tradeFeePct).reduce((a,r)=>a+r);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(i=>i.assetOutDecimals).reduce((i,o)=>i+o),s=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),a=n-e.assetOutDecimals,r=Math.pow(10,a);return s/BigInt(r)}async getSell(t,e,n,s){let a=await super.getPools(),r=super.validateInput(t,e,a),i=super.getPaths(t,e,a);if(i.length===0)throw new Z(t,e);let o;if(s)o=await this.toSellSwaps(n,s,r);else{let O=await Promise.all(i.map(R=>this.toSellSwaps(n,R,r)));o=this.findBestSellRoute(O)}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,r),P=g-p,b=this.getRouteFeeRange(o),x=d?u.tradeFeePct:v.calculateSellFee(g,p),f=Math.pow(10,l.assetInDecimals),T=l.amountIn*m/BigInt(f),w=v.calculateDiffToRef(g,T);return{type:"Sell",amountIn:l.amountIn,amountOut:u.amountOut,spotPrice:m,tradeFee:P,tradeFeePct:x,tradeFeeRange:b,priceImpactPct:w,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:x,tradeFeeRange:b,priceImpactPct:w,swaps:o.map(O=>O.toHuman())}}}}calculateDelta0Y(t,e,n){let s=[];for(let a=0;a<e.length;a++){let r=e[a],i=n.get(r.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(r.assetIn,r.assetOut),l;a>0?l=s[a-1]:l=t;let u=i.calculateOutGivenIn(o,l);s.push(u)}return s[s.length-1]}async toSellSwaps(t,e,n){let s=[];for(let a=0;a<e.length;a++){let r=e[a],i=n.get(r.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(r.assetIn,r.assetOut),l;a>0?l=s[a-1].amountOut:l=typeof t=="string"?y.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(i,o.assetOut),{amountOut:d,calculatedOut:m,feePct:p,errors:g}=i.validateAndSell(o,l,u),P=this.getPoolFeeRange(u),b=i.spotPriceOutGivenIn(o),x=Math.pow(10,o.decimalsIn),f=l*b/BigInt(x),T=v.calculateDiffToRef(m,f);s.push({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:d,calculatedOut:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===r.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===r.assetIn},toHuman(){return{...r,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 s}async getMostLiquidRoute(t,e){let n=await super.getPools(),s=super.validateInput(t,e,n),a=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=v.getFraction(o,.1),u=await Promise.all(a.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),a=await this.getMostLiquidRoute(t,e),r=await this.toSellSwaps("1",a,s),i=await this.getSellSpot(r),o=r[r.length-1].assetOutDecimals;return{amount:i,decimals:o}}findBestBuyRoute(t){let e=t.sort((n,s)=>{let a=n[0].amountIn,r=s[0].amountIn;return a>r?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(i=>i.assetInDecimals).reduce((i,o)=>i+o),s=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),a=n-e.assetInDecimals,r=Math.pow(10,a);return s/BigInt(r)}async getBuy(t,e,n,s){let a=await super.getPools(),r=super.validateInput(t,e,a),i=super.getPaths(t,e,a);if(i.length===0)throw new Z(t,e);let o;if(s)o=await this.toBuySwaps(n,s,r);else{let O=await Promise.all(i.map(R=>this.toBuySwaps(n,R,r)));o=this.findBestBuyRoute(O)}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,r),P=p-g,b=this.getRouteFeeRange(o),x=d?u.tradeFeePct:v.calculateBuyFee(g,p),f=Math.pow(10,l.assetOutDecimals),T=l.amountOut*m/BigInt(f),w;return g===0n?w=-100:w=v.calculateDiffToRef(T,g),{type:"Buy",amountOut:l.amountOut,amountIn:u.amountIn,spotPrice:m,tradeFee:P,tradeFeePct:x,tradeFeeRange:b,priceImpactPct:w,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:x,tradeFeeRange:b,priceImpactPct:w,swaps:o.map(O=>O.toHuman())}}}}calculateDelta0X(t,e,n){let s=[];for(let a=e.length-1;a>=0;a--){let r=e[a],i=n.get(r.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(r.assetIn,r.assetOut),l;a==e.length-1?l=t:l=s[0];let u=i.calculateInGivenOut(o,l);s.unshift(u)}return s[0]}async toBuySwaps(t,e,n){let s=[];for(let a=e.length-1;a>=0;a--){let r=e[a],i=n.get(r.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(r.assetIn,r.assetOut),l;a==e.length-1?l=typeof t=="string"?y.toBigInt(t,o.decimalsOut):t:l=s[0].amountIn;let u=await this.ctx.getPoolFees(i,o.assetOut),{amountIn:d,calculatedIn:m,feePct:p,errors:g}=i.validateAndBuy(o,l,u),P=this.getPoolFeeRange(u),b=i.spotPriceInGivenOut(o),x=Math.pow(10,o.decimalsOut),f=l*b/BigInt(x),T;m===0n?T=-100:T=v.calculateDiffToRef(f,m),s.unshift({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:d,calculatedIn:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===r.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===r.assetIn},toHuman(){return{...r,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 s}};var Me=6e3,re=1000000000000000n,vt=6,oe=-5,le=216e5,fu=3,Le=6;import{Enum as qe}from"polkadot-api";var M=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:s,poolId:a})=>s==="Stableswap"?{pool:qe("Stableswap",a),asset_in:e,asset_out:n}:{pool:qe(s),asset_in:e,asset_out:n})}};var it=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??re})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,s,a){let[r,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:u}=i,d=l[0],m=l[l.length-1],{assetInDecimals:p}=d,{assetOutDecimals:g}=m,P=Math.abs(u),b=this.getMinimumTradeCount(o,r),x=this.getOptimalTradeCount(P),f=a?Math.round(s/a):x,T=Math.ceil(s/b),w=Math.round(s/x),O=Math.round(s/f),R=o/BigInt(f),k=await this.router.getBestSell(t,e,R),U=o<r,Bt=[];U&&Bt.push("OrderTooSmall");let _t=k.amountOut*BigInt(f),Ht=this.toBlockPeriod(O),Gt=k.tradeFee*BigInt(f),je=M.build(l),ce={assetIn:t,assetOut:e,errors:Bt,frequencyMin:T,frequencyOpt:w,frequency:O,tradeCount:f,tradeFee:Gt,tradeImpactPct:k.priceImpactPct,tradePeriod:Ht,tradeRoute:je,type:"Dca"};return{...ce,amountIn:o,amountOut:_t,tradeAmountIn:k.amountIn,tradeAmountOut:k.amountOut,toHuman(){return{...ce,amountIn:y.toDecimal(o,p),amountOut:y.toDecimal(_t,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 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,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:r,swaps:i,priceImpactPct:o}=a,l=i[0],u=i[i.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),P=r/BigInt(g),b=await this.router.getBestSell(l.assetIn,u.assetOut,P),x=g===1,f=r<s,T=b.priceImpactPct<-5,w=[];f||x?w.push("OrderTooSmall"):T&&w.push("OrderImpactTooBig");let O=b.amountOut*BigInt(g),R=b.tradeFee*BigInt(g),k=M.build(i),U={assetIn:t,assetOut:e,errors:w,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:k,type:"TwapSell"};return{...U,amountIn:r,amountOut:O,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:R,toHuman(){return{...U,amountIn:y.toDecimal(r,d),amountOut:y.toDecimal(O,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(R,m)}}}}async getTwapBuyOrder(t,e,n){let[s,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:r,swaps:i,priceImpactPct:o}=a,l=i[0],u=i[i.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),P=r/BigInt(g),b=await this.router.getBestBuy(l.assetIn,u.assetOut,P),x=b.amountIn*BigInt(g),f=g===1,T=x<s,w=b.priceImpactPct<-5,O=[];T||f?O.push("OrderTooSmall"):w&&O.push("OrderImpactTooBig");let R=b.tradeFee*BigInt(g),k=M.build(i),U={assetIn:t,assetOut:e,errors:O,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:k,type:"TwapBuy"};return{...U,amountIn:x,amountOut:r,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:R,toHuman(){return{...U,amountIn:y.toDecimal(x,d),amountOut:y.toDecimal(r,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(R,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 Ve={};S(Ve,{BIG_10:()=>Ge,BIG_BILL:()=>Ue,StakingApi:()=>Ot,StakingClient:()=>At});import{encodeAddress as na}from"@polkadot/util-crypto";import{stringToU8a as sa}from"@polkadot/util";import{calculate_accumulated_rps as aa,calculate_period_number as He,calculate_rewards as ia}from"@galacticcouncil/math-staking";import rt from"big.js";var Ge=rt(10),Ue=rt(Ge.pow(12));function ra(c){return na(sa(("modl"+c).padEnd(32,"\0")),63)}var Ot=class{client;constructor(t){this.client=t}async getFreePotBalance(){let t=await this.client.getPalletId(),e=ra(t);return this.client.getBalance(e)}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]),s=e?.created_at,a=await n.reduce(async(r,[i,o])=>{let l=await r,u=i,d=o.amount,m=o.conviction.toString(),p=await this.client.getReferendumInfo(u);return p&&(p.type==="Approved"||p.type==="Rejected")&&l.push({id:u,amount:d,conviction:m}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt:s,actionPoints:e?.action_points,accumulatedUnpaidRewards:e?.accumulated_unpaid_rewards,accumulatedSlashPoints:e?.accumulated_slash_points,accumulatedLockedRewards:e?.accumulated_locked_rewards,votes:a}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,s]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),a=s.find(r=>r)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:a,stakePosition:a?await this.getStakingPosition(a):void 0}}async getRewards(t){let e=await this.getStake(t),{potReservedBalance:n,accumulatedRewardPerStake:s,totalStake:a,stakePosition:r}=e;if(!r)return;let[i,o,l,u,d]=await Promise.all([this.client.getBlockNumber(),this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),m=rt(o.toString()).minus(n.toString()),p=s.toString(),g=i.toString(),P=rt(g).plus(1).toString();m.gt(0)&&a>0&&(p=aa(s.toString(),m.toString(),a.toString()));let b=He(l.toString(),g,d??P),x=He(l.toString(),r.createdAt?.toString()??"",d??P),f=ia(p,r.rewardPerStake?.toString()??"",r.stake?.toString()??""),T=rt(f).plus(r.accumulatedUnpaidRewards?.toString()||"0").plus(r.accumulatedLockedRewards?.toString()||"0");if(!rt(b).minus(x).lte(u.toString()))return T.div(Ue).toString()}};var At=class extends _{async getBalance(t){return(await this.api.query.System.Account.getValue(t)).data.free}async getBlockNumber(){return await this.api.query.System.Number.getValue({at:"best"})}async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:r})=>{let[i,o,l]=r;return{address:i,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var Ye={};S(Ye,{TxBuilderFactory:()=>lt});import{Enum as Xe}from"polkadot-api";function We(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var ot=class extends _{evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evmClient=e??new F,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:Wt})}async dryRun(t,e){let n=Xe("Signed",t),s=Xe("system",n),r=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(s,e.decodedCall),i=r.success&&!r.value.execution_result.success?r.value.execution_result.value.error:null;if(i){let o=We(i.value);throw new Error("Dry run execution error!",{cause:o})}return r}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var qt=class extends ot{_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],a=await this.balanceClient.getBalance(this.beneficiary,s);return t>=a-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],a=n[n.length-1],r=v.getFraction(t,this.slippagePct),i=s.assetIn,o=a.assetOut,l=t+r,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.buy({asset_in:i,asset_out:o,amount:e,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:i,asset_out:o,amount_out:e,max_amount_in:l,route:M.build(n)}),this.wrapTx("RouterBuy",u)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],a=n[n.length-1],r=v.getFraction(e,this.slippagePct),i=s.assetIn,o=a.assetOut,l=e-r,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.sell({asset_in:i,asset_out:o,amount:t,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:i,asset_out:o,amount_in:t,min_amount_out:l,route:M.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],a=v.getFraction(t,this.slippagePct),r=n.assetIn,i=s.assetOut,o=t-a,l=this.api.tx.Router.sell_all({asset_in:r,asset_out:i,min_amount_out:o,route:M.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as ue}from"polkadot-api";var Nt=class extends ot{_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:a,tradeRoute:r}=this.order,i=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:a,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:ue("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:0n,route:r})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",i)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:a,tradePeriod:r,tradeRoute:i}=this.order,o=v.getFraction(a,this.slippagePct),l=a-o,u=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:ue("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:l,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",u)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:a,tradePeriod:r,tradeRoute:i}=this.order,o=v.getFraction(s,this.slippagePct),l=s+o,u=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:ue("Buy",{asset_in:e,asset_out:n,amount_out:a,max_amount_in:l,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",u)}};var lt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e??new F}trade(t){return new qt(this.client,this.evmClient).setTrade(t)}order(t){return new Nt(this.client,this.evmClient).setOrder(t)}};async function _c(c,t,e){let n=new J(c),[s,a]=await Promise.all([n.getBlockTime(),n.getMinOrderBudget()]),r=t??new F,i=new nt(c).withAave().withOmnipool().withStableswap().withXyk(),o=new Y(r),l=new at(i),u=new it(l,{blockTime:s,minBudgetInNative:a}),d=new Ot(e??new At(c));return{api:{aave:o,router:l,scheduler:u,staking:d},client:{asset:new $(c),balance:new q(c),evm:r},ctx:{pool:i},tx:new lt(c,r),destroy:()=>{i.destroy()}}}export{Ie as aave,pe as api,y as big,Oe as client,Pe as const,_c as createSdkContext,K as erc20,Ae as error,ye as evm,h as fmt,Et as h160,X as json,v as math,Ce as pool,Ne as sor,Ve as staking,Ye as tx,we as xc};
@@ -6,6 +6,7 @@ export * as error from './errors';
6
6
  export * as evm from './evm';
7
7
  export * as pool from './pool';
8
8
  export * as sor from './sor';
9
+ export * as staking from './staking';
9
10
  export * as tx from './tx';
10
11
  export * from './factory';
11
12
  export * from './types';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@galacticcouncil/sdk-next",
3
- "version": "0.6.0-pr188-5d7828c",
3
+ "version": "0.6.0-pr188-d6464e7",
4
4
  "description": "Galactic next gen sdk (papi)",
5
5
  "author": "GalacticCouncil",
6
6
  "repository": {