@galacticcouncil/sdk-next 0.28.0 → 0.29.0

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