@galacticcouncil/sdk-next 0.6.0-pr192-eb1e3d2 → 0.6.0-pr193-99644e4

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.mjs CHANGED
@@ -1 +1 @@
1
- var Ut=Object.defineProperty;var I=(c,e)=>{for(var t in e)Ut(c,t,{get:e[t],enumerable:!0})};var ct={};I(ct,{Papi:()=>F,getWs:()=>Yt});import{hydration as Wt}from"@galacticcouncil/descriptors";function ut(c){switch(c){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var F=class{client;api;constructor(e){this.client=e,this.api=this.client.getTypedApi(Wt)}log(e,...t){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");ut(n)&&console.log(e,...t)}};import{createClient as Vt}from"polkadot-api";import{withPolkadotSdkCompat as Xt}from"polkadot-api/polkadot-sdk-compat";var Yt=async c=>{let e=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)(e);return Vt(Xt(s))};var St={};I(St,{AAVE_GAS_LIMIT:()=>Ge,AAVE_LENDING_POOL_ADDRESS:()=>_e,AAVE_POOL_ABI:()=>Ne,AAVE_POOL_DATA_PROVIDER:()=>Be,AAVE_POOL_DATA_PROVIDER_ABI:()=>Ae,AAVE_POOL_PROXY:()=>He,AAVE_ROUNDING_THRESHOLD:()=>dr,AAVE_UINT_256_MAX:()=>jt,AaveClient:()=>le,AaveUtils:()=>Y});var Ne=[{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 Ae=[{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 He="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Be="0x112b087b60C1a166130d59266363C45F8aa99db0",_e="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Ge=1000000n,dr=5,jt=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var gt={};I(gt,{EvmClient:()=>E,evmMainnet:()=>Ue});import{defineChain as Kt}from"viem";var pt=["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"],mt=["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=Kt({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{public:{http:pt,webSocket:mt},default:{http:pt,webSocket:mt}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});import{createPublicClient as dt,createWalletClient as zt,custom as $t,http as Qt,webSocket as Jt}from"viem";var E=class{chain;constructor(e){this.chain=e||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 dt({chain:this.chain,transport:Qt()})}getWsProvider(){return dt({chain:this.chain,transport:Jt()})}getSigner(e){return zt({account:e,chain:this.chain,transport:$t(window.ethereum)})}};var le=class{evmClient;constructor(e){this.evmClient=e??new E}async getReservesData(){return await this.evmClient.getProvider().readContract({abi:Ae,address:Be,args:[_e],functionName:"getReservesData"})}async getUserReservesData(e){return await this.evmClient.getProvider().readContract({abi:Ae,address:Be,args:[_e,e],functionName:"getUserReservesData"})}async getUserAccountData(e){return await this.evmClient.getProvider().readContract({abi:Ne,address:He,args:[e],functionName:"getUserAccountData"})}};var y={};I(y,{asBigInt:()=>tn,toBigInt:()=>en,toDecimal:()=>Zt});import V from"big.js";V.NE=-18;function Zt(c,e,t=6,n){let s=V(c.toString()),r=V(10).pow(e);return s.div(r).round(t,n).toString()}function en(c,e){let t=V(10).pow(e),s=V(c).mul(t).toFixed(0,V.roundDown);return BigInt(s)}function tn(c){return BigInt(c.round(0,V.roundDown).toFixed(0))}var K={};I(K,{ERC20:()=>We});var We=class{static fromAssetId(e){let t=Buffer.alloc(20,0);return t[15]=1,t.writeUInt32BE(e,16),"0x"+t.toString("hex")}static toAssetId(e){let t=Buffer.from(e.replace("0x",""),"hex");return t.length!==20||!this.isAssetAddress(e)?null:t.readUInt32BE(16)}static isAssetAddress(e){let t=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(e.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(t.subarray(0,16))}};var h={};I(h,{fromPermill:()=>rn,toDecimals:()=>sn,toPct:()=>nn});var bt=1e3;function nn(c){let[e,t]=c;return e/t*100}function sn(c){let[e,t]=c;return e/t}function rn(c){return[c/bt,bt]}var Re={};I(Re,{H160:()=>Ke,isEvmAccount:()=>Pt,isEvmAddress:()=>ft,isSs58Address:()=>Tt});import{AccountId as ue}from"polkadot-api";import{toHex as ht}from"@polkadot-api/utils";import{Buffer as W}from"buffer";var yt={};I(yt,{HUB_ASSET_ID:()=>Ye,HYDRATION_OMNIPOOL_ADDRESS:()=>ln,HYDRATION_PARACHAIN_ID:()=>on,HYDRATION_SS58_PREFIX:()=>L,PERBILL_DENOMINATOR:()=>an,PERMILL_DENOMINATOR:()=>Ve,RUNTIME_DECIMALS:()=>D,SYSTEM_ASSET_DECIMALS:()=>Xe,SYSTEM_ASSET_ID:()=>N,TRADEABLE_DEFAULT:()=>z});var D=18,Ve=1e6,an=1e9,N=0,Xe=12,on=2034,L=63,ln="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Ye=1,z=15;var je="ETH\0";function Pt(c){if(!c)return!1;try{let e=ue().enc(c),t=W.from(je);return W.from(e.subarray(0,t.length)).equals(t)}catch{return!1}}function ft(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function Tt(c){try{return ue(63).enc(c),!0}catch{return!1}}var Ke=class c{static toAccount=e=>{let t=W.from(e.slice(2),"hex"),n=W.from(je),s=Uint8Array.from(W.concat([n,t,W.alloc(8)])),r=ht(s);return ue(63).dec(r)};static fromAccount=e=>{let t=ue().enc(e),n=W.from(je),s=t.slice(n.length,-8);return"0x"+W.from(s).toString("hex")};static fromSS58=e=>{let n=ue().enc(e).slice(0,20);return ht(n)};static fromAny=e=>{if(ft(e))return e;if(Pt(e))return c.fromAccount(e);if(Tt(e))return c.fromSS58(e);throw new Error("Unknown address type")}};var X={};I(X,{findNestedKey:()=>un,findNestedObj:()=>cn,jsonFormatter:()=>pn});var un=(c,e)=>{let t=[];return JSON.stringify(c,(n,s)=>(s&&s[e]&&t.push(s),s)),t[0]},cn=(c,e,t)=>{let n;return JSON.stringify(c,(s,r)=>(r&&r[e]===t&&(n=r),r)),n},pn=(c,e)=>typeof e=="bigint"?e.toString():e;var O={};I(O,{calculateBuyFee:()=>bn,calculateDiffToAvg:()=>mn,calculateDiffToRef:()=>dn,calculateSellFee:()=>gn,getFraction:()=>yn});import H from"big.js";function mn(c,e){let t=H(c.toString()),n=H(e.toString());return t.minus(n).abs().div(t.plus(n).div(2)).mul(100).round(2).toNumber()}function dn(c,e){if(e===0n)return 0;let t=H(c.toString()),n=H(e.toString());return t.minus(n).div(n).mul(100).round(2).toNumber()}function gn(c,e){let t=H(c.toString()),n=H(e.toString());return H(1).minus(n.div(t)).mul(100).round(2).toNumber()}function bn(c,e){let t=H(c.toString());return H(e.toString()).div(t).minus(1).mul(100).round(2).toNumber()}function yn(c,e,t=2){(e<.01||e>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,t),s=BigInt(e*n);return c*s/BigInt(100*n)}var xt={};I(xt,{convertToId:()=>Pn});import{Buffer as hn}from"buffer";function Pn(c){let t=hn.from(c.replace("0x",""),"hex").subarray(16);return t.readUIntBE(0,t.length)}var{ERC20:Fe}=K,{H160:ze}=Re,fn=1.01,Tn=99999,xn=10n**27n,Sn=10n**18n,Y=class{client;constructor(e){let t=e??new E;this.client=new le(t)}async getSummary(e){let t=ze.fromAny(e),[n,s,r]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(t),this.client.getUserAccountData(t)]),[i]=n,[a,o]=s,[l,u,d,p,m,g]=r,P=y.toDecimal(g,18),b=[];for(let x of a){let f=x.underlyingAsset.toLowerCase(),T=i.find(({underlyingAsset:qe})=>qe.toLowerCase()===f);if(!T)throw new Error("Missing pool reserve for "+f);let S=x.scaledATokenBalance,v=T.liquidityIndex,_=T.priceInMarketReferenceCurrency,R=S*v/xn,Oe=Number(o===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,ve=T.usageAsCollateralEnabled&&x.usageAsCollateralEnabledOnUser&&x.scaledATokenBalance>0n,Le=Fe.toAssetId(f);b.push({aTokenBalance:R,decimals:Number(T.decimals),isCollateral:ve,priceInRef:_,reserveId:Le,reserveAsset:f,reserveLiquidationThreshold:Oe})}return{healthFactor:Number(P),totalCollateral:l,totalDebt:u,reserves:b}}async hasBorrowPositions(e){let t=ze.fromAny(e),n=await this.client.getUserAccountData(t),[s,r]=n;return r>0n}async getHealthFactor(e){let t=ze.fromAny(e),n=await this.client.getUserAccountData(t),[s,r,i,a,o,l]=n,u=y.toDecimal(l,18);return Number(u)}async getHealthFactorAfterWithdraw(e,t,n){let{totalCollateral:s,totalDebt:r,reserves:i}=await this.getSummary(e),a=Fe.fromAssetId(t),o=i.find(b=>b.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,isCollateral:u,priceInRef:d,reserveLiquidationThreshold:p}=o,m=y.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(e,t,n){let{totalCollateral:s,totalDebt:r,reserves:i}=await this.getSummary(e),a=Fe.fromAssetId(t),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=y.toBigInt(n,l)*u/10n**BigInt(l),g=s+m;return g<=0n?0:this.calculateHealthFactor(g,d,r)}async getMaxWithdraw(e,t){let{totalCollateral:n,totalDebt:s,reserves:r}=await this.getSummary(e),i=Fe.fromAssetId(t),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(e){let{totalCollateral:t,totalDebt:n,reserves:s}=await this.getSummary(e),r={};for(let i of s){let a=this.calculateWithdrawMax(i,t,n);i.reserveId&&(r[i.reserveId]=a)}return r}calculateHealthFactor(e,t,n){if(n===0n)return Tn;let s=10n**6n,r=y.toBigInt(t,18),i=e*r*s,a=n*Sn,o=i/a;return Number(o)/1e6}calculateRequiredCollateral(e,t,n){let s=y.toBigInt(e,18),r=y.toBigInt(t,18);return(s*n+r-1n)/r}calculateWithdrawMax(e,t,n){let{aTokenBalance:s,decimals:r,priceInRef:i,reserveLiquidationThreshold:a}=e,o=this.calculateRequiredCollateral(fn,a,n),l=t-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 wt={};I(wt,{AssetClient:()=>$,BalanceClient:()=>q,ChainParams:()=>J});var $=class extends F{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(e){super(e)}async queryShares(){let t=await this.api.query.Stableswap.Pools.getEntries();return new Map(t.map(({keyArgs:n,value:s})=>{let[r]=n;return[r,s]}))}async queryBonds(){let t=await this.api.query.Bonds.Bonds.getEntries();return new Map(t.map(({keyArgs:n,value:s})=>{let[r]=n;return[r,s]}))}async queryAssets(){let t=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(t.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 t=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(t.map(({keyArgs:n,value:s})=>{let[r]=n;return[r,s]}))}async mapToken(e,t,n,s){let{name:r,asset_type:i,is_sufficient:a,existential_deposit:o}=t,{symbol:l,decimals:u}=n.get(e)??{};return{id:e,name:r?.asText(),symbol:l,decimals:u,icon:l,type:i.type,isSufficient:a,location:s,existentialDeposit:o}}async mapBond(e,t,n,s){let[r,i]=s,{asset_type:a,is_sufficient:o,existential_deposit:l}=t,{symbol:u,decimals:d}=await this.mapToken(r,t,n),p=Number(i),m=new Intl.DateTimeFormat("en-GB"),g=[u,"Bond",m.format(p)].join(" ");return{id:e,name:g,symbol:u+"b",decimals:d,icon:u,type:a.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:r,maturity:p}}async mapShares(e,t,n,s){let{assets:r}=s,{name:i,symbol:a,asset_type:o,is_sufficient:l,existential_deposit:u}=t,d=await Promise.all(r.map(async g=>{let{symbol:P}=await this.mapToken(g,t,n);return[g,P]})),p=Object.fromEntries(d),m=Object.values(p);return{id:e,name:m.join(", "),symbol:a?.asText()||i?.asText(),decimals:18,icon:m.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:p}}async mapExternal(e,t,n,s){let r=await this.mapToken(e,t,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(e){return new Map(Array.from(e,([t,n])=>[t,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(e,t){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,t,d);break;default:m=await this.mapToken(l,u,a,d)}o.push(m)}return e?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(e){let t=Math.sign(e.decimals);return!!e.symbol&&(t===0||t===1)}};import{Subject as In,bufferCount as wn,combineLatest as On,debounceTime as vn,distinctUntilChanged as It,finalize as An,map as Q,pairwise as Bn,shareReplay as _n,startWith as Rn}from"rxjs";var q=class extends F{constructor(e){super(e)}async getBalance(e,t){return t===0?this.getSystemBalance(e):this.getTokenBalanceData(e,t)}async getSystemBalance(e){let t=this.api.query.System.Account,{data:{free:n,frozen:s}}=await t.getValue(e);return n-s}async getTokenBalance(e,t){let n=this.api.query.Tokens.Accounts,{free:s,frozen:r}=await n.getValue(e,t);return s-r}async getErc20Balance(e,t){return this.getTokenBalanceData(e,t)}subscribeBalance(e){let t=this.subscribeSystemBalance(e),n=this.subscribeTokensBalance(e),s=this.subscribeErc20Balance(e);return On([t,n,s]).pipe(vn(250),Q(r=>r.flat()),Rn([]),wn(2,1),Q(([r,i],a)=>{if(a===0)return i;let o=r.reduce((u,d)=>(u.set(d.id,d.amount),u),new Map);return i.filter(u=>u.amount!==o.get(u.id))}))}subscribeSystemBalance(e){return this.api.query.System.Account.watchValue(e,"best").pipe(Q(n=>{let{free:s,frozen:r}=n.data;return{id:0,amount:s-r}}))}subscribeTokenBalance(e,t){return this.api.query.Tokens.Accounts.watchValue(e,t,"best").pipe(Q(s=>{let{free:r,frozen:i}=s;return{id:t,amount:r-i}}))}subscribeTokensBalance(e){return this.api.query.Tokens.Accounts.watchEntries(e,{at:"best"}).pipe(It((n,s)=>!s.deltas),Q(({deltas:n})=>{let s=[];return n?.deleted.forEach(r=>{let[i,a]=r.args;s.push({id:a,amount:0n})}),n?.upserted.forEach(r=>{let[i,a]=r.args,{free:o,frozen:l}=r.value;s.push({id:a,amount:o-l})}),s}))}subscribeErc20Balance(e,t){let n=new In,s=n.pipe(_n(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=t||await r(),l=async()=>{let p=(await Promise.all(o.map(async m=>{let g=await this.getTokenBalanceData(e,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(An(()=>a?.()),Bn(),Q(([o,l],u)=>{if(u===0)return l;let d=o.reduce((m,g)=>(m.set(g.id,g.amount),m),new Map);return l.filter(m=>m.amount!==d.get(m.id))}),It((o,l)=>l.length===0))}async getTokenBalanceData(e,t){let{free:n,frozen:s}=await this.api.apis.CurrenciesApi.account(t,e);return n-s}};var J=class extends F{_minOrderBudget;_blockTime;constructor(e){super(e)}async getBlockTime(){if(this._blockTime===void 0){let e=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(e)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};var Ot={};I(Ot,{AssetNotFound:()=>$e,PoolNotFound:()=>ce,RouteNotFound:()=>Z});var $e=class extends Error{constructor(e){super(),this.message=`${e} not found`,this.name="AssetNotFound"}},ce=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},Z=class extends Error{constructor(e,t){super(),this.message=`Route from ${e} to ${t} not found in current configuration`,this.name="RouteNotFound"}};var Dt={};I(Dt,{PoolContextProvider:()=>ne,PoolError:()=>j,PoolFactory:()=>te,PoolType:()=>A,aave:()=>tt,lbp:()=>Qe,omni:()=>Je,stable:()=>Ze,xyk:()=>et});var Qe={};I(Qe,{LbpMath:()=>M,LbpPool:()=>pe,LbpPoolClient:()=>me});import{calculate_in_given_out as Fn,calculate_out_given_in as En,calculate_linear_weights as Dn,calculate_pool_trade_fee as kn,get_spot_price as Cn}from"@galacticcouncil/math-lbp";var M=class{static getSpotPrice(e,t,n,s,r){return Cn(e,t,n,s,r)}static calculateInGivenOut(e,t,n,s,r){return Fn(e,t,n,s,r)}static calculateOutGivenIn(e,t,n,s,r){return En(e,t,n,s,r)}static calculateLinearWeights(e,t,n,s,r){return Dn(e,t,n,s,r)}static calculatePoolTradeFee(e,t,n){return kn(e,t,n)}};var A=(r=>(r.Aave="Aave",r.LBP="LBP",r.Omni="Omnipool",r.Stable="Stableswap",r.XYK="XYK",r))(A||{}),j=(r=>(r.InsufficientTradingAmount="InsufficientTradingAmount",r.MaxInRatioExceeded="MaxInRatioExceeded",r.MaxOutRatioExceeded="MaxOutRatioExceeded",r.TradeNotAllowed="TradeNotAllowed",r.UnknownError="UnknownError",r))(j||{});var pe=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(e){return new c(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.fee,e.repayFeeApply)}constructor(e,t,n,s,r,i,a){this.type="LBP",this.address=e,this.tokens=t,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r,this.fee=i,this.repayFeeApply=a}validatePair(e,t){return!0}parsePair(e,t){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(e),r=n.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:e,assetOut:t,balanceIn:s.balance,balanceOut:r.balance,decimalsIn:s.decimals,decimalsOut:r.decimals,weightIn:s.weight,weightOut:r.weight}}validateAndBuy(e,t,n){let s=this.tokens[0].id,r=[];t<this.minTradingLimit&&r.push("InsufficientTradingAmount");let i=e.balanceOut/this.maxOutRatio;if(t>i&&r.push("MaxOutRatioExceeded"),s===e.assetOut){let a=this.calculateTradeFee(t,n),o=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=t+a,u=this.calculateInGivenOut(e,l),d=e.balanceIn/this.maxInRatio;return u>d&&r.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:t,feePct:o,errors:r}}else{let a=this.calculateInGivenOut(e,t),o=e.balanceIn/this.maxInRatio;return a>o&&r.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:a,amountOut:t,feePct:0,errors:r}}}validateAndSell(e,t,n){let s=this.tokens[0].id,r=[];t<this.minTradingLimit&&r.push("InsufficientTradingAmount");let i=e.balanceIn/this.maxInRatio;if(t>i&&r.push("MaxInRatioExceeded"),s===e.assetIn){let a=this.calculateOutGivenIn(e,t),o=e.balanceOut/this.maxOutRatio;return a>o&&r.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:a,amountOut:a,feePct:0,errors:r}}else{let a=this.calculateOutGivenIn(e,t),o=this.calculateTradeFee(a,n),l=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),u=a-o,d=e.balanceOut/this.maxOutRatio;return u>d&&r.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:a,amountOut:u,feePct:l,errors:r}}}calculateInGivenOut(e,t){let n=M.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toString()),s=BigInt(n);return s<0n?0n:s}calculateOutGivenIn(e,t){let n=M.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toString()),s=BigInt(n);return s<0n?0n:s}spotPriceInGivenOut(e){let t=M.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),this.maxOutRatio.toString());return BigInt(t)}spotPriceOutGivenIn(e){let t=M.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),this.maxInRatio.toString());return BigInt(t)}calculateTradeFee(e,t){let n=M.calculatePoolTradeFee(e.toString(),this.repayFeeApply?t.repayFee[0]:t.exchangeFee[0],this.repayFeeApply?t.repayFee[1]:t.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Un}from"polkadot-api";import{map as Wn,of as Rt,switchMap as Vn}from"rxjs";import{memoize1 as Mn}from"@thi.ng/memoize";import{combineLatest as vt,combineLatestAll as Ln,debounceTime as qn,firstValueFrom as Nn,from as At,map as Bt,mergeAll as Hn,of as Gn,switchMap as _t}from"rxjs";var k=class extends q{override=[];mem=0;memPools=Mn(e=>(this.log(this.getPoolType(),"mem pools",e,"\u2705"),this.loadPools()));constructor(e){super(e)}async withOverride(e){this.override=e||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let e=At(this.getPoolsMem()).pipe(_t(t=>this.subscribe(t)),Ln());return Nn(e)}getSubscriber(){return At(this.getPoolsMem()).pipe(_t(e=>this.subscribe(e)),Hn())}subscribe(e){return e.filter(t=>this.hasValidAssets(t)).map(t=>vt([this.subscribePoolChange(t),this.subscribePoolBalance(t)]).pipe(qn(250),Bt(([n,s])=>this.updatePool(n,s))))}subscribePoolBalance(e){if(e.type==="Aave")return Gn([]);let t=[this.subscribeTokensBalance(e.address)];if(this.hasSystemAsset(e)){let n=this.subscribeSystemBalance(e.address);t.push(n)}if(this.hasErc20Asset(e)){let n=e.tokens.filter(r=>r.type==="Erc20").map(r=>r.id),s=this.subscribeErc20Balance(e.address,n);t.push(s)}return vt(t).pipe(Bt(n=>n.map(s=>Array.isArray(s)?s:[s]).flat()))}hasSystemAsset(e){return e.tokens.some(t=>t.id===0)}hasErc20Asset(e){return e.tokens.some(t=>t.type==="Erc20")}hasValidAssets(e){return e.tokens.every(({id:t,decimals:n,balance:s})=>{let r=this.override.find(a=>a.id===t),i=!!n||!!r?.decimals;return s>0n&&i})}updatePool=(e,t)=>{let n=e.tokens.map(s=>{let r=t.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{...e,tokens:n}}};var me=class extends k{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);async loadPools(){let[e,t,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),s=t?.relay_parent_number||0,r=e.filter(({value:i})=>t&&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(e,t,n){let{start:s,end:r,assets:i,initial_weight:a,final_weight:o,repay_target:l,fee_collector:u}=t,d=M.calculateLinearWeights(s?s.toString():"0",r?r.toString():"0",a.toString(),o.toString(),n.toString()),[p,m]=i,g=BigInt(d),P=this.MAX_FINAL_WEIGHT-BigInt(g),[b,x,f,T,S]=await Promise.all([this.isRepayFeeApplied(p,l,u.toString()),this.getBalance(e,p),this.api.query.AssetRegistry.Assets.getValue(p),this.getBalance(e,m),this.api.query.AssetRegistry.Assets.getValue(m)]);return{repayFeeApply:b,tokens:[{id:p,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:x,weight:g,type:f?.asset_type.type},{id:m,decimals:S?.decimals,existentialDeposit:S?.existential_deposit,balance:T,weight:P,type:S?.asset_type.type}]}}isActivePool(e,t){let{start:n,end:s}=e;return n&&s?t>=n&&t<s:!1}async isRepayFeeApplied(e,t,n){if(t===0n)return!1;try{return await this.getBalance(n,e)<t}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolLimits(){let[e,t,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:e,maxOutRatio:t,minTradingLimit:n}}async getPoolFees(e){return{repayFee:await this.getRepayFee(),exchangeFee:e.fee}}getPoolType(){return"LBP"}async isSupported(){let e=this.api.query.LBP.PoolData,t=await this.api.compatibilityToken;return e.isCompatible(Un.BackwardsCompatible,t)}subscribePoolChange(e){let t=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(e.address);return n?t.watchValue("best").pipe(Vn(s=>s?this.getPoolDelta(e.address,n,s.relay_parent_number):Rt(e)),Wn(s=>Object.assign({},e,s))):Rt(e)}};var Je={};I(Je,{OmniMath:()=>w,OmniPool:()=>de,OmniPoolClient:()=>ge});import{calculate_in_given_out as Xn,calculate_lrna_in_given_out as Yn,calculate_out_given_in as jn,calculate_out_given_lrna_in as Kn,calculate_spot_price as zn,calculate_lrna_spot_price as $n,calculate_shares as Qn,calculate_liquidity_out as Jn,calculate_liquidity_lrna_out as Zn,verify_asset_cap as es,calculate_liquidity_hub_in as ts,is_sell_allowed as ns,is_buy_allowed as ss,is_add_liquidity_allowed as rs,is_remove_liquidity_allowed as as}from"@galacticcouncil/math-omnipool";import ee from"big.js";var w=class{static calculateSpotPrice(e,t,n,s){return zn(e,t,n,s)}static calculateLrnaSpotPrice(e,t){return $n(e,t)}static calculateInGivenOut(e,t,n,s,r,i,a,o,l){return Xn(e,t,n,s,r,i,a,o,l)}static calculateLrnaInGivenOut(e,t,n,s,r){return Yn(e,t,n,s,r)}static calculateOutGivenIn(e,t,n,s,r,i,a,o,l){return jn(e,t,n,s,r,i,a,o,l)}static calculateOutGivenLrnaIn(e,t,n,s,r){return Kn(e,t,n,s,r)}static calculateShares(e,t,n,s){return Qn(e,t,n,s)}static calculateLiquidityOut(e,t,n,s,r,i,a,o){return Jn(e,t,n,s,r,i,a,o)}static calculateLiquidityLRNAOut(e,t,n,s,r,i,a,o){return Zn(e,t,n,s,r,i,a,o)}static calculateCapDifference(e,t,n,s){let r=ee(t),i=ee(e),a=ee(s),o=ee(n),l=ee(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(ee(1).minus(u));return p.div(m).toFixed(0)}else return"0"}static verifyAssetCap(e,t,n,s){return es(e,t,n,s)}static calculateLimitHubIn(e,t,n,s){return ts(e,t,n,s)}static isSellAllowed(e){return ns(e)}static isBuyAllowed(e){return ss(e)}static isAddLiquidityAllowed(e){return rs(e)}static isRemoveLiquidityAllowed(e){return as(e)}};var de=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(e){return new c(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.hubAssetId)}constructor(e,t,n,s,r,i){this.type="Omnipool",this.address=e,this.tokens=t,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r,this.hubAssetId=i}validatePair(e,t){return this.hubAssetId!=t}parsePair(e,t){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(e),r=n.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:e,assetOut:t,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(e,t,n){let s=this.calculateInGivenOut(e,t),r=this.calculateInGivenOut(e,t,n),i=s===0n?0:O.calculateDiffToRef(r,s),a=[],o=w.isSellAllowed(e.tradeableIn),l=w.isBuyAllowed(e.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(t<this.minTradingLimit||s<e.assetInEd)&&a.push("InsufficientTradingAmount");let u=e.balanceOut/this.maxOutRatio;t>u&&a.push("MaxOutRatioExceeded");let d=e.balanceIn/this.maxInRatio;return r>d&&a.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:s,amountOut:t,feePct:i,errors:a}}validateAndSell(e,t,n){let s=this.calculateOutGivenIn(e,t),r=this.calculateOutGivenIn(e,t,n),i=O.calculateDiffToRef(s,r),a=[],o=w.isSellAllowed(e.tradeableIn),l=w.isBuyAllowed(e.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(t<this.minTradingLimit||s<e.assetOutEd)&&a.push("InsufficientTradingAmount");let u=e.balanceIn/this.maxInRatio;t>u&&a.push("MaxInRatioExceeded");let d=e.balanceOut/this.maxOutRatio;return r>d&&a.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:r,feePct:i,errors:a}}calculateInGivenOut(e,t,n){if(e.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(e,t,n);let s=w.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toString(),n?h.toDecimals(n.assetFee).toString():"0",n?h.toDecimals(n.protocolFee).toString():"0"),r=BigInt(s);return r<0n?0n:r}calculateLrnaInGivenOut(e,t,n){let s=w.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toString(),n?h.toDecimals(n.assetFee).toString():"0"),r=BigInt(s);return r<0n?0n:r}calculateOutGivenIn(e,t,n){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,n);let s=w.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toString(),n?h.toDecimals(n.assetFee).toString():"0",n?h.toDecimals(n.protocolFee).toString():"0"),r=BigInt(s);return r<0n?0n:r}calculateOutGivenLrnaIn(e,t,n){let s=w.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toString(),n?h.toDecimals(n.assetFee).toString():"0"),r=BigInt(s);return r<0n?0n:r}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=w.calculateSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString(),e.balanceIn.toString(),e.hubReservesIn.toString()),n=Math.pow(10,18-e.decimalsOut);return BigInt(t)/BigInt(n)}spotPriceLrnaInGivenOut(e){let t=w.calculateLrnaSpotPrice(e.hubReservesOut.toString(),e.balanceOut.toString()),n=Math.pow(10,18-e.decimalsOut);return BigInt(t)/BigInt(n)}spotPriceOutGivenIn(e){if(e.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(e);let t=w.calculateSpotPrice(e.balanceIn.toString(),e.hubReservesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString()),n=Math.pow(10,18-e.decimalsIn);return BigInt(t)/BigInt(n)}spotPriceOutGivenLrnaIn(e){let t=w.calculateLrnaSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString()),n=Math.pow(10,18-e.decimalsIn);return BigInt(t)/BigInt(n)}};import{AccountId as is,CompatibilityLevel as os}from"polkadot-api";import{toHex as ls}from"@polkadot-api/utils";import{distinctUntilChanged as us,map as Ft}from"rxjs";var ge=class extends k{async loadPools(){let e=await this.api.constants.Omnipool.HubAssetId(),t=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(e),this.getBalance(t,e),this.getPoolLimits()]),o=n.map(async({keyArgs:u,value:d})=>{let[p]=u,{hub_reserve:m,shares:g,tradable:P,cap:b,protocol_shares:x}=d,[f,T]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(p),this.getBalance(t,p)]);return{id:p,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:T,cap:b,hubReserves:m,protocolShares:x,shares:g,tradeable:P,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:e,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:i,tradeable:s,type:r?.asset_type.type}),[{address:t,type:"Omnipool",hubAssetId:e,tokens:l,...a}]}getPoolAddress(){let e="modlomnipool".padEnd(32,"\0"),t=new TextEncoder().encode(e),n=ls(t);return is(63).dec(n)}async getPoolLimits(){let[e,t,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:e,maxOutRatio:t,minTradingLimit:n}}async getPoolFees(e,t){let[n,s,r]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(t)]),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 e=this.api.query.Omnipool.Assets,t=await this.api.compatibilityToken;return e.isCompatible(os.BackwardsCompatible,t)}subscribePoolChange(e){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(us((n,s)=>!s.deltas),Ft(({entries:n})=>n.map(s=>{let[r]=s.args,{hub_reserve:i,shares:a,tradable:o,cap:l,protocol_shares:u}=s.value,d=e.tokens.findIndex(m=>m.id===r);return{...e.tokens[d],cap:l,hubReserves:i,protocolShares:u,shares:a,tradeable:o}})),Ft(n=>{let s=e.tokens.find(r=>r.id===1);return{...e,tokens:[...n,s]}}))}};var Ze={};I(Ze,{StableMath:()=>B,StableSwap:()=>be,StableSwapClient:()=>ye});import{calculate_in_given_out as cs,calculate_out_given_in as ps,calculate_amplification as ms,calculate_add_one_asset as ds,calculate_liquidity_out_one_asset as gs,calculate_shares as bs,calculate_shares_for_amount as ys,calculate_spot_price_with_fee as hs,pool_account_name as Ps,recalculate_peg as fs}from"@galacticcouncil/math-stableswap";var B=class{static getPoolAddress(e){return Ps(e)}static defaultPegs(e){let t=[];for(let n=0;n<e;n++)t.push(["1","1"]);return t}static calculateAmplification(e,t,n,s,r){return ms(e,t,n,s,r)}static calculateInGivenOut(e,t,n,s,r,i,a){return cs(e,t,n,s,r,i,a)}static calculateAddOneAsset(e,t,n,s,r,i,a){return ds(e,t,n,s,r,i,a)}static calculateSharesForAmount(e,t,n,s,r,i,a){return ys(e,t,n,s,r,i,a)}static calculateOutGivenIn(e,t,n,s,r,i,a){return ps(e,t,n,s,r,i,a)}static calculateLiquidityOutOneAsset(e,t,n,s,r,i,a){return gs(e,t,n,s,r,i,a)}static calculateShares(e,t,n,s,r,i){return bs(e,t,n,s,r,i)}static calculateSpotPriceWithFee(e,t,n,s,r,i,a,o){return hs(e,t,n,s,r,i,a,o)}static recalculatePegs(e,t,n,s,r){let i=fs(e,t,n,s,r);return JSON.parse(i)}};var be=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(e){return new c(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.amplification,e.id,e.fee,e.totalIssuance)}constructor(e,t,n,s,r,i,a,o,l){this.type="Stableswap",this.address=e,this.tokens=t,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r,this.amplification=i,this.id=a,this.fee=o,this.totalIssuance=l}validatePair(e,t){return!0}parsePair(e,t){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(e),r=n.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:e,assetOut:t,balanceIn:s.balance,balanceOut:r.balance,decimalsIn:s.decimals,decimalsOut:r.decimals,tradeableIn:this.id===e?15:s.tradeable,tradeableOut:this.id===t?15:r.tradeable,assetInEd:s.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(e,t,n){let s=this.calculateInGivenOut(e,t),r=this.calculateInGivenOut(e,t,n),i=h.toPct(n.fee),a=[],o=w.isSellAllowed(e.tradeableIn),l=w.isBuyAllowed(e.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(t<this.minTradingLimit||s<e.assetInEd)&&a.push("InsufficientTradingAmount"),{amountIn:r,calculatedIn:s,amountOut:t,feePct:i,errors:a}}validateAndSell(e,t,n){let s=this.calculateOutGivenIn(e,t),r=this.calculateOutGivenIn(e,t,n),i=h.toPct(n.fee),a=[],o=w.isSellAllowed(e.tradeableIn),l=w.isBuyAllowed(e.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(t<this.minTradingLimit||s<e.assetOutEd)&&a.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:s,amountOut:r,feePct:i,errors:a}}calculateIn(e,t,n){let s=B.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toString(),this.amplification.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateAddOneAsset(e,t,n){let s=B.calculateAddOneAsset(this.getReserves(),t.toString(),Number(e.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(e,t,n){let s=B.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.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(e,t,n){return e.assetOut==this.id?this.calculateAddOneAsset(e,t,n):e.assetIn==this.id?this.calculateSharesForAmount(e,t,n):this.calculateIn(e,t,n)}spotPriceInGivenOut(e){let t=B.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),e.assetOut.toString(),e.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(e.assetOut==this.id)return BigInt(t);if(e.assetIn==this.id){let s=Math.pow(10,e.decimalsIn-e.decimalsOut);return BigInt(t)/BigInt(s)}let n=Math.pow(10,18-e.decimalsIn);return BigInt(t)/BigInt(n)}calculateOut(e,t,n){let s=B.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toString(),this.amplification.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateWithdrawOneAsset(e,t,n){let s=B.calculateLiquidityOutOneAsset(this.getReserves(),t.toString(),Number(e.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(e,t,n){let s=B.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateOutGivenIn(e,t,n){return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t,n):e.assetOut==this.id?this.calculateShares(e,t,n):this.calculateOut(e,t,n)}spotPriceOutGivenIn(e){let t=B.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),e.assetIn.toString(),e.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(e.assetIn==this.id)return BigInt(t);if(e.assetOut==this.id){let s=Math.pow(10,e.decimalsOut-e.decimalsIn);return BigInt(t)/BigInt(s)}let n=Math.pow(10,18-e.decimalsOut);return BigInt(t)/BigInt(n)}getPegs(){let e=B.defaultPegs(this.tokens.length-1);return JSON.stringify(e)}getReserves(){let e=this.tokens.filter(t=>t.id!=this.id).map(({id:t,balance:n,decimals:s})=>({asset_id:t,amount:n,decimals:s}));return JSON.stringify(e,X.jsonFormatter)}getAssets(e,t){let n={asset_id:Number(e),amount:t.toString()};return JSON.stringify([n],X.jsonFormatter)}};import{AccountId as Ts,CompatibilityLevel as xs}from"polkadot-api";import{toHex as Ss}from"@polkadot-api/utils";import{blake2b as Is}from"@noble/hashes/blake2b";import{map as ws,of as Os,switchMap as vs}from"rxjs";var As=340282366920938463463374607431768211455n,ye=class extends k{poolsData=new Map([]);async loadPools(){let[e,t,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),s=e.map(async({keyArgs:r,value:i})=>{let[a]=r,o=this.getPoolAddress(a),[l,u,d]=await Promise.all([this.getPoolDelta(a,i,t),this.getPoolTokens(a,i),this.getPoolPegs(a,i,t)]);return this.poolsData.set(o,i),{address:o,id:a,type:"Stableswap",fee:h.fromPermill(i.fee),tokens:u,...l,...d,...n}});return Promise.all(s)}async getPoolDelta(e,t,n){let{initial_amplification:s,final_amplification:r,initial_block:i,final_block:a}=t,o=B.calculateAmplification(s.toString(),r.toString(),i.toString(),a.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(e);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(e,t){let n=this.getPoolAddress(e),s=t.assets.map(async a=>{let[o,l,u]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(e,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(e);return r.push({id:e,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:As,tradeable:15,type:i?.asset_type.type}),r}async getPoolPegs(e,t,n){let s=await this.api.query.Stableswap.PoolPegs.getValue(e);if(!s)return this.getDefaultPegs(t);let r=await this.getLatestPegs(t,s,n),i=this.getRecentPegs(s),a=h.fromPermill(s.max_peg_update),o=h.fromPermill(t.fee),[l,u]=B.recalculatePegs(JSON.stringify(i),JSON.stringify(r),n.toString(),h.toDecimals(a).toString(),h.toDecimals(o).toString()),d=Number(l)*1e6;return{pegsFee:h.fromPermill(d),pegs:u}}getDefaultPegs(e){let t=e.fee,n=B.defaultPegs(e.assets.length);return{pegsFee:h.fromPermill(t),pegs:n}}getRecentPegs(e){let{current:t}=e;return Array.from(t.entries()).map(([n,s])=>s.map(r=>r.toString()))}async getLatestPegs(e,t,n){let{source:s}=t,r=Array.from(e.assets.entries()).map(([a,o])=>o),i=s.map(async(a,o)=>{if(a.type==="Oracle"){let[l,u,d]=a.value,p=[d,r[o]].sort((f,T)=>f-T),m=await this.api.query.EmaOracle.Oracles.getValue(l,p,u);if(!m)return;let[{price:g,updated_at:P}]=m,b=g.n.toString(),x=g.d.toString();return d.toString()===p[0].toString()?[[b,x],P.toString()]:[[x,b],P.toString()]}else return[a.value.map(l=>l.toString()),n]});return Promise.all(i)}getPoolAddress(e){let t=B.getPoolAddress(e),n=Is(t,{dkLen:32}),s=Ss(n);return Ts(63).dec(s)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolFees(e){return{fee:e.fee}}getPoolType(){return"Stableswap"}async isSupported(){let e=this.api.query.Stableswap.Pools,t=await this.api.compatibilityToken;return e.isCompatible(xs.BackwardsCompatible,t)}subscribePoolChange(e){let t=this.api.query.System.Number,n=this.poolsData.get(e.address);return!n||!e.id?Os(e):t.watchValue("best").pipe(vs(s=>this.getPoolDelta(e.id,n,s)),ws(s=>Object.assign({},e,s)))}};var et={};I(et,{XykMath:()=>G,XykPool:()=>he,XykPoolClient:()=>Pe});import{calculate_in_given_out as Bs,calculate_out_given_in as _s,calculate_pool_trade_fee as Rs,get_spot_price as Fs,calculate_liquidity_in as Es,calculate_shares as Ds,calculate_spot_price as ks,calculate_spot_price_with_fee as Cs,calculate_liquidity_out_asset_a as Ms,calculate_liquidity_out_asset_b as Ls}from"@galacticcouncil/math-xyk";var G=class{static getSpotPrice(e,t,n){return Fs(e,t,n)}static calculateInGivenOut(e,t,n){return Bs(e,t,n)}static calculateOutGivenIn(e,t,n){return _s(e,t,n)}static calculatePoolTradeFee(e,t,n){return Rs(e,t,n)}static calculateLiquidityIn(e,t,n){return Es(e,t,n)}static calculateSpotPrice(e,t){return ks(e,t)}static calculateSpotPriceWithFee(e,t,n,s){return Cs(e,t,n,s)}static calculateShares(e,t,n){return Ds(e,t,n)}static calculateLiquidityOutAssetA(e,t,n,s){return Ms(e,t,n,s)}static calculateLiquidityOutAssetB(e,t,n,s){return Ls(e,t,n,s)}};var he=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new c(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit)}constructor(e,t,n,s,r){this.type="XYK",this.address=e,this.tokens=t,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r}validatePair(e,t){return!0}parsePair(e,t){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(e),r=n.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:r.decimals,balanceIn:s.balance,balanceOut:r.balance,assetInEd:s.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(e,t,n){let s=this.calculateInGivenOut(e,t),r=this.calculateTradeFee(s,n),i=h.toPct(n.exchangeFee),a=s+r,o=[];(t<this.minTradingLimit||s<e.assetInEd)&&o.push("InsufficientTradingAmount");let l=e.balanceOut/this.maxOutRatio;t>l&&o.push("MaxOutRatioExceeded");let u=e.balanceIn/this.maxInRatio;return a>u&&o.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:s,amountOut:t,feePct:i,errors:o}}validateAndSell(e,t,n){let s=this.calculateOutGivenIn(e,t),r=this.calculateTradeFee(s,n),i=h.toPct(n.exchangeFee),a=s-r,o=[];(t<this.minTradingLimit||s<e.assetOutEd)&&o.push("InsufficientTradingAmount");let l=e.balanceIn/this.maxInRatio;t>l&&o.push("MaxInRatioExceeded");let u=e.balanceOut/this.maxOutRatio;return a>u&&o.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:a,feePct:i,errors:o}}calculateInGivenOut(e,t){let n=G.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toString()),s=BigInt(n);return s<0n?0n:s}calculateOutGivenIn(e,t){let n=G.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toString()),s=BigInt(n);return s<0n?0n:s}spotPriceInGivenOut(e){let t=G.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),n=Math.pow(10,18-e.decimalsOut);return BigInt(t)/BigInt(n)}spotPriceOutGivenIn(e){let t=G.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),n=Math.pow(10,18-e.decimalsIn);return BigInt(t)/BigInt(n)}calculateTradeFee(e,t){let n=G.calculatePoolTradeFee(e.toString(),t.exchangeFee[0],t.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as qs}from"polkadot-api";import{of as Ns}from"rxjs";var Pe=class extends k{async loadPools(){let e=this.api.query.XYK.PoolAssets,[t,n]=await Promise.all([e.getEntries(),this.getPoolLimits()]),s=t.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[e,t,n]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:e,maxOutRatio:t,minTradingLimit:n}}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}getPoolType(){return"XYK"}async isSupported(){let e=this.api.query.XYK.PoolAssets,t=await this.api.compatibilityToken;return e.isCompatible(qs.BackwardsCompatible,t)}subscribePoolChange(e){return Ns(e)}};var tt={};I(tt,{AavePool:()=>fe,AavePoolClient:()=>Te});var fe=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new c(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit)}constructor(e,t,n,s,r){this.type="Aave",this.address=e,this.tokens=t,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r}validatePair(e,t){return!0}parsePair(e,t){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(e),r=n.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:e,assetOut:t,balanceIn:s.balance,balanceOut:r.balance,decimalsIn:s.decimals,decimalsOut:r.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(e,t,n){let s=this.calculateInGivenOut(e,t),r=[];return t>e.balanceOut&&r.push("TradeNotAllowed"),{amountIn:s,calculatedIn:s,amountOut:t,feePct:0,errors:r}}validateAndSell(e,t,n){let s=this.calculateOutGivenIn(e,t),r=[];return s>e.balanceOut&&r.push("TradeNotAllowed"),{amountIn:t,calculatedOut:s,amountOut:s,feePct:0,errors:r}}calculateInGivenOut(e,t){return t}calculateOutGivenIn(e,t){return t}spotPriceInGivenOut(e){let t=Math.pow(10,e.decimalsOut);return BigInt(t)}spotPriceOutGivenIn(e){let t=Math.pow(10,e.decimalsIn);return BigInt(t)}calculateTradeFee(e,t){return 0n}};import{AccountId as Hs}from"polkadot-api";import{toHex as Gs}from"@polkadot-api/utils";import{map as Us,merge as Ws,switchMap as Vs}from"rxjs";import{decodeEventLog as Xs}from"viem";var Et=[{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:Ys}=K,js=["Supply","Withdraw","Repay","Borrow"],Te=class extends k{async loadPools(){let t=(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(t)}async getPoolDelta(e){let[t,n]=e.tokens,{liqudity_in:s,liqudity_out:r}=await this.api.apis.AaveTradeExecutor.pool(t.id,n.id);return e.tokens.map(i=>{let a=i.id===t.id?s:r;return{...i,balance:a}})}getPoolId(e,t){let n=e+"/"+t,s=new TextEncoder().encode(n.padEnd(32,"\0")),r=Gs(s);return Hs(63).dec(r)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(e,t){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(e){let[t,n]=e.tokens,s=this.getReserveH160Id(t),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}=Xs({abi:Et,topics:u,data:d});return js.includes(p)&&m.reserve.toLowerCase()===s.toLowerCase()});return Ws([r,i]).pipe(Vs(()=>this.getPoolDelta(e)),Us(a=>({...e,tokens:[...a]})))}getReserveH160Id(e){return e.type==="Erc20"?X.findNestedKey(e.location,"AccountKey20").AccountKey20.key:Ys.fromAssetId(e.id)}};var te=class{static get(e){switch(e.type){case"Aave":return fe.fromPool(e);case"XYK":return he.fromPool(e);case"Omnipool":return de.fromPool(e);case"LBP":return pe.fromPool(e);case"Stableswap":return be.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};import{Subject as Ks,Subscription as xe,takeUntil as zs}from"rxjs";var ne=class extends F{lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=xe.EMPTY;omniSub=xe.EMPTY;stableSub=xe.EMPTY;xykSub=xe.EMPTY;aaveSub=xe.EMPTY;isReady=!1;isDestroyed=new Ks;constructor(e){super(e),this.lbpClient=new me(e),this.omniClient=new ge(e),this.stableClient=new ye(e),this.xykClient=new Pe(e),this.aaveClient=new Te(e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(e){return e.getSubscriber().pipe(zs(this.isDestroyed)).subscribe(t=>{this.pools.set(t.address,t)})}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(e){return this.xykClient.withOverride(e),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 e=await Promise.all(this.clients.filter(t=>this.active.has(t.getPoolType())).map(t=>t.getPools()));return this.isReady=!0,e.flat()}async getPoolFees(e,t){let n=this.clients.find(s=>s.getPoolType()===e.type);if(n)return n.getPoolFees(e,t);throw new ce(e.type)}};var Lt={};I(Lt,{DEFAULT_BLOCK_TIME:()=>kt,DEFAULT_MIN_BUDGET:()=>rt,ORDER_MIN_BLOCK_PERIOD:()=>Ct,Router:()=>se,TWAP_BLOCK_PERIOD:()=>we,TWAP_MAX_DURATION:()=>it,TWAP_MAX_PRICE_IMPACT:()=>at,TWAP_TX_MULTIPLIER:()=>cu,TradeOrderError:()=>st,TradeOrderType:()=>ke,TradeRouteBuilder:()=>C,TradeRouter:()=>re,TradeScheduler:()=>ae,TradeType:()=>De});var Ee=class{constructor(e=1/0){this.capacity=e}storage=[];enqueue(e){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(e)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var $s=5,Se=class{isNotVisited(e,t){let n=!0;return t.forEach(s=>{(s[0]===e[0]||s[1]===e[1])&&(n=!1)}),n}findPaths(e,t,n){let s=[],r=new Ee,i=[];for(i.push([t,""]),r.enqueue(i);r.size()>0;){let a=r.dequeue();if(a==null||a.length>$s)return s;let o=a[a.length-1];(n===null||o[0]===n)&&s.push(a),e.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,a)){let d=[...a];d.push(u),r.enqueue(d)}})}return s}buildAndPopulateGraph(e,t){let n=new Map;for(let s of e)n.set(parseInt(s),[]);for(let[s,r,i]of t)n.get(r)?.push([i,s]);return n}};function nt(c){let e={};for(let t of c){let n=t.tokens.length;for(let s=0;s<n;s++){e[t.tokens[s].id]||(e[t.tokens[s].id]=[]);for(let r=0;r<n;r++){if(s==r)continue;let i=[t.address,t.tokens[s].id,t.tokens[r].id];e[t.tokens[s].id].push(i)}}}return e}var Ie=class{getProposals(e,t,n){let s=nt(n),r=Object.keys(s),i=r.map(u=>s[u]).flat(),a=new Se,o=a.buildAndPopulateGraph(r,i),l=a.findPaths(o,e,t);return this.parsePaths(l)}parsePaths(e){let t=[];for(let n of e){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))}t.push(s)}return t}toEdge(e,t){return[t[1],e[0],t[0]]}};var se=class{routeSuggester;routerOptions;ctx;defaultRouterOptions={useOnly:[]};constructor(e,t){this.ctx=e,this.routeSuggester=new Ie,this.routerOptions={...this.defaultRouterOptions,...t}}async getPools(){let e=await this.ctx.getPools(),t=this.routerOptions.useOnly;return t.length===0?e:e.filter(n=>t.includes(n.type))}async getRoutes(e,t){let n=await this.getPools();return this.validateInput(e,t,n),this.getPaths(e,t,n)}async getTradeableAssets(){let e=await this.getPools(),t=this.getAssets(e);return Array.from(t)}validateInput(e,t,n){if(n.length===0)throw new Error("No pools configured");if(e===t)throw new Error("Trading pair can't be identical");let s=this.getAssets(n);if(!s.has(e))throw new Error(e+" is not supported asset");if(!s.has(t))throw new Error(t+" is not supported asset");return this.toPoolsMap(n)}getAssets(e){let t=e.map(n=>n.tokens.map(s=>s.id)).flat().sort((n,s)=>n>s?1:-1);return new Set(t)}getPaths(e,t,n){let s=this.toPoolsMap(n);return this.routeSuggester.getProposals(e,t,n).filter(i=>this.validPath(i,s)).map(i=>this.toHops(i,s))}validPath(e,t){return e.length>0&&e.map(n=>this.validEdge(n,t)).reduce((n,s)=>n&&s)}validEdge([e,t,n],s){return s.get(e)?.validatePair(t,n)||!1}toPoolsMap(e){return new Map(e.map(t=>[t.address,te.get(t)]))}toHops(e,t){return e.map(([n,s,r])=>{let i=t.get(n);return{poolAddress:n,poolId:i?.id,pool:i?.type,assetIn:s,assetOut:r}})}};var De=(t=>(t.Buy="Buy",t.Sell="Sell",t))(De||{}),ke=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(ke||{}),st=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(st||{});var re=class extends se{isDirectTrade(e){return e.length==1}findBestSellRoute(e){let t=e.sort((n,s)=>{let r=n[n.length-1].amountOut,i=s[s.length-1].amountOut;return r>i?-1:1});return t.find(n=>n.every(s=>s.errors.length==0))||t[0]}getRouteFeeRange(e){if(e.filter(n=>n.tradeFeeRange).length>0){let n=e.map(r=>r.tradeFeeRange?.[0]??r.tradeFeePct).reduce((r,i)=>r+i),s=e.map(r=>r.tradeFeeRange?.[1]??r.tradeFeePct).reduce((r,i)=>r+i);return[n,s]}}getPoolFeeRange(e){let t=e.min?h.toPct(e.min):void 0,n=e.max?h.toPct(e.max):void 0;if(t&&n)return[t,n]}async getBestSell(e,t,n){return this.getSell(e,t,n)}async getSellSpot(e){let t=e[e.length-1];if(e.length===1)return t.spotPrice;let n=e.map(a=>a.assetOutDecimals).reduce((a,o)=>a+o),s=e.map(a=>a.spotPrice).reduce((a,o)=>a*o),r=n-t.assetOutDecimals,i=Math.pow(10,r);return s/BigInt(i)}async getSell(e,t,n,s){let r=await super.getPools(),i=super.validateInput(e,t,r),a=super.getPaths(e,t,r);if(a.length===0)throw new Z(e,t);let o;if(s)o=await this.toSellSwaps(n,s,i);else{let v=await Promise.all(a.map(_=>this.toSellSwaps(n,_,i)));o=this.findBestSellRoute(v)}let l=o[0],u=o[o.length-1],d=this.isDirectTrade(o),p=await this.getSellSpot(o),m=u.amountOut,g=d?u.calculatedOut:this.calculateDelta0Y(l.amountIn,o,i),P=g-m,b=this.getRouteFeeRange(o),x=d?u.tradeFeePct:O.calculateSellFee(g,m),f=Math.pow(10,l.assetInDecimals),T=l.amountIn*p/BigInt(f),S=O.calculateDiffToRef(g,T);return{type:"Sell",amountIn:l.amountIn,amountOut:u.amountOut,spotPrice:p,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(p,u.assetOutDecimals),tradeFee:y.toDecimal(P,u.assetOutDecimals),tradeFeePct:x,tradeFeeRange:b,priceImpactPct:S,swaps:o.map(v=>v.toHuman())}}}}calculateDelta0Y(e,t,n){let s=[];for(let r=0;r<t.length;r++){let i=t[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=e;let u=a.calculateOutGivenIn(o,l);s.push(u)}return s[s.length-1]}async toSellSwaps(e,t,n){let s=[];for(let r=0;r<t.length;r++){let i=t[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 e=="string"?y.toBigInt(e,o.decimalsIn):e;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),b=a.spotPriceOutGivenIn(o),x=Math.pow(10,o.decimalsIn),f=l*b/BigInt(x),T=O.calculateDiffToRef(p,f);s.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:d,calculatedOut:p,spotPrice:b,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:y.toDecimal(l,o.decimalsIn),amountOut:y.toDecimal(d,o.decimalsOut),calculatedOut:y.toDecimal(p,o.decimalsOut),spotPrice:y.toDecimal(b,o.decimalsOut),tradeFeePct:m,tradeFeeRange:P,priceImpactPct:T,errors:g}}})}return s}async getMostLiquidRoute(e,t){let n=await super.getPools(),s=super.validateInput(e,t,n),r=super.getPaths(e,t,n),o=n.filter(p=>p.tokens.some(m=>m.id===e&&m.id!==p.id)).map(p=>p.type==="Aave"?p.tokens:p.tokens.filter(m=>m.id===e)).map(p=>p.map(m=>m.balance).reduce((m,g)=>m+g)).sort((p,m)=>m<p?-1:1)[0],l=O.getFraction(o,.1),u=await Promise.all(r.map(p=>this.toSellSwaps(l,p,s)));return this.findBestSellRoute(u).map(p=>({poolAddress:p.poolAddress,poolId:p?.poolId,pool:p.pool,assetIn:p.assetIn,assetOut:p.assetOut}))}async getSpotPrice(e,t){let n=await super.getPools(),s=super.validateInput(e,t,n),r=await this.getMostLiquidRoute(e,t),i=await this.toSellSwaps("1",r,s),a=await this.getSellSpot(i),o=i[i.length-1].assetOutDecimals;return{amount:a,decimals:o}}findBestBuyRoute(e){let t=e.sort((n,s)=>{let r=n[0].amountIn,i=s[0].amountIn;return r>i?1:-1});return t.find(n=>n.every(s=>s.errors.length==0))||t[0]}async getBestBuy(e,t,n){return this.getBuy(e,t,n)}async getBuySpot(e){let t=e[0];if(e.length===1)return t.spotPrice;let n=e.map(a=>a.assetInDecimals).reduce((a,o)=>a+o),s=e.map(a=>a.spotPrice).reduce((a,o)=>a*o),r=n-t.assetInDecimals,i=Math.pow(10,r);return s/BigInt(i)}async getBuy(e,t,n,s){let r=await super.getPools(),i=super.validateInput(e,t,r),a=super.getPaths(e,t,r);if(a.length===0)throw new Z(e,t);let o;if(s)o=await this.toBuySwaps(n,s,i);else{let v=await Promise.all(a.map(_=>this.toBuySwaps(n,_,i)));o=this.findBestBuyRoute(v)}let l=o[o.length-1],u=o[0],d=this.isDirectTrade(o),p=await this.getBuySpot(o),m=u.amountIn,g=d?u.calculatedIn:this.calculateDelta0X(l.amountOut,o,i),P=m-g,b=this.getRouteFeeRange(o),x=d?u.tradeFeePct:O.calculateBuyFee(g,m),f=Math.pow(10,l.assetOutDecimals),T=l.amountOut*p/BigInt(f),S;return g===0n?S=-100:S=O.calculateDiffToRef(T,g),{type:"Buy",amountOut:l.amountOut,amountIn:u.amountIn,spotPrice:p,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(p,u.assetInDecimals),tradeFee:y.toDecimal(P,u.assetInDecimals),tradeFeePct:x,tradeFeeRange:b,priceImpactPct:S,swaps:o.map(v=>v.toHuman())}}}}calculateDelta0X(e,t,n){let s=[];for(let r=t.length-1;r>=0;r--){let i=t[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==t.length-1?l=e:l=s[0];let u=a.calculateInGivenOut(o,l);s.unshift(u)}return s[0]}async toBuySwaps(e,t,n){let s=[];for(let r=t.length-1;r>=0;r--){let i=t[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==t.length-1?l=typeof e=="string"?y.toBigInt(e,o.decimalsOut):e: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),b=a.spotPriceInGivenOut(o),x=Math.pow(10,o.decimalsOut),f=l*b/BigInt(x),T;p===0n?T=-100:T=O.calculateDiffToRef(f,p),s.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:d,calculatedIn:p,spotPrice:b,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:y.toDecimal(l,o.decimalsOut),amountIn:y.toDecimal(d,o.decimalsIn),calculatedIn:y.toDecimal(p,o.decimalsIn),spotPrice:y.toDecimal(b,o.decimalsIn),tradeFeePct:m,tradeFeeRange:P,priceImpactPct:T,errors:g}}})}return s}};var kt=6e3,rt=1000000000000000n,we=6,at=-5,it=216e5,cu=3,Ct=6;import{Enum as Mt}from"polkadot-api";var C=class{static build(e){return e.map(({assetIn:t,assetOut:n,pool:s,poolId:r})=>s==="Stableswap"?{pool:Mt("Stableswap",r),asset_in:t,asset_out:n}:{pool:Mt(s),asset_in:t,asset_out:n})}};var ae=class{schedulerOptions;router;constructor(e,t={}){this.router=e,this.schedulerOptions=Object.freeze({blockTime:t.blockTime??6e3,minBudgetInNative:t.minBudgetInNative??rt})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(e,t,n,s,r){let[i,a]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,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),b=this.getMinimumTradeCount(o,i),x=this.getOptimalTradeCount(P),f=r?Math.round(s/r):x,T=Math.ceil(s/b),S=Math.round(s/x),v=Math.round(s/f),_=o/BigInt(f),R=await this.router.getBestSell(e,t,_),U=o<i,Oe=[];U&&Oe.push("OrderTooSmall");let ve=R.amountOut*BigInt(f),Le=this.toBlockPeriod(v),qe=R.tradeFee*BigInt(f),Gt=C.build(l),lt={assetIn:e,assetOut:t,errors:Oe,frequencyMin:T,frequencyOpt:S,frequency:v,tradeCount:f,tradeFee:qe,tradeImpactPct:R.priceImpactPct,tradePeriod:Le,tradeRoute:Gt,type:"Dca"};return{...lt,amountIn:o,amountOut:ve,tradeAmountIn:R.amountIn,tradeAmountOut:R.amountOut,toHuman(){return{...lt,amountIn:y.toDecimal(o,m),amountOut:y.toDecimal(ve,g),tradeAmountIn:y.toDecimal(R.amountIn,m),tradeAmountOut:y.toDecimal(R.amountOut,g)}}}}async getMinimumOrderBudget(e){if(0===e)return this.minOrderBudget;let t=await this.router.getSpotPrice(0,e),n=10n**BigInt(12);if(t)return this.minOrderBudget*t.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(e,t){let n=t*2n/10n;if(n===0n)return 0;let s=e+n/2n;return Number(s/n)}getOptimalTradeCount(e){let t=Math.round(e*10)||1;return Math.max(t,3)}async getTwapSellOrder(e,t,n){let[s,r]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,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),b=await this.router.getBestSell(l.assetIn,u.assetOut,P),x=g===1,f=i<s,T=b.priceImpactPct<-5,S=[];f||x?S.push("OrderTooSmall"):T&&S.push("OrderImpactTooBig");let v=b.amountOut*BigInt(g),_=b.tradeFee*BigInt(g),R=C.build(a),U={assetIn:e,assetOut:t,errors:S,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:R,type:"TwapSell"};return{...U,amountIn:i,amountOut:v,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:_,toHuman(){return{...U,amountIn:y.toDecimal(i,d),amountOut:y.toDecimal(v,p),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,p),tradeFee:y.toDecimal(_,p)}}}}async getTwapBuyOrder(e,t,n){let[s,r]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestBuy(e,t,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),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,v=[];T||f?v.push("OrderTooSmall"):S&&v.push("OrderImpactTooBig");let _=b.tradeFee*BigInt(g),R=C.build(a),U={assetIn:e,assetOut:t,errors:v,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:R,type:"TwapBuy"};return{...U,amountIn:x,amountOut:i,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:_,toHuman(){return{...U,amountIn:y.toDecimal(x,d),amountOut:y.toDecimal(i,p),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,p),tradeFee:y.toDecimal(_,d)}}}}getTwapTradeCount(e){let t=this.getOptimalTradeCount(e);if(this.getTwapExecutionTime(t)>216e5){let s=216e5/(this.blockTime*6);return Math.round(s)}return t}getTwapExecutionTime(e){return e*6*this.blockTime}toBlockPeriod(e){let t=e/this.blockTime,n=Math.round(t);return Math.max(n,6)}};var Ht={};I(Ht,{TxBuilderFactory:()=>oe});import{Enum as Nt}from"polkadot-api";function qt(c){let e=[],t=c;for(;t&&typeof t=="object"&&"type"in t;)e.push(t.type),t=t.value;return e.join(".")}var ie=class extends F{evmClient;balanceClient;aaveUtils;constructor(e,t){super(e),this.evmClient=t??new E,this.balanceClient=new q(e),this.aaveUtils=new Y(this.evmClient)}wrapTx(e,t){return{name:e,get:()=>t,dryRun:n=>this.dryRun(n,t)}}async dispatchWithExtraGas(e){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:e.decodedCall,extra_gas:Ge})}async dryRun(e,t){let n=Nt("Signed",e),s=Nt("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(s,t.decodedCall),a=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(a){let o=qt(a.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(e){return e.length===1&&e[0].pool==="Omnipool"}};var Ce=class extends ie{_trade;_beneficiary;_slippagePct=1;setTrade(e){return this._trade=e,this}withBeneficiary(e){return this._beneficiary=e,this}withSlippage(e){return this._slippagePct=e,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:e,swaps:t,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:s}=t[0],r=await this.balanceClient.getBalance(this.beneficiary,s);return e>=r-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:e,amountOut:t,swaps:n}=this.trade,s=n[0],r=n[n.length-1],i=O.getFraction(e,this.slippagePct),a=s.assetIn,o=r.assetOut,l=e+i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.buy({asset_in:a,asset_out:o,amount:t,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:a,asset_out:o,amount_out:t,max_amount_in:l,route:C.build(n)}),this.wrapTx("RouterBuy",u)}async buildSellTx(){let{amountIn:e,amountOut:t,swaps:n}=this.trade,s=n[0],r=n[n.length-1],i=O.getFraction(t,this.slippagePct),a=s.assetIn,o=r.assetOut,l=t-i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.sell({asset_in:a,asset_out:o,amount:e,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:a,asset_out:o,amount_in:e,min_amount_out:l,route:C.build(n)}),s.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("RouterSell",u)}async buildSellAllTx(){let{amountOut:e,swaps:t}=this.trade,n=t[0],s=t[t.length-1],r=O.getFraction(e,this.slippagePct),i=n.assetIn,a=s.assetOut,o=e-r,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:a,min_amount_out:o,route:C.build(t)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as ot}from"polkadot-api";var Me=class extends ie{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(e){return this._order=e,this}withBeneficiary(e){return this._beneficiary=e,this}withMaxRetries(e){return this._maxRetries=e,this}withSlippage(e){return this._slippagePct=e,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:e}=this.order;switch(e){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${e}`)}}buildDcaTx(){let{amountIn:e,assetIn:t,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:e,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:ot("Sell",{asset_in:t,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:e,assetIn:t,assetOut:n,tradeAmountIn:s,tradeAmountOut:r,tradePeriod:i,tradeRoute:a}=this.order,o=O.getFraction(r,this.slippagePct),l=r-o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:e,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:ot("Sell",{asset_in:t,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:e,assetIn:t,assetOut:n,tradeAmountIn:s,tradeAmountOut:r,tradePeriod:i,tradeRoute:a}=this.order,o=O.getFraction(s,this.slippagePct),l=s+o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:e,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:ot("Buy",{asset_in:t,asset_out:n,amount_out:r,max_amount_in:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",u)}};var oe=class{client;evmClient;constructor(e,t){this.client=e,this.evmClient=t??new E}trade(e){return new Ce(this.client,this.evmClient).setTrade(e)}order(e){return new Me(this.client,this.evmClient).setOrder(e)}};async function uc(c,e){let t=new J(c),[n,s]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),r=e??new E,i=new ne(c).withAave().withOmnipool().withStableswap().withXyk(),a=new Y(r),o=new re(i),l=new ae(o,{blockTime:n,minBudgetInNative:s});return{api:{aave:a,router:o,scheduler:l},client:{asset:new $(c),balance:new q(c),evm:r},ctx:{pool:i},tx:new oe(c,r),destroy:()=>{i.destroy()}}}export{St as aave,ct as api,y as big,wt as client,yt as const,uc as createSdkContext,K as erc20,Ot as error,gt as evm,h as fmt,Re as h160,X as json,O as math,Dt as pool,Lt as sor,Ht as tx,xt as xc};
1
+ var gn=Object.defineProperty;var T=(u,e)=>{for(var t in e)gn(u,t,{get:e[t],enumerable:!0})};var It={};T(It,{Papi:()=>F,getWs:()=>Pn});import{hydration as bn}from"@galacticcouncil/descriptors";function Tt(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var F=class{client;api;constructor(e){this.client=e,this.api=this.client.getTypedApi(bn)}log(e,...t){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Tt(n)&&console.log(e,...t)}};import{createClient as hn}from"polkadot-api";import{withPolkadotSdkCompat as yn}from"polkadot-api/polkadot-sdk-compat";var Pn=async u=>{let e=typeof u=="string"?u.split(","):u,r=(typeof window>"u"?(await import("polkadot-api/ws-provider/node")).getWsProvider:(await import("polkadot-api/ws-provider/web")).getWsProvider)(e);return hn(yn(r))};var Mt={};T(Mt,{AAVE_GAS_LIMIT:()=>$e,AAVE_LENDING_POOL_ADDRESS:()=>Ge,AAVE_POOL_ABI:()=>je,AAVE_POOL_DATA_PROVIDER:()=>Ne,AAVE_POOL_DATA_PROVIDER_ABI:()=>qe,AAVE_POOL_PROXY:()=>Qe,AAVE_ROUNDING_THRESHOLD:()=>ri,AAVE_UINT_256_MAX:()=>fn,AaveClient:()=>he,AaveUtils:()=>$});var je=[{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 qe=[{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 Qe="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Ne="0x112b087b60C1a166130d59266363C45F8aa99db0",Ge="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",$e=1000000n,ri=5,fn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var _t={};T(_t,{EvmClient:()=>C,evmMainnet:()=>Je});import{defineChain as Sn}from"viem";var vt=["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"],Ot=["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"],Je=Sn({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{public:{http:vt,webSocket:Ot},default:{http:vt,webSocket:Ot}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});import{createPublicClient as At,createWalletClient as wn,custom as xn,http as Tn,webSocket as In}from"viem";var C=class{chain;constructor(e){this.chain=e||Je}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 At({chain:this.chain,transport:Tn()})}getWsProvider(){return At({chain:this.chain,transport:In()})}getSigner(e){return wn({account:e,chain:this.chain,transport:xn(window.ethereum)})}};var he=class{evmClient;constructor(e){this.evmClient=e??new C}async getReservesData(){return await this.evmClient.getProvider().readContract({abi:qe,address:Ne,args:[Ge],functionName:"getReservesData"})}async getUserReservesData(e){return await this.evmClient.getProvider().readContract({abi:qe,address:Ne,args:[Ge,e],functionName:"getUserReservesData"})}async getUserAccountData(e){return await this.evmClient.getProvider().readContract({abi:je,address:Qe,args:[e],functionName:"getUserAccountData"})}};var y={};T(y,{asBigInt:()=>An,toBigInt:()=>On,toDecimal:()=>vn});import j from"big.js";j.NE=-18;function vn(u,e,t=6,n){let r=j(u.toString()),a=j(10).pow(e);return r.div(a).round(t,n).toString()}function On(u,e){let t=j(10).pow(e),r=j(u).mul(t).toFixed(0,j.roundDown);return BigInt(r)}function An(u){return BigInt(u.round(0,j.roundDown).toFixed(0))}var Z={};T(Z,{ERC20:()=>Ze});var Ze=class{static fromAssetId(e){let t=Buffer.alloc(20,0);return t[15]=1,t.writeUInt32BE(e,16),"0x"+t.toString("hex")}static toAssetId(e){let t=Buffer.from(e.replace("0x",""),"hex");return t.length!==20||!this.isAssetAddress(e)?null:t.readUInt32BE(16)}static isAssetAddress(e){let t=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(e.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(t.subarray(0,16))}};var P={};T(P,{fromPermill:()=>Rn,shiftNeg:()=>ye,toDecimals:()=>Fn,toPct:()=>Bn});import _n from"big.js";var Bt=1e3;function Bn(u){let[e,t]=u;return e/t*100}function Fn(u){let[e,t]=u;return e/t}function Rn(u){return[u/Bt,Bt]}function ye(u,e){let t=_n(typeof u=="bigint"?u.toString():u);return e===0?t.toString():t.div(Math.pow(10,e)).toString()}var Ve={};T(Ve,{H160:()=>at,isEvmAccount:()=>kt,isEvmAddress:()=>Et,isSs58Address:()=>Dt});import{AccountId as Pe}from"polkadot-api";import{toHex as Rt}from"@polkadot-api/utils";import{Buffer as z}from"buffer";var Ft={};T(Ft,{HUB_ASSET_ID:()=>nt,HYDRATION_OMNIPOOL_ADDRESS:()=>Dn,HYDRATION_PARACHAIN_ID:()=>En,HYDRATION_SS58_PREFIX:()=>D,PERBILL_DENOMINATOR:()=>kn,PERMILL_DENOMINATOR:()=>et,RUNTIME_DECIMALS:()=>_,SYSTEM_ASSET_DECIMALS:()=>tt,SYSTEM_ASSET_ID:()=>H,TRADEABLE_DEFAULT:()=>ee});var _=18,et=1e6,kn=1e9,H=0,tt=12,En=2034,D=63,Dn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",nt=1,ee=15;var rt="ETH\0";function kt(u){if(!u)return!1;try{let e=Pe().enc(u),t=z.from(rt);return z.from(e.subarray(0,t.length)).equals(t)}catch{return!1}}function Et(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function Dt(u){try{return Pe(63).enc(u),!0}catch{return!1}}var at=class u{static toAccount=e=>{let t=z.from(e.slice(2),"hex"),n=z.from(rt),r=Uint8Array.from(z.concat([n,t,z.alloc(8)])),a=Rt(r);return Pe(63).dec(a)};static fromAccount=e=>{let t=Pe().enc(e),n=z.from(rt),r=t.slice(n.length,-8);return"0x"+z.from(r).toString("hex")};static fromSS58=e=>{let n=Pe().enc(e).slice(0,20);return Rt(n)};static fromAny=e=>{if(Et(e))return e;if(kt(e))return u.fromAccount(e);if(Dt(e))return u.fromSS58(e);throw new Error("Unknown address type")}};var Q={};T(Q,{findNestedKey:()=>Cn,findNestedObj:()=>Mn,jsonFormatter:()=>Ln});var Cn=(u,e)=>{let t=[];return JSON.stringify(u,(n,r)=>(r&&r[e]&&t.push(r),r)),t[0]},Mn=(u,e,t)=>{let n;return JSON.stringify(u,(r,a)=>(a&&a[e]===t&&(n=a),a)),n},Ln=(u,e)=>typeof e=="bigint"?e.toString():e;var O={};T(O,{calculateBuyFee:()=>Vn,calculateDiffToAvg:()=>qn,calculateDiffToRef:()=>Nn,calculateSellFee:()=>Gn,getFraction:()=>Hn});import W from"big.js";function qn(u,e){let t=W(u.toString()),n=W(e.toString());return t.minus(n).abs().div(t.plus(n).div(2)).mul(100).round(2).toNumber()}function Nn(u,e){if(e===0n)return 0;let t=W(u.toString()),n=W(e.toString());return t.minus(n).div(n).mul(100).round(2).toNumber()}function Gn(u,e){let t=W(u.toString()),n=W(e.toString());return W(1).minus(n.div(t)).mul(100).round(2).toNumber()}function Vn(u,e){let t=W(u.toString());return W(e.toString()).div(t).minus(1).mul(100).round(2).toNumber()}function Hn(u,e,t=2){(e<.01||e>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,t),r=BigInt(e*n);return u*r/BigInt(100*n)}var Ct={};T(Ct,{convertToId:()=>Wn});import{Buffer as Un}from"buffer";function Wn(u){let t=Un.from(u.replace("0x",""),"hex").subarray(16);return t.readUIntBE(0,t.length)}var{ERC20:He}=Z,{H160:it}=Ve,Yn=1.01,Xn=99999,zn=10n**27n,Kn=10n**18n,$=class{client;constructor(e){let t=e??new C;this.client=new he(t)}async getSummary(e){let t=it.fromAny(e),[n,r,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(t),this.client.getUserAccountData(t)]),[i]=n,[s,o]=r,[l,c,d,m,p,g]=a,h=y.toDecimal(g,18),b=[];for(let f of s){let S=f.underlyingAsset.toLowerCase(),w=i.find(({underlyingAsset:K})=>K.toLowerCase()===S);if(!w)throw new Error("Missing pool reserve for "+S);let I=f.scaledATokenBalance,E=w.liquidityIndex,M=w.priceInMarketReferenceCurrency,R=I*E/zn,V=Number(o===w.eModeCategoryId?w.eModeLiquidationThreshold:w.reserveLiquidationThreshold)/1e4,X=w.usageAsCollateralEnabled&&f.usageAsCollateralEnabledOnUser&&f.scaledATokenBalance>0n,ge=He.toAssetId(S);b.push({aTokenBalance:R,decimals:Number(w.decimals),isCollateral:X,priceInRef:M,reserveId:ge,reserveAsset:S,reserveLiquidationThreshold:V})}return{healthFactor:Number(h),totalCollateral:l,totalDebt:c,reserves:b}}async hasBorrowPositions(e){let t=it.fromAny(e),n=await this.client.getUserAccountData(t),[r,a]=n;return a>0n}async getHealthFactor(e){let t=it.fromAny(e),n=await this.client.getUserAccountData(t),[r,a,i,s,o,l]=n,c=y.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(e,t,n){let{totalCollateral:r,totalDebt:a,reserves:i}=await this.getSummary(e),s=He.fromAssetId(t),o=i.find(b=>b.reserveAsset===s);if(!o)throw new Error("Missing reserve ctx for "+s);let{decimals:l,isCollateral:c,priceInRef:d,reserveLiquidationThreshold:m}=o,p=y.toBigInt(n,l),g=c?p*d/10n**BigInt(l):0n,h=r-g;return h<=0n?0:this.calculateHealthFactor(h,m,a)}async getHealthFactorAfterSupply(e,t,n){let{totalCollateral:r,totalDebt:a,reserves:i}=await this.getSummary(e),s=He.fromAssetId(t),o=i.find(h=>h.reserveAsset===s);if(!o)throw new Error("Missing reserve ctx for "+s);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:d}=o,p=y.toBigInt(n,l)*c/10n**BigInt(l),g=r+p;return g<=0n?0:this.calculateHealthFactor(g,d,a)}async getMaxWithdraw(e,t){let{totalCollateral:n,totalDebt:r,reserves:a}=await this.getSummary(e),i=He.fromAssetId(t),s=a.find(o=>o.reserveAsset===i);if(!s)throw new Error("Missing reserve ctx for "+i);return this.calculateWithdrawMax(s,n,r)}async getMaxWithdrawAll(e){let{totalCollateral:t,totalDebt:n,reserves:r}=await this.getSummary(e),a={};for(let i of r){let s=this.calculateWithdrawMax(i,t,n);i.reserveId&&(a[i.reserveId]=s)}return a}calculateHealthFactor(e,t,n){if(n===0n)return Xn;let r=10n**6n,a=y.toBigInt(t,18),i=e*a*r,s=n*Kn,o=i/s;return Number(o)/1e6}calculateRequiredCollateral(e,t,n){let r=y.toBigInt(e,18),a=y.toBigInt(t,18);return(r*n+a-1n)/a}calculateWithdrawMax(e,t,n){let{aTokenBalance:r,decimals:a,priceInRef:i,reserveLiquidationThreshold:s}=e,o=this.calculateRequiredCollateral(Yn,s,n),l=t-o;if(l<=0n)return{amount:0n,decimals:a};let c=l*10n**BigInt(a)/i;return{amount:r<c?r:c,decimals:a}}};var Vt={};T(Vt,{AssetClient:()=>te,BalanceClient:()=>L,ChainParams:()=>re,LiquidityMining:()=>ae});var te=class extends F{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(e){super(e)}async queryShares(){let t=await this.api.query.Stableswap.Pools.getEntries();return new Map(t.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async queryBonds(){let t=await this.api.query.Bonds.Bonds.getEntries();return new Map(t.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async queryAssets(){let t=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(t.filter(({value:n})=>{let{asset_type:r}=n;return this.SUPPORTED_TYPES.includes(r.type)}).map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async queryAssetLocations(){let t=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(t.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async mapToken(e,t,n,r){let{name:a,asset_type:i,is_sufficient:s,existential_deposit:o}=t,{symbol:l,decimals:c}=n.get(e)??{};return{id:e,name:a?.asText(),symbol:l,decimals:c,icon:l,type:i.type,isSufficient:s,location:r,existentialDeposit:o}}async mapBond(e,t,n,r){let[a,i]=r,{asset_type:s,is_sufficient:o,existential_deposit:l}=t,{symbol:c,decimals:d}=await this.mapToken(a,t,n),m=Number(i),p=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",p.format(m)].join(" ");return{id:e,name:g,symbol:c+"b",decimals:d,icon:c,type:s.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:a,maturity:m}}async mapShares(e,t,n,r){let{assets:a}=r,{name:i,symbol:s,asset_type:o,is_sufficient:l,existential_deposit:c}=t,d=await Promise.all(a.map(async g=>{let{symbol:h}=await this.mapToken(g,t,n);return[g,h]})),m=Object.fromEntries(d),p=Object.values(m);return{id:e,name:p.join(", "),symbol:s?.asText()||i?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:m}}async mapExternal(e,t,n,r){let a=await this.mapToken(e,t,new Map,r),i=n?.find(s=>s.internalId===a.id);return i?{...a,decimals:i.decimals,name:i.name,symbol:i.symbol,icon:i.symbol,isWhiteListed:i.isWhiteListed}:a}parseMetadata(e){return new Map(Array.from(e,([t,n])=>[t,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(e,t){let[n,r,a,i]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),s=this.parseMetadata(n),o=[];for(let[l,c]of Array.from(n)){let d=r.get(l),{asset_type:m}=c,p;switch(m.type){case"Bond":let g=i.get(l);p=await this.mapBond(l,c,s,g);break;case"StableSwap":let h=a.get(l);p=await this.mapShares(l,c,s,h);break;case"External":p=await this.mapExternal(l,c,t,d);break;default:p=await this.mapToken(l,c,s,d)}o.push(p)}return e?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(e){let t=Math.sign(e.decimals);return!!e.symbol&&(t===0||t===1)}};import{Subject as jn,bufferCount as Qn,combineLatest as $n,debounceTime as Jn,distinctUntilChanged as Lt,finalize as Zn,map as ne,pairwise as er,shareReplay as tr,startWith as nr}from"rxjs";var L=class extends F{constructor(e){super(e)}async getBalance(e,t){return t===0?this.getSystemBalance(e):this.getTokenBalanceData(e,t)}async getSystemBalance(e){let t=this.api.query.System.Account,{data:n}=await t.getValue(e);return this.calculateBalance(n)}async getTokenBalance(e,t){let r=await this.api.query.Tokens.Accounts.getValue(e,t);return this.calculateBalance(r)}calculateBalance(e){let t=e.free>=e.frozen?e.free-e.frozen:0n,n=e.free+e.reserved;return{free:e.free,reserved:e.reserved,frozen:e.frozen,total:n,transferable:t}}async getErc20Balance(e,t){return this.getTokenBalanceData(e,t)}subscribeBalance(e){let t=this.subscribeSystemBalance(e),n=this.subscribeTokensBalance(e),r=this.subscribeErc20Balance(e);return $n([t,n,r]).pipe(Jn(250),ne(a=>a.flat()),nr([]),Qn(2,1),ne(([a,i],s)=>{if(s===0)return i;let o=a.reduce((c,d)=>(c.set(d.id,d.balance),c),new Map);return i.filter(c=>!qt(c.balance,o.get(c.id)))}))}subscribeSystemBalance(e){return this.api.query.System.Account.watchValue(e,"best").pipe(ne(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(e,t){return this.api.query.Tokens.Accounts.watchValue(e,t,"best").pipe(ne(r=>({id:t,balance:r})))}subscribeTokensBalance(e){return this.api.query.Tokens.Accounts.watchEntries(e,{at:"best"}).pipe(Lt((n,r)=>!r.deltas),ne(({deltas:n})=>{let r=[];return n?.deleted.forEach(a=>{let[i,s]=a.args;r.push({id:s,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(a=>{let[i,s]=a.args;r.push({id:s,balance:this.calculateBalance(a.value)})}),r}))}subscribeErc20Balance(e,t){let n=new jn,r=n.pipe(tr(1)),a=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:c}=l;return c.type==="Erc20"}).map(({keyArgs:l})=>{let[c]=l;return c}),i=async()=>{let o=t||await a(),l=async()=>{let m=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(e,p);return[p,g]}))).map(([p,g])=>({id:p,balance:g}));n.next(m)};await l();let c=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>c.unsubscribe()},s;return i().then(o=>s=o),r.pipe(Zn(()=>s?.()),er(),ne(([o,l],c)=>{if(c===0)return l;let d=o.reduce((p,g)=>(p.set(g.id,g.balance),p),new Map);return l.filter(p=>!qt(p.balance,d.get(p.id)))}),Lt((o,l)=>l.length===0))}async getTokenBalanceData(e,t){let n=await this.api.apis.CurrenciesApi.account(t,e);return this.calculateBalance(n)}},qt=(u,e)=>u!==void 0&&e!==void 0&&u.transferable===e.transferable&&u.total===e.total;var re=class extends F{_minOrderBudget;_blockTime;constructor(e){super(e)}async getBlockTime(){if(this._blockTime===void 0){let e=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(e)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};import{AccountId as ur,Binary as dr,Enum as pr}from"polkadot-api";import{fixed_from_rational as Gt}from"@galacticcouncil/math-liquidity-mining";import k from"big.js";import x from"big.js";import{calculate_accumulated_rps as rr,calculate_global_farm_rewards as ar,calculate_loyalty_multiplier as ir,calculate_reward as sr,calculate_user_reward as Nt,calculate_yield_farm_delta_rpvs as or,calculate_yield_farm_rewards as lr}from"@galacticcouncil/math-liquidity-mining";var cr="1000000000000000000",Ue=class{constructor(e,t,n){this.get_account=e;this.multiCurrency=t;this.getAsset=n}calculate_rewards_from_pot(e,t,n){let r=x(sr(x(t.accumulated_rpz.toString()).toFixed(),x(e.accumulated_rpz.toString()).toFixed(),n.toFixed())),a={...t,accumulated_rpz:e.accumulated_rpz},i={...e,accumulated_paid_rewards:BigInt(r.plus(e.accumulated_paid_rewards.toString()).toFixed()),pending_rewards:BigInt(x(e.pending_rewards.toString()).minus(r).toFixed())};return{reward:r,mutatedYieldFarm:a,mutatedGlobalFarm:i}}async sync_global_farm(e,t,n){if(e.state.type!=="Active"||e.updated_at===t)return;if(e.total_shares_z===0n)return{global_farm:{...e,updated_at:t}};let r=t-e.updated_at,a=this.get_account(e.id),i=(await this.getAsset(e.reward_currency))?.existential_deposit;if(!i)throw new Error("Missing reward currency asset list");let s=this.multiCurrency.free_balance(e.reward_currency,a),o=x(i.toString()),l=x(s.toString()).minus(o.lt(s.toString())?i.toString():s.toString()),c=x(ar(x(e.total_shares_z.toString()).toFixed(),x(n.toString()).toFixed(),x(e.yield_per_period.toString()).mul(st).round(0,x.roundDown).toFixed(),x(e.max_reward_per_period.toString()).toFixed(),r.toFixed()));l.lt(c)&&(c=l);let d={...e};if(!c.eq(0)){let m=this.get_account(0);this.multiCurrency.transfer(e.reward_currency,a,m,BigInt(c.toFixed())),d.accumulated_rpz=BigInt(x(rr(x(e.accumulated_rpz.toString()).toFixed(),x(e.total_shares_z.toString()).toFixed(),c.toFixed())).toFixed()),d.pending_rewards=BigInt(c.plus(e.pending_rewards.toString()).toFixed())}return d.updated_at=t,{reward:c,global_farm:d}}sync_yield_farm(e,t,n){if(e.state.type!=="Active"||e.updated_at===n)return;if(e.total_valued_shares===0n)return{yield_farm:{...e,accumulated_rpz:t.accumulated_rpz,updated_at:n}};let r=lr(x(e.accumulated_rpz.toString()).toFixed(),x(t.accumulated_rpz.toString()).toFixed(),x(e.multiplier.toString()).toFixed(),x(e.total_valued_shares.toString()).toFixed()),a=or(x(e.accumulated_rpz.toString()).toFixed(),x(t.accumulated_rpz.toString()).toFixed(),x(e.multiplier.toString()).toFixed(),x(e.total_valued_shares.toString()).toFixed()),i=BigInt(x(r).toFixed()),s={...e,accumulated_rpz:t.accumulated_rpz,accumulated_rpvs:e.accumulated_rpvs+BigInt(x(a).toFixed()),updated_at:n,left_to_distribute:e.left_to_distribute+i},o={...t,accumulated_paid_rewards:t.accumulated_paid_rewards+i,pending_rewards:t.pending_rewards-i};return{yield_farm:s,global_farm:o}}get_loyalty_multiplier(e,t){let n=x(1).mul(st).round(0,x.roundDown).toString();if(t){let{initial_reward_percentage:r,scale_coef:a}=t;n=ir(e.toFixed(),x(r.toString()).toFixed(),x(a.toString()).toFixed())}return n}async claim_rewards(e,t,n,r,a){if(t.state.type==="Terminated")return null;let i=Math.floor(r/e.blocks_per_period);if(x(n.updated_at).eq(i))return null;let s=await this.sync_global_farm(e,i,a);if(!s)return null;let o=this.sync_yield_farm(t,s.global_farm,i);if(!o?.global_farm)return null;let{yield_farm:l,global_farm:c}=o,d=x(l.total_stopped).minus(n.stopped_at_creation),m=x(l.updated_at).minus(n.entered_at).minus(d),p=this.get_loyalty_multiplier(m,l.loyalty_curve),g=x(Nt(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),l.accumulated_rpvs.toString(),p)),h=x(Nt(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),l.accumulated_rpvs.toString(),cr));return g.eq(0)||(l.left_to_distribute=l.left_to_distribute-BigInt(g.toFixed())),{reward:g,maxReward:h,assetId:c.reward_currency}}};var mr=BigInt(k(1).pow(18).toString()),gr=6,ae=class extends F{balanceClient;omnipoolAssetIds=[];secondsInYear=k(365.2425).times(24).times(60).times(60);constructor(e){super(e),this.balanceClient=new L(e)}async getOraclePrice(e,t){let n=[e,t].sort((a,i)=>a-i);if(e===t)return mr;let r=await this.api.query.EmaOracle.Oracles.getValue(dr.fromText("omnipool"),n,pr("TenMinutes"));if(r){let{n:a,d:i}=r[0].price,s;return e<t?s=Gt(a.toString(),i.toString()):s=Gt(i.toString(),a.toString()),BigInt(s)}}getFarmAddress=(e,t)=>{let n=Buffer.from("modl","utf-8"),r=Buffer.from(t?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),a=Buffer.from([e]),i=Buffer.concat([n,r,a]),o="0x"+Buffer.concat([i,Buffer.alloc(32-i.length)]).toString("hex");return ur(63).dec(o)};getGlobalRewardPerPeriod(e,t,n,r){let a=k(r).times(e.toString()).times(t.toString()).div(18);return a.gte(n.toString())?n.toString():a.toString()}getPoolYieldPerPeriod(e,t,n,r){let a=k(e.toString()).times(t),i=k(n.toString()).times(r);return a.div(i.toString()).toString()}farmData(e,t,n){let{yieldFarm:r,globalFarm:a,priceAdjustment:i,balance:s}=e,{multiplier:o,loyalty_curve:l}=r,{blocks_per_period:c,yield_per_period:d,total_shares_z:m,max_reward_per_period:p,pending_rewards:g,accumulated_paid_rewards:h,planned_yielding_periods:b,updated_at:f,incentivized_asset:S,reward_currency:w,price_adjustment:I}=a,E=ye(i??I,18),M=ye(o,18),R=ye(l?.initial_reward_percentage??0,18),G=this.secondsInYear.div(k(gr).times(c)).toString(),V;if(m<0)V=k(M).times(d.toString()).times(G).toString();else{let pn=this.getGlobalRewardPerPeriod(m,d,p,E),mn=this.getPoolYieldPerPeriod(pn,M,m,E);V=k(mn).times(G).toString()}let X=g+h,ge=p*BigInt(b),K=s.transferable+X,Ke=K-X,be=k(Ke.toString()).div(p.toString()),wt=k(t).div(c.toString()).toString(),cn=(m>=0?be.plus(f):be.plus(wt)).toString(),un=k(m.toString()).div(k(p.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(E).toFixed(2),xt=k(X.toString()).div(K.toString()).gte(.999);V=xt?"0":k(V).div(n?2:1).times(100).toString();let dn=R?k(V).times(R).toString():void 0;return{apr:V,minApr:dn,isDistributed:xt,estimatedEndPeriod:cn,maxRewards:ge,incentivizedAsset:S,rewardCurrency:w,loyaltyCurve:l,currentPeriod:wt,potMaxRewards:K,fullness:un}}async getOmnipoolFarms(e){let t=await this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(Number(e)),r=(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number,a=await Promise.all(t.map(async({keyArgs:i,value:s})=>{let[,o]=i,l=s,c=await this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(o),d=await this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(Number(e),o,l);if(!c||!d)return;let m=c.reward_currency,p=c.incentivized_asset,g=this.getFarmAddress(o),h=await this.getOraclePrice(m,p),b=await this.balanceClient.getTokenBalance(g,m);return{id:e,globalFarm:c,yieldFarm:d,priceAdjustment:h,balance:b}}));return r?a.map(i=>i?this.farmData(i,r):void 0):[]}async getIsolatedFarms(e){let t=await this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(e),r=(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number,a=await Promise.all(t.map(async({keyArgs:i,value:s})=>{let[,o]=i,l=s,c=await this.api.query.XYKWarehouseLM.GlobalFarm.getValue(o),d=await this.api.query.XYKWarehouseLM.YieldFarm.getValue(e,o,l);if(!c||!d)return;let m=c.reward_currency,p=c.incentivized_asset,g=this.getFarmAddress(o,!0),h=await this.getOraclePrice(m,p),b=await this.balanceClient.getBalance(g,m);return{id:e,globalFarm:c,yieldFarm:d,priceAdjustment:h,balance:b,farmAddress:g}}));return r?a.map(i=>i?this.farmData(i,r,!0):void 0):[]}async getDepositReward(e,t,n,r){let a=t.global_farm_id,i=t.yield_farm_id,s=n?await this.api.query.XYKWarehouseLM.YieldFarm.getValue(e,a,i):await this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(Number(e),a,i),o=n?await this.api.query.XYKWarehouseLM.GlobalFarm.getValue(a):await this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(a);if(!o||!s)return;let l=o.reward_currency,c=o.incentivized_asset,d=[[this.getFarmAddress(0,n),o.reward_currency],[this.getFarmAddress(o.id,n),o.reward_currency]],m=await br(this.api,d)(),p=await this.getOraclePrice(l,c),g=new lt(d,m),b=await new Ue(S=>this.getFarmAddress(S),g,S=>this.api.query.AssetRegistry.Assets.getValue(S)).claim_rewards(o,s,t,r,p??o.price_adjustment);if(!b)return;let f=await this.api.query.AssetRegistry.Assets.getValue(b.assetId);if(f&&!b.reward.lte(f.existential_deposit.toString()))return b}},st=k(10).pow(18),ot="0",br=(u,e)=>async()=>{let[t,n]=await Promise.all([u.query.Tokens.Accounts.getValues(e.filter(([a,i])=>i.toString()!==ot)),u.query.System.Account.getValues(e.filter(([a,i])=>i.toString()===ot).map(([a])=>[a]))]),r=[];for(let a=0,i=0;a+i<e.length;){let s=a+i,[,o]=e[s];o.toString()===ot?(r.push({assetId:o.toString(),free:n[i].data.free,reserved:n[i].data.reserved,frozen:n[i].data.frozen}),i+=1):(r.push({assetId:o.toString(),free:t[a].free,reserved:t[a].reserved,frozen:t[a].frozen}),a+=1)}return r},lt=class{result=new Map;getKey(e,t){return[t,e.toString()].join(",")}constructor(e,t){for(let n=0;n<e.length;++n){let[r,a]=e[n];this.result.set(this.getKey(a,r),t[n].free)}}free_balance(e,t){return this.result.get(this.getKey(e,t))??0n}transfer(e,t,n,r){let a=this.getKey(e,t),i=this.getKey(e,n),s=this.result.get(a)??0n,o=this.result.get(i)??0n;if(s<r)throw new Error("Attempting to transfer more than is present");this.result.set(a,s+r),this.result.set(i,o+r)}};var Ht={};T(Ht,{AssetNotFound:()=>ct,PoolNotFound:()=>fe,RouteNotFound:()=>Se});var ct=class extends Error{constructor(e){super(),this.message=`${e} not found`,this.name="AssetNotFound"}},fe=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},Se=class extends Error{constructor(e,t){super(),this.message=`Route from ${e} to ${t} not found in current configuration`,this.name="RouteNotFound"}};var Qt={};T(Qt,{PoolContextProvider:()=>oe,PoolError:()=>J,PoolFactory:()=>se,PoolType:()=>A,aave:()=>gt,lbp:()=>ut,omni:()=>dt,stable:()=>pt,xyk:()=>mt});var ut={};T(ut,{LbpMath:()=>U,LbpPool:()=>we,LbpPoolClient:()=>xe});import{calculate_in_given_out as hr,calculate_out_given_in as yr,calculate_linear_weights as Pr,calculate_pool_trade_fee as fr,get_spot_price as Sr}from"@galacticcouncil/math-lbp";var U=class{static getSpotPrice(e,t,n,r,a){return Sr(e,t,n,r,a)}static calculateInGivenOut(e,t,n,r,a){return hr(e,t,n,r,a)}static calculateOutGivenIn(e,t,n,r,a){return yr(e,t,n,r,a)}static calculateLinearWeights(e,t,n,r,a){return Pr(e,t,n,r,a)}static calculatePoolTradeFee(e,t,n){return fr(e,t,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 we=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(e){return new u(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.fee,e.repayFeeApply)}constructor(e,t,n,r,a,i,s){this.type="LBP",this.address=e,this.tokens=t,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.fee=i,this.repayFeeApply=s}validatePair(e,t){return!0}parsePair(e,t){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(e),a=n.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:e,assetOut:t,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,weightIn:r.weight,weightOut:a.weight}}validateAndBuy(e,t,n){let r=this.tokens[0].id,a=[];t<this.minTradingLimit&&a.push("InsufficientTradingAmount");let i=e.balanceOut/this.maxOutRatio;if(t>i&&a.push("MaxOutRatioExceeded"),r===e.assetOut){let s=this.calculateTradeFee(t,n),o=P.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=t+s,c=this.calculateInGivenOut(e,l),d=e.balanceIn/this.maxInRatio;return c>d&&a.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:t,feePct:o,errors:a}}else{let s=this.calculateInGivenOut(e,t),o=e.balanceIn/this.maxInRatio;return s>o&&a.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:s,amountOut:t,feePct:0,errors:a}}}validateAndSell(e,t,n){let r=this.tokens[0].id,a=[];t<this.minTradingLimit&&a.push("InsufficientTradingAmount");let i=e.balanceIn/this.maxInRatio;if(t>i&&a.push("MaxInRatioExceeded"),r===e.assetIn){let s=this.calculateOutGivenIn(e,t),o=e.balanceOut/this.maxOutRatio;return s>o&&a.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:s,feePct:0,errors:a}}else{let s=this.calculateOutGivenIn(e,t),o=this.calculateTradeFee(s,n),l=P.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=s-o,d=e.balanceOut/this.maxOutRatio;return c>d&&a.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:c,feePct:l,errors:a}}}calculateInGivenOut(e,t){let n=U.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(e,t){let n=U.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(e){let t=U.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),this.maxOutRatio.toString());return BigInt(t)}spotPriceOutGivenIn(e){let t=U.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),this.maxInRatio.toString());return BigInt(t)}calculateTradeFee(e,t){let n=U.calculatePoolTradeFee(e.toString(),this.repayFeeApply?t.repayFee[0]:t.exchangeFee[0],this.repayFeeApply?t.repayFee[1]:t.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Ar}from"polkadot-api";import{map as _r,of as zt,switchMap as Br}from"rxjs";import{memoize1 as wr}from"@thi.ng/memoize";import{combineLatest as Ut,combineLatestAll as xr,debounceTime as Tr,firstValueFrom as Ir,from as Wt,map as Yt,mergeAll as vr,of as Or,switchMap as Xt}from"rxjs";var q=class extends L{override=[];mem=0;memPools=wr(e=>(this.log(this.getPoolType(),"mem pools",e,"\u2705"),this.loadPools()));constructor(e){super(e)}async withOverride(e){this.override=e||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let e=Wt(this.getPoolsMem()).pipe(Xt(t=>this.subscribe(t)),xr());return Ir(e)}getSubscriber(){return Wt(this.getPoolsMem()).pipe(Xt(e=>this.subscribe(e)),vr())}subscribe(e){return e.filter(t=>this.hasValidAssets(t)).map(t=>Ut([this.subscribePoolChange(t),this.subscribePoolBalance(t)]).pipe(Tr(250),Yt(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(e){if(e.type==="Aave")return Or([]);let t=[this.subscribeTokensBalance(e.address)];if(this.hasSystemAsset(e)){let n=this.subscribeSystemBalance(e.address);t.push(n)}if(this.hasErc20Asset(e)){let n=e.tokens.filter(a=>a.type==="Erc20").map(a=>a.id),r=this.subscribeErc20Balance(e.address,n);t.push(r)}return Ut(t).pipe(Yt(n=>n.map(r=>Array.isArray(r)?r:[r]).flat()))}hasSystemAsset(e){return e.tokens.some(t=>t.id===0)}hasErc20Asset(e){return e.tokens.some(t=>t.type==="Erc20")}hasValidAssets(e){return e.tokens.every(({id:t,decimals:n,balance:r})=>{let a=this.override.find(s=>s.id===t),i=!!n||!!a?.decimals;return r>0n&&i})}updatePool=(e,t)=>{let n=e.tokens.map(r=>{let a=t.find(s=>s.id===r.id),i=this.override.find(s=>s.id===r.id);return a?{...r,balance:a.balance.transferable,decimals:r.decimals||i?.decimals}:{...r,decimals:r.decimals||i?.decimals}});return{...e,tokens:n}}};var xe=class extends q{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);async loadPools(){let[e,t,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),r=t?.relay_parent_number||0,a=e.filter(({value:i})=>t&&this.isActivePool(i,r)).map(async({keyArgs:i,value:s})=>{let[o]=i,l=o.toString(),c=await this.getPoolDelta(l,s,r);return{address:l,type:"LBP",fee:s.fee,...c,...n}});return Promise.all(a)}async getPoolDelta(e,t,n){let{start:r,end:a,assets:i,initial_weight:s,final_weight:o,repay_target:l,fee_collector:c}=t,d=U.calculateLinearWeights(r?r.toString():"0",a?a.toString():"0",s.toString(),o.toString(),n.toString()),[m,p]=i,g=BigInt(d),h=this.MAX_FINAL_WEIGHT-BigInt(g),[b,f,S,w,I]=await Promise.all([this.isRepayFeeApplied(m,l,c.toString()),this.getBalance(e,m),this.api.query.AssetRegistry.Assets.getValue(m),this.getBalance(e,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:b,tokens:[{id:m,decimals:S?.decimals,existentialDeposit:S?.existential_deposit,balance:f.transferable,weight:g,type:S?.asset_type.type},{id:p,decimals:I?.decimals,existentialDeposit:I?.existential_deposit,balance:w.transferable,weight:h,type:I?.asset_type.type}]}}isActivePool(e,t){let{start:n,end:r}=e;return n&&r?t>=n&&t<r:!1}async isRepayFeeApplied(e,t,n){if(t===0n)return!1;try{return(await this.getBalance(n,e)).transferable<t}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolLimits(){let[e,t,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:e,maxOutRatio:t,minTradingLimit:n}}async getPoolFees(e){return{repayFee:await this.getRepayFee(),exchangeFee:e.fee}}getPoolType(){return"LBP"}async isSupported(){let e=this.api.query.LBP.PoolData,t=await this.api.compatibilityToken;return e.isCompatible(Ar.BackwardsCompatible,t)}subscribePoolChange(e){let t=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(e.address);return n?t.watchValue("best").pipe(Br(r=>r?this.getPoolDelta(e.address,n,r.relay_parent_number):zt(e)),_r(r=>Object.assign({},e,r))):zt(e)}};var dt={};T(dt,{OmniMath:()=>v,OmniPool:()=>Te,OmniPoolClient:()=>Ie});import{calculate_in_given_out as Fr,calculate_lrna_in_given_out as Rr,calculate_out_given_in as kr,calculate_out_given_lrna_in as Er,calculate_spot_price as Dr,calculate_lrna_spot_price as Cr,calculate_shares as Mr,calculate_liquidity_out as Lr,calculate_liquidity_lrna_out as qr,verify_asset_cap as Nr,calculate_liquidity_hub_in as Gr,is_sell_allowed as Vr,is_buy_allowed as Hr,is_add_liquidity_allowed as Ur,is_remove_liquidity_allowed as Wr}from"@galacticcouncil/math-omnipool";import ie from"big.js";var v=class{static calculateSpotPrice(e,t,n,r){return Dr(e,t,n,r)}static calculateLrnaSpotPrice(e,t){return Cr(e,t)}static calculateInGivenOut(e,t,n,r,a,i,s,o,l){return Fr(e,t,n,r,a,i,s,o,l)}static calculateLrnaInGivenOut(e,t,n,r,a){return Rr(e,t,n,r,a)}static calculateOutGivenIn(e,t,n,r,a,i,s,o,l){return kr(e,t,n,r,a,i,s,o,l)}static calculateOutGivenLrnaIn(e,t,n,r,a){return Er(e,t,n,r,a)}static calculateShares(e,t,n,r){return Mr(e,t,n,r)}static calculateLiquidityOut(e,t,n,r,a,i,s,o){return Lr(e,t,n,r,a,i,s,o)}static calculateLiquidityLRNAOut(e,t,n,r,a,i,s,o){return qr(e,t,n,r,a,i,s,o)}static calculateCapDifference(e,t,n,r){let a=ie(t),i=ie(e),s=ie(r),o=ie(n),l=ie(10).pow(18),c=o.div(l);if(a.div(s).lt(c)){let m=c.times(s).minus(a).times(i),p=a.times(ie(1).minus(c));return m.div(p).toFixed(0)}else return"0"}static verifyAssetCap(e,t,n,r){return Nr(e,t,n,r)}static calculateLimitHubIn(e,t,n,r){return Gr(e,t,n,r)}static isSellAllowed(e){return Vr(e)}static isBuyAllowed(e){return Hr(e)}static isAddLiquidityAllowed(e){return Ur(e)}static isRemoveLiquidityAllowed(e){return Wr(e)}};var Te=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(e){return new u(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.hubAssetId)}constructor(e,t,n,r,a,i){this.type="Omnipool",this.address=e,this.tokens=t,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.hubAssetId=i}validatePair(e,t){return this.hubAssetId!=t}parsePair(e,t){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(e),a=n.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:e,assetOut:t,hubReservesIn:r.hubReserves,hubReservesOut:a.hubReserves,sharesIn:r.shares,sharesOut:a.shares,decimalsIn:r.decimals,decimalsOut:a.decimals,balanceIn:r.balance,balanceOut:a.balance,tradeableIn:r.tradeable,tradeableOut:a.tradeable,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(e,t,n){let r=this.calculateInGivenOut(e,t),a=this.calculateInGivenOut(e,t,n),i=r===0n?0:O.calculateDiffToRef(a,r),s=[],o=v.isSellAllowed(e.tradeableIn),l=v.isBuyAllowed(e.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(t<this.minTradingLimit||r<e.assetInEd)&&s.push("InsufficientTradingAmount");let c=e.balanceOut/this.maxOutRatio;t>c&&s.push("MaxOutRatioExceeded");let d=e.balanceIn/this.maxInRatio;return a>d&&s.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:r,amountOut:t,feePct:i,errors:s}}validateAndSell(e,t,n){let r=this.calculateOutGivenIn(e,t),a=this.calculateOutGivenIn(e,t,n),i=O.calculateDiffToRef(r,a),s=[],o=v.isSellAllowed(e.tradeableIn),l=v.isBuyAllowed(e.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(t<this.minTradingLimit||r<e.assetOutEd)&&s.push("InsufficientTradingAmount");let c=e.balanceIn/this.maxInRatio;t>c&&s.push("MaxInRatioExceeded");let d=e.balanceOut/this.maxOutRatio;return a>d&&s.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:r,amountOut:a,feePct:i,errors:s}}calculateInGivenOut(e,t,n){if(e.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(e,t,n);let r=v.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toString(),n?P.toDecimals(n.assetFee).toString():"0",n?P.toDecimals(n.protocolFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateLrnaInGivenOut(e,t,n){let r=v.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toString(),n?P.toDecimals(n.assetFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateOutGivenIn(e,t,n){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,n);let r=v.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toString(),n?P.toDecimals(n.assetFee).toString():"0",n?P.toDecimals(n.protocolFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateOutGivenLrnaIn(e,t,n){let r=v.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toString(),n?P.toDecimals(n.assetFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=v.calculateSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString(),e.balanceIn.toString(),e.hubReservesIn.toString()),n=Math.pow(10,18-e.decimalsOut);return BigInt(t)/BigInt(n)}spotPriceLrnaInGivenOut(e){let t=v.calculateLrnaSpotPrice(e.hubReservesOut.toString(),e.balanceOut.toString()),n=Math.pow(10,18-e.decimalsOut);return BigInt(t)/BigInt(n)}spotPriceOutGivenIn(e){if(e.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(e);let t=v.calculateSpotPrice(e.balanceIn.toString(),e.hubReservesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString()),n=Math.pow(10,18-e.decimalsIn);return BigInt(t)/BigInt(n)}spotPriceOutGivenLrnaIn(e){let t=v.calculateLrnaSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString()),n=Math.pow(10,18-e.decimalsIn);return BigInt(t)/BigInt(n)}};import{AccountId as Yr,CompatibilityLevel as Xr}from"polkadot-api";import{toHex as zr}from"@polkadot-api/utils";import{distinctUntilChanged as Kr,map as Kt}from"rxjs";var Ie=class extends q{async loadPools(){let e=await this.api.constants.Omnipool.HubAssetId(),t=this.getPoolAddress(),[n,r,a,i,s]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(e),this.getBalance(t,e),this.getPoolLimits()]),o=n.map(async({keyArgs:c,value:d})=>{let[m]=c,{hub_reserve:p,shares:g,tradable:h,cap:b,protocol_shares:f}=d,[S,w]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(m),this.getBalance(t,m)]);return{id:m,decimals:S?.decimals,existentialDeposit:S?.existential_deposit,balance:w.transferable,cap:b,hubReserves:p,protocolShares:f,shares:g,tradeable:h,type:S?.asset_type.type}}),l=await Promise.all(o);return l.push({id:e,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:i.transferable,tradeable:r,type:a?.asset_type.type}),[{address:t,type:"Omnipool",hubAssetId:e,tokens:l,...s}]}getPoolAddress(){let e="modlomnipool".padEnd(32,"\0"),t=new TextEncoder().encode(e),n=zr(t);return Yr(63).dec(n)}async getPoolLimits(){let[e,t,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:e,maxOutRatio:t,minTradingLimit:n}}async getPoolFees(e,t){let[n,r,a]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(t)]),i=n.min_fee+r.min_fee,s=n.max_fee+r.max_fee;if(a){let{asset_fee:o,protocol_fee:l}=a;return{assetFee:P.fromPermill(o),protocolFee:P.fromPermill(l),min:P.fromPermill(i),max:P.fromPermill(s)}}else return{assetFee:P.fromPermill(n.min_fee),protocolFee:P.fromPermill(r.min_fee),min:P.fromPermill(i),max:P.fromPermill(s)}}getPoolType(){return"Omnipool"}async isSupported(){let e=this.api.query.Omnipool.Assets,t=await this.api.compatibilityToken;return e.isCompatible(Xr.BackwardsCompatible,t)}subscribePoolChange(e){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(Kr((n,r)=>!r.deltas),Kt(({entries:n})=>n.map(r=>{let[a]=r.args,{hub_reserve:i,shares:s,tradable:o,cap:l,protocol_shares:c}=r.value,d=e.tokens.findIndex(p=>p.id===a);return{...e.tokens[d],cap:l,hubReserves:i,protocolShares:c,shares:s,tradeable:o}})),Kt(n=>{let r=e.tokens.find(a=>a.id===1);return{...e,tokens:[...n,r]}}))}};var pt={};T(pt,{StableMath:()=>B,StableSwap:()=>ve,StableSwapClient:()=>Oe});import{calculate_in_given_out as jr,calculate_out_given_in as Qr,calculate_amplification as $r,calculate_add_one_asset as Jr,calculate_liquidity_out_one_asset as Zr,calculate_shares as ea,calculate_shares_for_amount as ta,calculate_spot_price_with_fee as na,pool_account_name as ra,recalculate_peg as aa}from"@galacticcouncil/math-stableswap";var B=class{static getPoolAddress(e){return ra(e)}static defaultPegs(e){let t=[];for(let n=0;n<e;n++)t.push(["1","1"]);return t}static calculateAmplification(e,t,n,r,a){return $r(e,t,n,r,a)}static calculateInGivenOut(e,t,n,r,a,i,s){return jr(e,t,n,r,a,i,s)}static calculateAddOneAsset(e,t,n,r,a,i,s){return Jr(e,t,n,r,a,i,s)}static calculateSharesForAmount(e,t,n,r,a,i,s){return ta(e,t,n,r,a,i,s)}static calculateOutGivenIn(e,t,n,r,a,i,s){return Qr(e,t,n,r,a,i,s)}static calculateLiquidityOutOneAsset(e,t,n,r,a,i,s){return Zr(e,t,n,r,a,i,s)}static calculateShares(e,t,n,r,a,i){return ea(e,t,n,r,a,i)}static calculateSpotPriceWithFee(e,t,n,r,a,i,s,o){return na(e,t,n,r,a,i,s,o)}static recalculatePegs(e,t,n,r,a){let i=aa(e,t,n,r,a);return JSON.parse(i)}};var ve=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(e){return new u(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.amplification,e.id,e.fee,e.totalIssuance)}constructor(e,t,n,r,a,i,s,o,l){this.type="Stableswap",this.address=e,this.tokens=t,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.amplification=i,this.id=s,this.fee=o,this.totalIssuance=l}validatePair(e,t){return!0}parsePair(e,t){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(e),a=n.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:e,assetOut:t,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,tradeableIn:this.id===e?15:r.tradeable,tradeableOut:this.id===t?15:a.tradeable,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(e,t,n){let r=this.calculateInGivenOut(e,t),a=this.calculateInGivenOut(e,t,n),i=P.toPct(n.fee),s=[],o=v.isSellAllowed(e.tradeableIn),l=v.isBuyAllowed(e.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(t<this.minTradingLimit||r<e.assetInEd)&&s.push("InsufficientTradingAmount"),{amountIn:a,calculatedIn:r,amountOut:t,feePct:i,errors:s}}validateAndSell(e,t,n){let r=this.calculateOutGivenIn(e,t),a=this.calculateOutGivenIn(e,t,n),i=P.toPct(n.fee),s=[],o=v.isSellAllowed(e.tradeableIn),l=v.isBuyAllowed(e.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(t<this.minTradingLimit||r<e.assetOutEd)&&s.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:r,amountOut:a,feePct:i,errors:s}}calculateIn(e,t,n){let r=B.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toString(),this.amplification.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateAddOneAsset(e,t,n){let r=B.calculateAddOneAsset(this.getReserves(),t.toString(),Number(e.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateSharesForAmount(e,t,n){let r=B.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateInGivenOut(e,t,n){return e.assetOut==this.id?this.calculateAddOneAsset(e,t,n):e.assetIn==this.id?this.calculateSharesForAmount(e,t,n):this.calculateIn(e,t,n)}spotPriceInGivenOut(e){let t=B.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),e.assetOut.toString(),e.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(e.assetOut==this.id)return BigInt(t);if(e.assetIn==this.id){let r=Math.pow(10,e.decimalsIn-e.decimalsOut);return BigInt(t)/BigInt(r)}let n=Math.pow(10,18-e.decimalsIn);return BigInt(t)/BigInt(n)}calculateOut(e,t,n){let r=B.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toString(),this.amplification.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateWithdrawOneAsset(e,t,n){let r=B.calculateLiquidityOutOneAsset(this.getReserves(),t.toString(),Number(e.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateShares(e,t,n){let r=B.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification.toString(),this.totalIssuance.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateOutGivenIn(e,t,n){return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t,n):e.assetOut==this.id?this.calculateShares(e,t,n):this.calculateOut(e,t,n)}spotPriceOutGivenIn(e){let t=B.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),e.assetIn.toString(),e.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(e.assetIn==this.id)return BigInt(t);if(e.assetOut==this.id){let r=Math.pow(10,e.decimalsOut-e.decimalsIn);return BigInt(t)/BigInt(r)}let n=Math.pow(10,18-e.decimalsOut);return BigInt(t)/BigInt(n)}getPegs(){let e=B.defaultPegs(this.tokens.length-1);return JSON.stringify(e)}getReserves(){let e=this.tokens.filter(t=>t.id!=this.id).map(({id:t,balance:n,decimals:r})=>({asset_id:t,amount:n,decimals:r}));return JSON.stringify(e,Q.jsonFormatter)}getAssets(e,t){let n={asset_id:Number(e),amount:t.toString()};return JSON.stringify([n],Q.jsonFormatter)}};import{AccountId as ia,CompatibilityLevel as sa}from"polkadot-api";import{toHex as oa}from"@polkadot-api/utils";import{blake2b as la}from"@noble/hashes/blake2b";import{map as ca,of as ua,switchMap as da}from"rxjs";var pa=340282366920938463463374607431768211455n,Oe=class extends q{poolsData=new Map([]);async loadPools(){let[e,t,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),r=e.map(async({keyArgs:a,value:i})=>{let[s]=a,o=this.getPoolAddress(s),[l,c,d]=await Promise.all([this.getPoolDelta(s,i,t),this.getPoolTokens(s,i),this.getPoolPegs(s,i,t)]);return this.poolsData.set(o,i),{address:o,id:s,type:"Stableswap",fee:P.fromPermill(i.fee),tokens:c,...l,...d,...n}});return Promise.all(r)}async getPoolDelta(e,t,n){let{initial_amplification:r,final_amplification:a,initial_block:i,final_block:s}=t,o=B.calculateAmplification(r.toString(),a.toString(),i.toString(),s.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(e);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(e,t){let n=this.getPoolAddress(e),r=t.assets.map(async s=>{let[o,l,c]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(e,s),this.api.query.AssetRegistry.Assets.getValue(s),this.getBalance(n,s)]);return{id:s,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:c.transferable,tradeable:o,type:l?.asset_type.type}}),a=await Promise.all(r),i=await this.api.query.AssetRegistry.Assets.getValue(e);return a.push({id:e,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:pa,tradeable:15,type:i?.asset_type.type}),a}async getPoolPegs(e,t,n){let r=await this.api.query.Stableswap.PoolPegs.getValue(e);if(!r)return this.getDefaultPegs(t);let a=await this.getLatestPegs(t,r,n),i=this.getRecentPegs(r),s=P.fromPermill(r.max_peg_update),o=P.fromPermill(t.fee),[l,c]=B.recalculatePegs(JSON.stringify(i),JSON.stringify(a),n.toString(),P.toDecimals(s).toString(),P.toDecimals(o).toString()),d=Number(l)*1e6;return{pegsFee:P.fromPermill(d),pegs:c}}getDefaultPegs(e){let t=e.fee,n=B.defaultPegs(e.assets.length);return{pegsFee:P.fromPermill(t),pegs:n}}getRecentPegs(e){let{current:t}=e;return Array.from(t.entries()).map(([n,r])=>r.map(a=>a.toString()))}async getLatestPegs(e,t,n){let{source:r}=t,a=Array.from(e.assets.entries()).map(([s,o])=>o),i=r.map(async(s,o)=>{if(s.type==="Oracle"){let[l,c,d]=s.value,m=[d,a[o]].sort((S,w)=>S-w),p=await this.api.query.EmaOracle.Oracles.getValue(l,m,c);if(!p)return;let[{price:g,updated_at:h}]=p,b=g.n.toString(),f=g.d.toString();return d.toString()===m[0].toString()?[[b,f],h.toString()]:[[f,b],h.toString()]}else return[s.value.map(l=>l.toString()),n]});return Promise.all(i)}getPoolAddress(e){let t=B.getPoolAddress(e),n=la(t,{dkLen:32}),r=oa(n);return ia(63).dec(r)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolFees(e){return{fee:e.fee}}getPoolType(){return"Stableswap"}async isSupported(){let e=this.api.query.Stableswap.Pools,t=await this.api.compatibilityToken;return e.isCompatible(sa.BackwardsCompatible,t)}subscribePoolChange(e){let t=this.api.query.System.Number,n=this.poolsData.get(e.address);return!n||!e.id?ua(e):t.watchValue("best").pipe(da(r=>this.getPoolDelta(e.id,n,r)),ca(r=>Object.assign({},e,r)))}};var mt={};T(mt,{XykMath:()=>Y,XykPool:()=>Ae,XykPoolClient:()=>_e});import{calculate_in_given_out as ma,calculate_out_given_in as ga,calculate_pool_trade_fee as ba,get_spot_price as ha,calculate_liquidity_in as ya,calculate_shares as Pa,calculate_spot_price as fa,calculate_spot_price_with_fee as Sa,calculate_liquidity_out_asset_a as wa,calculate_liquidity_out_asset_b as xa}from"@galacticcouncil/math-xyk";var Y=class{static getSpotPrice(e,t,n){return ha(e,t,n)}static calculateInGivenOut(e,t,n){return ma(e,t,n)}static calculateOutGivenIn(e,t,n){return ga(e,t,n)}static calculatePoolTradeFee(e,t,n){return ba(e,t,n)}static calculateLiquidityIn(e,t,n){return ya(e,t,n)}static calculateSpotPrice(e,t){return fa(e,t)}static calculateSpotPriceWithFee(e,t,n,r){return Sa(e,t,n,r)}static calculateShares(e,t,n){return Pa(e,t,n)}static calculateLiquidityOutAssetA(e,t,n,r){return wa(e,t,n,r)}static calculateLiquidityOutAssetB(e,t,n,r){return xa(e,t,n,r)}};var Ae=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new u(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit)}constructor(e,t,n,r,a){this.type="XYK",this.address=e,this.tokens=t,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a}validatePair(e,t){return!0}parsePair(e,t){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(e),a=n.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:e,assetOut:t,decimalsIn:r.decimals,decimalsOut:a.decimals,balanceIn:r.balance,balanceOut:a.balance,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(e,t,n){let r=this.calculateInGivenOut(e,t),a=this.calculateTradeFee(r,n),i=P.toPct(n.exchangeFee),s=r+a,o=[];(t<this.minTradingLimit||r<e.assetInEd)&&o.push("InsufficientTradingAmount");let l=e.balanceOut/this.maxOutRatio;t>l&&o.push("MaxOutRatioExceeded");let c=e.balanceIn/this.maxInRatio;return s>c&&o.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:r,amountOut:t,feePct:i,errors:o}}validateAndSell(e,t,n){let r=this.calculateOutGivenIn(e,t),a=this.calculateTradeFee(r,n),i=P.toPct(n.exchangeFee),s=r-a,o=[];(t<this.minTradingLimit||r<e.assetOutEd)&&o.push("InsufficientTradingAmount");let l=e.balanceIn/this.maxInRatio;t>l&&o.push("MaxInRatioExceeded");let c=e.balanceOut/this.maxOutRatio;return s>c&&o.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:r,amountOut:s,feePct:i,errors:o}}calculateInGivenOut(e,t){let n=Y.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(e,t){let n=Y.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(e){let t=Y.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),n=Math.pow(10,18-e.decimalsOut);return BigInt(t)/BigInt(n)}spotPriceOutGivenIn(e){let t=Y.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),n=Math.pow(10,18-e.decimalsIn);return BigInt(t)/BigInt(n)}calculateTradeFee(e,t){let n=Y.calculatePoolTradeFee(e.toString(),t.exchangeFee[0],t.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Ta}from"polkadot-api";import{of as Ia}from"rxjs";var _e=class extends q{async loadPools(){let e=this.api.query.XYK.PoolAssets,[t,n]=await Promise.all([e.getEntries(),this.getPoolLimits()]),r=t.map(async({keyArgs:a,value:i})=>{let[s]=a,[o,l]=i,[c,d,m,p]=await Promise.all([this.getBalance(s,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(s,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:s,type:"XYK",tokens:[{id:o,decimals:d?.decimals,existentialDeposit:d?.existential_deposit,balance:c.transferable,type:d?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:m.transferable,type:p?.asset_type.type}],...n}});return Promise.all(r)}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}async getPoolLimits(){let[e,t,n]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:e,maxOutRatio:t,minTradingLimit:n}}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}getPoolType(){return"XYK"}async isSupported(){let e=this.api.query.XYK.PoolAssets,t=await this.api.compatibilityToken;return e.isCompatible(Ta.BackwardsCompatible,t)}subscribePoolChange(e){return Ia(e)}};var gt={};T(gt,{AavePool:()=>Be,AavePoolClient:()=>Fe});var Be=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new u(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit)}constructor(e,t,n,r,a){this.type="Aave",this.address=e,this.tokens=t,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a}validatePair(e,t){return!0}parsePair(e,t){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(e),a=n.get(t);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:e,assetOut:t,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(e,t,n){let r=this.calculateInGivenOut(e,t),a=[];return t>e.balanceOut&&a.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:t,feePct:0,errors:a}}validateAndSell(e,t,n){let r=this.calculateOutGivenIn(e,t),a=[];return r>e.balanceOut&&a.push("TradeNotAllowed"),{amountIn:t,calculatedOut:r,amountOut:r,feePct:0,errors:a}}calculateInGivenOut(e,t){return t}calculateOutGivenIn(e,t){return t}spotPriceInGivenOut(e){let t=Math.pow(10,e.decimalsOut);return BigInt(t)}spotPriceOutGivenIn(e){let t=Math.pow(10,e.decimalsIn);return BigInt(t)}calculateTradeFee(e,t){return 0n}};import{AccountId as va}from"polkadot-api";import{toHex as Oa}from"@polkadot-api/utils";import{map as Aa,merge as _a,switchMap as Ba}from"rxjs";import{decodeEventLog as Fa}from"viem";var jt=[{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:Ra}=Z,ka=["Supply","Withdraw","Repay","Borrow"],Fe=class extends q{async loadPools(){let t=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:r,liqudity_in:a,liqudity_out:i})=>{let[s,o,l,c]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(r),this.api.query.AssetRegistry.AssetLocations.getValue(r)]);return{address:this.getPoolId(n,r),type:"Aave",tokens:[{id:n,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:a,location:o,type:s?.asset_type.type},{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:i,location:c,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(t)}async getPoolDelta(e){let[t,n]=e.tokens,{liqudity_in:r,liqudity_out:a}=await this.api.apis.AaveTradeExecutor.pool(t.id,n.id);return e.tokens.map(i=>{let s=i.id===t.id?r:a;return{...i,balance:s}})}getPoolId(e,t){let n=e+"/"+t,r=new TextEncoder().encode(n.padEnd(32,"\0")),a=Oa(r);return va(63).dec(a)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(e,t){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(e){let[t,n]=e.tokens,r=this.getReserveH160Id(t),a=this.api.event.Router.Executed.watch(({asset_in:s,asset_out:o})=>s===n.id||o===n.id),i=this.api.event.EVM.Log.watch(({log:s})=>{let{topics:o,data:l}=s,c=o.map(g=>g.asHex()),d=l.asHex(),{eventName:m,args:p}=Fa({abi:jt,topics:c,data:d});return ka.includes(m)&&p.reserve.toLowerCase()===r.toLowerCase()});return _a([a,i]).pipe(Ba(()=>this.getPoolDelta(e)),Aa(s=>({...e,tokens:[...s]})))}getReserveH160Id(e){return e.type==="Erc20"?Q.findNestedKey(e.location,"AccountKey20").AccountKey20.key:Ra.fromAssetId(e.id)}};var se=class{static get(e){switch(e.type){case"Aave":return Be.fromPool(e);case"XYK":return Ae.fromPool(e);case"Omnipool":return Te.fromPool(e);case"LBP":return we.fromPool(e);case"Stableswap":return ve.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};import{Subject as Ea,Subscription as Re,takeUntil as Da}from"rxjs";var oe=class extends F{lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=Re.EMPTY;omniSub=Re.EMPTY;stableSub=Re.EMPTY;xykSub=Re.EMPTY;aaveSub=Re.EMPTY;isReady=!1;isDestroyed=new Ea;constructor(e){super(e),this.lbpClient=new xe(e),this.omniClient=new Ie(e),this.stableClient=new Oe(e),this.xykClient=new _e(e),this.aaveClient=new Fe(e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(e){return e.getSubscriber().pipe(Da(this.isDestroyed)).subscribe(t=>{this.pools.set(t.address,t)})}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(e){return this.xykClient.withOverride(e),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(e={}){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let{useOnly:t=[],exclude:n=[]}=e,r=new Set(t),a=new Set(n),i=async s=>{let o=s.getPoolType();return r.size>0?r.has(o):a.size>0?!a.has(o):s.isSupported()};return this.getFilteredPools(i)}async getFilteredPools(e){let t=await Promise.all(this.clients.map(e)),n=this.clients.filter((a,i)=>t[i]);return(await Promise.all(n.map(a=>a.getPoolsMem()))).flat()}async getPoolFees(e,t){let n=this.clients.find(r=>r.getPoolType()===e.type);if(n)return n.getPoolFees(e,t);throw new fe(e.type)}};var en={};T(en,{DEFAULT_BLOCK_TIME:()=>$t,DEFAULT_MIN_BUDGET:()=>yt,ORDER_MIN_BLOCK_PERIOD:()=>Jt,Router:()=>le,TWAP_BLOCK_PERIOD:()=>Ce,TWAP_MAX_DURATION:()=>ft,TWAP_MAX_PRICE_IMPACT:()=>Pt,TWAP_TX_MULTIPLIER:()=>Bu,TradeOrderError:()=>ht,TradeOrderType:()=>Ye,TradeRouteBuilder:()=>N,TradeRouter:()=>ce,TradeScheduler:()=>ue,TradeType:()=>We});var ke=class{constructor(e=1/0){this.capacity=e}storage=[];enqueue(e){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(e)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Ca=8,Ee=class{isNotVisited(e,t){let n=!0;return t.forEach(r=>{(r[0]===e[0]||r[1]===e[1])&&(n=!1)}),n}findPaths(e,t,n){let r=[],a=new ke,i=[];for(i.push([t,""]),a.enqueue(i);a.size()>0;){let s=a.dequeue();if(!s||s.length>Ca)continue;let o=s[s.length-1];(n===null||o[0]===n)&&r.push(s),e.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,s)){let d=[...s];d.push(c),a.enqueue(d)}})}return r}findShortestPaths(e,t,n){let r=[],a=new ke,i=[];i.push([t,""]),a.enqueue(i);let s=1/0;for(;a.size()>0;){let o=a.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<s?(s=o.length,r.length=0,r.push(o)):o.length===s&&r.push(o);continue}let c=e.get(l[0]);for(let d of c??[])this.isNotVisited(d,o)&&a.enqueue([...o,d])}return r}buildAndPopulateGraph(e,t){let n=new Map;for(let r of e)n.set(parseInt(r),[]);for(let[r,a,i]of t)n.get(a)?.push([i,r]);return n}};function bt(u){let e={};for(let t of u){let n=t.tokens.length;for(let r=0;r<n;r++){e[t.tokens[r].id]||(e[t.tokens[r].id]=[]);for(let a=0;a<n;a++){if(r==a)continue;let i=[t.address,t.tokens[r].id,t.tokens[a].id];e[t.tokens[r].id].push(i)}}}return e}var De=class{getProposals(e,t,n){let r=n.filter(b=>b.type==="XYK"),a=n.filter(b=>b.type!=="XYK"),i=new Set(a.map(b=>b.tokens).flat().map(b=>b.id)),s=i.has(e),o=i.has(t),l=new Ee,c=b=>{let f=bt(b),S=Object.keys(f),w=S.flatMap(I=>f[I]);return l.buildAndPopulateGraph(S,w)};if(!s&&!o){let b=r.filter(w=>w.tokens.find(I=>I.id===e)||w.tokens.find(I=>I.id===t)),f=c(b),S=l.findPaths(f,e,t);return this.parsePaths(S)}if(s&&o){let b=c(a),f=l.findPaths(b,e,t);return this.parsePaths(f)}let d=s?t:e,m=r.filter(b=>b.tokens.some(f=>f.id===d));if(m.length===0)return[];let p=[...a,...m],g=c(p),h=l.findPaths(g,e,t);return this.parsePaths(h)}parsePaths(e){let t=[];for(let n of e){let r=[];for(let a=0;a<n.length;a++){let i=n[a],s=n[a+1];if(s==null)break;r.push(this.toEdge(i,s))}t.push(r)}return t}toEdge(e,t){return[t[1],e[0],t[0]]}};var le=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(e,t={}){this.ctx=e,this.routeSuggester=new De,this.routeProposals=new Map,this.routerOptions=Object.freeze(t)}buildRouteKey(e,t,n){return`${e}->${t}::${n.length}`}async getPools(){return this.ctx.getPools(this.routerOptions)}async getRoutes(e,t){let n=await this.getPools();return this.validateInput(e,t,n),this.getPaths(e,t,n)}async getTradeableAssets(){let e=await this.getPools(),t=this.getAssets(e);return Array.from(t)}async getRouteableAssets(e){let t=await this.getTradeableAssets();return(await Promise.all(t.filter(r=>r!==e).map(r=>this.getRoutes(r,e)))).filter(r=>r.length>0).map(([r])=>r[0].assetIn).sort()}validateInput(e,t,n){if(n.length===0)throw new Error("No pools configured");if(e===t)throw new Error("Trading pair can't be identical");let r=this.getAssets(n);if(!r.has(e))throw new Error(e+" is not supported asset");if(!r.has(t))throw new Error(t+" is not supported asset");return this.toPoolsMap(n)}getAssets(e){let t=e.map(n=>n.tokens.map(r=>r.id)).flat().sort((n,r)=>n>r?1:-1);return new Set(t)}getPaths(e,t,n){let r=this.toPoolsMap(n);return this.getProposals(e,t,n).filter(i=>this.validPath(i,r)).map(i=>this.toHops(i,r))}getProposals(e,t,n){let r=this.buildRouteKey(e,t,n);if(this.routeProposals.has(r))return this.routeProposals.get(r);let a=this.routeSuggester.getProposals(e,t,n);return this.routeProposals.set(r,a),a}validPath(e,t){return e.length>0&&e.map(n=>this.validEdge(n,t)).reduce((n,r)=>n&&r)}validEdge([e,t,n],r){return r.get(e)?.validatePair(t,n)||!1}toPoolsMap(e){return new Map(e.map(t=>[t.address,se.get(t)]))}toHops(e,t){return e.map(([n,r,a])=>{let i=t.get(n);return{poolAddress:n,poolId:i?.id,pool:i?.type,assetIn:r,assetOut:a}})}};var We=(t=>(t.Buy="Buy",t.Sell="Sell",t))(We||{}),Ye=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(Ye||{}),ht=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(ht||{});var ce=class extends le{mlr;poolsSnapshot;constructor(e,t={}){super(e,t),this.mlr=new Map}buildCtxSync(e,t){let n=this.poolsSnapshot,r=super.validateInput(e,t,n),a=super.getPaths(e,t,n);if(!a.length)throw new Se(e,t);return{paths:a,pools:n,poolsMap:r}}async withCtx(e,t,n){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let r=this.buildCtxSync(e,t);return n(r)}isDirectTrade(e){return e.length==1}findBestSellRoute(e){let t=e.sort((n,r)=>{let a=n[n.length-1].amountOut,i=r[r.length-1].amountOut;return a>i?-1:1});return t.find(n=>n.every(r=>r.errors.length==0))||t[0]}getRouteFeeRange(e){if(e.filter(n=>n.tradeFeeRange).length>0){let n=e.map(a=>a.tradeFeeRange?.[0]??a.tradeFeePct).reduce((a,i)=>a+i),r=e.map(a=>a.tradeFeeRange?.[1]??a.tradeFeePct).reduce((a,i)=>a+i);return[n,r]}}getPoolFeeRange(e){let t=e.min?P.toPct(e.min):void 0,n=e.max?P.toPct(e.max):void 0;if(t&&n)return[t,n]}async getBestSell(e,t,n){return this.getSell(e,t,n)}getSellSpot(e){let t=e[e.length-1];if(e.length===1)return t.spotPrice;let n=e.map(s=>s.assetOutDecimals).reduce((s,o)=>s+o),r=e.map(s=>s.spotPrice).reduce((s,o)=>s*o),a=n-t.assetOutDecimals,i=Math.pow(10,a);return r/BigInt(i)}async getSell(e,t,n,r){return this.withCtx(e,t,async({paths:a,poolsMap:i})=>{let s;if(r)s=await this.toSellSwaps(n,r,i);else{let o=a.map(c=>this.toSellSwaps(n,c,i)),l=await Promise.all(o);s=this.findBestSellRoute(l)}return this.buildSell(i,s)})}buildSell(e,t){let n=t[0],r=t[t.length-1],a=this.isDirectTrade(t),i=this.getSellSpot(t),s=r.amountOut,o=a?r.calculatedOut:this.calculateDelta0Y(n.amountIn,t,e),l=o-s,c=this.getRouteFeeRange(t),d=a?r.tradeFeePct:O.calculateSellFee(o,s),m=Math.pow(10,n.assetInDecimals),p=n.amountIn*i/BigInt(m),g=O.calculateDiffToRef(o,p);return{type:"Sell",amountIn:n.amountIn,amountOut:r.amountOut,spotPrice:i,tradeFee:l,tradeFeePct:d,tradeFeeRange:c,priceImpactPct:g,swaps:t,toHuman(){return{type:"Sell",amountIn:y.toDecimal(n.amountIn,n.assetInDecimals),amountOut:y.toDecimal(r.amountOut,r.assetOutDecimals),spotPrice:y.toDecimal(i,r.assetOutDecimals),tradeFee:y.toDecimal(l,r.assetOutDecimals),tradeFeePct:d,tradeFeeRange:c,priceImpactPct:g,swaps:t.map(h=>h.toHuman())}}}}calculateDelta0Y(e,t,n){let r=[];for(let a=0;a<t.length;a++){let i=t[a],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;a>0?l=r[a-1]:l=e;let c=s.calculateOutGivenIn(o,l);r.push(c)}return r[r.length-1]}async calculateMostLiquidRoute(e,t,n){let{paths:r,pools:a,poolsMap:i}=n,l=a.filter(h=>h.tokens.some(b=>b.id===e)).map(h=>h.type==="Aave"?h.tokens:h.tokens.filter(b=>b.id===e)).map(h=>h.map(b=>b.balance).reduce((b,f)=>b+f)).sort((h,b)=>b<h?-1:1)[0],c=O.getFraction(l,.1),d=await Promise.all(r.map(h=>this.toSellSwaps(c,h,i))),p=this.findBestSellRoute(d).map(h=>({poolAddress:h.poolAddress,poolId:h?.poolId,pool:h.pool,assetIn:h.assetIn,assetOut:h.assetOut})),g=this.buildRouteKey(e,t,a);return this.mlr.set(g,p),p}async toSellSwaps(e,t,n){let r=[];for(let a=0;a<t.length;a++){let i=t[a],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;a>0?l=r[a-1].amountOut:l=typeof e=="string"?y.toBigInt(e,o.decimalsIn):e;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountOut:d,calculatedOut:m,feePct:p,errors:g}=s.validateAndSell(o,l,c),h=this.getPoolFeeRange(c),b=s.spotPriceOutGivenIn(o),f=Math.pow(10,o.decimalsIn),S=l*b/BigInt(f),w=O.calculateDiffToRef(m,S);r.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:d,calculatedOut:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:h,priceImpactPct:w,errors:g,isSupply(){return s.type==="Aave"&&s.tokens[0].id===i.assetIn},isWithdraw(){return s.type==="Aave"&&s.tokens[1].id===i.assetIn},toHuman(){return{...i,amountIn:y.toDecimal(l,o.decimalsIn),amountOut:y.toDecimal(d,o.decimalsOut),calculatedOut:y.toDecimal(m,o.decimalsOut),spotPrice:y.toDecimal(b,o.decimalsOut),tradeFeePct:p,tradeFeeRange:h,priceImpactPct:w,errors:g}}})}return r}async getMostLiquidRoute(e,t){return this.withCtx(e,t,async n=>{let r=this.buildRouteKey(e,t,n.pools),a=this.mlr.get(r);return a||this.calculateMostLiquidRoute(e,t,n)})}async getSpotPrice(e,t){return this.withCtx(e,t,async n=>{let{pools:r,poolsMap:a}=n,i=this.buildRouteKey(e,t,r),s=this.mlr.get(i);s||(s=await this.calculateMostLiquidRoute(e,t,n));let o=await this.toSellSwaps("1",s,a),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}})}findBestBuyRoute(e){let t=e.sort((n,r)=>{let a=n[0].amountIn,i=r[0].amountIn;return a>i?1:-1});return t.find(n=>n.every(r=>r.errors.length==0))||t[0]}async getBestBuy(e,t,n){return this.getBuy(e,t,n)}getBuySpot(e){let t=e[0];if(e.length===1)return t.spotPrice;let n=e.map(s=>s.assetInDecimals).reduce((s,o)=>s+o),r=e.map(s=>s.spotPrice).reduce((s,o)=>s*o),a=n-t.assetInDecimals,i=Math.pow(10,a);return r/BigInt(i)}async getBuy(e,t,n,r){return this.withCtx(e,t,async({paths:a,poolsMap:i})=>{let s;if(r)s=await this.toBuySwaps(n,r,i);else{let o=a.map(c=>this.toBuySwaps(n,c,i)),l=await Promise.all(o);s=this.findBestBuyRoute(l)}return this.buildBuy(i,s)})}buildBuy(e,t){let n=t[t.length-1],r=t[0],a=this.isDirectTrade(t),i=this.getBuySpot(t),s=r.amountIn,o=a?r.calculatedIn:this.calculateDelta0X(n.amountOut,t,e),l=s-o,c=this.getRouteFeeRange(t),d=a?r.tradeFeePct:O.calculateBuyFee(o,s),m=Math.pow(10,n.assetOutDecimals),p=n.amountOut*i/BigInt(m),g;return o===0n?g=-100:g=O.calculateDiffToRef(p,o),{type:"Buy",amountOut:n.amountOut,amountIn:r.amountIn,spotPrice:i,tradeFee:l,tradeFeePct:d,tradeFeeRange:c,priceImpactPct:g,swaps:t,toHuman(){return{type:"Buy",amountOut:y.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:y.toDecimal(r.amountIn,r.assetInDecimals),spotPrice:y.toDecimal(i,r.assetInDecimals),tradeFee:y.toDecimal(l,r.assetInDecimals),tradeFeePct:d,tradeFeeRange:c,priceImpactPct:g,swaps:t.map(h=>h.toHuman())}}}}calculateDelta0X(e,t,n){let r=[];for(let a=t.length-1;a>=0;a--){let i=t[a],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;a==t.length-1?l=e:l=r[0];let c=s.calculateInGivenOut(o,l);r.unshift(c)}return r[0]}async toBuySwaps(e,t,n){let r=[];for(let a=t.length-1;a>=0;a--){let i=t[a],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;a==t.length-1?l=typeof e=="string"?y.toBigInt(e,o.decimalsOut):e:l=r[0].amountIn;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountIn:d,calculatedIn:m,feePct:p,errors:g}=s.validateAndBuy(o,l,c),h=this.getPoolFeeRange(c),b=s.spotPriceInGivenOut(o),f=Math.pow(10,o.decimalsOut),S=l*b/BigInt(f),w;m===0n?w=-100:w=O.calculateDiffToRef(S,m),r.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:d,calculatedIn:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:h,priceImpactPct:w,errors:g,isSupply(){return s.type==="Aave"&&s.tokens[0].id===i.assetIn},isWithdraw(){return s.type==="Aave"&&s.tokens[1].id===i.assetIn},toHuman(){return{...i,amountOut:y.toDecimal(l,o.decimalsOut),amountIn:y.toDecimal(d,o.decimalsIn),calculatedIn:y.toDecimal(m,o.decimalsIn),spotPrice:y.toDecimal(b,o.decimalsIn),tradeFeePct:p,tradeFeeRange:h,priceImpactPct:w,errors:g}}})}return r}};var $t=6e3,yt=1000000000000000n,Ce=6,Pt=-5,ft=216e5,Bu=3,Jt=6;import{Enum as Zt}from"polkadot-api";var N=class{static build(e){return e.map(({assetIn:t,assetOut:n,pool:r,poolId:a})=>r==="Stableswap"?{pool:Zt("Stableswap",a),asset_in:t,asset_out:n}:{pool:Zt(r),asset_in:t,asset_out:n})}};var ue=class{schedulerOptions;router;constructor(e,t={}){this.router=e,this.schedulerOptions=Object.freeze({blockTime:t.blockTime??6e3,minBudgetInNative:t.minBudgetInNative??yt})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(e,t,n,r,a){let[i,s]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=s,d=l[0],m=l[l.length-1],{assetInDecimals:p}=d,{assetOutDecimals:g}=m,h=Math.abs(c),b=this.getMinimumTradeCount(o,i),f=this.getOptimalTradeCount(h),S=a?Math.round(r/a):f,w=Math.ceil(r/b),I=Math.round(r/f),E=Math.round(r/S),M=o/BigInt(S),R=await this.router.getBestSell(e,t,M),G=o<i,V=[];G&&V.push("OrderTooSmall");let X=R.amountOut*BigInt(S),ge=this.toBlockPeriod(E),K=R.tradeFee*BigInt(S),Ke=N.build(l),be={assetIn:e,assetOut:t,errors:V,frequencyMin:w,frequencyOpt:I,frequency:E,tradeCount:S,tradeFee:K,tradeImpactPct:R.priceImpactPct,tradePeriod:ge,tradeRoute:Ke,type:"Dca"};return{...be,amountIn:o,amountOut:X,tradeAmountIn:R.amountIn,tradeAmountOut:R.amountOut,toHuman(){return{...be,amountIn:y.toDecimal(o,p),amountOut:y.toDecimal(X,g),tradeAmountIn:y.toDecimal(R.amountIn,p),tradeAmountOut:y.toDecimal(R.amountOut,g)}}}}async getMinimumOrderBudget(e){if(0===e)return this.minOrderBudget;let t=await this.router.getSpotPrice(0,e),n=10n**BigInt(12);if(t)return this.minOrderBudget*t.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(e,t){let n=t*2n/10n;if(n===0n)return 0;let r=e+n/2n;return Number(r/n)}getOptimalTradeCount(e){let t=Math.round(e*10)||1;return Math.max(t,3)}async getTwapSellOrder(e,t,n){let[r,a]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,n)]),{amountIn:i,swaps:s,priceImpactPct:o}=a,l=s[0],c=s[s.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),h=i/BigInt(g),b=await this.router.getBestSell(l.assetIn,c.assetOut,h),f=g===1,S=i<r,w=b.priceImpactPct<-5,I=[];S||f?I.push("OrderTooSmall"):w&&I.push("OrderImpactTooBig");let E=b.amountOut*BigInt(g),M=b.tradeFee*BigInt(g),R=N.build(s),G={assetIn:e,assetOut:t,errors:I,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:R,type:"TwapSell"};return{...G,amountIn:i,amountOut:E,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:M,toHuman(){return{...G,amountIn:y.toDecimal(i,d),amountOut:y.toDecimal(E,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(M,m)}}}}async getTwapBuyOrder(e,t,n){let[r,a]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestBuy(e,t,n)]),{amountOut:i,swaps:s,priceImpactPct:o}=a,l=s[0],c=s[s.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),h=i/BigInt(g),b=await this.router.getBestBuy(l.assetIn,c.assetOut,h),f=b.amountIn*BigInt(g),S=g===1,w=f<r,I=b.priceImpactPct<-5,E=[];w||S?E.push("OrderTooSmall"):I&&E.push("OrderImpactTooBig");let M=b.tradeFee*BigInt(g),R=N.build(s),G={assetIn:e,assetOut:t,errors:E,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:R,type:"TwapBuy"};return{...G,amountIn:f,amountOut:i,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:M,toHuman(){return{...G,amountIn:y.toDecimal(f,d),amountOut:y.toDecimal(i,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(M,d)}}}}getTwapTradeCount(e){let t=this.getOptimalTradeCount(e);if(this.getTwapExecutionTime(t)>216e5){let r=216e5/(this.blockTime*6);return Math.round(r)}return t}getTwapExecutionTime(e){return e*6*this.blockTime}toBlockPeriod(e){let t=e/this.blockTime,n=Math.round(t);return Math.max(n,6)}};var an={};T(an,{BIG_10:()=>nn,BIG_BILL:()=>rn,StakingApi:()=>Me,StakingClient:()=>Le});import{encodeAddress as Ma}from"@polkadot/util-crypto";import{stringToU8a as La}from"@polkadot/util";import{calculate_accumulated_rps as qa,calculate_period_number as tn,calculate_rewards as Na}from"@galacticcouncil/math-staking";import de from"big.js";var nn=de(10),rn=de(nn.pow(12));function Ga(u){return Ma(La(("modl"+u).padEnd(32,"\0")),63)}var Me=class{client;balanceClient;constructor(e,t){this.client=e,this.balanceClient=t}async getFreePotBalance(){let e=await this.client.getPalletId(),t=Ga(e);return(await this.balanceClient.getBalance(t,0)).transferable}async getStakingPosition(e){let[t,n]=await Promise.all([this.client.getStakingPositionsValue(e),this.client.getStakingVotes(e)]),r=t?.created_at,a=await n.reduce(async(i,[s,o])=>{let l=await i,c=s,d=o.amount,m=o.conviction.toString(),p=await this.client.getReferendumInfo(c);return p&&(p.type==="Approved"||p.type==="Rejected")&&l.push({id:c,amount:d,conviction:m}),l},Promise.resolve([]));return{stake:t?.stake,rewardPerStake:t?.reward_per_stake,createdAt:r,actionPoints:t?.action_points,accumulatedUnpaidRewards:t?.accumulated_unpaid_rewards,accumulatedSlashPoints:t?.accumulated_slash_points,accumulatedLockedRewards:t?.accumulated_locked_rewards,votes:a}}async getStake(e){let t=await this.client.getNFTCollectionId(),[n,r]=await Promise.all([this.client.getStaking(),this.client.getUniques(e,t)]),a=r.find(i=>i)?.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(e,t){let n=await this.getStake(e),{potReservedBalance:r,accumulatedRewardPerStake:a,totalStake:i,stakePosition:s}=n;if(!s)return;let[o,l,c,d]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),m=de(o.toString()).minus(r.toString()),p=a.toString(),g=de(t).plus(1).toString();m.gt(0)&&i>0&&(p=qa(a.toString(),m.toString(),i.toString()));let h=tn(l.toString(),t,d??g),b=tn(l.toString(),s.createdAt?.toString()??"",d??g),f=Na(p,s.rewardPerStake?.toString()??"",s.stake?.toString()??""),S=de(f).plus(s.accumulatedUnpaidRewards?.toString()||"0").plus(s.accumulatedLockedRewards?.toString()||"0");if(!de(h).minus(b).lte(c.toString()))return S.div(rn).toString()}};var Le=class extends F{async getPalletId(){let e=this.api.constants.Staking.PalletId;return(await e()).asText()}async getPeriodLength(){let e=this.api.constants.Staking.PeriodLength;return await e()}async getUnclaimablePeriods(){let e=this.api.constants.Staking.UnclaimablePeriods;return await e()}async getNFTCollectionId(){let e=this.api.constants.Staking.NFTCollectionId;return await e()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(e,t){return(await this.api.query.Uniques.Account.getEntries(e,t)).map(({keyArgs:i})=>{let[s,o,l]=i;return{address:s,collectionId:o,itemId:l}})}async getStakingPositionsValue(e){return await this.api.query.Staking.Positions.getValue(e)}async getStakingVotes(e){return await this.api.query.Staking.Votes.getValue(e)}async getReferendumInfo(e){return await this.api.query.Referenda.ReferendumInfoFor.getValue(e)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var ln={};T(ln,{TxBuilderFactory:()=>me});import{Enum as on}from"polkadot-api";function sn(u){let e=[],t=u;for(;t&&typeof t=="object"&&"type"in t;)e.push(t.type),t=t.value;return e.join(".")}var pe=class extends F{evmClient;balanceClient;aaveUtils;constructor(e,t){super(e),this.evmClient=t??new C,this.balanceClient=new L(e),this.aaveUtils=new $(this.evmClient)}wrapTx(e,t){return{name:e,get:()=>t,dryRun:n=>this.dryRun(n,t)}}async dispatchWithExtraGas(e){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:e.decodedCall,extra_gas:$e})}async dryRun(e,t){let n=on("Signed",e),r=on("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,t.decodedCall),s=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(s){let o=sn(s.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(e){return e.length===1&&e[0].pool==="Omnipool"}};var Xe=class extends pe{_trade;_beneficiary;_slippagePct=1;setTrade(e){return this._trade=e,this}withBeneficiary(e){return this._beneficiary=e,this}withSlippage(e){return this._slippagePct=e,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:e,swaps:t,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:r}=t[0],a=await this.balanceClient.getBalance(this.beneficiary,r);return e>=a.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:e,amountOut:t,swaps:n}=this.trade,r=n[0],a=n[n.length-1],i=O.getFraction(e,this.slippagePct),s=r.assetIn,o=a.assetOut,l=e+i,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:s,asset_out:o,amount:t,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:s,asset_out:o,amount_out:t,max_amount_in:l,route:N.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:e,amountOut:t,swaps:n}=this.trade,r=n[0],a=n[n.length-1],i=O.getFraction(t,this.slippagePct),s=r.assetIn,o=a.assetOut,l=t-i,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:s,asset_out:o,amount:e,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:s,asset_out:o,amount_in:e,min_amount_out:l,route:N.build(n)}),r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=await this.dispatchWithExtraGas(c)),this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:e,swaps:t}=this.trade,n=t[0],r=t[t.length-1],a=O.getFraction(e,this.slippagePct),i=n.assetIn,s=r.assetOut,o=e-a,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:s,min_amount_out:o,route:N.build(t)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as St}from"polkadot-api";var ze=class extends pe{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(e){return this._order=e,this}withBeneficiary(e){return this._beneficiary=e,this}withMaxRetries(e){return this._maxRetries=e,this}withSlippage(e){return this._slippagePct=e,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:e}=this.order;switch(e){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${e}`)}}buildDcaTx(){let{amountIn:e,assetIn:t,assetOut:n,tradeAmountIn:r,tradePeriod:a,tradeRoute:i}=this.order,s=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:a,max_retries:this.maxRetries,total_amount:e,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:St("Sell",{asset_in:t,asset_out:n,amount_in:r,min_amount_out:0n,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",s)}buildTwapSellTx(){let{amountIn:e,assetIn:t,assetOut:n,tradeAmountIn:r,tradeAmountOut:a,tradePeriod:i,tradeRoute:s}=this.order,o=O.getFraction(a,this.slippagePct),l=a-o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:e,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:St("Sell",{asset_in:t,asset_out:n,amount_in:r,min_amount_out:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:e,assetIn:t,assetOut:n,tradeAmountIn:r,tradeAmountOut:a,tradePeriod:i,tradeRoute:s}=this.order,o=O.getFraction(r,this.slippagePct),l=r+o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:e,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:St("Buy",{asset_in:t,asset_out:n,amount_out:a,max_amount_in:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var me=class{client;evmClient;constructor(e,t){this.client=e,this.evmClient=t??new C}trade(e){return new Xe(this.client,this.evmClient).setTrade(e)}order(e){return new ze(this.client,this.evmClient).setOrder(e)}};async function Nd(u,e){let t=new re(u),[n,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),a=e??new C,i=new oe(u).withAave().withOmnipool().withStableswap().withXyk(),s=new $(a),o=new ce(i),l=new ue(o,{blockTime:n,minBudgetInNative:r}),c=new L(u),d=new Le(u),m=new Me(d,c);return{api:{aave:s,router:o,scheduler:l,staking:m},client:{asset:new te(u),balance:c,evm:a,mining:new ae(u)},ctx:{pool:i},tx:new me(u,a),destroy:()=>{i.destroy()}}}export{Mt as aave,It as api,y as big,Vt as client,Ft as const,Nd as createSdkContext,Z as erc20,Ht as error,_t as evm,P as fmt,Ve as h160,Q as json,O as math,Qt as pool,en as sor,an as staking,ln as tx,Ct as xc};
@@ -1,17 +1,18 @@
1
1
  import { PolkadotClient } from 'polkadot-api';
2
2
  import { type Observable } from 'rxjs';
3
3
  import { Papi } from '../api';
4
- import { AssetAmount } from '../types';
4
+ import { AssetBalance, Balance } from '../types';
5
5
  export declare class BalanceClient extends Papi {
6
6
  constructor(client: PolkadotClient);
7
- getBalance(account: string, assetId: number): Promise<bigint>;
8
- getSystemBalance(account: string): Promise<bigint>;
9
- getTokenBalance(account: string, assetId: number): Promise<bigint>;
10
- getErc20Balance(account: string, assetId: number): Promise<bigint>;
11
- subscribeBalance(address: string): Observable<AssetAmount[]>;
12
- subscribeSystemBalance(address: string): Observable<AssetAmount>;
13
- subscribeTokenBalance(address: string, assetId: number): Observable<AssetAmount>;
14
- subscribeTokensBalance(address: string): Observable<AssetAmount[]>;
15
- subscribeErc20Balance(address: string, includeOnly?: number[]): Observable<AssetAmount[]>;
7
+ getBalance(account: string, assetId: number): Promise<Balance>;
8
+ getSystemBalance(account: string): Promise<Balance>;
9
+ getTokenBalance(account: string, assetId: number): Promise<Balance>;
10
+ protected calculateBalance(data: Awaited<ReturnType<typeof this.api.query.System.Account.getValue>>['data'] | Awaited<ReturnType<typeof this.api.query.Tokens.Accounts.getValue>>): Balance;
11
+ getErc20Balance(account: string, assetId: number): Promise<Balance>;
12
+ subscribeBalance(address: string): Observable<AssetBalance[]>;
13
+ subscribeSystemBalance(address: string): Observable<AssetBalance>;
14
+ subscribeTokenBalance(address: string, assetId: number): Observable<AssetBalance>;
15
+ subscribeTokensBalance(address: string): Observable<AssetBalance[]>;
16
+ subscribeErc20Balance(address: string, includeOnly?: number[]): Observable<AssetBalance[]>;
16
17
  private getTokenBalanceData;
17
18
  }
@@ -0,0 +1,75 @@
1
+ import { PolkadotClient, TypedApi } from 'polkadot-api';
2
+ import Big from 'big.js';
3
+ import { Papi } from '../api';
4
+ import { BalanceClient } from './BalanceClient';
5
+ import { hydration, HydrationQueries } from '@galacticcouncil/descriptors';
6
+ export type OmnipoolWarehouseLMDeposit = HydrationQueries['OmnipoolWarehouseLM']['Deposit']['Value'];
7
+ export type OmnipoolWarehouseLMDepositYieldFarmEntry = OmnipoolWarehouseLMDeposit['yield_farm_entries'][number];
8
+ export declare class LiquidityMining extends Papi {
9
+ protected readonly balanceClient: BalanceClient;
10
+ protected omnipoolAssetIds: string[];
11
+ private secondsInYear;
12
+ constructor(client: PolkadotClient);
13
+ getOraclePrice(rewardCurrency: number, incentivizedAsset: number): Promise<bigint | undefined>;
14
+ private getFarmAddress;
15
+ private getGlobalRewardPerPeriod;
16
+ private getPoolYieldPerPeriod;
17
+ private farmData;
18
+ getOmnipoolFarms(id: string): Promise<({
19
+ apr: string;
20
+ minApr: string | undefined;
21
+ isDistributed: boolean;
22
+ estimatedEndPeriod: string;
23
+ maxRewards: bigint;
24
+ incentivizedAsset: number;
25
+ rewardCurrency: number;
26
+ loyaltyCurve: {
27
+ initial_reward_percentage: bigint;
28
+ scale_coef: number;
29
+ } | undefined;
30
+ currentPeriod: string;
31
+ potMaxRewards: bigint;
32
+ fullness: string;
33
+ } | undefined)[]>;
34
+ getIsolatedFarms(id: string): Promise<({
35
+ apr: string;
36
+ minApr: string | undefined;
37
+ isDistributed: boolean;
38
+ estimatedEndPeriod: string;
39
+ maxRewards: bigint;
40
+ incentivizedAsset: number;
41
+ rewardCurrency: number;
42
+ loyaltyCurve: {
43
+ initial_reward_percentage: bigint;
44
+ scale_coef: number;
45
+ } | undefined;
46
+ currentPeriod: string;
47
+ potMaxRewards: bigint;
48
+ fullness: string;
49
+ } | undefined)[]>;
50
+ getDepositReward(poolId: string, farmEntry: OmnipoolWarehouseLMDepositYieldFarmEntry, isXyk: boolean, relayChainBlockNumber: number): Promise<{
51
+ reward: Big.Big;
52
+ maxReward: Big.Big;
53
+ assetId: number;
54
+ } | undefined>;
55
+ }
56
+ export declare const BN_QUINTILL: Big.Big;
57
+ type Api = TypedApi<typeof hydration>;
58
+ export declare const getAccountAssetBalances: (api: Api, pairs: Array<[address: string, assetId: number]>) => () => Promise<{
59
+ free: bigint;
60
+ reserved: bigint;
61
+ frozen: bigint;
62
+ assetId: string;
63
+ }[]>;
64
+ export declare class MultiCurrencyContainer {
65
+ result: Map<string, bigint>;
66
+ getKey(asset: number, accountId: string): string;
67
+ constructor(keys: [string, number][], values: {
68
+ free: bigint;
69
+ reserved: bigint;
70
+ frozen: bigint;
71
+ }[]);
72
+ free_balance(asset: number, accountId: string): bigint;
73
+ transfer(asset: number, sourceAccount: string, targetAccount: string, amount: bigint): void;
74
+ }
75
+ export {};