@galacticcouncil/sdk-next 0.25.0 → 0.26.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.cjs +1 -1
- package/build/index.mjs +1 -1
- package/build/types/api/ChainWatcher.d.ts +11 -0
- package/build/types/api/Papi.d.ts +2 -1
- package/build/types/api/index.d.ts +1 -0
- package/build/types/api/probe.d.ts +19 -0
- package/build/types/pool/PoolClient.d.ts +45 -1
- package/build/types/pool/PoolLog.d.ts +11 -0
- package/build/types/sor/TradeScheduler.d.ts +1 -1
- package/build/types/utils/async.d.ts +1 -0
- package/build/types/utils/calc.d.ts +38 -0
- package/build/types/utils/index.d.ts +2 -0
- package/build/types/utils/math.d.ts +0 -9
- package/package.json +3 -3
- package/build/types/api/utils.d.ts +0 -1
- package/build/types/sor/TradeRouter.utils.d.ts +0 -1
package/build/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var ii=Object.defineProperty;var A=(d,t)=>{for(var e in t)ii(d,e,{get:t[e],enumerable:!0})};import ai from"buffer";typeof window<"u"&&(window.Buffer=ai.Buffer);var Ze={};A(Ze,{Papi:()=>C,getWs:()=>ci});import{hydration as ri}from"@galacticcouncil/descriptors";function Je(d){switch(d){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var C=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(ri)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Je(n)&&console.log(t,...e)}};import{withLogsRecorder as si}from"polkadot-api/logs-provider";import{withLegacy as oi}from"@polkadot-api/legacy-provider";import{getWsProvider as li}from"polkadot-api/ws-provider";var ci=(d,t={})=>{let e=typeof d=="string"?d.split(","):d,n=li(e,{innerEnhancer:oi(),...t});return si(i=>console.log(i),n),n};var en={};A(en,{AAVE_GAS_LIMIT:()=>ve,AAVE_LENDING_POOL_ADDRESS:()=>ae,AAVE_POOL_ABI:()=>Se,AAVE_POOL_DATA_PROVIDER:()=>ie,AAVE_POOL_DATA_PROVIDER_ABI:()=>ne,AAVE_POOL_PROXY:()=>Te,AAVE_ROUNDING_THRESHOLD:()=>Vs,AAVE_UINT_256_MAX:()=>ui,AaveClient:()=>vt,AaveUtils:()=>Z});var Se=[{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 ne=[{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 Te="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",ie="0x112b087b60C1a166130d59266363C45F8aa99db0",ae="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",ve=1000000n,Vs=5,ui=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var vt=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:ne,address:ie,args:[ae],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:ne,address:ie,args:[ae,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:Se,address:Te,args:[t],functionName:"getUserAccountData"})}};import E from"big.js";import{big as J,erc20 as mi,h160 as pi}from"@galacticcouncil/common";var{ERC20:et}=mi,{H160:xe}=pi,di=1.01,gi=31536000n,tn=4,re=-1,se=10n**27n,Z=class{client;constructor(t){this.client=new vt(t)}async getSummary(t){let e=xe.fromAny(t),[n,i,a,r]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e),this.client.getBlockTimestamp()]),[s]=n,[o,l]=i,[c,u,m,p,g,h]=a,b=J.toDecimal(h,18),f=[];for(let y of o){let S=y.underlyingAsset.toLowerCase(),P=s.find(({underlyingAsset:Pe})=>Pe.toLowerCase()===S);if(!P)throw new Error("Missing pool reserve for "+S);let T=y.scaledATokenBalance,v=P.liquidityIndex,_=P.liquidityRate,k=P.availableLiquidity,Y=P.priceInMarketReferenceCurrency,z=r+6,H=this.calculateLinearInterest(_,P.lastUpdateTimestamp,z),N=v*H/se,Tt=T*N/se,Zt=Number(l!==0&&l===P.eModeCategoryId?P.eModeLiquidationThreshold:P.reserveLiquidationThreshold)/1e4,te=P.usageAsCollateralEnabled&&y.usageAsCollateralEnabledOnUser&&y.scaledATokenBalance>0n,ee=et.toAssetId(S);f.push({aTokenBalance:Tt,availableLiquidity:k,decimals:Number(P.decimals),isCollateral:te,priceInRef:Y,reserveId:ee,reserveAsset:S,reserveLiquidationThreshold:Zt})}return{healthFactor:Number(b),currentLiquidationThreshold:Number(J.toDecimal(p,tn)),totalCollateral:c,totalDebt:u,reserves:f}}async hasBorrowPositions(t){let e=xe.fromAny(t),n=await this.client.getUserAccountData(e),[i,a]=n;return a>0n}async getHealthFactor(t){let e=xe.fromAny(t),n=await this.client.getUserAccountData(e),[i,a,r,s,o,l]=n;return this.calculateHealthFactorFromBalances(a,i,s)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:i,totalDebt:a,reserves:r,currentLiquidationThreshold:s}=await this.getSummary(t);if(a===0n)return re;let o=et.fromAssetId(e),l=r.find(S=>S.reserveAsset===o);if(!l)throw new Error("Missing reserve ctx for "+o);let{decimals:c,isCollateral:u,priceInRef:m,reserveLiquidationThreshold:p}=l,g=J.toBigInt(n,c),h=u?g*m/10n**BigInt(c):0n,b=i-h;if(b<=0n)return 0;let f=E(i.toString()).mul(s).minus(E(h.toString()).mul(p)).div(b.toString()),y=E(b.toString()).mul(f).div(a.toString()).toFixed(6,E.roundDown);return Number(y)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:i,totalDebt:a,reserves:r,currentLiquidationThreshold:s}=await this.getSummary(t);if(a===0n)return re;let o=et.fromAssetId(e),l=r.find(y=>y.reserveAsset===o);if(!l)throw new Error("Missing reserve ctx for "+o);let{decimals:c,priceInRef:u,reserveLiquidationThreshold:m}=l,g=J.toBigInt(n,c)*u/10n**BigInt(c),h=i+g;if(h<=0n)return 0;let b=E(i.toString()).mul(s).plus(E(g.toString()).mul(m)).div(h.toString()),f=E(h.toString()).mul(b).div(a.toString()).toFixed(6,E.roundDown);return Number(f)}async getHealthFactorAfterSwap(t,e,n,i,a){let{totalDebt:r,reserves:s,healthFactor:o}=await this.getSummary(t);if(r===0n)return re;let l=et.fromAssetId(n),c=et.fromAssetId(a),u=s.find(v=>v.reserveAsset===l),m=s.find(v=>v.reserveAsset===c);if(!u)throw new Error(`Missing reserve ctx for ${l}`);if(!m)throw new Error(`Missing reserve ctx for ${m}`);let p=J.toBigInt(e,u.decimals),g=J.toBigInt(i,m.decimals),h=p*u.priceInRef/10n**BigInt(u.decimals),b=g*m.priceInRef/10n**BigInt(m.decimals),f=u.isCollateral?E(h.toString()).mul(u.reserveLiquidationThreshold):E(0),P=E(b.toString()).mul(m.reserveLiquidationThreshold).minus(f).div(r.toString()),T=E(o).plus(P).toFixed(6,E.roundDown);return Number(T)}async getMaxWithdraw(t,e){let{totalDebt:n,reserves:i,healthFactor:a}=await this.getSummary(t),r=et.fromAssetId(e),s=i.find(o=>o.reserveAsset===r);if(!s)throw new Error("Missing reserve ctx for "+r);return this.calculateWithdrawMax(s,n,a)}async getMaxWithdrawAll(t){let{totalDebt:e,reserves:n,healthFactor:i}=await this.getSummary(t),a={};for(let r of n){let s=this.calculateWithdrawMax(r,e,i);r.reserveId&&(a[r.reserveId]=s)}return a}calculateWithdrawMax(t,e,n){let{aTokenBalance:i,availableLiquidity:a,decimals:r,priceInRef:s,reserveLiquidationThreshold:o,isCollateral:l}=t,c=i;if(l&&e>0n){let m=n-di;if(m>0){let p=E(m).mul(e.toString()).div(o).toFixed(0,E.roundDown),g=E(p).div(s.toString()).mul(10**r).toFixed(0,E.roundDown);c=i<BigInt(g)?i:BigInt(g)}else c=0n}return{amount:c<a?c:a,decimals:r}}calculateLinearInterest(t,e,n){let i=n-e;if(i<=0)return se;let a=t*BigInt(i)/gi;return se+a}calculateHealthFactorFromBalances(t,e,n){if(t===0n)return re;let i=e*n/t,a=J.toDecimal(i,tn);return Number(a)}};var rn={};A(rn,{AssetClient:()=>nt,BalanceClient:()=>X,ChainParams:()=>st});var nt=class extends C{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:i})=>{let[a]=n;return[a,i]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:i})=>{let[a]=n;return[a,i]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:i}=n;return this.SUPPORTED_TYPES.includes(i.type)}).map(({keyArgs:n,value:i})=>{let[a]=n;return[a,i]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:i})=>{let[a]=n;return[a,i]}))}async mapToken(t,e,n,i){let{name:a,asset_type:r,is_sufficient:s,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:a?.asText(),symbol:l,decimals:c,icon:l,type:r.type,isSufficient:s,location:i,existentialDeposit:o}}async mapBond(t,e,n,i){let[a,r]=i,{asset_type:s,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:u}=await this.mapToken(a,e,n),m=Number(r),p=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",p.format(m)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:u,icon:c,type:s.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:a,maturity:m}}async mapShares(t,e,n,i){let{assets:a}=i,{name:r,symbol:s,asset_type:o,is_sufficient:l,existential_deposit:c}=e,u=await Promise.all(a.map(async g=>{let{symbol:h}=await this.mapToken(g,e,n);return[g,h]})),m=Object.fromEntries(u),p=Object.values(m);return{id:t,name:p.join(", "),symbol:s?.asText()||r?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:m}}async mapExternal(t,e,n,i){let a=await this.mapToken(t,e,new Map,i),r=n?.find(s=>s.internalId===a.id);return r?{...a,decimals:r.decimals,name:r.name,symbol:r.symbol,icon:r.symbol,isWhiteListed:r.isWhiteListed}:a}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,i,a,r]=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 u=i.get(l),{asset_type:m}=c,p;switch(m.type){case"Bond":let g=r.get(l);p=await this.mapBond(l,c,s,g);break;case"StableSwap":let h=a.get(l);p=await this.mapShares(l,c,s,h);break;case"External":p=await this.mapExternal(l,c,e,u);break;default:p=await this.mapToken(l,c,s,u)}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 yi,bufferCount as fi,combineLatest as Pi,debounceTime as Si,distinctUntilChanged as an,finalize as Ti,map as rt,pairwise as vi,shareReplay as xi,startWith as wi}from"rxjs";var nn={};A(nn,{HUB_ASSET_ID:()=>xt,HYDRATION_OMNIPOOL_ADDRESS:()=>hi,HYDRATION_PARACHAIN_ID:()=>bi,PERBILL_DENOMINATOR:()=>we,PERMILL_DENOMINATOR:()=>it,SYSTEM_ASSET_DECIMALS:()=>Ie,SYSTEM_ASSET_ID:()=>O,TRADEABLE_DEFAULT:()=>at});var it=1e6,we=1e9,O=0,Ie=12,bi=2034,hi="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",xt=1,at=15;var X=class extends C{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,{at:"best"});return this.calculateBalance(n)}async getTokenBalance(t,e){let i=await this.api.query.Tokens.Accounts.getValue(t,e,{at:"best"});return this.calculateBalance(i)}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),i=this.subscribeErc20Balance(t);return Pi([e,n,i]).pipe(Si(250),rt(a=>a.flat()),wi([]),fi(2,1),rt(([a,r],s)=>s===0?r:this.getDeltas(a,r)))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe(rt(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(rt(i=>({id:e,balance:this.calculateBalance(i)})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(an((n,i)=>!i.deltas),rt(({deltas:n})=>{let i=[];return n?.deleted.forEach(a=>{let[r,s]=a.args;i.push({id:s,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(a=>{let[r,s]=a.args;i.push({id:s,balance:this.calculateBalance(a.value)})}),i}))}subscribeErc20Balance(t,e){let n=new yi,i=n.pipe(xi(1)),a=async()=>(await this.api.query.AssetRegistry.Assets.getEntries({at:"best"})).filter(({value:l})=>{let{asset_type:c}=l;return c.type==="Erc20"}).map(({keyArgs:l})=>{let[c]=l;return c}),r=async()=>{let o=e||await a(),l=async()=>{let m=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,balance:g}));n.next(m)};await l();let c=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>c.unsubscribe()},s;return r().then(o=>s=o),i.pipe(Ti(()=>s?.()),vi(),rt(([o,l],c)=>c===0?l.filter(u=>u.balance.transferable>0n):this.getDeltas(o,l)),an((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t,{at:"best"});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=(a,r)=>a!==void 0&&r!==void 0&&a.transferable===r.transferable&&a.total===r.total,i=t.reduce((a,r)=>(a.set(r.id,r.balance),a),new Map);return e.filter(a=>!n(a.balance,i.get(a.id)))}};var st=class extends C{_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 sn={};A(sn,{AssetNotFound:()=>Ae,PoolNotFound:()=>wt,RouteNotFound:()=>It});var Ae=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},wt=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 un={};A(un,{EvmClient:()=>Ot,EvmRpcAdapter:()=>At,createChain:()=>Oe});import{Binary as Ii,CompatibilityLevel as Ai,FixedSizeBinary as on}from"polkadot-api";import{hydration as Oi}from"@galacticcouncil/descriptors";import{encodeFunctionData as Bi,decodeFunctionResult as _i}from"viem";var Ri=10000000n,At=class{api;constructor(t){this.api=t.getTypedApi(Oi)}async getBlock(){let t=await this.api.query.Ethereum.CurrentBlock.getValue({at:"best"}),{header:e}=t,n=e.timestamp/1000n,[i]=e.number;return{timestamp:n,number:i}}readContract=(async t=>{let{abi:e,address:n,functionName:i,args:a}=t,r=Bi({abi:e,functionName:i,args:a}),s=this.api.apis.EthereumRuntimeRPCApi.call,o=await this.api.compatibilityToken,l=s.isCompatible(Ai.BackwardsCompatible,o);console.log(l);let c=await this.api.apis.EthereumRuntimeRPCApi.call(on.fromText(""),on.fromHex(n),Ii.fromHex(r),[0n,0n,0n,0n],[Ri,0n,0n,0n],void 0,void 0,void 0,!1,[]);if(console.log(c),!c.success)throw console.error(i,c.value.type),new Error("Contract read failure");let{exit_reason:u,value:m,used_gas:p}=c.value;if(console.log(p),u.type==="Succeed")return _i({abi:e,functionName:i,data:m.asHex()});throw console.log(i,u.type,u.value.type),new Error("Contract read error")})};import{defineChain as Fi}from"viem";var Ci=["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"],Oe=()=>Fi({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Ci}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});import{createPublicClient as ln,createWalletClient as Ei,custom as cn,http as ki}from"viem";var Ot=class{client;chain;constructor(t){this.client=t,this.chain=Oe()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return ln({chain:this.chain,transport:ki()})}getWsProvider(){return ln({transport:cn({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return Ei({account:t,chain:this.chain,transport:cn(window.ethereum)})}getRPCAdapter(){return new At(this.client)}};var yn={};A(yn,{LiquidityMiningApi:()=>Rt,LiquidityMiningClient:()=>Ft});import{AccountId as ji}from"polkadot-api";import M from"big.js";import{HYDRATION_SS58_PREFIX as Qi,RUNTIME_DECIMALS as _t}from"@galacticcouncil/common";import{fixed_from_rational as hn}from"@galacticcouncil/math-liquidity-mining";var x={};A(x,{FeeUtils:()=>Be,shiftNeg:()=>Mi});import Di from"big.js";var Be=class d{static toPct(t){let[e,n]=t;return d.safeDivide(e*100,n)}static toRaw(t){let[e,n]=t;return d.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 i=10**n;return Math.round(t*i/e)/i}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Mi(d,t){let e=Di(typeof d=="bigint"?d.toString():d);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Bt={};A(Bt,{findNestedKey:()=>Li,findNestedObj:()=>qi,jsonFormatter:()=>Hi});var Li=(d,t)=>{let e=[];return JSON.stringify(d,(n,i)=>(i&&i[t]&&e.push(i),i)),e[0]},qi=(d,t,e)=>{let n;return JSON.stringify(d,(i,a)=>(a&&a[t]===e&&(n=a),a)),n},Hi=(d,t)=>typeof t=="bigint"?t.toString():t;var I={};A(I,{calculateBuyFee:()=>Ui,calculateDiffToAvg:()=>Ni,calculateDiffToRef:()=>Gi,calculateSellFee:()=>Vi,getFraction:()=>Wi});import K from"big.js";function Ni(d,t){let e=K(d.toString()),n=K(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Gi(d,t){if(t===0n)return 0;let e=K(d.toString()),n=K(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Vi(d,t){if(d===0n)return 0;let e=K(d.toString()),n=K(t.toString());return K(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Ui(d,t){if(d===0n)return 0;let e=K(d.toString());return K(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Wi(d,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),i=BigInt(t*n);return d*i/BigInt(100*n)}import{TLRUCache as mn}from"@thi.ng/cache";var oe=class{debug;constructor(t){this.debug=t||!1}log(t,e,n){this.debug&&console.log(t,e,n)}scope(t,e,n,i){let a=new Map,r=i!==void 0?new mn(null,{ttl:i}):new mn;return{get:(...c)=>{let u=n(...c);if(a.has(u)){this.log("[live]",t,u);let p=a.get(u);return Promise.resolve(p)}if(r.has(u))return this.log("[memo]",t,u),r.get(u);this.log("[fetch]",t,u);let m=e(...c).catch(p=>{throw r.delete(u),p});return r.set(u,m),m},set:(c,...u)=>{let m=n(...u);this.log("[set-live]",t,m),a.set(m,c)},clear:()=>{this.log("[clear]",t),a.clear(),r.release()}}}};var le=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let n=0;n<t.length;++n){let[i,a]=t[n];this.result.set(this.getKey(a,i),e[n].free)}}freeBalance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,n,i){let a=this.getKey(t,e),r=this.getKey(t,n),s=this.result.get(a)??0n,o=this.result.get(r)??0n;if(s<i)throw new Error("Attempting to transfer more than is present");this.result.set(a,s+i),this.result.set(r,o+i)}};import tt from"big.js";import{calculate_accumulated_rps as Yi,calculate_global_farm_rewards as Xi,calculate_loyalty_multiplier as zi,calculate_user_reward as bn,calculate_yield_farm_delta_rpvs as Ki}from"@galacticcouncil/math-liquidity-mining";import pn from"big.js";var _e=pn(10).pow(18),dn=BigInt(pn(1).pow(18).toString()),gn=6e3;var $i="1000000000000000000",ce=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 i=await this.getAsset(t.reward_currency),a=e-t.updated_at,r=this.getAccount(t.id),s=i?.existential_deposit;if(!s)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.freeBalance(t.reward_currency,r),l=tt(s.toString()),c=tt(o.toString()).minus(l.lt(o.toString())?s.toString():o.toString()),u=tt(Xi(t.total_shares_z.toString(),n.toString(),tt(t.yield_per_period.toString()).mul(_e).round(0,tt.roundDown).toFixed(),t.max_reward_per_period.toString(),a.toFixed()));if(c.lt(u)&&(u=c),u.eq(0))return t;let m=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,r,m,BigInt(u.toFixed())),{...t,accumulated_rpz:BigInt(Yi(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 i=Ki(t.accumulated_rpz.toString(),e.accumulated_rpz.toString(),t.multiplier.toString(),t.total_valued_shares.toString());return{...t,accumulated_rpvs:t.accumulated_rpvs+BigInt(i),updated_at:n}}getLoyaltyMultiplier(t,e){let n=tt(1).mul(_e).round(0,tt.roundDown).toString();if(!e)return n;let{initial_reward_percentage:i,scale_coef:a}=e;return zi(t.toFixed(),i.toString(),a.toFixed())}async claimRewards(t,e,n,i,a){if(e.state.type==="Terminated")return null;let r=Math.floor(i/t.blocks_per_period);if(n.updated_at===r)return null;let s=await this.syncGlobalFarm(t,r,a);if(!s)return null;let o=this.syncYieldFarm(e,s,r);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),m=BigInt(bn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),u)),p=BigInt(bn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),$i));return{reward:m,maxReward:p,assetId:s.reward_currency,yieldFarmId:o.id,isActiveFarm:o.state.type==="Active"}}};var Ji=M(365.2425).times(24).times(60).times(60),Rt=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??gn})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((a,r)=>a-r);if(t===e)return dn;let i=await this.client.getOraclePrice(n);if(i){let{n:a,d:r}=i[0].price,s;return t<e?s=hn(a.toString(),r.toString()):s=hn(r.toString(),a.toString()),BigInt(s)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),i=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),a=Buffer.from([t]),r=Buffer.concat([n,i,a]),o="0x"+Buffer.concat([r,Buffer.alloc(32-r.length)]).toString("hex");return ji(Qi).dec(o)};getGlobalRewardPerPeriod(t,e,n,i){let a=M(i).times(t.toString()).times(e.toString()).div(Math.pow(10,_t));return a.gte(n.toString())?n.toString():a.toString()}getPoolYieldPerPeriod(t,e,n,i){let a=M(t.toString()).times(e),r=M(n.toString()).times(i);return a.div(r.toString()).toString()}farmData(t,e,n){let{yieldFarm:i,globalFarm:a,priceAdjustment:r,balance:s,id:o}=t,{multiplier:l,loyalty_curve:c}=i,{blocks_per_period:u,yield_per_period:m,total_shares_z:p,max_reward_per_period:g,pending_rewards:h,accumulated_paid_rewards:b,planned_yielding_periods:f,updated_at:y,incentivized_asset:S,reward_currency:P,price_adjustment:T,min_deposit:v}=a,_=x.shiftNeg(r??T,_t),k=x.shiftNeg(l,_t),Y=x.shiftNeg(c?.initial_reward_percentage??0,_t),z=Ji.div(M(this.blockTime).div(1e3).times(u)).toString(),H;if(p<=0)H=M(k).times(m.toString()).times(z).toString();else{let ei=this.getGlobalRewardPerPeriod(p,m,g,_),ni=this.getPoolYieldPerPeriod(ei,k,p,_);H=M(ni).times(z).toString()}let N=h+b,Tt=g*BigInt(f),Jt=s.transferable+N,je=Jt-N,Zt=M(je.toString()).div(g.toString()),te=M(e).div(u.toString()).toString(),ee=(p>=0?Zt.plus(y):Zt.plus(te)).toString(),Pe=M(ee).times(u).toString(),Zn=M(p.toString()).div(M(g.toString()).div(m.toString())).div(Math.pow(10,_t)).times(100).times(_).toFixed(2),Qe=M(N.toString()).div(Jt.toString()).gte(.999);H=Qe?"0":M(H).div(n?2:1).times(100).toString();let ti=Y?M(H).times(Y).toString():void 0;return{apr:H,minApr:ti,isDistributed:Qe,estimatedEndPeriod:ee,estimatedEndBlock:Pe,maxRewards:Tt,incentivizedAsset:S,rewardCurrency:P,loyaltyCurve:c,currentPeriod:te,potMaxRewards:Jt,fullness:Zn,yieldFarmId:i.id,globalFarmId:a.id,poolId:o,distributedRewards:N,plannedYieldingPeriods:f,minDeposit:v,blocksPerPeriod:u}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((i,a)=>i.includes(a.keyArgs[0].toString())?i:[...i,a.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async i=>{let a=await this.getOmnipoolFarms(i);if(a)return[i,a]}));return Object.fromEntries(n.filter(i=>!!i))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),n=await this.client.getRelayBlockNumber(),i=await Promise.all(e.map(async({keyArgs:a,value:r})=>{let[,s]=a,o=r,l=await this.client.getOmnipoolGlobalFarm(s),c=await this.client.getOmnipoolYieldFarm(Number(t),s,o);if(!l||!c)return;let u=l.reward_currency,m=l.incentivized_asset,p=this.getFarmAddress(s),g=await this.getOraclePrice(u,m),h=await this.balanceClient.getBalance(p,u);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:h}}));return n?i.map(a=>a?this.farmData(a,n):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((i,a)=>i.includes(a.keyArgs[0].toString())?i:[...i,a.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async i=>{let a=await this.getIsolatedFarms(i);if(a)return[i,a]}));return Object.fromEntries(n.filter(i=>!!i))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),i=await Promise.all(e.map(async({keyArgs:a,value:r})=>{let[,s]=a,o=r,l=await this.client.getIsolatedGlobalFarm(s),c=await this.client.getIsolatedYieldFarm(t,s,o);if(!l||!c)return;let u=l.reward_currency,m=l.incentivized_asset,p=this.getFarmAddress(s,!0),g=await this.getOraclePrice(u,m),h=await this.balanceClient.getBalance(p,u);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:h,farmAddress:p}}));return n?i.map(a=>a?this.farmData(a,n,!0):void 0):[]}async getDepositReward(t,e,n,i){let a=e.global_farm_id,r=e.yield_farm_id,s=n?await this.client.getIsolatedYieldFarm(t,a,r):await this.client.getOmnipoolYieldFarm(Number(t),a,r),o=n?await this.client.getIsolatedGlobalFarm(a):await this.client.getOmnipoolGlobalFarm(a);if(!o||!s)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]],m=await this.getAccountAssetBalances(u),p=await this.getOraclePrice(l,c),g=new le(u,m),b=await new ce(y=>this.getFarmAddress(y),y=>this.client.getAsset(y),g).claimRewards(o,s,e,i,p??o.price_adjustment);if(!b)return;let f=await this.client.getAsset(b.assetId);if(f&&!(b.reward<=f.existential_deposit))return b}async getAccountAssetBalances(t){let[e,n]=await Promise.all([Promise.all(t.filter(([a,r])=>r!==0).map(([a,r])=>this.balanceClient.getTokenBalance(a,r))),Promise.all(t.filter(([a,r])=>r===0).map(([a])=>this.balanceClient.getSystemBalance(a)))]),i=[];for(let a=0,r=0;a+r<t.length;){let s=a+r,[,o]=t[s];o===0?(i.push(n[r]),r+=1):(i.push(e[a]),a+=1)}return i}};import{Binary as Zi,Enum as ta}from"polkadot-api";var Ft=class extends C{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(Zi.fromText("omnipool"),t,ta("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 Ln={};A(Ln,{PoolContextProvider:()=>gt,PoolError:()=>j,PoolFactory:()=>pt,PoolType:()=>B,aave:()=>Le,hsm:()=>Ve,lbp:()=>Re,omni:()=>Ce,stable:()=>ke,xyk:()=>De});var Re={};A(Re,{LbpMath:()=>U,LbpPool:()=>Ct,LbpPoolClient:()=>Et});import{calculate_in_given_out as ea,calculate_out_given_in as na,calculate_linear_weights as ia,calculate_pool_trade_fee as aa,get_spot_price as ra}from"@galacticcouncil/math-lbp";var U=class{static getSpotPrice(t,e,n,i,a){return ra(t,e,n,i,a)}static calculateInGivenOut(t,e,n,i,a){return ea(t,e,n,i,a)}static calculateOutGivenIn(t,e,n,i,a){return na(t,e,n,i,a)}static calculateLinearWeights(t,e,n,i,a){return ia(t,e,n,i,a)}static calculatePoolTradeFee(t,e,n){return aa(t,e,n)}};import{big as fn,RUNTIME_DECIMALS as Pn}from"@galacticcouncil/common";var B=(r=>(r.Aave="Aave",r.LBP="LBP",r.Omni="Omnipool",r.Stable="Stableswap",r.XYK="XYK",r.HSM="HSM",r))(B||{}),j=(c=>(c.UnknownError="UnknownError",c.FacilitatorCapacityExceeded="FacilitatorCapacityExceeded",c.InsufficientTradingAmount="InsufficientTradingAmount",c.InsufficientCollateral="InsufficientCollateral",c.MaxHoldingExceeded="MaxHoldingExceeded",c.MaxInRatioExceeded="MaxInRatioExceeded",c.MaxOutRatioExceeded="MaxOutRatioExceeded",c.TradeNotAllowed="TradeNotAllowed",c.MaxBuyBackExceeded="MaxBuyBackExceeded",c.MaxBuyPriceExceeded="MaxBuyPriceExceeded",c))(j||{});var{FeeUtils:Sn}=x,Ct=class d{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new d(t)}constructor(t){this.type="LBP",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.fee=t.fee,this.repayFeeApply=t.repayFeeApply}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),i=n.get(t),a=n.get(e);if(i==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:i.balance,balanceOut:a.balance,decimalsIn:i.decimals,decimalsOut:a.decimals,weightIn:i.weight,weightOut:a.weight}}validateAndBuy(t,e,n){let i=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let r=t.balanceOut/this.maxOutRatio;if(e>r&&a.push("MaxOutRatioExceeded"),i===t.assetOut){let s=this.calculateTradeFee(e,n),o=Sn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+s,c=this.calculateInGivenOut(t,l),u=t.balanceIn/this.maxInRatio;return c>u&&a.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:a}}else{let s=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return s>o&&a.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:a}}}validateAndSell(t,e,n){let i=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let r=t.balanceIn/this.maxInRatio;if(e>r&&a.push("MaxInRatioExceeded"),i===t.assetIn){let s=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return s>o&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:a}}else{let s=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(s,n),l=Sn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=s-o,u=t.balanceOut/this.maxOutRatio;return c>u&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:c,feePct:l,errors:a}}}calculateInGivenOut(t,e){let n=U.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),i=BigInt(n);return i<0n?0n:i}calculateOutGivenIn(t,e){let n=U.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),i=BigInt(n);return i<0n?0n:i}spotPriceInGivenOut(t){let e=U.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),fn.toBigInt(1,Pn).toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=U.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),fn.toBigInt(1,Pn).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 Ia}from"polkadot-api";import{Subscription as Aa,distinctUntilChanged as Oa,filter as Ba}from"rxjs";import{memoize1 as oa}from"@thi.ng/memoize";import{TLRUCache as la}from"@thi.ng/cache";import{ReplaySubject as ca,Subscription as ua,bufferCount as ma,combineLatest as Tn,debounceTime as pa,defer as da,filter as ga,finalize as ba,from as ha,map as ot,merge as ya,of as fa,pairwise as Pa,skip as Sa,share as Ta,startWith as va,switchMap as xa,tap as vn,throttleTime as wa}from"rxjs";import{BehaviorSubject as sa}from"rxjs";var ue=class{store$=new sa([]);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((s,o)=>[s.address,o])),i=await t(e),a=e.slice(),r=new Set;for(let s of i){let o=n.get(s.address);o===void 0?(n.set(s.address,a.length),a.push(s)):a[o]=s,r.add(s.address)}this.changeset=r,this.store$.next(a)}).catch(console.error)}destroy(){this.store$.complete()}};var L=class extends X{evm;store=new ue;shared$;mem=0;memPoolsCache=new la(null,{ttl:6*1e3});memPools=oa(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(va([]),ma(2,1),ot(([t,e])=>t.length===0?e:this.store.applyChangeset(e)),ga(t=>t.length>0),wa(1e3,void 0,{leading:!0,trailing:!0}))}subscribeStore(){return da(()=>{let t=new ua;return ha(this.getMemPools()).pipe(ot(n=>n.filter(i=>this.hasValidAssets(i))),vn(n=>this.store.set(n))).pipe(vn(()=>{t.add(this.subscribeBalances()),t.add(this.subscribeUpdates())}),xa(n=>ya(fa(n),this.store.asObservable().pipe(Sa(1)))),ba(()=>{t.unsubscribe()}))}).pipe(Ta({connector:()=>new ca(1),resetOnRefCountZero:!0}))}subscribeBalances(){let t=this.store.pools.map(e=>{let{address:n}=e,i=[this.subscribeTokensBalance(n)];if(this.hasSystemAsset(e)){let a=this.subscribeSystemBalance(n);i.push(a)}if(this.hasErc20Asset(e)){let a=e.tokens.filter(s=>s.type==="Erc20").map(s=>s.id),r=this.subscribeErc20Balance(n,a);i.push(r)}return Tn(i).pipe(ot(a=>a.flat()),Pa(),ot(([a,r])=>this.getDeltas(a,r)),ot(a=>[n,a]))});return Tn(t).pipe(pa(250),ot(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=[],i=new Map(t.map(a=>[a.address,a]));for(let[a,r]of e){let s=i.get(a);if(s){let o=s.tokens.map(l=>{let c=r.find(u=>u.id===l.id);return c&&l.id!==s.id?{...l,balance:c.balance.transferable}:l});n.push({...s,tokens:o})}}return n}};var Et=class extends L{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:i,initial_weight:a,final_weight:r}=t,s=U.calculateLinearWeights(n?n.toString():"0",i?i.toString():"0",a.toString(),r.toString(),e.toString()),o=BigInt(s),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(Ia.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries({at:"best"}),this.api.query.ParachainSystem.ValidationData.getValue({at:"best"}),this.getPoolLimits()]),i=e?.relay_parent_number||0,a=t.filter(({value:r})=>e&&this.isActivePool(r,i)).map(async({keyArgs:r,value:s})=>{let[o]=r,l=o.toString(),c=await this.getPoolDelta(l,s,i);return{address:l,type:"LBP",fee:s.fee,...c,...n}});return Promise.all(a)}async getPoolDelta(t,e,n){let{assets:i,repay_target:a,fee_collector:r}=e,[s,o]=this.getPoolWeights(e,n),[l,c]=i,[u,m,p,g,h]=await Promise.all([this.isRepayFeeApplied(l,a,r.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:p?.decimals,existentialDeposit:p?.existential_deposit,balance:m.transferable,weight:s,type:p?.asset_type.type},{id:c,decimals:h?.decimals,existentialDeposit:h?.existential_deposit,balance:g.transferable,weight:o,type:h?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:i}=t;return n&&i?e>=n&&e<i:!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(a=>a.address===e);return{repayFee:await this.getRepayFee(),exchangeFee:n.fee}}subscribeValidationData(){return this.api.query.ParachainSystem.ValidationData.watchValue("best").pipe(Ba(t=>t!==void 0),Oa((t,e)=>t.relay_parent_number===e.relay_parent_number)).subscribe(({relay_parent_number:t})=>{this.store.update(async e=>{let n=[];for(let i of e){let a=this.poolsData.get(i.address);if(a){let{assets:r,repay_target:s,fee_collector:o}=a,[l]=r,[c,u]=this.getPoolWeights(a,t),[m,p]=i.tokens,g=[{...m,weight:c},{...p,weight:u}],h=await this.isRepayFeeApplied(l,s,o.toString());n.push({...i,tokens:g,repayFeeApply:h})}}return n})})}subscribeUpdates(){let t=new Aa;return t.add(this.subscribeValidationData()),t}};var Ce={};A(Ce,{OmniMath:()=>w,OmniPool:()=>kt,OmniPoolClient:()=>Dt});import{calculate_in_given_out as _a,calculate_lrna_in_given_out as Ra,calculate_out_given_in as Fa,calculate_out_given_lrna_in as Ca,calculate_spot_price as Ea,calculate_lrna_spot_price as ka,calculate_shares as Da,calculate_liquidity_out as Ma,calculate_liquidity_lrna_out as La,verify_asset_cap as qa,calculate_liquidity_hub_in as Ha,is_sell_allowed as Na,is_buy_allowed as Ga,is_add_liquidity_allowed as Va,is_remove_liquidity_allowed as Ua,recalculate_asset_fee as Wa,recalculate_protocol_fee as Ya}from"@galacticcouncil/math-omnipool";import lt from"big.js";var w=class{static calculateSpotPrice(t,e,n,i){return Ea(t,e,n,i)}static calculateLrnaSpotPrice(t,e){return ka(t,e)}static calculateInGivenOut(t,e,n,i,a,r,s,o,l){return _a(t,e,n,i,a,r,s,o,l)}static calculateLrnaInGivenOut(t,e,n,i,a){return Ra(t,e,n,i,a)}static calculateOutGivenIn(t,e,n,i,a,r,s,o,l){return Fa(t,e,n,i,a,r,s,o,l)}static calculateOutGivenLrnaIn(t,e,n,i,a){return Ca(t,e,n,i,a)}static calculateShares(t,e,n,i){return Da(t,e,n,i)}static calculateLiquidityOut(t,e,n,i,a,r,s,o){return Ma(t,e,n,i,a,r,s,o)}static calculateLiquidityLRNAOut(t,e,n,i,a,r,s,o){return La(t,e,n,i,a,r,s,o)}static calculateCapDifference(t,e,n,i){let a=lt(e),r=lt(t),s=lt(i),o=lt(n),l=lt(10).pow(18),c=o.div(l);if(a.div(s).lt(c)){let m=c.times(s).minus(a).times(r),p=a.times(lt(1).minus(c));return m.div(p).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,n,i){return Ha(t,e,n,i)}static isSellAllowed(t){return Na(t)}static isBuyAllowed(t){return Ga(t)}static isAddLiquidityAllowed(t){return Va(t)}static isRemoveLiquidityAllowed(t){return Ua(t)}static recalculateAssetFee(t,e,n,i,a,r,s,o,l,c,u){return Wa(t,e,n,i,a,r,s,o,l,c,u)}static recalculateProtocolFee(t,e,n,i,a,r,s,o,l,c,u){return Ya(t,e,n,i,a,r,s,o,l,c,u)}static verifyAssetCap(t,e,n,i){return qa(t,e,n,i)}};import{big as Xa}from"@galacticcouncil/common";var{FeeUtils:ct}=x,kt=class d{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new d(t)}constructor(t){this.type="Omnipool",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.hubAssetId=t.hubAssetId}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),i=n.get(t),a=n.get(e);if(i==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:i.hubReserves,hubReservesOut:a.hubReserves,sharesIn:i.shares,sharesOut:a.shares,decimalsIn:i.decimals,decimalsOut:a.decimals,balanceIn:i.balance,balanceOut:a.balance,tradeableIn:i.tradeable,tradeableOut:a.tradeable,assetInEd:i.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let i=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),r=i===0n?0:I.calculateDiffToRef(a,i),s=[],o=w.isSellAllowed(t.tradeableIn),l=w.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||i<t.assetInEd)&&s.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&s.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return a>u&&s.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:i,amountOut:e,feePct:r,errors:s}}validateAndSell(t,e,n){let i=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),r=I.calculateDiffToRef(i,a),s=[],o=w.isSellAllowed(t.tradeableIn),l=w.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||i<t.assetOutEd)&&s.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&s.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return a>u&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:a,feePct:r,errors:s}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let i=w.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ct.toRaw(n.assetFee).toString():"0",n?ct.toRaw(n.protocolFee).toString():"0"),a=BigInt(i);return a<0n?0n:a}calculateLrnaInGivenOut(t,e,n){let i=w.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ct.toRaw(n.assetFee).toString():"0"),a=BigInt(i);return a<0n?0n:a}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let i=w.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ct.toRaw(n.assetFee).toString():"0",n?ct.toRaw(n.protocolFee).toString():"0"),a=BigInt(i);return a<0n?0n:a}calculateOutGivenLrnaIn(t,e,n){let i=w.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ct.toRaw(n.assetFee).toString():"0"),a=BigInt(i);return a<0n?0n:a}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());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceLrnaInGivenOut(t){let e=w.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=w.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}spotPriceOutGivenLrnaIn(t){let e=w.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}normalizeSpot(t,e,n){let i=e-n;if(i===0)return t;let a=Xa.pow10(Math.abs(i));return i>0?t*a:t/a}};import{AccountId as za,Binary as Ka,CompatibilityLevel as $a,Enum as ja}from"polkadot-api";import{toHex as Qa}from"@polkadot-api/utils";import{Subscription as Ja,distinctUntilChanged as Fe,filter as Za,finalize as ut,map as tr,merge as er}from"rxjs";import{HYDRATION_SS58_PREFIX as nr}from"@galacticcouncil/common";var{FeeUtils:R}=x,xn=Ka.fromText("omnipool"),wn=ja("Short"),Dt=class extends L{queryBus=new oe;block=0;dynamicFeesConfig=this.queryBus.scope("DynamicFees.AssetFeeConfiguration",t=>this.api.query.DynamicFees.AssetFeeConfiguration.getValue(t,{at:"best"}),t=>String(t));dynamicFees=this.queryBus.scope("DynamicFees.AssetFee",t=>this.api.query.DynamicFees.AssetFee.getValue(t,{at:"best"}),t=>String(t),6*1e3);emaOracles=this.queryBus.scope("EmaOracle.Oracles.Short",t=>this.api.query.EmaOracle.Oracles.getValue(xn,t,wn,{at:"best"}),t=>t.join(":"),6*1e3);getPoolType(){return"Omnipool"}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=Qa(e);return za(nr).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($a.BackwardsCompatible,e)}async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,i,a,r,s]=await Promise.all([this.api.query.Omnipool.Assets.getEntries({at:"best"}),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[m]=c,{hub_reserve:p,shares:g,tradable:h,cap:b,protocol_shares:f}=u,[y,S]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(m),this.getBalance(e,m)]);return{id:m,decimals:y?.decimals,existentialDeposit:y?.existential_deposit,balance:S.transferable,cap:b,hubReserves:p,protocolShares:f,shares:g,tradeable:h,type:y?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:r.transferable,tradeable:i,type:a?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...s}]}async getPoolFees(t){let e=t.assetOut,n=t.assetIn,i=await this.dynamicFeesConfig.get(e);if(i?.type==="Fixed"){let{asset_fee:y,protocol_fee:S}=i.value;return{assetFee:R.fromPermill(y),protocolFee:R.fromPermill(S)}}let a=this.getOraclePair(e),r=this.getOraclePair(n),[s,o,l]=await Promise.all([this.dynamicFees.get(e),this.emaOracles.get(a),this.emaOracles.get(r)]),[c,u,m]=await this.getAssetFee(t,this.block,s,o,i?.value.asset_fee_params),[p,g,h]=n===1?[0,0,0]:await this.getProtocolFee(t,this.block,s,l,i?.value.protocol_fee_params),b=c+p,f=m+h;return{assetFee:R.fromPermill(u),protocolFee:R.fromPermill(g),min:R.fromPermill(b),max:R.fromPermill(f)}}async getAssetFee(t,e,n,i,a){let{assetOut:r,balanceOut:s}=t,{min_fee:o,max_fee:l,decay:c,amplification:u}=a||await this.api.constants.DynamicFees.AssetFeeParameters();if(!n||!i)return[o,o,l];let m=R.fromPermill(o),p=R.fromPermill(l),[g]=i,{asset_fee:h,timestamp:b}=n,f=Math.max(1,e-b),y=g.volume.b_in.toString(),S=g.volume.b_out.toString(),P=g.liquidity.b.toString();r===0&&(y=g.volume.a_in.toString(),S=g.volume.a_out.toString(),P=g.liquidity.a.toString());let T=R.fromPermill(h),v=w.recalculateAssetFee(y,S,P,"9",s.toString(),R.toRaw(T).toString(),f.toString(),R.toRaw(m).toString(),R.toRaw(p).toString(),c.toString(),u.toString());return[o,Number(v)*1e6,l]}async getProtocolFee(t,e,n,i,a){let{assetIn:r,balanceIn:s}=t,{min_fee:o,max_fee:l,decay:c,amplification:u}=a||await this.api.constants.DynamicFees.ProtocolFeeParameters();if(!n||!i)return[o,o,l];let m=R.fromPermill(o),p=R.fromPermill(l),[g]=i,{protocol_fee:h,timestamp:b}=n,f=Math.max(1,e-b),y=g.volume.b_in.toString(),S=g.volume.b_out.toString(),P=g.liquidity.b.toString();r===0&&(y=g.volume.a_in.toString(),S=g.volume.a_out.toString(),P=g.liquidity.a.toString());let T=R.fromPermill(h),v=w.recalculateProtocolFee(y,S,P,"9",s.toString(),R.toRaw(T).toString(),f.toString(),R.toRaw(m).toString(),R.toRaw(p).toString(),c.toString(),u.toString());return[o,Number(v)*1e6,l]}subscribeEmaOracles(){let[t]=this.store.pools,n=t.tokens.map(i=>i.id).map(i=>this.getOraclePair(i)).map(i=>this.api.query.EmaOracle.Oracles.watchValue(xn,i,wn,"best").pipe(Za(a=>a!==void 0),tr(a=>({pair:i,value:a}))));return er(...n).pipe(ut(()=>{this.log(this.getPoolType(),"unsub ema oracles"),this.emaOracles.clear()})).subscribe(i=>{let{pair:a,value:r}=i;this.emaOracles.set(r,a)})}subscribeDynamicFees(){return this.api.query.DynamicFees.AssetFee.watchEntries({at:"best"}).pipe(Fe((t,e)=>!e.deltas),ut(()=>{ut(()=>{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(Fe((t,e)=>!e.deltas),ut(()=>{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(ut(()=>{this.log(this.getPoolType(),"unsub block change")})).subscribe(t=>{this.block=t})}subscribeAssets(){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(Fe((t,e)=>!e.deltas),ut(()=>{this.log(this.getPoolType(),"unsub assets")})).subscribe(({deltas:t})=>{this.store.update(([e])=>{let n=t?.upserted.reduce((a,r)=>{let[s]=r.args;return a.set(s,r.value),a},new Map),i=e.tokens.map(a=>{let r=n?.get(a.id);return r?this.updateTokenState(a,r):a});return[{...e,tokens:i}]})})}subscribeUpdates(){let t=new Ja;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:i,tradable:a,cap:r,protocol_shares:s}=e;return{...t,cap:r,hubReserves:n,protocolShares:s,shares:i,tradeable:a}}};var ke={};A(ke,{StableMath:()=>D,StableSwap:()=>Q,StableSwapClient:()=>Mt});import{calculate_in_given_out as ir,calculate_out_given_in as ar,calculate_amplification as rr,calculate_add_one_asset as sr,calculate_liquidity_out_one_asset as or,calculate_shares as lr,calculate_shares_for_amount as cr,calculate_spot_price_with_fee as ur,pool_account_name as mr,recalculate_peg as pr}from"@galacticcouncil/math-stableswap";var D=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,i,a){return rr(t,e,n,i,a)}static calculateInGivenOut(t,e,n,i,a,r,s){return ir(t,e,n,i,a,r,s)}static calculateAddOneAsset(t,e,n,i,a,r,s){return sr(t,e,n,i,a,r,s)}static calculateSharesForAmount(t,e,n,i,a,r,s){return cr(t,e,n,i,a,r,s)}static calculateOutGivenIn(t,e,n,i,a,r,s){return ar(t,e,n,i,a,r,s)}static calculateLiquidityOutOneAsset(t,e,n,i,a,r,s){return or(t,e,n,i,a,r,s)}static calculateShares(t,e,n,i,a,r){return lr(t,e,n,i,a,r)}static calculateSpotPriceWithFee(t,e,n,i,a,r,s,o){return ur(t,e,n,i,a,r,s,o)}static recalculatePegs(t,e,n,i,a,r){let s=pr(t,e,n,i,a,r);return JSON.parse(s)}};import{RUNTIME_DECIMALS as dr,big as In}from"@galacticcouncil/common";var{FeeUtils:mt}=x,Q=class d{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;isRampPeriod;id;fee;totalIssuance;pegs;static fromPool(t){return new d(t)}constructor(t){this.type="Stableswap",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.amplification=t.amplification,this.isRampPeriod=t.isRampPeriod,this.id=t.id,this.fee=t.fee,this.totalIssuance=t.totalIssuance,this.pegs=t.pegs}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),i=n.get(t),a=n.get(e);if(i==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:i.balance,balanceOut:a.balance,decimalsIn:i.decimals,decimalsOut:a.decimals,tradeableIn:this.id===t?15:i.tradeable,tradeableOut:this.id===e?15:a.tradeable,assetInEd:i.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let i=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),r=i===0n?0:I.calculateDiffToRef(a,i),s=[],o=w.isSellAllowed(t.tradeableIn),l=w.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||i<t.assetInEd)&&s.push("InsufficientTradingAmount"),{amountIn:a,calculatedIn:i,amountOut:e,feePct:r,errors:s}}validateAndSell(t,e,n){let i=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),r=I.calculateDiffToRef(i,a),s=[],o=w.isSellAllowed(t.tradeableIn),l=w.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||i<t.assetOutEd)&&s.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:i,amountOut:a,feePct:r,errors:s}}calculateIn(t,e,n){let i=D.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(i);return a<0n?0n:a}calculateAddOneAsset(t,e,n){let i=D.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(i);return a<0n?0n:a}calculateSharesForAmount(t,e,n){let i=D.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(i);return a<0n?0n:a}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=D.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());return this.normalizeSpot(BigInt(e),t.assetOut===this.id,t.assetIn===this.id,t.decimalsOut,t.decimalsIn)}calculateOut(t,e,n){let i=D.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(i);return a<0n?0n:a}calculateWithdrawOneAsset(t,e,n){let i=D.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(i);return a<0n?0n:a}calculateShares(t,e,n){let i=D.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(i);return a<0n?0n:a}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=D.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());return this.normalizeSpot(BigInt(e),t.assetIn===this.id,t.assetOut===this.id,t.decimalsIn,t.decimalsOut)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:i})=>({asset_id:e,amount:n,decimals:i}));return JSON.stringify(t,Bt.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],Bt.jsonFormatter)}normalizeSpot(t,e,n,i,a){return e?t*In.pow10(dr-a):n?t/In.pow10(a-i):t}};import{AccountId as gr,CompatibilityLevel as br}from"polkadot-api";import{toHex as hr}from"@polkadot-api/utils";import{blake2b as yr}from"@noble/hashes/blake2b";import{Subscription as fr,distinctUntilChanged as Pr,finalize as Ee,map as Sr,merge as Tr}from"rxjs";import{HYDRATION_SS58_PREFIX as vr,RUNTIME_DECIMALS as xr}from"@galacticcouncil/common";var{FeeUtils:wr}=x,Mt=class extends L{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=D.getPoolAddress(t),n=yr(e,{dkLen:32}),i=hr(n);return gr(vr).dec(i)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}getPoolAmplification(t,e){let{initial_amplification:n,final_amplification:i,initial_block:a,final_block:r}=t,s=D.calculateAmplification(n.toString(),i.toString(),a.toString(),r.toString(),e.toString()),o=Number(s)<i;return{amplification:BigInt(s),isRampPeriod:o}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),i=e.assets.map(async a=>{let[r,s,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,a),this.api.query.AssetRegistry.Assets.getValue(a),this.getBalance(n,a)]);return{id:a,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:o.transferable,tradeable:r,type:s?.asset_type.type}});return Promise.all(i)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(br.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries({at:"best"}),this.api.query.System.Number.getValue({at:"best"}),this.getPoolLimits()]),i=t.map(async({keyArgs:a,value:r})=>{let[s]=a,o=this.getPoolAddress(s),[l,c,u]=await Promise.all([this.getPoolTokens(s,r),this.api.query.Stableswap.PoolPegs.getValue(s,{at:"best"}),this.api.query.Tokens.TotalIssuance.getValue(s,{at:"best"})]),m=this.getPoolAmplification(r,e),p=c?this.getRecentPegs(c):this.getDefaultPegs(r);return l.push({id:s,tradeable:15,balance:u,decimals:xr}),this.poolsData.set(s,r),{address:o,id:s,type:"Stableswap",fee:wr.fromPermill(r.fee),tokens:l,totalIssuance:u,pegs:p,...n,...m}});return Promise.all(i)}async getPoolFees(t,e){return{fee:this.store.pools.find(i=>i.address===e).fee}}getDefaultPegs(t){return D.defaultPegs(t.assets.length)}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,i])=>i.map(a=>a.toString()))}subscribeIssuance(){let e=this.store.pools.map(n=>n.id).map(n=>this.api.query.Tokens.TotalIssuance.watchValue(n,"best").pipe(Sr(i=>({id:n,value:i}))));return Tr(...e).pipe(Ee(()=>{this.log(this.getPoolType(),"unsub total issuance")})).subscribe(n=>{let{id:i,value:a}=n;this.store.update(r=>{let s=[];return r.filter(o=>o.id===i).forEach(o=>{let l=o.tokens.map(c=>c.id===i?{...c,balance:a}:c);s.push({...o,tokens:l,totalIssuance:a})}),s})})}subscribePoolPegs(){return this.api.query.Stableswap.PoolPegs.watchEntries({at:"best"}).pipe(Pr((t,e)=>!e.deltas),Ee(()=>{this.log(this.getPoolType(),"unsub pool pegs")})).subscribe(({deltas:t})=>{this.store.update(e=>{let n=[],i=new Map(e.map(a=>[a.id,a]));return t?.upserted.forEach(({args:a,value:r})=>{let[s]=a,o=i.get(s);if(o){let l=this.getRecentPegs(r);n.push({...o,pegs:l})}}),n})})}subscribeBlock(){return this.api.query.System.Number.watchValue("best").pipe(Ee(()=>{this.log(this.getPoolType(),"unsub block change")})).subscribe(t=>{this.store.update(e=>{let n=[];return e.filter(i=>i.isRampPeriod).forEach(i=>{let a=this.poolsData.get(i.id);if(a){let r=this.getPoolAmplification(a,t);n.push({...i,...r})}}),n})})}subscribeUpdates(){let t=new fr;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 De={};A(De,{XykMath:()=>$,XykPool:()=>Lt,XykPoolClient:()=>qt});import{calculate_in_given_out as Ir,calculate_out_given_in as Ar,calculate_pool_trade_fee as Or,get_spot_price as Br,calculate_liquidity_in as _r,calculate_shares as Rr,calculate_spot_price as Fr,calculate_spot_price_with_fee as Cr,calculate_liquidity_out_asset_a as Er,calculate_liquidity_out_asset_b as kr}from"@galacticcouncil/math-xyk";var $=class{static getSpotPrice(t,e,n){return Br(t,e,n)}static calculateInGivenOut(t,e,n){return Ir(t,e,n)}static calculateOutGivenIn(t,e,n){return Ar(t,e,n)}static calculatePoolTradeFee(t,e,n){return Or(t,e,n)}static calculateLiquidityIn(t,e,n){return _r(t,e,n)}static calculateSpotPrice(t,e){return Fr(t,e)}static calculateSpotPriceWithFee(t,e,n,i){return Cr(t,e,n,i)}static calculateShares(t,e,n){return Rr(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,i){return Er(t,e,n,i)}static calculateLiquidityOutAssetB(t,e,n,i){return kr(t,e,n,i)}};import{big as Dr}from"@galacticcouncil/common";var{FeeUtils:An}=x,Lt=class d{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new d(t)}constructor(t){this.type="XYK",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),i=n.get(t),a=n.get(e);if(i==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:i.decimals,decimalsOut:a.decimals,balanceIn:i.balance,balanceOut:a.balance,assetInEd:i.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let i=this.calculateInGivenOut(t,e),a=this.calculateTradeFee(i,n),r=An.toPct(n.exchangeFee),s=i+a,o=[];(e<this.minTradingLimit||i<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:i,amountOut:e,feePct:r,errors:o}}validateAndSell(t,e,n){let i=this.calculateOutGivenIn(t,e),a=this.calculateTradeFee(i,n),r=An.toPct(n.exchangeFee),s=i-a,o=[];(e<this.minTradingLimit||i<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:i,amountOut:s,feePct:r,errors:o}}calculateInGivenOut(t,e){let n=$.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),i=BigInt(n);return i<0n?0n:i}calculateOutGivenIn(t,e){let n=$.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),i=BigInt(n);return i<0n?0n:i}spotPriceInGivenOut(t){let e=$.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){let e=$.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}calculateTradeFee(t,e){let n=$.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}normalizeSpot(t,e,n){let i=e-n;if(i===0)return t;let a=Dr.pow10(Math.abs(i));return i>0?t*a:t/a}};import{CompatibilityLevel as Mr}from"polkadot-api";import{Subscription as Lr}from"rxjs";var qt=class extends L{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(Mr.BackwardsCompatible,e)}async loadPools(){let[t,e]=await Promise.all([this.api.query.XYK.PoolAssets.getEntries(),this.getPoolLimits()]),n=t.map(async({keyArgs:i,value:a})=>{let[r]=i,[s,o]=a,[l,c,u,m]=await Promise.all([this.getBalance(r,s),this.api.query.AssetRegistry.Assets.getValue(s),this.getBalance(r,o),this.api.query.AssetRegistry.Assets.getValue(o)]);return{address:r,type:"XYK",tokens:[{id:s,decimals:c?.decimals||this.decimals.get(s),existentialDeposit:c?.existential_deposit,balance:l.transferable,type:c?.asset_type.type},{id:o,decimals:m?.decimals||this.decimals.get(o),existentialDeposit:m?.existential_deposit,balance:u.transferable,type:m?.asset_type.type}],...e}});return Promise.all(n)}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}subscribeUpdates(){return Lr.EMPTY}};var Le={};A(Le,{AavePool:()=>Ht,AavePoolClient:()=>Nt});import{big as On,RUNTIME_DECIMALS as Bn}from"@galacticcouncil/common";var Ht=class d{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new d(t)}constructor(t){this.type="Aave",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),i=n.get(t),a=n.get(e);if(i==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:i.balance,balanceOut:a.balance,decimalsIn:i.decimals,decimalsOut:a.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let i=this.calculateInGivenOut(t,e),a=[];return e>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:i,calculatedIn:i,amountOut:e,feePct:0,errors:a}}validateAndSell(t,e,n){let i=this.calculateOutGivenIn(t,e),a=[];return i>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:e,calculatedOut:i,amountOut:i,feePct:0,errors:a}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){return On.toBigInt(1,Bn)}spotPriceOutGivenIn(t){return On.toBigInt(1,Bn)}calculateTradeFee(t,e){return 0n}};import{AccountId as qr}from"polkadot-api";import{toHex as Hr}from"@polkadot-api/utils";import{Subscription as Rn,filter as Me,finalize as Fn,map as Cn}from"rxjs";import{decodeEventLog as Nr}from"viem";import{erc20 as Gr,HYDRATION_SS58_PREFIX as Vr}from"@galacticcouncil/common";var _n=[{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:Ur}=Gr,Wr=["Supply","Withdraw","Repay","Borrow"],Nt=class extends L{getPoolType(){return"Aave"}async isSupported(){return!0}getPoolId(t,e){let n=t+"/"+e,i=new TextEncoder().encode(n.padEnd(32,"\0")),a=Hr(i);return qr(Vr).dec(a)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools({at:"best"})).map(async({reserve:n,atoken:i,liqudity_in:a,liqudity_out:r})=>{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(i),this.api.query.AssetRegistry.AssetLocations.getValue(i)]);return{address:this.getPoolId(n,i),type:"Aave",tokens:[{id:n,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:a,location:o,type:s?.asset_type.type},{id:i,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:r,location:c,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:i,liqudity_out:a}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id,{at:"best"});return t.tokens.map(r=>{let s=r.id===e.id?i:a;return{...r,balance:s}})}async getPoolFees(){return{}}getReserveH160Id(t){if(t.type==="Erc20"&&t.location){let e=t.location.interior;if(e.type==="X1"&&e.value.type==="AccountKey20"){let{value:n}=e.value;return n.key.asHex()}throw new Error("Invalid aave reserve multilocation")}return Ur.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,i=e.map(r=>r.asHex()),a=n.asHex();try{let{eventName:r,args:s}=Nr({abi:_n,topics:i,data:a}),o=s.reserve.toLowerCase();return{eventName:r,reserve:o,key:`${r}:${o}`}}catch{return}}subscribeRouterExecuted(){let e=this.store.pools.map(n=>n.tokens).map(([n,i])=>i).map(n=>n.id);return this.api.event.Router.Executed.watch().pipe(Cn(({payload:n})=>this.parseRouterLog(n)),Me(({assetIn:n,assetOut:i})=>e.includes(n)||e.includes(i)),Fn(()=>{this.log(this.getPoolType(),"unsub router executed")})).subscribe(({assetIn:n,assetOut:i,key:a})=>{this.log(this.getPoolType(),"[router:Executed]",a),this.store.update(async r=>{let s=[];for(let o of r){let[l,c]=o.tokens;if(c.id===n||c.id===i){let m=await this.getPoolDelta(o);s.push({...o,tokens:m})}}return s})})}subscribeEvmLog(){return this.api.event.EVM.Log.watch().pipe(Cn(({payload:t})=>this.parseEvmLog(t)),Me(t=>t!==void 0),Me(({eventName:t})=>Wr.includes(t)),Fn(()=>{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 i=[];for(let a of n){let[r]=a.tokens;if(this.getReserveH160Id(r).toLowerCase()===t){let o=await this.getPoolDelta(a);i.push({...a,tokens:o})}}return i})})}subscribeBalances(){return Rn.EMPTY}subscribeUpdates(){let t=new Rn;return t.add(this.subscribeRouterExecuted()),t.add(this.subscribeEvmLog()),t}};var pt=class{static get(t){switch(t.type){case"Aave":return Ht.fromPool(t);case"XYK":return Lt.fromPool(t);case"Omnipool":return kt.fromPool(t);case"LBP":return Ct.fromPool(t);case"Stableswap":return Q.fromPool(t);case"HSM":return Q.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as ls,Subscription as dt,takeUntil as cs}from"rxjs";var Ve={};A(Ve,{HsmMath:()=>W,HsmPool:()=>He,HsmPoolClient:()=>Wt});import{calculate_collateral_in_given_hollar_out as Yr,calculate_collateral_out_given_hollar_in as Xr,calculate_hollar_in_given_collateral_out as zr,calculate_hollar_out_given_collateral_in as Kr,calculate_imbalance as $r,calculate_max_price as jr,calculate_buyback_limit as Qr,calculate_buyback_price_with_fee as Jr}from"@galacticcouncil/math-hsm";var W=class{static calculateCollateralInGivenHollarOut(t,e,n){return Yr(t,e,n)}static calculateCollateralOutGivenHollarIn(t,e,n){return Xr(t,e,n)}static calculateHollarOutGivenCollateralIn(t,e,n){return Kr(t,e,n)}static calculateHollarInGivenCollateralOut(t,e,n){return zr(t,e,n)}static calculateImbalance(t,e,n){return $r(t,e,n)}static calculateBuybackLimit(t,e){return Qr(t,e)}static calculateBuybackPriceWithFee(t,e,n){return Jr(t,e,n)}static calculateMaxPrice(t,e){return jr(t,e)}};import{big as me,RUNTIME_DECIMALS as qe}from"@galacticcouncil/common";var{FeeUtils:Gt}=x,He=class d extends Q{hsmAddress;hsmMintCapacity;hollarId;hollarH160;collateralId;collateralBalance;maxBuyPriceCoefficient;maxInHolding;purchaseFee;buyBackFee;buyBackRate;static fromPool(t){return new d(t)}constructor(t){super(t),this.type="HSM",this.hsmAddress=t.hsmAddress,this.hsmMintCapacity=t.hsmMintCapacity,this.hollarId=t.hollarId,this.hollarH160=t.hollarH160,this.collateralId=t.collateralId,this.collateralBalance=t.collateralBalance,this.maxBuyPriceCoefficient=t.maxBuyPriceCoefficient,this.maxInHolding=t.maxInHolding,this.purchaseFee=t.purchaseFee,this.buyBackFee=t.buyBackFee,this.buyBackRate=t.buyBackRate}validatePair(t,e){return!0}parsePair(t,e){return super.parsePair(t,e)}validateTradeHollarIn(t,e,n,i){let a=this.calculateBuybackLimit(t);e>a&&i.push("MaxBuyBackExceeded");let r=this.calculateBuyPrice(t,e,n),s=this.calculateMaxPrice(t);return r>s&&i.push("MaxBuyPriceExceeded"),n>this.collateralBalance&&i.push("InsufficientCollateral"),i}validateTradeHollarOut(t,e,n){return this.collateralBalance+t>this.maxInHolding&&n.push("MaxHoldingExceeded"),e>this.hsmMintCapacity&&n.push("FacilitatorCapacityExceeded"),n}validateTradeConstraints(t,e,n){let i=[];return t.assetIn===this.hollarId?this.validateTradeHollarIn(t,e,n,i):this.validateTradeHollarOut(e,n,i)}validateAndBuy(t,e){let n=this.calculateInGivenOut(t,e),i=this.validateTradeConstraints(t,n,e);return{amountIn:n,calculatedIn:n,amountOut:e,feePct:0,errors:i}}validateAndSell(t,e){let n=this.calculateOutGivenIn(t,e),i=this.validateTradeConstraints(t,e,n);return{amountIn:e,calculatedOut:n,amountOut:n,feePct:0,errors:i}}calculateHollarInGivenCollateralOut(t,e){let n=super.calculateInGivenOut(t,e,{fee:this.fee}),i=W.calculateHollarInGivenCollateralOut(e.toString(),n.toString(),Gt.toRaw(this.buyBackFee).toString());return BigInt(i)}calculateCollateralInGivenHollarOut(t){let e=this.getCollateralPeg(),n=W.calculateCollateralInGivenHollarOut(t.toString(),JSON.stringify(e),Gt.toRaw(this.purchaseFee).toString());return BigInt(n)}calculateInGivenOut(t,e){return t.assetOut==this.hollarId?this.calculateCollateralInGivenHollarOut(e):this.calculateHollarInGivenCollateralOut(t,e)}calculateCollateralOutGivenHollarIn(t,e){let n=super.calculateOutGivenIn(t,e,{fee:this.fee}),i=W.calculateCollateralOutGivenHollarIn(e.toString(),n.toString(),Gt.toRaw(this.buyBackFee).toString());return BigInt(i)}calculateHollarOutGivenCollateralIn(t){let e=this.getCollateralPeg(),n=W.calculateHollarOutGivenCollateralIn(t.toString(),JSON.stringify(e),Gt.toRaw(this.purchaseFee).toString());return BigInt(n)}calculateOutGivenIn(t,e){return t.assetIn==this.hollarId?this.calculateCollateralOutGivenHollarIn(t,e):this.calculateHollarOutGivenCollateralIn(e)}calculateImbalance(t){let e=this.getCollateralPeg(),n=W.calculateImbalance(t.balanceIn.toString(),JSON.stringify(e),t.balanceOut.toString());return BigInt(n)}calculateBuybackLimit(t){let e=this.calculateImbalance(t),n=W.calculateBuybackLimit(e.toString(),Gt.toRaw(this.buyBackRate).toString());return BigInt(n)}calculateBuyPrice(t,e,n){let i=n*10n**BigInt(t.decimalsIn);return e*10n**BigInt(t.decimalsOut)/i}calculateMaxPrice(t){let e=this.getCollateralPeg(),n=W.calculateMaxPrice(JSON.stringify(e),this.maxBuyPriceCoefficient.toString()),[i,a]=JSON.parse(n),r=10n**BigInt(qe-t.decimalsOut);return BigInt(i)*r/BigInt(a)}spotPriceInGivenOut(t){let e=me.toBigInt(1,qe);return this.calculateInGivenOut(t,e)}spotPriceOutGivenIn(t){let e=me.toBigInt(1,qe);return this.calculateOutGivenIn(t,e)}getCollateralPeg(){let t=this.tokens.findIndex(i=>i.id!==this.hollarId),e=this.pegs[t],n=this.tokens[t].decimals;return this.isDefaultPeg(e)?[me.toBigInt(1,18).toString(),me.toBigInt(1,n).toString()]:e}isDefaultPeg(t){let[e,n]=t;return Array.isArray(t)&&t.length===2&&e==="1"&&n==="1"}};import{AccountId as Zr,CompatibilityLevel as ts}from"polkadot-api";import{toHex as es}from"@polkadot-api/utils";import{Subscription as En,combineLatest as ns,filter as kn,finalize as Dn,map as Ne,pairwise as is}from"rxjs";import{decodeEventLog as as}from"viem";import{h160 as rs,HYDRATION_SS58_PREFIX as ss}from"@galacticcouncil/common";var Vt=[{inputs:[{internalType:"address",name:"facilitator",type:"address"}],name:"getFacilitator",outputs:[{type:"tuple",components:[{name:"addr",type:"address"},{name:"label",type:"bytes32"},{name:"bucketCapacity",type:"uint128"},{name:"bucketLevel",type:"uint128"}]}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"facilitator",type:"address"}],name:"getFacilitatorBucket",outputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getFacilitatorsList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!0,internalType:"bytes32",name:"label",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"bucketCapacity",type:"uint256"}],name:"FacilitatorAdded",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"oldCapacity",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newCapacity",type:"uint256"}],name:"FacilitatorBucketCapacityUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"oldLevel",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newLevel",type:"uint256"}],name:"FacilitatorBucketLevelUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"}],name:"FacilitatorRemoved",type:"event"}];var Ut=class{client;constructor(t){this.client=t.getWsProvider()}async getFacilitatorCapacity(t,e){let[n,i]=await this.client.readContract({abi:Vt,address:t,functionName:"getFacilitatorBucket",args:[e]});return n-i}};var{FeeUtils:Ge}=x,{H160:Mn}=rs,os=["FacilitatorBucketCapacityUpdated","FacilitatorBucketLevelUpdated"],Wt=class extends L{ghoClient;stableClient;constructor(t,e,n){super(t,e),this.stableClient=n,this.ghoClient=new Ut(e)}getPoolType(){return"HSM"}getPoolId(t){return this.getPoolAddress("hsm:"+t)}getFacilitatorAddress(){return this.getPoolAddress("modlpy/hsmod")}getHollarAddress(t){if(t){let e=t.interior;if(e.type==="X1"&&e.value.type==="AccountKey20"){let{value:n}=e.value;return n.key.asHex()}}throw Error("Invalid hollar multilocation")}getPoolAddress(t){let e=t.padEnd(32,"\0"),n=new TextEncoder().encode(e),i=es(n);return Zr(ss).dec(i)}async isSupported(){let t=this.api.query.HSM.Collaterals,e=await this.api.compatibilityToken;return t.isCompatible(ts.BackwardsCompatible,e)}async loadPools(){let t=await this.api.constants.HSM.HollarId(),[e,n,i]=await Promise.all([this.api.query.AssetRegistry.AssetLocations.getValue(t),this.api.query.HSM.Collaterals.getEntries({at:"best"}),this.stableClient.getPools()]);if(n.length===0)return[];let a=this.getFacilitatorAddress(),r=Mn.fromAny(a),s=this.getHollarAddress(e),o=await this.ghoClient.getFacilitatorCapacity(s,r),l=n.map(async({keyArgs:u,value:m})=>{let[p]=u,{pool_id:g,max_buy_price_coefficient:h,max_in_holding:b,purchase_fee:f,buy_back_fee:y,buyback_rate:S}=m,P=i.find(T=>T.id===g);if(P){let T=this.getPoolId(g),v=await this.getBalance(a,p);return{...P,address:T,type:"HSM",tokens:P.tokens.filter(_=>_.id!==g),hsmAddress:a,hsmMintCapacity:o,hollarId:t,hollarH160:s,collateralId:p,collateralBalance:v.transferable,maxBuyPriceCoefficient:h,maxInHolding:b,purchaseFee:Ge.fromPermill(f),buyBackFee:Ge.fromPermill(y),buyBackRate:Ge.fromPerbill(S)}}});return(await Promise.all(l)).filter(u=>u!==null)}async getPoolFees(){return{}}parseEvmLog(t){let{topics:e,data:n}=t.log,i=e.map(r=>r.asHex()),a=n.asHex();try{let{eventName:r,args:s}=as({abi:Vt,topics:i,data:a}),o=s.facilitatorAddress.toLowerCase();return{eventName:r,facilitator:o,key:`${r}:${o}`}}catch{return}}subscribeEvmLog(){return this.api.event.EVM.Log.watch().pipe(Ne(({payload:t})=>this.parseEvmLog(t)),kn(t=>t!==void 0),kn(({eventName:t})=>os.includes(t)),Dn(()=>{this.log(this.getPoolType(),"unsub evm log")})).subscribe(({facilitator:t,key:e})=>{this.log(this.getPoolType(),"[evm:Log]",e),this.store.update(async n=>{let i=[],[{hsmAddress:a,hollarH160:r}]=n,s=Mn.fromAny(a);if(s.toLowerCase()===t){let l=await this.ghoClient.getFacilitatorCapacity(r,s);for(let c of n)i.push({...c,hsmMintCapacity:l})}return i})})}subscribeBalances(){let t=[],e=[];this.store.pools.forEach(a=>{let{tokens:r,collateralId:s}=a;r.find(l=>l.id===s).type==="Erc20"?e.push(s):t.push(s)});let[{hsmAddress:n}]=this.store.pools,i=[];if(t.length>0){let a=this.subscribeTokensBalance(n);i.push(a)}if(e.length>0){let a=this.subscribeErc20Balance(n,e);i.push(a)}return i.length>0?ns(i).pipe(Ne(a=>a.flat()),is(),Ne(([a,r])=>this.getDeltas(a,r)),Dn(()=>{this.log(this.getPoolType(),"unsub collateral balance")})).subscribe(a=>{this.store.update(r=>{let s=[],o=new Map(r.map(l=>[l.collateralId,l]));return a.forEach(({id:l,balance:c})=>{let u=o.get(l);u&&(this.log(this.getPoolType(),"[collateral:Balance]",l,c.transferable),s.push({...u,collateralBalance:c.transferable}))}),s})}):En.EMPTY}subscribeUpdates(){let t=new En;return t.add(this.subscribeEvmLog()),t}};var gt=class extends C{evm;aave;omnipool;stableswap;hsm;xyk;lbp;active=new Set([]);pools=new Map([]);clients=[];aaveSub=dt.EMPTY;omniSub=dt.EMPTY;stableSub=dt.EMPTY;hsmSub=dt.EMPTY;xykSub=dt.EMPTY;lbpSub=dt.EMPTY;isReady=!1;isDestroyed=new ls;constructor(t,e){super(t),this.evm=e,this.aave=new Nt(t,e),this.omnipool=new Dt(t,e),this.stableswap=new Mt(t,e),this.hsm=new Wt(t,e,this.stableswap),this.xyk=new qt(t,e),this.lbp=new Et(t,e),this.clients=[this.aave,this.omnipool,this.stableswap,this.hsm,this.xyk,this.lbp]}subscribe(t){return t.getSubscriber().pipe(cs(this.isDestroyed)).subscribe(e=>{e.forEach(n=>{this.pools.set(n.address,n)})})}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aave),this.active.add("Aave"),this}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}withHsm(){return this.hsmSub.unsubscribe(),this.hsmSub=this.subscribe(this.hsm),this.active.add("HSM"),this}withXyk(t){return this.xyk.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xyk),this.active.add("XYK"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbp),this.active.add("LBP"),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(i=>i.getPoolType()===e.type);if(n)return n.getPoolFees(t,e.address);throw new wt(e.type)}};var Vn={};A(Vn,{DEFAULT_BLOCK_TIME:()=>Hn,DEFAULT_MIN_BUDGET:()=>Ye,ORDER_MIN_BLOCK_PERIOD:()=>Nn,Router:()=>bt,TWAP_BLOCK_PERIOD:()=>$t,TWAP_MAX_DURATION:()=>ze,TWAP_MAX_PRICE_IMPACT:()=>Xe,TWAP_TX_MULTIPLIER:()=>Lg,TradeOrderError:()=>We,TradeOrderType:()=>de,TradeRouteBuilder:()=>G,TradeRouter:()=>yt,TradeScheduler:()=>ft,TradeType:()=>pe});var Yt=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 us=10,Xt=class{isNotVisited(t,e){let n=!0;return e.forEach(i=>{(i[0]===t[0]||i[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let i=[],a=new Yt,r=[];for(r.push([e,""]),a.enqueue(r);a.size()>0;){let s=a.dequeue();if(!s||s.length>us)continue;let o=s[s.length-1];(n===null||o[0]===n)&&i.push(s),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,s)){let u=[...s];u.push(c),a.enqueue(u)}})}return i}findShortestPaths(t,e,n){let i=[],a=new Yt,r=[];r.push([e,""]),a.enqueue(r);let s=1/0;for(;a.size()>0;){let o=a.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<s?(s=o.length,i.length=0,i.push(o)):o.length===s&&i.push(o);continue}let c=t.get(l[0]);for(let u of c??[])this.isNotVisited(u,o)&&a.enqueue([...o,u])}return i}buildAndPopulateGraph(t,e){let n=new Map;for(let i of t)n.set(parseInt(i),[]);for(let[i,a,r]of e)n.get(a)?.push([r,i]);return n}};function Ue(d){let t={};for(let e of d){let n=e.tokens.length;for(let i=0;i<n;i++){t[e.tokens[i].id]||(t[e.tokens[i].id]=[]);for(let a=0;a<n;a++){if(i==a)continue;let r=[e.address,e.tokens[i].id,e.tokens[a].id];t[e.tokens[i].id].push(r)}}}return t}var zt=class{getProposals(t,e,n){let i=n.filter(b=>b.type==="XYK"),a=n.filter(b=>b.type!=="XYK"),r=new Set(a.map(b=>b.tokens).flat().map(b=>b.id)),s=r.has(t),o=r.has(e),l=new Xt,c=b=>{let f=Ue(b),y=Object.keys(f),S=y.flatMap(P=>f[P]);return l.buildAndPopulateGraph(y,S)};if(!s&&!o){let b=i.filter(S=>S.tokens.find(P=>P.id===t)||S.tokens.find(P=>P.id===e)),f=c(b),y=l.findPaths(f,t,e);return this.parsePaths(y)}if(s&&o){let b=c(a),f=l.findPaths(b,t,e);return this.parsePaths(f)}let u=s?e:t,m=i.filter(b=>b.tokens.some(f=>f.id===u));if(m.length===0)return[];let p=[...a,...m],g=c(p),h=l.findPaths(g,t,e);return this.parsePaths(h)}parsePaths(t){let e=[];for(let n of t){let i=[];for(let a=0;a<n.length;a++){let r=n[a],s=n[a+1];if(s==null)break;i.push(this.toEdge(r,s))}e.push(i)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var bt=class{routeSuggester;routeProposals;ctx;filter={};constructor(t){this.ctx=t,this.routeSuggester=new zt,this.routeProposals=new Map}async withFilter(t){this.filter=t||{},this.routeProposals.clear(),this.onFilterChanged()}onFilterChanged(){}buildRouteKey(t,e,n){return`${t}->${e}::${n.length}`}applyPoolFilter(t){let{useOnly:e=[],exclude:n=[]}=this.filter,i=new Set(e),a=new Set(n);return t.filter(r=>a.has(r.type)?!1:i.size>0?i.has(r.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(i=>i!==t).map(i=>this.getRoutes(i,t)))).filter(i=>i.length>0).map(([i])=>i[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 i=this.getAssets(n);if(!i.has(t))throw new Error(t+" is not supported asset");if(!i.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(i=>i.id)).flat().sort((n,i)=>n>i?1:-1);return new Set(e)}getPaths(t,e,n){let i=this.toPoolsMap(n);return this.getProposals(t,e,n).filter(r=>this.validPath(r,i)).map(r=>this.toHops(r,i))}getProposals(t,e,n){let i=this.buildRouteKey(t,e,n);if(this.routeProposals.has(i))return this.routeProposals.get(i);let a=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(i,a),a}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,i)=>n&&i)}validEdge([t,e,n],i){return i.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,i,a])=>{let r=e.get(n);return{poolAddress:n,poolId:r?.id,pool:r?.type,assetIn:i,assetOut:a}})}};import{big as F,RUNTIME_DECIMALS as ht}from"@galacticcouncil/common";import{RUNTIME_DECIMALS as ms}from"@galacticcouncil/common";function Kt(d,t,e,n){let i=Math.pow(10,e+ms-n);return d*t/BigInt(i)}var pe=(e=>(e.Buy="Buy",e.Sell="Sell",e))(pe||{}),de=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(de||{}),We=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(We||{});var{FeeUtils:qn}=x,yt=class extends bt{mlr;constructor(t){super(t),this.mlr=new Map}onFilterChanged(){this.mlr.clear()}buildCtxSync(t,e,n){let i=super.validateInput(t,e,n),a=super.getPaths(t,e,n);if(!a.length)throw new It(t,e);return{paths:a,pools:n,poolsMap:i}}async withCtx(t,e,n){let i=await super.getPools(),a=this.buildCtxSync(t,e,i);return n(a)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,i)=>{let a=n[n.length-1].amountOut,r=i[i.length-1].amountOut;return a>r?-1:1});return e.find(n=>n.every(i=>i.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(a=>a.tradeFeeRange?.[0]??a.tradeFeePct).reduce((a,r)=>a+r),i=t.map(a=>a.tradeFeeRange?.[1]??a.tradeFeePct).reduce((a,r)=>a+r);return[n,i]}}getPoolFeeRange(t){let e=t.min?qn.toPct(t.min):void 0,n=t.max?qn.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];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getSell(t,e,n,i){return this.withCtx(t,e,async({paths:a,poolsMap:r})=>{let s;if(i)s=await this.toSellSwaps(n,i,r);else{let o=a.map(c=>this.toSellSwaps(n,c,r)),l=await Promise.all(o);s=this.findBestSellRoute(l)}return this.buildSell(r,s)})}async getSells(t,e,n){return this.withCtx(t,e,async({paths:i,poolsMap:a})=>{let r=i.map(o=>this.toSellSwaps(n,o,a));return(await Promise.all(r)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildSell(a,o)).sort((o,l)=>o.amountOut>l.amountOut?-1:1)})}buildSell(t,e){let n=e[0],i=e[e.length-1],a=this.isDirectTrade(e),r=this.getSellSpot(e),s=i.amountOut,o=a?i.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-s,c=this.getRouteFeeRange(e),u=a?i.tradeFeePct:I.calculateSellFee(o,s),m=Kt(n.amountIn,r,n.assetInDecimals,i.assetOutDecimals),p=I.calculateDiffToRef(o,m);return{type:"Sell",amountIn:n.amountIn,amountOut:i.amountOut,spotPrice:r,tradeFee:l,tradeFeePct:u,tradeFeeRange:c,priceImpactPct:p,swaps:e,toHuman(){return{type:"Sell",amountIn:F.toDecimal(n.amountIn,n.assetInDecimals),amountOut:F.toDecimal(i.amountOut,i.assetOutDecimals),spotPrice:F.toDecimal(r,ht),tradeFee:F.toDecimal(l,i.assetOutDecimals),tradeFeePct:u,tradeFeeRange:c,priceImpactPct:p,swaps:e.map(g=>g.toHuman())}}}}calculateSpot(t){return t.map(e=>e.spotPrice).reduce((e,n)=>e*n/10n**BigInt(ht))}calculateDelta0Y(t,e,n){let i=[];for(let a=0;a<e.length;a++){let r=e[a],s=n.get(r.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(r.assetIn,r.assetOut),l;a>0?l=i[a-1]:l=t;let c=s.calculateOutGivenIn(o,l);i.push(c)}return i[i.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:i,pools:a,poolsMap:r}=n,l=a.filter(h=>h.tokens.some(b=>b.id===t)).map(h=>h.type==="Aave"?h.tokens:h.tokens.filter(b=>b.id===t)).map(h=>h.map(b=>b.balance).reduce((b,f)=>b+f)).sort((h,b)=>b<h?-1:1)[0],c=I.getFraction(l,.1),u=await Promise.all(i.map(h=>this.toSellSwaps(c,h,r))),p=this.findBestSellRoute(u).map(h=>({poolAddress:h.poolAddress,poolId:h?.poolId,pool:h.pool,assetIn:h.assetIn,assetOut:h.assetOut})),g=this.buildRouteKey(t,e,a);return this.mlr.set(g,p),p}async toSellSwaps(t,e,n){let i=[];for(let a=0;a<e.length;a++){let r=e[a],s=n.get(r.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(r.assetIn,r.assetOut),l;a>0?l=i[a-1].amountOut:l=typeof t=="string"?F.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(o,s),{amountOut:u,calculatedOut:m,feePct:p,errors:g}=s.validateAndSell(o,l,c),h=this.getPoolFeeRange(c),b=s.spotPriceOutGivenIn(o),f=Kt(l,b,o.decimalsIn,o.decimalsOut),y=I.calculateDiffToRef(m,f);i.push({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:u,calculatedOut:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:h,priceImpactPct:y,errors:g,isSupply(){return s.type==="Aave"&&s.tokens[0].id===r.assetIn},isWithdraw(){return s.type==="Aave"&&s.tokens[1].id===r.assetIn},toHuman(){return{...r,amountIn:F.toDecimal(l,o.decimalsIn),amountOut:F.toDecimal(u,o.decimalsOut),calculatedOut:F.toDecimal(m,o.decimalsOut),spotPrice:F.toDecimal(b,ht),tradeFeePct:p,tradeFeeRange:h,priceImpactPct:y,errors:g}}})}return i}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let i=this.buildRouteKey(t,e,n.pools),a=this.mlr.get(i);return a||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:i,poolsMap:a}=n,r=this.buildRouteKey(t,e,i),s=this.mlr.get(r);s||(s=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",s,a);return{amount:this.getSellSpot(o),decimals:ht}}).catch(()=>{})}findBestBuyRoute(t){let e=t.sort((n,i)=>{let a=n[0].amountIn,r=i[0].amountIn;return a>r?1:-1});return e.find(n=>n.every(i=>i.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}getBuySpot(t){let e=t[0];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getBuy(t,e,n,i){return this.withCtx(t,e,async({paths:a,poolsMap:r})=>{let s;if(i)s=await this.toBuySwaps(n,i,r);else{let o=a.map(c=>this.toBuySwaps(n,c,r)),l=await Promise.all(o);s=this.findBestBuyRoute(l)}return this.buildBuy(r,s)})}async getBuys(t,e,n){return this.withCtx(t,e,async({paths:i,poolsMap:a})=>{let r=i.map(o=>this.toBuySwaps(n,o,a));return(await Promise.all(r)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildBuy(a,o)).sort((o,l)=>o.amountIn>l.amountIn?1:-1)})}buildBuy(t,e){let n=e[e.length-1],i=e[0],a=this.isDirectTrade(e),r=this.getBuySpot(e),s=i.amountIn,o=a?i.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=s-o,c=this.getRouteFeeRange(e),u=a?i.tradeFeePct:I.calculateBuyFee(o,s),m=Kt(n.amountOut,r,n.assetOutDecimals,i.assetInDecimals),p;return o===0n?p=-100:p=I.calculateDiffToRef(m,o),{type:"Buy",amountOut:n.amountOut,amountIn:i.amountIn,spotPrice:r,tradeFee:l,tradeFeePct:u,tradeFeeRange:c,priceImpactPct:p,swaps:e,toHuman(){return{type:"Buy",amountOut:F.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:F.toDecimal(i.amountIn,i.assetInDecimals),spotPrice:F.toDecimal(r,ht),tradeFee:F.toDecimal(l,i.assetInDecimals),tradeFeePct:u,tradeFeeRange:c,priceImpactPct:p,swaps:e.map(g=>g.toHuman())}}}}calculateDelta0X(t,e,n){let i=[];for(let a=e.length-1;a>=0;a--){let r=e[a],s=n.get(r.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(r.assetIn,r.assetOut),l;a==e.length-1?l=t:l=i[0];let c=s.calculateInGivenOut(o,l);i.unshift(c)}return i[0]}async toBuySwaps(t,e,n){let i=[];for(let a=e.length-1;a>=0;a--){let r=e[a],s=n.get(r.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(r.assetIn,r.assetOut),l;a==e.length-1?l=typeof t=="string"?F.toBigInt(t,o.decimalsOut):t:l=i[0].amountIn;let c=await this.ctx.getPoolFees(o,s),{amountIn:u,calculatedIn:m,feePct:p,errors:g}=s.validateAndBuy(o,l,c),h=this.getPoolFeeRange(c),b=s.spotPriceInGivenOut(o),f=Kt(l,b,o.decimalsOut,o.decimalsIn),y;m===0n?y=-100:y=I.calculateDiffToRef(f,m),i.unshift({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:u,calculatedIn:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:h,priceImpactPct:y,errors:g,isSupply(){return s.type==="Aave"&&s.tokens[0].id===r.assetIn},isWithdraw(){return s.type==="Aave"&&s.tokens[1].id===r.assetIn},toHuman(){return{...r,amountOut:F.toDecimal(l,o.decimalsOut),amountIn:F.toDecimal(u,o.decimalsIn),calculatedIn:F.toDecimal(m,o.decimalsIn),spotPrice:F.toDecimal(b,ht),tradeFeePct:p,tradeFeeRange:h,priceImpactPct:y,errors:g}}})}return i}};import{big as q}from"@galacticcouncil/common";var Hn=6e3,Ye=1000000000000000n,$t=6,Xe=-5,ze=216e5,Lg=3,Nn=6;import{Enum as Gn}from"polkadot-api";var G=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:i,poolId:a})=>i==="Stableswap"?{pool:Gn("Stableswap",a),asset_in:e,asset_out:n}:{pool:Gn(i),asset_in:e,asset_out:n})}};var ft=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Ye})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,i,a){let[r,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=s,u=l[0],m=l[l.length-1],{assetInDecimals:p}=u,{assetOutDecimals:g}=m,h=Math.abs(c),b=this.getMaximumTradeCount(o,r),f=this.getOptimalTradeCount(h),y=a||f,S=Math.round(i/y),P=o/BigInt(y),T=await this.router.getBestSell(t,e,P),v=o<r,_=[];v&&_.push("OrderTooSmall");let k=T.amountOut*BigInt(y),Y=this.toBlockPeriod(S),z=T.tradeFee*BigInt(y),H=G.build(l),N={assetIn:t,assetOut:e,errors:_,maxTradeCount:b,optTradeCount:f,tradeCount:y,tradeFee:z,tradeImpactPct:T.priceImpactPct,tradePeriod:Y,tradeRoute:H,type:"Dca"};return{...N,amountIn:o,amountOut:k,tradeAmountIn:T.amountIn,tradeAmountOut:T.amountOut,toHuman(){return{...N,amountIn:q.toDecimal(o,p),amountOut:q.toDecimal(k,g),tradeAmountIn:q.toDecimal(T.amountIn,p),tradeAmountOut:q.toDecimal(T.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")}getMaximumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let i=t+n/2n;return Number(i/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[i,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:r,swaps:s,priceImpactPct:o}=a,l=s[0],c=s[s.length-1],{assetInDecimals:u}=l,{assetOutDecimals:m}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),h=r/BigInt(g),b=await this.router.getBestSell(l.assetIn,c.assetOut,h),f=g===1,y=r<i,S=b.priceImpactPct<-5,P=[];y||f?P.push("OrderTooSmall"):S&&P.push("OrderImpactTooBig");let T=b.amountOut*BigInt(g),v=b.tradeFee*BigInt(g),_=G.build(s),k={assetIn:t,assetOut:e,errors:P,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:_,type:"TwapSell"};return{...k,amountIn:r,amountOut:T,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:v,toHuman(){return{...k,amountIn:q.toDecimal(r,u),amountOut:q.toDecimal(T,m),tradeAmountIn:q.toDecimal(b.amountIn,u),tradeAmountOut:q.toDecimal(b.amountOut,m),tradeFee:q.toDecimal(v,m)}}}}async getTwapBuyOrder(t,e,n){let[i,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:r,swaps:s,priceImpactPct:o}=a,l=s[0],c=s[s.length-1],{assetInDecimals:u}=l,{assetOutDecimals:m}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),h=r/BigInt(g),b=await this.router.getBestBuy(l.assetIn,c.assetOut,h),f=b.amountIn*BigInt(g),y=g===1,S=f<i,P=b.priceImpactPct<-5,T=[];S||y?T.push("OrderTooSmall"):P&&T.push("OrderImpactTooBig");let v=b.tradeFee*BigInt(g),_=G.build(s),k={assetIn:t,assetOut:e,errors:T,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:_,type:"TwapBuy"};return{...k,amountIn:f,amountOut:r,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:v,toHuman(){return{...k,amountIn:q.toDecimal(f,u),amountOut:q.toDecimal(r,m),tradeAmountIn:q.toDecimal(b.amountIn,u),tradeAmountOut:q.toDecimal(b.amountOut,m),tradeFee:q.toDecimal(v,u)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let i=216e5/(this.blockTime*6);return Math.round(i)}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={};A($n,{BIG_10:()=>Kn,BIG_BILL:()=>Ke,StakingApi:()=>jt,StakingClient:()=>Qt});import{calculate_accumulated_rps as bs,calculate_percentage_amount as hs,calculate_period_number as Yn,calculate_points as Xn,calculate_rewards as ys,sigmoid as zn}from"@galacticcouncil/math-staking";import V from"big.js";var ge={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},Un=d=>Object.keys(ge).includes(d);import{AccountId as ps}from"polkadot-api";import{toHex as ds}from"@polkadot-api/utils";import{HYDRATION_SS58_PREFIX as gs}from"@galacticcouncil/common";function Wn(d){let t=("modl"+d).padEnd(32,"\0"),e=new TextEncoder().encode(t),n=ds(e);return ps(gs).dec(n)}var be="20000000000000000",he="2000",Kn=V(10),Ke=V(Kn.pow(12)),jt=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getPotBalance(){let t=await this.client.getPalletId(),e=Wn(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 i=e.created_at,a=await n.reduce(async(r,[s,o])=>{let l=await r,c=s,u=o.amount,m=o.conviction.type.toLowerCase(),p=await this.client.getReferendumInfo(c);return p&&(p.type==="Approved"||p.type==="Rejected")&&Un(m)&&l.push({id:c,amount:u,conviction:m}),l},Promise.resolve([]));return{stake:e.stake,rewardPerStake:e.reward_per_stake,createdAt:i,actionPoints:e.action_points,accumulatedUnpaidRewards:e.accumulated_unpaid_rewards,accumulatedSlashPoints:e.accumulated_slash_points,accumulatedLockedRewards:e.accumulated_locked_rewards,votes:a}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,i]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),a=i.find(r=>r)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:a,stakePosition:a?await this.getStakingPosition(a):void 0}}getCurrentActionPoints(t,e,n,i){let a=V(0),r=V(0),s=ge.locked6x,o=V(n.toString()).mul(s),l=100,c=[];t.forEach(p=>{let g=ge[p.conviction],h=i.includes(p.id.toString());h&&c.push(p.id.toString());let b=V(p.amount.toString()).mul(l).div(o);a=a.plus(Math.floor(b.mul(g).toNumber())),r=r.plus(Math.floor(b.mul(h?s:g).toNumber()))});let u=Math.floor(V(n.toString()).mul(s).mul(l).div(o).toNumber());i.forEach(p=>{c.includes(p)||(r=r.plus(u))});let m={democracyVote:1};return a=a.mul(m.democracyVote),a=a.plus(e.toString()||"0"),r=r.mul(m.democracyVote),r=r.plus(e.toString()||"0"),{currentActionPoints:a.toString(),maxActionPoints:r.toString()}}async getRewards(t,e,n){let i=await this.getStake(t),{potReservedBalance:a,accumulatedRewardPerStake:r,totalStake:s,stakePosition:o}=i;if(!o)return;let[l,c,u,m,p,g,h]=await Promise.all([this.getPotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getTimePointsPerPeriod(),this.client.getTimePointsWeight(),this.client.getActionPointsWeight(),this.client.getSixBlockSince()]),b=V(l.transferable.toString()).minus(a.toString()),f=b.gt(0)&&s>0?bs(r.toString(),b.toString(),s.toString()):r.toString(),y=Yn(c.toString(),n,h),S=Yn(c.toString(),o.createdAt.toString(),h),P=ys(f,o.rewardPerStake.toString(),o.stake.toString()),T=this.getCurrentActionPoints(o.votes,o.actionPoints,o.stake,e),v=Xn(S,y,m.toString(),p.toString(),T.currentActionPoints,g.toString(),o.accumulatedSlashPoints.toString()),_=zn(v,be,he),k=(()=>{if(!e.length)return;let Tt=Xn(S,y,m.toString(),p.toString(),T.maxActionPoints.toString(),g.toString(),o.accumulatedSlashPoints.toString());return zn(Tt,be,he)})(),Y=V(P).plus(o.accumulatedUnpaidRewards.toString()).plus(o.accumulatedLockedRewards.toString());if(V(y).minus(S).lte(u.toString()))return{rewards:"0",payablePercentage:_,extraPayablePercentage:k,constants:{a:be,b:he}};let z=hs(Y.toString(),_),H=V(o.accumulatedLockedRewards.toString()),N=H.gt(z)?H:V(z);return{rewards:N.div(Ke).toString(),maxRewards:Y.div(Ke).toString(),allocatedRewardsPercentage:N.div(Y).mul(100).toNumber(),points:v,payablePercentage:_,extraPayablePercentage:k,constants:{a:be,b:he}}}};var Qt=class extends C{async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:r})=>{let[s,o,l]=r;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 Jn={};A(Jn,{TxBuilderFactory:()=>St});import{Enum as Qn}from"polkadot-api";function jn(d){let t=[],e=d;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var Pt=class extends C{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new X(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:ve})}async dryRun(t,e){let n=Qn("Signed",t),i=Qn("system",n),r=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(i,e.decodedCall),s=r.success&&!r.value.execution_result.success?r.value.execution_result.value.error:null;if(s){let o=jn(s.value);throw new Error("Dry run execution error!",{cause:o})}return r}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var ye=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:i}=e[0],a=await this.balanceClient.getBalance(this.beneficiary,i);return t>=a.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,i=n[0],a=n[n.length-1],r=I.getFraction(t,this.slippagePct),s=i.assetIn,o=a.assetOut,l=t+r,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:G.build(n)}),await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=await this.dispatchWithExtraGas(c)),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,i=n[0],a=n[n.length-1],r=I.getFraction(e,this.slippagePct),s=i.assetIn,o=a.assetOut,l=e-r,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:G.build(n)}),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],i=e[e.length-1],a=I.getFraction(t,this.slippagePct),r=n.assetIn,s=i.assetOut,o=t-a,l=this.api.tx.Router.sell_all({asset_in:r,asset_out:s,min_amount_out:o,route:G.build(e)});return await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as $e}from"polkadot-api";var fe=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:i,tradePeriod:a,tradeRoute:r}=this.order,s=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:$e("Sell",{asset_in:e,asset_out:n,amount_in:i,min_amount_out:0n,route:r})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",s)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:i,tradeAmountOut:a,tradePeriod:r,tradeRoute:s}=this.order,o=I.getFraction(a,this.slippagePct),l=a-o,c=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:$e("Sell",{asset_in:e,asset_out:n,amount_in:i,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:i,tradeAmountOut:a,tradePeriod:r,tradeRoute:s}=this.order,o=I.getFraction(i,this.slippagePct),l=i+o,c=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:$e("Buy",{asset_in:e,asset_out:n,amount_out:a,max_amount_in:l,route:s})},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 ye(this.client,this.evmClient).setTrade(t)}order(t){return new fe(this.client,this.evmClient).setOrder(t)}};async function gh(d){let t=new st(d),e=new Ot(d),[n,i]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),a=new gt(d,e).withAave().withOmnipool().withStableswap().withXyk(),r=new X(d),s=new Qt(d),o=new Ft(d),l=new Z(e),c=new yt(a),u=new ft(c,{blockTime:n,minBudgetInNative:i}),m=new jt(s,r),p=new Rt(o,r,{blockTime:n});return{api:{aave:l,router:c,scheduler:u,staking:m,farm:p},client:{asset:new nt(d),balance:r,evm:e},ctx:{pool:a},tx:new St(d,e),destroy:()=>{a.destroy()}}}export{oe as QueryBus,en as aave,Ze as api,rn as client,nn as const,gh as createSdkContext,sn as error,un as evm,yn as farm,x as fmt,Bt as json,I as math,Ln as pool,Vn as sor,$n as staking,Jn as tx};
|
|
1
|
+
var Sr=Object.defineProperty;var I=(p,t)=>{for(var e in t)Sr(p,e,{get:t[e],enumerable:!0})};import Tr from"buffer";typeof window<"u"&&(window.Buffer=Tr.Buffer);var hn={};I(hn,{ChainWatcher:()=>wt,Papi:()=>F,getWs:()=>Nr});import{hydration as Dr}from"@galacticcouncil/descriptors";import{log as Cr}from"@galacticcouncil/common";import{shareReplay as kr,tap as Er}from"rxjs";import{defer as vr,from as xr,timer as wr,of as Ir}from"rxjs";import{catchError as Ar,distinctUntilChanged as Or,map as Br,shareReplay as _r,switchMap as Rr,timeout as Fr}from"rxjs/operators";function gn(p,{intervalMs:t=5e3,rpcTimeoutMs:e=1500}={}){return wr(0,t).pipe(Rr(()=>vr(()=>xr(p._request("system_health",[]))).pipe(Fr({first:e}),Br(()=>"online"),Ar(()=>Ir("offline")))),Or(),_r({bufferSize:1,refCount:!0}))}var{logger:Mr}=Cr,wt=class p{static instance=null;bestBlock$;finalizedBlock$;connection$;constructor(t){this.bestBlock$=this.watched("watcher(bestBlock)",t.getUnsafeApi().query.System.Number.watchValue("best")),this.finalizedBlock$=this.watched("watcher(finalizedBlock)",t.finalizedBlock$),this.connection$=this.watched("watcher(connection)",gn(t))}static getInstance(t){return this.instance||(this.instance=new p(t)),this.instance}watched(t,e){return e.pipe(Er({error:n=>Mr.error(t,n)}),kr({bufferSize:1,refCount:!0}))}};var F=class{client;api;watcher;constructor(t){this.client=t,this.api=this.client.getTypedApi(Dr),this.watcher=wt.getInstance(this.client)}};import{withLogsRecorder as Lr}from"polkadot-api/logs-provider";import{withLegacy as qr}from"@polkadot-api/legacy-provider";import{getWsProvider as Hr}from"polkadot-api/ws-provider";var Nr=(p,t={})=>{let e=typeof p=="string"?p.split(","):p,n=Hr(e,{innerEnhancer:qr(),...t});return Lr(r=>console.log(r),n),n};var yn={};I(yn,{AAVE_GAS_LIMIT:()=>ke,AAVE_LENDING_POOL_ADDRESS:()=>le,AAVE_POOL_ABI:()=>Fe,AAVE_POOL_DATA_PROVIDER:()=>oe,AAVE_POOL_DATA_PROVIDER_ABI:()=>se,AAVE_POOL_PROXY:()=>Ce,AAVE_ROUNDING_THRESHOLD:()=>Ro,AAVE_UINT_256_MAX:()=>Gr,AaveClient:()=>It,AaveUtils:()=>tt});var Fe=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{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 se=[{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",oe="0x112b087b60C1a166130d59266363C45F8aa99db0",le="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",ke=1000000n,Ro=5,Gr=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var It=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:se,address:oe,args:[le],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:se,address:oe,args:[le,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:Fe,address:Ce,args:[t],functionName:"getUserAccountData"})}};import C from"big.js";import{big as Z,erc20 as Vr,h160 as Ur}from"@galacticcouncil/common";var{ERC20:nt}=Vr,{H160:Ee}=Ur,Wr=1.01,Yr=31536000n,bn=4,ce=-1,ue=10n**27n,tt=class{client;constructor(t){this.client=new It(t)}async getSummary(t){let e=Ee.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,u,d,m,h,b]=i,g=Z.toDecimal(b,18),f=[];for(let y of o){let S=y.underlyingAsset.toLowerCase(),P=s.find(({underlyingAsset:Re})=>Re.toLowerCase()===S);if(!P)throw new Error("Missing pool reserve for "+S);let T=y.scaledATokenBalance,v=P.liquidityIndex,B=P.liquidityRate,E=P.availableLiquidity,$=P.priceInMarketReferenceCurrency,z=a+6,N=this.calculateLinearInterest(B,P.lastUpdateTimestamp,z),G=v*N/ue,xt=T*G/ue,re=Number(l!==0&&l===P.eModeCategoryId?P.eModeLiquidationThreshold:P.reserveLiquidationThreshold)/1e4,ie=P.usageAsCollateralEnabled&&y.usageAsCollateralEnabledOnUser&&y.scaledATokenBalance>0n,ae=nt.toAssetId(S);f.push({aTokenBalance:xt,availableLiquidity:E,decimals:Number(P.decimals),isCollateral:ie,priceInRef:$,reserveId:ae,reserveAsset:S,reserveLiquidationThreshold:re})}return{healthFactor:Number(g),currentLiquidationThreshold:Number(Z.toDecimal(m,bn)),totalCollateral:c,totalDebt:u,reserves:f}}async hasBorrowPositions(t){let e=Ee.fromAny(t),n=await this.client.getUserAccountData(e),[r,i]=n;return i>0n}async getHealthFactor(t){let e=Ee.fromAny(t),n=await this.client.getUserAccountData(e),[r,i,a,s,o,l]=n;return this.calculateHealthFactorFromBalances(i,r,s)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:r,totalDebt:i,reserves:a,currentLiquidationThreshold:s}=await this.getSummary(t);if(i===0n)return ce;let o=nt.fromAssetId(e),l=a.find(S=>S.reserveAsset===o);if(!l)throw new Error("Missing reserve ctx for "+o);let{decimals:c,isCollateral:u,priceInRef:d,reserveLiquidationThreshold:m}=l,h=Z.toBigInt(n,c),b=u?h*d/10n**BigInt(c):0n,g=r-b;if(g<=0n)return 0;let f=C(r.toString()).mul(s).minus(C(b.toString()).mul(m)).div(g.toString()),y=C(g.toString()).mul(f).div(i.toString()).toFixed(6,C.roundDown);return Number(y)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:i,reserves:a,currentLiquidationThreshold:s}=await this.getSummary(t);if(i===0n)return ce;let o=nt.fromAssetId(e),l=a.find(y=>y.reserveAsset===o);if(!l)throw new Error("Missing reserve ctx for "+o);let{decimals:c,priceInRef:u,reserveLiquidationThreshold:d}=l,h=Z.toBigInt(n,c)*u/10n**BigInt(c),b=r+h;if(b<=0n)return 0;let g=C(r.toString()).mul(s).plus(C(h.toString()).mul(d)).div(b.toString()),f=C(b.toString()).mul(g).div(i.toString()).toFixed(6,C.roundDown);return Number(f)}async getHealthFactorAfterSwap(t,e,n,r,i){let{totalDebt:a,reserves:s,healthFactor:o}=await this.getSummary(t);if(a===0n)return ce;let l=nt.fromAssetId(n),c=nt.fromAssetId(i),u=s.find(v=>v.reserveAsset===l),d=s.find(v=>v.reserveAsset===c);if(!u)throw new Error(`Missing reserve ctx for ${l}`);if(!d)throw new Error(`Missing reserve ctx for ${d}`);let m=Z.toBigInt(e,u.decimals),h=Z.toBigInt(r,d.decimals),b=m*u.priceInRef/10n**BigInt(u.decimals),g=h*d.priceInRef/10n**BigInt(d.decimals),f=u.isCollateral?C(b.toString()).mul(u.reserveLiquidationThreshold):C(0),P=C(g.toString()).mul(d.reserveLiquidationThreshold).minus(f).div(a.toString()),T=C(o).plus(P).toFixed(6,C.roundDown);return Number(T)}async getMaxWithdraw(t,e){let{totalDebt:n,reserves:r,healthFactor:i}=await this.getSummary(t),a=nt.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-Wr;if(d>0){let m=C(d).mul(e.toString()).div(o).toFixed(0,C.roundDown),h=C(m).div(s.toString()).mul(10**a).toFixed(0,C.roundDown);c=r<BigInt(h)?r:BigInt(h)}else c=0n}return{amount:c<i?c:i,decimals:a}}calculateLinearInterest(t,e,n){let r=n-e;if(r<=0)return ue;let i=t*BigInt(r)/Yr;return ue+i}calculateHealthFactorFromBalances(t,e,n){if(t===0n)return ce;let r=e*n/t,i=Z.toDecimal(r,bn);return Number(i)}};var Sn={};I(Sn,{AssetClient:()=>rt,BalanceClient:()=>X,ChainParams:()=>lt});var rt=class extends F{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(t){super(t)}async queryShares(){let e=await this.api.query.Stableswap.Pools.getEntries();return new Map(e.map(({keyArgs:n,value: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:u}=await this.mapToken(i,e,n),d=Number(a),m=new Intl.DateTimeFormat("en-GB"),h=[c,"Bond",m.format(d)].join(" ");return{id:t,name:h,symbol:c+"b",decimals:u,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,u=await Promise.all(i.map(async h=>{let{symbol:b}=await this.mapToken(h,e,n);return[h,b]})),d=Object.fromEntries(u),m=Object.values(d);return{id:t,name:m.join(", "),symbol:s?.asText()||a?.asText(),decimals:18,icon:m.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 u=r.get(l),{asset_type:d}=c,m;switch(d.type){case"Bond":let h=a.get(l);m=await this.mapBond(l,c,s,h);break;case"StableSwap":let b=i.get(l);m=await this.mapShares(l,c,s,b);break;case"External":m=await this.mapExternal(l,c,e,u);break;default:m=await this.mapToken(l,c,s,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{log as zr}from"@galacticcouncil/common";import{Subject as Kr,combineLatest as jr,debounceTime as Qr,distinctUntilChanged as Pn,retry as Jr,shareReplay as Zr}from"rxjs";import{bufferCount as ti,finalize as ei,map as st,pairwise as ni,startWith as ri,tap as Ot}from"rxjs/operators";var fn={};I(fn,{HUB_ASSET_ID:()=>At,HYDRATION_OMNIPOOL_ADDRESS:()=>Xr,HYDRATION_PARACHAIN_ID:()=>$r,PERBILL_DENOMINATOR:()=>Me,PERMILL_DENOMINATOR:()=>it,SYSTEM_ASSET_DECIMALS:()=>De,SYSTEM_ASSET_ID:()=>O,TRADEABLE_DEFAULT:()=>at});var it=1e6,Me=1e9,O=0,De=12,$r=2034,Xr="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",At=1,at=15;var{logger:ot}=zr,X=class extends F{constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getTokenBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:n}=await e.getValue(t,{at:"best"});return this.calculateBalance(n)}async getTokenBalance(t,e){let r=await this.api.query.Tokens.Accounts.getValue(t,e,{at:"best"});return this.calculateBalance(r)}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 jr([e,n,r]).pipe(Ot({error:i=>ot.error("balance",i)}),Jr({delay:1e3}),Qr(250),st(i=>i.flat()),ri([]),ti(2,1),st(([i,a],s)=>s===0?a:this.getDeltas(i,a)))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe(Ot({error:n=>ot.error("balance(system)",n)}),st(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(Ot({error:r=>ot.error("balance(token)",r)}),st(r=>({id:e,balance:this.calculateBalance(r)})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(Ot({error:n=>ot.error("balance(tokens)",n)}),Pn((n,r)=>!r.deltas),st(({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 Kr,r=n.pipe(Zr(1)),i=async()=>(await this.api.query.AssetRegistry.Assets.getEntries({at:"best"})).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 m=>{let h=await this.getTokenBalanceData(t,m);return[m,h]}))).map(([m,h])=>({id:m,balance:h}));n.next(d)};await l();let c=this.watcher.bestBlock$.subscribe({error:u=>ot.error("balance(erc20) watcher.bestBlock",u),next:l});return()=>c.unsubscribe()},s;return a().then(o=>s=o),r.pipe(Ot({error:o=>ot.error("balance(erc20)",o)}),ei(()=>s?.()),ni(),st(([o,l],c)=>c===0?l.filter(u=>u.balance.transferable>0n):this.getDeltas(o,l)),Pn((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t,{at:"best"});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=(i,a)=>i!==void 0&&a!==void 0&&i.transferable===a.transferable&&i.total===a.total,r=t.reduce((i,a)=>(i.set(a.id,a.balance),i),new Map);return e.filter(i=>!n(i.balance,r.get(i.id)))}};var lt=class extends F{_minOrderBudget;_blockTime;constructor(t){super(t)}async getBlockTime(){if(this._blockTime===void 0){let t=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(t)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};var Tn={};I(Tn,{AssetNotFound:()=>Le,PoolNotFound:()=>Bt,RouteNotFound:()=>_t});var Le=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},Bt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},_t=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var In={};I(In,{EvmClient:()=>Ft,EvmRpcAdapter:()=>Rt,createChain:()=>qe});import{Binary as ii,CompatibilityLevel as ai,FixedSizeBinary as vn}from"polkadot-api";import{hydration as si}from"@galacticcouncil/descriptors";import{encodeFunctionData as oi,decodeFunctionResult as li}from"viem";var ci=10000000n,Rt=class{api;constructor(t){this.api=t.getTypedApi(si)}async getBlock(){let t=await this.api.query.Ethereum.CurrentBlock.getValue({at:"best"}),{header:e}=t,n=e.timestamp/1000n,[r]=e.number;return{timestamp:n,number:r}}readContract=(async t=>{let{abi:e,address:n,functionName:r,args:i}=t,a=oi({abi:e,functionName:r,args:i}),s=this.api.apis.EthereumRuntimeRPCApi.call,o=await this.api.compatibilityToken,l=s.isCompatible(ai.BackwardsCompatible,o);console.log(l);let c=await this.api.apis.EthereumRuntimeRPCApi.call(vn.fromText(""),vn.fromHex(n),ii.fromHex(a),[0n,0n,0n,0n],[ci,0n,0n,0n],void 0,void 0,void 0,!1,[]);if(console.log(c),!c.success)throw console.error(r,c.value.type),new Error("Contract read failure");let{exit_reason:u,value:d,used_gas:m}=c.value;if(console.log(m),u.type==="Succeed")return li({abi:e,functionName:r,data:d.asHex()});throw console.log(r,u.type,u.value.type),new Error("Contract read error")})};import{defineChain as ui}from"viem";var mi=["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"],qe=()=>ui({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:mi}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});import{createPublicClient as xn,createWalletClient as pi,custom as wn,http as di}from"viem";var Ft=class{client;chain;constructor(t){this.client=t,this.chain=qe()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return xn({chain:this.chain,transport:di()})}getWsProvider(){return xn({transport:wn({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return pi({account:t,chain:this.chain,transport:wn(window.ethereum)})}getRPCAdapter(){return new Rt(this.client)}};var kn={};I(kn,{LiquidityMiningApi:()=>Et,LiquidityMiningClient:()=>Mt});import{AccountId as Ci}from"polkadot-api";import L from"big.js";import{HYDRATION_SS58_PREFIX as ki,RUNTIME_DECIMALS as kt}from"@galacticcouncil/common";import{fixed_from_rational as Cn}from"@galacticcouncil/math-liquidity-mining";var me={};I(me,{withTimeout:()=>gi});function gi(p,t,e="timeout"){return new Promise((n,r)=>{let i=setTimeout(()=>r(new Error(e)),t);p.then(a=>{clearTimeout(i),n(a)},a=>{clearTimeout(i),r(a)})})}var k={};I(k,{getFraction:()=>yi,mulScaled:()=>An,mulSpot:()=>bi});import{RUNTIME_DECIMALS as hi}from"@galacticcouncil/common";function An(p,t,e,n,r){let i=e+n-r,a=p*t;return i>0?a/BigInt(10)**BigInt(i):i<0?a*BigInt(10)**BigInt(-i):a}function bi(p,t,e,n){return An(p,t,e,hi,n)}function yi(p,t,e=2){if(t<.01||t>100)throw new Error("Supported range is from 0.01% - 100%");let n=BigInt(10)**BigInt(e),r=BigInt(Math.round(t*Number(n)));return p*r/(BigInt(100)*n)}var x={};I(x,{FeeUtils:()=>He,shiftNeg:()=>Pi});import fi from"big.js";var He=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 r=10**n;return Math.round(t*r/e)/r}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Pi(p,t){let e=fi(typeof p=="bigint"?p.toString():p);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Ct={};I(Ct,{findNestedKey:()=>Si,findNestedObj:()=>Ti,jsonFormatter:()=>vi});var Si=(p,t)=>{let e=[];return JSON.stringify(p,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},Ti=(p,t,e)=>{let n;return JSON.stringify(p,(r,i)=>(i&&i[t]===e&&(n=i),i)),n},vi=(p,t)=>typeof t=="bigint"?t.toString():t;var D={};I(D,{calculateBuyFee:()=>Ai,calculateDiffToAvg:()=>xi,calculateDiffToRef:()=>wi,calculateSellFee:()=>Ii});import K from"big.js";function xi(p,t){let e=K(p.toString()),n=K(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function wi(p,t){if(t===0n)return 0;let e=K(p.toString()),n=K(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Ii(p,t){if(p===0n)return 0;let e=K(p.toString()),n=K(t.toString());return K(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Ai(p,t){if(p===0n)return 0;let e=K(p.toString());return K(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}import{TLRUCache as On}from"@thi.ng/cache";var pe=class{debug;constructor(t){this.debug=t||!1}log(t,e,n){this.debug&&console.log(t,e,n)}scope(t,e,n,r){let i=new Map,a=r!==void 0?new On(null,{ttl:r}):new On;return{get:(...c)=>{let u=n(...c);if(i.has(u)){this.log("[live]",t,u);let m=i.get(u);return Promise.resolve(m)}if(a.has(u))return this.log("[memo]",t,u),a.get(u);this.log("[fetch]",t,u);let d=e(...c).catch(m=>{throw a.delete(u),m});return a.set(u,d),d},set:(c,...u)=>{let d=n(...u);this.log("[set-live]",t,d),i.set(d,c)},clear:()=>{this.log("[clear]",t),i.clear(),a.release()}}}};var de=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 et from"big.js";import{calculate_accumulated_rps as Oi,calculate_global_farm_rewards as Bi,calculate_loyalty_multiplier as _i,calculate_user_reward as Fn,calculate_yield_farm_delta_rpvs as Ri}from"@galacticcouncil/math-liquidity-mining";import Bn from"big.js";var Ne=Bn(10).pow(18),_n=BigInt(Bn(1).pow(18).toString()),Rn=6e3;var Fi="1000000000000000000",ge=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=et(s.toString()),c=et(o.toString()).minus(l.lt(o.toString())?s.toString():o.toString()),u=et(Bi(t.total_shares_z.toString(),n.toString(),et(t.yield_per_period.toString()).mul(Ne).round(0,et.roundDown).toFixed(),t.max_reward_per_period.toString(),i.toFixed()));if(c.lt(u)&&(u=c),u.eq(0))return t;let d=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,a,d,BigInt(u.toFixed())),{...t,accumulated_rpz:BigInt(Oi(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 r=Ri(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=et(1).mul(Ne).round(0,et.roundDown).toString();if(!e)return n;let{initial_reward_percentage:r,scale_coef:i}=e;return _i(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,u=this.getLoyaltyMultiplier(c,o.loyalty_curve),d=BigInt(Fn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),u)),m=BigInt(Fn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),Fi));return{reward:d,maxReward:m,assetId:s.reward_currency,yieldFarmId:o.id,isActiveFarm:o.state.type==="Active"}}};var Ei=L(365.2425).times(24).times(60).times(60),Et=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((i,a)=>i-a);if(t===e)return _n;let r=await this.client.getOraclePrice(n);if(r){let{n:i,d:a}=r[0].price,s;return t<e?s=Cn(i.toString(),a.toString()):s=Cn(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 Ci(ki).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let i=L(r).times(t.toString()).times(e.toString()).div(Math.pow(10,kt));return i.gte(n.toString())?n.toString():i.toString()}getPoolYieldPerPeriod(t,e,n,r){let i=L(t.toString()).times(e),a=L(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:u,yield_per_period:d,total_shares_z:m,max_reward_per_period:h,pending_rewards:b,accumulated_paid_rewards:g,planned_yielding_periods:f,updated_at:y,incentivized_asset:S,reward_currency:P,price_adjustment:T,min_deposit:v}=i,B=x.shiftNeg(a??T,kt),E=x.shiftNeg(l,kt),$=x.shiftNeg(c?.initial_reward_percentage??0,kt),z=Ei.div(L(this.blockTime).div(1e3).times(u)).toString(),N;if(m<=0)N=L(E).times(d.toString()).times(z).toString();else{let fr=this.getGlobalRewardPerPeriod(m,d,h,B),Pr=this.getPoolYieldPerPeriod(fr,E,m,B);N=L(Pr).times(z).toString()}let G=b+g,xt=h*BigInt(f),ne=s.transferable+G,pn=ne-G,re=L(pn.toString()).div(h.toString()),ie=L(e).div(u.toString()).toString(),ae=(m>=0?re.plus(y):re.plus(ie)).toString(),Re=L(ae).times(u).toString(),br=L(m.toString()).div(L(h.toString()).div(d.toString())).div(Math.pow(10,kt)).times(100).times(B).toFixed(2),dn=L(G.toString()).div(ne.toString()).gte(.999);N=dn?"0":L(N).div(n?2:1).times(100).toString();let yr=$?L(N).times($).toString():void 0;return{apr:N,minApr:yr,isDistributed:dn,estimatedEndPeriod:ae,estimatedEndBlock:Re,maxRewards:xt,incentivizedAsset:S,rewardCurrency:P,loyaltyCurve:c,currentPeriod:ie,potMaxRewards:ne,fullness:br,yieldFarmId:r.id,globalFarmId:i.id,poolId:o,distributedRewards:G,plannedYieldingPeriods:f,minDeposit:v,blocksPerPeriod:u}}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 u=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(s),h=await this.getOraclePrice(u,d),b=await this.balanceClient.getBalance(m,u);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:h,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 u=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(s,!0),h=await this.getOraclePrice(u,d),b=await this.balanceClient.getBalance(m,u);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:h,balance:b,farmAddress:m}}));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,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),h=new de(u,d),g=await new ge(y=>this.getFarmAddress(y),y=>this.client.getAsset(y),h).claimRewards(o,s,e,r,m??o.price_adjustment);if(!g)return;let f=await this.client.getAsset(g.assetId);if(f&&!(g.reward<=f.existential_deposit))return g}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 Mi,Enum as Di}from"polkadot-api";var Mt=class extends F{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(Mi.fromText("omnipool"),t,Di("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 tr={};I(tr,{PoolContextProvider:()=>bt,PoolError:()=>Q,PoolFactory:()=>gt,PoolType:()=>A,aave:()=>Je,hsm:()=>rn,lbp:()=>We,omni:()=>Xe,stable:()=>Ke,xyk:()=>je});var We={};I(We,{LbpMath:()=>W,LbpPool:()=>Dt,LbpPoolClient:()=>Lt});import{calculate_in_given_out as Li,calculate_out_given_in as qi,calculate_linear_weights as Hi,calculate_pool_trade_fee as Ni,get_spot_price as Gi}from"@galacticcouncil/math-lbp";var W=class{static getSpotPrice(t,e,n,r,i){return Gi(t,e,n,r,i)}static calculateInGivenOut(t,e,n,r,i){return Li(t,e,n,r,i)}static calculateOutGivenIn(t,e,n,r,i){return qi(t,e,n,r,i)}static calculateLinearWeights(t,e,n,r,i){return Hi(t,e,n,r,i)}static calculatePoolTradeFee(t,e,n){return Ni(t,e,n)}};import{big as En,RUNTIME_DECIMALS as Mn}from"@galacticcouncil/common";var A=(a=>(a.Aave="Aave",a.LBP="LBP",a.Omni="Omnipool",a.Stable="Stableswap",a.XYK="XYK",a.HSM="HSM",a))(A||{}),Q=(c=>(c.UnknownError="UnknownError",c.FacilitatorCapacityExceeded="FacilitatorCapacityExceeded",c.InsufficientTradingAmount="InsufficientTradingAmount",c.InsufficientCollateral="InsufficientCollateral",c.MaxHoldingExceeded="MaxHoldingExceeded",c.MaxInRatioExceeded="MaxInRatioExceeded",c.MaxOutRatioExceeded="MaxOutRatioExceeded",c.TradeNotAllowed="TradeNotAllowed",c.MaxBuyBackExceeded="MaxBuyBackExceeded",c.MaxBuyPriceExceeded="MaxBuyPriceExceeded",c))(Q||{});var{FeeUtils:Dn}=x,Dt=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new p(t)}constructor(t){this.type="LBP",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.fee=t.fee,this.repayFeeApply=t.repayFeeApply}validatePair(t,e){return!0}parsePair(t,e){let 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=Dn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+s,c=this.calculateInGivenOut(t,l),u=t.balanceIn/this.maxInRatio;return c>u&&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=Dn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=s-o,u=t.balanceOut/this.maxOutRatio;return c>u&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:c,feePct:l,errors:i}}}calculateInGivenOut(t,e){let n=W.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=W.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=W.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),En.toBigInt(1,Mn).toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=W.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),En.toBigInt(1,Mn).toString());return BigInt(e)}calculateTradeFee(t,e){let n=W.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 aa}from"polkadot-api";import{Subscription as sa,distinctUntilChanged as oa,filter as la}from"rxjs";import{memoize1 as Yi}from"@thi.ng/memoize";import{TLRUCache as $i}from"@thi.ng/cache";import{ReplaySubject as Ln,Subscription as qn,combineLatest as Xi,defer as zi,from as Ki,merge as Ge,of as ji,EMPTY as fe}from"rxjs";import{bufferCount as Qi,bufferTime as Ji,catchError as Pe,filter as Se,finalize as Ve,map as ct,pairwise as Ue,repeat as Hn,skip as Zi,share as ta,startWith as ea,switchMap as Nn,tap as ut,throttleTime as na}from"rxjs/operators";import{BehaviorSubject as Vi}from"rxjs";var he=class{store$=new Vi([]);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((s,o)=>[s.address,o])),r=await t(e),i=e.slice(),a=new Set;for(let s of r){let o=n.get(s.address);o===void 0?(n.set(s.address,i.length),i.push(s)):i[o]=s,a.add(s.address)}this.changeset=a,this.store$.next(i)}).catch(console.error)}destroy(){this.store$.complete()}};import{log as Ui}from"@galacticcouncil/common";var Wi={Aave:"AAVE",LBP:"LBP",Omnipool:"OMNI",Stableswap:"STBL",XYK:"XYK",HSM:"HSM"},{logger:be}=Ui,ye=class{type;constructor(t){this.type=t}prefix(){return this.pad(`pool(${Wi[this.type]})`,10)}trace(t,...e){be.trace(`${this.prefix()} ${t} :`,...e)}debug(t,...e){be.debug(`${this.prefix()} ${t} :`,...e)}info(t,...e){be.info(`${this.prefix()} ${t} :`,...e)}error(t,...e){be.error(`${this.prefix()} ${t} :`,...e)}pad(t,e){return t.length>=e?t:t+" ".repeat(e-t.length)}};var{withTimeout:ra}=me,ia=3e3,q=class extends X{evm;store=new he;log;shared$;resync$=new Ln(1);resyncAt=0;resyncPending=!1;mem=0;memPoolsCache=new $i(null,{ttl:6*1e3});memPools=Yi(t=>(this.log.info("pool_sync",{mem:t}),this.loadPools()),this.memPoolsCache);constructor(t,e){super(t),this.evm=e,this.log=new ye(this.getPoolType())}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(ea([]),Qi(2,1),ct(([t,e])=>t.length===0?e:this.store.applyChangeset(e)),Se(t=>t.length>0),na(1e3,void 0,{leading:!0,trailing:!0}))}subscribeStore(){return zi(()=>{let t=new qn;return t.add(this.startWatchdog()),this.resync$.next(),this.resync$.pipe(Nn(()=>{let e=new qn;return Ki(ra(this.getMemPools(),3e4,"getMemPools stalled")).pipe(ut(()=>this.log.info("pool_synced",{mem:this.mem})),ct(r=>r.filter(i=>this.hasValidAssets(i))),ut(r=>this.store.set(r)),Pe(()=>(this.log.error("pool_seed_error",{mem:this.mem}),this.requestResync(!0),fe))).pipe(ut(()=>{e.add(this.subscribeBalances()),e.add(this.subscribeUpdates())}),Nn(r=>Ge(ji(r),this.store.asObservable().pipe(Zi(1)))),Ve(()=>{e.unsubscribe()}))}),Ve(()=>t.unsubscribe()),ta({connector:()=>new Ln(1),resetOnRefCountZero:!0}))})}subscribeBalances(){let t=this.store.pools.map(e=>{let{address:n}=e,r=[this.subscribeTokensBalance(n)];if(this.hasSystemAsset(e)){let i=this.subscribeSystemBalance(n);r.push(i)}if(this.hasErc20Asset(e)){let i=e.tokens.filter(s=>s.type==="Erc20").map(s=>s.id),a=this.subscribeErc20Balance(n,i);r.push(a)}return Xi(r).pipe(ct(i=>i.flat()),Ue(),ct(([i,a])=>this.getDeltas(i,a)),Se(i=>i.length>0),ct(i=>[n,i]))});return Ge(...t).pipe(Ji(250),Se(e=>e.length>0),ct(e=>new Map(e)),this.watchGuard("balances")).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=[],r=new Map(t.map(i=>[i.address,i]));for(let[i,a]of e){let s=r.get(i);if(s){let o=s.tokens.map(l=>{let c=a.find(u=>u.id===l.id);return c&&l.id!==s.id?{...l,balance:c.balance.transferable}:l});n.push({...s,tokens:o})}}return n};resync(t=!1){let e=Date.now();!t&&e-this.resyncAt<ia||(this.resyncAt=e,this.mem++,this.resync$.next())}requestResync(t=!1){this.resyncPending||(this.resyncPending=!0,setTimeout(()=>{this.resyncPending=!1,this.resync(t)},0))}startWatchdog(){let n=this.watcher.connection$.pipe(Ue(),Se(([i,a])=>i==="offline"&&a==="online"),ut(()=>{this.log.debug("watchdog_recover_online",{mem:this.mem}),this.requestResync()}),Pe(i=>(this.log.error("watchdog_recovery_error",i),fe)),Hn({delay:1e3})),r=this.watcher.finalizedBlock$.pipe(Ue(),ut(([i,a])=>{let s=Number(i.number),o=Number(a.number),l=o-s;l>=3&&(this.log.debug("watchdog_gap",{from:s,to:o,gap:l}),this.requestResync())}),Pe(i=>(this.log.error("watchdog_gap_error",i),fe)),Hn({delay:1e3}));return Ge(n,r).subscribe()}watchGuard(t){return e=>e.pipe(ut({error:n=>{this.log.error(t,n),this.requestResync(!0)}}),Ve(()=>{this.log.debug(t,"unsub")}),Pe(()=>fe))}};var Lt=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:r,initial_weight:i,final_weight:a}=t,s=W.calculateLinearWeights(n?n.toString():"0",r?r.toString():"0",i.toString(),a.toString(),e.toString()),o=BigInt(s),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(aa.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries({at:"best"}),this.api.query.ParachainSystem.ValidationData.getValue({at:"best"}),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{assets:r,repay_target:i,fee_collector:a}=e,[s,o]=this.getPoolWeights(e,n),[l,c]=r,[u,d,m,h,b]=await Promise.all([this.isRepayFeeApplied(l,i,a.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:s,type:m?.asset_type.type},{id:c,decimals:b?.decimals,existentialDeposit:b?.existential_deposit,balance:h.transferable,weight:o,type:b?.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 getPoolFees(t,e){let n=this.store.pools.find(i=>i.address===e);return{repayFee:await this.getRepayFee(),exchangeFee:n.fee}}subscribeValidationData(){return this.api.query.ParachainSystem.ValidationData.watchValue("best").pipe(la(t=>t!==void 0),oa((t,e)=>t.relay_parent_number===e.relay_parent_number),this.watchGuard("parachainSystem.ValidationData")).subscribe(({relay_parent_number:t})=>{this.store.update(async e=>{let n=[];for(let r of e){let i=this.poolsData.get(r.address);if(i){let{assets:a,repay_target:s,fee_collector:o}=i,[l]=a,[c,u]=this.getPoolWeights(i,t),[d,m]=r.tokens,h=[{...d,weight:c},{...m,weight:u}],b=await this.isRepayFeeApplied(l,s,o.toString());n.push({...r,tokens:h,repayFeeApply:b})}}return n})})}subscribeUpdates(){let t=new sa;return t.add(this.subscribeValidationData()),t}};var Xe={};I(Xe,{OmniMath:()=>w,OmniPool:()=>qt,OmniPoolClient:()=>Nt});import{calculate_in_given_out as ca,calculate_lrna_in_given_out as ua,calculate_out_given_in as ma,calculate_out_given_lrna_in as pa,calculate_spot_price as da,calculate_lrna_spot_price as ga,calculate_shares as ha,calculate_liquidity_out as ba,calculate_liquidity_lrna_out as ya,verify_asset_cap as fa,calculate_liquidity_hub_in as Pa,is_sell_allowed as Sa,is_buy_allowed as Ta,is_add_liquidity_allowed as va,is_remove_liquidity_allowed as xa,recalculate_asset_fee as wa,recalculate_protocol_fee as Ia}from"@galacticcouncil/math-omnipool";import mt from"big.js";var w=class{static calculateSpotPrice(t,e,n,r){return da(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return ga(t,e)}static calculateInGivenOut(t,e,n,r,i,a,s,o,l){return ca(t,e,n,r,i,a,s,o,l)}static calculateLrnaInGivenOut(t,e,n,r,i){return ua(t,e,n,r,i)}static calculateOutGivenIn(t,e,n,r,i,a,s,o,l){return ma(t,e,n,r,i,a,s,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,i){return pa(t,e,n,r,i)}static calculateShares(t,e,n,r){return ha(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,i,a,s,o){return ba(t,e,n,r,i,a,s,o)}static calculateLiquidityLRNAOut(t,e,n,r,i,a,s,o){return ya(t,e,n,r,i,a,s,o)}static calculateCapDifference(t,e,n,r){let i=mt(e),a=mt(t),s=mt(r),o=mt(n),l=mt(10).pow(18),c=o.div(l);if(i.div(s).lt(c)){let d=c.times(s).minus(i).times(a),m=i.times(mt(1).minus(c));return d.div(m).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,n,r){return Pa(t,e,n,r)}static isSellAllowed(t){return Sa(t)}static isBuyAllowed(t){return Ta(t)}static isAddLiquidityAllowed(t){return va(t)}static isRemoveLiquidityAllowed(t){return xa(t)}static recalculateAssetFee(t,e,n,r,i,a,s,o,l,c,u){return wa(t,e,n,r,i,a,s,o,l,c,u)}static recalculateProtocolFee(t,e,n,r,i,a,s,o,l,c,u){return Ia(t,e,n,r,i,a,s,o,l,c,u)}static verifyAssetCap(t,e,n,r){return fa(t,e,n,r)}};import{big as Aa}from"@galacticcouncil/common";var{FeeUtils:pt}=x,qt=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new p(t)}constructor(t){this.type="Omnipool",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.hubAssetId=t.hubAssetId}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let 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:D.calculateDiffToRef(i,r),s=[],o=w.isSellAllowed(t.tradeableIn),l=w.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 u=t.balanceIn/this.maxInRatio;return i>u&&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=D.calculateDiffToRef(r,i),s=[],o=w.isSellAllowed(t.tradeableIn),l=w.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 u=t.balanceOut/this.maxOutRatio;return i>u&&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=w.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?pt.toRaw(n.assetFee).toString():"0",n?pt.toRaw(n.protocolFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateLrnaInGivenOut(t,e,n){let r=w.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?pt.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=w.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?pt.toRaw(n.assetFee).toString():"0",n?pt.toRaw(n.protocolFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateOutGivenLrnaIn(t,e,n){let r=w.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?pt.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=w.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceLrnaInGivenOut(t){let e=w.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=w.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}spotPriceOutGivenLrnaIn(t){let e=w.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}normalizeSpot(t,e,n){let r=e-n;if(r===0)return t;let i=Aa.pow10(Math.abs(r));return r>0?t*i:t/i}};import{AccountId as Oa,Binary as Ba,CompatibilityLevel as _a,Enum as Ra}from"polkadot-api";import{toHex as Fa}from"@polkadot-api/utils";import{Subscription as Ca,distinctUntilChanged as Ye,filter as ka,finalize as $e,map as Ht,merge as Ea,tap as Te}from"rxjs";import{HYDRATION_SS58_PREFIX as Ma}from"@galacticcouncil/common";var{FeeUtils:_}=x,Gn=Ba.fromText("omnipool"),Vn=Ra("Short"),Nt=class extends q{queryBus=new pe;block=0;dynamicFeesConfig=this.queryBus.scope("DynamicFees.AssetFeeConfiguration",t=>this.api.query.DynamicFees.AssetFeeConfiguration.getValue(t,{at:"best"}),t=>String(t));dynamicFees=this.queryBus.scope("DynamicFees.AssetFee",t=>this.api.query.DynamicFees.AssetFee.getValue(t,{at:"best"}),t=>String(t),6*1e3);emaOracles=this.queryBus.scope("EmaOracle.Oracles.Short",t=>this.api.query.EmaOracle.Oracles.getValue(Gn,t,Vn,{at:"best"}),t=>t.join(":"),6*1e3);getPoolType(){return"Omnipool"}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=Fa(e);return Oa(Ma).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(_a.BackwardsCompatible,e)}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({at:"best"}),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:h,tradable:b,cap:g,protocol_shares:f}=u,[y,S]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:y?.decimals,existentialDeposit:y?.existential_deposit,balance:S.transferable,cap:g,hubReserves:m,protocolShares:f,shares:h,tradeable:b,type:y?.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}]}async getPoolFees(t){let e=t.assetOut,n=t.assetIn,r=await this.dynamicFeesConfig.get(e);if(r?.type==="Fixed"){let{asset_fee:y,protocol_fee:S}=r.value;return{assetFee:_.fromPermill(y),protocolFee:_.fromPermill(S)}}let i=this.getOraclePair(e),a=this.getOraclePair(n),[s,o,l]=await Promise.all([this.dynamicFees.get(e),this.emaOracles.get(i),this.emaOracles.get(a)]),[c,u,d]=await this.getAssetFee(t,this.block,s,o,r?.value.asset_fee_params),[m,h,b]=n===1?[0,0,0]:await this.getProtocolFee(t,this.block,s,l,r?.value.protocol_fee_params),g=c+m,f=d+b;return{assetFee:_.fromPermill(u),protocolFee:_.fromPermill(h),min:_.fromPermill(g),max:_.fromPermill(f)}}async getAssetFee(t,e,n,r,i){let{assetOut:a,balanceOut:s}=t,{min_fee:o,max_fee:l,decay:c,amplification:u}=i||await this.api.constants.DynamicFees.AssetFeeParameters();if(!n||!r)return[o,o,l];let d=_.fromPermill(o),m=_.fromPermill(l),[h]=r,{asset_fee:b,timestamp:g}=n,f=Math.max(1,e-g),y=h.volume.b_in.toString(),S=h.volume.b_out.toString(),P=h.liquidity.b.toString();a===0&&(y=h.volume.a_in.toString(),S=h.volume.a_out.toString(),P=h.liquidity.a.toString());let T=_.fromPermill(b),v=w.recalculateAssetFee(y,S,P,"9",s.toString(),_.toRaw(T).toString(),f.toString(),_.toRaw(d).toString(),_.toRaw(m).toString(),c.toString(),u.toString());return[o,Number(v)*1e6,l]}async getProtocolFee(t,e,n,r,i){let{assetIn:a,balanceIn:s}=t,{min_fee:o,max_fee:l,decay:c,amplification:u}=i||await this.api.constants.DynamicFees.ProtocolFeeParameters();if(!n||!r)return[o,o,l];let d=_.fromPermill(o),m=_.fromPermill(l),[h]=r,{protocol_fee:b,timestamp:g}=n,f=Math.max(1,e-g),y=h.volume.b_in.toString(),S=h.volume.b_out.toString(),P=h.liquidity.b.toString();a===0&&(y=h.volume.a_in.toString(),S=h.volume.a_out.toString(),P=h.liquidity.a.toString());let T=_.fromPermill(b),v=w.recalculateProtocolFee(y,S,P,"9",s.toString(),_.toRaw(T).toString(),f.toString(),_.toRaw(d).toString(),_.toRaw(m).toString(),c.toString(),u.toString());return[o,Number(v)*1e6,l]}subscribeEmaOracles(){let[t]=this.store.pools,n=t.tokens.map(r=>r.id).map(r=>this.getOraclePair(r)).map(r=>this.api.query.EmaOracle.Oracles.watchValue(Gn,r,Vn,"best").pipe(ka(i=>i!==void 0),Ht((i,a)=>({value:i,index:a})),Te(({index:i})=>{i>0&&this.log.trace("emaOracle.Oracles",r.join(":"))}),Ht(({value:i})=>({pair:r,value:i}))));return Ea(...n).pipe($e(()=>this.emaOracles.clear()),this.watchGuard("emaOracle.Oracles")).subscribe(r=>{let{pair:i,value:a}=r;this.emaOracles.set(a,i)})}subscribeDynamicFees(){return this.api.query.DynamicFees.AssetFee.watchEntries({at:"best"}).pipe(Ye((t,e)=>!e.deltas),Ht((t,e)=>({value:t,index:e})),Te(({value:t,index:e})=>{e>0&&this.log.trace("dynamicFees.AssetFee",t.deltas?.upserted)}),$e(()=>this.dynamicFees.clear()),this.watchGuard("dynamicFees.AssetFee")).subscribe(({value:{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(Ye((t,e)=>!e.deltas),Ht((t,e)=>({value:t,index:e})),Te(({value:t,index:e})=>{e>0&&this.log.trace("dynamicFees.AssetFeeConfiguration",t.deltas?.upserted)}),$e(()=>this.dynamicFeesConfig.clear()),this.watchGuard("dynamicFees.AssetFeeConfiguration")).subscribe(({value:{deltas:t}})=>{t?.upserted.forEach(e=>{let[n]=e.args;this.dynamicFeesConfig.set(e.value,n)})})}subscribeBlock(){return this.watcher.bestBlock$.pipe(this.watchGuard("watcher.bestBlock")).subscribe(t=>{this.block=t})}subscribeAssets(){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(Ye((t,e)=>!e.deltas),Ht((t,e)=>({value:t,index:e})),Te(({value:t,index:e})=>{e>0&&this.log.trace("omnipool.Assets",t.deltas?.upserted)}),this.watchGuard("omnipool.Assets")).subscribe(({value:{deltas:t}})=>{this.store.update(([e])=>{let n=t?.upserted.reduce((i,a)=>{let[s]=a.args;return i.set(s,a.value),i},new Map),r=e.tokens.map(i=>{let a=n?.get(i.id);return a?this.updateTokenState(i,a):i});return[{...e,tokens:r}]})})}subscribeUpdates(){let t=new Ca;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:r,tradable:i,cap:a,protocol_shares:s}=e;return{...t,cap:a,hubReserves:n,protocolShares:s,shares:r,tradeable:i}}};var Ke={};I(Ke,{StableMath:()=>M,StableSwap:()=>J,StableSwapClient:()=>Gt});import{calculate_in_given_out as Da,calculate_out_given_in as La,calculate_amplification as qa,calculate_add_one_asset as Ha,calculate_liquidity_out_one_asset as Na,calculate_shares as Ga,calculate_shares_for_amount as Va,calculate_spot_price_with_fee as Ua,pool_account_name as Wa,recalculate_peg as Ya}from"@galacticcouncil/math-stableswap";var M=class{static getPoolAddress(t){return Wa(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 qa(t,e,n,r,i)}static calculateInGivenOut(t,e,n,r,i,a,s){return Da(t,e,n,r,i,a,s)}static calculateAddOneAsset(t,e,n,r,i,a,s){return Ha(t,e,n,r,i,a,s)}static calculateSharesForAmount(t,e,n,r,i,a,s){return Va(t,e,n,r,i,a,s)}static calculateOutGivenIn(t,e,n,r,i,a,s){return La(t,e,n,r,i,a,s)}static calculateLiquidityOutOneAsset(t,e,n,r,i,a,s){return Na(t,e,n,r,i,a,s)}static calculateShares(t,e,n,r,i,a){return Ga(t,e,n,r,i,a)}static calculateSpotPriceWithFee(t,e,n,r,i,a,s,o){return Ua(t,e,n,r,i,a,s,o)}static recalculatePegs(t,e,n,r,i,a){let s=Ya(t,e,n,r,i,a);return JSON.parse(s)}};import{RUNTIME_DECIMALS as $a,big as Un}from"@galacticcouncil/common";var{FeeUtils:dt}=x,J=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;isRampPeriod;id;fee;totalIssuance;pegs;static fromPool(t){return new p(t)}constructor(t){this.type="Stableswap",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit,this.amplification=t.amplification,this.isRampPeriod=t.isRampPeriod,this.id=t.id,this.fee=t.fee,this.totalIssuance=t.totalIssuance,this.pegs=t.pegs}validatePair(t,e){return!0}parsePair(t,e){let 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=r===0n?0:D.calculateDiffToRef(i,r),s=[],o=w.isSellAllowed(t.tradeableIn),l=w.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=D.calculateDiffToRef(r,i),s=[],o=w.isSellAllowed(t.tradeableIn),l=w.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=M.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?dt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateAddOneAsset(t,e,n){let r=M.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?dt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateSharesForAmount(t,e,n){let r=M.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?dt.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=M.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());return this.normalizeSpot(BigInt(e),t.assetOut===this.id,t.assetIn===this.id,t.decimalsOut,t.decimalsIn)}calculateOut(t,e,n){let r=M.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?dt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateWithdrawOneAsset(t,e,n){let r=M.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?dt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateShares(t,e,n){let r=M.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?dt.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=M.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());return this.normalizeSpot(BigInt(e),t.assetIn===this.id,t.assetOut===this.id,t.decimalsIn,t.decimalsOut)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:r})=>({asset_id:e,amount:n,decimals:r}));return JSON.stringify(t,Ct.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],Ct.jsonFormatter)}normalizeSpot(t,e,n,r,i){return e?t*Un.pow10($a-i):n?t/Un.pow10(i-r):t}};import{AccountId as Xa,CompatibilityLevel as za}from"polkadot-api";import{toHex as Ka}from"@polkadot-api/utils";import{blake2b as ja}from"@noble/hashes/blake2b";import{Subscription as Qa,distinctUntilChanged as Ja,map as ze,merge as Za,tap as Wn}from"rxjs";import{HYDRATION_SS58_PREFIX as ts,RUNTIME_DECIMALS as es}from"@galacticcouncil/common";var{FeeUtils:ns}=x,Gt=class extends q{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=M.getPoolAddress(t),n=ja(e,{dkLen:32}),r=Ka(n);return Xa(ts).dec(r)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}getPoolAmplification(t,e){let{initial_amplification:n,final_amplification:r,initial_block:i,final_block:a}=t,s=M.calculateAmplification(n.toString(),r.toString(),i.toString(),a.toString(),e.toString()),o=Number(s)<r;return{amplification:BigInt(s),isRampPeriod:o}}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(za.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries({at:"best"}),this.api.query.System.Number.getValue({at:"best"}),this.getPoolLimits()]),r=t.map(async({keyArgs:i,value:a})=>{let[s]=i,o=this.getPoolAddress(s),[l,c,u]=await Promise.all([this.getPoolTokens(s,a),this.api.query.Stableswap.PoolPegs.getValue(s,{at:"best"}),this.api.query.Tokens.TotalIssuance.getValue(s,{at:"best"})]),d=this.getPoolAmplification(a,e),m=c?this.getRecentPegs(c):this.getDefaultPegs(a);return l.push({id:s,tradeable:15,balance:u,decimals:es}),this.poolsData.set(s,a),{address:o,id:s,type:"Stableswap",fee:ns.fromPermill(a.fee),tokens:l,totalIssuance:u,pegs:m,...n,...d}});return Promise.all(r)}async getPoolFees(t,e){return{fee:this.store.pools.find(r=>r.address===e).fee}}getDefaultPegs(t){return M.defaultPegs(t.assets.length)}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,r])=>r.map(i=>i.toString()))}subscribeIssuance(){let e=this.store.pools.map(n=>n.id).map(n=>this.api.query.Tokens.TotalIssuance.watchValue(n,"best").pipe(ze((r,i)=>({value:r,index:i})),Wn(({index:r,value:i})=>{r>0&&this.log.trace("tokens.TotalIssuance",n,i)}),ze(({value:r})=>({id:n,value:r}))));return Za(...e).pipe(this.watchGuard("tokens.TotalIssuance")).subscribe(n=>{let{id:r,value:i}=n;this.store.update(a=>{let s=[];return a.filter(o=>o.id===r).forEach(o=>{let l=o.tokens.map(c=>c.id===r?{...c,balance:i}:c);s.push({...o,tokens:l,totalIssuance:i})}),s})})}subscribePoolPegs(){return this.api.query.Stableswap.PoolPegs.watchEntries({at:"best"}).pipe(Ja((t,e)=>!e.deltas),ze((t,e)=>({value:t,index:e})),Wn(({value:t,index:e})=>{e>0&&this.log.trace("stableswap.PoolPegs",t.deltas?.upserted)}),this.watchGuard("stableswap.PoolPegs")).subscribe({error:t=>this.log.error("stableswap.PoolPegs",t),next:({value:{deltas:t}})=>{this.store.update(e=>{let n=[],r=new Map(e.map(i=>[i.id,i]));return t?.upserted.forEach(({args:i,value:a})=>{let[s]=i,o=r.get(s);if(o){let l=this.getRecentPegs(a);n.push({...o,pegs:l})}}),n})}})}subscribeBlock(){return this.watcher.bestBlock$.pipe(this.watchGuard("watcher.bestBlock")).subscribe(t=>{this.store.update(e=>{let n=[];return e.filter(r=>r.isRampPeriod).forEach(r=>{let i=this.poolsData.get(r.id);if(i){let a=this.getPoolAmplification(i,t);n.push({...r,...a})}}),n})})}subscribeUpdates(){let t=new Qa;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 je={};I(je,{XykMath:()=>j,XykPool:()=>Vt,XykPoolClient:()=>Ut});import{calculate_in_given_out as rs,calculate_out_given_in as is,calculate_pool_trade_fee as as,get_spot_price as ss,calculate_liquidity_in as os,calculate_shares as ls,calculate_spot_price as cs,calculate_spot_price_with_fee as us,calculate_liquidity_out_asset_a as ms,calculate_liquidity_out_asset_b as ps}from"@galacticcouncil/math-xyk";var j=class{static getSpotPrice(t,e,n){return ss(t,e,n)}static calculateInGivenOut(t,e,n){return rs(t,e,n)}static calculateOutGivenIn(t,e,n){return is(t,e,n)}static calculatePoolTradeFee(t,e,n){return as(t,e,n)}static calculateLiquidityIn(t,e,n){return os(t,e,n)}static calculateSpotPrice(t,e){return cs(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return us(t,e,n,r)}static calculateShares(t,e,n){return ls(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return ms(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return ps(t,e,n,r)}};import{big as ds}from"@galacticcouncil/common";var{FeeUtils:Yn}=x,Vt=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new p(t)}constructor(t){this.type="XYK",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit}validatePair(t,e){return!0}parsePair(t,e){let 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=Yn.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=Yn.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=j.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=j.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=j.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){let e=j.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}calculateTradeFee(t,e){let n=j.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}normalizeSpot(t,e,n){let r=e-n;if(r===0)return t;let i=ds.pow10(Math.abs(r));return r>0?t*i:t/i}};import{CompatibilityLevel as gs}from"polkadot-api";import{Subscription as hs}from"rxjs";var Ut=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(gs.BackwardsCompatible,e)}async loadPools(){let[t,e]=await Promise.all([this.api.query.XYK.PoolAssets.getEntries(),this.getPoolLimits()]),n=t.map(async({keyArgs:r,value:i})=>{let[a]=r,[s,o]=i,[l,c,u,d]=await Promise.all([this.getBalance(a,s),this.api.query.AssetRegistry.Assets.getValue(s),this.getBalance(a,o),this.api.query.AssetRegistry.Assets.getValue(o)]);return{address:a,type:"XYK",tokens:[{id:s,decimals:c?.decimals||this.decimals.get(s),existentialDeposit:c?.existential_deposit,balance:l.transferable,type:c?.asset_type.type},{id:o,decimals:d?.decimals||this.decimals.get(o),existentialDeposit:d?.existential_deposit,balance:u.transferable,type:d?.asset_type.type}],...e}});return Promise.all(n)}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}subscribeUpdates(){return hs.EMPTY}};var Je={};I(Je,{AavePool:()=>Wt,AavePoolClient:()=>Yt});import{big as $n,RUNTIME_DECIMALS as Xn}from"@galacticcouncil/common";var Wt=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new p(t)}constructor(t){this.type="Aave",this.address=t.address,this.tokens=t.tokens,this.maxInRatio=t.maxInRatio,this.maxOutRatio=t.maxOutRatio,this.minTradingLimit=t.minTradingLimit}validatePair(t,e){return!0}parsePair(t,e){let 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){return $n.toBigInt(1,Xn)}spotPriceOutGivenIn(t){return $n.toBigInt(1,Xn)}calculateTradeFee(t,e){return 0n}};import{AccountId as bs}from"polkadot-api";import{toHex as ys}from"@polkadot-api/utils";import{Subscription as Kn,filter as Qe,map as jn}from"rxjs";import{decodeEventLog as fs}from"viem";import{erc20 as Ps,HYDRATION_SS58_PREFIX as Ss}from"@galacticcouncil/common";var zn=[{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:Ts}=Ps,vs=["Supply","Withdraw","Repay","Borrow"],Yt=class extends q{getPoolType(){return"Aave"}async isSupported(){return!0}getPoolId(t,e){let n=t+"/"+e,r=new TextEncoder().encode(n.padEnd(32,"\0")),i=ys(r);return bs(Ss).dec(i)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools({at:"best"})).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,{at:"best"});return t.tokens.map(a=>{let s=a.id===e.id?r:i;return{...a,balance:s}})}async getPoolFees(){return{}}getReserveH160Id(t){if(t.type==="Erc20"&&t.location){let e=t.location.interior;if(e.type==="X1"&&e.value.type==="AccountKey20"){let{value:n}=e.value;return n.key.asHex()}throw new Error("Invalid aave reserve multilocation")}return Ts.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,r=e.map(a=>a.asHex()),i=n.asHex();try{let{eventName:a,args:s}=fs({abi:zn,topics:r,data:i}),o=s.reserve.toLowerCase();return{eventName:a,reserve:o,key:`${a}:${o}`}}catch{return}}subscribeRouterExecuted(){let e=this.store.pools.map(n=>n.tokens).map(([n,r])=>r).map(n=>n.id);return this.api.event.Router.Executed.watch().pipe(jn(({payload:n})=>this.parseRouterLog(n)),Qe(({assetIn:n,assetOut:r})=>e.includes(n)||e.includes(r)),this.watchGuard("router.Execute")).subscribe(({assetIn:n,assetOut:r,key:i})=>{this.log.trace("router.Executed",i),this.store.update(async a=>{let s=[];for(let o of a){let[l,c]=o.tokens;if(c.id===n||c.id===r){let d=await this.getPoolDelta(o);s.push({...o,tokens:d})}}return s})})}subscribeEvmLog(){return this.api.event.EVM.Log.watch().pipe(jn(({payload:t})=>this.parseEvmLog(t)),Qe(t=>t!==void 0),Qe(({eventName:t})=>vs.includes(t)),this.watchGuard("evm.Log")).subscribe(({reserve:t,eventName:e})=>{this.log.trace(`evm.Log.${e}`,t),this.store.update(async n=>{let r=[];for(let i of n){let[a]=i.tokens;if(this.getReserveH160Id(a).toLowerCase()===t){let o=await this.getPoolDelta(i);r.push({...i,tokens:o})}}return r})})}subscribeBalances(){return Kn.EMPTY}subscribeUpdates(){let t=new Kn;return t.add(this.subscribeRouterExecuted()),t.add(this.subscribeEvmLog()),t}};var gt=class{static get(t){switch(t.type){case"Aave":return Wt.fromPool(t);case"XYK":return Vt.fromPool(t);case"Omnipool":return qt.fromPool(t);case"LBP":return Dt.fromPool(t);case"Stableswap":return J.fromPool(t);case"HSM":return J.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as Ns,Subscription as ht,takeUntil as Gs}from"rxjs";var rn={};I(rn,{HsmMath:()=>Y,HsmPool:()=>tn,HsmPoolClient:()=>Kt});import{calculate_collateral_in_given_hollar_out as xs,calculate_collateral_out_given_hollar_in as ws,calculate_hollar_in_given_collateral_out as Is,calculate_hollar_out_given_collateral_in as As,calculate_imbalance as Os,calculate_max_price as Bs,calculate_buyback_limit as _s,calculate_buyback_price_with_fee as Rs}from"@galacticcouncil/math-hsm";var Y=class{static calculateCollateralInGivenHollarOut(t,e,n){return xs(t,e,n)}static calculateCollateralOutGivenHollarIn(t,e,n){return ws(t,e,n)}static calculateHollarOutGivenCollateralIn(t,e,n){return As(t,e,n)}static calculateHollarInGivenCollateralOut(t,e,n){return Is(t,e,n)}static calculateImbalance(t,e,n){return Os(t,e,n)}static calculateBuybackLimit(t,e){return _s(t,e)}static calculateBuybackPriceWithFee(t,e,n){return Rs(t,e,n)}static calculateMaxPrice(t,e){return Bs(t,e)}};import{big as ve,RUNTIME_DECIMALS as Ze}from"@galacticcouncil/common";var{FeeUtils:$t}=x,tn=class p extends J{hsmAddress;hsmMintCapacity;hollarId;hollarH160;collateralId;collateralBalance;maxBuyPriceCoefficient;maxInHolding;purchaseFee;buyBackFee;buyBackRate;static fromPool(t){return new p(t)}constructor(t){super(t),this.type="HSM",this.hsmAddress=t.hsmAddress,this.hsmMintCapacity=t.hsmMintCapacity,this.hollarId=t.hollarId,this.hollarH160=t.hollarH160,this.collateralId=t.collateralId,this.collateralBalance=t.collateralBalance,this.maxBuyPriceCoefficient=t.maxBuyPriceCoefficient,this.maxInHolding=t.maxInHolding,this.purchaseFee=t.purchaseFee,this.buyBackFee=t.buyBackFee,this.buyBackRate=t.buyBackRate}validatePair(t,e){return!0}parsePair(t,e){return super.parsePair(t,e)}validateTradeHollarIn(t,e,n,r){let i=this.calculateBuybackLimit(t);e>i&&r.push("MaxBuyBackExceeded");let a=this.calculateBuyPrice(t,e,n),s=this.calculateMaxPrice(t);return a>s&&r.push("MaxBuyPriceExceeded"),n>this.collateralBalance&&r.push("InsufficientCollateral"),r}validateTradeHollarOut(t,e,n){return this.collateralBalance+t>this.maxInHolding&&n.push("MaxHoldingExceeded"),e>this.hsmMintCapacity&&n.push("FacilitatorCapacityExceeded"),n}validateTradeConstraints(t,e,n){let r=[];return t.assetIn===this.hollarId?this.validateTradeHollarIn(t,e,n,r):this.validateTradeHollarOut(e,n,r)}validateAndBuy(t,e){let n=this.calculateInGivenOut(t,e),r=this.validateTradeConstraints(t,n,e);return{amountIn:n,calculatedIn:n,amountOut:e,feePct:0,errors:r}}validateAndSell(t,e){let n=this.calculateOutGivenIn(t,e),r=this.validateTradeConstraints(t,e,n);return{amountIn:e,calculatedOut:n,amountOut:n,feePct:0,errors:r}}calculateHollarInGivenCollateralOut(t,e){let n=super.calculateInGivenOut(t,e,{fee:this.fee}),r=Y.calculateHollarInGivenCollateralOut(e.toString(),n.toString(),$t.toRaw(this.buyBackFee).toString());return BigInt(r)}calculateCollateralInGivenHollarOut(t){let e=this.getCollateralPeg(),n=Y.calculateCollateralInGivenHollarOut(t.toString(),JSON.stringify(e),$t.toRaw(this.purchaseFee).toString());return BigInt(n)}calculateInGivenOut(t,e){return t.assetOut==this.hollarId?this.calculateCollateralInGivenHollarOut(e):this.calculateHollarInGivenCollateralOut(t,e)}calculateCollateralOutGivenHollarIn(t,e){let n=super.calculateOutGivenIn(t,e,{fee:this.fee}),r=Y.calculateCollateralOutGivenHollarIn(e.toString(),n.toString(),$t.toRaw(this.buyBackFee).toString());return BigInt(r)}calculateHollarOutGivenCollateralIn(t){let e=this.getCollateralPeg(),n=Y.calculateHollarOutGivenCollateralIn(t.toString(),JSON.stringify(e),$t.toRaw(this.purchaseFee).toString());return BigInt(n)}calculateOutGivenIn(t,e){return t.assetIn==this.hollarId?this.calculateCollateralOutGivenHollarIn(t,e):this.calculateHollarOutGivenCollateralIn(e)}calculateImbalance(t){let e=this.getCollateralPeg(),n=Y.calculateImbalance(t.balanceIn.toString(),JSON.stringify(e),t.balanceOut.toString());return BigInt(n)}calculateBuybackLimit(t){let e=this.calculateImbalance(t),n=Y.calculateBuybackLimit(e.toString(),$t.toRaw(this.buyBackRate).toString());return BigInt(n)}calculateBuyPrice(t,e,n){let r=n*10n**BigInt(t.decimalsIn);return e*10n**BigInt(t.decimalsOut)/r}calculateMaxPrice(t){let e=this.getCollateralPeg(),n=Y.calculateMaxPrice(JSON.stringify(e),this.maxBuyPriceCoefficient.toString()),[r,i]=JSON.parse(n),a=10n**BigInt(Ze-t.decimalsOut);return BigInt(r)*a/BigInt(i)}spotPriceInGivenOut(t){let e=ve.toBigInt(1,Ze);return this.calculateInGivenOut(t,e)}spotPriceOutGivenIn(t){let e=ve.toBigInt(1,Ze);return this.calculateOutGivenIn(t,e)}getCollateralPeg(){let t=this.tokens.findIndex(r=>r.id!==this.hollarId),e=this.pegs[t],n=this.tokens[t].decimals;return this.isDefaultPeg(e)?[ve.toBigInt(1,18).toString(),ve.toBigInt(1,n).toString()]:e}isDefaultPeg(t){let[e,n]=t;return Array.isArray(t)&&t.length===2&&e==="1"&&n==="1"}};import{AccountId as Fs,CompatibilityLevel as Cs}from"polkadot-api";import{toHex as ks}from"@polkadot-api/utils";import{Subscription as Qn,combineLatest as Es,filter as Jn,map as en,pairwise as Ms}from"rxjs";import{decodeEventLog as Ds}from"viem";import{h160 as Ls,HYDRATION_SS58_PREFIX as qs}from"@galacticcouncil/common";var Xt=[{inputs:[{internalType:"address",name:"facilitator",type:"address"}],name:"getFacilitator",outputs:[{type:"tuple",components:[{name:"addr",type:"address"},{name:"label",type:"bytes32"},{name:"bucketCapacity",type:"uint128"},{name:"bucketLevel",type:"uint128"}]}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"facilitator",type:"address"}],name:"getFacilitatorBucket",outputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getFacilitatorsList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!0,internalType:"bytes32",name:"label",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"bucketCapacity",type:"uint256"}],name:"FacilitatorAdded",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"oldCapacity",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newCapacity",type:"uint256"}],name:"FacilitatorBucketCapacityUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"oldLevel",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newLevel",type:"uint256"}],name:"FacilitatorBucketLevelUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"}],name:"FacilitatorRemoved",type:"event"}];var zt=class{client;constructor(t){this.client=t.getWsProvider()}async getFacilitatorCapacity(t,e){let[n,r]=await this.client.readContract({abi:Xt,address:t,functionName:"getFacilitatorBucket",args:[e]});return n-r}};var{FeeUtils:nn}=x,{H160:Zn}=Ls,Hs=["FacilitatorBucketCapacityUpdated","FacilitatorBucketLevelUpdated"],Kt=class extends q{ghoClient;stableClient;constructor(t,e,n){super(t,e),this.stableClient=n,this.ghoClient=new zt(e)}getPoolType(){return"HSM"}getPoolId(t){return this.getPoolAddress("hsm:"+t)}getFacilitatorAddress(){return this.getPoolAddress("modlpy/hsmod")}getHollarAddress(t){if(t){let e=t.interior;if(e.type==="X1"&&e.value.type==="AccountKey20"){let{value:n}=e.value;return n.key.asHex()}}throw Error("Invalid hollar multilocation")}getPoolAddress(t){let e=t.padEnd(32,"\0"),n=new TextEncoder().encode(e),r=ks(n);return Fs(qs).dec(r)}async isSupported(){let t=this.api.query.HSM.Collaterals,e=await this.api.compatibilityToken;return t.isCompatible(Cs.BackwardsCompatible,e)}async loadPools(){let t=await this.api.constants.HSM.HollarId(),[e,n,r]=await Promise.all([this.api.query.AssetRegistry.AssetLocations.getValue(t),this.api.query.HSM.Collaterals.getEntries({at:"best"}),this.stableClient.getPools()]);if(n.length===0)return[];let i=this.getFacilitatorAddress(),a=Zn.fromAny(i),s=this.getHollarAddress(e),o=await this.ghoClient.getFacilitatorCapacity(s,a),l=n.map(async({keyArgs:u,value:d})=>{let[m]=u,{pool_id:h,max_buy_price_coefficient:b,max_in_holding:g,purchase_fee:f,buy_back_fee:y,buyback_rate:S}=d,P=r.find(T=>T.id===h);if(P){let T=this.getPoolId(h),v=await this.getBalance(i,m);return{...P,address:T,type:"HSM",tokens:P.tokens.filter(B=>B.id!==h),hsmAddress:i,hsmMintCapacity:o,hollarId:t,hollarH160:s,collateralId:m,collateralBalance:v.transferable,maxBuyPriceCoefficient:b,maxInHolding:g,purchaseFee:nn.fromPermill(f),buyBackFee:nn.fromPermill(y),buyBackRate:nn.fromPerbill(S)}}});return(await Promise.all(l)).filter(u=>u!==null)}async getPoolFees(){return{}}parseEvmLog(t){let{topics:e,data:n}=t.log,r=e.map(a=>a.asHex()),i=n.asHex();try{let{eventName:a,args:s}=Ds({abi:Xt,topics:r,data:i}),o=s.facilitatorAddress.toLowerCase();return{eventName:a,facilitator:o,key:`${a}:${o}`}}catch{return}}subscribeEvmLog(){return this.api.event.EVM.Log.watch().pipe(en(({payload:t})=>this.parseEvmLog(t)),Jn(t=>t!==void 0),Jn(({eventName:t})=>Hs.includes(t)),this.watchGuard("evm.Log")).subscribe(({eventName:t,facilitator:e})=>{this.log.trace(`evm.Log.${t}`,e),this.store.update(async n=>{let r=[],[{hsmAddress:i,hollarH160:a}]=n,s=Zn.fromAny(i);if(s.toLowerCase()===e){let l=await this.ghoClient.getFacilitatorCapacity(a,s);for(let c of n)r.push({...c,hsmMintCapacity:l})}return r})})}subscribeBalances(){let t=[],e=[];this.store.pools.forEach(i=>{let{tokens:a,collateralId:s}=i;a.find(l=>l.id===s).type==="Erc20"?e.push(s):t.push(s)});let[{hsmAddress:n}]=this.store.pools,r=[];if(t.length>0){let i=this.subscribeTokensBalance(n);r.push(i)}if(e.length>0){let i=this.subscribeErc20Balance(n,e);r.push(i)}return r.length>0?Es(r).pipe(en(i=>i.flat()),Ms(),en(([i,a])=>this.getDeltas(i,a)),this.watchGuard("balances")).subscribe(i=>{this.store.update(a=>{let s=[],o=new Map(a.map(l=>[l.collateralId,l]));return i.forEach(({id:l,balance:c})=>{let u=o.get(l);u&&(this.log.trace("balances",{id:l,balance:c}),s.push({...u,collateralBalance:c.transferable}))}),s})}):Qn.EMPTY}subscribeUpdates(){let t=new Qn;return t.add(this.subscribeEvmLog()),t}};var bt=class extends F{evm;aave;omnipool;stableswap;hsm;xyk;lbp;active=new Set([]);pools=new Map([]);clients=[];aaveSub=ht.EMPTY;omniSub=ht.EMPTY;stableSub=ht.EMPTY;hsmSub=ht.EMPTY;xykSub=ht.EMPTY;lbpSub=ht.EMPTY;isReady=!1;isDestroyed=new Ns;constructor(t,e){super(t),this.evm=e,this.aave=new Yt(t,e),this.omnipool=new Nt(t,e),this.stableswap=new Gt(t,e),this.hsm=new Kt(t,e,this.stableswap),this.xyk=new Ut(t,e),this.lbp=new Lt(t,e),this.clients=[this.aave,this.omnipool,this.stableswap,this.hsm,this.xyk,this.lbp]}subscribe(t){return t.getSubscriber().pipe(Gs(this.isDestroyed)).subscribe(e=>{e.forEach(n=>{this.pools.set(n.address,n)})})}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aave),this.active.add("Aave"),this}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}withHsm(){return this.hsmSub.unsubscribe(),this.hsmSub=this.subscribe(this.hsm),this.active.add("HSM"),this}withXyk(t){return this.xyk.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xyk),this.active.add("XYK"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbp),this.active.add("LBP"),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(r=>r.getPoolType()===e.type);if(n)return n.getPoolFees(t,e.address);throw new Bt(e.type)}};var ar={};I(ar,{DEFAULT_BLOCK_TIME:()=>nr,DEFAULT_MIN_BUDGET:()=>on,ORDER_MIN_BLOCK_PERIOD:()=>rr,Router:()=>yt,TWAP_BLOCK_PERIOD:()=>Zt,TWAP_MAX_DURATION:()=>cn,TWAP_MAX_PRICE_IMPACT:()=>ln,TWAP_TX_MULTIPLIER:()=>kh,TradeOrderError:()=>sn,TradeOrderType:()=>we,TradeRouteBuilder:()=>V,TradeRouter:()=>Pt,TradeScheduler:()=>St,TradeType:()=>xe});var jt=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Vs=10,Qt=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 jt,a=[];for(a.push([e,""]),i.enqueue(a);i.size()>0;){let s=i.dequeue();if(!s||s.length>Vs)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 u=[...s];u.push(c),i.enqueue(u)}})}return r}findShortestPaths(t,e,n){let r=[],i=new jt,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 u of c??[])this.isNotVisited(u,o)&&i.enqueue([...o,u])}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 an(p){let t={};for(let e of p){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 Jt=class{getProposals(t,e,n){let r=n.filter(g=>g.type==="XYK"),i=n.filter(g=>g.type!=="XYK"),a=new Set(i.map(g=>g.tokens).flat().map(g=>g.id)),s=a.has(t),o=a.has(e),l=new Qt,c=g=>{let f=an(g),y=Object.keys(f),S=y.flatMap(P=>f[P]);return l.buildAndPopulateGraph(y,S)};if(!s&&!o){let g=r.filter(S=>S.tokens.find(P=>P.id===t)||S.tokens.find(P=>P.id===e)),f=c(g),y=l.findPaths(f,t,e);return this.parsePaths(y)}if(s&&o){let g=c(i),f=l.findPaths(g,t,e);return this.parsePaths(f)}let u=s?e:t,d=r.filter(g=>g.tokens.some(f=>f.id===u));if(d.length===0)return[];let m=[...i,...d],h=c(m),b=l.findPaths(h,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 yt=class{routeSuggester;routeProposals;ctx;filter={};constructor(t){this.ctx=t,this.routeSuggester=new Jt,this.routeProposals=new Map}async withFilter(t){this.filter=t||{},this.routeProposals.clear(),this.onFilterChanged()}onFilterChanged(){}buildRouteKey(t,e,n){return`${t}->${e}::${n.length}`}applyPoolFilter(t){let{useOnly:e=[],exclude:n=[]}=this.filter,r=new Set(e),i=new Set(n);return t.filter(a=>i.has(a.type)?!1:r.size>0?r.has(a.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(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,gt.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}})}};import{big as R,RUNTIME_DECIMALS as ft}from"@galacticcouncil/common";var xe=(e=>(e.Buy="Buy",e.Sell="Sell",e))(xe||{}),we=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(we||{}),sn=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(sn||{});var{FeeUtils:er}=x,Pt=class extends yt{mlr;constructor(t){super(t),this.mlr=new Map}onFilterChanged(){this.mlr.clear()}buildCtxSync(t,e,n){let r=super.validateInput(t,e,n),i=super.getPaths(t,e,n);if(!i.length)throw new _t(t,e);return{paths:i,pools:n,poolsMap:r}}async withCtx(t,e,n){let r=await super.getPools(),i=this.buildCtxSync(t,e,r);return n(i)}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?er.toPct(t.min):void 0,n=t.max?er.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];return t.length===1?e.spotPrice:this.calculateSpot(t)}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)})}async getSells(t,e,n){return this.withCtx(t,e,async({paths:r,poolsMap:i})=>{let a=r.map(o=>this.toSellSwaps(n,o,i));return(await Promise.all(a)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildSell(i,o)).sort((o,l)=>o.amountOut>l.amountOut?-1:1)})}buildSell(t,e){let 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),u=i?r.tradeFeePct:D.calculateSellFee(o,s),d=k.mulSpot(n.amountIn,a,n.assetInDecimals,r.assetOutDecimals),m=D.calculateDiffToRef(o,d);return{type:"Sell",amountIn:n.amountIn,amountOut:r.amountOut,spotPrice:a,tradeFee:l,tradeFeePct:u,tradeFeeRange:c,priceImpactPct:m,swaps:e,toHuman(){return{type:"Sell",amountIn:R.toDecimal(n.amountIn,n.assetInDecimals),amountOut:R.toDecimal(r.amountOut,r.assetOutDecimals),spotPrice:R.toDecimal(a,ft),tradeFee:R.toDecimal(l,r.assetOutDecimals),tradeFeePct:u,tradeFeeRange:c,priceImpactPct:m,swaps:e.map(h=>h.toHuman())}}}}calculateSpot(t){return t.map(e=>e.spotPrice).reduce((e,n)=>e*n/10n**BigInt(ft))}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(g=>g.id===t)).map(b=>b.type==="Aave"?b.tokens:b.tokens.filter(g=>g.id===t)).map(b=>b.map(g=>g.balance).reduce((g,f)=>g+f)).sort((b,g)=>g<b?-1:1)[0],c=k.getFraction(l,.1),u=await Promise.all(r.map(b=>this.toSellSwaps(c,b,a))),m=this.findBestSellRoute(u).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),h=this.buildRouteKey(t,e,i);return this.mlr.set(h,m),m}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"?R.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(o,s),{amountOut:u,calculatedOut:d,feePct:m,errors:h}=s.validateAndSell(o,l,c),b=this.getPoolFeeRange(c),g=s.spotPriceOutGivenIn(o),f=k.mulSpot(l,g,o.decimalsIn,o.decimalsOut),y=D.calculateDiffToRef(d,f);r.push({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:u,calculatedOut:d,spotPrice:g,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:y,errors:h,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:R.toDecimal(l,o.decimalsIn),amountOut:R.toDecimal(u,o.decimalsOut),calculatedOut:R.toDecimal(d,o.decimalsOut),spotPrice:R.toDecimal(g,ft),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:y,errors:h}}})}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);return{amount:this.getSellSpot(o),decimals:ft}}).catch(()=>{})}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];return t.length===1?e.spotPrice:this.calculateSpot(t)}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)})}async getBuys(t,e,n){return this.withCtx(t,e,async({paths:r,poolsMap:i})=>{let a=r.map(o=>this.toBuySwaps(n,o,i));return(await Promise.all(a)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildBuy(i,o)).sort((o,l)=>o.amountIn>l.amountIn?1:-1)})}buildBuy(t,e){let 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),u=i?r.tradeFeePct:D.calculateBuyFee(o,s),d=k.mulSpot(n.amountOut,a,n.assetOutDecimals,r.assetInDecimals),m;return o===0n?m=-100:m=D.calculateDiffToRef(d,o),{type:"Buy",amountOut:n.amountOut,amountIn:r.amountIn,spotPrice:a,tradeFee:l,tradeFeePct:u,tradeFeeRange:c,priceImpactPct:m,swaps:e,toHuman(){return{type:"Buy",amountOut:R.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:R.toDecimal(r.amountIn,r.assetInDecimals),spotPrice:R.toDecimal(a,ft),tradeFee:R.toDecimal(l,r.assetInDecimals),tradeFeePct:u,tradeFeeRange:c,priceImpactPct:m,swaps:e.map(h=>h.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"?R.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let c=await this.ctx.getPoolFees(o,s),{amountIn:u,calculatedIn:d,feePct:m,errors:h}=s.validateAndBuy(o,l,c),b=this.getPoolFeeRange(c),g=s.spotPriceInGivenOut(o),f=k.mulSpot(l,g,o.decimalsOut,o.decimalsIn),y;d===0n?y=-100:y=D.calculateDiffToRef(f,d),r.unshift({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:u,calculatedIn:d,spotPrice:g,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:y,errors:h,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:R.toDecimal(l,o.decimalsOut),amountIn:R.toDecimal(u,o.decimalsIn),calculatedIn:R.toDecimal(d,o.decimalsIn),spotPrice:R.toDecimal(g,ft),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:y,errors:h}}})}return r}};import{big as H}from"@galacticcouncil/common";var nr=6e3,on=1000000000000000n,Zt=6,ln=-5,cn=216e5,kh=3,rr=6;import{Enum as ir}from"polkadot-api";var V=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:i})=>r==="Stableswap"?{pool:ir("Stableswap",i),asset_in:e,asset_out:n}:{pool:ir(r),asset_in:e,asset_out:n})}};var St=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??on})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,r,i){let a=await this.router.getBestSell(t,e,n),{amountIn:s,swaps:o,priceImpactPct:l}=a,c=o[0],u=o[o.length-1],{assetInDecimals:d}=c,{assetOutDecimals:m}=u,h=Math.abs(l),b=await this.getMinimumOrderBudget(t,d),g=this.getMaximumTradeCount(s,b),f=this.getOptimalTradeCount(h),y=i||f,S=Math.round(r/y),P=s/BigInt(y),T=await this.router.getBestSell(t,e,P),v=s<b,B=[];v&&B.push("OrderTooSmall");let E=T.amountOut*BigInt(y),$=this.toBlockPeriod(S),z=T.tradeFee*BigInt(y),N=V.build(o),G={assetIn:t,assetOut:e,errors:B,maxTradeCount:g,optTradeCount:f,tradeCount:y,tradeFee:z,tradeImpactPct:T.priceImpactPct,tradePeriod:$,tradeRoute:N,type:"Dca"};return{...G,amountIn:s,amountOut:E,tradeAmountIn:T.amountIn,tradeAmountOut:T.amountOut,toHuman(){return{...G,amountIn:H.toDecimal(s,d),amountOut:H.toDecimal(E,m),tradeAmountIn:H.toDecimal(T.amountIn,d),tradeAmountOut:H.toDecimal(T.amountOut,m)}}}}async getMinimumOrderBudget(t,e){if(0===t)return this.minOrderBudget;let n=await this.router.getSpotPrice(0,t);if(n)return k.mulSpot(this.minOrderBudget,n.amount,12,e);throw new Error("Unable to calculate order budget")}getMaximumTradeCount(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=await this.router.getBestSell(t,e,n),{amountIn:i,swaps:a,priceImpactPct:s}=r,o=a[0],l=a[a.length-1],{assetInDecimals:c}=o,{assetOutDecimals:u}=l,d=Math.abs(s),m=this.getTwapTradeCount(d),h=i/BigInt(m),[b,g]=await Promise.all([this.getMinimumOrderBudget(t,c),this.router.getBestSell(o.assetIn,l.assetOut,h)]),f=m===1,y=i<b,S=g.priceImpactPct<-5,P=[];y||f?P.push("OrderTooSmall"):S&&P.push("OrderImpactTooBig");let T=g.amountOut*BigInt(m),v=g.tradeFee*BigInt(m),B=V.build(a),E={assetIn:t,assetOut:e,errors:P,tradeCount:m,tradeImpactPct:g.priceImpactPct,tradePeriod:6,tradeRoute:B,type:"TwapSell"};return{...E,amountIn:i,amountOut:T,tradeAmountIn:g.amountIn,tradeAmountOut:g.amountOut,tradeFee:v,toHuman(){return{...E,amountIn:H.toDecimal(i,c),amountOut:H.toDecimal(T,u),tradeAmountIn:H.toDecimal(g.amountIn,c),tradeAmountOut:H.toDecimal(g.amountOut,u),tradeFee:H.toDecimal(v,u)}}}}async getTwapBuyOrder(t,e,n){let r=await this.router.getBestBuy(t,e,n),{amountOut:i,swaps:a,priceImpactPct:s}=r,o=a[0],l=a[a.length-1],{assetInDecimals:c}=o,{assetOutDecimals:u}=l,d=Math.abs(s),m=this.getTwapTradeCount(d),h=i/BigInt(m),[b,g]=await Promise.all([this.getMinimumOrderBudget(t,c),this.router.getBestBuy(o.assetIn,l.assetOut,h)]),f=g.amountIn*BigInt(m),y=m===1,S=f<b,P=g.priceImpactPct<-5,T=[];S||y?T.push("OrderTooSmall"):P&&T.push("OrderImpactTooBig");let v=g.tradeFee*BigInt(m),B=V.build(a),E={assetIn:t,assetOut:e,errors:T,tradeCount:m,tradeImpactPct:g.priceImpactPct,tradePeriod:6,tradeRoute:B,type:"TwapBuy"};return{...E,amountIn:f,amountOut:i,tradeAmountIn:g.amountIn,tradeAmountOut:g.amountOut,tradeFee:v,toHuman(){return{...E,amountIn:H.toDecimal(f,c),amountOut:H.toDecimal(i,u),tradeAmountIn:H.toDecimal(g.amountIn,c),tradeAmountOut:H.toDecimal(g.amountOut,u),tradeFee:H.toDecimal(v,c)}}}}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 pr={};I(pr,{BIG_10:()=>mr,BIG_BILL:()=>un,StakingApi:()=>te,StakingClient:()=>ee});import{calculate_accumulated_rps as $s,calculate_percentage_amount as Xs,calculate_period_number as lr,calculate_points as cr,calculate_rewards as zs,sigmoid as ur}from"@galacticcouncil/math-staking";import U from"big.js";var Ie={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},sr=p=>Object.keys(Ie).includes(p);import{AccountId as Us}from"polkadot-api";import{toHex as Ws}from"@polkadot-api/utils";import{HYDRATION_SS58_PREFIX as Ys}from"@galacticcouncil/common";function or(p){let t=("modl"+p).padEnd(32,"\0"),e=new TextEncoder().encode(t),n=Ws(e);return Us(Ys).dec(n)}var Ae="20000000000000000",Oe="2000",mr=U(10),un=U(mr.pow(12)),te=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getPotBalance(){let t=await this.client.getPalletId(),e=or(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,u=o.amount,d=o.conviction.type.toLowerCase(),m=await this.client.getReferendumInfo(c);return m&&(m.type==="Approved"||m.type==="Rejected")&&sr(d)&&l.push({id:c,amount:u,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=U(0),a=U(0),s=Ie.locked6x,o=U(n.toString()).mul(s),l=100,c=[];t.forEach(m=>{let h=Ie[m.conviction],b=r.includes(m.id.toString());b&&c.push(m.id.toString());let g=U(m.amount.toString()).mul(l).div(o);i=i.plus(Math.floor(g.mul(h).toNumber())),a=a.plus(Math.floor(g.mul(b?s:h).toNumber()))});let u=Math.floor(U(n.toString()).mul(s).mul(l).div(o).toNumber());r.forEach(m=>{c.includes(m)||(a=a.plus(u))});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,u,d,m,h,b]=await Promise.all([this.getPotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getTimePointsPerPeriod(),this.client.getTimePointsWeight(),this.client.getActionPointsWeight(),this.client.getSixBlockSince()]),g=U(l.transferable.toString()).minus(i.toString()),f=g.gt(0)&&s>0?$s(a.toString(),g.toString(),s.toString()):a.toString(),y=lr(c.toString(),n,b),S=lr(c.toString(),o.createdAt.toString(),b),P=zs(f,o.rewardPerStake.toString(),o.stake.toString()),T=this.getCurrentActionPoints(o.votes,o.actionPoints,o.stake,e),v=cr(S,y,d.toString(),m.toString(),T.currentActionPoints,h.toString(),o.accumulatedSlashPoints.toString()),B=ur(v,Ae,Oe),E=(()=>{if(!e.length)return;let xt=cr(S,y,d.toString(),m.toString(),T.maxActionPoints.toString(),h.toString(),o.accumulatedSlashPoints.toString());return ur(xt,Ae,Oe)})(),$=U(P).plus(o.accumulatedUnpaidRewards.toString()).plus(o.accumulatedLockedRewards.toString());if(U(y).minus(S).lte(u.toString()))return{rewards:"0",payablePercentage:B,extraPayablePercentage:E,constants:{a:Ae,b:Oe}};let z=Xs($.toString(),B),N=U(o.accumulatedLockedRewards.toString()),G=N.gt(z)?N:U(z);return{rewards:G.div(un).toString(),maxRewards:$.div(un).toString(),allocatedRewardsPercentage:G.div($).mul(100).toNumber(),points:v,payablePercentage:B,extraPayablePercentage:E,constants:{a:Ae,b:Oe}}}};var ee=class extends F{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 hr={};I(hr,{TxBuilderFactory:()=>vt});import{Enum as gr}from"polkadot-api";function dr(p){let t=[],e=p;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var Tt=class extends F{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new X(t),this.aaveUtils=new tt(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:ke})}async dryRun(t,e){let n=gr("Signed",t),r=gr("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=dr(s.value);throw new Error("Dry run execution error!",{cause:o})}return a}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var Be=class extends Tt{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn: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=k.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:V.build(n)}),await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=await this.dispatchWithExtraGas(c)),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],i=n[n.length-1],a=k.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:V.build(n)}),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=k.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:V.build(e)});return await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as mn}from"polkadot-api";var _e=class extends Tt{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn: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:mn("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=k.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:mn("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=k.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:mn("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 vt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new Be(this.client,this.evmClient).setTrade(t)}order(t){return new _e(this.client,this.evmClient).setOrder(t)}};async function my(p){let t=new lt(p),e=new Ft(p),[n,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),i=new bt(p,e).withAave().withOmnipool().withStableswap().withXyk(),a=new X(p),s=new ee(p),o=new Mt(p),l=new tt(e),c=new Pt(i),u=new St(c,{blockTime:n,minBudgetInNative:r}),d=new te(s,a),m=new Et(o,a,{blockTime:n});return{api:{aave:l,router:c,scheduler:u,staking:d,farm:m},client:{asset:new rt(p),balance:a,evm:e},ctx:{pool:i},tx:new vt(p,e),destroy:()=>{i.destroy()}}}export{pe as QueryBus,yn as aave,hn as api,me as async,k as calc,Sn as client,fn as const,my as createSdkContext,Tn as error,In as evm,kn as farm,x as fmt,Ct as json,D as math,tr as pool,ar as sor,pr as staking,hr as tx};
|