@galacticcouncil/sdk-next 0.8.0-pr203-e2c1241 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.mjs CHANGED
@@ -1 +1 @@
1
- var kn=Object.defineProperty;var w=(u,t)=>{for(var e in t)kn(u,e,{get:t[e],enumerable:!0})};var Ne={};w(Ne,{Papi:()=>R,getWs:()=>Mn});import{hydration as En}from"@galacticcouncil/descriptors";function qe(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var R=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(En)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");qe(n)&&console.log(t,...e)}};import{createClient as Cn}from"polkadot-api";import{withPolkadotSdkCompat as Dn}from"polkadot-api/polkadot-sdk-compat";var Mn=async u=>{let t=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)(t);return Cn(Dn(r))};var Xe={};w(Xe,{AAVE_GAS_LIMIT:()=>ue,AAVE_LENDING_POOL_ADDRESS:()=>Qt,AAVE_POOL_ABI:()=>le,AAVE_POOL_DATA_PROVIDER:()=>$t,AAVE_POOL_DATA_PROVIDER_ABI:()=>jt,AAVE_POOL_PROXY:()=>ce,AAVE_ROUNDING_THRESHOLD:()=>bs,AAVE_UINT_256_MAX:()=>Ln,AaveClient:()=>St,AaveUtils:()=>et});var le=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"to",type:"address"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"interestRateMode",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"address",name:"onBehalfOf",type:"address"}],name:"borrow",outputs:[],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getUserAccountData",outputs:[{internalType:"uint256",name:"totalCollateralBase",type:"uint256"},{internalType:"uint256",name:"totalDebtBase",type:"uint256"},{internalType:"uint256",name:"availableBorrowsBase",type:"uint256"},{internalType:"uint256",name:"currentLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"ltv",type:"uint256"},{internalType:"uint256",name:"healthFactor",type:"uint256"}],stateMutability:"view",type:"function"}];var jt=[{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 ce="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",$t="0x112b087b60C1a166130d59266363C45F8aa99db0",Qt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",ue=1000000n,bs=5,Ln=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var St=class{client;constructor(t){this.client=t.getWsProvider()}async getBlockTimestamp(){let t=await this.client.getBlock();return Number(t.timestamp)}async getReservesData(){return await this.client.readContract({abi:jt,address:$t,args:[Qt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:jt,address:$t,args:[Qt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:le,address:ce,args:[t],functionName:"getUserAccountData"})}};import j from"big.js";var f={};w(f,{asBigInt:()=>Gn,toBigInt:()=>Nn,toDecimal:()=>qn});import Z from"big.js";Z.NE=-18;function qn(u,t,e=6,n){let r=Z(u.toString()),i=Z(10).pow(t);return r.div(i).round(e,n).toString()}function Nn(u,t){let e=Z(10).pow(t),r=Z(u).mul(e).toFixed(0,Z.roundDown);return BigInt(r)}function Gn(u){return BigInt(u.round(0,Z.roundDown).toFixed(0))}var st={};w(st,{ERC20:()=>me});var me=class{static fromAssetId(t){let e=Buffer.alloc(20,0);return e[15]=1,e.writeUInt32BE(t,16),"0x"+e.toString("hex")}static toAssetId(t){let e=Buffer.from(t.replace("0x",""),"hex");return e.length!==20||!this.isAssetAddress(t)?null:e.readUInt32BE(16)}static isAssetAddress(t){let e=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(t.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(e.subarray(0,16))}};var v={};w(v,{FeeUtils:()=>ye,shiftNeg:()=>Hn});import Wn from"big.js";var Ge={};w(Ge,{HUB_ASSET_ID:()=>ge,HYDRATION_OMNIPOOL_ADDRESS:()=>Vn,HYDRATION_PARACHAIN_ID:()=>Un,HYDRATION_SS58_PREFIX:()=>D,PERBILL_DENOMINATOR:()=>pe,PERMILL_DENOMINATOR:()=>Tt,RUNTIME_DECIMALS:()=>I,SYSTEM_ASSET_DECIMALS:()=>de,SYSTEM_ASSET_ID:()=>E,TRADEABLE_DEFAULT:()=>at});var I=18,Tt=1e6,pe=1e9,E=0,de=12,Un=2034,D=63,Vn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",ge=1,at=15;var ye=class u{static toPct(t){let[e,n]=t;return u.safeDivide(e*100,n)}static toRaw(t){let[e,n]=t;return u.safeDivide(e,n)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,n=12){let r=10**n;return Math.round(t*r/e)/r}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Hn(u,t){let e=Wn(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Jt={};w(Jt,{H160:()=>he,isEvmAccount:()=>Ve,isEvmAddress:()=>We,isSs58Address:()=>He});import{AccountId as wt}from"polkadot-api";import{toHex as Ue}from"@polkadot-api/utils";import{Buffer as z}from"buffer";var be="ETH\0";function Ve(u){if(!u)return!1;try{let t=wt().enc(u),e=z.from(be);return z.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function We(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function He(u){try{return wt(63).enc(u),!0}catch{return!1}}var he=class u{static toAccount=t=>{let e=z.from(t.slice(2),"hex"),n=z.from(be),r=Uint8Array.from(z.concat([n,e,z.alloc(8)])),i=Ue(r);return wt(63).dec(i)};static fromAccount=t=>{let e=wt().enc(t),n=z.from(be),r=e.slice(n.length,-8);return"0x"+z.from(r).toString("hex")};static fromSS58=t=>{let n=wt().enc(t).slice(0,20);return Ue(n)};static fromAny=t=>{if(We(t))return t;if(Ve(t))return u.fromAccount(t);if(He(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var tt={};w(tt,{findNestedKey:()=>Yn,findNestedObj:()=>Xn,jsonFormatter:()=>Kn});var Yn=(u,t)=>{let e=[];return JSON.stringify(u,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},Xn=(u,t,e)=>{let n;return JSON.stringify(u,(r,i)=>(i&&i[t]===e&&(n=i),i)),n},Kn=(u,t)=>typeof t=="bigint"?t.toString():t;var O={};w(O,{calculateBuyFee:()=>Qn,calculateDiffToAvg:()=>zn,calculateDiffToRef:()=>jn,calculateSellFee:()=>$n,getFraction:()=>Jn});import Y from"big.js";function zn(u,t){let e=Y(u.toString()),n=Y(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function jn(u,t){if(t===0n)return 0;let e=Y(u.toString()),n=Y(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function $n(u,t){let e=Y(u.toString()),n=Y(t.toString());return Y(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Qn(u,t){let e=Y(u.toString());return Y(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Jn(u,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),r=BigInt(t*n);return u*r/BigInt(100*n)}var Ye={};w(Ye,{convertToId:()=>tr});import{Buffer as Zn}from"buffer";function tr(u){let e=Zn.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Zt}=st,{H160:Pe}=Jt,er=1.01,nr=31536000n,te=10n**27n,et=class{client;constructor(t){this.client=new St(t)}async getSummary(t){let e=Pe.fromAny(t),[n,r,i,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e),this.client.getBlockTimestamp()]),[s]=n,[o,l]=r,[c,m,d,p,g,b]=i,y=f.toDecimal(b,18),h=[];for(let P of o){let S=P.underlyingAsset.toLowerCase(),T=s.find(({underlyingAsset:oe})=>oe.toLowerCase()===S);if(!T)throw new Error("Missing pool reserve for "+S);let k=P.scaledATokenBalance,M=T.liquidityIndex,A=T.liquidityRate,F=T.availableLiquidity,V=T.priceInMarketReferenceCurrency,W=a+6,L=this.calculateLinearInterest(A,T.lastUpdateTimestamp,W),K=M*L/te,ft=k*K/te,Xt=Number(l!==0&&l===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,Kt=T.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,zt=Zt.toAssetId(S);h.push({aTokenBalance:ft,availableLiquidity:F,decimals:Number(T.decimals),isCollateral:Kt,priceInRef:V,reserveId:zt,reserveAsset:S,reserveLiquidationThreshold:Xt})}return{healthFactor:Number(y),totalCollateral:c,totalDebt:m,reserves:h}}async hasBorrowPositions(t){let e=Pe.fromAny(t),n=await this.client.getUserAccountData(e),[r,i]=n;return i>0n}async getHealthFactor(t){let e=Pe.fromAny(t),n=await this.client.getUserAccountData(e),[r,i,a,s,o,l]=n,c=f.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:r,totalDebt:i,reserves:a}=await this.getSummary(t),s=Zt.fromAssetId(e),o=a.find(h=>h.reserveAsset===s);if(!o)throw new Error("Missing reserve ctx for "+s);let{decimals:l,isCollateral:c,priceInRef:m,reserveLiquidationThreshold:d}=o,p=f.toBigInt(n,l),g=c?p*m/10n**BigInt(l):0n,b=r-g;if(b<=0n)return 0;let y=j(b.toString()).mul(d).div(i.toString()).toFixed(6,j.roundDown);return Number(y)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:i,reserves:a}=await this.getSummary(t),s=Zt.fromAssetId(e),o=a.find(y=>y.reserveAsset===s);if(!o)throw new Error("Missing reserve ctx for "+s);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:m}=o,p=f.toBigInt(n,l)*c/10n**BigInt(l),g=r+p;if(g<=0n)return 0;let b=j(g.toString()).mul(m).div(i.toString()).toFixed(6,j.roundDown);return Number(b)}async getMaxWithdraw(t,e){let{totalDebt:n,reserves:r,healthFactor:i}=await this.getSummary(t),a=Zt.fromAssetId(e),s=r.find(o=>o.reserveAsset===a);if(!s)throw new Error("Missing reserve ctx for "+a);return this.calculateWithdrawMax(s,n,i)}async getMaxWithdrawAll(t){let{totalDebt:e,reserves:n,healthFactor:r}=await this.getSummary(t),i={};for(let a of n){let s=this.calculateWithdrawMax(a,e,r);a.reserveId&&(i[a.reserveId]=s)}return i}calculateWithdrawMax(t,e,n){let{aTokenBalance:r,availableLiquidity:i,decimals:a,priceInRef:s,reserveLiquidationThreshold:o,isCollateral:l}=t,c=r;if(l&&e>0n){let d=n-er;if(d>0){let p=j(d).mul(e.toString()).div(o).toFixed(0,j.roundDown),g=j(p).div(s.toString()).mul(10**a).toFixed(0,j.roundDown);c=r<BigInt(g)?r:BigInt(g)}else c=0n}return{amount:c<i?c:i,decimals:a}}calculateLinearInterest(t,e,n){let r=n-e;if(r<=0)return te;let i=t*BigInt(r)/nr;return te+i}};var je={};w(je,{AssetClient:()=>ot,BalanceClient:()=>H,ChainParams:()=>ct});var ot=class extends R{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(t){super(t)}async queryShares(){let e=await this.api.query.Stableswap.Pools.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:r}=n;return this.SUPPORTED_TYPES.includes(r.type)}).map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async mapToken(t,e,n,r){let{name:i,asset_type:a,is_sufficient:s,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:i?.asText(),symbol:l,decimals:c,icon:l,type:a.type,isSufficient:s,location:r,existentialDeposit:o}}async mapBond(t,e,n,r){let[i,a]=r,{asset_type:s,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:m}=await this.mapToken(i,e,n),d=Number(a),p=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",p.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:m,icon:c,type:s.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:i,maturity:d}}async mapShares(t,e,n,r){let{assets:i}=r,{name:a,symbol:s,asset_type:o,is_sufficient:l,existential_deposit:c}=e,m=await Promise.all(i.map(async g=>{let{symbol:b}=await this.mapToken(g,e,n);return[g,b]})),d=Object.fromEntries(m),p=Object.values(d);return{id:t,name:p.join(", "),symbol:s?.asText()||a?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:d}}async mapExternal(t,e,n,r){let i=await this.mapToken(t,e,new Map,r),a=n?.find(s=>s.internalId===i.id);return a?{...i,decimals:a.decimals,name:a.name,symbol:a.symbol,icon:a.symbol,isWhiteListed:a.isWhiteListed}:i}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,r,i,a]=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 m=r.get(l),{asset_type:d}=c,p;switch(d.type){case"Bond":let g=a.get(l);p=await this.mapBond(l,c,s,g);break;case"StableSwap":let b=i.get(l);p=await this.mapShares(l,c,s,b);break;case"External":p=await this.mapExternal(l,c,e,m);break;default:p=await this.mapToken(l,c,s,m)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};import{Subject as rr,bufferCount as ir,combineLatest as sr,debounceTime as ar,distinctUntilChanged as Ke,finalize as or,map as lt,pairwise as lr,shareReplay as cr,startWith as ur}from"rxjs";var H=class extends R{constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getTokenBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:n}=await e.getValue(t);return this.calculateBalance(n)}async getTokenBalance(t,e){let r=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(r)}calculateBalance(t){let e=t.free>=t.frozen?t.free-t.frozen:0n,n=t.free+t.reserved;return{free:t.free,reserved:t.reserved,frozen:t.frozen,total:n,transferable:e}}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),r=this.subscribeErc20Balance(t);return sr([e,n,r]).pipe(ar(250),lt(i=>i.flat()),ur([]),ir(2,1),lt(([i,a],s)=>{if(s===0)return a;let o=i.reduce((c,m)=>(c.set(m.id,m.balance),c),new Map);return a.filter(c=>!ze(c.balance,o.get(c.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe(lt(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(lt(r=>({id:e,balance:r})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(Ke((n,r)=>!r.deltas),lt(({deltas:n})=>{let r=[];return n?.deleted.forEach(i=>{let[a,s]=i.args;r.push({id:s,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(i=>{let[a,s]=i.args;r.push({id:s,balance:this.calculateBalance(i.value)})}),r}))}subscribeErc20Balance(t,e){let n=new rr,r=n.pipe(cr(1)),i=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}),a=async()=>{let o=e||await i(),l=async()=>{let d=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,balance:g}));n.next(d)};await l();let c=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>c.unsubscribe()},s;return a().then(o=>s=o),r.pipe(or(()=>s?.()),lr(),lt(([o,l],c)=>{if(c===0)return l;let m=o.reduce((p,g)=>(p.set(g.id,g.balance),p),new Map);return l.filter(p=>!ze(p.balance,m.get(p.id)))}),Ke((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},ze=(u,t)=>u!==void 0&&t!==void 0&&u.transferable===t.transferable&&u.total===t.total;var ct=class extends R{_minOrderBudget;_blockTime;constructor(t){super(t)}async getBlockTime(){if(this._blockTime===void 0){let t=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(t)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};var $e={};w($e,{AssetNotFound:()=>fe,PoolNotFound:()=>xt,RouteNotFound:()=>It});var fe=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},xt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},It=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var Ze={};w(Ze,{EvmClient:()=>vt,createChain:()=>Se});import{defineChain as mr}from"viem";var pr=["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"],Se=()=>mr({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:pr}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});import{createPublicClient as Qe,createWalletClient as dr,custom as Je,http as gr}from"viem";var vt=class{client;chain;constructor(t){this.client=t,this.chain=Se()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return Qe({chain:this.chain,transport:gr()})}getWsProvider(){return Qe({transport:Je({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return dr({account:t,chain:this.chain,transport:Je(window.ethereum)})}};var an={};w(an,{LiquidityMiningApi:()=>Ot,LiquidityMiningClient:()=>At});import{AccountId as Sr}from"polkadot-api";import C from"big.js";import{fixed_from_rational as sn}from"@galacticcouncil/math-liquidity-mining";var ee=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let n=0;n<t.length;++n){let[r,i]=t[n];this.result.set(this.getKey(i,r),e[n].free)}}freeBalance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,n,r){let i=this.getKey(t,e),a=this.getKey(t,n),s=this.result.get(i)??0n,o=this.result.get(a)??0n;if(s<r)throw new Error("Attempting to transfer more than is present");this.result.set(i,s+r),this.result.set(a,o+r)}};import nt from"big.js";import{calculate_accumulated_rps as yr,calculate_global_farm_rewards as br,calculate_loyalty_multiplier as hr,calculate_user_reward as rn,calculate_yield_farm_delta_rpvs as Pr}from"@galacticcouncil/math-liquidity-mining";import tn from"big.js";var Te=tn(10).pow(18),en=BigInt(tn(1).pow(18).toString()),nn=6e3;var fr="1000000000000000000",ne=class{constructor(t,e,n){this.getAccount=t;this.getAsset=e;this.multiCurrency=n}async syncGlobalFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===e)return null;if(t.total_shares_z===0n)return t;let r=await this.getAsset(t.reward_currency),i=e-t.updated_at,a=this.getAccount(t.id),s=r?.existential_deposit;if(!s)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.freeBalance(t.reward_currency,a),l=nt(s.toString()),c=nt(o.toString()).minus(l.lt(o.toString())?s.toString():o.toString()),m=nt(br(t.total_shares_z.toString(),n.toString(),nt(t.yield_per_period.toString()).mul(Te).round(0,nt.roundDown).toFixed(),t.max_reward_per_period.toString(),i.toFixed()));if(c.lt(m)&&(m=c),m.eq(0))return t;let d=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,a,d,BigInt(m.toFixed())),{...t,accumulated_rpz:BigInt(yr(t.accumulated_rpz.toString(),t.total_shares_z.toString(),m.toFixed()))}}syncYieldFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===n)return null;if(t.total_valued_shares===0n)return{...t,updated_at:n};let r=Pr(t.accumulated_rpz.toString(),e.accumulated_rpz.toString(),t.multiplier.toString(),t.total_valued_shares.toString());return{...t,accumulated_rpvs:t.accumulated_rpvs+BigInt(r),updated_at:n}}getLoyaltyMultiplier(t,e){let n=nt(1).mul(Te).round(0,nt.roundDown).toString();if(!e)return n;let{initial_reward_percentage:r,scale_coef:i}=e;return hr(t.toFixed(),r.toString(),i.toFixed())}async claimRewards(t,e,n,r,i){if(e.state.type==="Terminated")return null;let a=Math.floor(r/t.blocks_per_period);if(n.updated_at===a)return null;let s=await this.syncGlobalFarm(t,a,i);if(!s)return null;let o=this.syncYieldFarm(e,s,a);if(!o)return null;let l=o.total_stopped-n.stopped_at_creation,c=o.updated_at-n.entered_at-l,m=this.getLoyaltyMultiplier(c,o.loyalty_curve),d=BigInt(rn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),m)),p=BigInt(rn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),fr));return{reward:d,maxReward:p,assetId:s.reward_currency}}};var Tr=C(365.2425).times(24).times(60).times(60),Ot=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??nn})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((i,a)=>i-a);if(t===e)return en;let r=await this.client.getOraclePrice(n);if(r){let{n:i,d:a}=r[0].price,s;return t<e?s=sn(i.toString(),a.toString()):s=sn(a.toString(),i.toString()),BigInt(s)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),r=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),i=Buffer.from([t]),a=Buffer.concat([n,r,i]),o="0x"+Buffer.concat([a,Buffer.alloc(32-a.length)]).toString("hex");return Sr(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let i=C(r).times(t.toString()).times(e.toString()).div(18);return i.gte(n.toString())?n.toString():i.toString()}getPoolYieldPerPeriod(t,e,n,r){let i=C(t.toString()).times(e),a=C(n.toString()).times(r);return i.div(a.toString()).toString()}farmData(t,e,n){let{yieldFarm:r,globalFarm:i,priceAdjustment:a,balance:s,id:o}=t,{multiplier:l,loyalty_curve:c}=r,{blocks_per_period:m,yield_per_period:d,total_shares_z:p,max_reward_per_period:g,pending_rewards:b,accumulated_paid_rewards:y,planned_yielding_periods:h,updated_at:P,incentivized_asset:S,reward_currency:T,price_adjustment:k,min_deposit:M}=i,A=v.shiftNeg(a??k,18),F=v.shiftNeg(l,18),V=v.shiftNeg(c?.initial_reward_percentage??0,18),W=Tr.div(C(this.blockTime).div(1e3).times(m)).toString(),L;if(p<=0)L=C(F).times(d.toString()).times(W).toString();else{let Rn=this.getGlobalRewardPerPeriod(p,d,g,A),Fn=this.getPoolYieldPerPeriod(Rn,F,p,A);L=C(Fn).times(W).toString()}let K=b+y,ft=g*BigInt(h),J=s.transferable+K,Me=J-K,Xt=C(Me.toString()).div(g.toString()),Kt=C(e).div(m.toString()).toString(),zt=(p>=0?Xt.plus(P):Xt.plus(Kt)).toString(),oe=C(zt).times(m).toString(),Bn=C(p.toString()).div(C(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(A).toFixed(2),Le=C(K.toString()).div(J.toString()).gte(.999);L=Le?"0":C(L).div(n?2:1).times(100).toString();let _n=V?C(L).times(V).toString():void 0;return{apr:L,minApr:_n,isDistributed:Le,estimatedEndPeriod:zt,estimatedEndBlock:oe,maxRewards:ft,incentivizedAsset:S,rewardCurrency:T,loyaltyCurve:c,currentPeriod:Kt,potMaxRewards:J,fullness:Bn,yieldFarmId:r.id,globalFarmId:i.id,poolId:o,distributedRewards:K,plannedYieldingPeriods:h,minDeposit:M}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((r,i)=>r.includes(i.keyArgs[0].toString())?r:[...r,i.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async r=>{let i=await this.getOmnipoolFarms(r);if(i)return[r,i]}));return Object.fromEntries(n.filter(r=>!!r))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:i,value:a})=>{let[,s]=i,o=a,l=await this.client.getOmnipoolGlobalFarm(s),c=await this.client.getOmnipoolYieldFarm(Number(t),s,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(s),g=await this.getOraclePrice(m,d),b=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b}}));return n?r.map(i=>i?this.farmData(i,n):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((r,i)=>r.includes(i.keyArgs[0].toString())?r:[...r,i.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async r=>{let i=await this.getIsolatedFarms(r);if(i)return[r,i]}));return Object.fromEntries(n.filter(r=>!!r))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:i,value:a})=>{let[,s]=i,o=a,l=await this.client.getIsolatedGlobalFarm(s),c=await this.client.getIsolatedYieldFarm(t,s,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(s,!0),g=await this.getOraclePrice(m,d),b=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b,farmAddress:p}}));return n?r.map(i=>i?this.farmData(i,n,!0):void 0):[]}async getDepositReward(t,e,n,r){let i=e.global_farm_id,a=e.yield_farm_id,s=n?await this.client.getIsolatedYieldFarm(t,i,a):await this.client.getOmnipoolYieldFarm(Number(t),i,a),o=n?await this.client.getIsolatedGlobalFarm(i):await this.client.getOmnipoolGlobalFarm(i);if(!o||!s)return;let l=o.reward_currency,c=o.incentivized_asset,m=[[this.getFarmAddress(0,n),o.reward_currency],[this.getFarmAddress(o.id,n),o.reward_currency]],d=await this.getAccountAssetBalances(m),p=await this.getOraclePrice(l,c),g=new ee(m,d),y=await new ne(P=>this.getFarmAddress(P),P=>this.client.getAsset(P),g).claimRewards(o,s,e,r,p??o.price_adjustment);if(!y)return;let h=await this.client.getAsset(y.assetId);if(h&&!(y.reward<=h.existential_deposit))return y}async getAccountAssetBalances(t){let[e,n]=await Promise.all([Promise.all(t.filter(([i,a])=>a!==0).map(([i,a])=>this.balanceClient.getTokenBalance(i,a))),Promise.all(t.filter(([i,a])=>a===0).map(([i])=>this.balanceClient.getSystemBalance(i)))]),r=[];for(let i=0,a=0;i+a<t.length;){let s=i+a,[,o]=t[s];o===0?(r.push(n[a]),a+=1):(r.push(e[i]),i+=1)}return r}};import{Binary as wr,Enum as xr}from"polkadot-api";var At=class extends R{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(wr.fromText("omnipool"),t,xr("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getAllOmnipooFarms(){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries()}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,n){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,n)}async getAllIsolatedFarms(){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries()}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,n){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,n)}async getAsset(t){return this.api.query.AssetRegistry.Assets.getValue(t)}};var bn={};w(bn,{PoolContextProvider:()=>dt,PoolError:()=>rt,PoolFactory:()=>pt,PoolType:()=>B,aave:()=>Ae,lbp:()=>xe,omni:()=>Ie,stable:()=>ve,xyk:()=>Oe});var xe={};w(xe,{LbpMath:()=>U,LbpPool:()=>Bt,LbpPoolClient:()=>Rt});import{calculate_in_given_out as Ir,calculate_out_given_in as vr,calculate_linear_weights as Or,calculate_pool_trade_fee as Ar,get_spot_price as Br}from"@galacticcouncil/math-lbp";var U=class{static getSpotPrice(t,e,n,r,i){return Br(t,e,n,r,i)}static calculateInGivenOut(t,e,n,r,i){return Ir(t,e,n,r,i)}static calculateOutGivenIn(t,e,n,r,i){return vr(t,e,n,r,i)}static calculateLinearWeights(t,e,n,r,i){return Or(t,e,n,r,i)}static calculatePoolTradeFee(t,e,n){return Ar(t,e,n)}};var B=(i=>(i.Aave="Aave",i.LBP="LBP",i.Omni="Omnipool",i.Stable="Stableswap",i.XYK="XYK",i))(B||{}),rt=(i=>(i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i.UnknownError="UnknownError",i))(rt||{});var{FeeUtils:on}=v,Bt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,r,i,a,s){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i,this.fee=a,this.repayFeeApply=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:i.balance,decimalsIn:r.decimals,decimalsOut:i.decimals,weightIn:r.weight,weightOut:i.weight}}validateAndBuy(t,e,n){let r=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let a=t.balanceOut/this.maxOutRatio;if(e>a&&i.push("MaxOutRatioExceeded"),r===t.assetOut){let s=this.calculateTradeFee(e,n),o=on.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+s,c=this.calculateInGivenOut(t,l),m=t.balanceIn/this.maxInRatio;return c>m&&i.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:i}}else{let s=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return s>o&&i.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:i}}}validateAndSell(t,e,n){let r=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let a=t.balanceIn/this.maxInRatio;if(e>a&&i.push("MaxInRatioExceeded"),r===t.assetIn){let s=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return s>o&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:i}}else{let s=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(s,n),l=on.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=s-o,m=t.balanceOut/this.maxOutRatio;return c>m&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:c,feePct:l,errors:i}}}calculateInGivenOut(t,e){let n=U.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=U.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=U.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=U.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=U.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Dr}from"polkadot-api";import{map as Mr,of as pn,switchMap as Lr}from"rxjs";import{memoize1 as _r}from"@thi.ng/memoize";import{combineLatest as ln,combineLatestAll as Rr,debounceTime as Fr,firstValueFrom as kr,from as cn,map as un,mergeAll as Er,of as Cr,switchMap as mn}from"rxjs";var we=[{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"description",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"version",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint80",name:"_roundId",type:"uint80"}],name:"getRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"},{inputs:[],name:"latestRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"}];var _t=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,r,i]=await Promise.all([this.client.readContract({abi:we,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:we,address:t,functionName:"decimals"}),this.client.getBlock()]),[a,s,o,l]=n,c=i.number-(i.timestamp-l)/BigInt(e),m=Number(c);return{price:s,decimals:r,updatedAt:m<0?0:m}}};var q=class extends H{evm;mmOracle;override=[];mem=0;memPools=_r(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new _t(e)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=cn(this.getPoolsMem()).pipe(mn(e=>this.subscribe(e)),Rr());return kr(t)}getSubscriber(){return cn(this.getPoolsMem()).pipe(mn(t=>this.subscribe(t)),Er())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>ln([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe(Fr(250),un(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return Cr([]);let e=[this.subscribeTokensBalance(t.address)];if(this.hasSystemAsset(t)){let n=this.subscribeSystemBalance(t.address);e.push(n)}if(this.hasErc20Asset(t)){let n=t.tokens.filter(i=>i.type==="Erc20").map(i=>i.id),r=this.subscribeErc20Balance(t.address,n);e.push(r)}return ln(e).pipe(un(n=>n.map(r=>Array.isArray(r)?r:[r]).flat()))}hasSystemAsset(t){return t.tokens.some(e=>e.id===0)}hasErc20Asset(t){return t.tokens.some(e=>e.type==="Erc20")}hasValidAssets(t){return t.tokens.every(({id:e,decimals:n,balance:r})=>{let i=this.override.find(s=>s.id===e),a=!!n||!!i?.decimals;return r>0n&&a})}updatePool=(t,e)=>{let n=t.tokens.map(r=>{let i=e.find(s=>s.id===r.id),a=this.override.find(s=>s.id===r.id);return i?{...r,balance:i.balance.transferable,decimals:r.decimals||a?.decimals}:{...r,decimals:r.decimals||a?.decimals}});return{...t,tokens:n}}};var Rt=class extends q{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),r=e?.relay_parent_number||0,i=t.filter(({value:a})=>e&&this.isActivePool(a,r)).map(async({keyArgs:a,value:s})=>{let[o]=a,l=o.toString(),c=await this.getPoolDelta(l,s,r);return{address:l,type:"LBP",fee:s.fee,...c,...n}});return Promise.all(i)}async getPoolDelta(t,e,n){let{start:r,end:i,assets:a,initial_weight:s,final_weight:o,repay_target:l,fee_collector:c}=e,m=U.calculateLinearWeights(r?r.toString():"0",i?i.toString():"0",s.toString(),o.toString(),n.toString()),[d,p]=a,g=BigInt(m),b=this.MAX_FINAL_WEIGHT-BigInt(g),[y,h,P,S,T]=await Promise.all([this.isRepayFeeApplied(d,l,c.toString()),this.getBalance(t,d),this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(t,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:y,tokens:[{id:d,decimals:P?.decimals,existentialDeposit:P?.existential_deposit,balance:h.transferable,weight:g,type:P?.asset_type.type},{id:p,decimals:T?.decimals,existentialDeposit:T?.existential_deposit,balance:S.transferable,weight:b,type:T?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:r}=t;return n&&r?e>=n&&e<r:!1}async isRepayFeeApplied(t,e,n){if(e===0n)return!1;try{return(await this.getBalance(n,t)).transferable<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t){return{repayFee:await this.getRepayFee(),exchangeFee:t.fee}}getPoolType(){return"LBP"}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(Dr.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe(Lr(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):pn(t)),Mr(r=>Object.assign({},t,r))):pn(t)}};var Ie={};w(Ie,{OmniMath:()=>x,OmniPool:()=>Ft,OmniPoolClient:()=>kt});import{calculate_in_given_out as qr,calculate_lrna_in_given_out as Nr,calculate_out_given_in as Gr,calculate_out_given_lrna_in as Ur,calculate_spot_price as Vr,calculate_lrna_spot_price as Wr,calculate_shares as Hr,calculate_liquidity_out as Yr,calculate_liquidity_lrna_out as Xr,verify_asset_cap as Kr,calculate_liquidity_hub_in as zr,is_sell_allowed as jr,is_buy_allowed as $r,is_add_liquidity_allowed as Qr,is_remove_liquidity_allowed as Jr}from"@galacticcouncil/math-omnipool";import ut from"big.js";var x=class{static calculateSpotPrice(t,e,n,r){return Vr(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return Wr(t,e)}static calculateInGivenOut(t,e,n,r,i,a,s,o,l){return qr(t,e,n,r,i,a,s,o,l)}static calculateLrnaInGivenOut(t,e,n,r,i){return Nr(t,e,n,r,i)}static calculateOutGivenIn(t,e,n,r,i,a,s,o,l){return Gr(t,e,n,r,i,a,s,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,i){return Ur(t,e,n,r,i)}static calculateShares(t,e,n,r){return Hr(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,i,a,s,o){return Yr(t,e,n,r,i,a,s,o)}static calculateLiquidityLRNAOut(t,e,n,r,i,a,s,o){return Xr(t,e,n,r,i,a,s,o)}static calculateCapDifference(t,e,n,r){let i=ut(e),a=ut(t),s=ut(r),o=ut(n),l=ut(10).pow(18),c=o.div(l);if(i.div(s).lt(c)){let d=c.times(s).minus(i).times(a),p=i.times(ut(1).minus(c));return d.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return Kr(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return zr(t,e,n,r)}static isSellAllowed(t){return jr(t)}static isBuyAllowed(t){return $r(t)}static isAddLiquidityAllowed(t){return Qr(t)}static isRemoveLiquidityAllowed(t){return Jr(t)}};var{FeeUtils:mt}=v,Ft=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,r,i,a){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i,this.hubAssetId=a}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:r.hubReserves,hubReservesOut:i.hubReserves,sharesIn:r.shares,sharesOut:i.shares,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:r.balance,balanceOut:i.balance,tradeableIn:r.tradeable,tradeableOut:i.tradeable,assetInEd:r.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,n),a=r===0n?0:O.calculateDiffToRef(i,r),s=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&s.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&s.push("MaxOutRatioExceeded");let m=t.balanceIn/this.maxInRatio;return i>m&&s.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:r,amountOut:e,feePct:a,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,n),a=O.calculateDiffToRef(r,i),s=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&s.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&s.push("MaxInRatioExceeded");let m=t.balanceOut/this.maxOutRatio;return i>m&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:i,feePct:a,errors:s}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let r=x.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?mt.toRaw(n.assetFee).toString():"0",n?mt.toRaw(n.protocolFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateLrnaInGivenOut(t,e,n){let r=x.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?mt.toRaw(n.assetFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let r=x.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?mt.toRaw(n.assetFee).toString():"0",n?mt.toRaw(n.protocolFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateOutGivenLrnaIn(t,e,n){let r=x.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?mt.toRaw(n.assetFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=x.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=x.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=x.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=x.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as Zr,CompatibilityLevel as ti}from"polkadot-api";import{toHex as ei}from"@polkadot-api/utils";import{distinctUntilChanged as ni,map as dn}from"rxjs";var{FeeUtils:$}=v,kt=class extends q{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,r,i,a,s]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:c,value:m})=>{let[d]=c,{hub_reserve:p,shares:g,tradable:b,cap:y,protocol_shares:h}=m,[P,S]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:P?.decimals,existentialDeposit:P?.existential_deposit,balance:S.transferable,cap:y,hubReserves:p,protocolShares:h,shares:g,tradeable:b,type:P?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:a.transferable,tradeable:r,type:i?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...s}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=ei(e);return Zr(63).dec(n)}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t,e){let[n,r,i]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),a=n.min_fee+r.min_fee,s=n.max_fee+r.max_fee;if(i){let{asset_fee:o,protocol_fee:l}=i;return{assetFee:$.fromPermill(o),protocolFee:$.fromPermill(l),min:$.fromPermill(a),max:$.fromPermill(s)}}else return{assetFee:$.fromPermill(n.min_fee),protocolFee:$.fromPermill(r.min_fee),min:$.fromPermill(a),max:$.fromPermill(s)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(ti.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(ni((n,r)=>!r.deltas),dn(({entries:n})=>n.map(r=>{let[i]=r.args,{hub_reserve:a,shares:s,tradable:o,cap:l,protocol_shares:c}=r.value,m=t.tokens.findIndex(p=>p.id===i);return{...t.tokens[m],cap:l,hubReserves:a,protocolShares:c,shares:s,tradeable:o}})),dn(n=>{let r=t.tokens.find(i=>i.id===1);return{...t,tokens:[...n,r]}}))}};var ve={};w(ve,{StableMath:()=>_,StableSwap:()=>Et,StableSwapClient:()=>Ct});import{calculate_in_given_out as ri,calculate_out_given_in as ii,calculate_amplification as si,calculate_add_one_asset as ai,calculate_liquidity_out_one_asset as oi,calculate_shares as li,calculate_shares_for_amount as ci,calculate_spot_price_with_fee as ui,pool_account_name as mi,recalculate_peg as pi}from"@galacticcouncil/math-stableswap";var _=class{static getPoolAddress(t){return mi(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,r,i){return si(t,e,n,r,i)}static calculateInGivenOut(t,e,n,r,i,a,s){return ri(t,e,n,r,i,a,s)}static calculateAddOneAsset(t,e,n,r,i,a,s){return ai(t,e,n,r,i,a,s)}static calculateSharesForAmount(t,e,n,r,i,a,s){return ci(t,e,n,r,i,a,s)}static calculateOutGivenIn(t,e,n,r,i,a,s){return ii(t,e,n,r,i,a,s)}static calculateLiquidityOutOneAsset(t,e,n,r,i,a,s){return oi(t,e,n,r,i,a,s)}static calculateShares(t,e,n,r,i,a){return li(t,e,n,r,i,a)}static calculateSpotPriceWithFee(t,e,n,r,i,a,s,o){return ui(t,e,n,r,i,a,s,o)}static recalculatePegs(t,e,n,r,i){let a=pi(t,e,n,r,i);return JSON.parse(a)}};var{FeeUtils:Q}=v,Et=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.id,t.fee,t.totalIssuance)}constructor(t,e,n,r,i,a,s,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i,this.amplification=a,this.id=s,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:i.balance,decimalsIn:r.decimals,decimalsOut:i.decimals,tradeableIn:this.id===t?15:r.tradeable,tradeableOut:this.id===e?15:i.tradeable,assetInEd:r.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,n),a=Q.toPct(n.fee),s=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&s.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:r,amountOut:e,feePct:a,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,n),a=Q.toPct(n.fee),s=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&s.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:r,amountOut:i,feePct:a,errors:s}}calculateIn(t,e,n){let r=_.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?Q.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateAddOneAsset(t,e,n){let r=_.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?Q.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateSharesForAmount(t,e,n){let r=_.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?Q.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=_.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let r=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let r=_.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?Q.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateWithdrawOneAsset(t,e,n){let r=_.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?Q.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateShares(t,e,n){let r=_.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?Q.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=_.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let r=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=_.defaultPegs(this.tokens.length-1);return JSON.stringify(t)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:r})=>({asset_id:e,amount:n,decimals:r}));return JSON.stringify(t,tt.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],tt.jsonFormatter)}};import{AccountId as di,CompatibilityLevel as gi}from"polkadot-api";import{toHex as yi}from"@polkadot-api/utils";import{blake2b as bi}from"@noble/hashes/blake2b";import{map as hi,of as Pi,switchMap as fi}from"rxjs";var{FeeUtils:it}=v,Ct=class extends q{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=_.getPoolAddress(t),n=bi(e,{dkLen:32}),r=yi(n);return di(63).dec(r)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolDelta(t,e,n){let{initial_amplification:r,final_amplification:i,initial_block:a,final_block:s}=e,o=_.calculateAmplification(r.toString(),i.toString(),a.toString(),s.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),r=e.assets.map(async i=>{let[a,s,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,i),this.api.query.AssetRegistry.Assets.getValue(i),this.getBalance(n,i)]);return{id:i,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:o.transferable,tradeable:a,type:s?.asset_type.type}});return Promise.all(r)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(gi.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),r=t.map(async({keyArgs:i,value:a})=>{let[s]=i,o=this.getPoolAddress(s),[l,c,m]=await Promise.all([this.getPoolDelta(s,a,e),this.getPoolTokens(s,a),this.getPoolPegs(s,a,e)]);return c.push({id:s,tradeable:15,balance:l.totalIssuance,decimals:18}),this.poolsData.set(o,a),{address:o,id:s,type:"Stableswap",fee:it.fromPermill(a.fee),tokens:c,...l,...m,...n}});return Promise.all(r)}async getPoolFees(t){return{fee:t.fee}}async getPoolPegs(t,e,n){let r=await this.api.query.Stableswap.PoolPegs.getValue(t);if(!r)return this.getDefaultPegs(e);let i=await this.getLatestPegs(e,r,n),a=this.getRecentPegs(r),s=it.fromPermill(r.max_peg_update),o=it.fromPermill(e.fee),[l,c]=_.recalculatePegs(JSON.stringify(a),JSON.stringify(i),n.toString(),it.toRaw(s).toString(),it.toRaw(o).toString()),m=Number(l)*1e6;return{pegsFee:it.fromPermill(m),pegs:c}}getDefaultPegs(t){let e=t.fee,n=_.defaultPegs(t.assets.length);return{pegsFee:it.fromPermill(e),pegs:n}}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,r])=>r.map(i=>i.toString()))}async getLatestPegs(t,e,n){let{source:r}=e,i=Array.from(t.assets.entries()).map(([s,o])=>o),a=r.map(async(s,o)=>{if(s.type==="Oracle"){let[l,c,m]=s.value,d=[m,i[o]].sort((P,S)=>P-S),p=await this.api.query.EmaOracle.Oracles.getValue(l,d,c);if(!p)return;let[{price:g,updated_at:b}]=p,y=g.n.toString(),h=g.d.toString();return m.toString()===d[0].toString()?[[y,h],b.toString()]:[[h,y],b.toString()]}else if(s.type==="MMOracle"){let l=s.value.asHex(),{price:c,decimals:m,updatedAt:d}=await this.mmOracle.getData(l),p=10**m;return[[c.toString(),p.toString()],d.toString()]}else return[s.value.map(l=>l.toString()),n.toString()]});return Promise.all(a)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?Pi(t):e.watchValue("best").pipe(fi(r=>Promise.all([this.getPoolDelta(t.id,n,r),this.getPoolPegs(t.id,n,r)])),hi(([r,i])=>{let a=t.tokens.map(s=>s.id===t.id?{...s,balance:r.totalIssuance}:s);return Object.assign(t,{tokens:a},r,i)}))}};var Oe={};w(Oe,{XykMath:()=>X,XykPool:()=>Dt,XykPoolClient:()=>Mt});import{calculate_in_given_out as Si,calculate_out_given_in as Ti,calculate_pool_trade_fee as wi,get_spot_price as xi,calculate_liquidity_in as Ii,calculate_shares as vi,calculate_spot_price as Oi,calculate_spot_price_with_fee as Ai,calculate_liquidity_out_asset_a as Bi,calculate_liquidity_out_asset_b as _i}from"@galacticcouncil/math-xyk";var X=class{static getSpotPrice(t,e,n){return xi(t,e,n)}static calculateInGivenOut(t,e,n){return Si(t,e,n)}static calculateOutGivenIn(t,e,n){return Ti(t,e,n)}static calculatePoolTradeFee(t,e,n){return wi(t,e,n)}static calculateLiquidityIn(t,e,n){return Ii(t,e,n)}static calculateSpotPrice(t,e){return Oi(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return Ai(t,e,n,r)}static calculateShares(t,e,n){return vi(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return Bi(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return _i(t,e,n,r)}};var{FeeUtils:gn}=v,Dt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,i){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:r.balance,balanceOut:i.balance,assetInEd:r.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=this.calculateTradeFee(r,n),a=gn.toPct(n.exchangeFee),s=r+i,o=[];(e<this.minTradingLimit||r<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let c=t.balanceIn/this.maxInRatio;return s>c&&o.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:r,amountOut:e,feePct:a,errors:o}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=this.calculateTradeFee(r,n),a=gn.toPct(n.exchangeFee),s=r-i,o=[];(e<this.minTradingLimit||r<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let c=t.balanceOut/this.maxOutRatio;return s>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:s,feePct:a,errors:o}}calculateInGivenOut(t,e){let n=X.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=X.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=X.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=X.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=X.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Ri}from"polkadot-api";import{of as Fi}from"rxjs";var Mt=class extends q{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),r=e.map(async({keyArgs:i,value:a})=>{let[s]=i,[o,l]=a,[c,m,d,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:m?.decimals,existentialDeposit:m?.existential_deposit,balance:c.transferable,type:m?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:d.transferable,type:p?.asset_type.type}],...n}});return Promise.all(r)}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}getPoolType(){return"XYK"}async isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(Ri.BackwardsCompatible,e)}subscribePoolChange(t){return Fi(t)}};var Ae={};w(Ae,{AavePool:()=>Lt,AavePoolClient:()=>qt});var Lt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,i){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:i.balance,decimalsIn:r.decimals,decimalsOut:i.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=[];return e>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:i}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=[];return r>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:i}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};import{AccountId as ki}from"polkadot-api";import{toHex as Ei}from"@polkadot-api/utils";import{map as Ci,merge as Di,switchMap as Mi}from"rxjs";import{decodeEventLog as Li}from"viem";var yn=[{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:qi}=st,Ni=["Supply","Withdraw","Repay","Borrow"],qt=class extends q{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:r,liqudity_in:i,liqudity_out:a})=>{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:i,location:o,type:s?.asset_type.type},{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:a,location:c,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:r,liqudity_out:i}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(a=>{let s=a.id===e.id?r:i;return{...a,balance:s}})}getPoolId(t,e){let n=t+"/"+e,r=new TextEncoder().encode(n.padEnd(32,"\0")),i=Ei(r);return ki(63).dec(i)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(t,e){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(t){let[e,n]=t.tokens,r=this.getReserveH160Id(e),i=this.api.event.Router.Executed.watch(({asset_in:s,asset_out:o})=>s===n.id||o===n.id),a=this.api.event.EVM.Log.watch(({log:s})=>{let{topics:o,data:l}=s,c=o.map(g=>g.asHex()),m=l.asHex(),{eventName:d,args:p}=Li({abi:yn,topics:c,data:m});return Ni.includes(d)&&p.reserve.toLowerCase()===r.toLowerCase()});return Di([i,a]).pipe(Mi(()=>this.getPoolDelta(t)),Ci(s=>({...t,tokens:[...s]})))}getReserveH160Id(t){return t.type==="Erc20"?tt.findNestedKey(t.location,"AccountKey20").AccountKey20.key:qi.fromAssetId(t.id)}};var pt=class{static get(t){switch(t.type){case"Aave":return Lt.fromPool(t);case"XYK":return Dt.fromPool(t);case"Omnipool":return Ft.fromPool(t);case"LBP":return Bt.fromPool(t);case"Stableswap":return Et.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as Gi,Subscription as Nt,takeUntil as Ui}from"rxjs";var dt=class extends R{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=Nt.EMPTY;omniSub=Nt.EMPTY;stableSub=Nt.EMPTY;xykSub=Nt.EMPTY;aaveSub=Nt.EMPTY;isReady=!1;isDestroyed=new Gi;constructor(t,e){super(t),this.evm=e,this.lbpClient=new Rt(t,e),this.omniClient=new kt(t,e),this.stableClient=new Ct(t,e),this.xykClient=new Mt(t,e),this.aaveClient=new qt(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe(Ui(this.isDestroyed)).subscribe(e=>{this.pools.set(e.address,e)})}withOmnipool(){return this.omniSub.unsubscribe(),this.omniSub=this.subscribe(this.omniClient),this.active.add("Omnipool"),this}withStableswap(){return this.stableSub.unsubscribe(),this.stableSub=this.subscribe(this.stableClient),this.active.add("Stableswap"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbpClient),this.active.add("LBP"),this}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aaveClient),this.active.add("Aave"),this}withXyk(t){return this.xykClient.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xykClient),this.active.add("XYK"),this}destroy(){this.isDestroyed.next(!0),this.isDestroyed.complete(),this.active.clear(),this.pools.clear(),this.isReady=!1}async getPools(t={}){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let{useOnly:e=[],exclude:n=[]}=t,r=new Set(e),i=new Set(n),a=async s=>{let o=s.getPoolType();return r.size>0?r.has(o):i.size>0?!i.has(o):s.isSupported()};return this.getFilteredPools(a)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((i,a)=>e[a]);return(await Promise.all(n.map(i=>i.getPoolsMem()))).flat()}async getPoolFees(t,e){let n=this.clients.find(r=>r.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new xt(t.type)}};var Tn={};w(Tn,{DEFAULT_BLOCK_TIME:()=>Pn,DEFAULT_MIN_BUDGET:()=>Re,ORDER_MIN_BLOCK_PERIOD:()=>fn,Router:()=>gt,TWAP_BLOCK_PERIOD:()=>Wt,TWAP_MAX_DURATION:()=>ke,TWAP_MAX_PRICE_IMPACT:()=>Fe,TWAP_TX_MULTIPLIER:()=>Zu,TradeOrderError:()=>_e,TradeOrderType:()=>ie,TradeRouteBuilder:()=>N,TradeRouter:()=>yt,TradeScheduler:()=>bt,TradeType:()=>re});var Gt=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Vi=8,Ut=class{isNotVisited(t,e){let n=!0;return e.forEach(r=>{(r[0]===t[0]||r[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let r=[],i=new Gt,a=[];for(a.push([e,""]),i.enqueue(a);i.size()>0;){let s=i.dequeue();if(!s||s.length>Vi)continue;let o=s[s.length-1];(n===null||o[0]===n)&&r.push(s),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,s)){let m=[...s];m.push(c),i.enqueue(m)}})}return r}findShortestPaths(t,e,n){let r=[],i=new Gt,a=[];a.push([e,""]),i.enqueue(a);let s=1/0;for(;i.size()>0;){let o=i.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=t.get(l[0]);for(let m of c??[])this.isNotVisited(m,o)&&i.enqueue([...o,m])}return r}buildAndPopulateGraph(t,e){let n=new Map;for(let r of t)n.set(parseInt(r),[]);for(let[r,i,a]of e)n.get(i)?.push([a,r]);return n}};function Be(u){let t={};for(let e of u){let n=e.tokens.length;for(let r=0;r<n;r++){t[e.tokens[r].id]||(t[e.tokens[r].id]=[]);for(let i=0;i<n;i++){if(r==i)continue;let a=[e.address,e.tokens[r].id,e.tokens[i].id];t[e.tokens[r].id].push(a)}}}return t}var Vt=class{getProposals(t,e,n){let r=n.filter(y=>y.type==="XYK"),i=n.filter(y=>y.type!=="XYK"),a=new Set(i.map(y=>y.tokens).flat().map(y=>y.id)),s=a.has(t),o=a.has(e),l=new Ut,c=y=>{let h=Be(y),P=Object.keys(h),S=P.flatMap(T=>h[T]);return l.buildAndPopulateGraph(P,S)};if(!s&&!o){let y=r.filter(S=>S.tokens.find(T=>T.id===t)||S.tokens.find(T=>T.id===e)),h=c(y),P=l.findPaths(h,t,e);return this.parsePaths(P)}if(s&&o){let y=c(i),h=l.findPaths(y,t,e);return this.parsePaths(h)}let m=s?e:t,d=r.filter(y=>y.tokens.some(h=>h.id===m));if(d.length===0)return[];let p=[...i,...d],g=c(p),b=l.findPaths(g,t,e);return this.parsePaths(b)}parsePaths(t){let e=[];for(let n of t){let r=[];for(let i=0;i<n.length;i++){let a=n[i],s=n[i+1];if(s==null)break;r.push(this.toEdge(a,s))}e.push(r)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var gt=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new Vt,this.routeProposals=new Map,this.routerOptions=Object.freeze(e)}buildRouteKey(t,e,n){return`${t}->${e}::${n.length}`}async getPools(){return this.ctx.getPools(this.routerOptions)}async getRoutes(t,e){let n=await this.getPools();return this.validateInput(t,e,n),this.getPaths(t,e,n)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}async getRouteableAssets(t){let e=await this.getTradeableAssets();return(await Promise.all(e.filter(r=>r!==t).map(r=>this.getRoutes(r,t)))).filter(r=>r.length>0).map(([r])=>r[0].assetIn).sort()}validateInput(t,e,n){if(n.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let r=this.getAssets(n);if(!r.has(t))throw new Error(t+" is not supported asset");if(!r.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(r=>r.id)).flat().sort((n,r)=>n>r?1:-1);return new Set(e)}getPaths(t,e,n){let r=this.toPoolsMap(n);return this.getProposals(t,e,n).filter(a=>this.validPath(a,r)).map(a=>this.toHops(a,r))}getProposals(t,e,n){let r=this.buildRouteKey(t,e,n);if(this.routeProposals.has(r))return this.routeProposals.get(r);let i=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(r,i),i}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,r)=>n&&r)}validEdge([t,e,n],r){return r.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,pt.get(e)]))}toHops(t,e){return t.map(([n,r,i])=>{let a=e.get(n);return{poolAddress:n,poolId:a?.id,pool:a?.type,assetIn:r,assetOut:i}})}};var re=(e=>(e.Buy="Buy",e.Sell="Sell",e))(re||{}),ie=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(ie||{}),_e=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(_e||{});var{FeeUtils:hn}=v,yt=class extends gt{mlr;poolsSnapshot;constructor(t,e={}){super(t,e),this.mlr=new Map}buildCtxSync(t,e){let n=this.poolsSnapshot,r=super.validateInput(t,e,n),i=super.getPaths(t,e,n);if(!i.length)throw new It(t,e);return{paths:i,pools:n,poolsMap:r}}async withCtx(t,e,n){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let r=this.buildCtxSync(t,e);return n(r)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,r)=>{let i=n[n.length-1].amountOut,a=r[r.length-1].amountOut;return i>a?-1:1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,a)=>i+a),r=t.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,a)=>i+a);return[n,r]}}getPoolFeeRange(t){let e=t.min?hn.toPct(t.min):void 0,n=t.max?hn.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetOutDecimals).reduce((s,o)=>s+o),r=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),i=n-e.assetOutDecimals,a=Math.pow(10,i);return r/BigInt(a)}async getSell(t,e,n,r){return this.withCtx(t,e,async({paths:i,poolsMap:a})=>{let s;if(r)s=await this.toSellSwaps(n,r,a);else{let o=i.map(c=>this.toSellSwaps(n,c,a)),l=await Promise.all(o);s=this.findBestSellRoute(l)}return this.buildSell(a,s)})}buildSell(t,e){let n=e[0],r=e[e.length-1],i=this.isDirectTrade(e),a=this.getSellSpot(e),s=r.amountOut,o=i?r.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-s,c=this.getRouteFeeRange(e),m=i?r.tradeFeePct:O.calculateSellFee(o,s),d=Math.pow(10,n.assetInDecimals),p=n.amountIn*a/BigInt(d),g=O.calculateDiffToRef(o,p);return{type:"Sell",amountIn:n.amountIn,amountOut:r.amountOut,spotPrice:a,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:f.toDecimal(n.amountIn,n.assetInDecimals),amountOut:f.toDecimal(r.amountOut,r.assetOutDecimals),spotPrice:f.toDecimal(a,r.assetOutDecimals),tradeFee:f.toDecimal(l,r.assetOutDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0Y(t,e,n){let r=[];for(let i=0;i<e.length;i++){let a=e[i],s=n.get(a.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(a.assetIn,a.assetOut),l;i>0?l=r[i-1]:l=t;let c=s.calculateOutGivenIn(o,l);r.push(c)}return r[r.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:r,pools:i,poolsMap:a}=n,l=i.filter(b=>b.tokens.some(y=>y.id===t)).map(b=>b.type==="Aave"?b.tokens:b.tokens.filter(y=>y.id===t)).map(b=>b.map(y=>y.balance).reduce((y,h)=>y+h)).sort((b,y)=>y<b?-1:1)[0],c=O.getFraction(l,.1),m=await Promise.all(r.map(b=>this.toSellSwaps(c,b,a))),p=this.findBestSellRoute(m).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),g=this.buildRouteKey(t,e,i);return this.mlr.set(g,p),p}async toSellSwaps(t,e,n){let r=[];for(let i=0;i<e.length;i++){let a=e[i],s=n.get(a.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(a.assetIn,a.assetOut),l;i>0?l=r[i-1].amountOut:l=typeof t=="string"?f.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountOut:m,calculatedOut:d,feePct:p,errors:g}=s.validateAndSell(o,l,c),b=this.getPoolFeeRange(c),y=s.spotPriceOutGivenIn(o),h=Math.pow(10,o.decimalsIn),P=l*y/BigInt(h),S=O.calculateDiffToRef(d,P);r.push({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:m,calculatedOut:d,spotPrice:y,tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g,isSupply(){return s.type==="Aave"&&s.tokens[0].id===a.assetIn},isWithdraw(){return s.type==="Aave"&&s.tokens[1].id===a.assetIn},toHuman(){return{...a,amountIn:f.toDecimal(l,o.decimalsIn),amountOut:f.toDecimal(m,o.decimalsOut),calculatedOut:f.toDecimal(d,o.decimalsOut),spotPrice:f.toDecimal(y,o.decimalsOut),tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return r}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let r=this.buildRouteKey(t,e,n.pools),i=this.mlr.get(r);return i||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:r,poolsMap:i}=n,a=this.buildRouteKey(t,e,r),s=this.mlr.get(a);s||(s=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",s,i),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}})}findBestBuyRoute(t){let e=t.sort((n,r)=>{let i=n[0].amountIn,a=r[0].amountIn;return i>a?1:-1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetInDecimals).reduce((s,o)=>s+o),r=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),i=n-e.assetInDecimals,a=Math.pow(10,i);return r/BigInt(a)}async getBuy(t,e,n,r){return this.withCtx(t,e,async({paths:i,poolsMap:a})=>{let s;if(r)s=await this.toBuySwaps(n,r,a);else{let o=i.map(c=>this.toBuySwaps(n,c,a)),l=await Promise.all(o);s=this.findBestBuyRoute(l)}return this.buildBuy(a,s)})}buildBuy(t,e){let n=e[e.length-1],r=e[0],i=this.isDirectTrade(e),a=this.getBuySpot(e),s=r.amountIn,o=i?r.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=s-o,c=this.getRouteFeeRange(e),m=i?r.tradeFeePct:O.calculateBuyFee(o,s),d=Math.pow(10,n.assetOutDecimals),p=n.amountOut*a/BigInt(d),g;return o===0n?g=-100:g=O.calculateDiffToRef(p,o),{type:"Buy",amountOut:n.amountOut,amountIn:r.amountIn,spotPrice:a,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:f.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:f.toDecimal(r.amountIn,r.assetInDecimals),spotPrice:f.toDecimal(a,r.assetInDecimals),tradeFee:f.toDecimal(l,r.assetInDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0X(t,e,n){let r=[];for(let i=e.length-1;i>=0;i--){let a=e[i],s=n.get(a.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(a.assetIn,a.assetOut),l;i==e.length-1?l=t:l=r[0];let c=s.calculateInGivenOut(o,l);r.unshift(c)}return r[0]}async toBuySwaps(t,e,n){let r=[];for(let i=e.length-1;i>=0;i--){let a=e[i],s=n.get(a.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(a.assetIn,a.assetOut),l;i==e.length-1?l=typeof t=="string"?f.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountIn:m,calculatedIn:d,feePct:p,errors:g}=s.validateAndBuy(o,l,c),b=this.getPoolFeeRange(c),y=s.spotPriceInGivenOut(o),h=Math.pow(10,o.decimalsOut),P=l*y/BigInt(h),S;d===0n?S=-100:S=O.calculateDiffToRef(P,d),r.unshift({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:m,calculatedIn:d,spotPrice:y,tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g,isSupply(){return s.type==="Aave"&&s.tokens[0].id===a.assetIn},isWithdraw(){return s.type==="Aave"&&s.tokens[1].id===a.assetIn},toHuman(){return{...a,amountOut:f.toDecimal(l,o.decimalsOut),amountIn:f.toDecimal(m,o.decimalsIn),calculatedIn:f.toDecimal(d,o.decimalsIn),spotPrice:f.toDecimal(y,o.decimalsIn),tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return r}};var Pn=6e3,Re=1000000000000000n,Wt=6,Fe=-5,ke=216e5,Zu=3,fn=6;import{Enum as Sn}from"polkadot-api";var N=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:i})=>r==="Stableswap"?{pool:Sn("Stableswap",i),asset_in:e,asset_out:n}:{pool:Sn(r),asset_in:e,asset_out:n})}};var bt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Re})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,r,i){let[a,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=s,m=l[0],d=l[l.length-1],{assetInDecimals:p}=m,{assetOutDecimals:g}=d,b=Math.abs(c),y=this.getMinimumTradeCount(o,a),h=this.getOptimalTradeCount(b),P=i?Math.round(r/i):h,S=Math.ceil(r/y),T=Math.round(r/h),k=Math.round(r/P),M=o/BigInt(P),A=await this.router.getBestSell(t,e,M),F=o<a,V=[];F&&V.push("OrderTooSmall");let W=A.amountOut*BigInt(P),L=this.toBlockPeriod(k),K=A.tradeFee*BigInt(P),ft=N.build(l),J={assetIn:t,assetOut:e,errors:V,frequencyMin:S,frequencyOpt:T,frequency:k,tradeCount:P,tradeFee:K,tradeImpactPct:A.priceImpactPct,tradePeriod:L,tradeRoute:ft,type:"Dca"};return{...J,amountIn:o,amountOut:W,tradeAmountIn:A.amountIn,tradeAmountOut:A.amountOut,toHuman(){return{...J,amountIn:f.toDecimal(o,p),amountOut:f.toDecimal(W,g),tradeAmountIn:f.toDecimal(A.amountIn,p),tradeAmountOut:f.toDecimal(A.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),n=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let r=t+n/2n;return Number(r/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[r,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:a,swaps:s,priceImpactPct:o}=i,l=s[0],c=s[s.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),b=a/BigInt(g),y=await this.router.getBestSell(l.assetIn,c.assetOut,b),h=g===1,P=a<r,S=y.priceImpactPct<-5,T=[];P||h?T.push("OrderTooSmall"):S&&T.push("OrderImpactTooBig");let k=y.amountOut*BigInt(g),M=y.tradeFee*BigInt(g),A=N.build(s),F={assetIn:t,assetOut:e,errors:T,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:A,type:"TwapSell"};return{...F,amountIn:a,amountOut:k,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:M,toHuman(){return{...F,amountIn:f.toDecimal(a,m),amountOut:f.toDecimal(k,d),tradeAmountIn:f.toDecimal(y.amountIn,m),tradeAmountOut:f.toDecimal(y.amountOut,d),tradeFee:f.toDecimal(M,d)}}}}async getTwapBuyOrder(t,e,n){let[r,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:a,swaps:s,priceImpactPct:o}=i,l=s[0],c=s[s.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),b=a/BigInt(g),y=await this.router.getBestBuy(l.assetIn,c.assetOut,b),h=y.amountIn*BigInt(g),P=g===1,S=h<r,T=y.priceImpactPct<-5,k=[];S||P?k.push("OrderTooSmall"):T&&k.push("OrderImpactTooBig");let M=y.tradeFee*BigInt(g),A=N.build(s),F={assetIn:t,assetOut:e,errors:k,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:A,type:"TwapBuy"};return{...F,amountIn:h,amountOut:a,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:M,toHuman(){return{...F,amountIn:f.toDecimal(h,m),amountOut:f.toDecimal(a,d),tradeAmountIn:f.toDecimal(y.amountIn,m),tradeAmountOut:f.toDecimal(y.amountOut,d),tradeFee:f.toDecimal(M,m)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let r=216e5/(this.blockTime*6);return Math.round(r)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,n=Math.round(e);return Math.max(n,6)}};var In={};w(In,{BIG_10:()=>xn,BIG_BILL:()=>Ce,StakingApi:()=>Ht,StakingClient:()=>Yt});import{encodeAddress as Wi}from"@polkadot/util-crypto";import{stringToU8a as Hi}from"@polkadot/util";import{calculate_accumulated_rps as Yi,calculate_percentage_amount as Xi,calculate_period_number as wn,calculate_points as Ki,calculate_rewards as zi,sigmoid as ji}from"@galacticcouncil/math-staking";import G from"big.js";var Ee={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},$i=u=>Object.keys(Ee).includes(u),Qi="20000000000000000",Ji="2000",xn=G(10),Ce=G(xn.pow(12));function Zi(u){return Wi(Hi(("modl"+u).padEnd(32,"\0")),63)}var Ht=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getPotBalance(){let t=await this.client.getPalletId(),e=Zi(t);return await this.balanceClient.getBalance(e,0)}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]);if(!e)return;let r=e.created_at,i=await n.reduce(async(a,[s,o])=>{let l=await a,c=s,m=o.amount,d=o.conviction.toString().toLowerCase(),p=await this.client.getReferendumInfo(c);return p&&(p.type==="Approved"||p.type==="Rejected")&&$i(d)&&l.push({id:c,amount:m,conviction:d}),l},Promise.resolve([]));return{stake:e.stake,rewardPerStake:e.reward_per_stake,createdAt:r,actionPoints:e.action_points,accumulatedUnpaidRewards:e.accumulated_unpaid_rewards,accumulatedSlashPoints:e.accumulated_slash_points,accumulatedLockedRewards:e.accumulated_locked_rewards,votes:i}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,r]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),i=r.find(a=>a)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:i,stakePosition:i?await this.getStakingPosition(i):void 0}}getCurrentActionPoints(t,e,n,r){let i=G(0),a=G(0),s=Ee.locked6x,o=G(n.toString()).mul(s),l=100,c=[];t.forEach(p=>{let g=Ee[p.conviction],b=r.includes(p.id.toString());b&&c.push(p.id.toString());let y=G(p.amount.toString()).mul(l).div(o);i=i.plus(Math.floor(y.mul(g).toNumber())),a=a.plus(Math.floor(y.mul(b?s:g).toNumber()))});let m=Math.floor(G(n.toString()).mul(s).mul(l).div(o).toNumber());r.forEach(p=>{c.includes(p)||(a=a.plus(m))});let d={democracyVote:1};return i=i.mul(d.democracyVote),i=i.plus(e.toString()||"0"),a=a.mul(d.democracyVote),a=a.plus(e.toString()||"0"),{currentActionPoints:i.toString(),maxActionPoints:a.toString()}}async getRewards(t,e,n){let r=await this.getStake(t),{potReservedBalance:i,accumulatedRewardPerStake:a,totalStake:s,stakePosition:o}=r;if(!o)return;let[l,c,m,d,p,g,b]=await Promise.all([this.getPotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getTimePointsPerPeriod(),this.client.getTimePointsWeight(),this.client.getActionPointsWeight(),this.client.getSixBlockSince()]),y=G(l.transferable.toString()).minus(i.toString()),h=y.gt(0)&&s>0?Yi(a.toString(),y.toString(),s.toString()):a.toString(),P=wn(c.toString(),n,b),S=wn(c.toString(),o.createdAt.toString(),b),T=zi(h,o.rewardPerStake.toString(),o.stake.toString()),k=this.getCurrentActionPoints(o.votes,o.actionPoints,o.stake,e),M=Ki(S,P,d.toString(),p.toString(),k.currentActionPoints,g.toString(),o.accumulatedSlashPoints.toString()),A=ji(M,Qi,Ji),F=G(T).plus(o.accumulatedUnpaidRewards.toString()).plus(o.accumulatedLockedRewards.toString());if(G(P).minus(S).lte(m.toString()))return{rewards:"0"};let V=Xi(F.toString(),A),W=G(o.accumulatedLockedRewards.toString()),L=W.gt(V)?W:G(V);return{rewards:L.div(Ce).toString(),maxRewards:F.div(Ce).toString(),allocatedRewardsPercentage:L.div(F).mul(100).toNumber()}}};var Yt=class extends R{async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:a})=>{let[s,o,l]=a;return{address:s,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getTimePointsPerPeriod(){let t=this.api.constants.Staking.TimePointsPerPeriod;return await t()}async getTimePointsWeight(){let t=this.api.constants.Staking.TimePointsWeight;return await t()/1e6}async getActionPointsWeight(){let t=this.api.constants.Staking.ActionPointsWeight;return await t()/1e9}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var An={};w(An,{TxBuilderFactory:()=>Pt});import{Enum as On}from"polkadot-api";function vn(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var ht=class extends R{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new H(t),this.aaveUtils=new et(e)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:n=>this.dryRun(n,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:ue})}async dryRun(t,e){let n=On("Signed",t),r=On("system",n),a=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,e.decodedCall),s=a.success&&!a.value.execution_result.success?a.value.execution_result.value.error:null;if(s){let o=vn(s.value);throw new Error("Dry run execution error!",{cause:o})}return a}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var se=class extends ht{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:r}=e[0],i=await this.balanceClient.getBalance(this.beneficiary,r);return t>=i.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],i=n[n.length-1],a=O.getFraction(t,this.slippagePct),s=r.assetIn,o=i.assetOut,l=t+a,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:s,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:s,asset_out:o,amount_out:e,max_amount_in:l,route:N.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],i=n[n.length-1],a=O.getFraction(e,this.slippagePct),s=r.assetIn,o=i.assetOut,l=e-a,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:s,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:s,asset_out:o,amount_in:t,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:t,swaps:e}=this.trade,n=e[0],r=e[e.length-1],i=O.getFraction(t,this.slippagePct),a=n.assetIn,s=r.assetOut,o=t-i,l=this.api.tx.Router.sell_all({asset_in:a,asset_out:s,min_amount_out:o,route:N.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as De}from"polkadot-api";var ae=class extends ht{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradePeriod:i,tradeRoute:a}=this.order,s=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:De("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:0n,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",s)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:i,tradePeriod:a,tradeRoute:s}=this.order,o=O.getFraction(i,this.slippagePct),l=i-o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:a,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:De("Sell",{asset_in:e,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:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:i,tradePeriod:a,tradeRoute:s}=this.order,o=O.getFraction(r,this.slippagePct),l=r+o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:a,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:De("Buy",{asset_in:e,asset_out:n,amount_out:i,max_amount_in:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var Pt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new se(this.client,this.evmClient).setTrade(t)}order(t){return new ae(this.client,this.evmClient).setOrder(t)}};async function lp(u){let t=new ct(u),e=new vt(u),[n,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),i=new dt(u,e).withAave().withOmnipool().withStableswap().withXyk(),a=new H(u),s=new Yt(u),o=new At(u),l=new et(e),c=new yt(i),m=new bt(c,{blockTime:n,minBudgetInNative:r}),d=new Ht(s,a),p=new Ot(o,a,{blockTime:n});return{api:{aave:l,router:c,scheduler:m,staking:d,farm:p},client:{asset:new ot(u),balance:a,evm:e},ctx:{pool:i},tx:new Pt(u,e),destroy:()=>{i.destroy()}}}export{Xe as aave,Ne as api,f as big,je as client,Ge as const,lp as createSdkContext,st as erc20,$e as error,Ze as evm,an as farm,v as fmt,Jt as h160,tt as json,O as math,bn as pool,Tn as sor,In as staking,An as tx,Ye as xc};
1
+ var Mn=Object.defineProperty;var x=(p,t)=>{for(var e in t)Mn(p,e,{get:t[e],enumerable:!0})};var Ge={};x(Ge,{Papi:()=>E,getWs:()=>Un});import{hydration as Ln}from"@galacticcouncil/descriptors";function Ue(p){switch(p){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var E=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(Ln)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Ue(n)&&console.log(t,...e)}};import{createClient as qn}from"polkadot-api";import{withPolkadotSdkCompat as Nn}from"polkadot-api/polkadot-sdk-compat";var Un=async p=>{let t=typeof p=="string"?p.split(","):p,s=(typeof window>"u"?(await import("polkadot-api/ws-provider/node")).getWsProvider:(await import("polkadot-api/ws-provider/web")).getWsProvider)(t);return qn(Nn(s))};var je={};x(je,{AAVE_GAS_LIMIT:()=>de,AAVE_LENDING_POOL_ADDRESS:()=>Jt,AAVE_POOL_ABI:()=>pe,AAVE_POOL_DATA_PROVIDER:()=>Qt,AAVE_POOL_DATA_PROVIDER_ABI:()=>$t,AAVE_POOL_PROXY:()=>me,AAVE_ROUNDING_THRESHOLD:()=>Di,AAVE_UINT_256_MAX:()=>Gn,AaveClient:()=>wt,AaveUtils:()=>Z});var pe=[{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 $t=[{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 me="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Qt="0x112b087b60C1a166130d59266363C45F8aa99db0",Jt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",de=1000000n,Di=5,Gn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var wt=class{client;constructor(t){this.client=t.getWsProvider()}async getBlockTimestamp(){let t=await this.client.getBlock();return Number(t.timestamp)}async getReservesData(){return await this.client.readContract({abi:$t,address:Qt,args:[Jt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:$t,address:Qt,args:[Jt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:pe,address:me,args:[t],functionName:"getUserAccountData"})}};import K from"big.js";var P={};x(P,{asBigInt:()=>Hn,toBigInt:()=>Wn,toDecimal:()=>Vn});import Q from"big.js";Q.NE=-18;function Vn(p,t,e=6,n){let s=Q(p.toString()),r=Q(10).pow(t);return s.div(r).round(e,n).toString()}function Wn(p,t){let e=Q(10).pow(t),s=Q(p).mul(e).toFixed(0,Q.roundDown);return BigInt(s)}function Hn(p){return BigInt(p.round(0,Q.roundDown).toFixed(0))}var nt={};x(nt,{ERC20:()=>ge});var ge=class{static fromAssetId(t){let e=Buffer.alloc(20,0);return e[15]=1,e.writeUInt32BE(t,16),"0x"+e.toString("hex")}static toAssetId(t){let e=Buffer.from(t.replace("0x",""),"hex");return e.length!==20||!this.isAssetAddress(t)?null:e.readUInt32BE(16)}static isAssetAddress(t){let e=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(t.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(e.subarray(0,16))}};var A={};x(A,{FeeUtils:()=>ye,shiftNeg:()=>zn});import Kn from"big.js";var Ve={};x(Ve,{HUB_ASSET_ID:()=>xt,HYDRATION_OMNIPOOL_ADDRESS:()=>Xn,HYDRATION_PARACHAIN_ID:()=>Yn,HYDRATION_SS58_PREFIX:()=>M,PERBILL_DENOMINATOR:()=>he,PERMILL_DENOMINATOR:()=>st,RUNTIME_DECIMALS:()=>I,SYSTEM_ASSET_DECIMALS:()=>be,SYSTEM_ASSET_ID:()=>O,TRADEABLE_DEFAULT:()=>rt});var I=18,st=1e6,he=1e9,O=0,be=12,Yn=2034,M=63,Xn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",xt=1,rt=15;var ye=class p{static toPct(t){let[e,n]=t;return p.safeDivide(e*100,n)}static toRaw(t){let[e,n]=t;return p.safeDivide(e,n)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,n=12){let s=10**n;return Math.round(t*s/e)/s}static safeRound(t){return parseFloat(t.toPrecision(15))}};function zn(p,t){let e=Kn(typeof p=="bigint"?p.toString():p);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Zt={};x(Zt,{H160:()=>Pe,isEvmAccount:()=>He,isEvmAddress:()=>Ye,isSs58Address:()=>Xe});import{AccountId as vt}from"polkadot-api";import{toHex as We}from"@polkadot-api/utils";import{Buffer as X}from"buffer";var fe="ETH\0";function He(p){if(!p)return!1;try{let t=vt().enc(p),e=X.from(fe);return X.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Ye(p){return!!/^0x[a-fA-F0-9]{40}$/.test(p)}function Xe(p){try{return vt(63).enc(p),!0}catch{return!1}}var Pe=class p{static toAccount=t=>{let e=X.from(t.slice(2),"hex"),n=X.from(fe),s=Uint8Array.from(X.concat([n,e,X.alloc(8)])),r=We(s);return vt(63).dec(r)};static fromAccount=t=>{let e=vt().enc(t),n=X.from(fe),s=e.slice(n.length,-8);return"0x"+X.from(s).toString("hex")};static fromSS58=t=>{let n=vt().enc(t).slice(0,20);return We(n)};static fromAny=t=>{if(Ye(t))return t;if(He(t))return p.fromAccount(t);if(Xe(t))return p.fromSS58(t);throw new Error("Unknown address type")}};var J={};x(J,{findNestedKey:()=>jn,findNestedObj:()=>$n,jsonFormatter:()=>Qn});var jn=(p,t)=>{let e=[];return JSON.stringify(p,(n,s)=>(s&&s[t]&&e.push(s),s)),e[0]},$n=(p,t,e)=>{let n;return JSON.stringify(p,(s,r)=>(r&&r[t]===e&&(n=r),r)),n},Qn=(p,t)=>typeof t=="bigint"?t.toString():t;var v={};x(v,{calculateBuyFee:()=>es,calculateDiffToAvg:()=>Jn,calculateDiffToRef:()=>Zn,calculateSellFee:()=>ts,getFraction:()=>ns});import W from"big.js";function Jn(p,t){let e=W(p.toString()),n=W(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Zn(p,t){if(t===0n)return 0;let e=W(p.toString()),n=W(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function ts(p,t){let e=W(p.toString()),n=W(t.toString());return W(1).minus(n.div(e)).mul(100).round(2).toNumber()}function es(p,t){let e=W(p.toString());return W(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function ns(p,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),s=BigInt(t*n);return p*s/BigInt(100*n)}var Ke={};x(Ke,{convertToId:()=>rs});import{Buffer as ss}from"buffer";function rs(p){let e=ss.from(p.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}import{TLRUCache as ze}from"@thi.ng/cache";var te=class{debug;constructor(t){this.debug=t||!1}log(t,e,n){this.debug&&console.log(t,e,n)}scope(t,e,n,s){let r=new Map,i=s!==void 0?new ze(null,{ttl:s}):new ze;return{get:(...c)=>{let u=n(...c);if(r.has(u)){this.log("[live]",t,u);let m=r.get(u);return Promise.resolve(m)}if(i.has(u))return this.log("[memo]",t,u),i.get(u);this.log("[fetch]",t,u);let d=e(...c).catch(m=>{throw i.delete(u),m});return i.set(u,d),d},set:(c,...u)=>{let d=n(...u);this.log("[set-live]",t,d),r.set(d,c)},clear:()=>{this.log("[clear]",t),r.clear(),i.release()}}}};var{ERC20:ee}=nt,{H160:Se}=Zt,is=1.01,as=31536000n,ne=10n**27n,Z=class{client;constructor(t){this.client=new wt(t)}async getSummary(t){let e=Se.fromAny(t),[n,s,r,i]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e),this.client.getBlockTimestamp()]),[a]=n,[o,l]=s,[c,u,d,m,g,b]=r,h=P.toDecimal(b,18),y=[];for(let f of o){let S=f.underlyingAsset.toLowerCase(),T=a.find(({underlyingAsset:ue})=>ue.toLowerCase()===S);if(!T)throw new Error("Missing pool reserve for "+S);let R=f.scaledATokenBalance,D=T.liquidityIndex,F=T.liquidityRate,L=T.availableLiquidity,z=T.priceInMarketReferenceCurrency,j=i+6,G=this.calculateLinearInterest(F,T.lastUpdateTimestamp,j),Y=D*G/ne,Tt=R*Y/ne,Kt=Number(l!==0&&l===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,zt=T.usageAsCollateralEnabled&&f.usageAsCollateralEnabledOnUser&&f.scaledATokenBalance>0n,jt=ee.toAssetId(S);y.push({aTokenBalance:Tt,availableLiquidity:L,decimals:Number(T.decimals),isCollateral:zt,priceInRef:z,reserveId:jt,reserveAsset:S,reserveLiquidationThreshold:Kt})}return{healthFactor:Number(h),totalCollateral:c,totalDebt:u,reserves:y}}async hasBorrowPositions(t){let e=Se.fromAny(t),n=await this.client.getUserAccountData(e),[s,r]=n;return r>0n}async getHealthFactor(t){let e=Se.fromAny(t),n=await this.client.getUserAccountData(e),[s,r,i,a,o,l]=n,c=P.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:s,totalDebt:r,reserves:i}=await this.getSummary(t),a=ee.fromAssetId(e),o=i.find(y=>y.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,isCollateral:c,priceInRef:u,reserveLiquidationThreshold:d}=o,m=P.toBigInt(n,l),g=c?m*u/10n**BigInt(l):0n,b=s-g;if(b<=0n)return 0;let h=K(b.toString()).mul(d).div(r.toString()).toFixed(6,K.roundDown);return Number(h)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:s,totalDebt:r,reserves:i}=await this.getSummary(t),a=ee.fromAssetId(e),o=i.find(h=>h.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:u}=o,m=P.toBigInt(n,l)*c/10n**BigInt(l),g=s+m;if(g<=0n)return 0;let b=K(g.toString()).mul(u).div(r.toString()).toFixed(6,K.roundDown);return Number(b)}async getMaxWithdraw(t,e){let{totalDebt:n,reserves:s,healthFactor:r}=await this.getSummary(t),i=ee.fromAssetId(e),a=s.find(o=>o.reserveAsset===i);if(!a)throw new Error("Missing reserve ctx for "+i);return this.calculateWithdrawMax(a,n,r)}async getMaxWithdrawAll(t){let{totalDebt:e,reserves:n,healthFactor:s}=await this.getSummary(t),r={};for(let i of n){let a=this.calculateWithdrawMax(i,e,s);i.reserveId&&(r[i.reserveId]=a)}return r}calculateWithdrawMax(t,e,n){let{aTokenBalance:s,availableLiquidity:r,decimals:i,priceInRef:a,reserveLiquidationThreshold:o,isCollateral:l}=t,c=s;if(l&&e>0n){let d=n-is;if(d>0){let m=K(d).mul(e.toString()).div(o).toFixed(0,K.roundDown),g=K(m).div(a.toString()).mul(10**i).toFixed(0,K.roundDown);c=s<BigInt(g)?s:BigInt(g)}else c=0n}return{amount:c<r?c:r,decimals:i}}calculateLinearInterest(t,e,n){let s=n-e;if(s<=0)return ne;let r=t*BigInt(s)/as;return ne+r}};var Qe={};x(Qe,{AssetClient:()=>it,BalanceClient:()=>V,ChainParams:()=>ot});var it=class extends E{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(t){super(t)}async queryShares(){let e=await this.api.query.Stableswap.Pools.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[r]=n;return[r,s]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[r]=n;return[r,s]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:s}=n;return this.SUPPORTED_TYPES.includes(s.type)}).map(({keyArgs:n,value:s})=>{let[r]=n;return[r,s]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[r]=n;return[r,s]}))}async mapToken(t,e,n,s){let{name:r,asset_type:i,is_sufficient:a,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:r?.asText(),symbol:l,decimals:c,icon:l,type:i.type,isSufficient:a,location:s,existentialDeposit:o}}async mapBond(t,e,n,s){let[r,i]=s,{asset_type:a,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:u}=await this.mapToken(r,e,n),d=Number(i),m=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",m.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:u,icon:c,type:a.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:r,maturity:d}}async mapShares(t,e,n,s){let{assets:r}=s,{name:i,symbol:a,asset_type:o,is_sufficient:l,existential_deposit:c}=e,u=await Promise.all(r.map(async g=>{let{symbol:b}=await this.mapToken(g,e,n);return[g,b]})),d=Object.fromEntries(u),m=Object.values(d);return{id:t,name:m.join(", "),symbol:a?.asText()||i?.asText(),decimals:18,icon:m.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:d}}async mapExternal(t,e,n,s){let r=await this.mapToken(t,e,new Map,s),i=n?.find(a=>a.internalId===r.id);return i?{...r,decimals:i.decimals,name:i.name,symbol:i.symbol,icon:i.symbol,isWhiteListed:i.isWhiteListed}:r}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,s,r,i]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),a=this.parseMetadata(n),o=[];for(let[l,c]of Array.from(n)){let u=s.get(l),{asset_type:d}=c,m;switch(d.type){case"Bond":let g=i.get(l);m=await this.mapBond(l,c,a,g);break;case"StableSwap":let b=r.get(l);m=await this.mapShares(l,c,a,b);break;case"External":m=await this.mapExternal(l,c,e,u);break;default:m=await this.mapToken(l,c,a,u)}o.push(m)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};import{Subject as os,bufferCount as ls,combineLatest as cs,debounceTime as us,distinctUntilChanged as $e,finalize as ps,map as at,pairwise as ms,shareReplay as ds,startWith as gs}from"rxjs";var V=class extends E{constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getTokenBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:n}=await e.getValue(t);return this.calculateBalance(n)}async getTokenBalance(t,e){let s=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(s)}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),s=this.subscribeErc20Balance(t);return cs([e,n,s]).pipe(us(250),at(r=>r.flat()),gs([]),ls(2,1),at(([r,i],a)=>a===0?i:this.getDeltas(r,i)))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe(at(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(at(s=>({id:e,balance:s})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe($e((n,s)=>!s.deltas),at(({deltas:n})=>{let s=[];return n?.deleted.forEach(r=>{let[i,a]=r.args;s.push({id:a,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(r=>{let[i,a]=r.args;s.push({id:a,balance:this.calculateBalance(r.value)})}),s}))}subscribeErc20Balance(t,e){let n=new os,s=n.pipe(ds(1)),r=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=e||await r(),l=async()=>{let d=(await Promise.all(o.map(async m=>{let g=await this.getTokenBalanceData(t,m);return[m,g]}))).map(([m,g])=>({id:m,balance:g}));n.next(d)};await l();let c=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>c.unsubscribe()},a;return i().then(o=>a=o),s.pipe(ps(()=>a?.()),ms(),at(([o,l],c)=>c===0?l.filter(u=>u.balance.transferable>0n):this.getDeltas(o,l)),$e((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}calculateBalance(t){let e=t.free>=t.frozen?t.free-t.frozen:0n,n=t.free+t.reserved;return{free:t.free,reserved:t.reserved,frozen:t.frozen,total:n,transferable:e}}getDeltas(t,e){let n=(r,i)=>r!==void 0&&i!==void 0&&r.transferable===i.transferable&&r.total===i.total,s=t.reduce((r,i)=>(r.set(i.id,i.balance),r),new Map);return e.filter(r=>!n(r.balance,s.get(r.id)))}};var ot=class extends E{_minOrderBudget;_blockTime;constructor(t){super(t)}async getBlockTime(){if(this._blockTime===void 0){let t=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(t)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};var Je={};x(Je,{AssetNotFound:()=>Te,PoolNotFound:()=>It,RouteNotFound:()=>Ot});var Te=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},It=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},Ot=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var en={};x(en,{EvmClient:()=>At,createChain:()=>we});import{defineChain as hs}from"viem";var bs=["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"],we=()=>hs({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:bs}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});import{createPublicClient as Ze,createWalletClient as ys,custom as tn,http as fs}from"viem";var At=class{client;chain;constructor(t){this.client=t,this.chain=we()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return Ze({chain:this.chain,transport:fs()})}getWsProvider(){return Ze({transport:tn({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return ys({account:t,chain:this.chain,transport:tn(window.ethereum)})}};var ln={};x(ln,{LiquidityMiningApi:()=>_t,LiquidityMiningClient:()=>Bt});import{AccountId as vs}from"polkadot-api";import C from"big.js";import{fixed_from_rational as on}from"@galacticcouncil/math-liquidity-mining";var se=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let n=0;n<t.length;++n){let[s,r]=t[n];this.result.set(this.getKey(r,s),e[n].free)}}freeBalance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,n,s){let r=this.getKey(t,e),i=this.getKey(t,n),a=this.result.get(r)??0n,o=this.result.get(i)??0n;if(a<s)throw new Error("Attempting to transfer more than is present");this.result.set(r,a+s),this.result.set(i,o+s)}};import tt from"big.js";import{calculate_accumulated_rps as Ps,calculate_global_farm_rewards as Ss,calculate_loyalty_multiplier as Ts,calculate_user_reward as an,calculate_yield_farm_delta_rpvs as ws}from"@galacticcouncil/math-liquidity-mining";import nn from"big.js";var xe=nn(10).pow(18),sn=BigInt(nn(1).pow(18).toString()),rn=6e3;var xs="1000000000000000000",re=class{constructor(t,e,n){this.getAccount=t;this.getAsset=e;this.multiCurrency=n}async syncGlobalFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===e)return null;if(t.total_shares_z===0n)return t;let s=await this.getAsset(t.reward_currency),r=e-t.updated_at,i=this.getAccount(t.id),a=s?.existential_deposit;if(!a)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.freeBalance(t.reward_currency,i),l=tt(a.toString()),c=tt(o.toString()).minus(l.lt(o.toString())?a.toString():o.toString()),u=tt(Ss(t.total_shares_z.toString(),n.toString(),tt(t.yield_per_period.toString()).mul(xe).round(0,tt.roundDown).toFixed(),t.max_reward_per_period.toString(),r.toFixed()));if(c.lt(u)&&(u=c),u.eq(0))return t;let d=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,i,d,BigInt(u.toFixed())),{...t,accumulated_rpz:BigInt(Ps(t.accumulated_rpz.toString(),t.total_shares_z.toString(),u.toFixed()))}}syncYieldFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===n)return null;if(t.total_valued_shares===0n)return{...t,updated_at:n};let s=ws(t.accumulated_rpz.toString(),e.accumulated_rpz.toString(),t.multiplier.toString(),t.total_valued_shares.toString());return{...t,accumulated_rpvs:t.accumulated_rpvs+BigInt(s),updated_at:n}}getLoyaltyMultiplier(t,e){let n=tt(1).mul(xe).round(0,tt.roundDown).toString();if(!e)return n;let{initial_reward_percentage:s,scale_coef:r}=e;return Ts(t.toFixed(),s.toString(),r.toFixed())}async claimRewards(t,e,n,s,r){if(e.state.type==="Terminated")return null;let i=Math.floor(s/t.blocks_per_period);if(n.updated_at===i)return null;let a=await this.syncGlobalFarm(t,i,r);if(!a)return null;let o=this.syncYieldFarm(e,a,i);if(!o)return null;let l=o.total_stopped-n.stopped_at_creation,c=o.updated_at-n.entered_at-l,u=this.getLoyaltyMultiplier(c,o.loyalty_curve),d=BigInt(an(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),u)),m=BigInt(an(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),xs));return{reward:d,maxReward:m,assetId:a.reward_currency}}};var Is=C(365.2425).times(24).times(60).times(60),_t=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??rn})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((r,i)=>r-i);if(t===e)return sn;let s=await this.client.getOraclePrice(n);if(s){let{n:r,d:i}=s[0].price,a;return t<e?a=on(r.toString(),i.toString()):a=on(i.toString(),r.toString()),BigInt(a)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),s=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),r=Buffer.from([t]),i=Buffer.concat([n,s,r]),o="0x"+Buffer.concat([i,Buffer.alloc(32-i.length)]).toString("hex");return vs(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,s){let r=C(s).times(t.toString()).times(e.toString()).div(18);return r.gte(n.toString())?n.toString():r.toString()}getPoolYieldPerPeriod(t,e,n,s){let r=C(t.toString()).times(e),i=C(n.toString()).times(s);return r.div(i.toString()).toString()}farmData(t,e,n){let{yieldFarm:s,globalFarm:r,priceAdjustment:i,balance:a,id:o}=t,{multiplier:l,loyalty_curve:c}=s,{blocks_per_period:u,yield_per_period:d,total_shares_z:m,max_reward_per_period:g,pending_rewards:b,accumulated_paid_rewards:h,planned_yielding_periods:y,updated_at:f,incentivized_asset:S,reward_currency:T,price_adjustment:R,min_deposit:D}=r,F=A.shiftNeg(i??R,18),L=A.shiftNeg(l,18),z=A.shiftNeg(c?.initial_reward_percentage??0,18),j=Is.div(C(this.blockTime).div(1e3).times(u)).toString(),G;if(m<=0)G=C(L).times(d.toString()).times(j).toString();else{let Dn=this.getGlobalRewardPerPeriod(m,d,g,F),Cn=this.getPoolYieldPerPeriod(Dn,L,m,F);G=C(Cn).times(j).toString()}let Y=b+h,Tt=g*BigInt(y),$=a.transferable+Y,qe=$-Y,Kt=C(qe.toString()).div(g.toString()),zt=C(e).div(u.toString()).toString(),jt=(m>=0?Kt.plus(f):Kt.plus(zt)).toString(),ue=C(jt).times(u).toString(),En=C(m.toString()).div(C(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(F).toFixed(2),Ne=C(Y.toString()).div($.toString()).gte(.999);G=Ne?"0":C(G).div(n?2:1).times(100).toString();let kn=z?C(G).times(z).toString():void 0;return{apr:G,minApr:kn,isDistributed:Ne,estimatedEndPeriod:jt,estimatedEndBlock:ue,maxRewards:Tt,incentivizedAsset:S,rewardCurrency:T,loyaltyCurve:c,currentPeriod:zt,potMaxRewards:$,fullness:En,yieldFarmId:s.id,globalFarmId:r.id,poolId:o,distributedRewards:Y,plannedYieldingPeriods:y,minDeposit:D}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((s,r)=>s.includes(r.keyArgs[0].toString())?s:[...s,r.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async s=>{let r=await this.getOmnipoolFarms(s);if(r)return[s,r]}));return Object.fromEntries(n.filter(s=>!!s))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),n=await this.client.getRelayBlockNumber(),s=await Promise.all(e.map(async({keyArgs:r,value:i})=>{let[,a]=r,o=i,l=await this.client.getOmnipoolGlobalFarm(a),c=await this.client.getOmnipoolYieldFarm(Number(t),a,o);if(!l||!c)return;let u=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(a),g=await this.getOraclePrice(u,d),b=await this.balanceClient.getBalance(m,u);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b}}));return n?s.map(r=>r?this.farmData(r,n):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((s,r)=>s.includes(r.keyArgs[0].toString())?s:[...s,r.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async s=>{let r=await this.getIsolatedFarms(s);if(r)return[s,r]}));return Object.fromEntries(n.filter(s=>!!s))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),s=await Promise.all(e.map(async({keyArgs:r,value:i})=>{let[,a]=r,o=i,l=await this.client.getIsolatedGlobalFarm(a),c=await this.client.getIsolatedYieldFarm(t,a,o);if(!l||!c)return;let u=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(a,!0),g=await this.getOraclePrice(u,d),b=await this.balanceClient.getBalance(m,u);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b,farmAddress:m}}));return n?s.map(r=>r?this.farmData(r,n,!0):void 0):[]}async getDepositReward(t,e,n,s){let r=e.global_farm_id,i=e.yield_farm_id,a=n?await this.client.getIsolatedYieldFarm(t,r,i):await this.client.getOmnipoolYieldFarm(Number(t),r,i),o=n?await this.client.getIsolatedGlobalFarm(r):await this.client.getOmnipoolGlobalFarm(r);if(!o||!a)return;let l=o.reward_currency,c=o.incentivized_asset,u=[[this.getFarmAddress(0,n),o.reward_currency],[this.getFarmAddress(o.id,n),o.reward_currency]],d=await this.getAccountAssetBalances(u),m=await this.getOraclePrice(l,c),g=new se(u,d),h=await new re(f=>this.getFarmAddress(f),f=>this.client.getAsset(f),g).claimRewards(o,a,e,s,m??o.price_adjustment);if(!h)return;let y=await this.client.getAsset(h.assetId);if(y&&!(h.reward<=y.existential_deposit))return h}async getAccountAssetBalances(t){let[e,n]=await Promise.all([Promise.all(t.filter(([r,i])=>i!==0).map(([r,i])=>this.balanceClient.getTokenBalance(r,i))),Promise.all(t.filter(([r,i])=>i===0).map(([r])=>this.balanceClient.getSystemBalance(r)))]),s=[];for(let r=0,i=0;r+i<t.length;){let a=r+i,[,o]=t[a];o===0?(s.push(n[i]),i+=1):(s.push(e[r]),r+=1)}return s}};import{Binary as Os,Enum as As}from"polkadot-api";var Bt=class extends E{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(Os.fromText("omnipool"),t,As("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getAllOmnipooFarms(){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries()}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,n){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,n)}async getAllIsolatedFarms(){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries()}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,n){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,n)}async getAsset(t){return this.api.query.AssetRegistry.Assets.getValue(t)}};var Pn={};x(Pn,{PoolContextProvider:()=>gt,PoolError:()=>et,PoolFactory:()=>dt,PoolType:()=>_,aave:()=>Fe,lbp:()=>ve,omni:()=>Oe,stable:()=>_e,xyk:()=>Be});var ve={};x(ve,{LbpMath:()=>U,LbpPool:()=>Rt,LbpPoolClient:()=>Ft});import{calculate_in_given_out as _s,calculate_out_given_in as Bs,calculate_linear_weights as Rs,calculate_pool_trade_fee as Fs,get_spot_price as Es}from"@galacticcouncil/math-lbp";var U=class{static getSpotPrice(t,e,n,s,r){return Es(t,e,n,s,r)}static calculateInGivenOut(t,e,n,s,r){return _s(t,e,n,s,r)}static calculateOutGivenIn(t,e,n,s,r){return Bs(t,e,n,s,r)}static calculateLinearWeights(t,e,n,s,r){return Rs(t,e,n,s,r)}static calculatePoolTradeFee(t,e,n){return Fs(t,e,n)}};var _=(r=>(r.Aave="Aave",r.LBP="LBP",r.Omni="Omnipool",r.Stable="Stableswap",r.XYK="XYK",r))(_||{}),et=(r=>(r.InsufficientTradingAmount="InsufficientTradingAmount",r.MaxInRatioExceeded="MaxInRatioExceeded",r.MaxOutRatioExceeded="MaxOutRatioExceeded",r.TradeNotAllowed="TradeNotAllowed",r.UnknownError="UnknownError",r))(et||{});var{FeeUtils:cn}=A,Rt=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new p(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,s,r,i,a){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r,this.fee=i,this.repayFeeApply=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),r=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:r.balance,decimalsIn:s.decimals,decimalsOut:r.decimals,weightIn:s.weight,weightOut:r.weight}}validateAndBuy(t,e,n){let s=this.tokens[0].id,r=[];e<this.minTradingLimit&&r.push("InsufficientTradingAmount");let i=t.balanceOut/this.maxOutRatio;if(e>i&&r.push("MaxOutRatioExceeded"),s===t.assetOut){let a=this.calculateTradeFee(e,n),o=cn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+a,c=this.calculateInGivenOut(t,l),u=t.balanceIn/this.maxInRatio;return c>u&&r.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:r}}else{let a=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return a>o&&r.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:r}}}validateAndSell(t,e,n){let s=this.tokens[0].id,r=[];e<this.minTradingLimit&&r.push("InsufficientTradingAmount");let i=t.balanceIn/this.maxInRatio;if(e>i&&r.push("MaxInRatioExceeded"),s===t.assetIn){let a=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return a>o&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:r}}else{let a=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(a,n),l=cn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=a-o,u=t.balanceOut/this.maxOutRatio;return c>u&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:c,feePct:l,errors:r}}}calculateInGivenOut(t,e){let n=U.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}calculateOutGivenIn(t,e){let n=U.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}spotPriceInGivenOut(t){let e=U.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=U.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=U.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Js}from"polkadot-api";import{Subscription as Zs,distinctUntilChanged as tr,filter as er}from"rxjs";import{memoize1 as Ds}from"@thi.ng/memoize";import{TLRUCache as Cs}from"@thi.ng/cache";import{ReplaySubject as Ms,Subscription as Ls,bufferCount as qs,combineLatest as un,debounceTime as Ns,defer as Us,filter as Gs,finalize as Vs,from as Ws,map as lt,merge as Hs,of as Ys,pairwise as Xs,skip as Ks,share as zs,startWith as js,switchMap as $s,tap as pn,throttleTime as Qs}from"rxjs";import{BehaviorSubject as ks}from"rxjs";var ie=class{store$=new ks([]);updateQueue=Promise.resolve();changeset=new Set;get pools(){return this.store$.value}asObservable(){return this.store$.asObservable()}applyChangeset(t){return this.changeset.size===0?[]:t.filter(e=>this.changeset.has(e.address))}set(t){this.changeset=new Set(t.map(e=>e.address)),this.store$.next(t)}update(t){this.updateQueue=this.updateQueue.then(async()=>{let e=this.store$.value,n=new Map(e.map((a,o)=>[a.address,o])),s=await t(e),r=e.slice(),i=new Set;for(let a of s){let o=n.get(a.address);o===void 0?(n.set(a.address,r.length),r.push(a)):r[o]=a,i.add(a.address)}this.changeset=i,this.store$.next(r)}).catch(console.error)}destroy(){this.store$.complete()}};var q=class extends V{evm;store=new ie;shared$;mem=0;memPoolsCache=new Cs(null,{ttl:6*1e3});memPools=Ds(t=>(this.log(this.getPoolType(),"sync mem pools",t),this.loadPools()),this.memPoolsCache);constructor(t,e){super(t),this.evm=e}async getMemPools(){return this.memPools(this.mem)}async getPools(){return(await this.getMemPools()).filter(e=>this.hasValidAssets(e))}getSubscriber(){return this.shared$||(this.shared$=this.subscribeStore()),this.shared$.pipe(js([]),qs(2,1),lt(([t,e])=>t.length===0?e:this.store.applyChangeset(e)),Gs(t=>t.length>0),Qs(1e3,void 0,{leading:!0,trailing:!0}))}subscribeStore(){return Us(()=>{let t=new Ls;return Ws(this.getMemPools()).pipe(lt(n=>n.filter(s=>this.hasValidAssets(s))),pn(n=>this.store.set(n))).pipe(pn(()=>{t.add(this.subscribeUpdates())}),$s(n=>Hs(Ys(n),this.store.asObservable().pipe(Ks(1)))),Vs(()=>{t.unsubscribe()}))}).pipe(zs({connector:()=>new Ms(1),resetOnRefCountZero:!0}))}subscribeBalances(){let t=this.store.pools.map(e=>{let{address:n}=e,s=[this.subscribeTokensBalance(n)];if(this.hasSystemAsset(e)){let r=this.subscribeSystemBalance(n);s.push(r)}if(this.hasErc20Asset(e)){let r=e.tokens.filter(a=>a.type==="Erc20").map(a=>a.id),i=this.subscribeErc20Balance(n,r);s.push(i)}return un(s).pipe(lt(r=>r.flat()),Xs(),lt(([r,i])=>this.getDeltas(r,i)),lt(r=>[n,r]))});return un(t).pipe(Ns(250),lt(e=>new Map(e))).subscribe(e=>this.store.update(n=>this.updateBalances(n,e)))}hasSystemAsset(t){return t.tokens.some(e=>e.id===0)}hasErc20Asset(t){return t.tokens.some(e=>e.type==="Erc20")}hasValidAssets(t){return t.tokens.every(({decimals:e,balance:n})=>n>0n&&!!e)}updateBalances=(t,e)=>{let n=[],s=new Map(t.map(r=>[r.address,r]));for(let[r,i]of e){let a=s.get(r);if(a){let o=a.tokens.map(l=>{let c=i.find(u=>u.id===l.id);return c&&l.id!==a.id?{...l,balance:c.balance.transferable}:l});n.push({...a,tokens:o})}}return n}};var Ft=class extends q{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);getPoolType(){return"LBP"}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}getPoolWeights(t,e){let{start:n,end:s,initial_weight:r,final_weight:i}=t,a=U.calculateLinearWeights(n?n.toString():"0",s?s.toString():"0",r.toString(),i.toString(),e.toString()),o=BigInt(a),l=this.MAX_FINAL_WEIGHT-BigInt(o);return[o,l]}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(Js.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),s=e?.relay_parent_number||0,r=t.filter(({value:i})=>e&&this.isActivePool(i,s)).map(async({keyArgs:i,value:a})=>{let[o]=i,l=o.toString(),c=await this.getPoolDelta(l,a,s);return{address:l,type:"LBP",fee:a.fee,...c,...n}});return Promise.all(r)}async getPoolDelta(t,e,n){let{assets:s,repay_target:r,fee_collector:i}=e,[a,o]=this.getPoolWeights(e,n),[l,c]=s,[u,d,m,g,b]=await Promise.all([this.isRepayFeeApplied(l,r,i.toString()),this.getBalance(t,l),this.api.query.AssetRegistry.Assets.getValue(l),this.getBalance(t,c),this.api.query.AssetRegistry.Assets.getValue(c)]);return{repayFeeApply:u,tokens:[{id:l,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:d.transferable,weight:a,type:m?.asset_type.type},{id:c,decimals:b?.decimals,existentialDeposit:b?.existential_deposit,balance:g.transferable,weight:o,type:b?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:s}=t;return n&&s?e>=n&&e<s:!1}async isRepayFeeApplied(t,e,n){if(e===0n)return!1;try{return(await this.getBalance(n,t)).transferable<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolFees(t,e){let n=this.store.pools.find(r=>r.address===e);return{repayFee:await this.getRepayFee(),exchangeFee:n.fee}}subscribeValidationData(){return this.api.query.ParachainSystem.ValidationData.watchValue("best").pipe(er(t=>t!==void 0),tr((t,e)=>t.relay_parent_number===e.relay_parent_number)).subscribe(({relay_parent_number:t})=>{this.store.update(async e=>{let n=[];for(let s of e){let r=this.poolsData.get(s.address);if(r){let{assets:i,repay_target:a,fee_collector:o}=r,[l]=i,[c,u]=this.getPoolWeights(r,t),[d,m]=s.tokens,g=[{...d,weight:c},{...m,weight:u}],b=await this.isRepayFeeApplied(l,a,o.toString());n.push({...s,tokens:g,repayFeeApply:b})}}return n})})}subscribeUpdates(){let t=new Zs;return t.add(this.subscribeValidationData()),t}};var Oe={};x(Oe,{OmniMath:()=>w,OmniPool:()=>Et,OmniPoolClient:()=>kt});import{calculate_in_given_out as nr,calculate_lrna_in_given_out as sr,calculate_out_given_in as rr,calculate_out_given_lrna_in as ir,calculate_spot_price as ar,calculate_lrna_spot_price as or,calculate_shares as lr,calculate_liquidity_out as cr,calculate_liquidity_lrna_out as ur,verify_asset_cap as pr,calculate_liquidity_hub_in as mr,is_sell_allowed as dr,is_buy_allowed as gr,is_add_liquidity_allowed as hr,is_remove_liquidity_allowed as br,recalculate_asset_fee as yr,recalculate_protocol_fee as fr}from"@galacticcouncil/math-omnipool";import ct from"big.js";var w=class{static calculateSpotPrice(t,e,n,s){return ar(t,e,n,s)}static calculateLrnaSpotPrice(t,e){return or(t,e)}static calculateInGivenOut(t,e,n,s,r,i,a,o,l){return nr(t,e,n,s,r,i,a,o,l)}static calculateLrnaInGivenOut(t,e,n,s,r){return sr(t,e,n,s,r)}static calculateOutGivenIn(t,e,n,s,r,i,a,o,l){return rr(t,e,n,s,r,i,a,o,l)}static calculateOutGivenLrnaIn(t,e,n,s,r){return ir(t,e,n,s,r)}static calculateShares(t,e,n,s){return lr(t,e,n,s)}static calculateLiquidityOut(t,e,n,s,r,i,a,o){return cr(t,e,n,s,r,i,a,o)}static calculateLiquidityLRNAOut(t,e,n,s,r,i,a,o){return ur(t,e,n,s,r,i,a,o)}static calculateCapDifference(t,e,n,s){let r=ct(e),i=ct(t),a=ct(s),o=ct(n),l=ct(10).pow(18),c=o.div(l);if(r.div(a).lt(c)){let d=c.times(a).minus(r).times(i),m=r.times(ct(1).minus(c));return d.div(m).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,n,s){return mr(t,e,n,s)}static isSellAllowed(t){return dr(t)}static isBuyAllowed(t){return gr(t)}static isAddLiquidityAllowed(t){return hr(t)}static isRemoveLiquidityAllowed(t){return br(t)}static recalculateAssetFee(t,e,n,s,r,i,a,o,l,c,u){return yr(t,e,n,s,r,i,a,o,l,c,u)}static recalculateProtocolFee(t,e,n,s,r,i,a,o,l,c,u){return fr(t,e,n,s,r,i,a,o,l,c,u)}static verifyAssetCap(t,e,n,s){return pr(t,e,n,s)}};var{FeeUtils:ut}=A,Et=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new p(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,s,r,i){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r,this.hubAssetId=i}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),r=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:s.hubReserves,hubReservesOut:r.hubReserves,sharesIn:s.shares,sharesOut:r.shares,decimalsIn:s.decimals,decimalsOut:r.decimals,balanceIn:s.balance,balanceOut:r.balance,tradeableIn:s.tradeable,tradeableOut:r.tradeable,assetInEd:s.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),r=this.calculateInGivenOut(t,e,n),i=s===0n?0:v.calculateDiffToRef(r,s),a=[],o=w.isSellAllowed(t.tradeableIn),l=w.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&a.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&a.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return r>u&&a.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:s,amountOut:e,feePct:i,errors:a}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,n),i=v.calculateDiffToRef(s,r),a=[],o=w.isSellAllowed(t.tradeableIn),l=w.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&a.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&a.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return r>u&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:r,feePct:i,errors:a}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let s=w.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ut.toRaw(n.assetFee).toString():"0",n?ut.toRaw(n.protocolFee).toString():"0"),r=BigInt(s);return r<0n?0n:r}calculateLrnaInGivenOut(t,e,n){let s=w.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ut.toRaw(n.assetFee).toString():"0"),r=BigInt(s);return r<0n?0n:r}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let s=w.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ut.toRaw(n.assetFee).toString():"0",n?ut.toRaw(n.protocolFee).toString():"0"),r=BigInt(s);return r<0n?0n:r}calculateOutGivenLrnaIn(t,e,n){let s=w.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ut.toRaw(n.assetFee).toString():"0"),r=BigInt(s);return r<0n?0n:r}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=w.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=w.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=w.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=w.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as Pr,Binary as Sr,CompatibilityLevel as Tr,Enum as wr}from"polkadot-api";import{toHex as xr}from"@polkadot-api/utils";import{Subscription as vr,distinctUntilChanged as Ie,filter as Ir,finalize as pt,map as Or,merge as Ar}from"rxjs";var{FeeUtils:B}=A,mn=Sr.fromText("omnipool"),dn=wr("Short"),kt=class extends q{queryBus=new te;block=0;dynamicFeesConfig=this.queryBus.scope("DynamicFees.AssetFeeConfiguration",t=>this.api.query.DynamicFees.AssetFeeConfiguration.getValue(t),t=>String(t));dynamicFees=this.queryBus.scope("DynamicFees.AssetFee",t=>this.api.query.DynamicFees.AssetFee.getValue(t),t=>String(t),6*1e3);emaOracles=this.queryBus.scope("EmaOracle.Oracles.Short",t=>this.api.query.EmaOracle.Oracles.getValue(mn,t,dn),t=>t.join(":"),6*1e3);getPoolType(){return"Omnipool"}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=xr(e);return Pr(63).dec(n)}getOraclePair(t){return t===0?[0,1]:[1,t]}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(Tr.BackwardsCompatible,e)}async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,s,r,i,a]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:c,value:u})=>{let[d]=c,{hub_reserve:m,shares:g,tradable:b,cap:h,protocol_shares:y}=u,[f,S]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:S.transferable,cap:h,hubReserves:m,protocolShares:y,shares:g,tradeable:b,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:i.transferable,tradeable:s,type:r?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...a}]}async getPoolFees(t){let e=t.assetOut,n=t.assetIn,s=await this.dynamicFeesConfig.get(e);if(s?.type==="Fixed"){let{asset_fee:f,protocol_fee:S}=s.value;return{assetFee:B.fromPermill(f),protocolFee:B.fromPermill(S)}}let r=this.getOraclePair(e),i=this.getOraclePair(n),[a,o,l]=await Promise.all([this.dynamicFees.get(e),this.emaOracles.get(r),this.emaOracles.get(i)]),[c,u,d]=await this.getAssetFee(t,this.block,a,o,s?.value.asset_fee_params),[m,g,b]=n===1?[0,0,0]:await this.getProtocolFee(t,this.block,a,l,s?.value.protocol_fee_params),h=c+m,y=d+b;return{assetFee:B.fromPermill(u),protocolFee:B.fromPermill(g),min:B.fromPermill(h),max:B.fromPermill(y)}}async getAssetFee(t,e,n,s,r){let{assetOut:i,balanceOut:a}=t,{min_fee:o,max_fee:l,decay:c,amplification:u}=r||await this.api.constants.DynamicFees.AssetFeeParameters();if(!n||!s)return[o,o,l];let d=B.fromPermill(o),m=B.fromPermill(l),[g]=s,{asset_fee:b,timestamp:h}=n,y=Math.max(1,e-h),f=g.volume.b_in.toString(),S=g.volume.b_out.toString(),T=g.liquidity.b.toString();i===0&&(f=g.volume.a_in.toString(),S=g.volume.a_out.toString(),T=g.liquidity.a.toString());let R=B.fromPermill(b),D=w.recalculateAssetFee(f,S,T,"9",a.toString(),B.toRaw(R).toString(),y.toString(),B.toRaw(d).toString(),B.toRaw(m).toString(),c.toString(),u.toString());return[o,Number(D)*1e6,l]}async getProtocolFee(t,e,n,s,r){let{assetIn:i,balanceIn:a}=t,{min_fee:o,max_fee:l,decay:c,amplification:u}=r||await this.api.constants.DynamicFees.ProtocolFeeParameters();if(!n||!s)return[o,o,l];let d=B.fromPermill(o),m=B.fromPermill(l),[g]=s,{protocol_fee:b,timestamp:h}=n,y=Math.max(1,e-h),f=g.volume.b_in.toString(),S=g.volume.b_out.toString(),T=g.liquidity.b.toString();i===0&&(f=g.volume.a_in.toString(),S=g.volume.a_out.toString(),T=g.liquidity.a.toString());let R=B.fromPermill(b),D=w.recalculateProtocolFee(f,S,T,"9",a.toString(),B.toRaw(R).toString(),y.toString(),B.toRaw(d).toString(),B.toRaw(m).toString(),c.toString(),u.toString());return[o,Number(D)*1e6,l]}subscribeEmaOracles(){let[t]=this.store.pools,n=t.tokens.map(s=>s.id).map(s=>this.getOraclePair(s)).map(s=>this.api.query.EmaOracle.Oracles.watchValue(mn,s,dn,"best").pipe(Ir(r=>r!==void 0),Or(r=>({pair:s,value:r}))));return Ar(...n).pipe(pt(()=>{this.log(this.getPoolType(),"unsub ema oracles"),this.emaOracles.clear()})).subscribe(s=>{let{pair:r,value:i}=s;this.emaOracles.set(i,r)})}subscribeDynamicFees(){return this.api.query.DynamicFees.AssetFee.watchEntries({at:"best"}).pipe(Ie((t,e)=>!e.deltas),pt(()=>{pt(()=>{this.log(this.getPoolType(),"unsub dyn fees"),this.dynamicFees.clear()})})).subscribe(({deltas:t})=>{t?.upserted.forEach(e=>{let[n]=e.args;this.dynamicFees.set(e.value,n)})})}subscribeDynamicFeesConfig(){return this.api.query.DynamicFees.AssetFeeConfiguration.watchEntries({at:"best"}).pipe(Ie((t,e)=>!e.deltas),pt(()=>{this.log(this.getPoolType(),"unsub dyn fees config"),this.dynamicFeesConfig.clear()})).subscribe(({deltas:t})=>{t?.upserted.forEach(e=>{let[n]=e.args;this.dynamicFeesConfig.set(e.value,n)})})}subscribeBlock(){return this.api.query.System.Number.watchValue("best").pipe(pt(()=>{this.log(this.getPoolType(),"unsub block change")})).subscribe(t=>{this.block=t})}subscribeAssets(){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(Ie((t,e)=>!e.deltas),pt(()=>{this.log(this.getPoolType(),"unsub assets")})).subscribe(({deltas:t})=>{this.store.update(([e])=>{let n=t?.upserted.reduce((r,i)=>{let[a]=i.args;return r.set(a,i.value),r},new Map),s=e.tokens.map(r=>{let i=n?.get(r.id);return i?this.updateTokenState(r,i):r});return[{...e,tokens:s}]})})}subscribeUpdates(){let t=new vr;return t.add(this.subscribeAssets()),t.add(this.subscribeDynamicFees()),t.add(this.subscribeDynamicFeesConfig()),t.add(this.subscribeEmaOracles()),t.add(this.subscribeBlock()),t}updateTokenState(t,e){let{hub_reserve:n,shares:s,tradable:r,cap:i,protocol_shares:a}=e;return{...t,cap:i,hubReserves:n,protocolShares:a,shares:s,tradeable:r}}};var _e={};x(_e,{StableMath:()=>k,StableSwap:()=>Dt,StableSwapClient:()=>Ct});import{calculate_in_given_out as _r,calculate_out_given_in as Br,calculate_amplification as Rr,calculate_add_one_asset as Fr,calculate_liquidity_out_one_asset as Er,calculate_shares as kr,calculate_shares_for_amount as Dr,calculate_spot_price_with_fee as Cr,pool_account_name as Mr,recalculate_peg as Lr}from"@galacticcouncil/math-stableswap";var k=class{static getPoolAddress(t){return Mr(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,s,r){return Rr(t,e,n,s,r)}static calculateInGivenOut(t,e,n,s,r,i,a){return _r(t,e,n,s,r,i,a)}static calculateAddOneAsset(t,e,n,s,r,i,a){return Fr(t,e,n,s,r,i,a)}static calculateSharesForAmount(t,e,n,s,r,i,a){return Dr(t,e,n,s,r,i,a)}static calculateOutGivenIn(t,e,n,s,r,i,a){return Br(t,e,n,s,r,i,a)}static calculateLiquidityOutOneAsset(t,e,n,s,r,i,a){return Er(t,e,n,s,r,i,a)}static calculateShares(t,e,n,s,r,i){return kr(t,e,n,s,r,i)}static calculateSpotPriceWithFee(t,e,n,s,r,i,a,o){return Cr(t,e,n,s,r,i,a,o)}static recalculatePegs(t,e,n,s,r){let i=Lr(t,e,n,s,r);return JSON.parse(i)}};var{FeeUtils:mt}=A,Dt=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;isRampPeriod;id;fee;totalIssuance;pegs;static fromPool(t){return new p(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.isRampPeriod,t.id,t.fee,t.totalIssuance,t.pegs)}constructor(t,e,n,s,r,i,a,o,l,c,u){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r,this.amplification=i,this.isRampPeriod=a,this.id=o,this.fee=l,this.totalIssuance=c,this.pegs=u}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),r=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:r.balance,decimalsIn:s.decimals,decimalsOut:r.decimals,tradeableIn:this.id===t?15:s.tradeable,tradeableOut:this.id===e?15:r.tradeable,assetInEd:s.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),r=this.calculateInGivenOut(t,e,n),i=s===0n?0:v.calculateDiffToRef(r,s),a=[],o=w.isSellAllowed(t.tradeableIn),l=w.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&a.push("InsufficientTradingAmount"),{amountIn:r,calculatedIn:s,amountOut:e,feePct:i,errors:a}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,n),i=v.calculateDiffToRef(s,r),a=[],o=w.isSellAllowed(t.tradeableIn),l=w.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&a.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:s,amountOut:r,feePct:i,errors:a}}calculateIn(t,e,n){let s=k.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateAddOneAsset(t,e,n){let s=k.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateSharesForAmount(t,e,n){let s=k.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=k.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let s=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(s)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let s=k.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateWithdrawOneAsset(t,e,n){let s=k.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateShares(t,e,n){let s=k.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(s);return r<0n?0n:r}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=k.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let s=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(s)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:s})=>({asset_id:e,amount:n,decimals:s}));return JSON.stringify(t,J.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],J.jsonFormatter)}};import{AccountId as qr,CompatibilityLevel as Nr}from"polkadot-api";import{toHex as Ur}from"@polkadot-api/utils";import{blake2b as Gr}from"@noble/hashes/blake2b";import{Subscription as Vr,distinctUntilChanged as Wr,finalize as Ae,map as Hr,merge as Yr}from"rxjs";var{FeeUtils:Xr}=A,Ct=class extends q{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=k.getPoolAddress(t),n=Gr(e,{dkLen:32}),s=Ur(n);return qr(63).dec(s)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}getPoolAmplification(t,e){let{initial_amplification:n,final_amplification:s,initial_block:r,final_block:i}=t,a=k.calculateAmplification(n.toString(),s.toString(),r.toString(),i.toString(),e.toString()),o=Number(a)<s;return{amplification:BigInt(a),isRampPeriod:o}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),s=e.assets.map(async r=>{let[i,a,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,r),this.api.query.AssetRegistry.Assets.getValue(r),this.getBalance(n,r)]);return{id:r,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:o.transferable,tradeable:i,type:a?.asset_type.type}});return Promise.all(s)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(Nr.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),s=t.map(async({keyArgs:r,value:i})=>{let[a]=r,o=this.getPoolAddress(a),[l,c,u]=await Promise.all([this.getPoolTokens(a,i),this.api.query.Stableswap.PoolPegs.getValue(a),this.api.query.Tokens.TotalIssuance.getValue(a)]),d=this.getPoolAmplification(i,e),m=c?this.getRecentPegs(c):this.getDefaultPegs(i);return l.push({id:a,tradeable:15,balance:u,decimals:18}),this.poolsData.set(a,i),{address:o,id:a,type:"Stableswap",fee:Xr.fromPermill(i.fee),tokens:l,totalIssuance:u,pegs:m,...n,...d}});return Promise.all(s)}async getPoolFees(t,e){return{fee:this.store.pools.find(s=>s.address===e).fee}}getDefaultPegs(t){return k.defaultPegs(t.assets.length)}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,s])=>s.map(r=>r.toString()))}subscribeIssuance(){let e=this.store.pools.map(n=>n.id).map(n=>this.api.query.Tokens.TotalIssuance.watchValue(n,"best").pipe(Hr(s=>({id:n,value:s}))));return Yr(...e).pipe(Ae(()=>{this.log(this.getPoolType(),"unsub total issuance")})).subscribe(n=>{let{id:s,value:r}=n;this.store.update(i=>{let a=[];return i.filter(o=>o.id===s).forEach(o=>{let l=o.tokens.map(c=>c.id===s?{...c,balance:r}:c);a.push({...o,tokens:l,totalIssuance:r})}),a})})}subscribePoolPegs(){return this.api.query.Stableswap.PoolPegs.watchEntries({at:"best"}).pipe(Wr((t,e)=>!e.deltas),Ae(()=>{this.log(this.getPoolType(),"unsub pool pegs")})).subscribe(({deltas:t})=>{this.store.update(e=>{let n=[],s=new Map(e.map(r=>[r.id,r]));return t?.upserted.forEach(({args:r,value:i})=>{let[a]=r,o=s.get(a);if(o){let l=this.getRecentPegs(i);n.push({...o,pegs:l})}}),n})})}subscribeBlock(){return this.api.query.System.Number.watchValue("best").pipe(Ae(()=>{this.log(this.getPoolType(),"unsub block change")})).subscribe(t=>{this.store.update(e=>{let n=[];return e.filter(s=>s.isRampPeriod).forEach(s=>{let r=this.poolsData.get(s.id);if(r){let i=this.getPoolAmplification(r,t);n.push({...s,...i})}}),n})})}subscribeUpdates(){let t=new Vr;return t.add(this.subscribePoolPegs()),t.add(this.subscribeIssuance()),this.hasOnRamps()&&t.add(this.subscribeBlock()),t}hasOnRamps(){return this.store.pools.filter(t=>t.isRampPeriod).length>0}};var Be={};x(Be,{XykMath:()=>H,XykPool:()=>Mt,XykPoolClient:()=>Lt});import{calculate_in_given_out as Kr,calculate_out_given_in as zr,calculate_pool_trade_fee as jr,get_spot_price as $r,calculate_liquidity_in as Qr,calculate_shares as Jr,calculate_spot_price as Zr,calculate_spot_price_with_fee as ti,calculate_liquidity_out_asset_a as ei,calculate_liquidity_out_asset_b as ni}from"@galacticcouncil/math-xyk";var H=class{static getSpotPrice(t,e,n){return $r(t,e,n)}static calculateInGivenOut(t,e,n){return Kr(t,e,n)}static calculateOutGivenIn(t,e,n){return zr(t,e,n)}static calculatePoolTradeFee(t,e,n){return jr(t,e,n)}static calculateLiquidityIn(t,e,n){return Qr(t,e,n)}static calculateSpotPrice(t,e){return Zr(t,e)}static calculateSpotPriceWithFee(t,e,n,s){return ti(t,e,n,s)}static calculateShares(t,e,n){return Jr(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,s){return ei(t,e,n,s)}static calculateLiquidityOutAssetB(t,e,n,s){return ni(t,e,n,s)}};var{FeeUtils:gn}=A,Mt=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new p(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,s,r){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),r=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:s.decimals,decimalsOut:r.decimals,balanceIn:s.balance,balanceOut:r.balance,assetInEd:s.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),r=this.calculateTradeFee(s,n),i=gn.toPct(n.exchangeFee),a=s+r,o=[];(e<this.minTradingLimit||s<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let c=t.balanceIn/this.maxInRatio;return a>c&&o.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:s,amountOut:e,feePct:i,errors:o}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),r=this.calculateTradeFee(s,n),i=gn.toPct(n.exchangeFee),a=s-r,o=[];(e<this.minTradingLimit||s<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let c=t.balanceOut/this.maxOutRatio;return a>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:a,feePct:i,errors:o}}calculateInGivenOut(t,e){let n=H.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}calculateOutGivenIn(t,e){let n=H.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}spotPriceInGivenOut(t){let e=H.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=H.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=H.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as si}from"polkadot-api";import{Subscription as ri}from"rxjs";var Lt=class extends q{decimals=new Map([]);getPoolType(){return"XYK"}async withOverride(t){this.decimals=t?new Map(t.map(e=>[e.id,e.decimals])):new Map}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(si.BackwardsCompatible,e)}async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),s=e.map(async({keyArgs:r,value:i})=>{let[a]=r,[o,l]=i,[c,u,d,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:u?.decimals||this.decimals.get(o),existentialDeposit:u?.existential_deposit,balance:c.transferable,type:u?.asset_type.type},{id:l,decimals:m?.decimals||this.decimals.get(l),existentialDeposit:m?.existential_deposit,balance:d.transferable,type:m?.asset_type.type}],...n}});return Promise.all(s)}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}subscribeUpdates(){return ri.EMPTY}};var Fe={};x(Fe,{AavePool:()=>qt,AavePoolClient:()=>Nt});var qt=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new p(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,s,r){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=r}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),r=n.get(e);if(s==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:s.balance,balanceOut:r.balance,decimalsIn:s.decimals,decimalsOut:r.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),r=[];return e>t.balanceOut&&r.push("TradeNotAllowed"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:r}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),r=[];return s>t.balanceOut&&r.push("TradeNotAllowed"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:r}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};import{AccountId as ii}from"polkadot-api";import{toHex as ai}from"@polkadot-api/utils";import{Subscription as bn,filter as Re,finalize as yn,map as fn}from"rxjs";import{decodeEventLog as oi}from"viem";var hn=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:li}=nt,ci=["Supply","Withdraw","Repay","Borrow"],Nt=class extends q{getPoolType(){return"Aave"}async isSupported(){return!0}getPoolId(t,e){let n=t+"/"+e,s=new TextEncoder().encode(n.padEnd(32,"\0")),r=ai(s);return ii(63).dec(r)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:s,liqudity_in:r,liqudity_out:i})=>{let[a,o,l,c]=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:c,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:s,liqudity_out:r}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(i=>{let a=i.id===e.id?s:r;return{...i,balance:a}})}async getPoolFees(){return{}}getReserveH160Id(t){return t.type==="Erc20"?J.findNestedKey(t.location,"AccountKey20").AccountKey20.key:li.fromAssetId(t.id)}parseRouterLog(t){let{asset_in:e,asset_out:n}=t;return{assetIn:e,assetOut:n,key:`${e}:${n}`}}parseEvmLog(t){let{topics:e,data:n}=t.log,s=e.map(i=>i.asHex()),r=n.asHex();try{let{eventName:i,args:a}=oi({abi:hn,topics:s,data:r}),o=a.reserve.toLowerCase();return{eventName:i,reserve:o,key:`${i}:${o}`}}catch{return}}subscribeRouterExecuted(){let e=this.store.pools.map(n=>n.tokens).map(([n,s])=>s).map(n=>n.id);return this.api.event.Router.Executed.watch().pipe(fn(({payload:n})=>this.parseRouterLog(n)),Re(({assetIn:n,assetOut:s})=>e.includes(n)||e.includes(s)),yn(()=>{this.log(this.getPoolType(),"unsub router executed")})).subscribe(({assetIn:n,assetOut:s,key:r})=>{this.log(this.getPoolType(),"[router:Executed]",r),this.store.update(async i=>{let a=[];for(let o of i){let[l,c]=o.tokens;if(c.id===n||c.id===s){let d=await this.getPoolDelta(o);a.push({...o,tokens:d})}}return a})})}subscribeEvmLog(){return this.api.event.EVM.Log.watch().pipe(fn(({payload:t})=>this.parseEvmLog(t)),Re(t=>t!==void 0),Re(({eventName:t})=>ci.includes(t)),yn(()=>{this.log(this.getPoolType(),"unsub evm log")})).subscribe(({reserve:t,key:e})=>{this.log(this.getPoolType(),"[evm:Log]",e),this.store.update(async n=>{let s=[];for(let r of n){let[i]=r.tokens;if(this.getReserveH160Id(i).toLowerCase()===t){let o=await this.getPoolDelta(r);s.push({...r,tokens:o})}}return s})})}subscribeBalances(){return bn.EMPTY}subscribeUpdates(){let t=new bn;return t.add(this.subscribeRouterExecuted()),t.add(this.subscribeEvmLog()),t}};var dt=class{static get(t){switch(t.type){case"Aave":return qt.fromPool(t);case"XYK":return Mt.fromPool(t);case"Omnipool":return Et.fromPool(t);case"LBP":return Rt.fromPool(t);case"Stableswap":return Dt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as ui,Subscription as Ut,takeUntil as pi}from"rxjs";var gt=class extends E{evm;aave;omnipool;stableswap;xyk;lbp;active=new Set([]);pools=new Map([]);clients=[];aaveSub=Ut.EMPTY;omniSub=Ut.EMPTY;stableSub=Ut.EMPTY;xykSub=Ut.EMPTY;lbpSub=Ut.EMPTY;isReady=!1;isDestroyed=new ui;constructor(t,e){super(t),this.evm=e,this.lbp=new Ft(t,e),this.omnipool=new kt(t,e),this.stableswap=new Ct(t,e),this.xyk=new Lt(t,e),this.aave=new Nt(t,e),this.clients=[this.lbp,this.omnipool,this.stableswap,this.xyk,this.aave]}subscribe(t){return t.getSubscriber().pipe(pi(this.isDestroyed)).subscribe(e=>{e.forEach(n=>{this.pools.set(n.address,n)})})}withOmnipool(){return this.omniSub.unsubscribe(),this.omniSub=this.subscribe(this.omnipool),this.active.add("Omnipool"),this}withStableswap(){return this.stableSub.unsubscribe(),this.stableSub=this.subscribe(this.stableswap),this.active.add("Stableswap"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbp),this.active.add("LBP"),this}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aave),this.active.add("Aave"),this}withXyk(t){return this.xyk.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xyk),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.isReady){let e=this.pools.values();return Array.from(e)}let t=await Promise.all(this.clients.filter(e=>this.active.has(e.getPoolType())).map(e=>e.getPools()));return this.isReady=!0,t.flat()}async getPoolFees(t,e){let n=this.clients.find(s=>s.getPoolType()===e.type);if(n)return n.getPoolFees(t,e.address);throw new It(e.type)}};var vn={};x(vn,{DEFAULT_BLOCK_TIME:()=>Tn,DEFAULT_MIN_BUDGET:()=>De,ORDER_MIN_BLOCK_PERIOD:()=>wn,Router:()=>ht,TWAP_BLOCK_PERIOD:()=>Ht,TWAP_MAX_DURATION:()=>Me,TWAP_MAX_PRICE_IMPACT:()=>Ce,TWAP_TX_MULTIPLIER:()=>Sp,TradeOrderError:()=>ke,TradeOrderType:()=>oe,TradeRouteBuilder:()=>N,TradeRouter:()=>bt,TradeScheduler:()=>yt,TradeType:()=>ae});var Gt=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var mi=10,Vt=class{isNotVisited(t,e){let n=!0;return e.forEach(s=>{(s[0]===t[0]||s[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let s=[],r=new Gt,i=[];for(i.push([e,""]),r.enqueue(i);r.size()>0;){let a=r.dequeue();if(!a||a.length>mi)continue;let o=a[a.length-1];(n===null||o[0]===n)&&s.push(a),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,a)){let u=[...a];u.push(c),r.enqueue(u)}})}return s}findShortestPaths(t,e,n){let s=[],r=new Gt,i=[];i.push([e,""]),r.enqueue(i);let a=1/0;for(;r.size()>0;){let o=r.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<a?(a=o.length,s.length=0,s.push(o)):o.length===a&&s.push(o);continue}let c=t.get(l[0]);for(let u of c??[])this.isNotVisited(u,o)&&r.enqueue([...o,u])}return s}buildAndPopulateGraph(t,e){let n=new Map;for(let s of t)n.set(parseInt(s),[]);for(let[s,r,i]of e)n.get(r)?.push([i,s]);return n}};function Ee(p){let t={};for(let e of p){let n=e.tokens.length;for(let s=0;s<n;s++){t[e.tokens[s].id]||(t[e.tokens[s].id]=[]);for(let r=0;r<n;r++){if(s==r)continue;let i=[e.address,e.tokens[s].id,e.tokens[r].id];t[e.tokens[s].id].push(i)}}}return t}var Wt=class{getProposals(t,e,n){let s=n.filter(h=>h.type==="XYK"),r=n.filter(h=>h.type!=="XYK"),i=new Set(r.map(h=>h.tokens).flat().map(h=>h.id)),a=i.has(t),o=i.has(e),l=new Vt,c=h=>{let y=Ee(h),f=Object.keys(y),S=f.flatMap(T=>y[T]);return l.buildAndPopulateGraph(f,S)};if(!a&&!o){let h=s.filter(S=>S.tokens.find(T=>T.id===t)||S.tokens.find(T=>T.id===e)),y=c(h),f=l.findPaths(y,t,e);return this.parsePaths(f)}if(a&&o){let h=c(r),y=l.findPaths(h,t,e);return this.parsePaths(y)}let u=a?e:t,d=s.filter(h=>h.tokens.some(y=>y.id===u));if(d.length===0)return[];let m=[...r,...d],g=c(m),b=l.findPaths(g,t,e);return this.parsePaths(b)}parsePaths(t){let e=[];for(let n of t){let s=[];for(let r=0;r<n.length;r++){let i=n[r],a=n[r+1];if(a==null)break;s.push(this.toEdge(i,a))}e.push(s)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var ht=class{routeSuggester;routeProposals;ctx;filter={};constructor(t){this.ctx=t,this.routeSuggester=new Wt,this.routeProposals=new Map}async withFilter(t){this.filter=t||{}}buildRouteKey(t,e,n){return`${t}->${e}::${n.length}`}applyPoolFilter(t){let{useOnly:e=[],exclude:n=[]}=this.filter,s=new Set(e),r=new Set(n);return t.filter(i=>r.has(i.type)?!1:s.size>0?s.has(i.type):!0)}async getPools(){let t=await this.ctx.getPools();return this.applyPoolFilter(t)}async getRoutes(t,e){let n=await this.getPools();return this.validateInput(t,e,n),this.getPaths(t,e,n)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}async getRouteableAssets(t){let e=await this.getTradeableAssets();return(await Promise.all(e.filter(s=>s!==t).map(s=>this.getRoutes(s,t)))).filter(s=>s.length>0).map(([s])=>s[0].assetIn).sort()}validateInput(t,e,n){if(n.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let s=this.getAssets(n);if(!s.has(t))throw new Error(t+" is not supported asset");if(!s.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(s=>s.id)).flat().sort((n,s)=>n>s?1:-1);return new Set(e)}getPaths(t,e,n){let s=this.toPoolsMap(n);return this.getProposals(t,e,n).filter(i=>this.validPath(i,s)).map(i=>this.toHops(i,s))}getProposals(t,e,n){let s=this.buildRouteKey(t,e,n);if(this.routeProposals.has(s))return this.routeProposals.get(s);let r=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(s,r),r}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,s)=>n&&s)}validEdge([t,e,n],s){return s.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,dt.get(e)]))}toHops(t,e){return t.map(([n,s,r])=>{let i=e.get(n);return{poolAddress:n,poolId:i?.id,pool:i?.type,assetIn:s,assetOut:r}})}};var ae=(e=>(e.Buy="Buy",e.Sell="Sell",e))(ae||{}),oe=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(oe||{}),ke=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(ke||{});var{FeeUtils:Sn}=A,bt=class extends ht{mlr;poolsSnapshot;constructor(t){super(t),this.mlr=new Map}buildCtxSync(t,e){let n=this.poolsSnapshot,s=super.validateInput(t,e,n),r=super.getPaths(t,e,n);if(!r.length)throw new Ot(t,e);return{paths:r,pools:n,poolsMap:s}}async withCtx(t,e,n){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let s=this.buildCtxSync(t,e);return n(s)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,s)=>{let r=n[n.length-1].amountOut,i=s[s.length-1].amountOut;return r>i?-1:1});return e.find(n=>n.every(s=>s.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(r=>r.tradeFeeRange?.[0]??r.tradeFeePct).reduce((r,i)=>r+i),s=t.map(r=>r.tradeFeeRange?.[1]??r.tradeFeePct).reduce((r,i)=>r+i);return[n,s]}}getPoolFeeRange(t){let e=t.min?Sn.toPct(t.min):void 0,n=t.max?Sn.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetOutDecimals).reduce((a,o)=>a+o),s=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),r=n-e.assetOutDecimals,i=Math.pow(10,r);return s/BigInt(i)}async getSell(t,e,n,s){return this.withCtx(t,e,async({paths:r,poolsMap:i})=>{let a;if(s)a=await this.toSellSwaps(n,s,i);else{let o=r.map(c=>this.toSellSwaps(n,c,i)),l=await Promise.all(o);a=this.findBestSellRoute(l)}return this.buildSell(i,a)})}async getSells(t,e,n){return this.withCtx(t,e,async({paths:s,poolsMap:r})=>{let i=s.map(o=>this.toSellSwaps(n,o,r));return(await Promise.all(i)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildSell(r,o)).sort((o,l)=>o.amountOut>l.amountOut?-1:1)})}buildSell(t,e){let n=e[0],s=e[e.length-1],r=this.isDirectTrade(e),i=this.getSellSpot(e),a=s.amountOut,o=r?s.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-a,c=this.getRouteFeeRange(e),u=r?s.tradeFeePct:v.calculateSellFee(o,a),d=Math.pow(10,n.assetInDecimals),m=n.amountIn*i/BigInt(d),g=v.calculateDiffToRef(o,m);return{type:"Sell",amountIn:n.amountIn,amountOut:s.amountOut,spotPrice:i,tradeFee:l,tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:P.toDecimal(n.amountIn,n.assetInDecimals),amountOut:P.toDecimal(s.amountOut,s.assetOutDecimals),spotPrice:P.toDecimal(i,s.assetOutDecimals),tradeFee:P.toDecimal(l,s.assetOutDecimals),tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0Y(t,e,n){let s=[];for(let r=0;r<e.length;r++){let i=e[r],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;r>0?l=s[r-1]:l=t;let c=a.calculateOutGivenIn(o,l);s.push(c)}return s[s.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:s,pools:r,poolsMap:i}=n,l=r.filter(b=>b.tokens.some(h=>h.id===t)).map(b=>b.type==="Aave"?b.tokens:b.tokens.filter(h=>h.id===t)).map(b=>b.map(h=>h.balance).reduce((h,y)=>h+y)).sort((b,h)=>h<b?-1:1)[0],c=v.getFraction(l,.1),u=await Promise.all(s.map(b=>this.toSellSwaps(c,b,i))),m=this.findBestSellRoute(u).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),g=this.buildRouteKey(t,e,r);return this.mlr.set(g,m),m}async toSellSwaps(t,e,n){let s=[];for(let r=0;r<e.length;r++){let i=e[r],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;r>0?l=s[r-1].amountOut:l=typeof t=="string"?P.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(o,a),{amountOut:u,calculatedOut:d,feePct:m,errors:g}=a.validateAndSell(o,l,c),b=this.getPoolFeeRange(c),h=a.spotPriceOutGivenIn(o),y=Math.pow(10,o.decimalsIn),f=l*h/BigInt(y),S=v.calculateDiffToRef(d,f);s.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:u,calculatedOut:d,spotPrice:h,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,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:P.toDecimal(l,o.decimalsIn),amountOut:P.toDecimal(u,o.decimalsOut),calculatedOut:P.toDecimal(d,o.decimalsOut),spotPrice:P.toDecimal(h,o.decimalsOut),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return s}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let s=this.buildRouteKey(t,e,n.pools),r=this.mlr.get(s);return r||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:s,poolsMap:r}=n,i=this.buildRouteKey(t,e,s),a=this.mlr.get(i);a||(a=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",a,r),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}}).catch(()=>{})}findBestBuyRoute(t){let e=t.sort((n,s)=>{let r=n[0].amountIn,i=s[0].amountIn;return r>i?1:-1});return e.find(n=>n.every(s=>s.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetInDecimals).reduce((a,o)=>a+o),s=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),r=n-e.assetInDecimals,i=Math.pow(10,r);return s/BigInt(i)}async getBuy(t,e,n,s){return this.withCtx(t,e,async({paths:r,poolsMap:i})=>{let a;if(s)a=await this.toBuySwaps(n,s,i);else{let o=r.map(c=>this.toBuySwaps(n,c,i)),l=await Promise.all(o);a=this.findBestBuyRoute(l)}return this.buildBuy(i,a)})}async getBuys(t,e,n){return this.withCtx(t,e,async({paths:s,poolsMap:r})=>{let i=s.map(o=>this.toBuySwaps(n,o,r));return(await Promise.all(i)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildBuy(r,o)).sort((o,l)=>o.amountIn>l.amountIn?1:-1)})}buildBuy(t,e){let n=e[e.length-1],s=e[0],r=this.isDirectTrade(e),i=this.getBuySpot(e),a=s.amountIn,o=r?s.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=a-o,c=this.getRouteFeeRange(e),u=r?s.tradeFeePct:v.calculateBuyFee(o,a),d=Math.pow(10,n.assetOutDecimals),m=n.amountOut*i/BigInt(d),g;return o===0n?g=-100:g=v.calculateDiffToRef(m,o),{type:"Buy",amountOut:n.amountOut,amountIn:s.amountIn,spotPrice:i,tradeFee:l,tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:P.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:P.toDecimal(s.amountIn,s.assetInDecimals),spotPrice:P.toDecimal(i,s.assetInDecimals),tradeFee:P.toDecimal(l,s.assetInDecimals),tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0X(t,e,n){let s=[];for(let r=e.length-1;r>=0;r--){let i=e[r],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;r==e.length-1?l=t:l=s[0];let c=a.calculateInGivenOut(o,l);s.unshift(c)}return s[0]}async toBuySwaps(t,e,n){let s=[];for(let r=e.length-1;r>=0;r--){let i=e[r],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;r==e.length-1?l=typeof t=="string"?P.toBigInt(t,o.decimalsOut):t:l=s[0].amountIn;let c=await this.ctx.getPoolFees(o,a),{amountIn:u,calculatedIn:d,feePct:m,errors:g}=a.validateAndBuy(o,l,c),b=this.getPoolFeeRange(c),h=a.spotPriceInGivenOut(o),y=Math.pow(10,o.decimalsOut),f=l*h/BigInt(y),S;d===0n?S=-100:S=v.calculateDiffToRef(f,d),s.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:u,calculatedIn:d,spotPrice:h,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,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:P.toDecimal(l,o.decimalsOut),amountIn:P.toDecimal(u,o.decimalsIn),calculatedIn:P.toDecimal(d,o.decimalsIn),spotPrice:P.toDecimal(h,o.decimalsIn),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return s}};var Tn=6e3,De=1000000000000000n,Ht=6,Ce=-5,Me=216e5,Sp=3,wn=6;import{Enum as xn}from"polkadot-api";var N=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:s,poolId:r})=>s==="Stableswap"?{pool:xn("Stableswap",r),asset_in:e,asset_out:n}:{pool:xn(s),asset_in:e,asset_out:n})}};var yt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??De})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,s,r){let[i,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=a,u=l[0],d=l[l.length-1],{assetInDecimals:m}=u,{assetOutDecimals:g}=d,b=Math.abs(c),h=this.getMinimumTradeCount(o,i),y=this.getOptimalTradeCount(b),f=r?Math.round(s/r):y,S=Math.ceil(s/h),T=Math.round(s/y),R=Math.round(s/f),D=o/BigInt(f),F=await this.router.getBestSell(t,e,D),L=o<i,z=[];L&&z.push("OrderTooSmall");let j=F.amountOut*BigInt(f),G=this.toBlockPeriod(R),Y=F.tradeFee*BigInt(f),Tt=N.build(l),$={assetIn:t,assetOut:e,errors:z,frequencyMin:S,frequencyOpt:T,frequency:R,tradeCount:f,tradeFee:Y,tradeImpactPct:F.priceImpactPct,tradePeriod:G,tradeRoute:Tt,type:"Dca"};return{...$,amountIn:o,amountOut:j,tradeAmountIn:F.amountIn,tradeAmountOut:F.amountOut,toHuman(){return{...$,amountIn:P.toDecimal(o,m),amountOut:P.toDecimal(j,g),tradeAmountIn:P.toDecimal(F.amountIn,m),tradeAmountOut:P.toDecimal(F.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),n=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let s=t+n/2n;return Number(s/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[s,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:i,swaps:a,priceImpactPct:o}=r,l=a[0],c=a[a.length-1],{assetInDecimals:u}=l,{assetOutDecimals:d}=c,m=Math.abs(o),g=this.getTwapTradeCount(m),b=i/BigInt(g),h=await this.router.getBestSell(l.assetIn,c.assetOut,b),y=g===1,f=i<s,S=h.priceImpactPct<-5,T=[];f||y?T.push("OrderTooSmall"):S&&T.push("OrderImpactTooBig");let R=h.amountOut*BigInt(g),D=h.tradeFee*BigInt(g),F=N.build(a),L={assetIn:t,assetOut:e,errors:T,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:F,type:"TwapSell"};return{...L,amountIn:i,amountOut:R,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:D,toHuman(){return{...L,amountIn:P.toDecimal(i,u),amountOut:P.toDecimal(R,d),tradeAmountIn:P.toDecimal(h.amountIn,u),tradeAmountOut:P.toDecimal(h.amountOut,d),tradeFee:P.toDecimal(D,d)}}}}async getTwapBuyOrder(t,e,n){let[s,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:i,swaps:a,priceImpactPct:o}=r,l=a[0],c=a[a.length-1],{assetInDecimals:u}=l,{assetOutDecimals:d}=c,m=Math.abs(o),g=this.getTwapTradeCount(m),b=i/BigInt(g),h=await this.router.getBestBuy(l.assetIn,c.assetOut,b),y=h.amountIn*BigInt(g),f=g===1,S=y<s,T=h.priceImpactPct<-5,R=[];S||f?R.push("OrderTooSmall"):T&&R.push("OrderImpactTooBig");let D=h.tradeFee*BigInt(g),F=N.build(a),L={assetIn:t,assetOut:e,errors:R,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:F,type:"TwapBuy"};return{...L,amountIn:y,amountOut:i,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:D,toHuman(){return{...L,amountIn:P.toDecimal(y,u),amountOut:P.toDecimal(i,d),tradeAmountIn:P.toDecimal(h.amountIn,u),tradeAmountOut:P.toDecimal(h.amountOut,d),tradeFee:P.toDecimal(D,u)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let s=216e5/(this.blockTime*6);return Math.round(s)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,n=Math.round(e);return Math.max(n,6)}};var _n={};x(_n,{BIG_10:()=>On,BIG_BILL:()=>An,StakingApi:()=>Yt,StakingClient:()=>Xt});import{encodeAddress as di}from"@polkadot/util-crypto";import{stringToU8a as gi}from"@polkadot/util";import{calculate_accumulated_rps as hi,calculate_period_number as In,calculate_rewards as bi}from"@galacticcouncil/math-staking";import ft from"big.js";var On=ft(10),An=ft(On.pow(12));function yi(p){return di(gi(("modl"+p).padEnd(32,"\0")),63)}var Yt=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=yi(t);return(await this.balanceClient.getBalance(e,0)).transferable}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]),s=e?.created_at,r=await n.reduce(async(i,[a,o])=>{let l=await i,c=a,u=o.amount,d=o.conviction.toString(),m=await this.client.getReferendumInfo(c);return m&&(m.type==="Approved"||m.type==="Rejected")&&l.push({id:c,amount:u,conviction:d}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt:s,actionPoints:e?.action_points,accumulatedUnpaidRewards:e?.accumulated_unpaid_rewards,accumulatedSlashPoints:e?.accumulated_slash_points,accumulatedLockedRewards:e?.accumulated_locked_rewards,votes:r}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,s]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),r=s.find(i=>i)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:r,stakePosition:r?await this.getStakingPosition(r):void 0}}async getRewards(t,e){let n=await this.getStake(t),{potReservedBalance:s,accumulatedRewardPerStake:r,totalStake:i,stakePosition:a}=n;if(!a)return;let[o,l,c,u]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=ft(o.toString()).minus(s.toString()),m=r.toString(),g=ft(e).plus(1).toString();d.gt(0)&&i>0&&(m=hi(r.toString(),d.toString(),i.toString()));let b=In(l.toString(),e,u??g),h=In(l.toString(),a.createdAt?.toString()??"",u??g),y=bi(m,a.rewardPerStake?.toString()??"",a.stake?.toString()??""),f=ft(y).plus(a.accumulatedUnpaidRewards?.toString()||"0").plus(a.accumulatedLockedRewards?.toString()||"0");if(!ft(b).minus(h).lte(c.toString()))return f.div(An).toString()}};var Xt=class extends E{async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:i})=>{let[a,o,l]=i;return{address:a,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var Fn={};x(Fn,{TxBuilderFactory:()=>St});import{Enum as Rn}from"polkadot-api";function Bn(p){let t=[],e=p;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var Pt=class extends E{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new V(t),this.aaveUtils=new Z(e)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:n=>this.dryRun(n,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:de})}async dryRun(t,e){let n=Rn("Signed",t),s=Rn("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(s,e.decodedCall),a=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(a){let o=Bn(a.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var le=class extends Pt{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:s}=e[0],r=await this.balanceClient.getBalance(this.beneficiary,s);return t>=r.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],r=n[n.length-1],i=v.getFraction(t,this.slippagePct),a=s.assetIn,o=r.assetOut,l=t+i,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:a,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:a,asset_out:o,amount_out:e,max_amount_in:l,route:N.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],r=n[n.length-1],i=v.getFraction(e,this.slippagePct),a=s.assetIn,o=r.assetOut,l=e-i,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:a,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:a,asset_out:o,amount_in:t,min_amount_out:l,route:N.build(n)}),s.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=await this.dispatchWithExtraGas(c)),this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],s=e[e.length-1],r=v.getFraction(t,this.slippagePct),i=n.assetIn,a=s.assetOut,o=t-r,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:a,min_amount_out:o,route:N.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as Le}from"polkadot-api";var ce=class extends Pt{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradePeriod:r,tradeRoute:i}=this.order,a=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:r,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:Le("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:0n,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",a)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:r,tradePeriod:i,tradeRoute:a}=this.order,o=v.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:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:Le("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:r,tradePeriod:i,tradeRoute:a}=this.order,o=v.getFraction(s,this.slippagePct),l=s+o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:Le("Buy",{asset_in:e,asset_out:n,amount_out:r,max_amount_in:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var St=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new le(this.client,this.evmClient).setTrade(t)}order(t){return new ce(this.client,this.evmClient).setOrder(t)}};async function Bm(p){let t=new ot(p),e=new At(p),[n,s]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),r=new gt(p,e).withAave().withOmnipool().withStableswap().withXyk(),i=new V(p),a=new Xt(p),o=new Bt(p),l=new Z(e),c=new bt(r),u=new yt(c,{blockTime:n,minBudgetInNative:s}),d=new Yt(a,i),m=new _t(o,i,{blockTime:n});return{api:{aave:l,router:c,scheduler:u,staking:d,farm:m},client:{asset:new it(p),balance:i,evm:e},ctx:{pool:r},tx:new St(p,e),destroy:()=>{r.destroy()}}}export{te as QueryBus,je as aave,Ge as api,P as big,Qe as client,Ve as const,Bm as createSdkContext,nt as erc20,Je as error,en as evm,ln as farm,A as fmt,Zt as h160,J as json,v as math,Pn as pool,vn as sor,_n as staking,Fn as tx,Ke as xc};
@@ -1,13 +1,16 @@
1
1
  import { PolkadotClient } from 'polkadot-api';
2
+ import { HydrationQueries } from '@galacticcouncil/descriptors';
2
3
  import { type Observable } from 'rxjs';
3
4
  import { Papi } from '../api';
4
5
  import { AssetBalance, Balance } from '../types';
6
+ type TSystemAccount = HydrationQueries['System']['Account']['Value'];
7
+ type TTokenAccount = HydrationQueries['Tokens']['Accounts']['Value'];
8
+ type TAccount = TSystemAccount['data'] | TTokenAccount;
5
9
  export declare class BalanceClient extends Papi {
6
10
  constructor(client: PolkadotClient);
7
11
  getBalance(account: string, assetId: number): Promise<Balance>;
8
12
  getSystemBalance(account: string): Promise<Balance>;
9
13
  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
14
  getErc20Balance(account: string, assetId: number): Promise<Balance>;
12
15
  subscribeBalance(address: string): Observable<AssetBalance[]>;
13
16
  subscribeSystemBalance(address: string): Observable<AssetBalance>;
@@ -15,4 +18,7 @@ export declare class BalanceClient extends Papi {
15
18
  subscribeTokensBalance(address: string): Observable<AssetBalance[]>;
16
19
  subscribeErc20Balance(address: string, includeOnly?: number[]): Observable<AssetBalance[]>;
17
20
  private getTokenBalanceData;
21
+ protected calculateBalance(data: TAccount): Balance;
22
+ protected getDeltas(prev: AssetBalance[], curr: AssetBalance[]): AssetBalance[];
18
23
  }
24
+ export {};