@galacticcouncil/sdk-next 0.23.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var Jn=Object.defineProperty;var A=(p,t)=>{for(var e in t)Jn(p,e,{get:t[e],enumerable:!0})};import Zn from"buffer";typeof window<"u"&&(window.Buffer=Zn.Buffer);var Qe={};A(Qe,{Papi:()=>C,getWs:()=>ai});import{hydration as ti}from"@galacticcouncil/descriptors";function je(p){switch(p){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(ti)}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 ei}from"polkadot-api/logs-provider";import{withLegacy as ni}from"@polkadot-api/legacy-provider";import{getWsProvider as ii}from"polkadot-api/ws-provider";var ai=(p,t={})=>{let e=typeof p=="string"?p.split(","):p,n=ii(e,{innerEnhancer:ni(),...t});return ei(i=>console.log(i),n),n};var Ze={};A(Ze,{AAVE_GAS_LIMIT:()=>Te,AAVE_LENDING_POOL_ADDRESS:()=>ne,AAVE_POOL_ABI:()=>Pe,AAVE_POOL_DATA_PROVIDER:()=>ee,AAVE_POOL_DATA_PROVIDER_ABI:()=>te,AAVE_POOL_PROXY:()=>Se,AAVE_ROUNDING_THRESHOLD:()=>ks,AAVE_UINT_256_MAX:()=>ri,AaveClient:()=>Tt,AaveUtils:()=>Z});var Pe=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"to",type:"address"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"interestRateMode",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"address",name:"onBehalfOf",type:"address"}],name:"borrow",outputs:[],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getUserAccountData",outputs:[{internalType:"uint256",name:"totalCollateralBase",type:"uint256"},{internalType:"uint256",name:"totalDebtBase",type:"uint256"},{internalType:"uint256",name:"availableBorrowsBase",type:"uint256"},{internalType:"uint256",name:"currentLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"ltv",type:"uint256"},{internalType:"uint256",name:"healthFactor",type:"uint256"}],stateMutability:"view",type:"function"}];var te=[{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 Se="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",ee="0x112b087b60C1a166130d59266363C45F8aa99db0",ne="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Te=1000000n,ks=5,ri=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Tt=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:te,address:ee,args:[ne],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:te,address:ee,args:[ne,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:Pe,address:Se,args:[t],functionName:"getUserAccountData"})}};import E from"big.js";import{big as J,erc20 as si,h160 as oi}from"@galacticcouncil/common";var{ERC20:et}=si,{H160:ve}=oi,li=1.01,ci=31536000n,Je=4,ie=-1,ae=10n**27n,Z=class{client;constructor(t){this.client=new Tt(t)}async getSummary(t){let e=ve.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,d,g,b]=a,h=J.toDecimal(b,18),f=[];for(let y of o){let S=y.underlyingAsset.toLowerCase(),P=s.find(({underlyingAsset:fe})=>fe.toLowerCase()===S);if(!P)throw new Error("Missing pool reserve for "+S);let T=y.scaledATokenBalance,v=P.liquidityIndex,_=P.liquidityRate,D=P.availableLiquidity,W=P.priceInMarketReferenceCurrency,X=r+6,L=this.calculateLinearInterest(_,P.lastUpdateTimestamp,X),K=v*L/ae,St=T*K/ae,Qt=Number(l!==0&&l===P.eModeCategoryId?P.eModeLiquidationThreshold:P.reserveLiquidationThreshold)/1e4,Jt=P.usageAsCollateralEnabled&&y.usageAsCollateralEnabledOnUser&&y.scaledATokenBalance>0n,Zt=et.toAssetId(S);f.push({aTokenBalance:St,availableLiquidity:D,decimals:Number(P.decimals),isCollateral:Jt,priceInRef:W,reserveId:Zt,reserveAsset:S,reserveLiquidationThreshold:Qt})}return{healthFactor:Number(h),currentLiquidationThreshold:Number(J.toDecimal(d,Je)),totalCollateral:c,totalDebt:u,reserves:f}}async hasBorrowPositions(t){let e=ve.fromAny(t),n=await this.client.getUserAccountData(e),[i,a]=n;return a>0n}async getHealthFactor(t){let e=ve.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 ie;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:d}=l,g=J.toBigInt(n,c),b=u?g*m/10n**BigInt(c):0n,h=i-b;if(h<=0n)return 0;let f=E(i.toString()).mul(s).minus(E(b.toString()).mul(d)).div(h.toString()),y=E(h.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 ie;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),b=i+g;if(b<=0n)return 0;let h=E(i.toString()).mul(s).plus(E(g.toString()).mul(m)).div(b.toString()),f=E(b.toString()).mul(h).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 ie;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 d=J.toBigInt(e,u.decimals),g=J.toBigInt(i,m.decimals),b=d*u.priceInRef/10n**BigInt(u.decimals),h=g*m.priceInRef/10n**BigInt(m.decimals),f=u.isCollateral?E(b.toString()).mul(u.reserveLiquidationThreshold):E(0),P=E(h.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-li;if(m>0){let d=E(m).mul(e.toString()).div(o).toFixed(0,E.roundDown),g=E(d).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 ae;let a=t*BigInt(i)/ci;return ae+a}calculateHealthFactorFromBalances(t,e,n){if(t===0n)return ie;let i=e*n/t,a=J.toDecimal(i,Je);return Number(a)}};var nn={};A(nn,{AssetClient:()=>nt,BalanceClient:()=>Y,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),d=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",d.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:b}=await this.mapToken(g,e,n);return[g,b]})),m=Object.fromEntries(u),d=Object.values(m);return{id:t,name:d.join(", "),symbol:s?.asText()||r?.asText(),decimals:18,icon:d.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,d;switch(m.type){case"Bond":let g=r.get(l);d=await this.mapBond(l,c,s,g);break;case"StableSwap":let b=a.get(l);d=await this.mapShares(l,c,s,b);break;case"External":d=await this.mapExternal(l,c,e,u);break;default:d=await this.mapToken(l,c,s,u)}o.push(d)}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 pi,bufferCount as di,combineLatest as gi,debounceTime as hi,distinctUntilChanged as en,finalize as bi,map as rt,pairwise as yi,shareReplay as fi,startWith as Pi}from"rxjs";var tn={};A(tn,{HUB_ASSET_ID:()=>vt,HYDRATION_OMNIPOOL_ADDRESS:()=>mi,HYDRATION_PARACHAIN_ID:()=>ui,PERBILL_DENOMINATOR:()=>xe,PERMILL_DENOMINATOR:()=>it,SYSTEM_ASSET_DECIMALS:()=>we,SYSTEM_ASSET_ID:()=>O,TRADEABLE_DEFAULT:()=>at});var it=1e6,xe=1e9,O=0,we=12,ui=2034,mi="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",vt=1,at=15;var Y=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 gi([e,n,i]).pipe(hi(250),rt(a=>a.flat()),Pi([]),di(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(en((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 pi,i=n.pipe(fi(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 d=>{let g=await this.getTokenBalanceData(t,d);return[d,g]}))).map(([d,g])=>({id:d,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(bi(()=>s?.()),yi(),rt(([o,l],c)=>c===0?l.filter(u=>u.balance.transferable>0n):this.getDeltas(o,l)),en((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 an={};A(an,{AssetNotFound:()=>Ie,PoolNotFound:()=>xt,RouteNotFound:()=>wt});var Ie=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},xt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},wt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var ln={};A(ln,{EvmClient:()=>At,EvmRpcAdapter:()=>It,createChain:()=>Ae});import{Binary as Si,CompatibilityLevel as Ti,FixedSizeBinary as rn}from"polkadot-api";import{hydration as vi}from"@galacticcouncil/descriptors";import{encodeFunctionData as xi,decodeFunctionResult as wi}from"viem";var Ii=10000000n,It=class{api;constructor(t){this.api=t.getTypedApi(vi)}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=xi({abi:e,functionName:i,args:a}),s=this.api.apis.EthereumRuntimeRPCApi.call,o=await this.api.compatibilityToken,l=s.isCompatible(Ti.BackwardsCompatible,o);console.log(l);let c=await this.api.apis.EthereumRuntimeRPCApi.call(rn.fromText(""),rn.fromHex(n),Si.fromHex(r),[0n,0n,0n,0n],[Ii,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:d}=c.value;if(console.log(d),u.type==="Succeed")return wi({abi:e,functionName:i,data:m.asHex()});throw console.log(i,u.type,u.value.type),new Error("Contract read error")})};import{defineChain as Ai}from"viem";var Oi=["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"],Ae=()=>Ai({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Oi}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});import{createPublicClient as sn,createWalletClient as Bi,custom as on,http as _i}from"viem";var At=class{client;chain;constructor(t){this.client=t,this.chain=Ae()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return sn({chain:this.chain,transport:_i()})}getWsProvider(){return sn({transport:on({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return Bi({account:t,chain:this.chain,transport:on(window.ethereum)})}getRPCAdapter(){return new It(this.client)}};var hn={};A(hn,{LiquidityMiningApi:()=>_t,LiquidityMiningClient:()=>Ft});import{AccountId as Yi}from"polkadot-api";import M from"big.js";import{HYDRATION_SS58_PREFIX as Xi,RUNTIME_DECIMALS as Bt}from"@galacticcouncil/common";import{fixed_from_rational as gn}from"@galacticcouncil/math-liquidity-mining";var x={};A(x,{FeeUtils:()=>Oe,shiftNeg:()=>Ri});import Fi from"big.js";var Oe=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 i=10**n;return Math.round(t*i/e)/i}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Ri(p,t){let e=Fi(typeof p=="bigint"?p.toString():p);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Ot={};A(Ot,{findNestedKey:()=>Ci,findNestedObj:()=>Ei,jsonFormatter:()=>ki});var Ci=(p,t)=>{let e=[];return JSON.stringify(p,(n,i)=>(i&&i[t]&&e.push(i),i)),e[0]},Ei=(p,t,e)=>{let n;return JSON.stringify(p,(i,a)=>(a&&a[t]===e&&(n=a),a)),n},ki=(p,t)=>typeof t=="bigint"?t.toString():t;var I={};A(I,{calculateBuyFee:()=>qi,calculateDiffToAvg:()=>Di,calculateDiffToRef:()=>Mi,calculateSellFee:()=>Li,getFraction:()=>Hi});import z from"big.js";function Di(p,t){let e=z(p.toString()),n=z(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Mi(p,t){if(t===0n)return 0;let e=z(p.toString()),n=z(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Li(p,t){if(p===0n)return 0;let e=z(p.toString()),n=z(t.toString());return z(1).minus(n.div(e)).mul(100).round(2).toNumber()}function qi(p,t){if(p===0n)return 0;let e=z(p.toString());return z(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Hi(p,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 p*i/BigInt(100*n)}import{TLRUCache as cn}from"@thi.ng/cache";var re=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 cn(null,{ttl:i}):new cn;return{get:(...c)=>{let u=n(...c);if(a.has(u)){this.log("[live]",t,u);let d=a.get(u);return Promise.resolve(d)}if(r.has(u))return this.log("[memo]",t,u),r.get(u);this.log("[fetch]",t,u);let m=e(...c).catch(d=>{throw r.delete(u),d});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 se=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let n=0;n<t.length;++n){let[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 Ni,calculate_global_farm_rewards as Gi,calculate_loyalty_multiplier as Vi,calculate_user_reward as dn,calculate_yield_farm_delta_rpvs as Ui}from"@galacticcouncil/math-liquidity-mining";import un from"big.js";var Be=un(10).pow(18),mn=BigInt(un(1).pow(18).toString()),pn=6e3;var Wi="1000000000000000000",oe=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(Gi(t.total_shares_z.toString(),n.toString(),tt(t.yield_per_period.toString()).mul(Be).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(Ni(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=Ui(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(Be).round(0,tt.roundDown).toString();if(!e)return n;let{initial_reward_percentage:i,scale_coef:a}=e;return Vi(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(dn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),u)),d=BigInt(dn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),Wi));return{reward:m,maxReward:d,assetId:s.reward_currency,yieldFarmId:o.id,isActiveFarm:o.state.type==="Active"}}};var Ki=M(365.2425).times(24).times(60).times(60),_t=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??pn})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((a,r)=>a-r);if(t===e)return mn;let i=await this.client.getOraclePrice(n);if(i){let{n:a,d:r}=i[0].price,s;return t<e?s=gn(a.toString(),r.toString()):s=gn(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 Yi(Xi).dec(o)};getGlobalRewardPerPeriod(t,e,n,i){let a=M(i).times(t.toString()).times(e.toString()).div(Math.pow(10,Bt));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:d,max_reward_per_period:g,pending_rewards:b,accumulated_paid_rewards:h,planned_yielding_periods:f,updated_at:y,incentivized_asset:S,reward_currency:P,price_adjustment:T,min_deposit:v}=a,_=x.shiftNeg(r??T,Bt),D=x.shiftNeg(l,Bt),W=x.shiftNeg(c?.initial_reward_percentage??0,Bt),X=Ki.div(M(this.blockTime).div(1e3).times(u)).toString(),L;if(d<=0)L=M(D).times(m.toString()).times(X).toString();else{let jn=this.getGlobalRewardPerPeriod(d,m,g,_),Qn=this.getPoolYieldPerPeriod(jn,D,d,_);L=M(Qn).times(X).toString()}let K=b+h,St=g*BigInt(f),jt=s.transferable+K,ze=jt-K,Qt=M(ze.toString()).div(g.toString()),Jt=M(e).div(u.toString()).toString(),Zt=(d>=0?Qt.plus(y):Qt.plus(Jt)).toString(),fe=M(Zt).times(u).toString(),zn=M(d.toString()).div(M(g.toString()).div(m.toString())).div(Math.pow(10,Bt)).times(100).times(_).toFixed(2),$e=M(K.toString()).div(jt.toString()).gte(.999);L=$e?"0":M(L).div(n?2:1).times(100).toString();let $n=W?M(L).times(W).toString():void 0;return{apr:L,minApr:$n,isDistributed:$e,estimatedEndPeriod:Zt,estimatedEndBlock:fe,maxRewards:St,incentivizedAsset:S,rewardCurrency:P,loyaltyCurve:c,currentPeriod:Jt,potMaxRewards:jt,fullness:zn,yieldFarmId:i.id,globalFarmId:a.id,poolId:o,distributedRewards:K,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,d=this.getFarmAddress(s),g=await this.getOraclePrice(u,m),b=await this.balanceClient.getBalance(d,u);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b}}));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,d=this.getFarmAddress(s,!0),g=await this.getOraclePrice(u,m),b=await this.balanceClient.getBalance(d,u);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b,farmAddress:d}}));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),d=await this.getOraclePrice(l,c),g=new se(u,m),h=await new oe(y=>this.getFarmAddress(y),y=>this.client.getAsset(y),g).claimRewards(o,s,e,i,d??o.price_adjustment);if(!h)return;let f=await this.client.getAsset(h.assetId);if(f&&!(h.reward<=f.existential_deposit))return h}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 $i}from"polkadot-api";var Ft=class extends C{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(zi.fromText("omnipool"),t,$i("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 Cn={};A(Cn,{PoolContextProvider:()=>gt,PoolError:()=>j,PoolFactory:()=>pt,PoolType:()=>B,aave:()=>Me,hsm:()=>Ne,lbp:()=>_e,omni:()=>Re,stable:()=>Ee,xyk:()=>ke});var _e={};A(_e,{LbpMath:()=>V,LbpPool:()=>Rt,LbpPoolClient:()=>Ct});import{calculate_in_given_out as ji,calculate_out_given_in as Qi,calculate_linear_weights as Ji,calculate_pool_trade_fee as Zi,get_spot_price as ta}from"@galacticcouncil/math-lbp";var V=class{static getSpotPrice(t,e,n,i,a){return ta(t,e,n,i,a)}static calculateInGivenOut(t,e,n,i,a){return ji(t,e,n,i,a)}static calculateOutGivenIn(t,e,n,i,a){return Qi(t,e,n,i,a)}static calculateLinearWeights(t,e,n,i,a){return Ji(t,e,n,i,a)}static calculatePoolTradeFee(t,e,n){return Zi(t,e,n)}};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:bn}=x,Rt=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(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=bn.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=bn.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=V.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=V.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=V.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=V.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=V.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 Sa}from"polkadot-api";import{Subscription as Ta,distinctUntilChanged as va,filter as xa}from"rxjs";import{memoize1 as na}from"@thi.ng/memoize";import{TLRUCache as ia}from"@thi.ng/cache";import{ReplaySubject as aa,Subscription as ra,bufferCount as sa,combineLatest as yn,debounceTime as oa,defer as la,filter as ca,finalize as ua,from as ma,map as ot,merge as pa,of as da,pairwise as ga,skip as ha,share as ba,startWith as ya,switchMap as fa,tap as fn,throttleTime as Pa}from"rxjs";import{BehaviorSubject as ea}from"rxjs";var le=class{store$=new ea([]);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 q=class extends Y{evm;store=new le;shared$;mem=0;memPoolsCache=new ia(null,{ttl:6*1e3});memPools=na(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(ya([]),sa(2,1),ot(([t,e])=>t.length===0?e:this.store.applyChangeset(e)),ca(t=>t.length>0),Pa(1e3,void 0,{leading:!0,trailing:!0}))}subscribeStore(){return la(()=>{let t=new ra;return ma(this.getMemPools()).pipe(ot(n=>n.filter(i=>this.hasValidAssets(i))),fn(n=>this.store.set(n))).pipe(fn(()=>{t.add(this.subscribeBalances()),t.add(this.subscribeUpdates())}),fa(n=>pa(da(n),this.store.asObservable().pipe(ha(1)))),ua(()=>{t.unsubscribe()}))}).pipe(ba({connector:()=>new aa(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 yn(i).pipe(ot(a=>a.flat()),ga(),ot(([a,r])=>this.getDeltas(a,r)),ot(a=>[n,a]))});return yn(t).pipe(oa(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 Ct=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:i,initial_weight:a,final_weight:r}=t,s=V.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(Sa.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,d,g,b]=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:d?.decimals,existentialDeposit:d?.existential_deposit,balance:m.transferable,weight:s,type:d?.asset_type.type},{id:c,decimals:b?.decimals,existentialDeposit:b?.existential_deposit,balance:g.transferable,weight:o,type:b?.asset_type.type}]}}isActivePool(t,e){let{start:n,end: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(xa(t=>t!==void 0),va((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,d]=i.tokens,g=[{...m,weight:c},{...d,weight:u}],b=await this.isRepayFeeApplied(l,s,o.toString());n.push({...i,tokens:g,repayFeeApply:b})}}return n})})}subscribeUpdates(){let t=new Ta;return t.add(this.subscribeValidationData()),t}};var Re={};A(Re,{OmniMath:()=>w,OmniPool:()=>Et,OmniPoolClient:()=>kt});import{calculate_in_given_out as wa,calculate_lrna_in_given_out as Ia,calculate_out_given_in as Aa,calculate_out_given_lrna_in as Oa,calculate_spot_price as Ba,calculate_lrna_spot_price as _a,calculate_shares as Fa,calculate_liquidity_out as Ra,calculate_liquidity_lrna_out as Ca,verify_asset_cap as Ea,calculate_liquidity_hub_in as ka,is_sell_allowed as Da,is_buy_allowed as Ma,is_add_liquidity_allowed as La,is_remove_liquidity_allowed as qa,recalculate_asset_fee as Ha,recalculate_protocol_fee as Na}from"@galacticcouncil/math-omnipool";import lt from"big.js";var w=class{static calculateSpotPrice(t,e,n,i){return Ba(t,e,n,i)}static calculateLrnaSpotPrice(t,e){return _a(t,e)}static calculateInGivenOut(t,e,n,i,a,r,s,o,l){return wa(t,e,n,i,a,r,s,o,l)}static calculateLrnaInGivenOut(t,e,n,i,a){return Ia(t,e,n,i,a)}static calculateOutGivenIn(t,e,n,i,a,r,s,o,l){return Aa(t,e,n,i,a,r,s,o,l)}static calculateOutGivenLrnaIn(t,e,n,i,a){return Oa(t,e,n,i,a)}static calculateShares(t,e,n,i){return Fa(t,e,n,i)}static calculateLiquidityOut(t,e,n,i,a,r,s,o){return Ra(t,e,n,i,a,r,s,o)}static calculateLiquidityLRNAOut(t,e,n,i,a,r,s,o){return Ca(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),d=a.times(lt(1).minus(c));return m.div(d).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,n,i){return ka(t,e,n,i)}static isSellAllowed(t){return Da(t)}static isBuyAllowed(t){return Ma(t)}static isAddLiquidityAllowed(t){return La(t)}static isRemoveLiquidityAllowed(t){return qa(t)}static recalculateAssetFee(t,e,n,i,a,r,s,o,l,c,u){return Ha(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 Na(t,e,n,i,a,r,s,o,l,c,u)}static verifyAssetCap(t,e,n,i){return Ea(t,e,n,i)}};import{RUNTIME_DECIMALS as ce}from"@galacticcouncil/common";var{FeeUtils:ct}=x,Et=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(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()),n=Math.pow(10,ce-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=w.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,ce-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=w.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,ce-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=w.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,ce-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as Ga,Binary as Va,CompatibilityLevel as Ua,Enum as Wa}from"polkadot-api";import{toHex as Ya}from"@polkadot-api/utils";import{Subscription as Xa,distinctUntilChanged as Fe,filter as Ka,finalize as ut,map as za,merge as $a}from"rxjs";import{HYDRATION_SS58_PREFIX as ja}from"@galacticcouncil/common";var{FeeUtils:F}=x,Pn=Va.fromText("omnipool"),Sn=Wa("Short"),kt=class extends q{queryBus=new re;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(Pn,t,Sn,{at:"best"}),t=>t.join(":"),6*1e3);getPoolType(){return"Omnipool"}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=Ya(e);return Ga(ja).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(Ua.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:d,shares:g,tradable:b,cap:h,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:h,hubReserves:d,protocolShares:f,shares:g,tradeable:b,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:F.fromPermill(y),protocolFee:F.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),[d,g,b]=n===1?[0,0,0]:await this.getProtocolFee(t,this.block,s,l,i?.value.protocol_fee_params),h=c+d,f=m+b;return{assetFee:F.fromPermill(u),protocolFee:F.fromPermill(g),min:F.fromPermill(h),max:F.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=F.fromPermill(o),d=F.fromPermill(l),[g]=i,{asset_fee:b,timestamp:h}=n,f=Math.max(1,e-h),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=F.fromPermill(b),v=w.recalculateAssetFee(y,S,P,"9",s.toString(),F.toRaw(T).toString(),f.toString(),F.toRaw(m).toString(),F.toRaw(d).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=F.fromPermill(o),d=F.fromPermill(l),[g]=i,{protocol_fee:b,timestamp:h}=n,f=Math.max(1,e-h),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=F.fromPermill(b),v=w.recalculateProtocolFee(y,S,P,"9",s.toString(),F.toRaw(T).toString(),f.toString(),F.toRaw(m).toString(),F.toRaw(d).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(Pn,i,Sn,"best").pipe(Ka(a=>a!==void 0),za(a=>({pair:i,value:a}))));return $a(...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 Xa;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 Ee={};A(Ee,{StableMath:()=>k,StableSwap:()=>Q,StableSwapClient:()=>Dt});import{calculate_in_given_out as Qa,calculate_out_given_in as Ja,calculate_amplification as Za,calculate_add_one_asset as tr,calculate_liquidity_out_one_asset as er,calculate_shares as nr,calculate_shares_for_amount as ir,calculate_spot_price_with_fee as ar,pool_account_name as rr,recalculate_peg as sr}from"@galacticcouncil/math-stableswap";var k=class{static getPoolAddress(t){return rr(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 Za(t,e,n,i,a)}static calculateInGivenOut(t,e,n,i,a,r,s){return Qa(t,e,n,i,a,r,s)}static calculateAddOneAsset(t,e,n,i,a,r,s){return tr(t,e,n,i,a,r,s)}static calculateSharesForAmount(t,e,n,i,a,r,s){return ir(t,e,n,i,a,r,s)}static calculateOutGivenIn(t,e,n,i,a,r,s){return Ja(t,e,n,i,a,r,s)}static calculateLiquidityOutOneAsset(t,e,n,i,a,r,s){return er(t,e,n,i,a,r,s)}static calculateShares(t,e,n,i,a,r){return nr(t,e,n,i,a,r)}static calculateSpotPriceWithFee(t,e,n,i,a,r,s,o){return ar(t,e,n,i,a,r,s,o)}static recalculatePegs(t,e,n,i,a,r){let s=sr(t,e,n,i,a,r);return JSON.parse(s)}};import{RUNTIME_DECIMALS as Tn}from"@galacticcouncil/common";var{FeeUtils:mt}=x,Q=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(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=k.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=k.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=k.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=k.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let i=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(i)}let n=Math.pow(10,Tn-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let i=k.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=k.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=k.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=k.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let i=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(i)}let n=Math.pow(10,Tn-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:i})=>({asset_id:e,amount:n,decimals:i}));return JSON.stringify(t,Ot.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],Ot.jsonFormatter)}};import{AccountId as or,CompatibilityLevel as lr}from"polkadot-api";import{toHex as cr}from"@polkadot-api/utils";import{blake2b as ur}from"@noble/hashes/blake2b";import{Subscription as mr,distinctUntilChanged as pr,finalize as Ce,map as dr,merge as gr}from"rxjs";import{HYDRATION_SS58_PREFIX as hr,RUNTIME_DECIMALS as br}from"@galacticcouncil/common";var{FeeUtils:yr}=x,Dt=class extends q{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=k.getPoolAddress(t),n=ur(e,{dkLen:32}),i=cr(n);return or(hr).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=k.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(lr.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),d=c?this.getRecentPegs(c):this.getDefaultPegs(r);return l.push({id:s,tradeable:15,balance:u,decimals:br}),this.poolsData.set(s,r),{address:o,id:s,type:"Stableswap",fee:yr.fromPermill(r.fee),tokens:l,totalIssuance:u,pegs:d,...n,...m}});return Promise.all(i)}async getPoolFees(t,e){return{fee:this.store.pools.find(i=>i.address===e).fee}}getDefaultPegs(t){return k.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(dr(i=>({id:n,value:i}))));return gr(...e).pipe(Ce(()=>{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),Ce(()=>{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(Ce(()=>{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 mr;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 ke={};A(ke,{XykMath:()=>$,XykPool:()=>Mt,XykPoolClient:()=>Lt});import{calculate_in_given_out as fr,calculate_out_given_in as Pr,calculate_pool_trade_fee as Sr,get_spot_price as Tr,calculate_liquidity_in as vr,calculate_shares as xr,calculate_spot_price as wr,calculate_spot_price_with_fee as Ir,calculate_liquidity_out_asset_a as Ar,calculate_liquidity_out_asset_b as Or}from"@galacticcouncil/math-xyk";var $=class{static getSpotPrice(t,e,n){return Tr(t,e,n)}static calculateInGivenOut(t,e,n){return fr(t,e,n)}static calculateOutGivenIn(t,e,n){return Pr(t,e,n)}static calculatePoolTradeFee(t,e,n){return Sr(t,e,n)}static calculateLiquidityIn(t,e,n){return vr(t,e,n)}static calculateSpotPrice(t,e){return wr(t,e)}static calculateSpotPriceWithFee(t,e,n,i){return Ir(t,e,n,i)}static calculateShares(t,e,n){return xr(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,i){return Ar(t,e,n,i)}static calculateLiquidityOutAssetB(t,e,n,i){return Or(t,e,n,i)}};import{RUNTIME_DECIMALS as vn}from"@galacticcouncil/common";var{FeeUtils:xn}=x,Mt=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(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=xn.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=xn.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()),n=Math.pow(10,vn-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=$.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,vn-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=$.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Br}from"polkadot-api";import{Subscription as _r}from"rxjs";var Lt=class extends q{decimals=new Map([]);getPoolType(){return"XYK"}async withOverride(t){this.decimals=t?new Map(t.map(e=>[e.id,e.decimals])):new Map}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(Br.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 _r.EMPTY}};var Me={};A(Me,{AavePool:()=>qt,AavePoolClient:()=>Ht});var qt=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(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){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};import{AccountId as Fr}from"polkadot-api";import{toHex as Rr}from"@polkadot-api/utils";import{Subscription as In,filter as De,finalize as An,map as On}from"rxjs";import{decodeEventLog as Cr}from"viem";import{erc20 as Er,HYDRATION_SS58_PREFIX as kr}from"@galacticcouncil/common";var wn=[{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:Dr}=Er,Mr=["Supply","Withdraw","Repay","Borrow"],Ht=class extends q{getPoolType(){return"Aave"}async isSupported(){return!0}getPoolId(t,e){let n=t+"/"+e,i=new TextEncoder().encode(n.padEnd(32,"\0")),a=Rr(i);return Fr(kr).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 Dr.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}=Cr({abi:wn,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(On(({payload:n})=>this.parseRouterLog(n)),De(({assetIn:n,assetOut:i})=>e.includes(n)||e.includes(i)),An(()=>{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(On(({payload:t})=>this.parseEvmLog(t)),De(t=>t!==void 0),De(({eventName:t})=>Mr.includes(t)),An(()=>{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 In.EMPTY}subscribeUpdates(){let t=new In;return t.add(this.subscribeRouterExecuted()),t.add(this.subscribeEvmLog()),t}};var pt=class{static get(t){switch(t.type){case"Aave":return qt.fromPool(t);case"XYK":return Mt.fromPool(t);case"Omnipool":return Et.fromPool(t);case"LBP":return Rt.fromPool(t);case"Stableswap":return Q.fromPool(t);case"HSM":return Q.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as es,Subscription as dt,takeUntil as ns}from"rxjs";var Ne={};A(Ne,{HsmMath:()=>U,HsmPool:()=>Le,HsmPoolClient:()=>Ut});import{calculate_collateral_in_given_hollar_out as Lr,calculate_collateral_out_given_hollar_in as qr,calculate_hollar_in_given_collateral_out as Hr,calculate_hollar_out_given_collateral_in as Nr,calculate_imbalance as Gr,calculate_max_price as Vr,calculate_buyback_limit as Ur,calculate_buyback_price_with_fee as Wr}from"@galacticcouncil/math-hsm";var U=class{static calculateCollateralInGivenHollarOut(t,e,n){return Lr(t,e,n)}static calculateCollateralOutGivenHollarIn(t,e,n){return qr(t,e,n)}static calculateHollarOutGivenCollateralIn(t,e,n){return Nr(t,e,n)}static calculateHollarInGivenCollateralOut(t,e,n){return Hr(t,e,n)}static calculateImbalance(t,e,n){return Gr(t,e,n)}static calculateBuybackLimit(t,e){return Ur(t,e)}static calculateBuybackPriceWithFee(t,e,n){return Wr(t,e,n)}static calculateMaxPrice(t,e){return Vr(t,e)}};import{big as ue,RUNTIME_DECIMALS as Yr}from"@galacticcouncil/common";var{FeeUtils:Nt}=x,Le=class p extends Q{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,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=U.calculateHollarInGivenCollateralOut(e.toString(),n.toString(),Nt.toRaw(this.buyBackFee).toString());return BigInt(i)}calculateCollateralInGivenHollarOut(t){let e=this.getCollateralPeg(),n=U.calculateCollateralInGivenHollarOut(t.toString(),JSON.stringify(e),Nt.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=U.calculateCollateralOutGivenHollarIn(e.toString(),n.toString(),Nt.toRaw(this.buyBackFee).toString());return BigInt(i)}calculateHollarOutGivenCollateralIn(t){let e=this.getCollateralPeg(),n=U.calculateHollarOutGivenCollateralIn(t.toString(),JSON.stringify(e),Nt.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=U.calculateImbalance(t.balanceIn.toString(),JSON.stringify(e),t.balanceOut.toString());return BigInt(n)}calculateBuybackLimit(t){let e=this.calculateImbalance(t),n=U.calculateBuybackLimit(e.toString(),Nt.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=U.calculateMaxPrice(JSON.stringify(e),this.maxBuyPriceCoefficient.toString()),[i,a]=JSON.parse(n),r=10n**BigInt(Yr-t.decimalsOut);return BigInt(i)*r/BigInt(a)}spotPriceInGivenOut(t){let e=ue.toBigInt(1,t.decimalsOut);return this.calculateInGivenOut(t,e)}spotPriceOutGivenIn(t){let e=ue.toBigInt(1,t.decimalsIn);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)?[ue.toBigInt(1,18).toString(),ue.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 Xr,CompatibilityLevel as Kr}from"polkadot-api";import{toHex as zr}from"@polkadot-api/utils";import{Subscription as Bn,combineLatest as $r,filter as _n,finalize as Fn,map as qe,pairwise as jr}from"rxjs";import{decodeEventLog as Qr}from"viem";import{h160 as Jr,HYDRATION_SS58_PREFIX as Zr}from"@galacticcouncil/common";var Gt=[{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 Vt=class{client;constructor(t){this.client=t.getWsProvider()}async getFacilitatorCapacity(t,e){let[n,i]=await this.client.readContract({abi:Gt,address:t,functionName:"getFacilitatorBucket",args:[e]});return n-i}};var{FeeUtils:He}=x,{H160:Rn}=Jr,ts=["FacilitatorBucketCapacityUpdated","FacilitatorBucketLevelUpdated"],Ut=class extends q{ghoClient;stableClient;constructor(t,e,n){super(t,e),this.stableClient=n,this.ghoClient=new Vt(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=zr(n);return Xr(Zr).dec(i)}async isSupported(){let t=this.api.query.HSM.Collaterals,e=await this.api.compatibilityToken;return t.isCompatible(Kr.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=Rn.fromAny(a),s=this.getHollarAddress(e),o=await this.ghoClient.getFacilitatorCapacity(s,r),l=n.map(async({keyArgs:u,value:m})=>{let[d]=u,{pool_id:g,max_buy_price_coefficient:b,max_in_holding:h,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,d);return{...P,address:T,type:"HSM",tokens:P.tokens.filter(_=>_.id!==g),hsmAddress:a,hsmMintCapacity:o,hollarId:t,hollarH160:s,collateralId:d,collateralBalance:v.transferable,maxBuyPriceCoefficient:b,maxInHolding:h,purchaseFee:He.fromPermill(f),buyBackFee:He.fromPermill(y),buyBackRate:He.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}=Qr({abi:Gt,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(qe(({payload:t})=>this.parseEvmLog(t)),_n(t=>t!==void 0),_n(({eventName:t})=>ts.includes(t)),Fn(()=>{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=Rn.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?$r(i).pipe(qe(a=>a.flat()),jr(),qe(([a,r])=>this.getDeltas(a,r)),Fn(()=>{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})}):Bn.EMPTY}subscribeUpdates(){let t=new Bn;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 es;constructor(t,e){super(t),this.evm=e,this.aave=new Ht(t,e),this.omnipool=new kt(t,e),this.stableswap=new Dt(t,e),this.hsm=new Ut(t,e,this.stableswap),this.xyk=new Lt(t,e),this.lbp=new Ct(t,e),this.clients=[this.aave,this.omnipool,this.stableswap,this.hsm,this.xyk,this.lbp]}subscribe(t){return t.getSubscriber().pipe(ns(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 xt(e.type)}};var Ln={};A(Ln,{DEFAULT_BLOCK_TIME:()=>kn,DEFAULT_MIN_BUDGET:()=>Ue,ORDER_MIN_BLOCK_PERIOD:()=>Dn,Router:()=>ht,TWAP_BLOCK_PERIOD:()=>Kt,TWAP_MAX_DURATION:()=>Ye,TWAP_MAX_PRICE_IMPACT:()=>We,TWAP_TX_MULTIPLIER:()=>vg,TradeOrderError:()=>Ve,TradeOrderType:()=>pe,TradeRouteBuilder:()=>N,TradeRouter:()=>bt,TradeScheduler:()=>yt,TradeType:()=>me});var Wt=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 is=10,Yt=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 Wt,r=[];for(r.push([e,""]),a.enqueue(r);a.size()>0;){let s=a.dequeue();if(!s||s.length>is)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 Wt,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 Ge(p){let t={};for(let e of p){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 Xt=class{getProposals(t,e,n){let i=n.filter(h=>h.type==="XYK"),a=n.filter(h=>h.type!=="XYK"),r=new Set(a.map(h=>h.tokens).flat().map(h=>h.id)),s=r.has(t),o=r.has(e),l=new Yt,c=h=>{let f=Ge(h),y=Object.keys(f),S=y.flatMap(P=>f[P]);return l.buildAndPopulateGraph(y,S)};if(!s&&!o){let h=i.filter(S=>S.tokens.find(P=>P.id===t)||S.tokens.find(P=>P.id===e)),f=c(h),y=l.findPaths(f,t,e);return this.parsePaths(y)}if(s&&o){let h=c(a),f=l.findPaths(h,t,e);return this.parsePaths(f)}let u=s?e:t,m=i.filter(h=>h.tokens.some(f=>f.id===u));if(m.length===0)return[];let d=[...a,...m],g=c(d),b=l.findPaths(g,t,e);return this.parsePaths(b)}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 ht=class{routeSuggester;routeProposals;ctx;filter={};constructor(t){this.ctx=t,this.routeSuggester=new Xt,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 R}from"@galacticcouncil/common";var me=(e=>(e.Buy="Buy",e.Sell="Sell",e))(me||{}),pe=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(pe||{}),Ve=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Ve||{});var{FeeUtils:En}=x,bt=class extends ht{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 wt(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?En.toPct(t.min):void 0,n=t.max?En.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetOutDecimals).reduce((s,o)=>s+o),i=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),a=n-e.assetOutDecimals,r=Math.pow(10,a);return i/BigInt(r)}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=Math.pow(10,n.assetInDecimals),d=n.amountIn*r/BigInt(m),g=I.calculateDiffToRef(o,d);return{type:"Sell",amountIn:n.amountIn,amountOut:i.amountOut,spotPrice:r,tradeFee:l,tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:R.toDecimal(n.amountIn,n.assetInDecimals),amountOut:R.toDecimal(i.amountOut,i.assetOutDecimals),spotPrice:R.toDecimal(r,i.assetOutDecimals),tradeFee:R.toDecimal(l,i.assetOutDecimals),tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}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(b=>b.tokens.some(h=>h.id===t)).map(b=>b.type==="Aave"?b.tokens:b.tokens.filter(h=>h.id===t)).map(b=>b.map(h=>h.balance).reduce((h,f)=>h+f)).sort((b,h)=>h<b?-1:1)[0],c=I.getFraction(l,.1),u=await Promise.all(i.map(b=>this.toSellSwaps(c,b,r))),d=this.findBestSellRoute(u).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),g=this.buildRouteKey(t,e,a);return this.mlr.set(g,d),d}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"?R.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(o,s),{amountOut:u,calculatedOut:m,feePct:d,errors:g}=s.validateAndSell(o,l,c),b=this.getPoolFeeRange(c),h=s.spotPriceOutGivenIn(o),f=Math.pow(10,o.decimalsIn),y=l*h/BigInt(f),S=I.calculateDiffToRef(m,y);i.push({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:u,calculatedOut:m,spotPrice:h,tradeFeePct:d,tradeFeeRange:b,priceImpactPct:S,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:R.toDecimal(l,o.decimalsIn),amountOut:R.toDecimal(u,o.decimalsOut),calculatedOut:R.toDecimal(m,o.decimalsOut),spotPrice:R.toDecimal(h,o.decimalsOut),tradeFeePct:d,tradeFeeRange:b,priceImpactPct:S,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),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}}).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];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetInDecimals).reduce((s,o)=>s+o),i=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),a=n-e.assetInDecimals,r=Math.pow(10,a);return i/BigInt(r)}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=Math.pow(10,n.assetOutDecimals),d=n.amountOut*r/BigInt(m),g;return o===0n?g=-100:g=I.calculateDiffToRef(d,o),{type:"Buy",amountOut:n.amountOut,amountIn:i.amountIn,spotPrice:r,tradeFee:l,tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:R.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:R.toDecimal(i.amountIn,i.assetInDecimals),spotPrice:R.toDecimal(r,i.assetInDecimals),tradeFee:R.toDecimal(l,i.assetInDecimals),tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.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"?R.toBigInt(t,o.decimalsOut):t:l=i[0].amountIn;let c=await this.ctx.getPoolFees(o,s),{amountIn:u,calculatedIn:m,feePct:d,errors:g}=s.validateAndBuy(o,l,c),b=this.getPoolFeeRange(c),h=s.spotPriceInGivenOut(o),f=Math.pow(10,o.decimalsOut),y=l*h/BigInt(f),S;m===0n?S=-100:S=I.calculateDiffToRef(y,m),i.unshift({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:u,calculatedIn:m,spotPrice:h,tradeFeePct:d,tradeFeeRange:b,priceImpactPct:S,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:R.toDecimal(l,o.decimalsOut),amountIn:R.toDecimal(u,o.decimalsIn),calculatedIn:R.toDecimal(m,o.decimalsIn),spotPrice:R.toDecimal(h,o.decimalsIn),tradeFeePct:d,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return i}};import{big as H}from"@galacticcouncil/common";var kn=6e3,Ue=1000000000000000n,Kt=6,We=-5,Ye=216e5,vg=3,Dn=6;import{Enum as Mn}from"polkadot-api";var N=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:i,poolId:a})=>i==="Stableswap"?{pool:Mn("Stableswap",a),asset_in:e,asset_out:n}:{pool:Mn(i),asset_in:e,asset_out:n})}};var yt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Ue})}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:d}=u,{assetOutDecimals:g}=m,b=Math.abs(c),h=this.getMaximumTradeCount(o,r),f=this.getOptimalTradeCount(b),y=a||f,S=o/BigInt(y),P=await this.router.getBestSell(t,e,S),T=o<r,v=[];T&&v.push("OrderTooSmall");let _=P.amountOut*BigInt(y),D=this.toBlockPeriod(i),W=P.tradeFee*BigInt(y),X=N.build(l),L={assetIn:t,assetOut:e,errors:v,maxTradeCount:h,optTradeCount:f,tradeCount:y,tradeFee:W,tradeImpactPct:P.priceImpactPct,tradePeriod:D,tradeRoute:X,type:"Dca"};return{...L,amountIn:o,amountOut:_,tradeAmountIn:P.amountIn,tradeAmountOut:P.amountOut,toHuman(){return{...L,amountIn:H.toDecimal(o,d),amountOut:H.toDecimal(_,g),tradeAmountIn:H.toDecimal(P.amountIn,d),tradeAmountOut:H.toDecimal(P.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,d=Math.abs(o),g=this.getTwapTradeCount(d),b=r/BigInt(g),h=await this.router.getBestSell(l.assetIn,c.assetOut,b),f=g===1,y=r<i,S=h.priceImpactPct<-5,P=[];y||f?P.push("OrderTooSmall"):S&&P.push("OrderImpactTooBig");let T=h.amountOut*BigInt(g),v=h.tradeFee*BigInt(g),_=N.build(s),D={assetIn:t,assetOut:e,errors:P,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:_,type:"TwapSell"};return{...D,amountIn:r,amountOut:T,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:v,toHuman(){return{...D,amountIn:H.toDecimal(r,u),amountOut:H.toDecimal(T,m),tradeAmountIn:H.toDecimal(h.amountIn,u),tradeAmountOut:H.toDecimal(h.amountOut,m),tradeFee:H.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,d=Math.abs(o),g=this.getTwapTradeCount(d),b=r/BigInt(g),h=await this.router.getBestBuy(l.assetIn,c.assetOut,b),f=h.amountIn*BigInt(g),y=g===1,S=f<i,P=h.priceImpactPct<-5,T=[];S||y?T.push("OrderTooSmall"):P&&T.push("OrderImpactTooBig");let v=h.tradeFee*BigInt(g),_=N.build(s),D={assetIn:t,assetOut:e,errors:T,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:_,type:"TwapBuy"};return{...D,amountIn:f,amountOut:r,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:v,toHuman(){return{...D,amountIn:H.toDecimal(f,u),amountOut:H.toDecimal(r,m),tradeAmountIn:H.toDecimal(h.amountIn,u),tradeAmountOut:H.toDecimal(h.amountOut,m),tradeFee:H.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 Wn={};A(Wn,{BIG_10:()=>Un,BIG_BILL:()=>Xe,StakingApi:()=>zt,StakingClient:()=>$t});import{calculate_accumulated_rps as os,calculate_percentage_amount as ls,calculate_period_number as Nn,calculate_points as Gn,calculate_rewards as cs,sigmoid as Vn}from"@galacticcouncil/math-staking";import G from"big.js";var de={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},qn=p=>Object.keys(de).includes(p);import{AccountId as as}from"polkadot-api";import{toHex as rs}from"@polkadot-api/utils";import{HYDRATION_SS58_PREFIX as ss}from"@galacticcouncil/common";function Hn(p){let t=("modl"+p).padEnd(32,"\0"),e=new TextEncoder().encode(t),n=rs(e);return as(ss).dec(n)}var ge="20000000000000000",he="2000",Un=G(10),Xe=G(Un.pow(12)),zt=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getPotBalance(){let t=await this.client.getPalletId(),e=Hn(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(),d=await this.client.getReferendumInfo(c);return d&&(d.type==="Approved"||d.type==="Rejected")&&qn(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=G(0),r=G(0),s=de.locked6x,o=G(n.toString()).mul(s),l=100,c=[];t.forEach(d=>{let g=de[d.conviction],b=i.includes(d.id.toString());b&&c.push(d.id.toString());let h=G(d.amount.toString()).mul(l).div(o);a=a.plus(Math.floor(h.mul(g).toNumber())),r=r.plus(Math.floor(h.mul(b?s:g).toNumber()))});let u=Math.floor(G(n.toString()).mul(s).mul(l).div(o).toNumber());i.forEach(d=>{c.includes(d)||(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,d,g,b]=await Promise.all([this.getPotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getTimePointsPerPeriod(),this.client.getTimePointsWeight(),this.client.getActionPointsWeight(),this.client.getSixBlockSince()]),h=G(l.transferable.toString()).minus(a.toString()),f=h.gt(0)&&s>0?os(r.toString(),h.toString(),s.toString()):r.toString(),y=Nn(c.toString(),n,b),S=Nn(c.toString(),o.createdAt.toString(),b),P=cs(f,o.rewardPerStake.toString(),o.stake.toString()),T=this.getCurrentActionPoints(o.votes,o.actionPoints,o.stake,e),v=Gn(S,y,m.toString(),d.toString(),T.currentActionPoints,g.toString(),o.accumulatedSlashPoints.toString()),_=Vn(v,ge,he),D=(()=>{if(!e.length)return;let St=Gn(S,y,m.toString(),d.toString(),T.maxActionPoints.toString(),g.toString(),o.accumulatedSlashPoints.toString());return Vn(St,ge,he)})(),W=G(P).plus(o.accumulatedUnpaidRewards.toString()).plus(o.accumulatedLockedRewards.toString());if(G(y).minus(S).lte(u.toString()))return{rewards:"0",payablePercentage:_,extraPayablePercentage:D,constants:{a:ge,b:he}};let X=ls(W.toString(),_),L=G(o.accumulatedLockedRewards.toString()),K=L.gt(X)?L:G(X);return{rewards:K.div(Xe).toString(),maxRewards:W.div(Xe).toString(),allocatedRewardsPercentage:K.div(W).mul(100).toNumber(),points:v,payablePercentage:_,extraPayablePercentage:D,constants:{a:ge,b:he}}}};var $t=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 Kn={};A(Kn,{TxBuilderFactory:()=>Pt});import{Enum as Xn}from"polkadot-api";function Yn(p){let t=[],e=p;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var ft=class extends C{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new Y(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:Te})}async dryRun(t,e){let n=Xn("Signed",t),i=Xn("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=Yn(s.value);throw new Error("Dry run execution error!",{cause:o})}return r}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var be=class extends ft{_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:N.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:N.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:N.build(e)});return await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as Ke}from"polkadot-api";var ye=class extends ft{_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:Ke("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:Ke("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:Ke("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 Pt=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 ye(this.client,this.evmClient).setOrder(t)}};async function Zh(p){let t=new st(p),e=new At(p),[n,i]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),a=new gt(p,e).withAave().withOmnipool().withStableswap().withXyk(),r=new Y(p),s=new $t(p),o=new Ft(p),l=new Z(e),c=new bt(a),u=new yt(c,{blockTime:n,minBudgetInNative:i}),m=new zt(s,r),d=new _t(o,r,{blockTime:n});return{api:{aave:l,router:c,scheduler:u,staking:m,farm:d},client:{asset:new nt(p),balance:r,evm:e},ctx:{pool:a},tx:new Pt(p,e),destroy:()=>{a.destroy()}}}export{re as QueryBus,Ze as aave,Qe as api,nn as client,tn as const,Zh as createSdkContext,an as error,ln as evm,hn as farm,x as fmt,Ot as json,I as math,Cn as pool,Ln as sor,Wn as staking,Kn as tx};
|
|
1
|
+
var Jn=Object.defineProperty;var A=(p,t)=>{for(var e in t)Jn(p,e,{get:t[e],enumerable:!0})};import Zn from"buffer";typeof window<"u"&&(window.Buffer=Zn.Buffer);var Qe={};A(Qe,{Papi:()=>C,getWs:()=>ai});import{hydration as ti}from"@galacticcouncil/descriptors";function je(p){switch(p){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(ti)}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 ei}from"polkadot-api/logs-provider";import{withLegacy as ni}from"@polkadot-api/legacy-provider";import{getWsProvider as ii}from"polkadot-api/ws-provider";var ai=(p,t={})=>{let e=typeof p=="string"?p.split(","):p,n=ii(e,{innerEnhancer:ni(),...t});return ei(i=>console.log(i),n),n};var Ze={};A(Ze,{AAVE_GAS_LIMIT:()=>Te,AAVE_LENDING_POOL_ADDRESS:()=>ne,AAVE_POOL_ABI:()=>Pe,AAVE_POOL_DATA_PROVIDER:()=>ee,AAVE_POOL_DATA_PROVIDER_ABI:()=>te,AAVE_POOL_PROXY:()=>Se,AAVE_ROUNDING_THRESHOLD:()=>ks,AAVE_UINT_256_MAX:()=>ri,AaveClient:()=>Tt,AaveUtils:()=>Z});var Pe=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"to",type:"address"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"interestRateMode",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"address",name:"onBehalfOf",type:"address"}],name:"borrow",outputs:[],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getUserAccountData",outputs:[{internalType:"uint256",name:"totalCollateralBase",type:"uint256"},{internalType:"uint256",name:"totalDebtBase",type:"uint256"},{internalType:"uint256",name:"availableBorrowsBase",type:"uint256"},{internalType:"uint256",name:"currentLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"ltv",type:"uint256"},{internalType:"uint256",name:"healthFactor",type:"uint256"}],stateMutability:"view",type:"function"}];var te=[{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 Se="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",ee="0x112b087b60C1a166130d59266363C45F8aa99db0",ne="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Te=1000000n,ks=5,ri=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Tt=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:te,address:ee,args:[ne],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:te,address:ee,args:[ne,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:Pe,address:Se,args:[t],functionName:"getUserAccountData"})}};import E from"big.js";import{big as J,erc20 as si,h160 as oi}from"@galacticcouncil/common";var{ERC20:et}=si,{H160:ve}=oi,li=1.01,ci=31536000n,Je=4,ie=-1,ae=10n**27n,Z=class{client;constructor(t){this.client=new Tt(t)}async getSummary(t){let e=ve.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,d,g,b]=a,h=J.toDecimal(b,18),f=[];for(let y of o){let P=y.underlyingAsset.toLowerCase(),S=s.find(({underlyingAsset:fe})=>fe.toLowerCase()===P);if(!S)throw new Error("Missing pool reserve for "+P);let T=y.scaledATokenBalance,v=S.liquidityIndex,_=S.liquidityRate,k=S.availableLiquidity,Y=S.priceInMarketReferenceCurrency,K=r+6,H=this.calculateLinearInterest(_,S.lastUpdateTimestamp,K),N=v*H/ae,St=T*N/ae,Qt=Number(l!==0&&l===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,Jt=S.usageAsCollateralEnabled&&y.usageAsCollateralEnabledOnUser&&y.scaledATokenBalance>0n,Zt=et.toAssetId(P);f.push({aTokenBalance:St,availableLiquidity:k,decimals:Number(S.decimals),isCollateral:Jt,priceInRef:Y,reserveId:Zt,reserveAsset:P,reserveLiquidationThreshold:Qt})}return{healthFactor:Number(h),currentLiquidationThreshold:Number(J.toDecimal(d,Je)),totalCollateral:c,totalDebt:u,reserves:f}}async hasBorrowPositions(t){let e=ve.fromAny(t),n=await this.client.getUserAccountData(e),[i,a]=n;return a>0n}async getHealthFactor(t){let e=ve.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 ie;let o=et.fromAssetId(e),l=r.find(P=>P.reserveAsset===o);if(!l)throw new Error("Missing reserve ctx for "+o);let{decimals:c,isCollateral:u,priceInRef:m,reserveLiquidationThreshold:d}=l,g=J.toBigInt(n,c),b=u?g*m/10n**BigInt(c):0n,h=i-b;if(h<=0n)return 0;let f=E(i.toString()).mul(s).minus(E(b.toString()).mul(d)).div(h.toString()),y=E(h.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 ie;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),b=i+g;if(b<=0n)return 0;let h=E(i.toString()).mul(s).plus(E(g.toString()).mul(m)).div(b.toString()),f=E(b.toString()).mul(h).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 ie;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 d=J.toBigInt(e,u.decimals),g=J.toBigInt(i,m.decimals),b=d*u.priceInRef/10n**BigInt(u.decimals),h=g*m.priceInRef/10n**BigInt(m.decimals),f=u.isCollateral?E(b.toString()).mul(u.reserveLiquidationThreshold):E(0),S=E(h.toString()).mul(m.reserveLiquidationThreshold).minus(f).div(r.toString()),T=E(o).plus(S).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-li;if(m>0){let d=E(m).mul(e.toString()).div(o).toFixed(0,E.roundDown),g=E(d).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 ae;let a=t*BigInt(i)/ci;return ae+a}calculateHealthFactorFromBalances(t,e,n){if(t===0n)return ie;let i=e*n/t,a=J.toDecimal(i,Je);return Number(a)}};var nn={};A(nn,{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),d=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",d.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:b}=await this.mapToken(g,e,n);return[g,b]})),m=Object.fromEntries(u),d=Object.values(m);return{id:t,name:d.join(", "),symbol:s?.asText()||r?.asText(),decimals:18,icon:d.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,d;switch(m.type){case"Bond":let g=r.get(l);d=await this.mapBond(l,c,s,g);break;case"StableSwap":let b=a.get(l);d=await this.mapShares(l,c,s,b);break;case"External":d=await this.mapExternal(l,c,e,u);break;default:d=await this.mapToken(l,c,s,u)}o.push(d)}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 pi,bufferCount as di,combineLatest as gi,debounceTime as hi,distinctUntilChanged as en,finalize as bi,map as rt,pairwise as yi,shareReplay as fi,startWith as Pi}from"rxjs";var tn={};A(tn,{HUB_ASSET_ID:()=>vt,HYDRATION_OMNIPOOL_ADDRESS:()=>mi,HYDRATION_PARACHAIN_ID:()=>ui,PERBILL_DENOMINATOR:()=>xe,PERMILL_DENOMINATOR:()=>it,SYSTEM_ASSET_DECIMALS:()=>we,SYSTEM_ASSET_ID:()=>O,TRADEABLE_DEFAULT:()=>at});var it=1e6,xe=1e9,O=0,we=12,ui=2034,mi="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",vt=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 gi([e,n,i]).pipe(hi(250),rt(a=>a.flat()),Pi([]),di(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(en((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 pi,i=n.pipe(fi(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 d=>{let g=await this.getTokenBalanceData(t,d);return[d,g]}))).map(([d,g])=>({id:d,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(bi(()=>s?.()),yi(),rt(([o,l],c)=>c===0?l.filter(u=>u.balance.transferable>0n):this.getDeltas(o,l)),en((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 an={};A(an,{AssetNotFound:()=>Ie,PoolNotFound:()=>xt,RouteNotFound:()=>wt});var Ie=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},xt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},wt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var ln={};A(ln,{EvmClient:()=>At,EvmRpcAdapter:()=>It,createChain:()=>Ae});import{Binary as Si,CompatibilityLevel as Ti,FixedSizeBinary as rn}from"polkadot-api";import{hydration as vi}from"@galacticcouncil/descriptors";import{encodeFunctionData as xi,decodeFunctionResult as wi}from"viem";var Ii=10000000n,It=class{api;constructor(t){this.api=t.getTypedApi(vi)}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=xi({abi:e,functionName:i,args:a}),s=this.api.apis.EthereumRuntimeRPCApi.call,o=await this.api.compatibilityToken,l=s.isCompatible(Ti.BackwardsCompatible,o);console.log(l);let c=await this.api.apis.EthereumRuntimeRPCApi.call(rn.fromText(""),rn.fromHex(n),Si.fromHex(r),[0n,0n,0n,0n],[Ii,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:d}=c.value;if(console.log(d),u.type==="Succeed")return wi({abi:e,functionName:i,data:m.asHex()});throw console.log(i,u.type,u.value.type),new Error("Contract read error")})};import{defineChain as Ai}from"viem";var Oi=["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"],Ae=()=>Ai({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Oi}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});import{createPublicClient as sn,createWalletClient as Bi,custom as on,http as _i}from"viem";var At=class{client;chain;constructor(t){this.client=t,this.chain=Ae()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return sn({chain:this.chain,transport:_i()})}getWsProvider(){return sn({transport:on({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return Bi({account:t,chain:this.chain,transport:on(window.ethereum)})}getRPCAdapter(){return new It(this.client)}};var hn={};A(hn,{LiquidityMiningApi:()=>_t,LiquidityMiningClient:()=>Ft});import{AccountId as Yi}from"polkadot-api";import M from"big.js";import{HYDRATION_SS58_PREFIX as Xi,RUNTIME_DECIMALS as Bt}from"@galacticcouncil/common";import{fixed_from_rational as gn}from"@galacticcouncil/math-liquidity-mining";var x={};A(x,{FeeUtils:()=>Oe,shiftNeg:()=>Ri});import Fi from"big.js";var Oe=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 i=10**n;return Math.round(t*i/e)/i}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Ri(p,t){let e=Fi(typeof p=="bigint"?p.toString():p);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Ot={};A(Ot,{findNestedKey:()=>Ci,findNestedObj:()=>Ei,jsonFormatter:()=>ki});var Ci=(p,t)=>{let e=[];return JSON.stringify(p,(n,i)=>(i&&i[t]&&e.push(i),i)),e[0]},Ei=(p,t,e)=>{let n;return JSON.stringify(p,(i,a)=>(a&&a[t]===e&&(n=a),a)),n},ki=(p,t)=>typeof t=="bigint"?t.toString():t;var I={};A(I,{calculateBuyFee:()=>qi,calculateDiffToAvg:()=>Di,calculateDiffToRef:()=>Mi,calculateSellFee:()=>Li,getFraction:()=>Hi});import z from"big.js";function Di(p,t){let e=z(p.toString()),n=z(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Mi(p,t){if(t===0n)return 0;let e=z(p.toString()),n=z(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Li(p,t){if(p===0n)return 0;let e=z(p.toString()),n=z(t.toString());return z(1).minus(n.div(e)).mul(100).round(2).toNumber()}function qi(p,t){if(p===0n)return 0;let e=z(p.toString());return z(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Hi(p,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 p*i/BigInt(100*n)}import{TLRUCache as cn}from"@thi.ng/cache";var re=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 cn(null,{ttl:i}):new cn;return{get:(...c)=>{let u=n(...c);if(a.has(u)){this.log("[live]",t,u);let d=a.get(u);return Promise.resolve(d)}if(r.has(u))return this.log("[memo]",t,u),r.get(u);this.log("[fetch]",t,u);let m=e(...c).catch(d=>{throw r.delete(u),d});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 se=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let n=0;n<t.length;++n){let[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 Ni,calculate_global_farm_rewards as Gi,calculate_loyalty_multiplier as Vi,calculate_user_reward as dn,calculate_yield_farm_delta_rpvs as Ui}from"@galacticcouncil/math-liquidity-mining";import un from"big.js";var Be=un(10).pow(18),mn=BigInt(un(1).pow(18).toString()),pn=6e3;var Wi="1000000000000000000",oe=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(Gi(t.total_shares_z.toString(),n.toString(),tt(t.yield_per_period.toString()).mul(Be).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(Ni(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=Ui(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(Be).round(0,tt.roundDown).toString();if(!e)return n;let{initial_reward_percentage:i,scale_coef:a}=e;return Vi(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(dn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),u)),d=BigInt(dn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),Wi));return{reward:m,maxReward:d,assetId:s.reward_currency,yieldFarmId:o.id,isActiveFarm:o.state.type==="Active"}}};var Ki=M(365.2425).times(24).times(60).times(60),_t=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??pn})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((a,r)=>a-r);if(t===e)return mn;let i=await this.client.getOraclePrice(n);if(i){let{n:a,d:r}=i[0].price,s;return t<e?s=gn(a.toString(),r.toString()):s=gn(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 Yi(Xi).dec(o)};getGlobalRewardPerPeriod(t,e,n,i){let a=M(i).times(t.toString()).times(e.toString()).div(Math.pow(10,Bt));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:d,max_reward_per_period:g,pending_rewards:b,accumulated_paid_rewards:h,planned_yielding_periods:f,updated_at:y,incentivized_asset:P,reward_currency:S,price_adjustment:T,min_deposit:v}=a,_=x.shiftNeg(r??T,Bt),k=x.shiftNeg(l,Bt),Y=x.shiftNeg(c?.initial_reward_percentage??0,Bt),K=Ki.div(M(this.blockTime).div(1e3).times(u)).toString(),H;if(d<=0)H=M(k).times(m.toString()).times(K).toString();else{let jn=this.getGlobalRewardPerPeriod(d,m,g,_),Qn=this.getPoolYieldPerPeriod(jn,k,d,_);H=M(Qn).times(K).toString()}let N=b+h,St=g*BigInt(f),jt=s.transferable+N,ze=jt-N,Qt=M(ze.toString()).div(g.toString()),Jt=M(e).div(u.toString()).toString(),Zt=(d>=0?Qt.plus(y):Qt.plus(Jt)).toString(),fe=M(Zt).times(u).toString(),zn=M(d.toString()).div(M(g.toString()).div(m.toString())).div(Math.pow(10,Bt)).times(100).times(_).toFixed(2),$e=M(N.toString()).div(jt.toString()).gte(.999);H=$e?"0":M(H).div(n?2:1).times(100).toString();let $n=Y?M(H).times(Y).toString():void 0;return{apr:H,minApr:$n,isDistributed:$e,estimatedEndPeriod:Zt,estimatedEndBlock:fe,maxRewards:St,incentivizedAsset:P,rewardCurrency:S,loyaltyCurve:c,currentPeriod:Jt,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,d=this.getFarmAddress(s),g=await this.getOraclePrice(u,m),b=await this.balanceClient.getBalance(d,u);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b}}));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,d=this.getFarmAddress(s,!0),g=await this.getOraclePrice(u,m),b=await this.balanceClient.getBalance(d,u);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b,farmAddress:d}}));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),d=await this.getOraclePrice(l,c),g=new se(u,m),h=await new oe(y=>this.getFarmAddress(y),y=>this.client.getAsset(y),g).claimRewards(o,s,e,i,d??o.price_adjustment);if(!h)return;let f=await this.client.getAsset(h.assetId);if(f&&!(h.reward<=f.existential_deposit))return h}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 $i}from"polkadot-api";var Ft=class extends C{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(zi.fromText("omnipool"),t,$i("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 Cn={};A(Cn,{PoolContextProvider:()=>gt,PoolError:()=>j,PoolFactory:()=>pt,PoolType:()=>B,aave:()=>Me,hsm:()=>Ne,lbp:()=>_e,omni:()=>Re,stable:()=>Ee,xyk:()=>ke});var _e={};A(_e,{LbpMath:()=>U,LbpPool:()=>Rt,LbpPoolClient:()=>Ct});import{calculate_in_given_out as ji,calculate_out_given_in as Qi,calculate_linear_weights as Ji,calculate_pool_trade_fee as Zi,get_spot_price as ta}from"@galacticcouncil/math-lbp";var U=class{static getSpotPrice(t,e,n,i,a){return ta(t,e,n,i,a)}static calculateInGivenOut(t,e,n,i,a){return ji(t,e,n,i,a)}static calculateOutGivenIn(t,e,n,i,a){return Qi(t,e,n,i,a)}static calculateLinearWeights(t,e,n,i,a){return Ji(t,e,n,i,a)}static calculatePoolTradeFee(t,e,n){return Zi(t,e,n)}};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:bn}=x,Rt=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(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=bn.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=bn.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(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=U.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=U.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Sa}from"polkadot-api";import{Subscription as Ta,distinctUntilChanged as va,filter as xa}from"rxjs";import{memoize1 as na}from"@thi.ng/memoize";import{TLRUCache as ia}from"@thi.ng/cache";import{ReplaySubject as aa,Subscription as ra,bufferCount as sa,combineLatest as yn,debounceTime as oa,defer as la,filter as ca,finalize as ua,from as ma,map as ot,merge as pa,of as da,pairwise as ga,skip as ha,share as ba,startWith as ya,switchMap as fa,tap as fn,throttleTime as Pa}from"rxjs";import{BehaviorSubject as ea}from"rxjs";var le=class{store$=new ea([]);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 le;shared$;mem=0;memPoolsCache=new ia(null,{ttl:6*1e3});memPools=na(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(ya([]),sa(2,1),ot(([t,e])=>t.length===0?e:this.store.applyChangeset(e)),ca(t=>t.length>0),Pa(1e3,void 0,{leading:!0,trailing:!0}))}subscribeStore(){return la(()=>{let t=new ra;return ma(this.getMemPools()).pipe(ot(n=>n.filter(i=>this.hasValidAssets(i))),fn(n=>this.store.set(n))).pipe(fn(()=>{t.add(this.subscribeBalances()),t.add(this.subscribeUpdates())}),fa(n=>pa(da(n),this.store.asObservable().pipe(ha(1)))),ua(()=>{t.unsubscribe()}))}).pipe(ba({connector:()=>new aa(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 yn(i).pipe(ot(a=>a.flat()),ga(),ot(([a,r])=>this.getDeltas(a,r)),ot(a=>[n,a]))});return yn(t).pipe(oa(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 Ct=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(Sa.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,d,g,b]=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:d?.decimals,existentialDeposit:d?.existential_deposit,balance:m.transferable,weight:s,type:d?.asset_type.type},{id:c,decimals:b?.decimals,existentialDeposit:b?.existential_deposit,balance:g.transferable,weight:o,type:b?.asset_type.type}]}}isActivePool(t,e){let{start:n,end: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(xa(t=>t!==void 0),va((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,d]=i.tokens,g=[{...m,weight:c},{...d,weight:u}],b=await this.isRepayFeeApplied(l,s,o.toString());n.push({...i,tokens:g,repayFeeApply:b})}}return n})})}subscribeUpdates(){let t=new Ta;return t.add(this.subscribeValidationData()),t}};var Re={};A(Re,{OmniMath:()=>w,OmniPool:()=>Et,OmniPoolClient:()=>kt});import{calculate_in_given_out as wa,calculate_lrna_in_given_out as Ia,calculate_out_given_in as Aa,calculate_out_given_lrna_in as Oa,calculate_spot_price as Ba,calculate_lrna_spot_price as _a,calculate_shares as Fa,calculate_liquidity_out as Ra,calculate_liquidity_lrna_out as Ca,verify_asset_cap as Ea,calculate_liquidity_hub_in as ka,is_sell_allowed as Da,is_buy_allowed as Ma,is_add_liquidity_allowed as La,is_remove_liquidity_allowed as qa,recalculate_asset_fee as Ha,recalculate_protocol_fee as Na}from"@galacticcouncil/math-omnipool";import lt from"big.js";var w=class{static calculateSpotPrice(t,e,n,i){return Ba(t,e,n,i)}static calculateLrnaSpotPrice(t,e){return _a(t,e)}static calculateInGivenOut(t,e,n,i,a,r,s,o,l){return wa(t,e,n,i,a,r,s,o,l)}static calculateLrnaInGivenOut(t,e,n,i,a){return Ia(t,e,n,i,a)}static calculateOutGivenIn(t,e,n,i,a,r,s,o,l){return Aa(t,e,n,i,a,r,s,o,l)}static calculateOutGivenLrnaIn(t,e,n,i,a){return Oa(t,e,n,i,a)}static calculateShares(t,e,n,i){return Fa(t,e,n,i)}static calculateLiquidityOut(t,e,n,i,a,r,s,o){return Ra(t,e,n,i,a,r,s,o)}static calculateLiquidityLRNAOut(t,e,n,i,a,r,s,o){return Ca(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),d=a.times(lt(1).minus(c));return m.div(d).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,n,i){return ka(t,e,n,i)}static isSellAllowed(t){return Da(t)}static isBuyAllowed(t){return Ma(t)}static isAddLiquidityAllowed(t){return La(t)}static isRemoveLiquidityAllowed(t){return qa(t)}static recalculateAssetFee(t,e,n,i,a,r,s,o,l,c,u){return Ha(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 Na(t,e,n,i,a,r,s,o,l,c,u)}static verifyAssetCap(t,e,n,i){return Ea(t,e,n,i)}};import{RUNTIME_DECIMALS as ce}from"@galacticcouncil/common";var{FeeUtils:ct}=x,Et=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(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()),n=Math.pow(10,ce-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=w.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,ce-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=w.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,ce-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=w.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,ce-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as Ga,Binary as Va,CompatibilityLevel as Ua,Enum as Wa}from"polkadot-api";import{toHex as Ya}from"@polkadot-api/utils";import{Subscription as Xa,distinctUntilChanged as Fe,filter as Ka,finalize as ut,map as za,merge as $a}from"rxjs";import{HYDRATION_SS58_PREFIX as ja}from"@galacticcouncil/common";var{FeeUtils:F}=x,Pn=Va.fromText("omnipool"),Sn=Wa("Short"),kt=class extends L{queryBus=new re;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(Pn,t,Sn,{at:"best"}),t=>t.join(":"),6*1e3);getPoolType(){return"Omnipool"}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=Ya(e);return Ga(ja).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(Ua.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:d,shares:g,tradable:b,cap:h,protocol_shares:f}=u,[y,P]=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:P.transferable,cap:h,hubReserves:d,protocolShares:f,shares:g,tradeable:b,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:P}=i.value;return{assetFee:F.fromPermill(y),protocolFee:F.fromPermill(P)}}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),[d,g,b]=n===1?[0,0,0]:await this.getProtocolFee(t,this.block,s,l,i?.value.protocol_fee_params),h=c+d,f=m+b;return{assetFee:F.fromPermill(u),protocolFee:F.fromPermill(g),min:F.fromPermill(h),max:F.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=F.fromPermill(o),d=F.fromPermill(l),[g]=i,{asset_fee:b,timestamp:h}=n,f=Math.max(1,e-h),y=g.volume.b_in.toString(),P=g.volume.b_out.toString(),S=g.liquidity.b.toString();r===0&&(y=g.volume.a_in.toString(),P=g.volume.a_out.toString(),S=g.liquidity.a.toString());let T=F.fromPermill(b),v=w.recalculateAssetFee(y,P,S,"9",s.toString(),F.toRaw(T).toString(),f.toString(),F.toRaw(m).toString(),F.toRaw(d).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=F.fromPermill(o),d=F.fromPermill(l),[g]=i,{protocol_fee:b,timestamp:h}=n,f=Math.max(1,e-h),y=g.volume.b_in.toString(),P=g.volume.b_out.toString(),S=g.liquidity.b.toString();r===0&&(y=g.volume.a_in.toString(),P=g.volume.a_out.toString(),S=g.liquidity.a.toString());let T=F.fromPermill(b),v=w.recalculateProtocolFee(y,P,S,"9",s.toString(),F.toRaw(T).toString(),f.toString(),F.toRaw(m).toString(),F.toRaw(d).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(Pn,i,Sn,"best").pipe(Ka(a=>a!==void 0),za(a=>({pair:i,value:a}))));return $a(...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 Xa;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 Ee={};A(Ee,{StableMath:()=>D,StableSwap:()=>Q,StableSwapClient:()=>Dt});import{calculate_in_given_out as Qa,calculate_out_given_in as Ja,calculate_amplification as Za,calculate_add_one_asset as tr,calculate_liquidity_out_one_asset as er,calculate_shares as nr,calculate_shares_for_amount as ir,calculate_spot_price_with_fee as ar,pool_account_name as rr,recalculate_peg as sr}from"@galacticcouncil/math-stableswap";var D=class{static getPoolAddress(t){return rr(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 Za(t,e,n,i,a)}static calculateInGivenOut(t,e,n,i,a,r,s){return Qa(t,e,n,i,a,r,s)}static calculateAddOneAsset(t,e,n,i,a,r,s){return tr(t,e,n,i,a,r,s)}static calculateSharesForAmount(t,e,n,i,a,r,s){return ir(t,e,n,i,a,r,s)}static calculateOutGivenIn(t,e,n,i,a,r,s){return Ja(t,e,n,i,a,r,s)}static calculateLiquidityOutOneAsset(t,e,n,i,a,r,s){return er(t,e,n,i,a,r,s)}static calculateShares(t,e,n,i,a,r){return nr(t,e,n,i,a,r)}static calculateSpotPriceWithFee(t,e,n,i,a,r,s,o){return ar(t,e,n,i,a,r,s,o)}static recalculatePegs(t,e,n,i,a,r){let s=sr(t,e,n,i,a,r);return JSON.parse(s)}};import{RUNTIME_DECIMALS as Tn}from"@galacticcouncil/common";var{FeeUtils:mt}=x,Q=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(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());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let i=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(i)}let n=Math.pow(10,Tn-t.decimalsIn);return BigInt(e)/BigInt(n)}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());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let i=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(i)}let n=Math.pow(10,Tn-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:i})=>({asset_id:e,amount:n,decimals:i}));return JSON.stringify(t,Ot.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],Ot.jsonFormatter)}};import{AccountId as or,CompatibilityLevel as lr}from"polkadot-api";import{toHex as cr}from"@polkadot-api/utils";import{blake2b as ur}from"@noble/hashes/blake2b";import{Subscription as mr,distinctUntilChanged as pr,finalize as Ce,map as dr,merge as gr}from"rxjs";import{HYDRATION_SS58_PREFIX as hr,RUNTIME_DECIMALS as br}from"@galacticcouncil/common";var{FeeUtils:yr}=x,Dt=class extends L{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=D.getPoolAddress(t),n=ur(e,{dkLen:32}),i=cr(n);return or(hr).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(lr.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),d=c?this.getRecentPegs(c):this.getDefaultPegs(r);return l.push({id:s,tradeable:15,balance:u,decimals:br}),this.poolsData.set(s,r),{address:o,id:s,type:"Stableswap",fee:yr.fromPermill(r.fee),tokens:l,totalIssuance:u,pegs:d,...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(dr(i=>({id:n,value:i}))));return gr(...e).pipe(Ce(()=>{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),Ce(()=>{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(Ce(()=>{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 mr;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 ke={};A(ke,{XykMath:()=>$,XykPool:()=>Mt,XykPoolClient:()=>Lt});import{calculate_in_given_out as fr,calculate_out_given_in as Pr,calculate_pool_trade_fee as Sr,get_spot_price as Tr,calculate_liquidity_in as vr,calculate_shares as xr,calculate_spot_price as wr,calculate_spot_price_with_fee as Ir,calculate_liquidity_out_asset_a as Ar,calculate_liquidity_out_asset_b as Or}from"@galacticcouncil/math-xyk";var $=class{static getSpotPrice(t,e,n){return Tr(t,e,n)}static calculateInGivenOut(t,e,n){return fr(t,e,n)}static calculateOutGivenIn(t,e,n){return Pr(t,e,n)}static calculatePoolTradeFee(t,e,n){return Sr(t,e,n)}static calculateLiquidityIn(t,e,n){return vr(t,e,n)}static calculateSpotPrice(t,e){return wr(t,e)}static calculateSpotPriceWithFee(t,e,n,i){return Ir(t,e,n,i)}static calculateShares(t,e,n){return xr(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,i){return Ar(t,e,n,i)}static calculateLiquidityOutAssetB(t,e,n,i){return Or(t,e,n,i)}};import{RUNTIME_DECIMALS as vn}from"@galacticcouncil/common";var{FeeUtils:xn}=x,Mt=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(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=xn.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=xn.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()),n=Math.pow(10,vn-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=$.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,vn-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=$.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Br}from"polkadot-api";import{Subscription as _r}from"rxjs";var Lt=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(Br.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 _r.EMPTY}};var Me={};A(Me,{AavePool:()=>qt,AavePoolClient:()=>Ht});var qt=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(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){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};import{AccountId as Fr}from"polkadot-api";import{toHex as Rr}from"@polkadot-api/utils";import{Subscription as In,filter as De,finalize as An,map as On}from"rxjs";import{decodeEventLog as Cr}from"viem";import{erc20 as Er,HYDRATION_SS58_PREFIX as kr}from"@galacticcouncil/common";var wn=[{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:Dr}=Er,Mr=["Supply","Withdraw","Repay","Borrow"],Ht=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=Rr(i);return Fr(kr).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 Dr.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}=Cr({abi:wn,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(On(({payload:n})=>this.parseRouterLog(n)),De(({assetIn:n,assetOut:i})=>e.includes(n)||e.includes(i)),An(()=>{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(On(({payload:t})=>this.parseEvmLog(t)),De(t=>t!==void 0),De(({eventName:t})=>Mr.includes(t)),An(()=>{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 In.EMPTY}subscribeUpdates(){let t=new In;return t.add(this.subscribeRouterExecuted()),t.add(this.subscribeEvmLog()),t}};var pt=class{static get(t){switch(t.type){case"Aave":return qt.fromPool(t);case"XYK":return Mt.fromPool(t);case"Omnipool":return Et.fromPool(t);case"LBP":return Rt.fromPool(t);case"Stableswap":return Q.fromPool(t);case"HSM":return Q.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as es,Subscription as dt,takeUntil as ns}from"rxjs";var Ne={};A(Ne,{HsmMath:()=>W,HsmPool:()=>Le,HsmPoolClient:()=>Ut});import{calculate_collateral_in_given_hollar_out as Lr,calculate_collateral_out_given_hollar_in as qr,calculate_hollar_in_given_collateral_out as Hr,calculate_hollar_out_given_collateral_in as Nr,calculate_imbalance as Gr,calculate_max_price as Vr,calculate_buyback_limit as Ur,calculate_buyback_price_with_fee as Wr}from"@galacticcouncil/math-hsm";var W=class{static calculateCollateralInGivenHollarOut(t,e,n){return Lr(t,e,n)}static calculateCollateralOutGivenHollarIn(t,e,n){return qr(t,e,n)}static calculateHollarOutGivenCollateralIn(t,e,n){return Nr(t,e,n)}static calculateHollarInGivenCollateralOut(t,e,n){return Hr(t,e,n)}static calculateImbalance(t,e,n){return Gr(t,e,n)}static calculateBuybackLimit(t,e){return Ur(t,e)}static calculateBuybackPriceWithFee(t,e,n){return Wr(t,e,n)}static calculateMaxPrice(t,e){return Vr(t,e)}};import{big as ue,RUNTIME_DECIMALS as Yr}from"@galacticcouncil/common";var{FeeUtils:Nt}=x,Le=class p extends Q{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,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(),Nt.toRaw(this.buyBackFee).toString());return BigInt(i)}calculateCollateralInGivenHollarOut(t){let e=this.getCollateralPeg(),n=W.calculateCollateralInGivenHollarOut(t.toString(),JSON.stringify(e),Nt.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(),Nt.toRaw(this.buyBackFee).toString());return BigInt(i)}calculateHollarOutGivenCollateralIn(t){let e=this.getCollateralPeg(),n=W.calculateHollarOutGivenCollateralIn(t.toString(),JSON.stringify(e),Nt.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(),Nt.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(Yr-t.decimalsOut);return BigInt(i)*r/BigInt(a)}spotPriceInGivenOut(t){let e=ue.toBigInt(1,t.decimalsOut);return this.calculateInGivenOut(t,e)}spotPriceOutGivenIn(t){let e=ue.toBigInt(1,t.decimalsIn);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)?[ue.toBigInt(1,18).toString(),ue.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 Xr,CompatibilityLevel as Kr}from"polkadot-api";import{toHex as zr}from"@polkadot-api/utils";import{Subscription as Bn,combineLatest as $r,filter as _n,finalize as Fn,map as qe,pairwise as jr}from"rxjs";import{decodeEventLog as Qr}from"viem";import{h160 as Jr,HYDRATION_SS58_PREFIX as Zr}from"@galacticcouncil/common";var Gt=[{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 Vt=class{client;constructor(t){this.client=t.getWsProvider()}async getFacilitatorCapacity(t,e){let[n,i]=await this.client.readContract({abi:Gt,address:t,functionName:"getFacilitatorBucket",args:[e]});return n-i}};var{FeeUtils:He}=x,{H160:Rn}=Jr,ts=["FacilitatorBucketCapacityUpdated","FacilitatorBucketLevelUpdated"],Ut=class extends L{ghoClient;stableClient;constructor(t,e,n){super(t,e),this.stableClient=n,this.ghoClient=new Vt(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=zr(n);return Xr(Zr).dec(i)}async isSupported(){let t=this.api.query.HSM.Collaterals,e=await this.api.compatibilityToken;return t.isCompatible(Kr.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=Rn.fromAny(a),s=this.getHollarAddress(e),o=await this.ghoClient.getFacilitatorCapacity(s,r),l=n.map(async({keyArgs:u,value:m})=>{let[d]=u,{pool_id:g,max_buy_price_coefficient:b,max_in_holding:h,purchase_fee:f,buy_back_fee:y,buyback_rate:P}=m,S=i.find(T=>T.id===g);if(S){let T=this.getPoolId(g),v=await this.getBalance(a,d);return{...S,address:T,type:"HSM",tokens:S.tokens.filter(_=>_.id!==g),hsmAddress:a,hsmMintCapacity:o,hollarId:t,hollarH160:s,collateralId:d,collateralBalance:v.transferable,maxBuyPriceCoefficient:b,maxInHolding:h,purchaseFee:He.fromPermill(f),buyBackFee:He.fromPermill(y),buyBackRate:He.fromPerbill(P)}}});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}=Qr({abi:Gt,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(qe(({payload:t})=>this.parseEvmLog(t)),_n(t=>t!==void 0),_n(({eventName:t})=>ts.includes(t)),Fn(()=>{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=Rn.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?$r(i).pipe(qe(a=>a.flat()),jr(),qe(([a,r])=>this.getDeltas(a,r)),Fn(()=>{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})}):Bn.EMPTY}subscribeUpdates(){let t=new Bn;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 es;constructor(t,e){super(t),this.evm=e,this.aave=new Ht(t,e),this.omnipool=new kt(t,e),this.stableswap=new Dt(t,e),this.hsm=new Ut(t,e,this.stableswap),this.xyk=new Lt(t,e),this.lbp=new Ct(t,e),this.clients=[this.aave,this.omnipool,this.stableswap,this.hsm,this.xyk,this.lbp]}subscribe(t){return t.getSubscriber().pipe(ns(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 xt(e.type)}};var Ln={};A(Ln,{DEFAULT_BLOCK_TIME:()=>kn,DEFAULT_MIN_BUDGET:()=>Ue,ORDER_MIN_BLOCK_PERIOD:()=>Dn,Router:()=>ht,TWAP_BLOCK_PERIOD:()=>Kt,TWAP_MAX_DURATION:()=>Ye,TWAP_MAX_PRICE_IMPACT:()=>We,TWAP_TX_MULTIPLIER:()=>vg,TradeOrderError:()=>Ve,TradeOrderType:()=>pe,TradeRouteBuilder:()=>G,TradeRouter:()=>bt,TradeScheduler:()=>yt,TradeType:()=>me});var Wt=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 is=10,Yt=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 Wt,r=[];for(r.push([e,""]),a.enqueue(r);a.size()>0;){let s=a.dequeue();if(!s||s.length>is)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 Wt,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 Ge(p){let t={};for(let e of p){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 Xt=class{getProposals(t,e,n){let i=n.filter(h=>h.type==="XYK"),a=n.filter(h=>h.type!=="XYK"),r=new Set(a.map(h=>h.tokens).flat().map(h=>h.id)),s=r.has(t),o=r.has(e),l=new Yt,c=h=>{let f=Ge(h),y=Object.keys(f),P=y.flatMap(S=>f[S]);return l.buildAndPopulateGraph(y,P)};if(!s&&!o){let h=i.filter(P=>P.tokens.find(S=>S.id===t)||P.tokens.find(S=>S.id===e)),f=c(h),y=l.findPaths(f,t,e);return this.parsePaths(y)}if(s&&o){let h=c(a),f=l.findPaths(h,t,e);return this.parsePaths(f)}let u=s?e:t,m=i.filter(h=>h.tokens.some(f=>f.id===u));if(m.length===0)return[];let d=[...a,...m],g=c(d),b=l.findPaths(g,t,e);return this.parsePaths(b)}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 ht=class{routeSuggester;routeProposals;ctx;filter={};constructor(t){this.ctx=t,this.routeSuggester=new Xt,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 R}from"@galacticcouncil/common";var me=(e=>(e.Buy="Buy",e.Sell="Sell",e))(me||{}),pe=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(pe||{}),Ve=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Ve||{});var{FeeUtils:En}=x,bt=class extends ht{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 wt(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?En.toPct(t.min):void 0,n=t.max?En.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetOutDecimals).reduce((s,o)=>s+o),i=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),a=n-e.assetOutDecimals,r=Math.pow(10,a);return i/BigInt(r)}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=Math.pow(10,n.assetInDecimals),d=n.amountIn*r/BigInt(m),g=I.calculateDiffToRef(o,d);return{type:"Sell",amountIn:n.amountIn,amountOut:i.amountOut,spotPrice:r,tradeFee:l,tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:R.toDecimal(n.amountIn,n.assetInDecimals),amountOut:R.toDecimal(i.amountOut,i.assetOutDecimals),spotPrice:R.toDecimal(r,i.assetOutDecimals),tradeFee:R.toDecimal(l,i.assetOutDecimals),tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}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(b=>b.tokens.some(h=>h.id===t)).map(b=>b.type==="Aave"?b.tokens:b.tokens.filter(h=>h.id===t)).map(b=>b.map(h=>h.balance).reduce((h,f)=>h+f)).sort((b,h)=>h<b?-1:1)[0],c=I.getFraction(l,.1),u=await Promise.all(i.map(b=>this.toSellSwaps(c,b,r))),d=this.findBestSellRoute(u).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),g=this.buildRouteKey(t,e,a);return this.mlr.set(g,d),d}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"?R.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(o,s),{amountOut:u,calculatedOut:m,feePct:d,errors:g}=s.validateAndSell(o,l,c),b=this.getPoolFeeRange(c),h=s.spotPriceOutGivenIn(o),f=Math.pow(10,o.decimalsIn),y=l*h/BigInt(f),P=I.calculateDiffToRef(m,y);i.push({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:u,calculatedOut:m,spotPrice:h,tradeFeePct:d,tradeFeeRange:b,priceImpactPct:P,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:R.toDecimal(l,o.decimalsIn),amountOut:R.toDecimal(u,o.decimalsOut),calculatedOut:R.toDecimal(m,o.decimalsOut),spotPrice:R.toDecimal(h,o.decimalsOut),tradeFeePct:d,tradeFeeRange:b,priceImpactPct:P,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),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}}).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];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetInDecimals).reduce((s,o)=>s+o),i=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),a=n-e.assetInDecimals,r=Math.pow(10,a);return i/BigInt(r)}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=Math.pow(10,n.assetOutDecimals),d=n.amountOut*r/BigInt(m),g;return o===0n?g=-100:g=I.calculateDiffToRef(d,o),{type:"Buy",amountOut:n.amountOut,amountIn:i.amountIn,spotPrice:r,tradeFee:l,tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:R.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:R.toDecimal(i.amountIn,i.assetInDecimals),spotPrice:R.toDecimal(r,i.assetInDecimals),tradeFee:R.toDecimal(l,i.assetInDecimals),tradeFeePct:u,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.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"?R.toBigInt(t,o.decimalsOut):t:l=i[0].amountIn;let c=await this.ctx.getPoolFees(o,s),{amountIn:u,calculatedIn:m,feePct:d,errors:g}=s.validateAndBuy(o,l,c),b=this.getPoolFeeRange(c),h=s.spotPriceInGivenOut(o),f=Math.pow(10,o.decimalsOut),y=l*h/BigInt(f),P;m===0n?P=-100:P=I.calculateDiffToRef(y,m),i.unshift({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:u,calculatedIn:m,spotPrice:h,tradeFeePct:d,tradeFeeRange:b,priceImpactPct:P,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:R.toDecimal(l,o.decimalsOut),amountIn:R.toDecimal(u,o.decimalsIn),calculatedIn:R.toDecimal(m,o.decimalsIn),spotPrice:R.toDecimal(h,o.decimalsIn),tradeFeePct:d,tradeFeeRange:b,priceImpactPct:P,errors:g}}})}return i}};import{big as q}from"@galacticcouncil/common";var kn=6e3,Ue=1000000000000000n,Kt=6,We=-5,Ye=216e5,vg=3,Dn=6;import{Enum as Mn}from"polkadot-api";var G=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:i,poolId:a})=>i==="Stableswap"?{pool:Mn("Stableswap",a),asset_in:e,asset_out:n}:{pool:Mn(i),asset_in:e,asset_out:n})}};var yt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Ue})}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:d}=u,{assetOutDecimals:g}=m,b=Math.abs(c),h=this.getMaximumTradeCount(o,r),f=this.getOptimalTradeCount(b),y=a||f,P=Math.round(i/y),S=o/BigInt(y),T=await this.router.getBestSell(t,e,S),v=o<r,_=[];v&&_.push("OrderTooSmall");let k=T.amountOut*BigInt(y),Y=this.toBlockPeriod(P),K=T.tradeFee*BigInt(y),H=G.build(l),N={assetIn:t,assetOut:e,errors:_,maxTradeCount:h,optTradeCount:f,tradeCount:y,tradeFee:K,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,d),amountOut:q.toDecimal(k,g),tradeAmountIn:q.toDecimal(T.amountIn,d),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,d=Math.abs(o),g=this.getTwapTradeCount(d),b=r/BigInt(g),h=await this.router.getBestSell(l.assetIn,c.assetOut,b),f=g===1,y=r<i,P=h.priceImpactPct<-5,S=[];y||f?S.push("OrderTooSmall"):P&&S.push("OrderImpactTooBig");let T=h.amountOut*BigInt(g),v=h.tradeFee*BigInt(g),_=G.build(s),k={assetIn:t,assetOut:e,errors:S,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:_,type:"TwapSell"};return{...k,amountIn:r,amountOut:T,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:v,toHuman(){return{...k,amountIn:q.toDecimal(r,u),amountOut:q.toDecimal(T,m),tradeAmountIn:q.toDecimal(h.amountIn,u),tradeAmountOut:q.toDecimal(h.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,d=Math.abs(o),g=this.getTwapTradeCount(d),b=r/BigInt(g),h=await this.router.getBestBuy(l.assetIn,c.assetOut,b),f=h.amountIn*BigInt(g),y=g===1,P=f<i,S=h.priceImpactPct<-5,T=[];P||y?T.push("OrderTooSmall"):S&&T.push("OrderImpactTooBig");let v=h.tradeFee*BigInt(g),_=G.build(s),k={assetIn:t,assetOut:e,errors:T,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:_,type:"TwapBuy"};return{...k,amountIn:f,amountOut:r,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:v,toHuman(){return{...k,amountIn:q.toDecimal(f,u),amountOut:q.toDecimal(r,m),tradeAmountIn:q.toDecimal(h.amountIn,u),tradeAmountOut:q.toDecimal(h.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 Wn={};A(Wn,{BIG_10:()=>Un,BIG_BILL:()=>Xe,StakingApi:()=>zt,StakingClient:()=>$t});import{calculate_accumulated_rps as os,calculate_percentage_amount as ls,calculate_period_number as Nn,calculate_points as Gn,calculate_rewards as cs,sigmoid as Vn}from"@galacticcouncil/math-staking";import V from"big.js";var de={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},qn=p=>Object.keys(de).includes(p);import{AccountId as as}from"polkadot-api";import{toHex as rs}from"@polkadot-api/utils";import{HYDRATION_SS58_PREFIX as ss}from"@galacticcouncil/common";function Hn(p){let t=("modl"+p).padEnd(32,"\0"),e=new TextEncoder().encode(t),n=rs(e);return as(ss).dec(n)}var ge="20000000000000000",he="2000",Un=V(10),Xe=V(Un.pow(12)),zt=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getPotBalance(){let t=await this.client.getPalletId(),e=Hn(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(),d=await this.client.getReferendumInfo(c);return d&&(d.type==="Approved"||d.type==="Rejected")&&qn(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=de.locked6x,o=V(n.toString()).mul(s),l=100,c=[];t.forEach(d=>{let g=de[d.conviction],b=i.includes(d.id.toString());b&&c.push(d.id.toString());let h=V(d.amount.toString()).mul(l).div(o);a=a.plus(Math.floor(h.mul(g).toNumber())),r=r.plus(Math.floor(h.mul(b?s:g).toNumber()))});let u=Math.floor(V(n.toString()).mul(s).mul(l).div(o).toNumber());i.forEach(d=>{c.includes(d)||(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,d,g,b]=await Promise.all([this.getPotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getTimePointsPerPeriod(),this.client.getTimePointsWeight(),this.client.getActionPointsWeight(),this.client.getSixBlockSince()]),h=V(l.transferable.toString()).minus(a.toString()),f=h.gt(0)&&s>0?os(r.toString(),h.toString(),s.toString()):r.toString(),y=Nn(c.toString(),n,b),P=Nn(c.toString(),o.createdAt.toString(),b),S=cs(f,o.rewardPerStake.toString(),o.stake.toString()),T=this.getCurrentActionPoints(o.votes,o.actionPoints,o.stake,e),v=Gn(P,y,m.toString(),d.toString(),T.currentActionPoints,g.toString(),o.accumulatedSlashPoints.toString()),_=Vn(v,ge,he),k=(()=>{if(!e.length)return;let St=Gn(P,y,m.toString(),d.toString(),T.maxActionPoints.toString(),g.toString(),o.accumulatedSlashPoints.toString());return Vn(St,ge,he)})(),Y=V(S).plus(o.accumulatedUnpaidRewards.toString()).plus(o.accumulatedLockedRewards.toString());if(V(y).minus(P).lte(u.toString()))return{rewards:"0",payablePercentage:_,extraPayablePercentage:k,constants:{a:ge,b:he}};let K=ls(Y.toString(),_),H=V(o.accumulatedLockedRewards.toString()),N=H.gt(K)?H:V(K);return{rewards:N.div(Xe).toString(),maxRewards:Y.div(Xe).toString(),allocatedRewardsPercentage:N.div(Y).mul(100).toNumber(),points:v,payablePercentage:_,extraPayablePercentage:k,constants:{a:ge,b:he}}}};var $t=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 Kn={};A(Kn,{TxBuilderFactory:()=>Pt});import{Enum as Xn}from"polkadot-api";function Yn(p){let t=[],e=p;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var ft=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:Te})}async dryRun(t,e){let n=Xn("Signed",t),i=Xn("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=Yn(s.value);throw new Error("Dry run execution error!",{cause:o})}return r}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var be=class extends ft{_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 Ke}from"polkadot-api";var ye=class extends ft{_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:Ke("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:Ke("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:Ke("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 Pt=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 ye(this.client,this.evmClient).setOrder(t)}};async function Zh(p){let t=new st(p),e=new At(p),[n,i]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),a=new gt(p,e).withAave().withOmnipool().withStableswap().withXyk(),r=new X(p),s=new $t(p),o=new Ft(p),l=new Z(e),c=new bt(a),u=new yt(c,{blockTime:n,minBudgetInNative:i}),m=new zt(s,r),d=new _t(o,r,{blockTime:n});return{api:{aave:l,router:c,scheduler:u,staking:m,farm:d},client:{asset:new nt(p),balance:r,evm:e},ctx:{pool:a},tx:new Pt(p,e),destroy:()=>{a.destroy()}}}export{re as QueryBus,Ze as aave,Qe as api,nn as client,tn as const,Zh as createSdkContext,an as error,ln as evm,hn as farm,x as fmt,Ot as json,I as math,Cn as pool,Ln as sor,Wn as staking,Kn as tx};
|