@galacticcouncil/sdk-next 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var vn=Object.create;var Ne=Object.defineProperty;var wn=Object.getOwnPropertyDescriptor;var xn=Object.getOwnPropertyNames;var Tn=Object.getPrototypeOf,In=Object.prototype.hasOwnProperty;var pr=(c,t)=>()=>(c&&(t=c(c=0)),t);var R=(c,t)=>{for(var e in t)Ne(c,e,{get:t[e],enumerable:!0})},qe=(c,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of xn(t))!In.call(c,r)&&r!==e&&Ne(c,r,{get:()=>t[r],enumerable:!(i=wn(t,r))||i.enumerable});return c},Ft=(c,t,e)=>(qe(c,t,"default"),e&&qe(e,t,"default")),vt=(c,t,e)=>(e=c!=null?vn(Tn(c)):{},qe(t||!c||!c.__esModule?Ne(e,"default",{value:c,enumerable:!0}):e,c)),_n=c=>qe(Ne({},"__esModule",{value:!0}),c);var Zt={};var br=pr(()=>{Ft(Zt,require("@polkadot-api/smoldot"))});var te={};var yr=pr(()=>{Ft(te,require("@polkadot-api/known-chains/polkadot"))});var gs={};R(gs,{QueryBus:()=>ue,aave:()=>_i,api:()=>vi,async:()=>le,calc:()=>N,client:()=>Bi,const:()=>Oi,createSdkContext:()=>ds,error:()=>Ri,evm:()=>ki,farm:()=>Ui,fmt:()=>O,json:()=>qt,math:()=>z,pool:()=>ji,sor:()=>rr,staking:()=>ar,tx:()=>lr});module.exports=_n(gs);var vi={};R(vi,{Papi:()=>L,Watcher:()=>Jt,getSm:()=>Bn,getWs:()=>On});var He=require("@galacticcouncil/descriptors");var dr=require("@galacticcouncil/common"),Rt=require("rxjs");var ft=require("rxjs"),G=require("rxjs/operators");function mr(c,{intervalMs:t=5e3,rpcTimeoutMs:e=1e4}={}){let i=()=>(0,ft.defer)(()=>(0,ft.from)(c._request("system_health",[]))).pipe((0,G.timeout)({first:e}),(0,G.map)(()=>"online"),(0,G.catchError)(()=>(0,ft.of)("offline")));return(0,ft.of)({state:"offline",delayMs:0}).pipe((0,G.expand)(n=>(0,ft.timer)(n.delayMs).pipe((0,G.switchMap)(i),(0,G.map)(s=>({state:s,delayMs:t})))),(0,G.skip)(1),(0,G.map)(n=>n.state),(0,G.distinctUntilChanged)(),(0,G.shareReplay)({bufferSize:1,refCount:!0}))}var{logger:An}=dr.log,Jt=class c{static instance=null;bestBlock$;finalizedBlock$;connection$;constructor(t){this.bestBlock$=this.watched("watcher(bestBlock)",t.getUnsafeApi().query.System.Number.watchValue({at:"best"}).pipe((0,Rt.map)(({value:e})=>e))),this.finalizedBlock$=this.watched("watcher(finalizedBlock)",t.finalizedBlock$),this.connection$=this.watched("watcher(connection)",mr(t))}static getInstance(t){return this.instance||(this.instance=new c(t)),this.instance}watched(t,e){return e.pipe((0,Rt.tap)({error:i=>An.error(t,i)}),(0,Rt.shareReplay)({bufferSize:1,refCount:!0}))}};var L=class{client;api;apiNext;watcher;constructor(t){this.client=t,this.api=this.client.getTypedApi(He.hydration),this.apiNext=this.client.getTypedApi(He.hydrationNext),this.watcher=Jt.getInstance(this.client)}};var gr=require("polkadot-api/ws"),hr=require("polkadot-api/logs-provider"),On=(c,t={})=>{let e=typeof c=="string"?c.split(","):c,i=(0,gr.getWsProvider)(e,t);return(0,hr.withLogsRecorder)(r=>console.log(r),i),i};var fr=require("polkadot-api/sm-provider");async function Bn(c){let{start:t}=await Promise.resolve().then(()=>(br(),Zt)),{chainSpec:e}=await Promise.resolve().then(()=>(yr(),te)),i=t(),r=await i.addChain({chainSpec:e}),n=await i.addChain({chainSpec:c,potentialRelayChains:[r]});return(0,fr.getSmProvider)(()=>n)}var _i={};R(_i,{AAVE_GAS_LIMIT:()=>Ti,AAVE_LENDING_POOL_ADDRESS:()=>Ve,AAVE_POOL_ABI:()=>wi,AAVE_POOL_DATA_PROVIDER:()=>Ue,AAVE_POOL_DATA_PROVIDER_ABI:()=>Ge,AAVE_POOL_PROXY:()=>xi,AAVE_ROUNDING_THRESHOLD:()=>qs,AAVE_UINT_256_MAX:()=>Fn,AaveClient:()=>ee,AaveUtils:()=>_t});var wi=[{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 Ge=[{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 xi="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Ue="0x112b087b60C1a166130d59266363C45F8aa99db0",Ve="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Ti=1000000n,qs=5,Fn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var ee=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:Ge,address:Ue,args:[Ve],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:Ge,address:Ue,args:[Ve,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:wi,address:xi,args:[t],functionName:"getUserAccountData"})}};var q=vt(require("big.js")),st=require("@galacticcouncil/common");var{ERC20:Ct}=st.erc20,{H160:Ii}=st.h160,Rn=1.01,Cn=31536000n,Pr=4,We=-1,ze=10n**27n,_t=class{client;constructor(t){this.client=new ee(t)}async getSummary(t){let e=Ii.fromAny(t),[i,r,n,s]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e),this.client.getBlockTimestamp()]),[a]=i,[o,l]=r,[u,p,d,m,h,b]=n,g=st.big.toDecimal(b,18),P=[];for(let y of o){let v=y.underlyingAsset.toLowerCase(),S=a.find(({underlyingAsset:Si})=>Si.toLowerCase()===v);if(!S)throw new Error("Missing pool reserve for "+v);let T=y.scaledATokenBalance,B=S.liquidityIndex,H=S.liquidityRate,W=S.availableLiquidity,ut=S.priceInMarketReferenceCurrency,yt=s+6,Z=this.calculateLinearInterest(H,S.lastUpdateTimestamp,yt),nt=B*Z/ze,Qt=T*nt/ze,Me=Number(l!==0&&l===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,De=S.usageAsCollateralEnabled&&y.usageAsCollateralEnabledOnUser&&y.scaledATokenBalance>0n,Le=Ct.toAssetId(v);P.push({aTokenBalance:Qt,availableLiquidity:W,decimals:Number(S.decimals),isCollateral:De,priceInRef:ut,reserveId:Le,reserveAsset:v,reserveLiquidationThreshold:Me})}return{healthFactor:Number(g),currentLiquidationThreshold:Number(st.big.toDecimal(m,Pr)),totalCollateral:u,totalDebt:p,reserves:P}}async hasBorrowPositions(t){let e=Ii.fromAny(t),i=await this.client.getUserAccountData(e),[r,n]=i;return n>0n}async getHealthFactor(t){let e=Ii.fromAny(t),i=await this.client.getUserAccountData(e),[r,n,s,a,o,l]=i;return this.calculateHealthFactorFromBalances(n,r,a)}async getHealthFactorAfterWithdraw(t,e,i){let{totalCollateral:r,totalDebt:n,reserves:s,currentLiquidationThreshold:a}=await this.getSummary(t);if(n===0n)return We;let o=Ct.fromAssetId(e),l=s.find(v=>v.reserveAsset===o);if(!l)throw new Error("Missing reserve ctx for "+o);let{decimals:u,isCollateral:p,priceInRef:d,reserveLiquidationThreshold:m}=l,h=st.big.toBigInt(i,u),b=p?h*d/10n**BigInt(u):0n,g=r-b;if(g<=0n)return 0;let P=(0,q.default)(r.toString()).mul(a).minus((0,q.default)(b.toString()).mul(m)).div(g.toString()),y=(0,q.default)(g.toString()).mul(P).div(n.toString()).toFixed(6,q.default.roundDown);return Number(y)}async getHealthFactorAfterSupply(t,e,i){let{totalCollateral:r,totalDebt:n,reserves:s,currentLiquidationThreshold:a}=await this.getSummary(t);if(n===0n)return We;let o=Ct.fromAssetId(e),l=s.find(y=>y.reserveAsset===o);if(!l)throw new Error("Missing reserve ctx for "+o);let{decimals:u,priceInRef:p,reserveLiquidationThreshold:d}=l,h=st.big.toBigInt(i,u)*p/10n**BigInt(u),b=r+h;if(b<=0n)return 0;let g=(0,q.default)(r.toString()).mul(a).plus((0,q.default)(h.toString()).mul(d)).div(b.toString()),P=(0,q.default)(b.toString()).mul(g).div(n.toString()).toFixed(6,q.default.roundDown);return Number(P)}async getHealthFactorAfterSwap(t,e,i,r,n){let{totalDebt:s,reserves:a,healthFactor:o}=await this.getSummary(t);if(s===0n)return We;let l=Ct.fromAssetId(i),u=Ct.fromAssetId(n),p=a.find(B=>B.reserveAsset===l),d=a.find(B=>B.reserveAsset===u);if(!p)throw new Error(`Missing reserve ctx for ${l}`);if(!d)throw new Error(`Missing reserve ctx for ${d}`);let m=st.big.toBigInt(e,p.decimals),h=st.big.toBigInt(r,d.decimals),b=m*p.priceInRef/10n**BigInt(p.decimals),g=h*d.priceInRef/10n**BigInt(d.decimals),P=p.isCollateral?(0,q.default)(b.toString()).mul(p.reserveLiquidationThreshold):(0,q.default)(0),S=(d.isCollateral?(0,q.default)(g.toString()).mul(d.reserveLiquidationThreshold):(0,q.default)(0)).minus(P).div(s.toString()),T=(0,q.default)(o).plus(S).toFixed(6,q.default.roundDown);return Number(T)}async getMaxWithdraw(t,e){let{totalDebt:i,reserves:r,healthFactor:n}=await this.getSummary(t),s=Ct.fromAssetId(e),a=r.find(o=>o.reserveAsset===s);if(!a)throw new Error("Missing reserve ctx for "+s);return this.calculateWithdrawMax(a,i,n)}async getMaxWithdrawAll(t){let{totalDebt:e,reserves:i,healthFactor:r}=await this.getSummary(t),n={};for(let s of i){let a=this.calculateWithdrawMax(s,e,r);s.reserveId&&(n[s.reserveId]=a)}return n}calculateWithdrawMax(t,e,i){let{aTokenBalance:r,availableLiquidity:n,decimals:s,priceInRef:a,reserveLiquidationThreshold:o,isCollateral:l}=t,u=r;if(l&&e>0n){let d=i-Rn;if(d>0){let m=(0,q.default)(d).mul(e.toString()).div(o).toFixed(0,q.default.roundDown),h=(0,q.default)(m).div(a.toString()).mul(10**s).toFixed(0,q.default.roundDown);u=r<BigInt(h)?r:BigInt(h)}else u=0n}return{amount:u<n?u:n,decimals:s}}calculateLinearInterest(t,e,i){let r=i-e;if(r<=0)return ze;let n=t*BigInt(r)/Cn;return ze+n}calculateHealthFactorFromBalances(t,e,i){if(t===0n)return We;let r=e*i/t,n=st.big.toDecimal(r,Pr);return Number(n)}};var Bi={};R(Bi,{AssetClient:()=>Et,BalanceClient:()=>pt,ChainParams:()=>Lt});var ie=require("polkadot-api");var Et=class extends L{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:i,value:r})=>{let[n]=i;return[n,r]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:i,value:r})=>{let[n]=i;return[n,r]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:i})=>{let{asset_type:r}=i;return this.SUPPORTED_TYPES.includes(r.type)}).map(({keyArgs:i,value:r})=>{let[n]=i;return[n,r]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:i,value:r})=>{let[n]=i;return[n,r]}))}async mapToken(t,e,i,r){let{name:n,asset_type:s,is_sufficient:a,existential_deposit:o}=e,{symbol:l,decimals:u}=i.get(t)??{};return{id:t,name:n?ie.Binary.toText(n):void 0,symbol:l,decimals:u,icon:l,type:s.type,isSufficient:a,location:r,existentialDeposit:o}}async mapBond(t,e,i,r){let[n,s]=r,{asset_type:a,is_sufficient:o,existential_deposit:l}=e,{symbol:u,decimals:p}=await this.mapToken(n,e,i),d=Number(s),m=new Intl.DateTimeFormat("en-GB"),h=[u,"Bond",m.format(d)].join(" ");return{id:t,name:h,symbol:u+"b",decimals:p,icon:u,type:a.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:n,maturity:d}}async mapShares(t,e,i,r){let{assets:n}=r,{name:s,symbol:a,asset_type:o,is_sufficient:l,existential_deposit:u}=e,p=await Promise.all(n.map(async h=>{let{symbol:b}=await this.mapToken(h,e,i);return[h,b]})),d=Object.fromEntries(p),m=Object.values(d);return{id:t,name:m.join(", "),symbol:a&&ie.Binary.toText(a)||s&&ie.Binary.toText(s),decimals:18,icon:m.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:d}}async mapExternal(t,e,i,r){let n=await this.mapToken(t,e,new Map,r),s=i?.find(a=>a.internalId===n.id);return s?{...n,decimals:s.decimals,name:s.name,symbol:s.symbol,icon:s.symbol,isWhiteListed:s.isWhiteListed}:n}parseMetadata(t){return new Map(Array.from(t,([e,i])=>[e,{symbol:i.symbol?ie.Binary.toText(i.symbol):void 0,decimals:i.decimals}]))}async getSupported(t,e){let[i,r,n,s]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),a=this.parseMetadata(i),o=[];for(let[l,u]of Array.from(i)){let p=r.get(l),{asset_type:d}=u,m;switch(d.type){case"Bond":let h=s.get(l);m=await this.mapBond(l,u,a,h);break;case"StableSwap":let b=n.get(l);m=await this.mapShares(l,u,a,b);break;case"External":m=await this.mapExternal(l,u,e,p);break;default:m=await this.mapToken(l,u,a,p)}o.push(m)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};var Sr=require("@galacticcouncil/common"),tt=require("rxjs"),w=require("rxjs/operators");var Oi={};R(Oi,{HUB_ASSET_ID:()=>re,HYDRATION_OMNIPOOL_ADDRESS:()=>kn,HYDRATION_PARACHAIN_ID:()=>En,PERBILL_DENOMINATOR:()=>Ai,PERMILL_DENOMINATOR:()=>kt,SYSTEM_ASSET_DECIMALS:()=>Ye,SYSTEM_ASSET_ID:()=>E,TRADEABLE_DEFAULT:()=>Mt});var kt=1e6,Ai=1e9,E=0,Ye=12,En=2034,kn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",re=1,Mt=15;var{logger:Dt}=Sr.log,pt=class extends L{erc20Ids=null;constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:i}=await e.getValue(t,{at:"best"});return this.getBreakdown(i)}async getTokenBalance(t,e){let r=await this.api.query.Tokens.Accounts.getValue(t,e,{at:"best"});return this.getBreakdown(r)}async getErc20Balance(t,e){return this.getBalanceData(t,e)}watchBalance(t){return(0,tt.defer)(()=>{let e=this.watchSystemBalance(t),i=this.watchTokensBalance(t),r=this.watchErc20Balance(t);return(0,tt.combineLatest)([e,i,r]).pipe((0,w.connect)(n=>(0,tt.concat)(n.pipe((0,w.take)(1)),n.pipe((0,w.skip)(1),(0,w.debounceTime)(250)))))}).pipe((0,w.map)(e=>e.flat()),(0,w.startWith)([]),(0,w.bufferCount)(2,1),(0,w.map)(([e,i],r)=>r===0?i:this.getDeltas(e,i))).pipe((0,w.tap)({subscribe:()=>Dt.debug("balance: subscribe",t),error:e=>Dt.error("balance",e)}),(0,w.retry)({delay:1e3}))}watchSystemBalance(t){let e=this.api.query.System.Account;return(0,tt.defer)(()=>e.watchValue(t,{at:"best"})).pipe((0,w.map)(({value:i})=>({id:0,balance:this.getBreakdown(i.data)})),(0,w.tap)({error:i=>Dt.error("balance(system)",i)}))}watchTokenBalance(t,e){let i=this.api.query.Tokens.Accounts;return(0,tt.defer)(()=>i.watchValue(t,e,{at:"best"})).pipe((0,w.map)(({value:r})=>({id:e,balance:this.getBreakdown(r)})),(0,w.tap)({error:r=>Dt.error("balance(token)",r)}))}watchTokensBalance(t){let e=this.api.query.Tokens.Accounts;return(0,tt.defer)(()=>e.watchEntries(t,{at:"best"})).pipe((0,w.distinctUntilChanged)((i,r)=>!r.deltas),(0,w.map)(({deltas:i})=>{let r=[];return i?.deleted.forEach(n=>{let[s,a]=n.args;r.push({id:a,balance:this.getBreakdown({free:0n,reserved:0n,frozen:0n})})}),i?.upserted.forEach(n=>{let[s,a]=n.args;r.push({id:a,balance:this.getBreakdown(n.value)})}),r}),(0,w.tap)({error:i=>Dt.error("balance(tokens)",i)}))}watchErc20Balance(t,e){let i=async()=>{if(this.erc20Ids)return this.erc20Ids;let n=await this.api.query.AssetRegistry.Assets.getEntries({at:"best"});return this.erc20Ids=n.filter(({value:s})=>s.asset_type.type==="Erc20").map(({keyArgs:s})=>{let[a]=s;return a}),this.erc20Ids},r=async n=>(await Promise.all(n.map(async a=>[a,await this.getBalanceData(t,a)]))).map(([a,o])=>({id:a,balance:o}));return(0,tt.defer)(()=>(0,tt.from)(e?Promise.resolve(e):i()).pipe((0,w.switchMap)(n=>this.watcher.bestBlock$.pipe((0,w.switchMap)(()=>(0,tt.from)(r(n))))),(0,w.startWith)([]),(0,w.bufferCount)(2,1),(0,w.map)(([n,s],a)=>a===0?s.filter(o=>o.balance.total>0n):this.getDeltas(n,s)),(0,w.distinctUntilChanged)((n,s)=>s.length===0),(0,w.tap)({error:n=>Dt.error("balance(erc20)",n)})))}async getBalanceData(t,e){let i=await this.api.apis.CurrenciesApi.account(e,t,{at:"best"});return this.getBreakdown(i)}getBreakdown(t){let e=t.free>=t.frozen?t.free-t.frozen:0n,i=t.free+t.reserved;return{free:t.free,reserved:t.reserved,frozen:t.frozen,total:i,transferable:e}}getDeltas(t,e){let i=(n,s)=>n!==void 0&&s!==void 0&&n.transferable===s.transferable&&n.total===s.total,r=t.reduce((n,s)=>(n.set(s.id,s.balance),n),new Map);return e.filter(n=>!i(n.balance,r.get(n.id)))}};var Lt=class extends L{_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 Ri={};R(Ri,{AssetNotFound:()=>Fi,PoolNotFound:()=>ne,RouteNotFound:()=>se});var Fi=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},ne=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},se=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var ki={};R(ki,{EvmClient:()=>oe,EvmRpcAdapter:()=>ae,createChain:()=>Ei});var Ci=require("polkadot-api"),vr=require("@galacticcouncil/descriptors"),$e=require("viem"),Mn=10000000n,ae=class{api;constructor(t){this.api=t.getTypedApi(vr.hydration)}async getBlock(){let t=await this.api.query.Ethereum.CurrentBlock.getValue({at:"best"}),{header:e}=t,i=e.timestamp/1000n,[r]=e.number;return{timestamp:i,number:r}}readContract=(async t=>{let{abi:e,address:i,functionName:r,args:n}=t,s=(0,$e.encodeFunctionData)({abi:e,functionName:r,args:n}),a=await this.api.apis.EthereumRuntimeRPCApi.call("0x0000000000000000000000000000000000000000",i,Ci.Binary.fromHex(s),[0n,0n,0n,0n],[Mn,0n,0n,0n],void 0,void 0,void 0,!1,[],[]);if(!a.success)throw console.error(r,a.value.type),new Error("Contract read failure");let{exit_reason:o,value:l,used_gas:u}=a.value;if(console.log(u),o.type==="Succeed")return(0,$e.decodeFunctionResult)({abi:e,functionName:r,data:Ci.Binary.toHex(l)});throw console.log(r,o.type,o.value.type),new Error("Contract read error")})};var wr=require("viem"),Dn=["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"],Ei=()=>(0,wr.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Dn}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});var mt=require("viem");var oe=class{client;chain;constructor(t){this.client=t,this.chain=Ei()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return(0,mt.createPublicClient)({chain:this.chain,transport:(0,mt.http)()})}getWsProvider(){return(0,mt.createPublicClient)({transport:(0,mt.custom)({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return(0,mt.createWalletClient)({account:t,chain:this.chain,transport:(0,mt.custom)(window.ethereum)})}getRPCAdapter(){return new ae(this.client)}};var Ui={};R(Ui,{LiquidityMiningApi:()=>pe,LiquidityMiningClient:()=>de});var Mr=require("polkadot-api"),Y=vt(require("big.js")),Pt=require("@galacticcouncil/common"),Gi=require("@galacticcouncil/math-liquidity-mining");var le={};R(le,{withTimeout:()=>Ln});function Ln(c,t,e="timeout"){return new Promise((i,r)=>{let n=setTimeout(()=>r(new Error(e)),t);c.then(s=>{clearTimeout(n),i(s)},s=>{clearTimeout(n),r(s)})})}var N={};R(N,{divSpot:()=>Nn,getFraction:()=>Hn,mulScaled:()=>xr,mulSpot:()=>qn});var Mi=require("@galacticcouncil/common");function xr(c,t,e,i,r){let n=e+i-r,s=c*t;return n>0?s/BigInt(10)**BigInt(n):n<0?s*BigInt(10)**BigInt(-n):s}function qn(c,t,e,i){return xr(c,t,e,Mi.RUNTIME_DECIMALS,i)}function Nn(c,t,e,i){if(t===0n)return 0n;let r=BigInt(10)**BigInt(Mi.RUNTIME_DECIMALS+i-e);return c*r/t}function Hn(c,t,e=2){if(t<.01||t>100)throw new Error("Supported range is from 0.01% - 100%");let i=BigInt(10)**BigInt(e),r=BigInt(Math.round(t*Number(i)));return c*r/(BigInt(100)*i)}var O={};R(O,{FeeUtils:()=>Di,shiftNeg:()=>Gn});var Tr=vt(require("big.js"));var Di=class c{static toPct(t){let[e,i]=t;return c.safeDivide(e*100,i)}static toRaw(t){let[e,i]=t;return c.safeDivide(e,i)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,i=12){let r=10**i;return Math.round(t*r/e)/r}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Gn(c,t){let e=(0,Tr.default)(typeof c=="bigint"?c.toString():c);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var qt={};R(qt,{findNestedKey:()=>Un,findNestedObj:()=>Vn,jsonFormatter:()=>Wn});var Un=(c,t)=>{let e=[];return JSON.stringify(c,(i,r)=>(r&&r[t]&&e.push(r),r)),e[0]},Vn=(c,t,e)=>{let i;return JSON.stringify(c,(r,n)=>(n&&n[t]===e&&(i=n),n)),i},Wn=(c,t)=>typeof t=="bigint"?t.toString():t;var z={};R(z,{calculateBuyFee:()=>Xn,calculateDiffToAvg:()=>zn,calculateDiffToRef:()=>Yn,calculateSellFee:()=>$n});var dt=vt(require("big.js"));function zn(c,t){let e=(0,dt.default)(c.toString()),i=(0,dt.default)(t.toString());return e.minus(i).abs().div(e.plus(i).div(2)).mul(100).round(2).toNumber()}function Yn(c,t){if(t===0n)return 0;let e=(0,dt.default)(c.toString()),i=(0,dt.default)(t.toString());return e.minus(i).div(i).mul(100).round(2).toNumber()}function $n(c,t){if(c===0n)return 0;let e=(0,dt.default)(c.toString()),i=(0,dt.default)(t.toString());return(0,dt.default)(1).minus(i.div(e)).mul(100).round(2).toNumber()}function Xn(c,t){if(c===0n)return 0;let e=(0,dt.default)(c.toString());return(0,dt.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}var ce=(c,t)=>c===t?0:c==null?t==null?0:-1:t==null?c==null?0:1:typeof c.compare=="function"?c.compare(t):typeof t.compare=="function"?-t.compare(c):c<t?-1:c>t?1:0;var Xe=(c,t=e=>e!==void 0?": "+e:"")=>class extends Error{origMessage;constructor(e){super(c(e)+t(e)),this.origMessage=e!==void 0?String(e):""}};var Kn=Xe(()=>"illegal argument(s)"),Ir=c=>{throw new Kn(c)};var jn=Xe(()=>"index out of bounds"),Li=c=>{throw new jn(c)},Ke=(c,t,e)=>(c<t||c>=e)&&Li(c);var _r=23283064365386963e-26,je=class{float(t=1){return this.int()*_r*t}probability(t){return this.float()<t}norm(t=1){return(this.int()*_r-.5)*2*t}normMinMax(t,e){let i=this.minmax(t,e);return this.float()<.5?i:-i}minmax(t,e){return this.float()*(e-t)+t}minmaxInt(t,e){t|=0;let i=(e|0)-t;return i?t+this.int()%i:t}minmaxUint(t,e){t>>>=0;let i=(e>>>0)-t;return i?t+this.int()%i:t}};var Qe=class extends je{constructor(t){super(),this.rnd=t}float(t=1){return this.rnd()*t}norm(t=1){return(this.rnd()-.5)*2*t}int(){return this.rnd()*4294967296>>>0}};var Ar=new Qe(Math.random);var Or=c=>c!=null&&typeof c!="function"&&c.length!==void 0;var Br=Object.getPrototypeOf({}),Je="function",Fr="string",Nt=(c,t)=>{let e;if(c===t)return!0;if(c!=null){if(typeof c.equiv===Je)return c.equiv(t)}else return c==t;if(t!=null){if(typeof t.equiv===Je)return t.equiv(c)}else return c==t;return typeof c===Fr||typeof t===Fr?!1:(e=Object.getPrototypeOf(c),(e==null||e===Br)&&(e=Object.getPrototypeOf(t),e==null||e===Br)?ts(c,t):typeof c!==Je&&c.length!==void 0&&typeof t!==Je&&t.length!==void 0?Qn(c,t):c instanceof Set&&t instanceof Set?Jn(c,t):c instanceof Map&&t instanceof Map?Zn(c,t):c instanceof Date&&t instanceof Date?c.getTime()===t.getTime():c instanceof RegExp&&t instanceof RegExp?c.toString()===t.toString():c!==c&&t!==t)},Qn=(c,t,e=Nt)=>{let i=c.length;if(i===t.length)for(;i-- >0&&e(c[i],t[i]););return i<0},Jn=(c,t,e=Nt)=>c.size===t.size&&e([...c.keys()].sort(),[...t.keys()].sort()),Zn=(c,t,e=Nt)=>c.size===t.size&&e([...c].sort(),[...t].sort()),ts=(c,t,e=Nt)=>{if(Object.keys(c).length!==Object.keys(t).length)return!1;for(let i in c)if(!t.hasOwnProperty(i)||!e(c[i],t[i]))return!1;return!0};var qi=class{value;constructor(t){this.value=t}deref(){return this.value}};var Rr=c=>c instanceof qi;var Ze=class c{_head;_length=0;constructor(t){t&&this.into(t)}get length(){return this._length}get head(){return this._head}[Symbol.iterator](){return Cr("next",this._head)}reverseIterator(){return Cr("prev",this.tail)}clear(){this.release()}compare(t,e=ce){let i=this._length;if(i<t._length)return-1;if(i>t._length)return 1;if(i===0)return 0;{let r=this._head,n=t._head,s=0;for(;i-- >0&&s===0;)s=e(r.value,n.value),r=r.next,n=n.next;return s}}concat(...t){let e=this.copy();for(let i of t)e.into(i);return e}equiv(t){if(!(t instanceof c||Or(t))||this._length!==t.length)return!1;if(!this._length||this===t)return!0;let e=t[Symbol.iterator](),i=this._head;for(let r=this._length;r-- >0;){if(!Nt(i.value,e.next().value))return!1;i=i.next}return!0}filter(t){let e=this.empty();return this.traverse(i=>(t(i.value)&&e.append(i.value),!0)),e}find(t){return this.traverse(e=>e.value!==t)}findWith(t){return this.traverse(e=>!t(e.value))}first(){return this._head?.value}insertSorted(t,e){e=e||ce;for(let i=this._head,r=this._length;r-- >0;){if(e(t,i.value)<=0)return this.insertBefore(i,t);i=i.next}return this.append(t)}into(t){for(let e of t)this.append(e);return this}nth(t,e){let i=this.nthCell(t);return i?i.value:e}nthCellUnsafe(t){let e,i;for(t<=this._length>>>1?(e=this._head,i="next"):(e=this.tail,i="prev",t=this._length-t-1);t-- >0&&e;)e=e[i];return e}peek(){return this.tail?.value}$reduce(t,e){let i=this._head;for(let r=this._length;r-- >0&&!Rr(e);)e=t(e,i.value),i=i.next;return e}reduce(t,e){return this.$reduce(t,e)}release(){let t=this._head;if(!t)return!0;let e;for(let i=this._length;i-- >0;)e=t.next,delete t.value,delete t.prev,delete t.next,t=e;return this._head=void 0,this._length=0,!0}reverse(){let t=this._head,e=this.tail,i=(this._length>>>1)+(this._length&1);for(;t&&e&&i>0;){let r=t.value;t.value=e.value,e.value=r,t=t.next,e=e.prev,i--}return this}setHead(t){let e=this._head;return e?(e.value=t,e):this.prepend(t)}setNth(t,e){let i=this.nthCell(t);return!i&&Li(t),i.value=e,i}setTail(t){let e=this.tail;return e?(e.value=t,e):this.append(t)}swap(t,e){if(t!==e){let i=t.value;t.value=e.value,e.value=i}return this}toArray(t=[]){return this.traverse(e=>(t.push(e.value),!0)),t}toJSON(){return this.toArray()}toString(){let t=[];return this.traverse(e=>(t.push(String(e.value)),!0)),t.join(", ")}traverse(t,e=this._head,i){if(!this._head)return;let r=e;do{if(!t(r))break;r=r.next}while(r!==i);return r}_map(t,e){return this.traverse(i=>(t.append(e(i.value)),!0)),t}};function*Cr(c,t){for(;t;)yield t.value,t=t[c]}var ti=class c extends Ze{_tail;constructor(t){super(),t&&this.into(t)}get tail(){return this._tail}append(t){if(this._tail){let e={value:t,prev:this._tail};return this._tail.next=e,this._tail=e,this._length++,e}else return this.prepend(t)}asHead(t){return t===this._head?this:(this.remove(t),this._head.prev=t,t.next=this._head,t.prev=void 0,this._head=t,this._length++,this)}asTail(t){return t===this._tail?this:(this.remove(t),this._tail.next=t,t.prev=this._tail,t.next=void 0,this._tail=t,this._length++,this)}cons(t){return this.prepend(t),this}copy(){return new c(this)}*cycle(){for(;;)yield*this}drop(){let t=this._head;if(t)return this._head=t.next,this._head?this._head.prev=void 0:this._tail=void 0,this._length--,t.value}empty(){return new c}insertAfter(t,e){let i={value:e,next:t.next,prev:t};return t.next?t.next.prev=i:this._tail=i,t.next=i,this._length++,i}insertAfterNth(t,e){return t<0&&(t+=this._length),t>=this._length-1?this.append(e):(Ke(t,0,this._length),this.insertAfter(this.nthCellUnsafe(t),e))}insertBefore(t,e){let i={value:e,next:t,prev:t.prev};return t.prev?t.prev.next=i:this._head=i,t.prev=i,this._length++,i}insertBeforeNth(t,e){return t<0&&(t+=this._length),t<=0?this.prepend(e):(Ke(t,0,this._length),this.insertBefore(this.nthCellUnsafe(t),e))}map(t){return this._map(new c,t)}nth(t,e){let i=this.nthCell(t);return i?i.value:e}nthCell(t){if(t<0&&(t+=this._length),!(t<0||t>=this._length))return this.nthCellUnsafe(t)}pop(){let t=this._tail;if(t)return this._tail=t.prev,this._tail?this._tail.next=void 0:this._head=void 0,this._length--,t.value}prepend(t){let e={value:t,next:this._head};return this._head?this._head.prev=e:this._tail=e,this._head=e,this._length++,e}push(t){return this.append(t),this}release(){return this._tail=void 0,super.release()}remove(t){return t.prev?t.prev.next=t.next:this._head=t.next,t.next?t.next.prev=t.prev:this._tail=t.prev,this._length--,this}rotateLeft(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:return this.push(this.drop())}}rotateRight(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:let t=this.peek();return this.pop(),this.prepend(t),this}}seq(t=0,e=this.length){if(t>=e||t<0)return;let i=this.nthCell(t),r=this.nthCell(e-1),n=s=>({first(){return s.value},next(){return s!==r&&s.next?n(s.next):void 0}});return i?n(i):void 0}shuffle(t,e=Ar){if(this._length<2)return this;for(t=t!==void 0?t:Math.ceil(1.5*Math.log2(this._length));t>0;t--){let i=this._head;for(;i;){let r=i.next;e.probability(.5)?this.asHead(i):this.asTail(i),i=r}}return this}slice(t=0,e=this.length){let i=t<0?t+this._length:t,r=e<0?e+this._length:e;(i<0||r<0)&&Ir("invalid indices: ${from} / ${to}");let n=new c,s=this.nthCell(i);for(;s&&++i<=r;)n.push(s.value),s=s.next;return n}sort(t=ce){if(!this._length)return this;let e=1;for(;;){let i=this._head;this._head=void 0,this._tail=void 0;let r=0;for(;i;){r++;let n=i,s=0;for(let o=0;o<e&&(s++,n=n.next,!!n);o++);let a=e;for(;s>0||a>0&&n;){let o;s===0?(o=n,n=n.next,a--):!n||a===0||t(i.value,n.value)<=0?(o=i,i=i.next,s--):(o=n,n=n.next,a--),this._tail?this._tail.next=o:this._head=o,o.prev=this._tail,this._tail=o}i=n}if(this._tail.next=void 0,r<=1)return this;e*=2}}splice(t,e=0,i){let r;typeof t=="number"?(t<0&&(t+=this._length),Ke(t,0,this._length),r=this.nthCellUnsafe(t)):r=t;let n=new c;if(e>0)for(;r&&e-- >0;)this.remove(r),n.push(r.value),r=r.next;else r&&(r=r.next);if(i)if(r)for(let s of i)this.insertBefore(r,s);else for(let s of i)this.push(s);return n}};var ei=class c{map;items;opts;_size;constructor(t,e){let i={maxlen:1/0,maxsize:1/0,map:()=>new Map,ksize:()=>0,vsize:()=>0,...e};this.map=i.map(),this.items=new ti,this._size=0,this.opts=i,t&&this.into(t)}get length(){return this.items.length}get size(){return this._size}[Symbol.iterator](){return this.entries()}*entries(){for(let t of this.items)yield[t.k,t]}*keys(){for(let t of this.items)yield t.k}*values(){for(let t of this.items)yield t.v}copy(){let t=this.empty();t.items=this.items.copy();let e=t.items.head;for(;e;)t.map.set(e.value.k,e),e=e.next;return t}empty(){return new c(null,this.opts)}release(){this._size=0,this.map.clear();let t=this.opts.release;if(t){let e;for(;e=this.items.drop();)t(e.k,e.v);return!0}return this.items.release()}has(t){return this.map.has(t)}get(t,e){let i=this.map.get(t);return i?this.resetEntry(i):e}set(t,e){let i=this.opts.ksize(t)+this.opts.vsize(e),r=this.map.get(t),n=Math.max(0,i-(r?r.value.s:0));return this._size+=n,this.ensureSize()?this.doSetEntry(r,t,e,i):this._size-=n,e}into(t){for(let e of t)this.set(e[0],e[1]);return this}async getSet(t,e){let i=this.map.get(t);return i?this.resetEntry(i):this.set(t,await e())}delete(t){let e=this.map.get(t);return e?(this.removeEntry(e),!0):!1}resetEntry(t){return this.items.asTail(t),t.value.v}ensureSize(){let{release:t,maxsize:e,maxlen:i}=this.opts;for(;this._size>e||this.length>=i;){let r=this.items.drop();if(!r)return!1;this.map.delete(r.k),t?.(r.k,r.v),this._size-=r.s}return!0}removeEntry(t){let e=t.value;this.map.delete(e.k),this.items.remove(t),this.opts.release?.(e.k,e.v),this._size-=e.s}doSetEntry(t,e,i,r){t?(this.opts.update?.(e,t.value.v,i),t.value.v=i,t.value.s=r,this.items.asTail(t)):(this.items.push({k:e,v:i,s:r}),this.map.set(e,this.items.tail))}};var At=class c extends ei{constructor(t,e){super(t,{ttl:3600*1e3,autoExtend:!1,...e})}empty(){return new c(null,this.opts)}has(t){return this.get(t)!==void 0}get(t,e){let i=this.map.get(t);if(i){if(i.value.t>=Date.now())return this.resetEntry(i);this.removeEntry(i)}return e}set(t,e,i=this.opts.ttl){let r=this.opts.ksize(t)+this.opts.vsize(e),n=this.map.get(t),s=Math.max(0,r-(n?n.value.s:0));return this._size+=s,this.ensureSize()?this.doSetEntry(n,t,e,r,i):this._size-=s,e}async getSet(t,e,i=this.opts.ttl){let r=this.get(t);return r!==void 0?r:this.set(t,await e(),i)}prune(){let t=Date.now(),e=this.items.head,i=0;for(;e;)e.value.t<t&&(this.removeEntry(e),i++),e=e.next;return i}ensureSize(){let{maxlen:t,maxsize:e}=this.opts,i=Date.now(),r=this.items.head;for(;r&&(this._size>e||this.length>=t);)r.value.t<i&&this.removeEntry(r),r=r.next;return super.ensureSize()}doSetEntry(t,e,i,r,n=this.opts.ttl){let s=Date.now()+n;t?(this.opts.update?.(e,t.value.v,i),t.value.v=i,t.value.s=r,t.value.t=s,this.items.asTail(t)):(this.items.push({k:e,v:i,s:r,t:s,ttl:n}),this.map.set(e,this.items.tail))}resetEntry(t){return this.opts.autoExtend&&(t.value.t=Date.now()+t.value.ttl),super.resetEntry(t)}};var ue=class{debug;constructor(t){this.debug=t||!1}log(t,e,i){this.debug&&console.log(t,e,i)}scope(t,e,i,r){let n=new Map,s=r!==void 0?new At(null,{ttl:r}):new At;return{get:(...u)=>{let p=i(...u);if(n.has(p)){this.log("[live]",t,p);let m=n.get(p);return Promise.resolve(m)}if(s.has(p))return this.log("[memo]",t,p),s.get(p);this.log("[fetch]",t,p);let d=e(...u).catch(m=>{throw s.delete(p),m});return s.set(p,d),d},set:(u,...p)=>{let d=i(...p);this.log("[set-live]",t,d),n.set(d,u)},clear:()=>{this.log("[clear]",t),n.clear(),s.release()}}}};var ii=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let i=0;i<t.length;++i){let[r,n]=t[i];this.result.set(this.getKey(n,r),e[i].free)}}freeBalance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,i,r){let n=this.getKey(t,e),s=this.getKey(t,i),a=this.result.get(n)??0n,o=this.result.get(s)??0n;if(a<r)throw new Error("Attempting to transfer more than is present");this.result.set(n,a+r),this.result.set(s,o+r)}};var wt=vt(require("big.js")),ot=require("@galacticcouncil/math-liquidity-mining");var Ni=vt(require("big.js")),Hi=(0,Ni.default)(10).pow(18),Er=BigInt((0,Ni.default)(1).pow(18).toString()),kr=6e3;var es="1000000000000000000",ri=class{constructor(t,e,i){this.getAccount=t;this.getAsset=e;this.multiCurrency=i}async syncGlobalFarm(t,e,i){if(t.state.type!=="Active"||t.updated_at===e)return null;if(t.total_shares_z===0n)return t;let r=await this.getAsset(t.reward_currency),n=e-t.updated_at,s=this.getAccount(t.id),a=r?.existential_deposit;if(!a)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.freeBalance(t.reward_currency,s),l=(0,wt.default)(a.toString()),u=(0,wt.default)(o.toString()).minus(l.lt(o.toString())?a.toString():o.toString()),p=(0,wt.default)((0,ot.calculate_global_farm_rewards)(t.total_shares_z.toString(),i.toString(),(0,wt.default)(t.yield_per_period.toString()).mul(Hi).round(0,wt.default.roundDown).toFixed(),t.max_reward_per_period.toString(),n.toFixed()));if(u.lt(p)&&(p=u),p.eq(0))return t;let d=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,s,d,BigInt(p.toFixed())),{...t,accumulated_rpz:BigInt((0,ot.calculate_accumulated_rps)(t.accumulated_rpz.toString(),t.total_shares_z.toString(),p.toFixed()))}}syncYieldFarm(t,e,i){if(t.state.type!=="Active"||t.updated_at===i)return t;if(t.total_valued_shares===0n)return{...t,updated_at:i};let r=(0,ot.calculate_yield_farm_delta_rpvs)(t.accumulated_rpz.toString(),e.accumulated_rpz.toString(),t.multiplier.toString(),t.total_valued_shares.toString());return{...t,accumulated_rpvs:t.accumulated_rpvs+BigInt(r),updated_at:i}}getLoyaltyMultiplier(t,e){let i=(0,wt.default)(1).mul(Hi).round(0,wt.default.roundDown).toString();if(!e)return i;let{initial_reward_percentage:r,scale_coef:n}=e;return(0,ot.calculate_loyalty_multiplier)(t.toFixed(),r.toString(),n.toFixed())}async claimRewards(t,e,i,r,n){if(e.state.type==="Terminated")return null;let s=Math.floor(r/t.blocks_per_period);if(i.updated_at===s)return null;let a=await this.syncGlobalFarm(t,s,n);if(!a)return null;let o=this.syncYieldFarm(e,a,s);if(!o)return null;let l=o.total_stopped-i.stopped_at_creation,u=o.updated_at-i.entered_at-l,p=this.getLoyaltyMultiplier(u,o.loyalty_curve),d=BigInt((0,ot.calculate_user_reward)(i.accumulated_rpvs.toString(),i.valued_shares.toString(),i.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),p)),m=BigInt((0,ot.calculate_user_reward)(i.accumulated_rpvs.toString(),i.valued_shares.toString(),i.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),es));return{reward:d,maxReward:m,assetId:a.reward_currency,yieldFarmId:o.id,isActiveFarm:o.state.type==="Active"}}};var is=(0,Y.default)(365.2425).times(24).times(60).times(60),pe=class{balance;client;options;constructor(t,e,i={}){this.client=t,this.balance=e,this.options=Object.freeze({blockTime:i.blockTime??kr})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let i=[t,e].sort((n,s)=>n-s);if(t===e)return Er;let r=await this.client.getOraclePrice(i);if(r){let{n,d:s}=r[0].price,a;return t<e?a=(0,Gi.fixed_from_rational)(n.toString(),s.toString()):a=(0,Gi.fixed_from_rational)(s.toString(),n.toString()),BigInt(a)}}getFarmAddress=(t,e)=>{let i=Buffer.from("modl","utf-8"),r=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),n=Buffer.from([t]),s=Buffer.concat([i,r,n]),o="0x"+Buffer.concat([s,Buffer.alloc(32-s.length)]).toString("hex");return(0,Mr.AccountId)(Pt.HYDRATION_SS58_PREFIX).dec(o)};getGlobalRewardPerPeriod(t,e,i,r){let n=(0,Y.default)(r).times(t.toString()).times(e.toString()).div(Math.pow(10,Pt.RUNTIME_DECIMALS));return n.gte(i.toString())?i.toString():n.toString()}getPoolYieldPerPeriod(t,e,i,r){let n=(0,Y.default)(t.toString()).times(e),s=(0,Y.default)(i.toString()).times(r);return n.div(s.toString()).toString()}farmData(t,e,i){let{yieldFarm:r,globalFarm:n,priceAdjustment:s,balance:a,id:o}=t,{multiplier:l,loyalty_curve:u}=r,{blocks_per_period:p,yield_per_period:d,total_shares_z:m,max_reward_per_period:h,pending_rewards:b,accumulated_paid_rewards:g,planned_yielding_periods:P,updated_at:y,incentivized_asset:v,reward_currency:S,price_adjustment:T,min_deposit:B}=n,H=O.shiftNeg(s??T,Pt.RUNTIME_DECIMALS),W=O.shiftNeg(l,Pt.RUNTIME_DECIMALS),ut=O.shiftNeg(u?.initial_reward_percentage??0,Pt.RUNTIME_DECIMALS),yt=is.div((0,Y.default)(this.blockTime).div(1e3).times(p)).toString(),Z;if(m<=0)Z=(0,Y.default)(W).times(d.toString()).times(yt).div(Math.pow(10,Pt.RUNTIME_DECIMALS)).toString();else{let Pn=this.getGlobalRewardPerPeriod(m,d,h,H),Sn=this.getPoolYieldPerPeriod(Pn,W,m,H);Z=(0,Y.default)(Sn).times(yt).toString()}let nt=b+g,Qt=h*BigInt(P),ke=a.transferable+nt,cr=ke-nt,Me=(0,Y.default)(cr.toString()).div(h.toString()),De=(0,Y.default)(e).div(p.toString()).toString(),Le=(m>=0?Me.plus(y):Me.plus(De)).toString(),Si=(0,Y.default)(Le).times(p).toString(),yn=(0,Y.default)(m.toString()).div((0,Y.default)(h.toString()).div(d.toString())).div(Math.pow(10,Pt.RUNTIME_DECIMALS)).times(100).times(H).toFixed(2),ur=(0,Y.default)(nt.toString()).div(ke.toString()).gte(.999);Z=ur?"0":(0,Y.default)(Z).div(i?2:1).times(100).toString();let fn=ut?(0,Y.default)(Z).times(ut).toString():void 0;return{apr:Z,minApr:fn,isDistributed:ur,estimatedEndPeriod:Le,estimatedEndBlock:Si,maxRewards:Qt,incentivizedAsset:v,rewardCurrency:S,loyaltyCurve:u,currentPeriod:De,potMaxRewards:ke,fullness:yn,yieldFarmId:r.id,globalFarmId:n.id,poolId:o,distributedRewards:nt,plannedYieldingPeriods:P,minDeposit:B,blocksPerPeriod:p}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((r,n)=>r.includes(n.keyArgs[0].toString())?r:[...r,n.keyArgs[0].toString()],[]),i=await Promise.all(e.map(async r=>{let n=await this.getOmnipoolFarms(r);if(n)return[r,n]}));return Object.fromEntries(i.filter(r=>!!r))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),i=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:n,value:s})=>{let[,a]=n,o=s,l=await this.client.getOmnipoolGlobalFarm(a),u=await this.client.getOmnipoolYieldFarm(Number(t),a,o);if(!l||!u)return;let p=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(a),h=await this.getOraclePrice(p,d),b=await this.balance.getBalance(m,p);return{id:t,globalFarm:l,yieldFarm:u,priceAdjustment:h,balance:b}}));return i?r.map(n=>n?this.farmData(n,i):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((r,n)=>r.includes(n.keyArgs[0].toString())?r:[...r,n.keyArgs[0].toString()],[]),i=await Promise.all(e.map(async r=>{let n=await this.getIsolatedFarms(r);if(n)return[r,n]}));return Object.fromEntries(i.filter(r=>!!r))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),i=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:n,value:s})=>{let[,a]=n,o=s,l=await this.client.getIsolatedGlobalFarm(a),u=await this.client.getIsolatedYieldFarm(t,a,o);if(!l||!u)return;let p=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(a,!0),h=await this.getOraclePrice(p,d),b=await this.balance.getBalance(m,p);return{id:t,globalFarm:l,yieldFarm:u,priceAdjustment:h,balance:b,farmAddress:m}}));return i?r.map(n=>n?this.farmData(n,i,!0):void 0):[]}async getDepositReward(t,e,i,r){let n=e.global_farm_id,s=e.yield_farm_id,a=i?await this.client.getIsolatedYieldFarm(t,n,s):await this.client.getOmnipoolYieldFarm(Number(t),n,s),o=i?await this.client.getIsolatedGlobalFarm(n):await this.client.getOmnipoolGlobalFarm(n);if(!o||!a)return;let l=o.reward_currency,u=o.incentivized_asset,p=[[this.getFarmAddress(0,i),o.reward_currency],[this.getFarmAddress(o.id,i),o.reward_currency]],d=await this.getAccountAssetBalances(p),m=await this.getOraclePrice(l,u),h=new ii(p,d),g=await new ri(y=>this.getFarmAddress(y),y=>this.client.getAsset(y),h).claimRewards(o,a,e,r,m??o.price_adjustment);if(!g)return;let P=await this.client.getAsset(g.assetId);if(P&&!(g.reward<=P.existential_deposit))return g}async getAccountAssetBalances(t){let[e,i]=await Promise.all([Promise.all(t.filter(([n,s])=>s!==0).map(([n,s])=>this.balance.getTokenBalance(n,s))),Promise.all(t.filter(([n,s])=>s===0).map(([n])=>this.balance.getSystemBalance(n)))]),r=[];for(let n=0,s=0;n+s<t.length;){let a=n+s,[,o]=t[a];o===0?(r.push(i[s]),s+=1):(r.push(e[n]),n+=1)}return r}};var me=require("polkadot-api"),rs=me.Binary.toHex(me.Binary.fromText("omnipool")),de=class extends L{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(rs,t,(0,me.Enum)("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,{at:"best"})}async getOmnipoolYieldFarm(t,e,i){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,i,{at:"best"})}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,{at:"best"})}async getIsolatedYieldFarm(t,e,i){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,i,{at:"best"})}async getAsset(t){return this.api.query.AssetRegistry.Assets.getValue(t)}};var ji={};R(ji,{PoolContextProvider:()=>Yt,PoolError:()=>xt,PoolFactory:()=>zt,PoolType:()=>C,aave:()=>$i,hsm:()=>Ki,lbp:()=>Vi,omni:()=>Wi,stable:()=>zi,xyk:()=>Yi});var Vi={};R(Vi,{LbpMath:()=>lt,LbpPool:()=>ge,LbpPoolClient:()=>he});var gt=require("@galacticcouncil/math-lbp"),lt=class{static getSpotPrice(t,e,i,r,n){return(0,gt.get_spot_price)(t,e,i,r,n)}static calculateInGivenOut(t,e,i,r,n){return(0,gt.calculate_in_given_out)(t,e,i,r,n)}static calculateOutGivenIn(t,e,i,r,n){return(0,gt.calculate_out_given_in)(t,e,i,r,n)}static calculateLinearWeights(t,e,i,r,n){return(0,gt.calculate_linear_weights)(t,e,i,r,n)}static calculatePoolTradeFee(t,e,i){return(0,gt.calculate_pool_trade_fee)(t,e,i)}};var Ht=require("@galacticcouncil/common");var C=(s=>(s.Aave="Aave",s.LBP="LBP",s.Omni="Omnipool",s.Stable="Stableswap",s.XYK="XYK",s.HSM="HSM",s))(C||{}),xt=(u=>(u.UnknownError="UnknownError",u.FacilitatorCapacityExceeded="FacilitatorCapacityExceeded",u.InsufficientTradingAmount="InsufficientTradingAmount",u.InsufficientCollateral="InsufficientCollateral",u.MaxHoldingExceeded="MaxHoldingExceeded",u.MaxInRatioExceeded="MaxInRatioExceeded",u.MaxOutRatioExceeded="MaxOutRatioExceeded",u.TradeNotAllowed="TradeNotAllowed",u.MaxBuyBackExceeded="MaxBuyBackExceeded",u.MaxBuyPriceExceeded="MaxBuyPriceExceeded",u))(xt||{});var{FeeUtils:Dr}=O,ge=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new c(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 i=new Map(this.tokens.map(s=>[s.id,s])),r=i.get(t),n=i.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:n.balance,decimalsIn:r.decimals,decimalsOut:n.decimals,weightIn:r.weight,weightOut:n.weight}}validateAndBuy(t,e,i){let r=this.tokens[0].id,n=[];e<this.minTradingLimit&&n.push("InsufficientTradingAmount");let s=t.balanceOut/this.maxOutRatio;if(e>s&&n.push("MaxOutRatioExceeded"),r===t.assetOut){let a=this.calculateTradeFee(e,i),o=Dr.toPct(this.repayFeeApply?i.repayFee:i.exchangeFee),l=e+a,u=this.calculateInGivenOut(t,l),p=t.balanceIn/this.maxInRatio;return u>p&&n.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:n}}else{let a=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return a>o&&n.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:n}}}validateAndSell(t,e,i){let r=this.tokens[0].id,n=[];e<this.minTradingLimit&&n.push("InsufficientTradingAmount");let s=t.balanceIn/this.maxInRatio;if(e>s&&n.push("MaxInRatioExceeded"),r===t.assetIn){let a=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return a>o&&n.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:n}}else{let a=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(a,i),l=Dr.toPct(this.repayFeeApply?i.repayFee:i.exchangeFee),u=a-o,p=t.balanceOut/this.maxOutRatio;return u>p&&n.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:u,feePct:l,errors:n}}}calculateInGivenOut(t,e){let i=lt.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(i);return r<0n?0n:r}calculateOutGivenIn(t,e){let i=lt.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(i);return r<0n?0n:r}spotPriceInGivenOut(t){let e=lt.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),Ht.big.toBigInt(1,Ht.RUNTIME_DECIMALS).toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=lt.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),Ht.big.toBigInt(1,Ht.RUNTIME_DECIMALS).toString());return BigInt(e)}calculateTradeFee(t,e){let i=lt.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(i)}};var Hr=require("polkadot-api"),Tt=require("rxjs");var Lr=(c,t=new Map)=>e=>{let i;return t.has(e)?t.get(e):(t.set(e,i=c(e)),i)};var I=require("rxjs"),f=require("rxjs/operators");var qr=require("rxjs"),ni=class{store$=new qr.BehaviorSubject([]);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,i=new Map(e.map((a,o)=>[a.address,o])),r=await t(e),n=e.slice(),s=new Set;for(let a of r){let o=i.get(a.address);o===void 0?(i.set(a.address,n.length),n.push(a)):n[o]=a,s.add(a.address)}this.changeset=s,this.store$.next(n)}).catch(console.error)}destroy(){this.store$.complete()}};var Nr=require("@galacticcouncil/common");var ns={Aave:"AAVE",LBP:"LBP",Omnipool:"OMNI",Stableswap:"STBL",XYK:"XYK",HSM:"HSM"},{logger:si}=Nr.log,ai=class{type;constructor(t){this.type=t}prefix(){return this.pad(`pool(${ns[this.type]})`,10)}trace(t,...e){si.trace(`${this.prefix()} ${t} :`,...e)}debug(t,...e){si.debug(`${this.prefix()} ${t} :`,...e)}info(t,...e){si.info(`${this.prefix()} ${t} :`,...e)}error(t,...e){si.error(`${this.prefix()} ${t} :`,...e)}pad(t,e){return t.length>=e?t:t+" ".repeat(e-t.length)}};var{withTimeout:ss}=le,as=3e3,Q=class extends L{evm;balance;store=new ni;log;shared$;resync$=new I.ReplaySubject(1);resyncAt=0;resyncPending=!1;mem=0;memPoolsCache=new At(null,{ttl:6*1e3});memPools=Lr(t=>(this.log.info("pool_sync",{mem:t}),this.loadPools()),this.memPoolsCache);constructor(t,e){super(t),this.evm=e,this.balance=new pt(t),this.log=new ai(this.getPoolType())}async getMemPools(){return this.memPools(this.mem)}async getPools(){return(await this.getMemPools()).filter(e=>this.hasValidAssets(e))}getSubscriber(){return this.shared$||(this.shared$=this.subscribeStore()),this.shared$.pipe((0,f.startWith)([]),(0,f.bufferCount)(2,1),(0,f.map)(([t,e])=>t.length===0?e:this.store.applyChangeset(e)),(0,f.filter)(t=>t.length>0),(0,f.throttleTime)(1e3,void 0,{leading:!0,trailing:!0}))}subscribeStore(){return(0,I.defer)(()=>{let t=new I.Subscription;return t.add(this.startWatchdog()),this.resync$.next(),this.resync$.pipe((0,f.switchMap)(()=>{let e=new I.Subscription;return(0,I.from)(ss(this.getMemPools(),6e4,"getMemPools stalled")).pipe((0,f.tap)(()=>this.log.info("pool_synced",{mem:this.mem})),(0,f.map)(r=>r.filter(n=>this.hasValidAssets(n))),(0,f.tap)(r=>this.store.set(r)),(0,f.catchError)(()=>(this.log.error("pool_seed_error",{mem:this.mem}),this.requestResync(),I.EMPTY))).pipe((0,f.tap)(()=>{e.add(this.subscribeBalances()),e.add(this.subscribeUpdates())}),(0,f.switchMap)(r=>(0,I.merge)((0,I.of)(r),this.store.asObservable().pipe((0,f.skip)(1)))),(0,f.finalize)(()=>{e.unsubscribe()}))}),(0,f.finalize)(()=>t.unsubscribe()))}).pipe((0,f.share)({connector:()=>new I.ReplaySubject(1),resetOnRefCountZero:!0}))}subscribeBalances(){let t=this.store.pools.map(e=>{let{address:i}=e,r=[this.balance.watchTokensBalance(i)];if(this.hasSystemAsset(e)){let n=this.balance.watchSystemBalance(i);r.push(n)}if(this.hasErc20Asset(e)){let n=e.tokens.filter(a=>a.type==="Erc20").map(a=>a.id),s=this.balance.watchErc20Balance(i,n);r.push(s)}return(0,I.combineLatest)(r).pipe((0,f.map)(n=>n.flat()),(0,f.pairwise)(),(0,f.map)(([n,s])=>this.balance.getDeltas(n,s)),(0,f.filter)(n=>n.length>0),(0,f.map)(n=>[i,n]))});return(0,I.merge)(...t).pipe((0,f.bufferTime)(250),(0,f.filter)(e=>e.length>0),(0,f.map)(e=>new Map(e)),this.watchGuard("balances")).subscribe(e=>{this.store.update(i=>this.updateBalances(i,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:i})=>t.type==="XYK"?i>0n&&!!e:!!e)}updateBalances=(t,e)=>{let i=[],r=new Map(t.map(n=>[n.address,n]));for(let[n,s]of e){let a=r.get(n);if(a){let o=a.tokens.map(l=>{let u=s.find(p=>p.id===l.id);return u&&l.id!==a.id?{...l,balance:u.balance.transferable}:l});i.push({...a,tokens:o})}}return i};resync(t=!1){let e=Date.now();!t&&e-this.resyncAt<as||(this.resyncAt=e,this.mem++,this.resync$.next())}requestResync(t=!1){this.resyncPending||(this.resyncPending=!0,setTimeout(()=>{this.resyncPending=!1,this.resync(t)},0))}startWatchdog(){let r=this.watcher.connection$.pipe((0,f.pairwise)(),(0,f.filter)(([a,o])=>a==="offline"&&o==="online"),(0,f.tap)(()=>{this.log.debug("watchdog_recover_online",{mem:this.mem}),this.requestResync()}),(0,f.catchError)(a=>(this.log.error("watchdog_recovery_error",a),I.EMPTY)),(0,f.repeat)({delay:1e3})),n=this.watcher.finalizedBlock$.pipe((0,f.pairwise)(),(0,f.tap)(([a,o])=>{let l=Number(a.number),u=Number(o.number),p=u-l;p>=3&&(this.log.debug("watchdog_gap",{from:l,to:u,gap:p}),this.requestResync())}),(0,f.catchError)(a=>(this.log.error("watchdog_gap_error",a),I.EMPTY)),(0,f.repeat)({delay:1e3})),s=(0,I.interval)(36e5).pipe((0,f.tap)(()=>{this.log.debug("watchdog_periodic",{mem:this.mem}),this.requestResync()}),(0,f.catchError)(a=>(this.log.error("watchdog_periodic_error",a),I.EMPTY)),(0,f.repeat)({delay:1e3}));return(0,I.merge)(r,n,s).subscribe()}watchGuard(t){return e=>e.pipe((0,f.tap)({error:i=>{this.log.error(t,i),this.requestResync(!0)}}),(0,f.finalize)(()=>{this.log.debug(t,"unsub")}),(0,f.catchError)(()=>I.EMPTY))}};var he=class extends Q{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);getPoolType(){return"LBP"}async getPoolLimits(){let[t,e,i]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:i}}getPoolWeights(t,e){let{start:i,end:r,initial_weight:n,final_weight:s}=t,a=lt.calculateLinearWeights(i?i.toString():"0",r?r.toString():"0",n.toString(),s.toString(),e.toString()),o=BigInt(a),l=this.MAX_FINAL_WEIGHT-BigInt(o);return[o,l]}async isSupported(){return(await this.api.getStaticApis()).compat.query.LBP.PoolData.isCompatible(Hr.CompatibilityLevel.BackwardsCompatible)}async loadPools(){let[t,e,i]=await Promise.all([this.api.query.LBP.PoolData.getEntries({at:"best"}),this.api.query.ParachainSystem.ValidationData.getValue({at:"best"}),this.getPoolLimits()]),r=e?.relay_parent_number||0,n=t.filter(({value:s})=>e&&this.isActivePool(s,r)).map(async({keyArgs:s,value:a})=>{let[o]=s,l=o.toString(),u=await this.getPoolDelta(l,a,r);return{address:l,type:"LBP",fee:a.fee,...u,...i}});return Promise.all(n)}async getPoolDelta(t,e,i){let{assets:r,repay_target:n,fee_collector:s}=e,[a,o]=this.getPoolWeights(e,i),[l,u]=r,[p,d,m,h,b]=await Promise.all([this.isRepayFeeApplied(l,n,s.toString()),this.balance.getBalance(t,l),this.api.query.AssetRegistry.Assets.getValue(l),this.balance.getBalance(t,u),this.api.query.AssetRegistry.Assets.getValue(u)]);return{repayFeeApply:p,tokens:[{id:l,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:d.transferable,weight:a,type:m?.asset_type.type},{id:u,decimals:b?.decimals,existentialDeposit:b?.existential_deposit,balance:h.transferable,weight:o,type:b?.asset_type.type}]}}isActivePool(t,e){let{start:i,end:r}=t;return i&&r?e>=i&&e<r:!1}async isRepayFeeApplied(t,e,i){if(e===0n)return!1;try{return(await this.balance.getBalance(i,t)).transferable<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolFees(t,e){let i=this.store.pools.find(n=>n.address===e);return{repayFee:await this.getRepayFee(),exchangeFee:i.fee}}subscribeValidationData(){return this.api.query.ParachainSystem.ValidationData.watchValue({at:"best"}).pipe((0,Tt.map)(({value:t})=>t),(0,Tt.filter)(t=>t!==void 0),(0,Tt.distinctUntilChanged)((t,e)=>t.relay_parent_number===e.relay_parent_number),this.watchGuard("parachainSystem.ValidationData")).subscribe(({relay_parent_number:t})=>{this.store.update(async e=>{let i=[];for(let r of e){let n=this.poolsData.get(r.address);if(n){let{assets:s,repay_target:a,fee_collector:o}=n,[l]=s,[u,p]=this.getPoolWeights(n,t),[d,m]=r.tokens,h=[{...d,weight:u},{...m,weight:p}],b=await this.isRepayFeeApplied(l,a,o.toString());i.push({...r,tokens:h,repayFeeApply:b})}}return i})})}subscribeUpdates(){let t=new Tt.Subscription;return t.add(this.subscribeValidationData()),t}};var Wi={};R(Wi,{OmniMath:()=>F,OmniPool:()=>be,OmniPoolClient:()=>ye});var x=require("@galacticcouncil/math-omnipool"),Ot=vt(require("big.js")),F=class{static calculateSpotPrice(t,e,i,r){return(0,x.calculate_spot_price)(t,e,i,r)}static calculateLrnaSpotPrice(t,e){return(0,x.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,i,r,n,s,a,o,l,u){return(0,x.calculate_in_given_out)(t,e,i,r,n,s,a,o,l,u)}static calculateLrnaInGivenOut(t,e,i,r,n,s){return(0,x.calculate_lrna_in_given_out)(t,e,i,r,n,s)}static calculateOutGivenIn(t,e,i,r,n,s,a,o,l,u){return(0,x.calculate_out_given_in)(t,e,i,r,n,s,a,o,l,u)}static calculateOutGivenLrnaIn(t,e,i,r,n,s){return(0,x.calculate_out_given_lrna_in)(t,e,i,r,n,s)}static calculateShares(t,e,i,r){return(0,x.calculate_shares)(t,e,i,r)}static calculateLiquidityOut(t,e,i,r,n,s,a,o){return(0,x.calculate_liquidity_out)(t,e,i,r,n,s,a,o)}static calculateLiquidityLRNAOut(t,e,i,r,n,s,a,o){return(0,x.calculate_liquidity_lrna_out)(t,e,i,r,n,s,a,o)}static calculateCapDifference(t,e,i,r){let n=(0,Ot.default)(e),s=(0,Ot.default)(t),a=(0,Ot.default)(r),o=(0,Ot.default)(i),l=(0,Ot.default)(10).pow(18),u=o.div(l);if(n.div(a).lt(u)){let d=u.times(a).minus(n).times(s),m=n.times((0,Ot.default)(1).minus(u));return d.div(m).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,i,r){return(0,x.calculate_liquidity_hub_in)(t,e,i,r)}static isSellAllowed(t){return(0,x.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,x.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,x.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,x.is_remove_liquidity_allowed)(t)}static recalculateAssetFee(t,e,i,r,n,s,a,o,l,u,p){return(0,x.recalculate_asset_fee)(t,e,i,r,n,s,a,o,l,u,p)}static recalculateProtocolFee(t,e,i,r,n,s,a,o,l,u,p){return(0,x.recalculate_protocol_fee)(t,e,i,r,n,s,a,o,l,u,p)}static verifyAssetCap(t,e,i,r){return(0,x.verify_asset_cap)(t,e,i,r)}};var Gr=require("@galacticcouncil/common");var{FeeUtils:ht}=O,be=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new c(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 i=new Map(this.tokens.map(s=>[s.id,s])),r=i.get(t),n=i.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:r.hubReserves,hubReservesOut:n.hubReserves,sharesIn:r.shares,sharesOut:n.shares,decimalsIn:r.decimals,decimalsOut:n.decimals,balanceIn:r.balance,balanceOut:n.balance,tradeableIn:r.tradeable,tradeableOut:n.tradeable,assetInEd:r.existentialDeposit,assetOutEd:n.existentialDeposit}}validateAndBuy(t,e,i){let r=this.calculateInGivenOut(t,e),n=this.calculateInGivenOut(t,e,i),s=r===0n?0:z.calculateBuyFee(r,n),a=[],o=F.isSellAllowed(t.tradeableIn),l=F.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&a.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&a.push("MaxOutRatioExceeded");let p=t.balanceIn/this.maxInRatio;return n>p&&a.push("MaxInRatioExceeded"),{amountIn:n,calculatedIn:r,amountOut:e,feePct:s,errors:a}}validateAndSell(t,e,i){let r=this.calculateOutGivenIn(t,e),n=this.calculateOutGivenIn(t,e,i),s=z.calculateSellFee(r,n),a=[],o=F.isSellAllowed(t.tradeableIn),l=F.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&a.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&a.push("MaxInRatioExceeded");let p=t.balanceOut/this.maxOutRatio;return n>p&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:n,feePct:s,errors:a}}calculateInGivenOut(t,e,i){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,i);let r=F.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),i?ht.toRaw(i.assetFee).toString():"0",i?ht.toRaw(i.protocolFee).toString():"0",i?ht.toRaw(i.maxSlipFee).toString():"0"),n=BigInt(r);return n<0n?0n:n}calculateLrnaInGivenOut(t,e,i){let r=F.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),i?ht.toRaw(i.assetFee).toString():"0",i?ht.toRaw(i.maxSlipFee).toString():"0"),n=BigInt(r);return n<0n?0n:n}calculateOutGivenIn(t,e,i){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,i);let r=F.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),i?ht.toRaw(i.assetFee).toString():"0",i?ht.toRaw(i.protocolFee).toString():"0",i?ht.toRaw(i.maxSlipFee).toString():"0"),n=BigInt(r);return n<0n?0n:n}calculateOutGivenLrnaIn(t,e,i){let r=F.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),i?ht.toRaw(i.assetFee).toString():"0",i?ht.toRaw(i.maxSlipFee).toString():"0"),n=BigInt(r);return n<0n?0n:n}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=F.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceLrnaInGivenOut(t){let e=F.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=F.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}spotPriceOutGivenLrnaIn(t){let e=F.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}normalizeSpot(t,e,i){let r=e-i;if(r===0)return t;let n=Gr.big.pow10(Math.abs(r));return r>0?t*n:t/n}};var bt=require("polkadot-api"),Wr=require("@polkadot-api/utils"),_=require("rxjs"),zr=require("@galacticcouncil/common");var{FeeUtils:k}=O,Ur=bt.Binary.toHex(bt.Binary.fromText("omnipool")),Vr=(0,bt.Enum)("Short"),ye=class extends Q{queryBus=new ue;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);maxSlipFee=this.queryBus.scope("Omnipool.SlipFee",()=>this.apiNext.query.Omnipool.SlipFee.getValue({at:"best"}),()=>"slipFee");emaOracles=this.queryBus.scope("EmaOracle.Oracles.Short",t=>this.api.query.EmaOracle.Oracles.getValue(Ur,t,Vr,{at:"best"}),t=>t.join(":"),6*1e3);getPoolType(){return"Omnipool"}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),i=(0,Wr.toHex)(e);return(0,bt.AccountId)(zr.HYDRATION_SS58_PREFIX).dec(i)}getOraclePair(t){return t===0?[0,1]:[1,t]}async getPoolLimits(){let[t,e,i]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:i}}async isSupported(){return(await this.api.getStaticApis()).compat.query.Omnipool.Assets.isCompatible(bt.CompatibilityLevel.BackwardsCompatible)}async isSlipFeeSupported(){return(await this.apiNext.getStaticApis()).compat.query.Omnipool.SlipFee.isCompatible(bt.CompatibilityLevel.Partial)}async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[i,r,n,s,a]=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.balance.getBalance(e,t),this.getPoolLimits()]),o=i.map(async({keyArgs:u,value:p})=>{let[d]=u,{hub_reserve:m,shares:h,tradable:b,cap:g,protocol_shares:P}=p,[y,v]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.balance.getBalance(e,d)]);return{id:d,decimals:y?.decimals,existentialDeposit:y?.existential_deposit,balance:v.transferable,cap:g,hubReserves:m,protocolShares:P,shares:h,tradeable:b,type:y?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:n?.decimals,existentialDeposit:n?.existential_deposit,balance:s.transferable,tradeable:r,type:n?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...a}]}async getPoolFees(t){let e=t.assetOut,i=t.assetIn,r=0;await this.isSlipFeeSupported()&&(r=await this.maxSlipFee.get()??0);let s=await this.dynamicFeesConfig.get(e);if(s?.type==="Fixed"){let{asset_fee:S,protocol_fee:T}=s.value;return{assetFee:k.fromPermill(S),protocolFee:k.fromPermill(T),maxSlipFee:k.fromPermill(r)}}let a=this.getOraclePair(e),o=this.getOraclePair(i),[l,u,p]=await Promise.all([this.dynamicFees.get(e),this.emaOracles.get(a),this.emaOracles.get(o)]),[d,m,h]=await this.getAssetFee(t,this.block,l,u,s?.value.asset_fee_params),[b,g,P]=i===1?[0,0,0]:await this.getProtocolFee(t,this.block,l,p,s?.value.protocol_fee_params),y=d+b,v=h+P;return{assetFee:k.fromPermill(m),protocolFee:k.fromPermill(g),maxSlipFee:k.fromPermill(r),min:k.fromPermill(y),max:k.fromPermill(v)}}async getAssetFee(t,e,i,r,n){let{assetOut:s,balanceOut:a}=t,{min_fee:o,max_fee:l,decay:u,amplification:p}=n||await this.api.constants.DynamicFees.AssetFeeParameters();if(!i||!r)return[o,o,l];let d=k.fromPermill(o),m=k.fromPermill(l),[h]=r,{asset_fee:b,timestamp:g}=i,P=Math.max(1,e-g),y=h.volume.b_in.toString(),v=h.volume.b_out.toString(),S=h.liquidity.b.toString();s===0&&(y=h.volume.a_in.toString(),v=h.volume.a_out.toString(),S=h.liquidity.a.toString());let T=k.fromPermill(b),B=F.recalculateAssetFee(y,v,S,"9",a.toString(),k.toRaw(T).toString(),P.toString(),k.toRaw(d).toString(),k.toRaw(m).toString(),u.toString(),p.toString());return[o,Number(B)*1e6,l]}async getProtocolFee(t,e,i,r,n){let{assetIn:s,balanceIn:a}=t,{min_fee:o,max_fee:l,decay:u,amplification:p}=n||await this.api.constants.DynamicFees.ProtocolFeeParameters();if(!i||!r)return[o,o,l];let d=k.fromPermill(o),m=k.fromPermill(l),[h]=r,{protocol_fee:b,timestamp:g}=i,P=Math.max(1,e-g),y=h.volume.b_in.toString(),v=h.volume.b_out.toString(),S=h.liquidity.b.toString();s===0&&(y=h.volume.a_in.toString(),v=h.volume.a_out.toString(),S=h.liquidity.a.toString());let T=k.fromPermill(b),B=F.recalculateProtocolFee(y,v,S,"9",a.toString(),k.toRaw(T).toString(),P.toString(),k.toRaw(d).toString(),k.toRaw(m).toString(),u.toString(),p.toString());return[o,Number(B)*1e6,l]}subscribeEmaOracles(){let[t]=this.store.pools,i=t.tokens.map(r=>r.id).map(r=>this.getOraclePair(r)).map(r=>this.api.query.EmaOracle.Oracles.watchValue(Ur,r,Vr,{at:"best"}).pipe((0,_.map)(({value:n})=>n),(0,_.filter)(n=>n!==void 0),(0,_.map)((n,s)=>({value:n,index:s})),(0,_.tap)(({index:n})=>{n>0&&this.log.trace("emaOracle.Oracles",r.join(":"))}),(0,_.map)(({value:n})=>({pair:r,value:n}))));return(0,_.merge)(...i).pipe((0,_.finalize)(()=>this.emaOracles.clear()),this.watchGuard("emaOracle.Oracles")).subscribe(r=>{let{pair:n,value:s}=r;this.emaOracles.set(s,n)})}subscribeDynamicFees(){return this.api.query.DynamicFees.AssetFee.watchEntries({at:"best"}).pipe((0,_.distinctUntilChanged)((t,e)=>!e.deltas),(0,_.map)((t,e)=>({value:t,index:e})),(0,_.tap)(({value:t,index:e})=>{e>0&&this.log.trace("dynamicFees.AssetFee",t.deltas?.upserted)}),(0,_.finalize)(()=>this.dynamicFees.clear()),this.watchGuard("dynamicFees.AssetFee")).subscribe(({value:{deltas:t}})=>{t?.upserted.forEach(e=>{let[i]=e.args;this.dynamicFees.set(e.value,i)})})}subscribeDynamicFeesConfig(){return this.api.query.DynamicFees.AssetFeeConfiguration.watchEntries({at:"best"}).pipe((0,_.distinctUntilChanged)((t,e)=>!e.deltas),(0,_.map)((t,e)=>({value:t,index:e})),(0,_.tap)(({value:t,index:e})=>{e>0&&this.log.trace("dynamicFees.AssetFeeConfiguration",t.deltas?.upserted)}),(0,_.finalize)(()=>this.dynamicFeesConfig.clear()),this.watchGuard("dynamicFees.AssetFeeConfiguration")).subscribe(({value:{deltas:t}})=>{t?.upserted.forEach(e=>{let[i]=e.args;this.dynamicFeesConfig.set(e.value,i)})})}subscribeBlock(){return this.watcher.bestBlock$.pipe(this.watchGuard("watcher.bestBlock")).subscribe(t=>{this.block=t})}subscribeAssets(){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,_.distinctUntilChanged)((t,e)=>!e.deltas),(0,_.map)((t,e)=>({value:t,index:e})),(0,_.tap)(({value:t,index:e})=>{e>0&&this.log.trace("omnipool.Assets",t.deltas?.upserted)}),this.watchGuard("omnipool.Assets")).subscribe(({value:{deltas:t}})=>{this.store.update(([e])=>{let i=t?.upserted.reduce((n,s)=>{let[a]=s.args;return n.set(a,s.value),n},new Map),r=e.tokens.map(n=>{let s=i?.get(n.id);return s?this.updateTokenState(n,s):n});return[{...e,tokens:r}]})})}subscribeUpdates(){let t=new _.Subscription;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:i,shares:r,tradable:n,cap:s,protocol_shares:a}=e;return{...t,cap:s,hubReserves:i,protocolShares:a,shares:r,tradeable:n}}};var zi={};R(zi,{StableMath:()=>$,StableSwap:()=>Bt,StableSwapClient:()=>Pe});var M=require("@galacticcouncil/math-stableswap"),$=class{static getPoolAddress(t){return(0,M.pool_account_name)(t)}static defaultPegs(t){let e=[];for(let i=0;i<t;i++)e.push(["1","1"]);return e}static calculateAmplification(t,e,i,r,n){return(0,M.calculate_amplification)(t,e,i,r,n)}static calculateInGivenOut(t,e,i,r,n,s,a){return(0,M.calculate_in_given_out)(t,e,i,r,n,s,a)}static calculateAddOneAsset(t,e,i,r,n,s,a){return(0,M.calculate_add_one_asset)(t,e,i,r,n,s,a)}static calculateSharesForAmount(t,e,i,r,n,s,a){return(0,M.calculate_shares_for_amount)(t,e,i,r,n,s,a)}static calculateOutGivenIn(t,e,i,r,n,s,a){return(0,M.calculate_out_given_in)(t,e,i,r,n,s,a)}static calculateLiquidityOutOneAsset(t,e,i,r,n,s,a){return(0,M.calculate_liquidity_out_one_asset)(t,e,i,r,n,s,a)}static calculateShares(t,e,i,r,n,s){return(0,M.calculate_shares)(t,e,i,r,n,s)}static calculateSpotPriceWithFee(t,e,i,r,n,s,a,o){return(0,M.calculate_spot_price_with_fee)(t,e,i,r,n,s,a,o)}static recalculatePegs(t,e,i,r,n,s){let a=(0,M.recalculate_peg)(t,e,i,r,n,s);return JSON.parse(a)}};var fe=require("@galacticcouncil/common");var{FeeUtils:Gt}=O,Bt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;isRampPeriod;id;fee;totalIssuance;pegs;static fromPool(t){return new c(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 i=new Map(this.tokens.map(s=>[s.id,s])),r=i.get(t),n=i.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:n.balance,decimalsIn:r.decimals,decimalsOut:n.decimals,tradeableIn:this.id===t?15:r.tradeable,tradeableOut:this.id===e?15:n.tradeable,assetInEd:r.existentialDeposit,assetOutEd:n.existentialDeposit}}validateAndBuy(t,e,i){let r=this.calculateInGivenOut(t,e),n=this.calculateInGivenOut(t,e,i),s=r===0n?0:z.calculateBuyFee(r,n),a=[],o=F.isSellAllowed(t.tradeableIn),l=F.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&a.push("InsufficientTradingAmount"),{amountIn:n,calculatedIn:r,amountOut:e,feePct:s,errors:a}}validateAndSell(t,e,i){let r=this.calculateOutGivenIn(t,e),n=this.calculateOutGivenIn(t,e,i),s=z.calculateSellFee(r,n),a=[],o=F.isSellAllowed(t.tradeableIn),l=F.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&a.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:r,amountOut:n,feePct:s,errors:a}}calculateIn(t,e,i){let r=$.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),i?Gt.toRaw(i.fee).toString():"0",this.getPegs()),n=BigInt(r);return n<0n?0n:n}calculateAddOneAsset(t,e,i){let r=$.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),i?Gt.toRaw(i.fee).toString():"0",this.getPegs()),n=BigInt(r);return n<0n?0n:n}calculateSharesForAmount(t,e,i){let r=$.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),i?Gt.toRaw(i.fee).toString():"0",this.getPegs()),n=BigInt(r);return n<0n?0n:n}calculateInGivenOut(t,e,i){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,i):t.assetIn==this.id?this.calculateSharesForAmount(t,e,i):this.calculateIn(t,e,i)}spotPriceInGivenOut(t){let e=$.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());return this.normalizeSpot(BigInt(e),t.assetOut===this.id,t.assetIn===this.id,t.decimalsOut,t.decimalsIn)}calculateOut(t,e,i){let r=$.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),i?Gt.toRaw(i.fee).toString():"0",this.getPegs()),n=BigInt(r);return n<0n?0n:n}calculateWithdrawOneAsset(t,e,i){let r=$.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),i?Gt.toRaw(i.fee).toString():"0",this.getPegs()),n=BigInt(r);return n<0n?0n:n}calculateShares(t,e,i){let r=$.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),i?Gt.toRaw(i.fee).toString():"0",this.getPegs()),n=BigInt(r);return n<0n?0n:n}calculateOutGivenIn(t,e,i){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,i):t.assetOut==this.id?this.calculateShares(t,e,i):this.calculateOut(t,e,i)}spotPriceOutGivenIn(t){let e=$.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());return this.normalizeSpot(BigInt(e),t.assetIn===this.id,t.assetOut===this.id,t.decimalsIn,t.decimalsOut)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:i,decimals:r})=>({asset_id:e,amount:i,decimals:r}));return JSON.stringify(t,qt.jsonFormatter)}getAssets(t,e){let i={asset_id:Number(t),amount:e.toString()};return JSON.stringify([i],qt.jsonFormatter)}normalizeSpot(t,e,i,r,n){return e?t*fe.big.pow10(fe.RUNTIME_DECIMALS-n):i?t/fe.big.pow10(n-r):t}};var oi=require("polkadot-api"),Yr=require("@polkadot-api/utils"),$r=require("@noble/hashes/blake2b"),J=require("rxjs"),li=require("@galacticcouncil/common");var{FeeUtils:os}=O,Pe=class extends Q{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=$.getPoolAddress(t),i=(0,$r.blake2b)(e,{dkLen:32}),r=(0,Yr.toHex)(i);return(0,oi.AccountId)(li.HYDRATION_SS58_PREFIX).dec(r)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}getPoolAmplification(t,e){let{initial_amplification:i,final_amplification:r,initial_block:n,final_block:s}=t,a=$.calculateAmplification(i.toString(),r.toString(),n.toString(),s.toString(),e.toString()),o=Number(a)<r;return{amplification:BigInt(a),isRampPeriod:o}}async getPoolTokens(t,e){let i=this.getPoolAddress(t),r=e.assets.map(async n=>{let[s,a,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,n),this.api.query.AssetRegistry.Assets.getValue(n),this.balance.getBalance(i,n)]);return{id:n,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:o.transferable,tradeable:s,type:a?.asset_type.type}});return Promise.all(r)}async isSupported(){return(await this.api.getStaticApis()).compat.query.Stableswap.Pools.isCompatible(oi.CompatibilityLevel.BackwardsCompatible)}async loadPools(){let[t,e,i]=await Promise.all([this.api.query.Stableswap.Pools.getEntries({at:"best"}),this.api.query.System.Number.getValue({at:"best"}),this.getPoolLimits()]),r=t.map(async({keyArgs:n,value:s})=>{let[a]=n,o=this.getPoolAddress(a),[l,u,p]=await Promise.all([this.getPoolTokens(a,s),this.api.query.Stableswap.PoolPegs.getValue(a,{at:"best"}),this.api.query.Tokens.TotalIssuance.getValue(a,{at:"best"})]),d=this.getPoolAmplification(s,e),m=u?this.getRecentPegs(u):this.getDefaultPegs(s);return l.push({id:a,tradeable:15,balance:p,decimals:li.RUNTIME_DECIMALS}),this.poolsData.set(a,s),{address:o,id:a,type:"Stableswap",fee:os.fromPermill(s.fee),tokens:l,totalIssuance:p,pegs:m,...i,...d}});return Promise.all(r)}async getPoolFees(t,e){return{fee:this.store.pools.find(r=>r.address===e).fee}}getDefaultPegs(t){return $.defaultPegs(t.assets.length)}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([i,r])=>r.map(n=>n.toString()))}subscribeIssuance(){let e=this.store.pools.map(i=>i.id).map(i=>this.api.query.Tokens.TotalIssuance.watchValue(i,{at:"best"}).pipe((0,J.map)(({value:r})=>r),(0,J.map)((r,n)=>({value:r,index:n})),(0,J.tap)(({index:r,value:n})=>{r>0&&this.log.trace("tokens.TotalIssuance",i,n)}),(0,J.map)(({value:r})=>({id:i,value:r}))));return(0,J.merge)(...e).pipe(this.watchGuard("tokens.TotalIssuance")).subscribe(i=>{let{id:r,value:n}=i;this.store.update(s=>{let a=[];return s.filter(o=>o.id===r).forEach(o=>{let l=o.tokens.map(u=>u.id===r?{...u,balance:n}:u);a.push({...o,tokens:l,totalIssuance:n})}),a})})}subscribePoolPegs(){return this.api.query.Stableswap.PoolPegs.watchEntries({at:"best"}).pipe((0,J.distinctUntilChanged)((t,e)=>!e.deltas),(0,J.map)((t,e)=>({value:t,index:e})),(0,J.tap)(({value:t,index:e})=>{e>0&&this.log.trace("stableswap.PoolPegs",t.deltas?.upserted)}),this.watchGuard("stableswap.PoolPegs")).subscribe({error:t=>this.log.error("stableswap.PoolPegs",t),next:({value:{deltas:t}})=>{this.store.update(e=>{let i=[],r=new Map(e.map(n=>[n.id,n]));return t?.upserted.forEach(({args:n,value:s})=>{let[a]=n,o=r.get(a);if(o){let l=this.getRecentPegs(s);i.push({...o,pegs:l})}}),i})}})}subscribeBlock(){return this.watcher.bestBlock$.pipe(this.watchGuard("watcher.bestBlock")).subscribe(t=>{this.store.update(e=>{let i=[];return e.filter(r=>r.isRampPeriod).forEach(r=>{let n=this.poolsData.get(r.id);if(n){let s=this.getPoolAmplification(n,t);i.push({...r,...s})}}),i})})}subscribeUpdates(){let t=new J.Subscription;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 Yi={};R(Yi,{XykMath:()=>St,XykPool:()=>Se,XykPoolClient:()=>ve});var D=require("@galacticcouncil/math-xyk"),St=class{static getSpotPrice(t,e,i){return(0,D.get_spot_price)(t,e,i)}static calculateInGivenOut(t,e,i){return(0,D.calculate_in_given_out)(t,e,i)}static calculateOutGivenIn(t,e,i){return(0,D.calculate_out_given_in)(t,e,i)}static calculatePoolTradeFee(t,e,i){return(0,D.calculate_pool_trade_fee)(t,e,i)}static calculateLiquidityIn(t,e,i){return(0,D.calculate_liquidity_in)(t,e,i)}static calculateSpotPrice(t,e){return(0,D.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,i,r){return(0,D.calculate_spot_price_with_fee)(t,e,i,r)}static calculateShares(t,e,i){return(0,D.calculate_shares)(t,e,i)}static calculateLiquidityOutAssetA(t,e,i,r){return(0,D.calculate_liquidity_out_asset_a)(t,e,i,r)}static calculateLiquidityOutAssetB(t,e,i,r){return(0,D.calculate_liquidity_out_asset_b)(t,e,i,r)}};var Kr=require("@galacticcouncil/common");var{FeeUtils:Xr}=O,Se=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(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 i=new Map(this.tokens.map(s=>[s.id,s])),r=i.get(t),n=i.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:r.decimals,decimalsOut:n.decimals,balanceIn:r.balance,balanceOut:n.balance,assetInEd:r.existentialDeposit,assetOutEd:n.existentialDeposit}}validateAndBuy(t,e,i){let r=this.calculateInGivenOut(t,e),n=this.calculateTradeFee(r,i),s=Xr.toPct(i.exchangeFee),a=r+n,o=[];(e<this.minTradingLimit||r<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return a>u&&o.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:s,errors:o}}validateAndSell(t,e,i){let r=this.calculateOutGivenIn(t,e),n=this.calculateTradeFee(r,i),s=Xr.toPct(i.exchangeFee),a=r-n,o=[];(e<this.minTradingLimit||r<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return a>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:s,errors:o}}calculateInGivenOut(t,e){let i=St.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(i);return r<0n?0n:r}calculateOutGivenIn(t,e){let i=St.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(i);return r<0n?0n:r}spotPriceInGivenOut(t){let e=St.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){let e=St.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}calculateTradeFee(t,e){let i=St.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(i)}normalizeSpot(t,e,i){let r=e-i;if(r===0)return t;let n=Kr.big.pow10(Math.abs(r));return r>0?t*n:t/n}};var jr=require("polkadot-api"),Qr=require("rxjs");var ve=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,i]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:i}}async isSupported(){return(await this.api.getStaticApis()).compat.query.XYK.PoolAssets.isCompatible(jr.CompatibilityLevel.BackwardsCompatible)}async loadPools(){let[t,e]=await Promise.all([this.api.query.XYK.PoolAssets.getEntries(),this.getPoolLimits()]),i=t.map(async({keyArgs:r,value:n})=>{let[s]=r,[a,o]=n,[l,u,p,d]=await Promise.all([this.balance.getBalance(s,a),this.api.query.AssetRegistry.Assets.getValue(a),this.balance.getBalance(s,o),this.api.query.AssetRegistry.Assets.getValue(o)]);return{address:s,type:"XYK",tokens:[{id:a,decimals:u?.decimals||this.decimals.get(a),existentialDeposit:u?.existential_deposit,balance:l.transferable,type:u?.asset_type.type},{id:o,decimals:d?.decimals||this.decimals.get(o),existentialDeposit:d?.existential_deposit,balance:p.transferable,type:d?.asset_type.type}],...e}});return Promise.all(i)}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}subscribeUpdates(){return Qr.Subscription.EMPTY}};var $i={};R($i,{AavePool:()=>we,AavePoolClient:()=>xe});var Ut=require("@galacticcouncil/common");var we=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(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 i=new Map(this.tokens.map(s=>[s.id,s])),r=i.get(t),n=i.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:n.balance,decimalsIn:r.decimals,decimalsOut:n.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,i){let r=this.calculateInGivenOut(t,e),n=[];return e>t.balanceOut&&n.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:n}}validateAndSell(t,e,i){let r=this.calculateOutGivenIn(t,e),n=[];return r>t.balanceOut&&n.push("TradeNotAllowed"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:n}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){return Ut.big.toBigInt(1,Ut.RUNTIME_DECIMALS)}spotPriceOutGivenIn(t){return Ut.big.toBigInt(1,Ut.RUNTIME_DECIMALS)}calculateTradeFee(t,e){return 0n}};var ci=require("polkadot-api"),Zr=require("@polkadot-api/utils"),et=require("rxjs"),tn=require("viem"),ui=require("@galacticcouncil/common");var Jr=[{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:ls}=ui.erc20,cs=["Supply","Withdraw","Repay","Borrow"],xe=class extends Q{getPoolType(){return"Aave"}async isSupported(){return!0}getPoolId(t,e){let i=t+"/"+e,r=new TextEncoder().encode(i.padEnd(32,"\0")),n=(0,Zr.toHex)(r);return(0,ci.AccountId)(ui.HYDRATION_SS58_PREFIX).dec(n)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools({at:"best"})).map(async({reserve:i,atoken:r,liqudity_in:n,liqudity_out:s})=>{let[a,o,l,u]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(i),this.api.query.AssetRegistry.AssetLocations.getValue(i),this.api.query.AssetRegistry.Assets.getValue(r),this.api.query.AssetRegistry.AssetLocations.getValue(r)]);return{address:this.getPoolId(i,r),type:"Aave",tokens:[{id:i,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:n,location:o,type:a?.asset_type.type},{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:s,location:u,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,i]=t.tokens,{liqudity_in:r,liqudity_out:n}=await this.api.apis.AaveTradeExecutor.pool(e.id,i.id,{at:"best"});return t.tokens.map(s=>{let a=s.id===e.id?r:n;return{...s,balance:a}})}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:i}=e.value;return i.key}throw new Error("Invalid aave reserve multilocation")}return ls.fromAssetId(t.id)}parseRouterLog(t){let{asset_in:e,asset_out:i}=t;return{assetIn:e,assetOut:i,key:`${e}:${i}`}}parseEvmLog(t){let{topics:e,data:i}=t.log,r=e,n=ci.Binary.toHex(i);try{let{eventName:s,args:a}=(0,tn.decodeEventLog)({abi:Jr,topics:r,data:n}),o=a.reserve.toLowerCase();return{eventName:s,reserve:o,key:`${s}:${o}`}}catch{return}}subscribeRouterExecuted(){let e=this.store.pools.map(i=>i.tokens).map(([i,r])=>r).map(i=>i.id);return this.api.event.Router.Executed.watch().pipe((0,et.mergeMap)(({events:i})=>i),(0,et.map)(({payload:i})=>this.parseRouterLog(i)),(0,et.filter)(({assetIn:i,assetOut:r})=>e.includes(i)||e.includes(r)),this.watchGuard("router.Execute")).subscribe(({assetIn:i,assetOut:r,key:n})=>{this.log.trace("router.Executed",n),this.store.update(async s=>{let a=[];for(let o of s){let[l,u]=o.tokens;if(u.id===i||u.id===r){let d=await this.getPoolDelta(o);a.push({...o,tokens:d})}}return a})})}subscribeEvmLog(){return this.api.event.EVM.Log.watch().pipe((0,et.mergeMap)(({events:t})=>t),(0,et.map)(({payload:t})=>this.parseEvmLog(t)),(0,et.filter)(t=>t!==void 0),(0,et.filter)(({eventName:t})=>cs.includes(t)),this.watchGuard("evm.Log")).subscribe(({reserve:t,eventName:e})=>{this.log.trace(`evm.Log.${e}`,t),this.store.update(async i=>{let r=[];for(let n of i){let[s]=n.tokens;if(this.getReserveH160Id(s).toLowerCase()===t){let o=await this.getPoolDelta(n);r.push({...n,tokens:o})}}return r})})}subscribeBalances(){return et.Subscription.EMPTY}subscribeUpdates(){let t=new et.Subscription;return t.add(this.subscribeRouterExecuted()),t.add(this.subscribeEvmLog()),t}};var Ki={};R(Ki,{HsmMath:()=>at,HsmPool:()=>Te,HsmPoolClient:()=>Ae});var X=require("@galacticcouncil/math-hsm"),at=class{static calculateCollateralInGivenHollarOut(t,e,i){return(0,X.calculate_collateral_in_given_hollar_out)(t,e,i)}static calculateCollateralOutGivenHollarIn(t,e,i){return(0,X.calculate_collateral_out_given_hollar_in)(t,e,i)}static calculateHollarOutGivenCollateralIn(t,e,i){return(0,X.calculate_hollar_out_given_collateral_in)(t,e,i)}static calculateHollarInGivenCollateralOut(t,e,i){return(0,X.calculate_hollar_in_given_collateral_out)(t,e,i)}static calculateImbalance(t,e,i){return(0,X.calculate_imbalance)(t,e,i)}static calculateBuybackLimit(t,e){return(0,X.calculate_buyback_limit)(t,e)}static calculateBuybackPriceWithFee(t,e,i){return(0,X.calculate_buyback_price_with_fee)(t,e,i)}static calculateMaxPrice(t,e){return(0,X.calculate_max_price)(t,e)}};var K=require("@galacticcouncil/common");var{FeeUtils:Vt}=O,Te=class c extends Bt{hsmAddress;hsmMintCapacity;hollarId;hollarH160;collateralId;collateralBalance;maxBuyPriceCoefficient;maxInHolding;purchaseFee;buyBackFee;buyBackRate;static fromPool(t){return new c(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,i){let r=this.parsePair(t.assetOut,t.assetIn),n=super.calculateInGivenOut(r,e,{fee:this.fee}),s=this.calculateBuybackLimit(t);e>s&&i.push("MaxBuyBackExceeded");let a=this.calculateMaxPrice(t);return this.calculateBuyPrice(t,e,n)>a&&i.push("MaxBuyPriceExceeded"),n>this.collateralBalance&&i.push("InsufficientCollateral"),i}validateTradeHollarOut(t,e,i){return this.collateralBalance+t>this.maxInHolding&&i.push("MaxHoldingExceeded"),e>this.hsmMintCapacity&&i.push("FacilitatorCapacityExceeded"),i}validateTradeConstraints(t,e,i){let r=[];return t.assetIn===this.hollarId?this.validateTradeHollarIn(t,e,r):this.validateTradeHollarOut(e,i,r)}validateAndBuy(t,e){let i=this.calculateInGivenOut(t,e),r=this.validateTradeConstraints(t,i,e);return{amountIn:i,calculatedIn:i,amountOut:e,feePct:0,errors:r}}validateAndSell(t,e){let i=this.calculateOutGivenIn(t,e),r=this.validateTradeConstraints(t,e,i);return{amountIn:e,calculatedOut:i,amountOut:i,feePct:0,errors:r}}calculateHollarInGivenCollateralOut(t,e){let i=super.calculateInGivenOut(t,e,{fee:this.fee}),r=at.calculateHollarInGivenCollateralOut(e.toString(),i.toString(),Vt.toRaw(this.buyBackFee).toString());return BigInt(r)}calculateCollateralInGivenHollarOut(t){let e=this.getCollateralPeg(),i=at.calculateCollateralInGivenHollarOut(t.toString(),JSON.stringify(e),Vt.toRaw(this.purchaseFee).toString());return BigInt(i)}calculateInGivenOut(t,e){return t.assetOut==this.hollarId?this.calculateCollateralInGivenHollarOut(e):this.calculateHollarInGivenCollateralOut(t,e)}calculateCollateralOutGivenHollarIn(t,e){let i=super.calculateOutGivenIn(t,e,{fee:this.fee}),r=at.calculateCollateralOutGivenHollarIn(e.toString(),i.toString(),Vt.toRaw(this.buyBackFee).toString());return BigInt(r)}calculateHollarOutGivenCollateralIn(t){let e=this.getCollateralPeg(),i=at.calculateHollarOutGivenCollateralIn(t.toString(),JSON.stringify(e),Vt.toRaw(this.purchaseFee).toString());return BigInt(i)}calculateOutGivenIn(t,e){return t.assetIn==this.hollarId?this.calculateCollateralOutGivenHollarIn(t,e):this.calculateHollarOutGivenCollateralIn(e)}calculateImbalance(t){let e=this.getCollateralPeg(),i=at.calculateImbalance(t.balanceIn.toString(),JSON.stringify(e),t.balanceOut.toString());return BigInt(i)}calculateBuybackLimit(t){let e=this.calculateImbalance(t),i=at.calculateBuybackLimit(e.toString(),Vt.toRaw(this.buyBackRate).toString());return BigInt(i)}calculateBuyPrice(t,e,i){let r=at.calculateBuybackPriceWithFee(i.toString(),e.toString(),Vt.toRaw(this.buyBackFee).toString()),[n,s]=JSON.parse(r),a=K.big.pow10(t.decimalsIn+K.RUNTIME_DECIMALS-t.decimalsOut);return BigInt(n)*a/BigInt(s)}calculateMaxPrice(t){let e=this.getCollateralPeg(),i=at.calculateMaxPrice(JSON.stringify(e),this.maxBuyPriceCoefficient.toString()),[r,n]=JSON.parse(i),s=K.big.pow10(K.RUNTIME_DECIMALS-t.decimalsOut);return BigInt(r)*s/BigInt(n)}spotPriceInGivenOut(t){let e=K.big.toBigInt(1,t.decimalsOut),r=this.calculateInGivenOut(t,e)*K.big.pow10(K.RUNTIME_DECIMALS-t.decimalsOut);return this.normalizeSpotPrice(r,t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){let e=K.big.toBigInt(1,t.decimalsIn),r=this.calculateOutGivenIn(t,e)*K.big.pow10(K.RUNTIME_DECIMALS-t.decimalsIn);return this.normalizeSpotPrice(r,t.decimalsIn,t.decimalsOut)}getCollateralPeg(){let t=this.tokens.findIndex(r=>r.id!==this.hollarId),e=this.pegs[t],i=this.tokens[t].decimals;return this.isDefaultPeg(e)?[K.big.toBigInt(1,18).toString(),K.big.toBigInt(1,i).toString()]:e}isDefaultPeg(t){let[e,i]=t;return Array.isArray(t)&&t.length===2&&e==="1"&&i==="1"}normalizeSpotPrice(t,e,i){let r=e-i;if(r===0)return t;let n=K.big.pow10(Math.abs(r));return r>0?t*n:t/n}};var Wt=require("polkadot-api"),rn=require("@polkadot-api/utils"),U=require("rxjs"),nn=require("viem"),pi=require("@galacticcouncil/common");var Ie=[{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 _e=class{client;constructor(t){this.client=t.getWsProvider()}async getFacilitatorCapacity(t,e){let[i,r]=await this.client.readContract({abi:Ie,address:t,functionName:"getFacilitatorBucket",args:[e]});return i-r}};var{FeeUtils:Xi}=O,{H160:en}=pi.h160,us=["FacilitatorBucketCapacityUpdated","FacilitatorBucketLevelUpdated"],Ae=class extends Q{ghoClient;stableClient;constructor(t,e,i){super(t,e),this.stableClient=i,this.ghoClient=new _e(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:i}=e.value;return i.key}}throw Error("Invalid hollar multilocation")}getPoolAddress(t){let e=t.padEnd(32,"\0"),i=new TextEncoder().encode(e),r=(0,rn.toHex)(i);return(0,Wt.AccountId)(pi.HYDRATION_SS58_PREFIX).dec(r)}async isSupported(){return(await this.api.getStaticApis()).compat.query.HSM.Collaterals.isCompatible(Wt.CompatibilityLevel.BackwardsCompatible)}async loadPools(){let t=await this.api.constants.HSM.HollarId(),[e,i,r]=await Promise.all([this.api.query.AssetRegistry.AssetLocations.getValue(t),this.api.query.HSM.Collaterals.getEntries({at:"best"}),this.stableClient.getPools()]);if(i.length===0)return[];let n=this.getFacilitatorAddress(),s=en.fromAny(n),a=this.getHollarAddress(e),o=await this.ghoClient.getFacilitatorCapacity(a,s),l=i.map(async({keyArgs:p,value:d})=>{let[m]=p,{pool_id:h,max_buy_price_coefficient:b,max_in_holding:g,purchase_fee:P,buy_back_fee:y,buyback_rate:v}=d,S=r.find(T=>T.id===h);if(S){let T=this.getPoolId(h),B=await this.balance.getBalance(n,m);return{...S,address:T,type:"HSM",tokens:S.tokens.filter(H=>H.id!==h),hsmAddress:n,hsmMintCapacity:o,hollarId:t,hollarH160:a,collateralId:m,collateralBalance:B.transferable,maxBuyPriceCoefficient:b,maxInHolding:g,purchaseFee:Xi.fromPermill(P),buyBackFee:Xi.fromPermill(y),buyBackRate:Xi.fromPerbill(v)}}});return(await Promise.all(l)).filter(p=>p!==null)}async getPoolFees(){return{}}parseEvmLog(t){let{topics:e,data:i}=t.log,r=e,n=Wt.Binary.toHex(i);try{let{eventName:s,args:a}=(0,nn.decodeEventLog)({abi:Ie,topics:r,data:n}),o=a.facilitatorAddress.toLowerCase();return{eventName:s,facilitator:o,key:`${s}:${o}`}}catch{return}}subscribeEvmLog(){return this.api.event.EVM.Log.watch().pipe((0,U.mergeMap)(({events:t})=>t),(0,U.map)(({payload:t})=>this.parseEvmLog(t)),(0,U.filter)(t=>t!==void 0),(0,U.filter)(({eventName:t})=>us.includes(t)),this.watchGuard("evm.Log")).subscribe(({eventName:t,facilitator:e})=>{this.log.trace(`evm.Log.${t}`,e),this.store.update(async i=>{let r=[],[{hsmAddress:n,hollarH160:s}]=i,a=en.fromAny(n);if(a.toLowerCase()===e){let l=await this.ghoClient.getFacilitatorCapacity(s,a);for(let u of i)r.push({...u,hsmMintCapacity:l})}return r})})}subscribeCollateralBalance(){let t=[],e=[];this.store.pools.forEach(n=>{let{tokens:s,collateralId:a}=n;s.find(l=>l.id===a).type==="Erc20"?e.push(a):t.push(a)});let[{hsmAddress:i}]=this.store.pools,r=[];if(t.length>0){let n=this.balance.watchTokensBalance(i);r.push(n)}if(e.length>0){let n=this.balance.watchErc20Balance(i,e);r.push(n)}return r.length>0?(0,U.combineLatest)(r).pipe((0,U.map)(n=>n.flat()),(0,U.pairwise)(),(0,U.map)(([n,s])=>this.balance.getDeltas(n,s)),this.watchGuard("balances")).subscribe(n=>{this.store.update(s=>{let a=[],o=new Map(s.map(l=>[l.collateralId,l]));return n.forEach(({id:l,balance:u})=>{let p=o.get(l);p&&(this.log.trace("balances",{id:l,balance:u}),a.push({...p,collateralBalance:u.transferable}))}),a})}):U.Subscription.EMPTY}subscribeStableswapUpdates(){return this.stableClient.getSubscriber().pipe(this.watchGuard("stableswap.updates")).subscribe(t=>{let e=new Map(t.map(i=>[i.id,i]));this.store.update(i=>{let r=[];for(let n of i){let s=e.get(n.id);s&&r.push({...n,fee:s.fee,tokens:s.tokens.filter(a=>a.id!==n.id),totalIssuance:s.totalIssuance,pegs:s.pegs,amplification:s.amplification,isRampPeriod:s.isRampPeriod})}return r})})}subscribeBalances(){return U.Subscription.EMPTY}subscribeUpdates(){let t=new U.Subscription;return t.add(this.subscribeCollateralBalance()),t.add(this.subscribeStableswapUpdates()),t.add(this.subscribeEvmLog()),t}};var zt=class{static get(t){switch(t.type){case"Aave":return we.fromPool(t);case"XYK":return Se.fromPool(t);case"Omnipool":return be.fromPool(t);case"LBP":return ge.fromPool(t);case"Stableswap":return Bt.fromPool(t);case"HSM":return Te.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var sn=require("@galacticcouncil/common"),ct=require("rxjs");var{logger:ps}=sn.log,Yt=class extends L{evm;aave;omnipool;stableswap;hsm;xyk;lbp;active=new Set([]);pools=new Map([]);clients=[];aaveSub=ct.Subscription.EMPTY;omniSub=ct.Subscription.EMPTY;stableSub=ct.Subscription.EMPTY;hsmSub=ct.Subscription.EMPTY;xykSub=ct.Subscription.EMPTY;lbpSub=ct.Subscription.EMPTY;isReady=!1;isDestroyed=new ct.Subject;constructor(t,e){super(t),this.evm=e,this.aave=new xe(t,e),this.omnipool=new ye(t,e),this.stableswap=new Pe(t,e),this.hsm=new Ae(t,e,this.stableswap),this.xyk=new ve(t,e),this.lbp=new he(t,e),this.clients=[this.aave,this.omnipool,this.stableswap,this.hsm,this.xyk,this.lbp]}subscribe(t){return t.getSubscriber().pipe((0,ct.takeUntil)(this.isDestroyed)).subscribe(e=>{e.forEach(i=>{this.pools.set(i.address,i)})})}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.active.has("Stableswap")||(ps.info("[PoolContextProvider] auto-activating stableswap"),this.withStableswap()),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 i=this.clients.find(r=>r.getPoolType()===e.type);if(i)return i.getPoolFees(t,e.address);throw new ne(e.type)}};var rr={};R(rr,{DCA_TIME_RESERVE:()=>ln,DEFAULT_BLOCK_TIME:()=>on,DEFAULT_MIN_BUDGET:()=>Zi,ORDER_MIN_BLOCK_PERIOD:()=>cn,Router:()=>$t,TWAP_EXECUTION_INTERVAL:()=>Re,TWAP_MAX_DURATION:()=>er,TWAP_MAX_PRICE_IMPACT:()=>tr,TWAP_TX_MULTIPLIER:()=>am,TradeOrderError:()=>Ji,TradeOrderType:()=>di,TradeRouteBuilder:()=>it,TradeRouter:()=>It,TradeScheduler:()=>Xt,TradeType:()=>mi});var Oe=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 ms=10,Be=class{isNotVisited(t,e){let i=!0;return e.forEach(r=>{(r[0]===t[0]||r[1]===t[1])&&(i=!1)}),i}findPaths(t,e,i){let r=[],n=new Oe,s=[];for(s.push([e,""]),n.enqueue(s);n.size()>0;){let a=n.dequeue();if(!a||a.length>ms)continue;let o=a[a.length-1];(i===null||o[0]===i)&&r.push(a),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,a)){let p=[...a];p.push(u),n.enqueue(p)}})}return r}findShortestPaths(t,e,i){let r=[],n=new Oe,s=[];s.push([e,""]),n.enqueue(s);let a=1/0;for(;n.size()>0;){let o=n.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===i){o.length<a?(a=o.length,r.length=0,r.push(o)):o.length===a&&r.push(o);continue}let u=t.get(l[0]);for(let p of u??[])this.isNotVisited(p,o)&&n.enqueue([...o,p])}return r}buildAndPopulateGraph(t,e){let i=new Map;for(let r of t)i.set(parseInt(r),[]);for(let[r,n,s]of e)i.get(n)?.push([s,r]);return i}};function Qi(c){let t={};for(let e of c){let i=e.tokens.length;for(let r=0;r<i;r++){t[e.tokens[r].id]||(t[e.tokens[r].id]=[]);for(let n=0;n<i;n++){if(r==n)continue;let s=[e.address,e.tokens[r].id,e.tokens[n].id];t[e.tokens[r].id].push(s)}}}return t}var Fe=class{getProposals(t,e,i){let r=i.filter(g=>g.type==="XYK"),n=i.filter(g=>g.type!=="XYK"),s=new Set(n.map(g=>g.tokens).flat().map(g=>g.id)),a=s.has(t),o=s.has(e),l=new Be,u=g=>{let P=Qi(g),y=Object.keys(P),v=y.flatMap(S=>P[S]);return l.buildAndPopulateGraph(y,v)};if(!a&&!o){let g=r.filter(v=>v.tokens.find(S=>S.id===t)||v.tokens.find(S=>S.id===e)),P=u(g),y=l.findPaths(P,t,e);return this.parsePaths(y)}if(a&&o){let g=u(n),P=l.findPaths(g,t,e);return this.parsePaths(P)}let p=a?e:t,d=r.filter(g=>g.tokens.some(P=>P.id===p));if(d.length===0)return[];let m=[...n,...d],h=u(m),b=l.findPaths(h,t,e);return this.parsePaths(b)}parsePaths(t){let e=[];for(let i of t){let r=[];for(let n=0;n<i.length;n++){let s=i[n],a=i[n+1];if(a==null)break;r.push(this.toEdge(s,a))}e.push(r)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var $t=class{routeSuggester;routeProposals;ctx;filter={};constructor(t){this.ctx=t,this.routeSuggester=new Fe,this.routeProposals=new Map}async withFilter(t){this.filter=t||{},this.routeProposals.clear(),this.onFilterChanged()}onFilterChanged(){}buildRouteKey(t,e,i){return`${t}->${e}::${i.length}`}applyPoolFilter(t){let{useOnly:e=[],exclude:i=[]}=this.filter,r=new Set(e),n=new Set(i);return t.filter(s=>n.has(s.type)?!1:r.size>0?r.has(s.type):!0)}async getPools(){let t=await this.ctx.getPools();return this.applyPoolFilter(t)}async getRoutes(t,e){let i=await this.getPools();return this.validateInput(t,e,i),this.getPaths(t,e,i)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}async getRouteableAssets(t){let e=await this.getTradeableAssets();return(await Promise.all(e.filter(r=>r!==t).map(r=>this.getRoutes(r,t)))).filter(r=>r.length>0).map(([r])=>r[0].assetIn).sort()}validateInput(t,e,i){if(i.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let r=this.getAssets(i);if(!r.has(t))throw new Error(t+" is not supported asset");if(!r.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(i)}getAssets(t){let e=t.map(i=>i.tokens.map(r=>r.id)).flat().sort((i,r)=>i>r?1:-1);return new Set(e)}getPaths(t,e,i){let r=this.toPoolsMap(i);return this.getProposals(t,e,i).filter(s=>this.validPath(s,r)).map(s=>this.toHops(s,r))}getProposals(t,e,i){let r=this.buildRouteKey(t,e,i);if(this.routeProposals.has(r))return this.routeProposals.get(r);let n=this.routeSuggester.getProposals(t,e,i);return this.routeProposals.set(r,n),n}validPath(t,e){return t.length>0&&t.map(i=>this.validEdge(i,e)).reduce((i,r)=>i&&r)}validEdge([t,e,i],r){return r.get(t)?.validatePair(e,i)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,zt.get(e)]))}toHops(t,e){return t.map(([i,r,n])=>{let s=e.get(i);return{poolAddress:i,poolId:s?.id,pool:s?.type,assetIn:r,assetOut:n}})}};var A=require("@galacticcouncil/common");var mi=(e=>(e.Buy="Buy",e.Sell="Sell",e))(mi||{}),di=(i=>(i.Dca="Dca",i.TwapSell="TwapSell",i.TwapBuy="TwapBuy",i))(di||{}),Ji=(i=>(i.OrderTooSmall="OrderTooSmall",i.OrderTooBig="OrderTooBig",i.OrderImpactTooBig="OrderImpactTooBig",i))(Ji||{});var{FeeUtils:an}=O,It=class extends $t{mlr;constructor(t){super(t),this.mlr=new Map}onFilterChanged(){this.mlr.clear()}buildCtxSync(t,e,i){let r=super.validateInput(t,e,i),n=super.getPaths(t,e,i);if(!n.length)throw new se(t,e);return{paths:n,pools:i,poolsMap:r}}async withCtx(t,e,i){let r=await super.getPools(),n=this.buildCtxSync(t,e,r);return i(n)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((i,r)=>{let n=i[i.length-1].amountOut,s=r[r.length-1].amountOut;return n>s?-1:1});return e.find(i=>i.every(r=>r.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(i=>i.tradeFeeRange).length>0){let i=t.map(n=>n.tradeFeeRange?.[0]??n.tradeFeePct).reduce((n,s)=>n+s),r=t.map(n=>n.tradeFeeRange?.[1]??n.tradeFeePct).reduce((n,s)=>n+s);return[i,r]}}getPoolFeeRange(t,e){let i=t.min?an.toPct(t.min):void 0,r=t.max?an.toPct(t.max):void 0;if(i&&r)return[i,Math.max(r,e)]}async getBestSell(t,e,i){return this.getSell(t,e,i)}getSellSpot(t){let e=t[t.length-1];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getSell(t,e,i,r){return this.withCtx(t,e,async({paths:n,poolsMap:s})=>{let a;if(r)a=await this.toSellSwaps(i,r,s);else{let o=n.map(u=>this.toSellSwaps(i,u,s)),l=await Promise.all(o);a=this.findBestSellRoute(l)}return this.buildSell(s,a)})}async getSells(t,e,i){return this.withCtx(t,e,async({paths:r,poolsMap:n})=>{let s=r.map(o=>this.toSellSwaps(i,o,n));return(await Promise.all(s)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildSell(n,o)).sort((o,l)=>o.amountOut>l.amountOut?-1:1)})}buildSell(t,e){let i=e[0],r=e[e.length-1],n=this.isDirectTrade(e),s=this.getSellSpot(e),a=r.amountOut,o=n?r.calculatedOut:this.calculateDelta0Y(i.amountIn,e,t),l=o-a,u=this.getRouteFeeRange(e),p=n?r.tradeFeePct:z.calculateSellFee(o,a),d=N.mulSpot(i.amountIn,s,i.assetInDecimals,r.assetOutDecimals),m=z.calculateDiffToRef(o,d);return{type:"Sell",amountIn:i.amountIn,amountOut:r.amountOut,spotPrice:s,tradeFee:l,tradeFeePct:p,tradeFeeRange:u,priceImpactPct:m,swaps:e,toHuman(){return{type:"Sell",amountIn:A.big.toDecimal(i.amountIn,i.assetInDecimals),amountOut:A.big.toDecimal(r.amountOut,r.assetOutDecimals),spotPrice:A.big.toDecimal(s,A.RUNTIME_DECIMALS),tradeFee:A.big.toDecimal(l,r.assetOutDecimals),tradeFeePct:p,tradeFeeRange:u,priceImpactPct:m,swaps:e.map(h=>h.toHuman())}}}}calculateSpot(t){return t.map(e=>e.spotPrice).reduce((e,i)=>e*i/10n**BigInt(A.RUNTIME_DECIMALS))}calculateDelta0Y(t,e,i){let r=[];for(let n=0;n<e.length;n++){let s=e[n],a=i.get(s.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(s.assetIn,s.assetOut),l;n>0?l=r[n-1]:l=t;let u=a.calculateOutGivenIn(o,l);r.push(u)}return r[r.length-1]}async calculateMostLiquidRoute(t,e,i){let{paths:r,pools:n,poolsMap:s}=i,l=n.filter(b=>b.tokens.some(g=>g.id===t)).map(b=>b.type==="Aave"?b.tokens:b.tokens.filter(g=>g.id===t)).map(b=>b.map(g=>g.balance).reduce((g,P)=>g+P)).sort((b,g)=>g<b?-1:1)[0],u=N.getFraction(l,.1),p=await Promise.all(r.map(b=>this.toSellSwaps(u,b,s))),m=this.findBestSellRoute(p).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),h=this.buildRouteKey(t,e,n);return this.mlr.set(h,m),m}async toSellSwaps(t,e,i){let r=[];for(let n=0;n<e.length;n++){let s=e[n],a=i.get(s.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(s.assetIn,s.assetOut),l;n>0?l=r[n-1].amountOut:l=typeof t=="string"?A.big.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(o,a),{amountOut:p,calculatedOut:d,feePct:m,errors:h}=a.validateAndSell(o,l,u),b=this.getPoolFeeRange(u,m),g=a.spotPriceOutGivenIn(o),P=N.mulSpot(l,g,o.decimalsIn,o.decimalsOut),y=z.calculateDiffToRef(d,P);r.push({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:p,calculatedOut:d,spotPrice:g,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:y,errors:h,isSupply(){return a.type==="Aave"&&a.tokens[0].id===s.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===s.assetIn},toHuman(){return{...s,amountIn:A.big.toDecimal(l,o.decimalsIn),amountOut:A.big.toDecimal(p,o.decimalsOut),calculatedOut:A.big.toDecimal(d,o.decimalsOut),spotPrice:A.big.toDecimal(g,A.RUNTIME_DECIMALS),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:y,errors:h}}})}return r}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async i=>{let r=this.buildRouteKey(t,e,i.pools),n=this.mlr.get(r);return n||this.calculateMostLiquidRoute(t,e,i)})}async getSpotPrice(t,e){return this.withCtx(t,e,async i=>{let{pools:r,poolsMap:n}=i,s=this.buildRouteKey(t,e,r),a=this.mlr.get(s);a||(a=await this.calculateMostLiquidRoute(t,e,i));let o=await this.toSellSwaps("1",a,n);return{amount:this.getSellSpot(o),decimals:A.RUNTIME_DECIMALS}}).catch(()=>{})}findBestBuyRoute(t){let e=t.sort((i,r)=>{let n=i[0].amountIn,s=r[0].amountIn;return n>s?1:-1});return e.find(i=>i.every(r=>r.errors.length==0))||e[0]}async getBestBuy(t,e,i){return this.getBuy(t,e,i)}getBuySpot(t){let e=t[0];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getBuy(t,e,i,r){return this.withCtx(t,e,async({paths:n,poolsMap:s})=>{let a;if(r)a=await this.toBuySwaps(i,r,s);else{let o=n.map(u=>this.toBuySwaps(i,u,s)),l=await Promise.all(o);a=this.findBestBuyRoute(l)}return this.buildBuy(s,a)})}async getBuys(t,e,i){return this.withCtx(t,e,async({paths:r,poolsMap:n})=>{let s=r.map(o=>this.toBuySwaps(i,o,n));return(await Promise.all(s)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildBuy(n,o)).sort((o,l)=>o.amountIn>l.amountIn?1:-1)})}buildBuy(t,e){let i=e[e.length-1],r=e[0],n=this.isDirectTrade(e),s=this.getBuySpot(e),a=r.amountIn,o=n?r.calculatedIn:this.calculateDelta0X(i.amountOut,e,t),l=a-o,u=this.getRouteFeeRange(e),p=n?r.tradeFeePct:z.calculateBuyFee(o,a),d=N.mulSpot(i.amountOut,s,i.assetOutDecimals,r.assetInDecimals),m;return o===0n?m=-100:m=z.calculateDiffToRef(d,o),{type:"Buy",amountOut:i.amountOut,amountIn:r.amountIn,spotPrice:s,tradeFee:l,tradeFeePct:p,tradeFeeRange:u,priceImpactPct:m,swaps:e,toHuman(){return{type:"Buy",amountOut:A.big.toDecimal(i.amountOut,i.assetOutDecimals),amountIn:A.big.toDecimal(r.amountIn,r.assetInDecimals),spotPrice:A.big.toDecimal(s,A.RUNTIME_DECIMALS),tradeFee:A.big.toDecimal(l,r.assetInDecimals),tradeFeePct:p,tradeFeeRange:u,priceImpactPct:m,swaps:e.map(h=>h.toHuman())}}}}calculateDelta0X(t,e,i){let r=[];for(let n=e.length-1;n>=0;n--){let s=e[n],a=i.get(s.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(s.assetIn,s.assetOut),l;n==e.length-1?l=t:l=r[0];let u=a.calculateInGivenOut(o,l);r.unshift(u)}return r[0]}async toBuySwaps(t,e,i){let r=[];for(let n=e.length-1;n>=0;n--){let s=e[n],a=i.get(s.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(s.assetIn,s.assetOut),l;n==e.length-1?l=typeof t=="string"?A.big.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let u=await this.ctx.getPoolFees(o,a),{amountIn:p,calculatedIn:d,feePct:m,errors:h}=a.validateAndBuy(o,l,u),b=this.getPoolFeeRange(u,m),g=a.spotPriceInGivenOut(o),P=N.mulSpot(l,g,o.decimalsOut,o.decimalsIn),y;d===0n?y=-100:y=z.calculateDiffToRef(P,d),r.unshift({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:p,calculatedIn:d,spotPrice:g,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:y,errors:h,isSupply(){return a.type==="Aave"&&a.tokens[0].id===s.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===s.assetIn},toHuman(){return{...s,amountOut:A.big.toDecimal(l,o.decimalsOut),amountIn:A.big.toDecimal(p,o.decimalsIn),calculatedIn:A.big.toDecimal(d,o.decimalsIn),spotPrice:A.big.toDecimal(g,A.RUNTIME_DECIMALS),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:y,errors:h}}})}return r}};var V=require("@galacticcouncil/common");var on=6e3,Zi=1000000000000000n,Re=6,tr=-5,er=216e5,am=3,ln=.1,cn=6;var ir=require("polkadot-api");var it=class{static build(t){return t.map(({assetIn:e,assetOut:i,pool:r,poolId:n})=>r==="Stableswap"?{pool:(0,ir.Enum)("Stableswap",n),asset_in:e,asset_out:i}:{pool:(0,ir.Enum)(r),asset_in:e,asset_out:i})}};var Xt=class{schedulerOptions;router;constructor(t,e={}){this.router=new It(t),this.router.withFilter({exclude:["HSM"]}),this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Zi})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,i,r,n){let s=await this.router.getBestSell(t,e,i),{amountIn:a,swaps:o,priceImpactPct:l}=s,u=o[0],p=o[o.length-1],{assetInDecimals:d}=u,{assetOutDecimals:m}=p,h=Math.abs(l),b=await this.getMinimumOrderBudget(t,d),g=this.getOptimalTradeCount(h),P=this.getMaximumTradeCount(a,b,r),y=n||Math.min(g,P),v=Math.round(r/y),S=a/BigInt(y),T=await this.router.getBestSell(t,e,S),B=a<b,H=[];B&&H.push("OrderTooSmall");let W=T.amountOut*BigInt(y),ut=this.toBlockPeriod(v),yt=T.tradeFee*BigInt(y),Z=it.build(o),nt={assetIn:t,assetOut:e,errors:H,maxTradeCount:P,tradeCount:y,tradeFee:yt,tradeImpactPct:T.priceImpactPct,tradePeriod:ut,tradeRoute:Z,type:"Dca"};return{...nt,amountIn:a,amountOut:W,tradeAmountIn:T.amountIn,tradeAmountOut:T.amountOut,toHuman(){return{...nt,amountIn:V.big.toDecimal(a,d),amountOut:V.big.toDecimal(W,m),tradeAmountIn:V.big.toDecimal(T.amountIn,d),tradeAmountOut:V.big.toDecimal(T.amountOut,m)}}}}async getMinimumOrderBudget(t,e){if(0===t)return this.minOrderBudget;let i=await this.router.getSpotPrice(0,t);if(i)return N.mulSpot(this.minOrderBudget,i.amount,12,e);let r=await this.router.getSpotPrice(t,0);if(r)return N.divSpot(this.minOrderBudget,r.amount,12,e);throw new Error("Unable to calculate order budget")}getMaximumTradeCount(t,e,i){let r=e*2n/10n;if(r===0n)return 0;let n=Number(t/r),s=Math.floor(i/this.blockTime),a=Math.max(0,Math.floor(s*(1-.1)));return Math.min(n,a)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getOpenBudgetDcaOrder(t,e,i,r){let n=await this.router.getBestSell(t,e,i),{swaps:s}=n,a=s[0],o=s[s.length-1],{assetInDecimals:l}=a,{assetOutDecimals:u}=o,p=await this.getMinimumOrderBudget(t,l),d=n.amountIn<p,m=[];d&&m.push("OrderTooSmall");let h=this.toBlockPeriod(r),b=it.build(s),g={assetIn:t,assetOut:e,errors:m,maxTradeCount:0,tradeCount:0,tradeFee:n.tradeFee,tradeImpactPct:n.priceImpactPct,tradePeriod:h,tradeRoute:b,type:"Dca"};return{...g,amountIn:0n,amountOut:0n,tradeAmountIn:n.amountIn,tradeAmountOut:n.amountOut,toHuman(){return{...g,amountIn:"0",amountOut:"0",tradeAmountIn:V.big.toDecimal(n.amountIn,l),tradeAmountOut:V.big.toDecimal(n.amountOut,u)}}}}async getTwapSellOrder(t,e,i){let r=await this.router.getBestSell(t,e,i),{amountIn:n,swaps:s,priceImpactPct:a}=r,o=s[0],l=s[s.length-1],{assetInDecimals:u}=o,{assetOutDecimals:p}=l,d=Math.abs(a),m=this.getTwapTradeCount(d),h=n/BigInt(m),[b,g]=await Promise.all([this.getMinimumOrderBudget(t,u),this.router.getBestSell(o.assetIn,l.assetOut,h)]),P=m===1,y=n<b,v=g.priceImpactPct<-5,S=[];y||P?S.push("OrderTooSmall"):v&&S.push("OrderImpactTooBig");let T=g.amountOut*BigInt(m),B=g.tradeFee*BigInt(m),H=it.build(s),W={assetIn:t,assetOut:e,errors:S,tradeCount:m,tradeImpactPct:g.priceImpactPct,tradePeriod:6,tradeRoute:H,type:"TwapSell"};return{...W,amountIn:n,amountOut:T,tradeAmountIn:g.amountIn,tradeAmountOut:g.amountOut,tradeFee:B,toHuman(){return{...W,amountIn:V.big.toDecimal(n,u),amountOut:V.big.toDecimal(T,p),tradeAmountIn:V.big.toDecimal(g.amountIn,u),tradeAmountOut:V.big.toDecimal(g.amountOut,p),tradeFee:V.big.toDecimal(B,p)}}}}async getTwapBuyOrder(t,e,i){let r=await this.router.getBestBuy(t,e,i),{amountOut:n,swaps:s,priceImpactPct:a}=r,o=s[0],l=s[s.length-1],{assetInDecimals:u}=o,{assetOutDecimals:p}=l,d=Math.abs(a),m=this.getTwapTradeCount(d),h=n/BigInt(m),[b,g]=await Promise.all([this.getMinimumOrderBudget(t,u),this.router.getBestBuy(o.assetIn,l.assetOut,h)]),P=g.amountIn*BigInt(m),y=m===1,v=P<b,S=g.priceImpactPct<-5,T=[];v||y?T.push("OrderTooSmall"):S&&T.push("OrderImpactTooBig");let B=g.tradeFee*BigInt(m),H=it.build(s),W={assetIn:t,assetOut:e,errors:T,tradeCount:m,tradeImpactPct:g.priceImpactPct,tradePeriod:6,tradeRoute:H,type:"TwapBuy"};return{...W,amountIn:P,amountOut:n,tradeAmountIn:g.amountIn,tradeAmountOut:g.amountOut,tradeFee:B,toHuman(){return{...W,amountIn:V.big.toDecimal(P,u),amountOut:V.big.toDecimal(n,p),tradeAmountIn:V.big.toDecimal(g.amountIn,u),tradeAmountOut:V.big.toDecimal(g.amountOut,p),tradeFee:V.big.toDecimal(B,u)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let r=216e5/(this.blockTime*6);return Math.round(r)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,i=Math.round(e);return Math.max(i,6)}};var ar={};R(ar,{BIG_10:()=>hn,BIG_BILL:()=>nr,StakingApi:()=>Ce,StakingClient:()=>Ee});var j=require("@galacticcouncil/math-staking"),rt=vt(require("big.js"));var gi={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},un=c=>Object.keys(gi).includes(c);var pn=require("polkadot-api"),mn=require("@polkadot-api/utils"),dn=require("@galacticcouncil/common");function gn(c){let t=("modl"+c).padEnd(32,"\0"),e=new TextEncoder().encode(t),i=(0,mn.toHex)(e);return(0,pn.AccountId)(dn.HYDRATION_SS58_PREFIX).dec(i)}var hi="20000000000000000",bi="2000",hn=(0,rt.default)(10),nr=(0,rt.default)(hn.pow(12)),Ce=class{client;balance;constructor(t,e){this.client=t,this.balance=e}async getPotBalance(){let t=await this.client.getPalletId(),e=gn(t);return await this.balance.getBalance(e,0)}async getStakingPosition(t){let[e,i]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]);if(!e)return;let r=e.created_at,n=await i.reduce(async(s,[a,o])=>{let l=await s,u=a,p=o.amount,d=o.conviction.type.toLowerCase(),m=await this.client.getReferendumInfo(u);return m&&(m.type==="Approved"||m.type==="Rejected")&&un(d)&&l.push({id:u,amount:p,conviction:d}),l},Promise.resolve([]));return{stake:e.stake,rewardPerStake:e.reward_per_stake,createdAt:r,actionPoints:e.action_points,accumulatedUnpaidRewards:e.accumulated_unpaid_rewards,accumulatedSlashPoints:e.accumulated_slash_points,accumulatedLockedRewards:e.accumulated_locked_rewards,votes:n}}async getStake(t){let e=await this.client.getNFTCollectionId(),[i,r]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),n=r.find(s=>s)?.itemId;return{totalStake:i?.total_stake,accumulatedRewardPerStake:i?.accumulated_reward_per_stake,potReservedBalance:i?.pot_reserved_balance,positionId:n,stakePosition:n?await this.getStakingPosition(n):void 0}}getCurrentActionPoints(t,e,i,r){let n=(0,rt.default)(0),s=(0,rt.default)(0),a=gi.locked6x,o=(0,rt.default)(i.toString()).mul(a),l=100,u=[];t.forEach(m=>{let h=gi[m.conviction],b=r.includes(m.id.toString());b&&u.push(m.id.toString());let g=(0,rt.default)(m.amount.toString()).mul(l).div(o);n=n.plus(Math.floor(g.mul(h).toNumber())),s=s.plus(Math.floor(g.mul(b?a:h).toNumber()))});let p=Math.floor((0,rt.default)(i.toString()).mul(a).mul(l).div(o).toNumber());r.forEach(m=>{u.includes(m)||(s=s.plus(p))});let d={democracyVote:1};return n=n.mul(d.democracyVote),n=n.plus(e.toString()||"0"),s=s.mul(d.democracyVote),s=s.plus(e.toString()||"0"),{currentActionPoints:n.toString(),maxActionPoints:s.toString()}}async getRewards(t,e,i){let r=await this.getStake(t),{potReservedBalance:n,accumulatedRewardPerStake:s,totalStake:a,stakePosition:o}=r;if(!o)return;let[l,u,p,d,m,h,b]=await Promise.all([this.getPotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getTimePointsPerPeriod(),this.client.getTimePointsWeight(),this.client.getActionPointsWeight(),this.client.getSixBlockSince()]),g=(0,rt.default)(l.transferable.toString()).minus(n.toString()),P=g.gt(0)&&a>0?(0,j.calculate_accumulated_rps)(s.toString(),g.toString(),a.toString()):s.toString(),y=(0,j.calculate_period_number)(u.toString(),i,b),v=(0,j.calculate_period_number)(u.toString(),o.createdAt.toString(),b),S=(0,j.calculate_rewards)(P,o.rewardPerStake.toString(),o.stake.toString()),T=this.getCurrentActionPoints(o.votes,o.actionPoints,o.stake,e),B=(0,j.calculate_points)(v,y,d.toString(),m.toString(),T.currentActionPoints,h.toString(),o.accumulatedSlashPoints.toString()),H=(0,j.sigmoid)(B,hi,bi),W=(()=>{if(!e.length)return;let Qt=(0,j.calculate_points)(v,y,d.toString(),m.toString(),T.maxActionPoints.toString(),h.toString(),o.accumulatedSlashPoints.toString());return(0,j.sigmoid)(Qt,hi,bi)})(),ut=(0,rt.default)(S).plus(o.accumulatedUnpaidRewards.toString()).plus(o.accumulatedLockedRewards.toString());if((0,rt.default)(y).minus(v).lte(p.toString()))return{rewards:"0",payablePercentage:H,extraPayablePercentage:W,constants:{a:hi,b:bi}};let yt=(0,j.calculate_percentage_amount)(ut.toString(),H),Z=(0,rt.default)(o.accumulatedLockedRewards.toString()),nt=Z.gt(yt)?Z:(0,rt.default)(yt);return{rewards:nt.div(nr).toString(),maxRewards:ut.div(nr).toString(),allocatedRewardsPercentage:nt.div(ut).mul(100).toNumber(),points:B,payablePercentage:H,extraPayablePercentage:W,constants:{a:hi,b:bi}}}};var sr=require("polkadot-api");var Ee=class extends L{async getPalletId(){let t=this.api.constants.Staking.PalletId,e=await t();return sr.Binary.toText(sr.Binary.fromHex(e))}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:s})=>{let[a,o,l]=s;return{address:a,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async 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 lr={};R(lr,{TxBuilderFactory:()=>jt});var or=require("polkadot-api");function bn(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var Kt=class extends L{evm;evmClient;balance;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balance=new pt(t),this.aaveUtils=new _t(e)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:i=>this.dryRun(i,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:Ti})}async dryRun(t,e){let i=(0,or.Enum)("Signed",t),r=(0,or.Enum)("system",i),s=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,e.decodedCall,4),a=s.success&&!s.value.execution_result.success?s.value.execution_result.value.error:null;if(a){let o=a.type==="Module"?bn(a.value):a.type;throw new Error("Dry run execution error!",{cause:o})}return s}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var yi=class extends Kt{_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:i}=this.trade;if(i==="Buy")return this.buildBuyTx();let{assetIn:r}=e[0],n=await this.balance.getBalance(this.beneficiary,r);return t>=n.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:i}=this.trade,r=i[0],n=i[i.length-1],s=N.getFraction(t,this.slippagePct),a=r.assetIn,o=n.assetOut,l=t+s,u;return this.isDirectOmnipoolTrade(i)?u=this.api.tx.Omnipool.buy({asset_in:a,asset_out:o,amount:e,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:a,asset_out:o,amount_out:e,max_amount_in:l,route:it.build(i)}),await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("RouterBuy",u)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:i}=this.trade,r=i[0],n=i[i.length-1],s=N.getFraction(e,this.slippagePct),a=r.assetIn,o=n.assetOut,l=e-s,u;return this.isDirectOmnipoolTrade(i)?u=this.api.tx.Omnipool.sell({asset_in:a,asset_out:o,amount:t,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:a,asset_out:o,amount_in:t,min_amount_out:l,route:it.build(i)}),await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("RouterSell",u)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,i=e[0],r=e[e.length-1],n=N.getFraction(t,this.slippagePct),s=i.assetIn,a=r.assetOut,o=t-n,l=this.api.tx.Router.sell_all({asset_in:s,asset_out:a,min_amount_out:o,route:it.build(e)});return await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var fi=require("polkadot-api");var Pi=class extends Kt{_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}`)}}async buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:i,tradeAmountIn:r,tradePeriod:n,tradeRoute:s}=this.order,a=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:n,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,fi.Enum)("Sell",{asset_in:e,asset_out:i,amount_in:r,min_amount_out:0n,route:s})},start_execution_block:void 0});return await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(a=await this.dispatchWithExtraGas(a)),this.wrapTx("DcaSchedule",a)}async buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:i,tradeAmountIn:r,tradeAmountOut:n,tradePeriod:s,tradeRoute:a}=this.order,o=N.getFraction(n,this.slippagePct),l=n-o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,fi.Enum)("Sell",{asset_in:e,asset_out:i,amount_in:r,min_amount_out:l,route:a})},start_execution_block:void 0});return await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("DcaSchedule.twapSell",u)}async buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:i,tradeAmountIn:r,tradeAmountOut:n,tradePeriod:s,tradeRoute:a}=this.order,o=N.getFraction(r,this.slippagePct),l=r+o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,fi.Enum)("Buy",{asset_in:e,asset_out:i,amount_out:n,max_amount_in:l,route:a})},start_execution_block:void 0});return await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("DcaSchedule.twapBuy",u)}};var jt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new yi(this.client,this.evmClient).setTrade(t)}order(t){return new Pi(this.client,this.evmClient).setOrder(t)}};async function ds(c){let t=new Lt(c),e=new oe(c),[i,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),n=new Yt(c,e).withAave().withOmnipool().withStableswap().withXyk(),s=new pt(c),a=new Ee(c),o=new de(c),l=new _t(e),u=new It(n),p=new Xt(n,{blockTime:i,minBudgetInNative:r}),d=new Ce(a,s),m=new pe(o,s,{blockTime:i});return{api:{aave:l,router:u,scheduler:p,staking:d,farm:m},client:{asset:new Et(c),balance:s,evm:e},ctx:{pool:n},tx:new jt(c,e),destroy:()=>{n.destroy()}}}0&&(module.exports={QueryBus,aave,api,async,calc,client,const:null,createSdkContext,error,evm,farm,fmt,json,math,pool,sor,staking,tx});
1
+ "use strict";var wn=Object.create;var He=Object.defineProperty;var xn=Object.getOwnPropertyDescriptor;var Tn=Object.getOwnPropertyNames;var In=Object.getPrototypeOf,_n=Object.prototype.hasOwnProperty;var wi=(c,t)=>()=>(c&&(t=c(c=0)),t);var R=(c,t)=>{for(var e in t)He(c,e,{get:t[e],enumerable:!0})},Ne=(c,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Tn(t))!_n.call(c,r)&&r!==e&&He(c,r,{get:()=>t[r],enumerable:!(i=xn(t,r))||i.enumerable});return c},ft=(c,t,e)=>(Ne(c,t,"default"),e&&Ne(e,t,"default")),wt=(c,t,e)=>(e=c!=null?wn(In(c)):{},Ne(t||!c||!c.__esModule?He(e,"default",{value:c,enumerable:!0}):e,c)),An=c=>Ne(He({},"__esModule",{value:!0}),c);var Zt={};var yr=wi(()=>{ft(Zt,require("@polkadot-api/sm-provider"))});var te={};var fr=wi(()=>{ft(te,require("@polkadot-api/smoldot"))});var ee={};var Pr=wi(()=>{ft(ee,require("@polkadot-api/known-chains/polkadot"))});var hs={};R(hs,{QueryBus:()=>pe,aave:()=>Oi,api:()=>xi,async:()=>ce,calc:()=>N,client:()=>Ri,const:()=>Fi,createSdkContext:()=>gs,error:()=>Ei,evm:()=>Di,farm:()=>Wi,fmt:()=>O,json:()=>qt,math:()=>z,pool:()=>Ji,sor:()=>sr,staking:()=>lr,tx:()=>ur});module.exports=An(hs);var xi={};R(xi,{Papi:()=>L,Watcher:()=>Jt,getSm:()=>Fn,getWs:()=>Bn});var Ge=require("@galacticcouncil/descriptors");var gr=require("@galacticcouncil/common"),Rt=require("rxjs");var Pt=require("rxjs"),G=require("rxjs/operators");function dr(c,{intervalMs:t=5e3,rpcTimeoutMs:e=1e4}={}){let i=()=>(0,Pt.defer)(()=>(0,Pt.from)(c._request("system_health",[]))).pipe((0,G.timeout)({first:e}),(0,G.map)(()=>"online"),(0,G.catchError)(()=>(0,Pt.of)("offline")));return(0,Pt.of)({state:"offline",delayMs:0}).pipe((0,G.expand)(n=>(0,Pt.timer)(n.delayMs).pipe((0,G.switchMap)(i),(0,G.map)(s=>({state:s,delayMs:t})))),(0,G.skip)(1),(0,G.map)(n=>n.state),(0,G.distinctUntilChanged)(),(0,G.shareReplay)({bufferSize:1,refCount:!0}))}var{logger:On}=gr.log,Jt=class c{static instance=null;bestBlock$;finalizedBlock$;connection$;constructor(t){this.bestBlock$=this.watched("watcher(bestBlock)",t.getUnsafeApi().query.System.Number.watchValue({at:"best"}).pipe((0,Rt.map)(({value:e})=>e))),this.finalizedBlock$=this.watched("watcher(finalizedBlock)",t.finalizedBlock$),this.connection$=this.watched("watcher(connection)",dr(t))}static getInstance(t){return this.instance||(this.instance=new c(t)),this.instance}watched(t,e){return e.pipe((0,Rt.tap)({error:i=>On.error(t,i)}),(0,Rt.shareReplay)({bufferSize:1,refCount:!0}))}};var L=class{client;api;apiNext;watcher;constructor(t){this.client=t,this.api=this.client.getTypedApi(Ge.hydration),this.apiNext=this.client.getTypedApi(Ge.hydrationNext),this.watcher=Jt.getInstance(this.client)}};var hr=require("polkadot-api/ws"),br=require("polkadot-api/logs-provider"),Bn=(c,t={})=>{let e=typeof c=="string"?c.split(","):c,i=(0,hr.getWsProvider)(e,t);return(0,br.withLogsRecorder)(r=>console.log(r),i),i};async function Fn(c){let{getSmProvider:t}=await Promise.resolve().then(()=>(yr(),Zt)),{start:e}=await Promise.resolve().then(()=>(fr(),te)),{chainSpec:i}=await Promise.resolve().then(()=>(Pr(),ee)),r=e(),n=await r.addChain({chainSpec:i}),s=await r.addChain({chainSpec:c,potentialRelayChains:[n]});return t(()=>s)}var Oi={};R(Oi,{AAVE_GAS_LIMIT:()=>_i,AAVE_LENDING_POOL_ADDRESS:()=>We,AAVE_POOL_ABI:()=>Ti,AAVE_POOL_DATA_PROVIDER:()=>Ve,AAVE_POOL_DATA_PROVIDER_ABI:()=>Ue,AAVE_POOL_PROXY:()=>Ii,AAVE_ROUNDING_THRESHOLD:()=>Hs,AAVE_UINT_256_MAX:()=>Rn,AaveClient:()=>ie,AaveUtils:()=>At});var Ti=[{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 Ue=[{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 Ii="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Ve="0x112b087b60C1a166130d59266363C45F8aa99db0",We="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",_i=1000000n,Hs=5,Rn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var ie=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:Ue,address:Ve,args:[We],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:Ue,address:Ve,args:[We,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:Ti,address:Ii,args:[t],functionName:"getUserAccountData"})}};var q=wt(require("big.js")),st=require("@galacticcouncil/common");var{ERC20:Ct}=st.erc20,{H160:Ai}=st.h160,Cn=1.01,En=31536000n,Sr=4,ze=-1,Ye=10n**27n,At=class{client;constructor(t){this.client=new ie(t)}async getSummary(t){let e=Ai.fromAny(t),[i,r,n,s]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e),this.client.getBlockTimestamp()]),[a]=i,[o,l]=r,[u,p,d,m,h,b]=n,g=st.big.toDecimal(b,18),P=[];for(let y of o){let v=y.underlyingAsset.toLowerCase(),S=a.find(({underlyingAsset:vi})=>vi.toLowerCase()===v);if(!S)throw new Error("Missing pool reserve for "+v);let T=y.scaledATokenBalance,B=S.liquidityIndex,H=S.liquidityRate,W=S.availableLiquidity,ut=S.priceInMarketReferenceCurrency,yt=s+6,Z=this.calculateLinearInterest(H,S.lastUpdateTimestamp,yt),nt=B*Z/Ye,Qt=T*nt/Ye,De=Number(l!==0&&l===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,Le=S.usageAsCollateralEnabled&&y.usageAsCollateralEnabledOnUser&&y.scaledATokenBalance>0n,qe=Ct.toAssetId(v);P.push({aTokenBalance:Qt,availableLiquidity:W,decimals:Number(S.decimals),isCollateral:Le,priceInRef:ut,reserveId:qe,reserveAsset:v,reserveLiquidationThreshold:De})}return{healthFactor:Number(g),currentLiquidationThreshold:Number(st.big.toDecimal(m,Sr)),totalCollateral:u,totalDebt:p,reserves:P}}async hasBorrowPositions(t){let e=Ai.fromAny(t),i=await this.client.getUserAccountData(e),[r,n]=i;return n>0n}async getHealthFactor(t){let e=Ai.fromAny(t),i=await this.client.getUserAccountData(e),[r,n,s,a,o,l]=i;return this.calculateHealthFactorFromBalances(n,r,a)}async getHealthFactorAfterWithdraw(t,e,i){let{totalCollateral:r,totalDebt:n,reserves:s,currentLiquidationThreshold:a}=await this.getSummary(t);if(n===0n)return ze;let o=Ct.fromAssetId(e),l=s.find(v=>v.reserveAsset===o);if(!l)throw new Error("Missing reserve ctx for "+o);let{decimals:u,isCollateral:p,priceInRef:d,reserveLiquidationThreshold:m}=l,h=st.big.toBigInt(i,u),b=p?h*d/10n**BigInt(u):0n,g=r-b;if(g<=0n)return 0;let P=(0,q.default)(r.toString()).mul(a).minus((0,q.default)(b.toString()).mul(m)).div(g.toString()),y=(0,q.default)(g.toString()).mul(P).div(n.toString()).toFixed(6,q.default.roundDown);return Number(y)}async getHealthFactorAfterSupply(t,e,i){let{totalCollateral:r,totalDebt:n,reserves:s,currentLiquidationThreshold:a}=await this.getSummary(t);if(n===0n)return ze;let o=Ct.fromAssetId(e),l=s.find(y=>y.reserveAsset===o);if(!l)throw new Error("Missing reserve ctx for "+o);let{decimals:u,priceInRef:p,reserveLiquidationThreshold:d}=l,h=st.big.toBigInt(i,u)*p/10n**BigInt(u),b=r+h;if(b<=0n)return 0;let g=(0,q.default)(r.toString()).mul(a).plus((0,q.default)(h.toString()).mul(d)).div(b.toString()),P=(0,q.default)(b.toString()).mul(g).div(n.toString()).toFixed(6,q.default.roundDown);return Number(P)}async getHealthFactorAfterSwap(t,e,i,r,n){let{totalDebt:s,reserves:a,healthFactor:o}=await this.getSummary(t);if(s===0n)return ze;let l=Ct.fromAssetId(i),u=Ct.fromAssetId(n),p=a.find(B=>B.reserveAsset===l),d=a.find(B=>B.reserveAsset===u);if(!p)throw new Error(`Missing reserve ctx for ${l}`);if(!d)throw new Error(`Missing reserve ctx for ${d}`);let m=st.big.toBigInt(e,p.decimals),h=st.big.toBigInt(r,d.decimals),b=m*p.priceInRef/10n**BigInt(p.decimals),g=h*d.priceInRef/10n**BigInt(d.decimals),P=p.isCollateral?(0,q.default)(b.toString()).mul(p.reserveLiquidationThreshold):(0,q.default)(0),S=(d.isCollateral?(0,q.default)(g.toString()).mul(d.reserveLiquidationThreshold):(0,q.default)(0)).minus(P).div(s.toString()),T=(0,q.default)(o).plus(S).toFixed(6,q.default.roundDown);return Number(T)}async getMaxWithdraw(t,e){let{totalDebt:i,reserves:r,healthFactor:n}=await this.getSummary(t),s=Ct.fromAssetId(e),a=r.find(o=>o.reserveAsset===s);if(!a)throw new Error("Missing reserve ctx for "+s);return this.calculateWithdrawMax(a,i,n)}async getMaxWithdrawAll(t){let{totalDebt:e,reserves:i,healthFactor:r}=await this.getSummary(t),n={};for(let s of i){let a=this.calculateWithdrawMax(s,e,r);s.reserveId&&(n[s.reserveId]=a)}return n}calculateWithdrawMax(t,e,i){let{aTokenBalance:r,availableLiquidity:n,decimals:s,priceInRef:a,reserveLiquidationThreshold:o,isCollateral:l}=t,u=r;if(l&&e>0n){let d=i-Cn;if(d>0){let m=(0,q.default)(d).mul(e.toString()).div(o).toFixed(0,q.default.roundDown),h=(0,q.default)(m).div(a.toString()).mul(10**s).toFixed(0,q.default.roundDown);u=r<BigInt(h)?r:BigInt(h)}else u=0n}return{amount:u<n?u:n,decimals:s}}calculateLinearInterest(t,e,i){let r=i-e;if(r<=0)return Ye;let n=t*BigInt(r)/En;return Ye+n}calculateHealthFactorFromBalances(t,e,i){if(t===0n)return ze;let r=e*i/t,n=st.big.toDecimal(r,Sr);return Number(n)}};var Ri={};R(Ri,{AssetClient:()=>Et,BalanceClient:()=>pt,ChainParams:()=>Lt});var re=require("polkadot-api");var Et=class extends L{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:i,value:r})=>{let[n]=i;return[n,r]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:i,value:r})=>{let[n]=i;return[n,r]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:i})=>{let{asset_type:r}=i;return this.SUPPORTED_TYPES.includes(r.type)}).map(({keyArgs:i,value:r})=>{let[n]=i;return[n,r]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:i,value:r})=>{let[n]=i;return[n,r]}))}async mapToken(t,e,i,r){let{name:n,asset_type:s,is_sufficient:a,existential_deposit:o}=e,{symbol:l,decimals:u}=i.get(t)??{};return{id:t,name:n?re.Binary.toText(n):void 0,symbol:l,decimals:u,icon:l,type:s.type,isSufficient:a,location:r,existentialDeposit:o}}async mapBond(t,e,i,r){let[n,s]=r,{asset_type:a,is_sufficient:o,existential_deposit:l}=e,{symbol:u,decimals:p}=await this.mapToken(n,e,i),d=Number(s),m=new Intl.DateTimeFormat("en-GB"),h=[u,"Bond",m.format(d)].join(" ");return{id:t,name:h,symbol:u+"b",decimals:p,icon:u,type:a.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:n,maturity:d}}async mapShares(t,e,i,r){let{assets:n}=r,{name:s,symbol:a,asset_type:o,is_sufficient:l,existential_deposit:u}=e,p=await Promise.all(n.map(async h=>{let{symbol:b}=await this.mapToken(h,e,i);return[h,b]})),d=Object.fromEntries(p),m=Object.values(d);return{id:t,name:m.join(", "),symbol:a&&re.Binary.toText(a)||s&&re.Binary.toText(s),decimals:18,icon:m.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:d}}async mapExternal(t,e,i,r){let n=await this.mapToken(t,e,new Map,r),s=i?.find(a=>a.internalId===n.id);return s?{...n,decimals:s.decimals,name:s.name,symbol:s.symbol,icon:s.symbol,isWhiteListed:s.isWhiteListed}:n}parseMetadata(t){return new Map(Array.from(t,([e,i])=>[e,{symbol:i.symbol?re.Binary.toText(i.symbol):void 0,decimals:i.decimals}]))}async getSupported(t,e){let[i,r,n,s]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),a=this.parseMetadata(i),o=[];for(let[l,u]of Array.from(i)){let p=r.get(l),{asset_type:d}=u,m;switch(d.type){case"Bond":let h=s.get(l);m=await this.mapBond(l,u,a,h);break;case"StableSwap":let b=n.get(l);m=await this.mapShares(l,u,a,b);break;case"External":m=await this.mapExternal(l,u,e,p);break;default:m=await this.mapToken(l,u,a,p)}o.push(m)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};var vr=require("@galacticcouncil/common"),tt=require("rxjs"),w=require("rxjs/operators");var Fi={};R(Fi,{HUB_ASSET_ID:()=>ne,HYDRATION_OMNIPOOL_ADDRESS:()=>Mn,HYDRATION_PARACHAIN_ID:()=>kn,PERBILL_DENOMINATOR:()=>Bi,PERMILL_DENOMINATOR:()=>kt,SYSTEM_ASSET_DECIMALS:()=>$e,SYSTEM_ASSET_ID:()=>E,TRADEABLE_DEFAULT:()=>Mt});var kt=1e6,Bi=1e9,E=0,$e=12,kn=2034,Mn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",ne=1,Mt=15;var{logger:Dt}=vr.log,pt=class extends L{erc20Ids=null;constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:i}=await e.getValue(t,{at:"best"});return this.getBreakdown(i)}async getTokenBalance(t,e){let r=await this.api.query.Tokens.Accounts.getValue(t,e,{at:"best"});return this.getBreakdown(r)}async getErc20Balance(t,e){return this.getBalanceData(t,e)}watchBalance(t){return(0,tt.defer)(()=>{let e=this.watchSystemBalance(t),i=this.watchTokensBalance(t),r=this.watchErc20Balance(t);return(0,tt.combineLatest)([e,i,r]).pipe((0,w.connect)(n=>(0,tt.concat)(n.pipe((0,w.take)(1)),n.pipe((0,w.skip)(1),(0,w.debounceTime)(250)))))}).pipe((0,w.map)(e=>e.flat()),(0,w.startWith)([]),(0,w.bufferCount)(2,1),(0,w.map)(([e,i],r)=>r===0?i:this.getDeltas(e,i))).pipe((0,w.tap)({subscribe:()=>Dt.debug("balance: subscribe",t),error:e=>Dt.error("balance",e)}),(0,w.retry)({delay:1e3}))}watchSystemBalance(t){let e=this.api.query.System.Account;return(0,tt.defer)(()=>e.watchValue(t,{at:"best"})).pipe((0,w.map)(({value:i})=>({id:0,balance:this.getBreakdown(i.data)})),(0,w.tap)({error:i=>Dt.error("balance(system)",i)}))}watchTokenBalance(t,e){let i=this.api.query.Tokens.Accounts;return(0,tt.defer)(()=>i.watchValue(t,e,{at:"best"})).pipe((0,w.map)(({value:r})=>({id:e,balance:this.getBreakdown(r)})),(0,w.tap)({error:r=>Dt.error("balance(token)",r)}))}watchTokensBalance(t){let e=this.api.query.Tokens.Accounts;return(0,tt.defer)(()=>e.watchEntries(t,{at:"best"})).pipe((0,w.distinctUntilChanged)((i,r)=>!r.deltas),(0,w.map)(({deltas:i})=>{let r=[];return i?.deleted.forEach(n=>{let[s,a]=n.args;r.push({id:a,balance:this.getBreakdown({free:0n,reserved:0n,frozen:0n})})}),i?.upserted.forEach(n=>{let[s,a]=n.args;r.push({id:a,balance:this.getBreakdown(n.value)})}),r}),(0,w.tap)({error:i=>Dt.error("balance(tokens)",i)}))}watchErc20Balance(t,e){let i=async()=>{if(this.erc20Ids)return this.erc20Ids;let n=await this.api.query.AssetRegistry.Assets.getEntries({at:"best"});return this.erc20Ids=n.filter(({value:s})=>s.asset_type.type==="Erc20").map(({keyArgs:s})=>{let[a]=s;return a}),this.erc20Ids},r=async n=>(await Promise.all(n.map(async a=>[a,await this.getBalanceData(t,a)]))).map(([a,o])=>({id:a,balance:o}));return(0,tt.defer)(()=>(0,tt.from)(e?Promise.resolve(e):i()).pipe((0,w.switchMap)(n=>this.watcher.bestBlock$.pipe((0,w.switchMap)(()=>(0,tt.from)(r(n))))),(0,w.startWith)([]),(0,w.bufferCount)(2,1),(0,w.map)(([n,s],a)=>a===0?s.filter(o=>o.balance.total>0n):this.getDeltas(n,s)),(0,w.distinctUntilChanged)((n,s)=>s.length===0),(0,w.tap)({error:n=>Dt.error("balance(erc20)",n)})))}async getBalanceData(t,e){let i=await this.api.apis.CurrenciesApi.account(e,t,{at:"best"});return this.getBreakdown(i)}getBreakdown(t){let e=t.free>=t.frozen?t.free-t.frozen:0n,i=t.free+t.reserved;return{free:t.free,reserved:t.reserved,frozen:t.frozen,total:i,transferable:e}}getDeltas(t,e){let i=(n,s)=>n!==void 0&&s!==void 0&&n.transferable===s.transferable&&n.total===s.total,r=t.reduce((n,s)=>(n.set(s.id,s.balance),n),new Map);return e.filter(n=>!i(n.balance,r.get(n.id)))}};var Lt=class extends L{_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 Ei={};R(Ei,{AssetNotFound:()=>Ci,PoolNotFound:()=>se,RouteNotFound:()=>ae});var Ci=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},se=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},ae=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var Di={};R(Di,{EvmClient:()=>le,EvmRpcAdapter:()=>oe,createChain:()=>Mi});var ki=require("polkadot-api"),wr=require("@galacticcouncil/descriptors"),Xe=require("viem"),Dn=10000000n,oe=class{api;constructor(t){this.api=t.getTypedApi(wr.hydration)}async getBlock(){let t=await this.api.query.Ethereum.CurrentBlock.getValue({at:"best"}),{header:e}=t,i=e.timestamp/1000n,[r]=e.number;return{timestamp:i,number:r}}readContract=(async t=>{let{abi:e,address:i,functionName:r,args:n}=t,s=(0,Xe.encodeFunctionData)({abi:e,functionName:r,args:n}),a=await this.api.apis.EthereumRuntimeRPCApi.call("0x0000000000000000000000000000000000000000",i,ki.Binary.fromHex(s),[0n,0n,0n,0n],[Dn,0n,0n,0n],void 0,void 0,void 0,!1,[],[]);if(!a.success)throw console.error(r,a.value.type),new Error("Contract read failure");let{exit_reason:o,value:l,used_gas:u}=a.value;if(console.log(u),o.type==="Succeed")return(0,Xe.decodeFunctionResult)({abi:e,functionName:r,data:ki.Binary.toHex(l)});throw console.log(r,o.type,o.value.type),new Error("Contract read error")})};var xr=require("viem"),Ln=["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"],Mi=()=>(0,xr.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Ln}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});var mt=require("viem");var le=class{client;chain;constructor(t){this.client=t,this.chain=Mi()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return(0,mt.createPublicClient)({chain:this.chain,transport:(0,mt.http)()})}getWsProvider(){return(0,mt.createPublicClient)({transport:(0,mt.custom)({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return(0,mt.createWalletClient)({account:t,chain:this.chain,transport:(0,mt.custom)(window.ethereum)})}getRPCAdapter(){return new oe(this.client)}};var Wi={};R(Wi,{LiquidityMiningApi:()=>me,LiquidityMiningClient:()=>ge});var Dr=require("polkadot-api"),Y=wt(require("big.js")),St=require("@galacticcouncil/common"),Vi=require("@galacticcouncil/math-liquidity-mining");var ce={};R(ce,{withTimeout:()=>qn});function qn(c,t,e="timeout"){return new Promise((i,r)=>{let n=setTimeout(()=>r(new Error(e)),t);c.then(s=>{clearTimeout(n),i(s)},s=>{clearTimeout(n),r(s)})})}var N={};R(N,{divSpot:()=>Hn,getFraction:()=>Gn,mulScaled:()=>Tr,mulSpot:()=>Nn});var Li=require("@galacticcouncil/common");function Tr(c,t,e,i,r){let n=e+i-r,s=c*t;return n>0?s/BigInt(10)**BigInt(n):n<0?s*BigInt(10)**BigInt(-n):s}function Nn(c,t,e,i){return Tr(c,t,e,Li.RUNTIME_DECIMALS,i)}function Hn(c,t,e,i){if(t===0n)return 0n;let r=BigInt(10)**BigInt(Li.RUNTIME_DECIMALS+i-e);return c*r/t}function Gn(c,t,e=2){if(t<.01||t>100)throw new Error("Supported range is from 0.01% - 100%");let i=BigInt(10)**BigInt(e),r=BigInt(Math.round(t*Number(i)));return c*r/(BigInt(100)*i)}var O={};R(O,{FeeUtils:()=>qi,shiftNeg:()=>Un});var Ir=wt(require("big.js"));var qi=class c{static toPct(t){let[e,i]=t;return c.safeDivide(e*100,i)}static toRaw(t){let[e,i]=t;return c.safeDivide(e,i)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,i=12){let r=10**i;return Math.round(t*r/e)/r}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Un(c,t){let e=(0,Ir.default)(typeof c=="bigint"?c.toString():c);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var qt={};R(qt,{findNestedKey:()=>Vn,findNestedObj:()=>Wn,jsonFormatter:()=>zn});var Vn=(c,t)=>{let e=[];return JSON.stringify(c,(i,r)=>(r&&r[t]&&e.push(r),r)),e[0]},Wn=(c,t,e)=>{let i;return JSON.stringify(c,(r,n)=>(n&&n[t]===e&&(i=n),n)),i},zn=(c,t)=>typeof t=="bigint"?t.toString():t;var z={};R(z,{calculateBuyFee:()=>Kn,calculateDiffToAvg:()=>Yn,calculateDiffToRef:()=>$n,calculateSellFee:()=>Xn});var dt=wt(require("big.js"));function Yn(c,t){let e=(0,dt.default)(c.toString()),i=(0,dt.default)(t.toString());return e.minus(i).abs().div(e.plus(i).div(2)).mul(100).round(2).toNumber()}function $n(c,t){if(t===0n)return 0;let e=(0,dt.default)(c.toString()),i=(0,dt.default)(t.toString());return e.minus(i).div(i).mul(100).round(2).toNumber()}function Xn(c,t){if(c===0n)return 0;let e=(0,dt.default)(c.toString()),i=(0,dt.default)(t.toString());return(0,dt.default)(1).minus(i.div(e)).mul(100).round(2).toNumber()}function Kn(c,t){if(c===0n)return 0;let e=(0,dt.default)(c.toString());return(0,dt.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}var ue=(c,t)=>c===t?0:c==null?t==null?0:-1:t==null?c==null?0:1:typeof c.compare=="function"?c.compare(t):typeof t.compare=="function"?-t.compare(c):c<t?-1:c>t?1:0;var Ke=(c,t=e=>e!==void 0?": "+e:"")=>class extends Error{origMessage;constructor(e){super(c(e)+t(e)),this.origMessage=e!==void 0?String(e):""}};var jn=Ke(()=>"illegal argument(s)"),_r=c=>{throw new jn(c)};var Qn=Ke(()=>"index out of bounds"),Ni=c=>{throw new Qn(c)},je=(c,t,e)=>(c<t||c>=e)&&Ni(c);var Ar=23283064365386963e-26,Qe=class{float(t=1){return this.int()*Ar*t}probability(t){return this.float()<t}norm(t=1){return(this.int()*Ar-.5)*2*t}normMinMax(t,e){let i=this.minmax(t,e);return this.float()<.5?i:-i}minmax(t,e){return this.float()*(e-t)+t}minmaxInt(t,e){t|=0;let i=(e|0)-t;return i?t+this.int()%i:t}minmaxUint(t,e){t>>>=0;let i=(e>>>0)-t;return i?t+this.int()%i:t}};var Je=class extends Qe{constructor(t){super(),this.rnd=t}float(t=1){return this.rnd()*t}norm(t=1){return(this.rnd()-.5)*2*t}int(){return this.rnd()*4294967296>>>0}};var Or=new Je(Math.random);var Br=c=>c!=null&&typeof c!="function"&&c.length!==void 0;var Fr=Object.getPrototypeOf({}),Ze="function",Rr="string",Nt=(c,t)=>{let e;if(c===t)return!0;if(c!=null){if(typeof c.equiv===Ze)return c.equiv(t)}else return c==t;if(t!=null){if(typeof t.equiv===Ze)return t.equiv(c)}else return c==t;return typeof c===Rr||typeof t===Rr?!1:(e=Object.getPrototypeOf(c),(e==null||e===Fr)&&(e=Object.getPrototypeOf(t),e==null||e===Fr)?es(c,t):typeof c!==Ze&&c.length!==void 0&&typeof t!==Ze&&t.length!==void 0?Jn(c,t):c instanceof Set&&t instanceof Set?Zn(c,t):c instanceof Map&&t instanceof Map?ts(c,t):c instanceof Date&&t instanceof Date?c.getTime()===t.getTime():c instanceof RegExp&&t instanceof RegExp?c.toString()===t.toString():c!==c&&t!==t)},Jn=(c,t,e=Nt)=>{let i=c.length;if(i===t.length)for(;i-- >0&&e(c[i],t[i]););return i<0},Zn=(c,t,e=Nt)=>c.size===t.size&&e([...c.keys()].sort(),[...t.keys()].sort()),ts=(c,t,e=Nt)=>c.size===t.size&&e([...c].sort(),[...t].sort()),es=(c,t,e=Nt)=>{if(Object.keys(c).length!==Object.keys(t).length)return!1;for(let i in c)if(!t.hasOwnProperty(i)||!e(c[i],t[i]))return!1;return!0};var Hi=class{value;constructor(t){this.value=t}deref(){return this.value}};var Cr=c=>c instanceof Hi;var ti=class c{_head;_length=0;constructor(t){t&&this.into(t)}get length(){return this._length}get head(){return this._head}[Symbol.iterator](){return Er("next",this._head)}reverseIterator(){return Er("prev",this.tail)}clear(){this.release()}compare(t,e=ue){let i=this._length;if(i<t._length)return-1;if(i>t._length)return 1;if(i===0)return 0;{let r=this._head,n=t._head,s=0;for(;i-- >0&&s===0;)s=e(r.value,n.value),r=r.next,n=n.next;return s}}concat(...t){let e=this.copy();for(let i of t)e.into(i);return e}equiv(t){if(!(t instanceof c||Br(t))||this._length!==t.length)return!1;if(!this._length||this===t)return!0;let e=t[Symbol.iterator](),i=this._head;for(let r=this._length;r-- >0;){if(!Nt(i.value,e.next().value))return!1;i=i.next}return!0}filter(t){let e=this.empty();return this.traverse(i=>(t(i.value)&&e.append(i.value),!0)),e}find(t){return this.traverse(e=>e.value!==t)}findWith(t){return this.traverse(e=>!t(e.value))}first(){return this._head?.value}insertSorted(t,e){e=e||ue;for(let i=this._head,r=this._length;r-- >0;){if(e(t,i.value)<=0)return this.insertBefore(i,t);i=i.next}return this.append(t)}into(t){for(let e of t)this.append(e);return this}nth(t,e){let i=this.nthCell(t);return i?i.value:e}nthCellUnsafe(t){let e,i;for(t<=this._length>>>1?(e=this._head,i="next"):(e=this.tail,i="prev",t=this._length-t-1);t-- >0&&e;)e=e[i];return e}peek(){return this.tail?.value}$reduce(t,e){let i=this._head;for(let r=this._length;r-- >0&&!Cr(e);)e=t(e,i.value),i=i.next;return e}reduce(t,e){return this.$reduce(t,e)}release(){let t=this._head;if(!t)return!0;let e;for(let i=this._length;i-- >0;)e=t.next,delete t.value,delete t.prev,delete t.next,t=e;return this._head=void 0,this._length=0,!0}reverse(){let t=this._head,e=this.tail,i=(this._length>>>1)+(this._length&1);for(;t&&e&&i>0;){let r=t.value;t.value=e.value,e.value=r,t=t.next,e=e.prev,i--}return this}setHead(t){let e=this._head;return e?(e.value=t,e):this.prepend(t)}setNth(t,e){let i=this.nthCell(t);return!i&&Ni(t),i.value=e,i}setTail(t){let e=this.tail;return e?(e.value=t,e):this.append(t)}swap(t,e){if(t!==e){let i=t.value;t.value=e.value,e.value=i}return this}toArray(t=[]){return this.traverse(e=>(t.push(e.value),!0)),t}toJSON(){return this.toArray()}toString(){let t=[];return this.traverse(e=>(t.push(String(e.value)),!0)),t.join(", ")}traverse(t,e=this._head,i){if(!this._head)return;let r=e;do{if(!t(r))break;r=r.next}while(r!==i);return r}_map(t,e){return this.traverse(i=>(t.append(e(i.value)),!0)),t}};function*Er(c,t){for(;t;)yield t.value,t=t[c]}var ei=class c extends ti{_tail;constructor(t){super(),t&&this.into(t)}get tail(){return this._tail}append(t){if(this._tail){let e={value:t,prev:this._tail};return this._tail.next=e,this._tail=e,this._length++,e}else return this.prepend(t)}asHead(t){return t===this._head?this:(this.remove(t),this._head.prev=t,t.next=this._head,t.prev=void 0,this._head=t,this._length++,this)}asTail(t){return t===this._tail?this:(this.remove(t),this._tail.next=t,t.prev=this._tail,t.next=void 0,this._tail=t,this._length++,this)}cons(t){return this.prepend(t),this}copy(){return new c(this)}*cycle(){for(;;)yield*this}drop(){let t=this._head;if(t)return this._head=t.next,this._head?this._head.prev=void 0:this._tail=void 0,this._length--,t.value}empty(){return new c}insertAfter(t,e){let i={value:e,next:t.next,prev:t};return t.next?t.next.prev=i:this._tail=i,t.next=i,this._length++,i}insertAfterNth(t,e){return t<0&&(t+=this._length),t>=this._length-1?this.append(e):(je(t,0,this._length),this.insertAfter(this.nthCellUnsafe(t),e))}insertBefore(t,e){let i={value:e,next:t,prev:t.prev};return t.prev?t.prev.next=i:this._head=i,t.prev=i,this._length++,i}insertBeforeNth(t,e){return t<0&&(t+=this._length),t<=0?this.prepend(e):(je(t,0,this._length),this.insertBefore(this.nthCellUnsafe(t),e))}map(t){return this._map(new c,t)}nth(t,e){let i=this.nthCell(t);return i?i.value:e}nthCell(t){if(t<0&&(t+=this._length),!(t<0||t>=this._length))return this.nthCellUnsafe(t)}pop(){let t=this._tail;if(t)return this._tail=t.prev,this._tail?this._tail.next=void 0:this._head=void 0,this._length--,t.value}prepend(t){let e={value:t,next:this._head};return this._head?this._head.prev=e:this._tail=e,this._head=e,this._length++,e}push(t){return this.append(t),this}release(){return this._tail=void 0,super.release()}remove(t){return t.prev?t.prev.next=t.next:this._head=t.next,t.next?t.next.prev=t.prev:this._tail=t.prev,this._length--,this}rotateLeft(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:return this.push(this.drop())}}rotateRight(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:let t=this.peek();return this.pop(),this.prepend(t),this}}seq(t=0,e=this.length){if(t>=e||t<0)return;let i=this.nthCell(t),r=this.nthCell(e-1),n=s=>({first(){return s.value},next(){return s!==r&&s.next?n(s.next):void 0}});return i?n(i):void 0}shuffle(t,e=Or){if(this._length<2)return this;for(t=t!==void 0?t:Math.ceil(1.5*Math.log2(this._length));t>0;t--){let i=this._head;for(;i;){let r=i.next;e.probability(.5)?this.asHead(i):this.asTail(i),i=r}}return this}slice(t=0,e=this.length){let i=t<0?t+this._length:t,r=e<0?e+this._length:e;(i<0||r<0)&&_r("invalid indices: ${from} / ${to}");let n=new c,s=this.nthCell(i);for(;s&&++i<=r;)n.push(s.value),s=s.next;return n}sort(t=ue){if(!this._length)return this;let e=1;for(;;){let i=this._head;this._head=void 0,this._tail=void 0;let r=0;for(;i;){r++;let n=i,s=0;for(let o=0;o<e&&(s++,n=n.next,!!n);o++);let a=e;for(;s>0||a>0&&n;){let o;s===0?(o=n,n=n.next,a--):!n||a===0||t(i.value,n.value)<=0?(o=i,i=i.next,s--):(o=n,n=n.next,a--),this._tail?this._tail.next=o:this._head=o,o.prev=this._tail,this._tail=o}i=n}if(this._tail.next=void 0,r<=1)return this;e*=2}}splice(t,e=0,i){let r;typeof t=="number"?(t<0&&(t+=this._length),je(t,0,this._length),r=this.nthCellUnsafe(t)):r=t;let n=new c;if(e>0)for(;r&&e-- >0;)this.remove(r),n.push(r.value),r=r.next;else r&&(r=r.next);if(i)if(r)for(let s of i)this.insertBefore(r,s);else for(let s of i)this.push(s);return n}};var ii=class c{map;items;opts;_size;constructor(t,e){let i={maxlen:1/0,maxsize:1/0,map:()=>new Map,ksize:()=>0,vsize:()=>0,...e};this.map=i.map(),this.items=new ei,this._size=0,this.opts=i,t&&this.into(t)}get length(){return this.items.length}get size(){return this._size}[Symbol.iterator](){return this.entries()}*entries(){for(let t of this.items)yield[t.k,t]}*keys(){for(let t of this.items)yield t.k}*values(){for(let t of this.items)yield t.v}copy(){let t=this.empty();t.items=this.items.copy();let e=t.items.head;for(;e;)t.map.set(e.value.k,e),e=e.next;return t}empty(){return new c(null,this.opts)}release(){this._size=0,this.map.clear();let t=this.opts.release;if(t){let e;for(;e=this.items.drop();)t(e.k,e.v);return!0}return this.items.release()}has(t){return this.map.has(t)}get(t,e){let i=this.map.get(t);return i?this.resetEntry(i):e}set(t,e){let i=this.opts.ksize(t)+this.opts.vsize(e),r=this.map.get(t),n=Math.max(0,i-(r?r.value.s:0));return this._size+=n,this.ensureSize()?this.doSetEntry(r,t,e,i):this._size-=n,e}into(t){for(let e of t)this.set(e[0],e[1]);return this}async getSet(t,e){let i=this.map.get(t);return i?this.resetEntry(i):this.set(t,await e())}delete(t){let e=this.map.get(t);return e?(this.removeEntry(e),!0):!1}resetEntry(t){return this.items.asTail(t),t.value.v}ensureSize(){let{release:t,maxsize:e,maxlen:i}=this.opts;for(;this._size>e||this.length>=i;){let r=this.items.drop();if(!r)return!1;this.map.delete(r.k),t?.(r.k,r.v),this._size-=r.s}return!0}removeEntry(t){let e=t.value;this.map.delete(e.k),this.items.remove(t),this.opts.release?.(e.k,e.v),this._size-=e.s}doSetEntry(t,e,i,r){t?(this.opts.update?.(e,t.value.v,i),t.value.v=i,t.value.s=r,this.items.asTail(t)):(this.items.push({k:e,v:i,s:r}),this.map.set(e,this.items.tail))}};var Ot=class c extends ii{constructor(t,e){super(t,{ttl:3600*1e3,autoExtend:!1,...e})}empty(){return new c(null,this.opts)}has(t){return this.get(t)!==void 0}get(t,e){let i=this.map.get(t);if(i){if(i.value.t>=Date.now())return this.resetEntry(i);this.removeEntry(i)}return e}set(t,e,i=this.opts.ttl){let r=this.opts.ksize(t)+this.opts.vsize(e),n=this.map.get(t),s=Math.max(0,r-(n?n.value.s:0));return this._size+=s,this.ensureSize()?this.doSetEntry(n,t,e,r,i):this._size-=s,e}async getSet(t,e,i=this.opts.ttl){let r=this.get(t);return r!==void 0?r:this.set(t,await e(),i)}prune(){let t=Date.now(),e=this.items.head,i=0;for(;e;)e.value.t<t&&(this.removeEntry(e),i++),e=e.next;return i}ensureSize(){let{maxlen:t,maxsize:e}=this.opts,i=Date.now(),r=this.items.head;for(;r&&(this._size>e||this.length>=t);)r.value.t<i&&this.removeEntry(r),r=r.next;return super.ensureSize()}doSetEntry(t,e,i,r,n=this.opts.ttl){let s=Date.now()+n;t?(this.opts.update?.(e,t.value.v,i),t.value.v=i,t.value.s=r,t.value.t=s,this.items.asTail(t)):(this.items.push({k:e,v:i,s:r,t:s,ttl:n}),this.map.set(e,this.items.tail))}resetEntry(t){return this.opts.autoExtend&&(t.value.t=Date.now()+t.value.ttl),super.resetEntry(t)}};var pe=class{debug;constructor(t){this.debug=t||!1}log(t,e,i){this.debug&&console.log(t,e,i)}scope(t,e,i,r){let n=new Map,s=r!==void 0?new Ot(null,{ttl:r}):new Ot;return{get:(...u)=>{let p=i(...u);if(n.has(p)){this.log("[live]",t,p);let m=n.get(p);return Promise.resolve(m)}if(s.has(p))return this.log("[memo]",t,p),s.get(p);this.log("[fetch]",t,p);let d=e(...u).catch(m=>{throw s.delete(p),m});return s.set(p,d),d},set:(u,...p)=>{let d=i(...p);this.log("[set-live]",t,d),n.set(d,u)},clear:()=>{this.log("[clear]",t),n.clear(),s.release()}}}};var ri=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let i=0;i<t.length;++i){let[r,n]=t[i];this.result.set(this.getKey(n,r),e[i].free)}}freeBalance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,i,r){let n=this.getKey(t,e),s=this.getKey(t,i),a=this.result.get(n)??0n,o=this.result.get(s)??0n;if(a<r)throw new Error("Attempting to transfer more than is present");this.result.set(n,a+r),this.result.set(s,o+r)}};var xt=wt(require("big.js")),ot=require("@galacticcouncil/math-liquidity-mining");var Gi=wt(require("big.js")),Ui=(0,Gi.default)(10).pow(18),kr=BigInt((0,Gi.default)(1).pow(18).toString()),Mr=6e3;var is="1000000000000000000",ni=class{constructor(t,e,i){this.getAccount=t;this.getAsset=e;this.multiCurrency=i}async syncGlobalFarm(t,e,i){if(t.state.type!=="Active"||t.updated_at===e)return null;if(t.total_shares_z===0n)return t;let r=await this.getAsset(t.reward_currency),n=e-t.updated_at,s=this.getAccount(t.id),a=r?.existential_deposit;if(!a)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.freeBalance(t.reward_currency,s),l=(0,xt.default)(a.toString()),u=(0,xt.default)(o.toString()).minus(l.lt(o.toString())?a.toString():o.toString()),p=(0,xt.default)((0,ot.calculate_global_farm_rewards)(t.total_shares_z.toString(),i.toString(),(0,xt.default)(t.yield_per_period.toString()).mul(Ui).round(0,xt.default.roundDown).toFixed(),t.max_reward_per_period.toString(),n.toFixed()));if(u.lt(p)&&(p=u),p.eq(0))return t;let d=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,s,d,BigInt(p.toFixed())),{...t,accumulated_rpz:BigInt((0,ot.calculate_accumulated_rps)(t.accumulated_rpz.toString(),t.total_shares_z.toString(),p.toFixed()))}}syncYieldFarm(t,e,i){if(t.state.type!=="Active"||t.updated_at===i)return t;if(t.total_valued_shares===0n)return{...t,updated_at:i};let r=(0,ot.calculate_yield_farm_delta_rpvs)(t.accumulated_rpz.toString(),e.accumulated_rpz.toString(),t.multiplier.toString(),t.total_valued_shares.toString());return{...t,accumulated_rpvs:t.accumulated_rpvs+BigInt(r),updated_at:i}}getLoyaltyMultiplier(t,e){let i=(0,xt.default)(1).mul(Ui).round(0,xt.default.roundDown).toString();if(!e)return i;let{initial_reward_percentage:r,scale_coef:n}=e;return(0,ot.calculate_loyalty_multiplier)(t.toFixed(),r.toString(),n.toFixed())}async claimRewards(t,e,i,r,n){if(e.state.type==="Terminated")return null;let s=Math.floor(r/t.blocks_per_period);if(i.updated_at===s)return null;let a=await this.syncGlobalFarm(t,s,n);if(!a)return null;let o=this.syncYieldFarm(e,a,s);if(!o)return null;let l=o.total_stopped-i.stopped_at_creation,u=o.updated_at-i.entered_at-l,p=this.getLoyaltyMultiplier(u,o.loyalty_curve),d=BigInt((0,ot.calculate_user_reward)(i.accumulated_rpvs.toString(),i.valued_shares.toString(),i.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),p)),m=BigInt((0,ot.calculate_user_reward)(i.accumulated_rpvs.toString(),i.valued_shares.toString(),i.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),is));return{reward:d,maxReward:m,assetId:a.reward_currency,yieldFarmId:o.id,isActiveFarm:o.state.type==="Active"}}};var rs=(0,Y.default)(365.2425).times(24).times(60).times(60),me=class{balance;client;options;constructor(t,e,i={}){this.client=t,this.balance=e,this.options=Object.freeze({blockTime:i.blockTime??Mr})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let i=[t,e].sort((n,s)=>n-s);if(t===e)return kr;let r=await this.client.getOraclePrice(i);if(r){let{n,d:s}=r[0].price,a;return t<e?a=(0,Vi.fixed_from_rational)(n.toString(),s.toString()):a=(0,Vi.fixed_from_rational)(s.toString(),n.toString()),BigInt(a)}}getFarmAddress=(t,e)=>{let i=Buffer.from("modl","utf-8"),r=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),n=Buffer.from([t]),s=Buffer.concat([i,r,n]),o="0x"+Buffer.concat([s,Buffer.alloc(32-s.length)]).toString("hex");return(0,Dr.AccountId)(St.HYDRATION_SS58_PREFIX).dec(o)};getGlobalRewardPerPeriod(t,e,i,r){let n=(0,Y.default)(r).times(t.toString()).times(e.toString()).div(Math.pow(10,St.RUNTIME_DECIMALS));return n.gte(i.toString())?i.toString():n.toString()}getPoolYieldPerPeriod(t,e,i,r){let n=(0,Y.default)(t.toString()).times(e),s=(0,Y.default)(i.toString()).times(r);return n.div(s.toString()).toString()}farmData(t,e,i){let{yieldFarm:r,globalFarm:n,priceAdjustment:s,balance:a,id:o}=t,{multiplier:l,loyalty_curve:u}=r,{blocks_per_period:p,yield_per_period:d,total_shares_z:m,max_reward_per_period:h,pending_rewards:b,accumulated_paid_rewards:g,planned_yielding_periods:P,updated_at:y,incentivized_asset:v,reward_currency:S,price_adjustment:T,min_deposit:B}=n,H=O.shiftNeg(s??T,St.RUNTIME_DECIMALS),W=O.shiftNeg(l,St.RUNTIME_DECIMALS),ut=O.shiftNeg(u?.initial_reward_percentage??0,St.RUNTIME_DECIMALS),yt=rs.div((0,Y.default)(this.blockTime).div(1e3).times(p)).toString(),Z;if(m<=0)Z=(0,Y.default)(W).times(d.toString()).times(yt).div(Math.pow(10,St.RUNTIME_DECIMALS)).toString();else{let Sn=this.getGlobalRewardPerPeriod(m,d,h,H),vn=this.getPoolYieldPerPeriod(Sn,W,m,H);Z=(0,Y.default)(vn).times(yt).toString()}let nt=b+g,Qt=h*BigInt(P),Me=a.transferable+nt,pr=Me-nt,De=(0,Y.default)(pr.toString()).div(h.toString()),Le=(0,Y.default)(e).div(p.toString()).toString(),qe=(m>=0?De.plus(y):De.plus(Le)).toString(),vi=(0,Y.default)(qe).times(p).toString(),fn=(0,Y.default)(m.toString()).div((0,Y.default)(h.toString()).div(d.toString())).div(Math.pow(10,St.RUNTIME_DECIMALS)).times(100).times(H).toFixed(2),mr=(0,Y.default)(nt.toString()).div(Me.toString()).gte(.999);Z=mr?"0":(0,Y.default)(Z).div(i?2:1).times(100).toString();let Pn=ut?(0,Y.default)(Z).times(ut).toString():void 0;return{apr:Z,minApr:Pn,isDistributed:mr,estimatedEndPeriod:qe,estimatedEndBlock:vi,maxRewards:Qt,incentivizedAsset:v,rewardCurrency:S,loyaltyCurve:u,currentPeriod:Le,potMaxRewards:Me,fullness:fn,yieldFarmId:r.id,globalFarmId:n.id,poolId:o,distributedRewards:nt,plannedYieldingPeriods:P,minDeposit:B,blocksPerPeriod:p}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((r,n)=>r.includes(n.keyArgs[0].toString())?r:[...r,n.keyArgs[0].toString()],[]),i=await Promise.all(e.map(async r=>{let n=await this.getOmnipoolFarms(r);if(n)return[r,n]}));return Object.fromEntries(i.filter(r=>!!r))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),i=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:n,value:s})=>{let[,a]=n,o=s,l=await this.client.getOmnipoolGlobalFarm(a),u=await this.client.getOmnipoolYieldFarm(Number(t),a,o);if(!l||!u)return;let p=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(a),h=await this.getOraclePrice(p,d),b=await this.balance.getBalance(m,p);return{id:t,globalFarm:l,yieldFarm:u,priceAdjustment:h,balance:b}}));return i?r.map(n=>n?this.farmData(n,i):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((r,n)=>r.includes(n.keyArgs[0].toString())?r:[...r,n.keyArgs[0].toString()],[]),i=await Promise.all(e.map(async r=>{let n=await this.getIsolatedFarms(r);if(n)return[r,n]}));return Object.fromEntries(i.filter(r=>!!r))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),i=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:n,value:s})=>{let[,a]=n,o=s,l=await this.client.getIsolatedGlobalFarm(a),u=await this.client.getIsolatedYieldFarm(t,a,o);if(!l||!u)return;let p=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(a,!0),h=await this.getOraclePrice(p,d),b=await this.balance.getBalance(m,p);return{id:t,globalFarm:l,yieldFarm:u,priceAdjustment:h,balance:b,farmAddress:m}}));return i?r.map(n=>n?this.farmData(n,i,!0):void 0):[]}async getDepositReward(t,e,i,r){let n=e.global_farm_id,s=e.yield_farm_id,a=i?await this.client.getIsolatedYieldFarm(t,n,s):await this.client.getOmnipoolYieldFarm(Number(t),n,s),o=i?await this.client.getIsolatedGlobalFarm(n):await this.client.getOmnipoolGlobalFarm(n);if(!o||!a)return;let l=o.reward_currency,u=o.incentivized_asset,p=[[this.getFarmAddress(0,i),o.reward_currency],[this.getFarmAddress(o.id,i),o.reward_currency]],d=await this.getAccountAssetBalances(p),m=await this.getOraclePrice(l,u),h=new ri(p,d),g=await new ni(y=>this.getFarmAddress(y),y=>this.client.getAsset(y),h).claimRewards(o,a,e,r,m??o.price_adjustment);if(!g)return;let P=await this.client.getAsset(g.assetId);if(P&&!(g.reward<=P.existential_deposit))return g}async getAccountAssetBalances(t){let[e,i]=await Promise.all([Promise.all(t.filter(([n,s])=>s!==0).map(([n,s])=>this.balance.getTokenBalance(n,s))),Promise.all(t.filter(([n,s])=>s===0).map(([n])=>this.balance.getSystemBalance(n)))]),r=[];for(let n=0,s=0;n+s<t.length;){let a=n+s,[,o]=t[a];o===0?(r.push(i[s]),s+=1):(r.push(e[n]),n+=1)}return r}};var de=require("polkadot-api"),ns=de.Binary.toHex(de.Binary.fromText("omnipool")),ge=class extends L{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(ns,t,(0,de.Enum)("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,{at:"best"})}async getOmnipoolYieldFarm(t,e,i){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,i,{at:"best"})}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,{at:"best"})}async getIsolatedYieldFarm(t,e,i){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,i,{at:"best"})}async getAsset(t){return this.api.query.AssetRegistry.Assets.getValue(t)}};var Ji={};R(Ji,{PoolContextProvider:()=>Yt,PoolError:()=>Tt,PoolFactory:()=>zt,PoolType:()=>C,aave:()=>Ki,hsm:()=>Qi,lbp:()=>zi,omni:()=>Yi,stable:()=>$i,xyk:()=>Xi});var zi={};R(zi,{LbpMath:()=>lt,LbpPool:()=>he,LbpPoolClient:()=>be});var gt=require("@galacticcouncil/math-lbp"),lt=class{static getSpotPrice(t,e,i,r,n){return(0,gt.get_spot_price)(t,e,i,r,n)}static calculateInGivenOut(t,e,i,r,n){return(0,gt.calculate_in_given_out)(t,e,i,r,n)}static calculateOutGivenIn(t,e,i,r,n){return(0,gt.calculate_out_given_in)(t,e,i,r,n)}static calculateLinearWeights(t,e,i,r,n){return(0,gt.calculate_linear_weights)(t,e,i,r,n)}static calculatePoolTradeFee(t,e,i){return(0,gt.calculate_pool_trade_fee)(t,e,i)}};var Ht=require("@galacticcouncil/common");var C=(s=>(s.Aave="Aave",s.LBP="LBP",s.Omni="Omnipool",s.Stable="Stableswap",s.XYK="XYK",s.HSM="HSM",s))(C||{}),Tt=(u=>(u.UnknownError="UnknownError",u.FacilitatorCapacityExceeded="FacilitatorCapacityExceeded",u.InsufficientTradingAmount="InsufficientTradingAmount",u.InsufficientCollateral="InsufficientCollateral",u.MaxHoldingExceeded="MaxHoldingExceeded",u.MaxInRatioExceeded="MaxInRatioExceeded",u.MaxOutRatioExceeded="MaxOutRatioExceeded",u.TradeNotAllowed="TradeNotAllowed",u.MaxBuyBackExceeded="MaxBuyBackExceeded",u.MaxBuyPriceExceeded="MaxBuyPriceExceeded",u))(Tt||{});var{FeeUtils:Lr}=O,he=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new c(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 i=new Map(this.tokens.map(s=>[s.id,s])),r=i.get(t),n=i.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:n.balance,decimalsIn:r.decimals,decimalsOut:n.decimals,weightIn:r.weight,weightOut:n.weight}}validateAndBuy(t,e,i){let r=this.tokens[0].id,n=[];e<this.minTradingLimit&&n.push("InsufficientTradingAmount");let s=t.balanceOut/this.maxOutRatio;if(e>s&&n.push("MaxOutRatioExceeded"),r===t.assetOut){let a=this.calculateTradeFee(e,i),o=Lr.toPct(this.repayFeeApply?i.repayFee:i.exchangeFee),l=e+a,u=this.calculateInGivenOut(t,l),p=t.balanceIn/this.maxInRatio;return u>p&&n.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:n}}else{let a=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return a>o&&n.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:n}}}validateAndSell(t,e,i){let r=this.tokens[0].id,n=[];e<this.minTradingLimit&&n.push("InsufficientTradingAmount");let s=t.balanceIn/this.maxInRatio;if(e>s&&n.push("MaxInRatioExceeded"),r===t.assetIn){let a=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return a>o&&n.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:n}}else{let a=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(a,i),l=Lr.toPct(this.repayFeeApply?i.repayFee:i.exchangeFee),u=a-o,p=t.balanceOut/this.maxOutRatio;return u>p&&n.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:u,feePct:l,errors:n}}}calculateInGivenOut(t,e){let i=lt.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(i);return r<0n?0n:r}calculateOutGivenIn(t,e){let i=lt.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(i);return r<0n?0n:r}spotPriceInGivenOut(t){let e=lt.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),Ht.big.toBigInt(1,Ht.RUNTIME_DECIMALS).toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=lt.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),Ht.big.toBigInt(1,Ht.RUNTIME_DECIMALS).toString());return BigInt(e)}calculateTradeFee(t,e){let i=lt.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(i)}};var Gr=require("polkadot-api"),It=require("rxjs");var qr=(c,t=new Map)=>e=>{let i;return t.has(e)?t.get(e):(t.set(e,i=c(e)),i)};var I=require("rxjs"),f=require("rxjs/operators");var Nr=require("rxjs"),si=class{store$=new Nr.BehaviorSubject([]);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,i=new Map(e.map((a,o)=>[a.address,o])),r=await t(e),n=e.slice(),s=new Set;for(let a of r){let o=i.get(a.address);o===void 0?(i.set(a.address,n.length),n.push(a)):n[o]=a,s.add(a.address)}this.changeset=s,this.store$.next(n)}).catch(console.error)}destroy(){this.store$.complete()}};var Hr=require("@galacticcouncil/common");var ss={Aave:"AAVE",LBP:"LBP",Omnipool:"OMNI",Stableswap:"STBL",XYK:"XYK",HSM:"HSM"},{logger:ai}=Hr.log,oi=class{type;constructor(t){this.type=t}prefix(){return this.pad(`pool(${ss[this.type]})`,10)}trace(t,...e){ai.trace(`${this.prefix()} ${t} :`,...e)}debug(t,...e){ai.debug(`${this.prefix()} ${t} :`,...e)}info(t,...e){ai.info(`${this.prefix()} ${t} :`,...e)}error(t,...e){ai.error(`${this.prefix()} ${t} :`,...e)}pad(t,e){return t.length>=e?t:t+" ".repeat(e-t.length)}};var{withTimeout:as}=ce,os=3e3,Q=class extends L{evm;balance;store=new si;log;shared$;resync$=new I.ReplaySubject(1);resyncAt=0;resyncPending=!1;mem=0;memPoolsCache=new Ot(null,{ttl:6*1e3});memPools=qr(t=>(this.log.info("pool_sync",{mem:t}),this.loadPools()),this.memPoolsCache);constructor(t,e){super(t),this.evm=e,this.balance=new pt(t),this.log=new oi(this.getPoolType())}async getMemPools(){return this.memPools(this.mem)}async getPools(){return(await this.getMemPools()).filter(e=>this.hasValidAssets(e))}getSubscriber(){return this.shared$||(this.shared$=this.subscribeStore()),this.shared$.pipe((0,f.startWith)([]),(0,f.bufferCount)(2,1),(0,f.map)(([t,e])=>t.length===0?e:this.store.applyChangeset(e)),(0,f.filter)(t=>t.length>0),(0,f.throttleTime)(1e3,void 0,{leading:!0,trailing:!0}))}subscribeStore(){return(0,I.defer)(()=>{let t=new I.Subscription;return t.add(this.startWatchdog()),this.resync$.next(),this.resync$.pipe((0,f.switchMap)(()=>{let e=new I.Subscription;return(0,I.from)(as(this.getMemPools(),6e4,"getMemPools stalled")).pipe((0,f.tap)(()=>this.log.info("pool_synced",{mem:this.mem})),(0,f.map)(r=>r.filter(n=>this.hasValidAssets(n))),(0,f.tap)(r=>this.store.set(r)),(0,f.catchError)(()=>(this.log.error("pool_seed_error",{mem:this.mem}),this.requestResync(),I.EMPTY))).pipe((0,f.tap)(()=>{e.add(this.subscribeBalances()),e.add(this.subscribeUpdates())}),(0,f.switchMap)(r=>(0,I.merge)((0,I.of)(r),this.store.asObservable().pipe((0,f.skip)(1)))),(0,f.finalize)(()=>{e.unsubscribe()}))}),(0,f.finalize)(()=>t.unsubscribe()))}).pipe((0,f.share)({connector:()=>new I.ReplaySubject(1),resetOnRefCountZero:!0}))}subscribeBalances(){let t=this.store.pools.map(e=>{let{address:i}=e,r=[this.balance.watchTokensBalance(i)];if(this.hasSystemAsset(e)){let n=this.balance.watchSystemBalance(i);r.push(n)}if(this.hasErc20Asset(e)){let n=e.tokens.filter(a=>a.type==="Erc20").map(a=>a.id),s=this.balance.watchErc20Balance(i,n);r.push(s)}return(0,I.combineLatest)(r).pipe((0,f.map)(n=>n.flat()),(0,f.pairwise)(),(0,f.map)(([n,s])=>this.balance.getDeltas(n,s)),(0,f.filter)(n=>n.length>0),(0,f.map)(n=>[i,n]))});return(0,I.merge)(...t).pipe((0,f.bufferTime)(250),(0,f.filter)(e=>e.length>0),(0,f.map)(e=>new Map(e)),this.watchGuard("balances")).subscribe(e=>{this.store.update(i=>this.updateBalances(i,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:i})=>t.type==="XYK"?i>0n&&!!e:!!e)}updateBalances=(t,e)=>{let i=[],r=new Map(t.map(n=>[n.address,n]));for(let[n,s]of e){let a=r.get(n);if(a){let o=a.tokens.map(l=>{let u=s.find(p=>p.id===l.id);return u&&l.id!==a.id?{...l,balance:u.balance.transferable}:l});i.push({...a,tokens:o})}}return i};resync(t=!1){let e=Date.now();!t&&e-this.resyncAt<os||(this.resyncAt=e,this.mem++,this.resync$.next())}requestResync(t=!1){this.resyncPending||(this.resyncPending=!0,setTimeout(()=>{this.resyncPending=!1,this.resync(t)},0))}startWatchdog(){let r=this.watcher.connection$.pipe((0,f.pairwise)(),(0,f.filter)(([a,o])=>a==="offline"&&o==="online"),(0,f.tap)(()=>{this.log.debug("watchdog_recover_online",{mem:this.mem}),this.requestResync()}),(0,f.catchError)(a=>(this.log.error("watchdog_recovery_error",a),I.EMPTY)),(0,f.repeat)({delay:1e3})),n=this.watcher.finalizedBlock$.pipe((0,f.pairwise)(),(0,f.tap)(([a,o])=>{let l=Number(a.number),u=Number(o.number),p=u-l;p>=3&&(this.log.debug("watchdog_gap",{from:l,to:u,gap:p}),this.requestResync())}),(0,f.catchError)(a=>(this.log.error("watchdog_gap_error",a),I.EMPTY)),(0,f.repeat)({delay:1e3})),s=(0,I.interval)(36e5).pipe((0,f.tap)(()=>{this.log.debug("watchdog_periodic",{mem:this.mem}),this.requestResync()}),(0,f.catchError)(a=>(this.log.error("watchdog_periodic_error",a),I.EMPTY)),(0,f.repeat)({delay:1e3}));return(0,I.merge)(r,n,s).subscribe()}watchGuard(t){return e=>e.pipe((0,f.tap)({error:i=>{this.log.error(t,i),this.requestResync(!0)}}),(0,f.finalize)(()=>{this.log.debug(t,"unsub")}),(0,f.catchError)(()=>I.EMPTY))}};var be=class extends Q{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);getPoolType(){return"LBP"}async getPoolLimits(){let[t,e,i]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:i}}getPoolWeights(t,e){let{start:i,end:r,initial_weight:n,final_weight:s}=t,a=lt.calculateLinearWeights(i?i.toString():"0",r?r.toString():"0",n.toString(),s.toString(),e.toString()),o=BigInt(a),l=this.MAX_FINAL_WEIGHT-BigInt(o);return[o,l]}async isSupported(){return(await this.api.getStaticApis()).compat.query.LBP.PoolData.isCompatible(Gr.CompatibilityLevel.BackwardsCompatible)}async loadPools(){let[t,e,i]=await Promise.all([this.api.query.LBP.PoolData.getEntries({at:"best"}),this.api.query.ParachainSystem.ValidationData.getValue({at:"best"}),this.getPoolLimits()]),r=e?.relay_parent_number||0,n=t.filter(({value:s})=>e&&this.isActivePool(s,r)).map(async({keyArgs:s,value:a})=>{let[o]=s,l=o.toString(),u=await this.getPoolDelta(l,a,r);return{address:l,type:"LBP",fee:a.fee,...u,...i}});return Promise.all(n)}async getPoolDelta(t,e,i){let{assets:r,repay_target:n,fee_collector:s}=e,[a,o]=this.getPoolWeights(e,i),[l,u]=r,[p,d,m,h,b]=await Promise.all([this.isRepayFeeApplied(l,n,s.toString()),this.balance.getBalance(t,l),this.api.query.AssetRegistry.Assets.getValue(l),this.balance.getBalance(t,u),this.api.query.AssetRegistry.Assets.getValue(u)]);return{repayFeeApply:p,tokens:[{id:l,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:d.transferable,weight:a,type:m?.asset_type.type},{id:u,decimals:b?.decimals,existentialDeposit:b?.existential_deposit,balance:h.transferable,weight:o,type:b?.asset_type.type}]}}isActivePool(t,e){let{start:i,end:r}=t;return i&&r?e>=i&&e<r:!1}async isRepayFeeApplied(t,e,i){if(e===0n)return!1;try{return(await this.balance.getBalance(i,t)).transferable<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolFees(t,e){let i=this.store.pools.find(n=>n.address===e);return{repayFee:await this.getRepayFee(),exchangeFee:i.fee}}subscribeValidationData(){return this.api.query.ParachainSystem.ValidationData.watchValue({at:"best"}).pipe((0,It.map)(({value:t})=>t),(0,It.filter)(t=>t!==void 0),(0,It.distinctUntilChanged)((t,e)=>t.relay_parent_number===e.relay_parent_number),this.watchGuard("parachainSystem.ValidationData")).subscribe(({relay_parent_number:t})=>{this.store.update(async e=>{let i=[];for(let r of e){let n=this.poolsData.get(r.address);if(n){let{assets:s,repay_target:a,fee_collector:o}=n,[l]=s,[u,p]=this.getPoolWeights(n,t),[d,m]=r.tokens,h=[{...d,weight:u},{...m,weight:p}],b=await this.isRepayFeeApplied(l,a,o.toString());i.push({...r,tokens:h,repayFeeApply:b})}}return i})})}subscribeUpdates(){let t=new It.Subscription;return t.add(this.subscribeValidationData()),t}};var Yi={};R(Yi,{OmniMath:()=>F,OmniPool:()=>ye,OmniPoolClient:()=>fe});var x=require("@galacticcouncil/math-omnipool"),Bt=wt(require("big.js")),F=class{static calculateSpotPrice(t,e,i,r){return(0,x.calculate_spot_price)(t,e,i,r)}static calculateLrnaSpotPrice(t,e){return(0,x.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,i,r,n,s,a,o,l,u){return(0,x.calculate_in_given_out)(t,e,i,r,n,s,a,o,l,u)}static calculateLrnaInGivenOut(t,e,i,r,n,s){return(0,x.calculate_lrna_in_given_out)(t,e,i,r,n,s)}static calculateOutGivenIn(t,e,i,r,n,s,a,o,l,u){return(0,x.calculate_out_given_in)(t,e,i,r,n,s,a,o,l,u)}static calculateOutGivenLrnaIn(t,e,i,r,n,s){return(0,x.calculate_out_given_lrna_in)(t,e,i,r,n,s)}static calculateShares(t,e,i,r){return(0,x.calculate_shares)(t,e,i,r)}static calculateLiquidityOut(t,e,i,r,n,s,a,o){return(0,x.calculate_liquidity_out)(t,e,i,r,n,s,a,o)}static calculateLiquidityLRNAOut(t,e,i,r,n,s,a,o){return(0,x.calculate_liquidity_lrna_out)(t,e,i,r,n,s,a,o)}static calculateCapDifference(t,e,i,r){let n=(0,Bt.default)(e),s=(0,Bt.default)(t),a=(0,Bt.default)(r),o=(0,Bt.default)(i),l=(0,Bt.default)(10).pow(18),u=o.div(l);if(n.div(a).lt(u)){let d=u.times(a).minus(n).times(s),m=n.times((0,Bt.default)(1).minus(u));return d.div(m).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,i,r){return(0,x.calculate_liquidity_hub_in)(t,e,i,r)}static isSellAllowed(t){return(0,x.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,x.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,x.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,x.is_remove_liquidity_allowed)(t)}static recalculateAssetFee(t,e,i,r,n,s,a,o,l,u,p){return(0,x.recalculate_asset_fee)(t,e,i,r,n,s,a,o,l,u,p)}static recalculateProtocolFee(t,e,i,r,n,s,a,o,l,u,p){return(0,x.recalculate_protocol_fee)(t,e,i,r,n,s,a,o,l,u,p)}static verifyAssetCap(t,e,i,r){return(0,x.verify_asset_cap)(t,e,i,r)}};var Ur=require("@galacticcouncil/common");var{FeeUtils:ht}=O,ye=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new c(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 i=new Map(this.tokens.map(s=>[s.id,s])),r=i.get(t),n=i.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:r.hubReserves,hubReservesOut:n.hubReserves,sharesIn:r.shares,sharesOut:n.shares,decimalsIn:r.decimals,decimalsOut:n.decimals,balanceIn:r.balance,balanceOut:n.balance,tradeableIn:r.tradeable,tradeableOut:n.tradeable,assetInEd:r.existentialDeposit,assetOutEd:n.existentialDeposit}}validateAndBuy(t,e,i){let r=this.calculateInGivenOut(t,e),n=this.calculateInGivenOut(t,e,i),s=r===0n?0:z.calculateBuyFee(r,n),a=[],o=F.isSellAllowed(t.tradeableIn),l=F.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&a.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&a.push("MaxOutRatioExceeded");let p=t.balanceIn/this.maxInRatio;return n>p&&a.push("MaxInRatioExceeded"),{amountIn:n,calculatedIn:r,amountOut:e,feePct:s,errors:a}}validateAndSell(t,e,i){let r=this.calculateOutGivenIn(t,e),n=this.calculateOutGivenIn(t,e,i),s=z.calculateSellFee(r,n),a=[],o=F.isSellAllowed(t.tradeableIn),l=F.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&a.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&a.push("MaxInRatioExceeded");let p=t.balanceOut/this.maxOutRatio;return n>p&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:n,feePct:s,errors:a}}calculateInGivenOut(t,e,i){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,i);let r=F.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),i?ht.toRaw(i.assetFee).toString():"0",i?ht.toRaw(i.protocolFee).toString():"0",i?ht.toRaw(i.maxSlipFee).toString():"0"),n=BigInt(r);return n<0n?0n:n}calculateLrnaInGivenOut(t,e,i){let r=F.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),i?ht.toRaw(i.assetFee).toString():"0",i?ht.toRaw(i.maxSlipFee).toString():"0"),n=BigInt(r);return n<0n?0n:n}calculateOutGivenIn(t,e,i){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,i);let r=F.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),i?ht.toRaw(i.assetFee).toString():"0",i?ht.toRaw(i.protocolFee).toString():"0",i?ht.toRaw(i.maxSlipFee).toString():"0"),n=BigInt(r);return n<0n?0n:n}calculateOutGivenLrnaIn(t,e,i){let r=F.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),i?ht.toRaw(i.assetFee).toString():"0",i?ht.toRaw(i.maxSlipFee).toString():"0"),n=BigInt(r);return n<0n?0n:n}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=F.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceLrnaInGivenOut(t){let e=F.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=F.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}spotPriceOutGivenLrnaIn(t){let e=F.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}normalizeSpot(t,e,i){let r=e-i;if(r===0)return t;let n=Ur.big.pow10(Math.abs(r));return r>0?t*n:t/n}};var bt=require("polkadot-api"),zr=require("@polkadot-api/utils"),_=require("rxjs"),Yr=require("@galacticcouncil/common");var{FeeUtils:k}=O,Vr=bt.Binary.toHex(bt.Binary.fromText("omnipool")),Wr=(0,bt.Enum)("Short"),fe=class extends Q{queryBus=new pe;block=0;dynamicFeesConfig=this.queryBus.scope("DynamicFees.AssetFeeConfiguration",t=>this.api.query.DynamicFees.AssetFeeConfiguration.getValue(t,{at:"best"}),t=>String(t));dynamicFees=this.queryBus.scope("DynamicFees.AssetFee",t=>this.api.query.DynamicFees.AssetFee.getValue(t,{at:"best"}),t=>String(t),6*1e3);maxSlipFee=this.queryBus.scope("Omnipool.SlipFee",()=>this.apiNext.query.Omnipool.SlipFee.getValue({at:"best"}),()=>"slipFee");emaOracles=this.queryBus.scope("EmaOracle.Oracles.Short",t=>this.api.query.EmaOracle.Oracles.getValue(Vr,t,Wr,{at:"best"}),t=>t.join(":"),6*1e3);getPoolType(){return"Omnipool"}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),i=(0,zr.toHex)(e);return(0,bt.AccountId)(Yr.HYDRATION_SS58_PREFIX).dec(i)}getOraclePair(t){return t===0?[0,1]:[1,t]}async getPoolLimits(){let[t,e,i]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:i}}async isSupported(){return(await this.api.getStaticApis()).compat.query.Omnipool.Assets.isCompatible(bt.CompatibilityLevel.BackwardsCompatible)}async isSlipFeeSupported(){return(await this.apiNext.getStaticApis()).compat.query.Omnipool.SlipFee.isCompatible(bt.CompatibilityLevel.Partial)}async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[i,r,n,s,a]=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.balance.getBalance(e,t),this.getPoolLimits()]),o=i.map(async({keyArgs:u,value:p})=>{let[d]=u,{hub_reserve:m,shares:h,tradable:b,cap:g,protocol_shares:P}=p,[y,v]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.balance.getBalance(e,d)]);return{id:d,decimals:y?.decimals,existentialDeposit:y?.existential_deposit,balance:v.transferable,cap:g,hubReserves:m,protocolShares:P,shares:h,tradeable:b,type:y?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:n?.decimals,existentialDeposit:n?.existential_deposit,balance:s.transferable,tradeable:r,type:n?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...a}]}async getPoolFees(t){let e=t.assetOut,i=t.assetIn,r=0;await this.isSlipFeeSupported()&&(r=await this.maxSlipFee.get()??0);let s=await this.dynamicFeesConfig.get(e);if(s?.type==="Fixed"){let{asset_fee:S,protocol_fee:T}=s.value;return{assetFee:k.fromPermill(S),protocolFee:k.fromPermill(T),maxSlipFee:k.fromPermill(r)}}let a=this.getOraclePair(e),o=this.getOraclePair(i),[l,u,p]=await Promise.all([this.dynamicFees.get(e),this.emaOracles.get(a),this.emaOracles.get(o)]),[d,m,h]=await this.getAssetFee(t,this.block,l,u,s?.value.asset_fee_params),[b,g,P]=i===1?[0,0,0]:await this.getProtocolFee(t,this.block,l,p,s?.value.protocol_fee_params),y=d+b,v=h+P;return{assetFee:k.fromPermill(m),protocolFee:k.fromPermill(g),maxSlipFee:k.fromPermill(r),min:k.fromPermill(y),max:k.fromPermill(v)}}async getAssetFee(t,e,i,r,n){let{assetOut:s,balanceOut:a}=t,{min_fee:o,max_fee:l,decay:u,amplification:p}=n||await this.api.constants.DynamicFees.AssetFeeParameters();if(!i||!r)return[o,o,l];let d=k.fromPermill(o),m=k.fromPermill(l),[h]=r,{asset_fee:b,timestamp:g}=i,P=Math.max(1,e-g),y=h.volume.b_in.toString(),v=h.volume.b_out.toString(),S=h.liquidity.b.toString();s===0&&(y=h.volume.a_in.toString(),v=h.volume.a_out.toString(),S=h.liquidity.a.toString());let T=k.fromPermill(b),B=F.recalculateAssetFee(y,v,S,"9",a.toString(),k.toRaw(T).toString(),P.toString(),k.toRaw(d).toString(),k.toRaw(m).toString(),u.toString(),p.toString());return[o,Number(B)*1e6,l]}async getProtocolFee(t,e,i,r,n){let{assetIn:s,balanceIn:a}=t,{min_fee:o,max_fee:l,decay:u,amplification:p}=n||await this.api.constants.DynamicFees.ProtocolFeeParameters();if(!i||!r)return[o,o,l];let d=k.fromPermill(o),m=k.fromPermill(l),[h]=r,{protocol_fee:b,timestamp:g}=i,P=Math.max(1,e-g),y=h.volume.b_in.toString(),v=h.volume.b_out.toString(),S=h.liquidity.b.toString();s===0&&(y=h.volume.a_in.toString(),v=h.volume.a_out.toString(),S=h.liquidity.a.toString());let T=k.fromPermill(b),B=F.recalculateProtocolFee(y,v,S,"9",a.toString(),k.toRaw(T).toString(),P.toString(),k.toRaw(d).toString(),k.toRaw(m).toString(),u.toString(),p.toString());return[o,Number(B)*1e6,l]}subscribeEmaOracles(){let[t]=this.store.pools,i=t.tokens.map(r=>r.id).map(r=>this.getOraclePair(r)).map(r=>this.api.query.EmaOracle.Oracles.watchValue(Vr,r,Wr,{at:"best"}).pipe((0,_.map)(({value:n})=>n),(0,_.filter)(n=>n!==void 0),(0,_.map)((n,s)=>({value:n,index:s})),(0,_.tap)(({index:n})=>{n>0&&this.log.trace("emaOracle.Oracles",r.join(":"))}),(0,_.map)(({value:n})=>({pair:r,value:n}))));return(0,_.merge)(...i).pipe((0,_.finalize)(()=>this.emaOracles.clear()),this.watchGuard("emaOracle.Oracles")).subscribe(r=>{let{pair:n,value:s}=r;this.emaOracles.set(s,n)})}subscribeDynamicFees(){return this.api.query.DynamicFees.AssetFee.watchEntries({at:"best"}).pipe((0,_.distinctUntilChanged)((t,e)=>!e.deltas),(0,_.map)((t,e)=>({value:t,index:e})),(0,_.tap)(({value:t,index:e})=>{e>0&&this.log.trace("dynamicFees.AssetFee",t.deltas?.upserted)}),(0,_.finalize)(()=>this.dynamicFees.clear()),this.watchGuard("dynamicFees.AssetFee")).subscribe(({value:{deltas:t}})=>{t?.upserted.forEach(e=>{let[i]=e.args;this.dynamicFees.set(e.value,i)})})}subscribeDynamicFeesConfig(){return this.api.query.DynamicFees.AssetFeeConfiguration.watchEntries({at:"best"}).pipe((0,_.distinctUntilChanged)((t,e)=>!e.deltas),(0,_.map)((t,e)=>({value:t,index:e})),(0,_.tap)(({value:t,index:e})=>{e>0&&this.log.trace("dynamicFees.AssetFeeConfiguration",t.deltas?.upserted)}),(0,_.finalize)(()=>this.dynamicFeesConfig.clear()),this.watchGuard("dynamicFees.AssetFeeConfiguration")).subscribe(({value:{deltas:t}})=>{t?.upserted.forEach(e=>{let[i]=e.args;this.dynamicFeesConfig.set(e.value,i)})})}subscribeBlock(){return this.watcher.bestBlock$.pipe(this.watchGuard("watcher.bestBlock")).subscribe(t=>{this.block=t})}subscribeAssets(){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,_.distinctUntilChanged)((t,e)=>!e.deltas),(0,_.map)((t,e)=>({value:t,index:e})),(0,_.tap)(({value:t,index:e})=>{e>0&&this.log.trace("omnipool.Assets",t.deltas?.upserted)}),this.watchGuard("omnipool.Assets")).subscribe(({value:{deltas:t}})=>{this.store.update(([e])=>{let i=t?.upserted.reduce((n,s)=>{let[a]=s.args;return n.set(a,s.value),n},new Map),r=e.tokens.map(n=>{let s=i?.get(n.id);return s?this.updateTokenState(n,s):n});return[{...e,tokens:r}]})})}subscribeUpdates(){let t=new _.Subscription;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:i,shares:r,tradable:n,cap:s,protocol_shares:a}=e;return{...t,cap:s,hubReserves:i,protocolShares:a,shares:r,tradeable:n}}};var $i={};R($i,{StableMath:()=>$,StableSwap:()=>Ft,StableSwapClient:()=>Se});var M=require("@galacticcouncil/math-stableswap"),$=class{static getPoolAddress(t){return(0,M.pool_account_name)(t)}static defaultPegs(t){let e=[];for(let i=0;i<t;i++)e.push(["1","1"]);return e}static calculateAmplification(t,e,i,r,n){return(0,M.calculate_amplification)(t,e,i,r,n)}static calculateInGivenOut(t,e,i,r,n,s,a){return(0,M.calculate_in_given_out)(t,e,i,r,n,s,a)}static calculateAddOneAsset(t,e,i,r,n,s,a){return(0,M.calculate_add_one_asset)(t,e,i,r,n,s,a)}static calculateSharesForAmount(t,e,i,r,n,s,a){return(0,M.calculate_shares_for_amount)(t,e,i,r,n,s,a)}static calculateOutGivenIn(t,e,i,r,n,s,a){return(0,M.calculate_out_given_in)(t,e,i,r,n,s,a)}static calculateLiquidityOutOneAsset(t,e,i,r,n,s,a){return(0,M.calculate_liquidity_out_one_asset)(t,e,i,r,n,s,a)}static calculateShares(t,e,i,r,n,s){return(0,M.calculate_shares)(t,e,i,r,n,s)}static calculateSpotPriceWithFee(t,e,i,r,n,s,a,o){return(0,M.calculate_spot_price_with_fee)(t,e,i,r,n,s,a,o)}static recalculatePegs(t,e,i,r,n,s){let a=(0,M.recalculate_peg)(t,e,i,r,n,s);return JSON.parse(a)}};var Pe=require("@galacticcouncil/common");var{FeeUtils:Gt}=O,Ft=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;isRampPeriod;id;fee;totalIssuance;pegs;static fromPool(t){return new c(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 i=new Map(this.tokens.map(s=>[s.id,s])),r=i.get(t),n=i.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:n.balance,decimalsIn:r.decimals,decimalsOut:n.decimals,tradeableIn:this.id===t?15:r.tradeable,tradeableOut:this.id===e?15:n.tradeable,assetInEd:r.existentialDeposit,assetOutEd:n.existentialDeposit}}validateAndBuy(t,e,i){let r=this.calculateInGivenOut(t,e),n=this.calculateInGivenOut(t,e,i),s=r===0n?0:z.calculateBuyFee(r,n),a=[],o=F.isSellAllowed(t.tradeableIn),l=F.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&a.push("InsufficientTradingAmount"),{amountIn:n,calculatedIn:r,amountOut:e,feePct:s,errors:a}}validateAndSell(t,e,i){let r=this.calculateOutGivenIn(t,e),n=this.calculateOutGivenIn(t,e,i),s=z.calculateSellFee(r,n),a=[],o=F.isSellAllowed(t.tradeableIn),l=F.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&a.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:r,amountOut:n,feePct:s,errors:a}}calculateIn(t,e,i){let r=$.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),i?Gt.toRaw(i.fee).toString():"0",this.getPegs()),n=BigInt(r);return n<0n?0n:n}calculateAddOneAsset(t,e,i){let r=$.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),i?Gt.toRaw(i.fee).toString():"0",this.getPegs()),n=BigInt(r);return n<0n?0n:n}calculateSharesForAmount(t,e,i){let r=$.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),i?Gt.toRaw(i.fee).toString():"0",this.getPegs()),n=BigInt(r);return n<0n?0n:n}calculateInGivenOut(t,e,i){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,i):t.assetIn==this.id?this.calculateSharesForAmount(t,e,i):this.calculateIn(t,e,i)}spotPriceInGivenOut(t){let e=$.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());return this.normalizeSpot(BigInt(e),t.assetOut===this.id,t.assetIn===this.id,t.decimalsOut,t.decimalsIn)}calculateOut(t,e,i){let r=$.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),i?Gt.toRaw(i.fee).toString():"0",this.getPegs()),n=BigInt(r);return n<0n?0n:n}calculateWithdrawOneAsset(t,e,i){let r=$.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),i?Gt.toRaw(i.fee).toString():"0",this.getPegs()),n=BigInt(r);return n<0n?0n:n}calculateShares(t,e,i){let r=$.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),i?Gt.toRaw(i.fee).toString():"0",this.getPegs()),n=BigInt(r);return n<0n?0n:n}calculateOutGivenIn(t,e,i){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,i):t.assetOut==this.id?this.calculateShares(t,e,i):this.calculateOut(t,e,i)}spotPriceOutGivenIn(t){let e=$.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());return this.normalizeSpot(BigInt(e),t.assetIn===this.id,t.assetOut===this.id,t.decimalsIn,t.decimalsOut)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:i,decimals:r})=>({asset_id:e,amount:i,decimals:r}));return JSON.stringify(t,qt.jsonFormatter)}getAssets(t,e){let i={asset_id:Number(t),amount:e.toString()};return JSON.stringify([i],qt.jsonFormatter)}normalizeSpot(t,e,i,r,n){return e?t*Pe.big.pow10(Pe.RUNTIME_DECIMALS-n):i?t/Pe.big.pow10(n-r):t}};var li=require("polkadot-api"),$r=require("@polkadot-api/utils"),Xr=require("@noble/hashes/blake2b"),J=require("rxjs"),ci=require("@galacticcouncil/common");var{FeeUtils:ls}=O,Se=class extends Q{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=$.getPoolAddress(t),i=(0,Xr.blake2b)(e,{dkLen:32}),r=(0,$r.toHex)(i);return(0,li.AccountId)(ci.HYDRATION_SS58_PREFIX).dec(r)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}getPoolAmplification(t,e){let{initial_amplification:i,final_amplification:r,initial_block:n,final_block:s}=t,a=$.calculateAmplification(i.toString(),r.toString(),n.toString(),s.toString(),e.toString()),o=Number(a)<r;return{amplification:BigInt(a),isRampPeriod:o}}async getPoolTokens(t,e){let i=this.getPoolAddress(t),r=e.assets.map(async n=>{let[s,a,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,n),this.api.query.AssetRegistry.Assets.getValue(n),this.balance.getBalance(i,n)]);return{id:n,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:o.transferable,tradeable:s,type:a?.asset_type.type}});return Promise.all(r)}async isSupported(){return(await this.api.getStaticApis()).compat.query.Stableswap.Pools.isCompatible(li.CompatibilityLevel.BackwardsCompatible)}async loadPools(){let[t,e,i]=await Promise.all([this.api.query.Stableswap.Pools.getEntries({at:"best"}),this.api.query.System.Number.getValue({at:"best"}),this.getPoolLimits()]),r=t.map(async({keyArgs:n,value:s})=>{let[a]=n,o=this.getPoolAddress(a),[l,u,p]=await Promise.all([this.getPoolTokens(a,s),this.api.query.Stableswap.PoolPegs.getValue(a,{at:"best"}),this.api.query.Tokens.TotalIssuance.getValue(a,{at:"best"})]),d=this.getPoolAmplification(s,e),m=u?this.getRecentPegs(u):this.getDefaultPegs(s);return l.push({id:a,tradeable:15,balance:p,decimals:ci.RUNTIME_DECIMALS}),this.poolsData.set(a,s),{address:o,id:a,type:"Stableswap",fee:ls.fromPermill(s.fee),tokens:l,totalIssuance:p,pegs:m,...i,...d}});return Promise.all(r)}async getPoolFees(t,e){return{fee:this.store.pools.find(r=>r.address===e).fee}}getDefaultPegs(t){return $.defaultPegs(t.assets.length)}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([i,r])=>r.map(n=>n.toString()))}subscribeIssuance(){let e=this.store.pools.map(i=>i.id).map(i=>this.api.query.Tokens.TotalIssuance.watchValue(i,{at:"best"}).pipe((0,J.map)(({value:r})=>r),(0,J.map)((r,n)=>({value:r,index:n})),(0,J.tap)(({index:r,value:n})=>{r>0&&this.log.trace("tokens.TotalIssuance",i,n)}),(0,J.map)(({value:r})=>({id:i,value:r}))));return(0,J.merge)(...e).pipe(this.watchGuard("tokens.TotalIssuance")).subscribe(i=>{let{id:r,value:n}=i;this.store.update(s=>{let a=[];return s.filter(o=>o.id===r).forEach(o=>{let l=o.tokens.map(u=>u.id===r?{...u,balance:n}:u);a.push({...o,tokens:l,totalIssuance:n})}),a})})}subscribePoolPegs(){return this.api.query.Stableswap.PoolPegs.watchEntries({at:"best"}).pipe((0,J.distinctUntilChanged)((t,e)=>!e.deltas),(0,J.map)((t,e)=>({value:t,index:e})),(0,J.tap)(({value:t,index:e})=>{e>0&&this.log.trace("stableswap.PoolPegs",t.deltas?.upserted)}),this.watchGuard("stableswap.PoolPegs")).subscribe({error:t=>this.log.error("stableswap.PoolPegs",t),next:({value:{deltas:t}})=>{this.store.update(e=>{let i=[],r=new Map(e.map(n=>[n.id,n]));return t?.upserted.forEach(({args:n,value:s})=>{let[a]=n,o=r.get(a);if(o){let l=this.getRecentPegs(s);i.push({...o,pegs:l})}}),i})}})}subscribeBlock(){return this.watcher.bestBlock$.pipe(this.watchGuard("watcher.bestBlock")).subscribe(t=>{this.store.update(e=>{let i=[];return e.filter(r=>r.isRampPeriod).forEach(r=>{let n=this.poolsData.get(r.id);if(n){let s=this.getPoolAmplification(n,t);i.push({...r,...s})}}),i})})}subscribeUpdates(){let t=new J.Subscription;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 Xi={};R(Xi,{XykMath:()=>vt,XykPool:()=>ve,XykPoolClient:()=>we});var D=require("@galacticcouncil/math-xyk"),vt=class{static getSpotPrice(t,e,i){return(0,D.get_spot_price)(t,e,i)}static calculateInGivenOut(t,e,i){return(0,D.calculate_in_given_out)(t,e,i)}static calculateOutGivenIn(t,e,i){return(0,D.calculate_out_given_in)(t,e,i)}static calculatePoolTradeFee(t,e,i){return(0,D.calculate_pool_trade_fee)(t,e,i)}static calculateLiquidityIn(t,e,i){return(0,D.calculate_liquidity_in)(t,e,i)}static calculateSpotPrice(t,e){return(0,D.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,i,r){return(0,D.calculate_spot_price_with_fee)(t,e,i,r)}static calculateShares(t,e,i){return(0,D.calculate_shares)(t,e,i)}static calculateLiquidityOutAssetA(t,e,i,r){return(0,D.calculate_liquidity_out_asset_a)(t,e,i,r)}static calculateLiquidityOutAssetB(t,e,i,r){return(0,D.calculate_liquidity_out_asset_b)(t,e,i,r)}};var jr=require("@galacticcouncil/common");var{FeeUtils:Kr}=O,ve=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(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 i=new Map(this.tokens.map(s=>[s.id,s])),r=i.get(t),n=i.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:r.decimals,decimalsOut:n.decimals,balanceIn:r.balance,balanceOut:n.balance,assetInEd:r.existentialDeposit,assetOutEd:n.existentialDeposit}}validateAndBuy(t,e,i){let r=this.calculateInGivenOut(t,e),n=this.calculateTradeFee(r,i),s=Kr.toPct(i.exchangeFee),a=r+n,o=[];(e<this.minTradingLimit||r<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return a>u&&o.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:s,errors:o}}validateAndSell(t,e,i){let r=this.calculateOutGivenIn(t,e),n=this.calculateTradeFee(r,i),s=Kr.toPct(i.exchangeFee),a=r-n,o=[];(e<this.minTradingLimit||r<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return a>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:s,errors:o}}calculateInGivenOut(t,e){let i=vt.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(i);return r<0n?0n:r}calculateOutGivenIn(t,e){let i=vt.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(i);return r<0n?0n:r}spotPriceInGivenOut(t){let e=vt.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString());return this.normalizeSpot(BigInt(e),t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){let e=vt.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString());return this.normalizeSpot(BigInt(e),t.decimalsIn,t.decimalsOut)}calculateTradeFee(t,e){let i=vt.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(i)}normalizeSpot(t,e,i){let r=e-i;if(r===0)return t;let n=jr.big.pow10(Math.abs(r));return r>0?t*n:t/n}};var Qr=require("polkadot-api"),Jr=require("rxjs");var we=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,i]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:i}}async isSupported(){return(await this.api.getStaticApis()).compat.query.XYK.PoolAssets.isCompatible(Qr.CompatibilityLevel.BackwardsCompatible)}async loadPools(){let[t,e]=await Promise.all([this.api.query.XYK.PoolAssets.getEntries(),this.getPoolLimits()]),i=t.map(async({keyArgs:r,value:n})=>{let[s]=r,[a,o]=n,[l,u,p,d]=await Promise.all([this.balance.getBalance(s,a),this.api.query.AssetRegistry.Assets.getValue(a),this.balance.getBalance(s,o),this.api.query.AssetRegistry.Assets.getValue(o)]);return{address:s,type:"XYK",tokens:[{id:a,decimals:u?.decimals||this.decimals.get(a),existentialDeposit:u?.existential_deposit,balance:l.transferable,type:u?.asset_type.type},{id:o,decimals:d?.decimals||this.decimals.get(o),existentialDeposit:d?.existential_deposit,balance:p.transferable,type:d?.asset_type.type}],...e}});return Promise.all(i)}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}subscribeUpdates(){return Jr.Subscription.EMPTY}};var Ki={};R(Ki,{AavePool:()=>xe,AavePoolClient:()=>Te});var Ut=require("@galacticcouncil/common");var xe=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(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 i=new Map(this.tokens.map(s=>[s.id,s])),r=i.get(t),n=i.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:n.balance,decimalsIn:r.decimals,decimalsOut:n.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,i){let r=this.calculateInGivenOut(t,e),n=[];return e>t.balanceOut&&n.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:n}}validateAndSell(t,e,i){let r=this.calculateOutGivenIn(t,e),n=[];return r>t.balanceOut&&n.push("TradeNotAllowed"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:n}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){return Ut.big.toBigInt(1,Ut.RUNTIME_DECIMALS)}spotPriceOutGivenIn(t){return Ut.big.toBigInt(1,Ut.RUNTIME_DECIMALS)}calculateTradeFee(t,e){return 0n}};var ui=require("polkadot-api"),tn=require("@polkadot-api/utils"),et=require("rxjs"),en=require("viem"),pi=require("@galacticcouncil/common");var Zr=[{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:cs}=pi.erc20,us=["Supply","Withdraw","Repay","Borrow"],Te=class extends Q{getPoolType(){return"Aave"}async isSupported(){return!0}getPoolId(t,e){let i=t+"/"+e,r=new TextEncoder().encode(i.padEnd(32,"\0")),n=(0,tn.toHex)(r);return(0,ui.AccountId)(pi.HYDRATION_SS58_PREFIX).dec(n)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools({at:"best"})).map(async({reserve:i,atoken:r,liqudity_in:n,liqudity_out:s})=>{let[a,o,l,u]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(i),this.api.query.AssetRegistry.AssetLocations.getValue(i),this.api.query.AssetRegistry.Assets.getValue(r),this.api.query.AssetRegistry.AssetLocations.getValue(r)]);return{address:this.getPoolId(i,r),type:"Aave",tokens:[{id:i,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:n,location:o,type:a?.asset_type.type},{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:s,location:u,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,i]=t.tokens,{liqudity_in:r,liqudity_out:n}=await this.api.apis.AaveTradeExecutor.pool(e.id,i.id,{at:"best"});return t.tokens.map(s=>{let a=s.id===e.id?r:n;return{...s,balance:a}})}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:i}=e.value;return i.key}throw new Error("Invalid aave reserve multilocation")}return cs.fromAssetId(t.id)}parseRouterLog(t){let{asset_in:e,asset_out:i}=t;return{assetIn:e,assetOut:i,key:`${e}:${i}`}}parseEvmLog(t){let{topics:e,data:i}=t.log,r=e,n=ui.Binary.toHex(i);try{let{eventName:s,args:a}=(0,en.decodeEventLog)({abi:Zr,topics:r,data:n}),o=a.reserve.toLowerCase();return{eventName:s,reserve:o,key:`${s}:${o}`}}catch{return}}subscribeRouterExecuted(){let e=this.store.pools.map(i=>i.tokens).map(([i,r])=>r).map(i=>i.id);return this.api.event.Router.Executed.watch().pipe((0,et.mergeMap)(({events:i})=>i),(0,et.map)(({payload:i})=>this.parseRouterLog(i)),(0,et.filter)(({assetIn:i,assetOut:r})=>e.includes(i)||e.includes(r)),this.watchGuard("router.Execute")).subscribe(({assetIn:i,assetOut:r,key:n})=>{this.log.trace("router.Executed",n),this.store.update(async s=>{let a=[];for(let o of s){let[l,u]=o.tokens;if(u.id===i||u.id===r){let d=await this.getPoolDelta(o);a.push({...o,tokens:d})}}return a})})}subscribeEvmLog(){return this.api.event.EVM.Log.watch().pipe((0,et.mergeMap)(({events:t})=>t),(0,et.map)(({payload:t})=>this.parseEvmLog(t)),(0,et.filter)(t=>t!==void 0),(0,et.filter)(({eventName:t})=>us.includes(t)),this.watchGuard("evm.Log")).subscribe(({reserve:t,eventName:e})=>{this.log.trace(`evm.Log.${e}`,t),this.store.update(async i=>{let r=[];for(let n of i){let[s]=n.tokens;if(this.getReserveH160Id(s).toLowerCase()===t){let o=await this.getPoolDelta(n);r.push({...n,tokens:o})}}return r})})}subscribeBalances(){return et.Subscription.EMPTY}subscribeUpdates(){let t=new et.Subscription;return t.add(this.subscribeRouterExecuted()),t.add(this.subscribeEvmLog()),t}};var Qi={};R(Qi,{HsmMath:()=>at,HsmPool:()=>Ie,HsmPoolClient:()=>Oe});var X=require("@galacticcouncil/math-hsm"),at=class{static calculateCollateralInGivenHollarOut(t,e,i){return(0,X.calculate_collateral_in_given_hollar_out)(t,e,i)}static calculateCollateralOutGivenHollarIn(t,e,i){return(0,X.calculate_collateral_out_given_hollar_in)(t,e,i)}static calculateHollarOutGivenCollateralIn(t,e,i){return(0,X.calculate_hollar_out_given_collateral_in)(t,e,i)}static calculateHollarInGivenCollateralOut(t,e,i){return(0,X.calculate_hollar_in_given_collateral_out)(t,e,i)}static calculateImbalance(t,e,i){return(0,X.calculate_imbalance)(t,e,i)}static calculateBuybackLimit(t,e){return(0,X.calculate_buyback_limit)(t,e)}static calculateBuybackPriceWithFee(t,e,i){return(0,X.calculate_buyback_price_with_fee)(t,e,i)}static calculateMaxPrice(t,e){return(0,X.calculate_max_price)(t,e)}};var K=require("@galacticcouncil/common");var{FeeUtils:Vt}=O,Ie=class c extends Ft{hsmAddress;hsmMintCapacity;hollarId;hollarH160;collateralId;collateralBalance;maxBuyPriceCoefficient;maxInHolding;purchaseFee;buyBackFee;buyBackRate;static fromPool(t){return new c(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,i){let r=this.parsePair(t.assetOut,t.assetIn),n=super.calculateInGivenOut(r,e,{fee:this.fee}),s=this.calculateBuybackLimit(t);e>s&&i.push("MaxBuyBackExceeded");let a=this.calculateMaxPrice(t);return this.calculateBuyPrice(t,e,n)>a&&i.push("MaxBuyPriceExceeded"),n>this.collateralBalance&&i.push("InsufficientCollateral"),i}validateTradeHollarOut(t,e,i){return this.collateralBalance+t>this.maxInHolding&&i.push("MaxHoldingExceeded"),e>this.hsmMintCapacity&&i.push("FacilitatorCapacityExceeded"),i}validateTradeConstraints(t,e,i){let r=[];return t.assetIn===this.hollarId?this.validateTradeHollarIn(t,e,r):this.validateTradeHollarOut(e,i,r)}validateAndBuy(t,e){let i=this.calculateInGivenOut(t,e),r=this.validateTradeConstraints(t,i,e);return{amountIn:i,calculatedIn:i,amountOut:e,feePct:0,errors:r}}validateAndSell(t,e){let i=this.calculateOutGivenIn(t,e),r=this.validateTradeConstraints(t,e,i);return{amountIn:e,calculatedOut:i,amountOut:i,feePct:0,errors:r}}calculateHollarInGivenCollateralOut(t,e){let i=super.calculateInGivenOut(t,e,{fee:this.fee}),r=at.calculateHollarInGivenCollateralOut(e.toString(),i.toString(),Vt.toRaw(this.buyBackFee).toString());return BigInt(r)}calculateCollateralInGivenHollarOut(t){let e=this.getCollateralPeg(),i=at.calculateCollateralInGivenHollarOut(t.toString(),JSON.stringify(e),Vt.toRaw(this.purchaseFee).toString());return BigInt(i)}calculateInGivenOut(t,e){return t.assetOut==this.hollarId?this.calculateCollateralInGivenHollarOut(e):this.calculateHollarInGivenCollateralOut(t,e)}calculateCollateralOutGivenHollarIn(t,e){let i=super.calculateOutGivenIn(t,e,{fee:this.fee}),r=at.calculateCollateralOutGivenHollarIn(e.toString(),i.toString(),Vt.toRaw(this.buyBackFee).toString());return BigInt(r)}calculateHollarOutGivenCollateralIn(t){let e=this.getCollateralPeg(),i=at.calculateHollarOutGivenCollateralIn(t.toString(),JSON.stringify(e),Vt.toRaw(this.purchaseFee).toString());return BigInt(i)}calculateOutGivenIn(t,e){return t.assetIn==this.hollarId?this.calculateCollateralOutGivenHollarIn(t,e):this.calculateHollarOutGivenCollateralIn(e)}calculateImbalance(t){let e=this.getCollateralPeg(),i=at.calculateImbalance(t.balanceIn.toString(),JSON.stringify(e),t.balanceOut.toString());return BigInt(i)}calculateBuybackLimit(t){let e=this.calculateImbalance(t),i=at.calculateBuybackLimit(e.toString(),Vt.toRaw(this.buyBackRate).toString());return BigInt(i)}calculateBuyPrice(t,e,i){let r=at.calculateBuybackPriceWithFee(i.toString(),e.toString(),Vt.toRaw(this.buyBackFee).toString()),[n,s]=JSON.parse(r),a=K.big.pow10(t.decimalsIn+K.RUNTIME_DECIMALS-t.decimalsOut);return BigInt(n)*a/BigInt(s)}calculateMaxPrice(t){let e=this.getCollateralPeg(),i=at.calculateMaxPrice(JSON.stringify(e),this.maxBuyPriceCoefficient.toString()),[r,n]=JSON.parse(i),s=K.big.pow10(K.RUNTIME_DECIMALS-t.decimalsOut);return BigInt(r)*s/BigInt(n)}spotPriceInGivenOut(t){let e=K.big.toBigInt(1,t.decimalsOut),r=this.calculateInGivenOut(t,e)*K.big.pow10(K.RUNTIME_DECIMALS-t.decimalsOut);return this.normalizeSpotPrice(r,t.decimalsOut,t.decimalsIn)}spotPriceOutGivenIn(t){let e=K.big.toBigInt(1,t.decimalsIn),r=this.calculateOutGivenIn(t,e)*K.big.pow10(K.RUNTIME_DECIMALS-t.decimalsIn);return this.normalizeSpotPrice(r,t.decimalsIn,t.decimalsOut)}getCollateralPeg(){let t=this.tokens.findIndex(r=>r.id!==this.hollarId),e=this.pegs[t],i=this.tokens[t].decimals;return this.isDefaultPeg(e)?[K.big.toBigInt(1,18).toString(),K.big.toBigInt(1,i).toString()]:e}isDefaultPeg(t){let[e,i]=t;return Array.isArray(t)&&t.length===2&&e==="1"&&i==="1"}normalizeSpotPrice(t,e,i){let r=e-i;if(r===0)return t;let n=K.big.pow10(Math.abs(r));return r>0?t*n:t/n}};var Wt=require("polkadot-api"),nn=require("@polkadot-api/utils"),U=require("rxjs"),sn=require("viem"),mi=require("@galacticcouncil/common");var _e=[{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 Ae=class{client;constructor(t){this.client=t.getWsProvider()}async getFacilitatorCapacity(t,e){let[i,r]=await this.client.readContract({abi:_e,address:t,functionName:"getFacilitatorBucket",args:[e]});return i-r}};var{FeeUtils:ji}=O,{H160:rn}=mi.h160,ps=["FacilitatorBucketCapacityUpdated","FacilitatorBucketLevelUpdated"],Oe=class extends Q{ghoClient;stableClient;constructor(t,e,i){super(t,e),this.stableClient=i,this.ghoClient=new Ae(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:i}=e.value;return i.key}}throw Error("Invalid hollar multilocation")}getPoolAddress(t){let e=t.padEnd(32,"\0"),i=new TextEncoder().encode(e),r=(0,nn.toHex)(i);return(0,Wt.AccountId)(mi.HYDRATION_SS58_PREFIX).dec(r)}async isSupported(){return(await this.api.getStaticApis()).compat.query.HSM.Collaterals.isCompatible(Wt.CompatibilityLevel.BackwardsCompatible)}async loadPools(){let t=await this.api.constants.HSM.HollarId(),[e,i,r]=await Promise.all([this.api.query.AssetRegistry.AssetLocations.getValue(t),this.api.query.HSM.Collaterals.getEntries({at:"best"}),this.stableClient.getPools()]);if(i.length===0)return[];let n=this.getFacilitatorAddress(),s=rn.fromAny(n),a=this.getHollarAddress(e),o=await this.ghoClient.getFacilitatorCapacity(a,s),l=i.map(async({keyArgs:p,value:d})=>{let[m]=p,{pool_id:h,max_buy_price_coefficient:b,max_in_holding:g,purchase_fee:P,buy_back_fee:y,buyback_rate:v}=d,S=r.find(T=>T.id===h);if(S){let T=this.getPoolId(h),B=await this.balance.getBalance(n,m);return{...S,address:T,type:"HSM",tokens:S.tokens.filter(H=>H.id!==h),hsmAddress:n,hsmMintCapacity:o,hollarId:t,hollarH160:a,collateralId:m,collateralBalance:B.transferable,maxBuyPriceCoefficient:b,maxInHolding:g,purchaseFee:ji.fromPermill(P),buyBackFee:ji.fromPermill(y),buyBackRate:ji.fromPerbill(v)}}});return(await Promise.all(l)).filter(p=>p!==null)}async getPoolFees(){return{}}parseEvmLog(t){let{topics:e,data:i}=t.log,r=e,n=Wt.Binary.toHex(i);try{let{eventName:s,args:a}=(0,sn.decodeEventLog)({abi:_e,topics:r,data:n}),o=a.facilitatorAddress.toLowerCase();return{eventName:s,facilitator:o,key:`${s}:${o}`}}catch{return}}subscribeEvmLog(){return this.api.event.EVM.Log.watch().pipe((0,U.mergeMap)(({events:t})=>t),(0,U.map)(({payload:t})=>this.parseEvmLog(t)),(0,U.filter)(t=>t!==void 0),(0,U.filter)(({eventName:t})=>ps.includes(t)),this.watchGuard("evm.Log")).subscribe(({eventName:t,facilitator:e})=>{this.log.trace(`evm.Log.${t}`,e),this.store.update(async i=>{let r=[],[{hsmAddress:n,hollarH160:s}]=i,a=rn.fromAny(n);if(a.toLowerCase()===e){let l=await this.ghoClient.getFacilitatorCapacity(s,a);for(let u of i)r.push({...u,hsmMintCapacity:l})}return r})})}subscribeCollateralBalance(){let t=[],e=[];this.store.pools.forEach(n=>{let{tokens:s,collateralId:a}=n;s.find(l=>l.id===a).type==="Erc20"?e.push(a):t.push(a)});let[{hsmAddress:i}]=this.store.pools,r=[];if(t.length>0){let n=this.balance.watchTokensBalance(i);r.push(n)}if(e.length>0){let n=this.balance.watchErc20Balance(i,e);r.push(n)}return r.length>0?(0,U.combineLatest)(r).pipe((0,U.map)(n=>n.flat()),(0,U.pairwise)(),(0,U.map)(([n,s])=>this.balance.getDeltas(n,s)),this.watchGuard("balances")).subscribe(n=>{this.store.update(s=>{let a=[],o=new Map(s.map(l=>[l.collateralId,l]));return n.forEach(({id:l,balance:u})=>{let p=o.get(l);p&&(this.log.trace("balances",{id:l,balance:u}),a.push({...p,collateralBalance:u.transferable}))}),a})}):U.Subscription.EMPTY}subscribeStableswapUpdates(){return this.stableClient.getSubscriber().pipe(this.watchGuard("stableswap.updates")).subscribe(t=>{let e=new Map(t.map(i=>[i.id,i]));this.store.update(i=>{let r=[];for(let n of i){let s=e.get(n.id);s&&r.push({...n,fee:s.fee,tokens:s.tokens.filter(a=>a.id!==n.id),totalIssuance:s.totalIssuance,pegs:s.pegs,amplification:s.amplification,isRampPeriod:s.isRampPeriod})}return r})})}subscribeBalances(){return U.Subscription.EMPTY}subscribeUpdates(){let t=new U.Subscription;return t.add(this.subscribeCollateralBalance()),t.add(this.subscribeStableswapUpdates()),t.add(this.subscribeEvmLog()),t}};var zt=class{static get(t){switch(t.type){case"Aave":return xe.fromPool(t);case"XYK":return ve.fromPool(t);case"Omnipool":return ye.fromPool(t);case"LBP":return he.fromPool(t);case"Stableswap":return Ft.fromPool(t);case"HSM":return Ie.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var an=require("@galacticcouncil/common"),ct=require("rxjs");var{logger:ms}=an.log,Yt=class extends L{evm;aave;omnipool;stableswap;hsm;xyk;lbp;active=new Set([]);pools=new Map([]);clients=[];aaveSub=ct.Subscription.EMPTY;omniSub=ct.Subscription.EMPTY;stableSub=ct.Subscription.EMPTY;hsmSub=ct.Subscription.EMPTY;xykSub=ct.Subscription.EMPTY;lbpSub=ct.Subscription.EMPTY;isReady=!1;isDestroyed=new ct.Subject;constructor(t,e){super(t),this.evm=e,this.aave=new Te(t,e),this.omnipool=new fe(t,e),this.stableswap=new Se(t,e),this.hsm=new Oe(t,e,this.stableswap),this.xyk=new we(t,e),this.lbp=new be(t,e),this.clients=[this.aave,this.omnipool,this.stableswap,this.hsm,this.xyk,this.lbp]}subscribe(t){return t.getSubscriber().pipe((0,ct.takeUntil)(this.isDestroyed)).subscribe(e=>{e.forEach(i=>{this.pools.set(i.address,i)})})}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.active.has("Stableswap")||(ms.info("[PoolContextProvider] auto-activating stableswap"),this.withStableswap()),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 i=this.clients.find(r=>r.getPoolType()===e.type);if(i)return i.getPoolFees(t,e.address);throw new se(e.type)}};var sr={};R(sr,{DCA_TIME_RESERVE:()=>cn,DEFAULT_BLOCK_TIME:()=>ln,DEFAULT_MIN_BUDGET:()=>er,ORDER_MIN_BLOCK_PERIOD:()=>un,Router:()=>$t,TWAP_EXECUTION_INTERVAL:()=>Ce,TWAP_MAX_DURATION:()=>rr,TWAP_MAX_PRICE_IMPACT:()=>ir,TWAP_TX_MULTIPLIER:()=>lm,TradeOrderError:()=>tr,TradeOrderType:()=>gi,TradeRouteBuilder:()=>it,TradeRouter:()=>_t,TradeScheduler:()=>Xt,TradeType:()=>di});var Be=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 ds=10,Fe=class{isNotVisited(t,e){let i=!0;return e.forEach(r=>{(r[0]===t[0]||r[1]===t[1])&&(i=!1)}),i}findPaths(t,e,i){let r=[],n=new Be,s=[];for(s.push([e,""]),n.enqueue(s);n.size()>0;){let a=n.dequeue();if(!a||a.length>ds)continue;let o=a[a.length-1];(i===null||o[0]===i)&&r.push(a),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,a)){let p=[...a];p.push(u),n.enqueue(p)}})}return r}findShortestPaths(t,e,i){let r=[],n=new Be,s=[];s.push([e,""]),n.enqueue(s);let a=1/0;for(;n.size()>0;){let o=n.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===i){o.length<a?(a=o.length,r.length=0,r.push(o)):o.length===a&&r.push(o);continue}let u=t.get(l[0]);for(let p of u??[])this.isNotVisited(p,o)&&n.enqueue([...o,p])}return r}buildAndPopulateGraph(t,e){let i=new Map;for(let r of t)i.set(parseInt(r),[]);for(let[r,n,s]of e)i.get(n)?.push([s,r]);return i}};function Zi(c){let t={};for(let e of c){let i=e.tokens.length;for(let r=0;r<i;r++){t[e.tokens[r].id]||(t[e.tokens[r].id]=[]);for(let n=0;n<i;n++){if(r==n)continue;let s=[e.address,e.tokens[r].id,e.tokens[n].id];t[e.tokens[r].id].push(s)}}}return t}var Re=class{getProposals(t,e,i){let r=i.filter(g=>g.type==="XYK"),n=i.filter(g=>g.type!=="XYK"),s=new Set(n.map(g=>g.tokens).flat().map(g=>g.id)),a=s.has(t),o=s.has(e),l=new Fe,u=g=>{let P=Zi(g),y=Object.keys(P),v=y.flatMap(S=>P[S]);return l.buildAndPopulateGraph(y,v)};if(!a&&!o){let g=r.filter(v=>v.tokens.find(S=>S.id===t)||v.tokens.find(S=>S.id===e)),P=u(g),y=l.findPaths(P,t,e);return this.parsePaths(y)}if(a&&o){let g=u(n),P=l.findPaths(g,t,e);return this.parsePaths(P)}let p=a?e:t,d=r.filter(g=>g.tokens.some(P=>P.id===p));if(d.length===0)return[];let m=[...n,...d],h=u(m),b=l.findPaths(h,t,e);return this.parsePaths(b)}parsePaths(t){let e=[];for(let i of t){let r=[];for(let n=0;n<i.length;n++){let s=i[n],a=i[n+1];if(a==null)break;r.push(this.toEdge(s,a))}e.push(r)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var $t=class{routeSuggester;routeProposals;ctx;filter={};constructor(t){this.ctx=t,this.routeSuggester=new Re,this.routeProposals=new Map}async withFilter(t){this.filter=t||{},this.routeProposals.clear(),this.onFilterChanged()}onFilterChanged(){}buildRouteKey(t,e,i){return`${t}->${e}::${i.length}`}applyPoolFilter(t){let{useOnly:e=[],exclude:i=[]}=this.filter,r=new Set(e),n=new Set(i);return t.filter(s=>n.has(s.type)?!1:r.size>0?r.has(s.type):!0)}async getPools(){let t=await this.ctx.getPools();return this.applyPoolFilter(t)}async getRoutes(t,e){let i=await this.getPools();return this.validateInput(t,e,i),this.getPaths(t,e,i)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}async getRouteableAssets(t){let e=await this.getTradeableAssets();return(await Promise.all(e.filter(r=>r!==t).map(r=>this.getRoutes(r,t)))).filter(r=>r.length>0).map(([r])=>r[0].assetIn).sort()}validateInput(t,e,i){if(i.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let r=this.getAssets(i);if(!r.has(t))throw new Error(t+" is not supported asset");if(!r.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(i)}getAssets(t){let e=t.map(i=>i.tokens.map(r=>r.id)).flat().sort((i,r)=>i>r?1:-1);return new Set(e)}getPaths(t,e,i){let r=this.toPoolsMap(i);return this.getProposals(t,e,i).filter(s=>this.validPath(s,r)).map(s=>this.toHops(s,r))}getProposals(t,e,i){let r=this.buildRouteKey(t,e,i);if(this.routeProposals.has(r))return this.routeProposals.get(r);let n=this.routeSuggester.getProposals(t,e,i);return this.routeProposals.set(r,n),n}validPath(t,e){return t.length>0&&t.map(i=>this.validEdge(i,e)).reduce((i,r)=>i&&r)}validEdge([t,e,i],r){return r.get(t)?.validatePair(e,i)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,zt.get(e)]))}toHops(t,e){return t.map(([i,r,n])=>{let s=e.get(i);return{poolAddress:i,poolId:s?.id,pool:s?.type,assetIn:r,assetOut:n}})}};var A=require("@galacticcouncil/common");var di=(e=>(e.Buy="Buy",e.Sell="Sell",e))(di||{}),gi=(i=>(i.Dca="Dca",i.TwapSell="TwapSell",i.TwapBuy="TwapBuy",i))(gi||{}),tr=(i=>(i.OrderTooSmall="OrderTooSmall",i.OrderTooBig="OrderTooBig",i.OrderImpactTooBig="OrderImpactTooBig",i))(tr||{});var{FeeUtils:on}=O,_t=class extends $t{mlr;constructor(t){super(t),this.mlr=new Map}onFilterChanged(){this.mlr.clear()}buildCtxSync(t,e,i){let r=super.validateInput(t,e,i),n=super.getPaths(t,e,i);if(!n.length)throw new ae(t,e);return{paths:n,pools:i,poolsMap:r}}async withCtx(t,e,i){let r=await super.getPools(),n=this.buildCtxSync(t,e,r);return i(n)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((i,r)=>{let n=i[i.length-1].amountOut,s=r[r.length-1].amountOut;return n>s?-1:1});return e.find(i=>i.every(r=>r.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(i=>i.tradeFeeRange).length>0){let i=t.map(n=>n.tradeFeeRange?.[0]??n.tradeFeePct).reduce((n,s)=>n+s),r=t.map(n=>n.tradeFeeRange?.[1]??n.tradeFeePct).reduce((n,s)=>n+s);return[i,r]}}getPoolFeeRange(t,e){let i=t.min?on.toPct(t.min):void 0,r=t.max?on.toPct(t.max):void 0;if(i&&r)return[i,Math.max(r,e)]}async getBestSell(t,e,i){return this.getSell(t,e,i)}getSellSpot(t){let e=t[t.length-1];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getSell(t,e,i,r){return this.withCtx(t,e,async({paths:n,poolsMap:s})=>{let a;if(r)a=await this.toSellSwaps(i,r,s);else{let o=n.map(u=>this.toSellSwaps(i,u,s)),l=await Promise.all(o);a=this.findBestSellRoute(l)}return this.buildSell(s,a)})}async getSells(t,e,i){return this.withCtx(t,e,async({paths:r,poolsMap:n})=>{let s=r.map(o=>this.toSellSwaps(i,o,n));return(await Promise.all(s)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildSell(n,o)).sort((o,l)=>o.amountOut>l.amountOut?-1:1)})}buildSell(t,e){let i=e[0],r=e[e.length-1],n=this.isDirectTrade(e),s=this.getSellSpot(e),a=r.amountOut,o=n?r.calculatedOut:this.calculateDelta0Y(i.amountIn,e,t),l=o-a,u=this.getRouteFeeRange(e),p=n?r.tradeFeePct:z.calculateSellFee(o,a),d=N.mulSpot(i.amountIn,s,i.assetInDecimals,r.assetOutDecimals),m=z.calculateDiffToRef(o,d);return{type:"Sell",amountIn:i.amountIn,amountOut:r.amountOut,spotPrice:s,tradeFee:l,tradeFeePct:p,tradeFeeRange:u,priceImpactPct:m,swaps:e,toHuman(){return{type:"Sell",amountIn:A.big.toDecimal(i.amountIn,i.assetInDecimals),amountOut:A.big.toDecimal(r.amountOut,r.assetOutDecimals),spotPrice:A.big.toDecimal(s,A.RUNTIME_DECIMALS),tradeFee:A.big.toDecimal(l,r.assetOutDecimals),tradeFeePct:p,tradeFeeRange:u,priceImpactPct:m,swaps:e.map(h=>h.toHuman())}}}}calculateSpot(t){return t.map(e=>e.spotPrice).reduce((e,i)=>e*i/10n**BigInt(A.RUNTIME_DECIMALS))}calculateDelta0Y(t,e,i){let r=[];for(let n=0;n<e.length;n++){let s=e[n],a=i.get(s.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(s.assetIn,s.assetOut),l;n>0?l=r[n-1]:l=t;let u=a.calculateOutGivenIn(o,l);r.push(u)}return r[r.length-1]}async calculateMostLiquidRoute(t,e,i){let{paths:r,pools:n,poolsMap:s}=i,l=n.filter(b=>b.tokens.some(g=>g.id===t)).map(b=>b.type==="Aave"?b.tokens:b.tokens.filter(g=>g.id===t)).map(b=>b.map(g=>g.balance).reduce((g,P)=>g+P)).sort((b,g)=>g<b?-1:1)[0],u=N.getFraction(l,.1),p=await Promise.all(r.map(b=>this.toSellSwaps(u,b,s))),m=this.findBestSellRoute(p).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),h=this.buildRouteKey(t,e,n);return this.mlr.set(h,m),m}async toSellSwaps(t,e,i){let r=[];for(let n=0;n<e.length;n++){let s=e[n],a=i.get(s.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(s.assetIn,s.assetOut),l;n>0?l=r[n-1].amountOut:l=typeof t=="string"?A.big.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(o,a),{amountOut:p,calculatedOut:d,feePct:m,errors:h}=a.validateAndSell(o,l,u),b=this.getPoolFeeRange(u,m),g=a.spotPriceOutGivenIn(o),P=N.mulSpot(l,g,o.decimalsIn,o.decimalsOut),y=z.calculateDiffToRef(d,P);r.push({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:p,calculatedOut:d,spotPrice:g,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:y,errors:h,isSupply(){return a.type==="Aave"&&a.tokens[0].id===s.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===s.assetIn},toHuman(){return{...s,amountIn:A.big.toDecimal(l,o.decimalsIn),amountOut:A.big.toDecimal(p,o.decimalsOut),calculatedOut:A.big.toDecimal(d,o.decimalsOut),spotPrice:A.big.toDecimal(g,A.RUNTIME_DECIMALS),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:y,errors:h}}})}return r}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async i=>{let r=this.buildRouteKey(t,e,i.pools),n=this.mlr.get(r);return n||this.calculateMostLiquidRoute(t,e,i)})}async getSpotPrice(t,e){return this.withCtx(t,e,async i=>{let{pools:r,poolsMap:n}=i,s=this.buildRouteKey(t,e,r),a=this.mlr.get(s);a||(a=await this.calculateMostLiquidRoute(t,e,i));let o=await this.toSellSwaps("1",a,n);return{amount:this.getSellSpot(o),decimals:A.RUNTIME_DECIMALS}}).catch(()=>{})}findBestBuyRoute(t){let e=t.sort((i,r)=>{let n=i[0].amountIn,s=r[0].amountIn;return n>s?1:-1});return e.find(i=>i.every(r=>r.errors.length==0))||e[0]}async getBestBuy(t,e,i){return this.getBuy(t,e,i)}getBuySpot(t){let e=t[0];return t.length===1?e.spotPrice:this.calculateSpot(t)}async getBuy(t,e,i,r){return this.withCtx(t,e,async({paths:n,poolsMap:s})=>{let a;if(r)a=await this.toBuySwaps(i,r,s);else{let o=n.map(u=>this.toBuySwaps(i,u,s)),l=await Promise.all(o);a=this.findBestBuyRoute(l)}return this.buildBuy(s,a)})}async getBuys(t,e,i){return this.withCtx(t,e,async({paths:r,poolsMap:n})=>{let s=r.map(o=>this.toBuySwaps(i,o,n));return(await Promise.all(s)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildBuy(n,o)).sort((o,l)=>o.amountIn>l.amountIn?1:-1)})}buildBuy(t,e){let i=e[e.length-1],r=e[0],n=this.isDirectTrade(e),s=this.getBuySpot(e),a=r.amountIn,o=n?r.calculatedIn:this.calculateDelta0X(i.amountOut,e,t),l=a-o,u=this.getRouteFeeRange(e),p=n?r.tradeFeePct:z.calculateBuyFee(o,a),d=N.mulSpot(i.amountOut,s,i.assetOutDecimals,r.assetInDecimals),m;return o===0n?m=-100:m=z.calculateDiffToRef(d,o),{type:"Buy",amountOut:i.amountOut,amountIn:r.amountIn,spotPrice:s,tradeFee:l,tradeFeePct:p,tradeFeeRange:u,priceImpactPct:m,swaps:e,toHuman(){return{type:"Buy",amountOut:A.big.toDecimal(i.amountOut,i.assetOutDecimals),amountIn:A.big.toDecimal(r.amountIn,r.assetInDecimals),spotPrice:A.big.toDecimal(s,A.RUNTIME_DECIMALS),tradeFee:A.big.toDecimal(l,r.assetInDecimals),tradeFeePct:p,tradeFeeRange:u,priceImpactPct:m,swaps:e.map(h=>h.toHuman())}}}}calculateDelta0X(t,e,i){let r=[];for(let n=e.length-1;n>=0;n--){let s=e[n],a=i.get(s.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(s.assetIn,s.assetOut),l;n==e.length-1?l=t:l=r[0];let u=a.calculateInGivenOut(o,l);r.unshift(u)}return r[0]}async toBuySwaps(t,e,i){let r=[];for(let n=e.length-1;n>=0;n--){let s=e[n],a=i.get(s.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(s.assetIn,s.assetOut),l;n==e.length-1?l=typeof t=="string"?A.big.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let u=await this.ctx.getPoolFees(o,a),{amountIn:p,calculatedIn:d,feePct:m,errors:h}=a.validateAndBuy(o,l,u),b=this.getPoolFeeRange(u,m),g=a.spotPriceInGivenOut(o),P=N.mulSpot(l,g,o.decimalsOut,o.decimalsIn),y;d===0n?y=-100:y=z.calculateDiffToRef(P,d),r.unshift({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:p,calculatedIn:d,spotPrice:g,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:y,errors:h,isSupply(){return a.type==="Aave"&&a.tokens[0].id===s.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===s.assetIn},toHuman(){return{...s,amountOut:A.big.toDecimal(l,o.decimalsOut),amountIn:A.big.toDecimal(p,o.decimalsIn),calculatedIn:A.big.toDecimal(d,o.decimalsIn),spotPrice:A.big.toDecimal(g,A.RUNTIME_DECIMALS),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:y,errors:h}}})}return r}};var V=require("@galacticcouncil/common");var ln=6e3,er=1000000000000000n,Ce=6,ir=-5,rr=216e5,lm=3,cn=.1,un=6;var nr=require("polkadot-api");var it=class{static build(t){return t.map(({assetIn:e,assetOut:i,pool:r,poolId:n})=>r==="Stableswap"?{pool:(0,nr.Enum)("Stableswap",n),asset_in:e,asset_out:i}:{pool:(0,nr.Enum)(r),asset_in:e,asset_out:i})}};var Xt=class{schedulerOptions;router;constructor(t,e={}){this.router=new _t(t),this.router.withFilter({exclude:["HSM"]}),this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??er})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,i,r,n){let s=await this.router.getBestSell(t,e,i),{amountIn:a,swaps:o,priceImpactPct:l}=s,u=o[0],p=o[o.length-1],{assetInDecimals:d}=u,{assetOutDecimals:m}=p,h=Math.abs(l),b=await this.getMinimumOrderBudget(t,d),g=this.getOptimalTradeCount(h),P=this.getMaximumTradeCount(a,b,r),y=n||Math.min(g,P),v=Math.round(r/y),S=a/BigInt(y),T=await this.router.getBestSell(t,e,S),B=a<b,H=[];B&&H.push("OrderTooSmall");let W=T.amountOut*BigInt(y),ut=this.toBlockPeriod(v),yt=T.tradeFee*BigInt(y),Z=it.build(o),nt={assetIn:t,assetOut:e,errors:H,maxTradeCount:P,tradeCount:y,tradeFee:yt,tradeImpactPct:T.priceImpactPct,tradePeriod:ut,tradeRoute:Z,type:"Dca"};return{...nt,amountIn:a,amountOut:W,tradeAmountIn:T.amountIn,tradeAmountOut:T.amountOut,toHuman(){return{...nt,amountIn:V.big.toDecimal(a,d),amountOut:V.big.toDecimal(W,m),tradeAmountIn:V.big.toDecimal(T.amountIn,d),tradeAmountOut:V.big.toDecimal(T.amountOut,m)}}}}async getMinimumOrderBudget(t,e){if(0===t)return this.minOrderBudget;let i=await this.router.getSpotPrice(0,t);if(i)return N.mulSpot(this.minOrderBudget,i.amount,12,e);let r=await this.router.getSpotPrice(t,0);if(r)return N.divSpot(this.minOrderBudget,r.amount,12,e);throw new Error("Unable to calculate order budget")}getMaximumTradeCount(t,e,i){let r=e*2n/10n;if(r===0n)return 0;let n=Number(t/r),s=Math.floor(i/this.blockTime),a=Math.max(0,Math.floor(s*(1-.1)));return Math.min(n,a)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getOpenBudgetDcaOrder(t,e,i,r){let n=await this.router.getBestSell(t,e,i),{swaps:s}=n,a=s[0],o=s[s.length-1],{assetInDecimals:l}=a,{assetOutDecimals:u}=o,p=await this.getMinimumOrderBudget(t,l),d=n.amountIn<p,m=[];d&&m.push("OrderTooSmall");let h=this.toBlockPeriod(r),b=it.build(s),g={assetIn:t,assetOut:e,errors:m,maxTradeCount:0,tradeCount:0,tradeFee:n.tradeFee,tradeImpactPct:n.priceImpactPct,tradePeriod:h,tradeRoute:b,type:"Dca"};return{...g,amountIn:0n,amountOut:0n,tradeAmountIn:n.amountIn,tradeAmountOut:n.amountOut,toHuman(){return{...g,amountIn:"0",amountOut:"0",tradeAmountIn:V.big.toDecimal(n.amountIn,l),tradeAmountOut:V.big.toDecimal(n.amountOut,u)}}}}async getTwapSellOrder(t,e,i){let r=await this.router.getBestSell(t,e,i),{amountIn:n,swaps:s,priceImpactPct:a}=r,o=s[0],l=s[s.length-1],{assetInDecimals:u}=o,{assetOutDecimals:p}=l,d=Math.abs(a),m=this.getTwapTradeCount(d),h=n/BigInt(m),[b,g]=await Promise.all([this.getMinimumOrderBudget(t,u),this.router.getBestSell(o.assetIn,l.assetOut,h)]),P=m===1,y=n<b,v=g.priceImpactPct<-5,S=[];y||P?S.push("OrderTooSmall"):v&&S.push("OrderImpactTooBig");let T=g.amountOut*BigInt(m),B=g.tradeFee*BigInt(m),H=it.build(s),W={assetIn:t,assetOut:e,errors:S,tradeCount:m,tradeImpactPct:g.priceImpactPct,tradePeriod:6,tradeRoute:H,type:"TwapSell"};return{...W,amountIn:n,amountOut:T,tradeAmountIn:g.amountIn,tradeAmountOut:g.amountOut,tradeFee:B,toHuman(){return{...W,amountIn:V.big.toDecimal(n,u),amountOut:V.big.toDecimal(T,p),tradeAmountIn:V.big.toDecimal(g.amountIn,u),tradeAmountOut:V.big.toDecimal(g.amountOut,p),tradeFee:V.big.toDecimal(B,p)}}}}async getTwapBuyOrder(t,e,i){let r=await this.router.getBestBuy(t,e,i),{amountOut:n,swaps:s,priceImpactPct:a}=r,o=s[0],l=s[s.length-1],{assetInDecimals:u}=o,{assetOutDecimals:p}=l,d=Math.abs(a),m=this.getTwapTradeCount(d),h=n/BigInt(m),[b,g]=await Promise.all([this.getMinimumOrderBudget(t,u),this.router.getBestBuy(o.assetIn,l.assetOut,h)]),P=g.amountIn*BigInt(m),y=m===1,v=P<b,S=g.priceImpactPct<-5,T=[];v||y?T.push("OrderTooSmall"):S&&T.push("OrderImpactTooBig");let B=g.tradeFee*BigInt(m),H=it.build(s),W={assetIn:t,assetOut:e,errors:T,tradeCount:m,tradeImpactPct:g.priceImpactPct,tradePeriod:6,tradeRoute:H,type:"TwapBuy"};return{...W,amountIn:P,amountOut:n,tradeAmountIn:g.amountIn,tradeAmountOut:g.amountOut,tradeFee:B,toHuman(){return{...W,amountIn:V.big.toDecimal(P,u),amountOut:V.big.toDecimal(n,p),tradeAmountIn:V.big.toDecimal(g.amountIn,u),tradeAmountOut:V.big.toDecimal(g.amountOut,p),tradeFee:V.big.toDecimal(B,u)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let r=216e5/(this.blockTime*6);return Math.round(r)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,i=Math.round(e);return Math.max(i,6)}};var lr={};R(lr,{BIG_10:()=>bn,BIG_BILL:()=>ar,StakingApi:()=>Ee,StakingClient:()=>ke});var j=require("@galacticcouncil/math-staking"),rt=wt(require("big.js"));var hi={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},pn=c=>Object.keys(hi).includes(c);var mn=require("polkadot-api"),dn=require("@polkadot-api/utils"),gn=require("@galacticcouncil/common");function hn(c){let t=("modl"+c).padEnd(32,"\0"),e=new TextEncoder().encode(t),i=(0,dn.toHex)(e);return(0,mn.AccountId)(gn.HYDRATION_SS58_PREFIX).dec(i)}var bi="20000000000000000",yi="2000",bn=(0,rt.default)(10),ar=(0,rt.default)(bn.pow(12)),Ee=class{client;balance;constructor(t,e){this.client=t,this.balance=e}async getPotBalance(){let t=await this.client.getPalletId(),e=hn(t);return await this.balance.getBalance(e,0)}async getStakingPosition(t){let[e,i]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]);if(!e)return;let r=e.created_at,n=await i.reduce(async(s,[a,o])=>{let l=await s,u=a,p=o.amount,d=o.conviction.type.toLowerCase(),m=await this.client.getReferendumInfo(u);return m&&(m.type==="Approved"||m.type==="Rejected")&&pn(d)&&l.push({id:u,amount:p,conviction:d}),l},Promise.resolve([]));return{stake:e.stake,rewardPerStake:e.reward_per_stake,createdAt:r,actionPoints:e.action_points,accumulatedUnpaidRewards:e.accumulated_unpaid_rewards,accumulatedSlashPoints:e.accumulated_slash_points,accumulatedLockedRewards:e.accumulated_locked_rewards,votes:n}}async getStake(t){let e=await this.client.getNFTCollectionId(),[i,r]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),n=r.find(s=>s)?.itemId;return{totalStake:i?.total_stake,accumulatedRewardPerStake:i?.accumulated_reward_per_stake,potReservedBalance:i?.pot_reserved_balance,positionId:n,stakePosition:n?await this.getStakingPosition(n):void 0}}getCurrentActionPoints(t,e,i,r){let n=(0,rt.default)(0),s=(0,rt.default)(0),a=hi.locked6x,o=(0,rt.default)(i.toString()).mul(a),l=100,u=[];t.forEach(m=>{let h=hi[m.conviction],b=r.includes(m.id.toString());b&&u.push(m.id.toString());let g=(0,rt.default)(m.amount.toString()).mul(l).div(o);n=n.plus(Math.floor(g.mul(h).toNumber())),s=s.plus(Math.floor(g.mul(b?a:h).toNumber()))});let p=Math.floor((0,rt.default)(i.toString()).mul(a).mul(l).div(o).toNumber());r.forEach(m=>{u.includes(m)||(s=s.plus(p))});let d={democracyVote:1};return n=n.mul(d.democracyVote),n=n.plus(e.toString()||"0"),s=s.mul(d.democracyVote),s=s.plus(e.toString()||"0"),{currentActionPoints:n.toString(),maxActionPoints:s.toString()}}async getRewards(t,e,i){let r=await this.getStake(t),{potReservedBalance:n,accumulatedRewardPerStake:s,totalStake:a,stakePosition:o}=r;if(!o)return;let[l,u,p,d,m,h,b]=await Promise.all([this.getPotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getTimePointsPerPeriod(),this.client.getTimePointsWeight(),this.client.getActionPointsWeight(),this.client.getSixBlockSince()]),g=(0,rt.default)(l.transferable.toString()).minus(n.toString()),P=g.gt(0)&&a>0?(0,j.calculate_accumulated_rps)(s.toString(),g.toString(),a.toString()):s.toString(),y=(0,j.calculate_period_number)(u.toString(),i,b),v=(0,j.calculate_period_number)(u.toString(),o.createdAt.toString(),b),S=(0,j.calculate_rewards)(P,o.rewardPerStake.toString(),o.stake.toString()),T=this.getCurrentActionPoints(o.votes,o.actionPoints,o.stake,e),B=(0,j.calculate_points)(v,y,d.toString(),m.toString(),T.currentActionPoints,h.toString(),o.accumulatedSlashPoints.toString()),H=(0,j.sigmoid)(B,bi,yi),W=(()=>{if(!e.length)return;let Qt=(0,j.calculate_points)(v,y,d.toString(),m.toString(),T.maxActionPoints.toString(),h.toString(),o.accumulatedSlashPoints.toString());return(0,j.sigmoid)(Qt,bi,yi)})(),ut=(0,rt.default)(S).plus(o.accumulatedUnpaidRewards.toString()).plus(o.accumulatedLockedRewards.toString());if((0,rt.default)(y).minus(v).lte(p.toString()))return{rewards:"0",payablePercentage:H,extraPayablePercentage:W,constants:{a:bi,b:yi}};let yt=(0,j.calculate_percentage_amount)(ut.toString(),H),Z=(0,rt.default)(o.accumulatedLockedRewards.toString()),nt=Z.gt(yt)?Z:(0,rt.default)(yt);return{rewards:nt.div(ar).toString(),maxRewards:ut.div(ar).toString(),allocatedRewardsPercentage:nt.div(ut).mul(100).toNumber(),points:B,payablePercentage:H,extraPayablePercentage:W,constants:{a:bi,b:yi}}}};var or=require("polkadot-api");var ke=class extends L{async getPalletId(){let t=this.api.constants.Staking.PalletId,e=await t();return or.Binary.toText(or.Binary.fromHex(e))}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:s})=>{let[a,o,l]=s;return{address:a,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async 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 ur={};R(ur,{TxBuilderFactory:()=>jt});var cr=require("polkadot-api");function yn(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var Kt=class extends L{evm;evmClient;balance;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balance=new pt(t),this.aaveUtils=new At(e)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:i=>this.dryRun(i,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:_i})}async dryRun(t,e){let i=(0,cr.Enum)("Signed",t),r=(0,cr.Enum)("system",i),s=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,e.decodedCall,4),a=s.success&&!s.value.execution_result.success?s.value.execution_result.value.error:null;if(a){let o=a.type==="Module"?yn(a.value):a.type;throw new Error("Dry run execution error!",{cause:o})}return s}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var fi=class extends Kt{_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:i}=this.trade;if(i==="Buy")return this.buildBuyTx();let{assetIn:r}=e[0],n=await this.balance.getBalance(this.beneficiary,r);return t>=n.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:i}=this.trade,r=i[0],n=i[i.length-1],s=N.getFraction(t,this.slippagePct),a=r.assetIn,o=n.assetOut,l=t+s,u;return this.isDirectOmnipoolTrade(i)?u=this.api.tx.Omnipool.buy({asset_in:a,asset_out:o,amount:e,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:a,asset_out:o,amount_out:e,max_amount_in:l,route:it.build(i)}),await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("RouterBuy",u)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:i}=this.trade,r=i[0],n=i[i.length-1],s=N.getFraction(e,this.slippagePct),a=r.assetIn,o=n.assetOut,l=e-s,u;return this.isDirectOmnipoolTrade(i)?u=this.api.tx.Omnipool.sell({asset_in:a,asset_out:o,amount:t,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:a,asset_out:o,amount_in:t,min_amount_out:l,route:it.build(i)}),await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("RouterSell",u)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,i=e[0],r=e[e.length-1],n=N.getFraction(t,this.slippagePct),s=i.assetIn,a=r.assetOut,o=t-n,l=this.api.tx.Router.sell_all({asset_in:s,asset_out:a,min_amount_out:o,route:it.build(e)});return await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var Pi=require("polkadot-api");var Si=class extends Kt{_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}`)}}async buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:i,tradeAmountIn:r,tradePeriod:n,tradeRoute:s}=this.order,a=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:n,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Pi.Enum)("Sell",{asset_in:e,asset_out:i,amount_in:r,min_amount_out:0n,route:s})},start_execution_block:void 0});return await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(a=await this.dispatchWithExtraGas(a)),this.wrapTx("DcaSchedule",a)}async buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:i,tradeAmountIn:r,tradeAmountOut:n,tradePeriod:s,tradeRoute:a}=this.order,o=N.getFraction(n,this.slippagePct),l=n-o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Pi.Enum)("Sell",{asset_in:e,asset_out:i,amount_in:r,min_amount_out:l,route:a})},start_execution_block:void 0});return await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("DcaSchedule.twapSell",u)}async buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:i,tradeAmountIn:r,tradeAmountOut:n,tradePeriod:s,tradeRoute:a}=this.order,o=N.getFraction(r,this.slippagePct),l=r+o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Pi.Enum)("Buy",{asset_in:e,asset_out:i,amount_out:n,max_amount_in:l,route:a})},start_execution_block:void 0});return await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("DcaSchedule.twapBuy",u)}};var jt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new fi(this.client,this.evmClient).setTrade(t)}order(t){return new Si(this.client,this.evmClient).setOrder(t)}};async function gs(c){let t=new Lt(c),e=new le(c),[i,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),n=new Yt(c,e).withAave().withOmnipool().withStableswap().withXyk(),s=new pt(c),a=new ke(c),o=new ge(c),l=new At(e),u=new _t(n),p=new Xt(n,{blockTime:i,minBudgetInNative:r}),d=new Ee(a,s),m=new me(o,s,{blockTime:i});return{api:{aave:l,router:u,scheduler:p,staking:d,farm:m},client:{asset:new Et(c),balance:s,evm:e},ctx:{pool:n},tx:new jt(c,e),destroy:()=>{n.destroy()}}}0&&(module.exports={QueryBus,aave,api,async,calc,client,const:null,createSdkContext,error,evm,farm,fmt,json,math,pool,sor,staking,tx});