@galacticcouncil/sdk 10.5.0 → 10.6.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,2 +1,2 @@
1
- "use strict";var Bt=Object.defineProperty;var Rr=Object.getOwnPropertyDescriptor;var Er=Object.getOwnPropertyNames;var Nr=Object.prototype.hasOwnProperty;var _r=(u,e)=>{for(var t in e)Bt(u,t,{get:e[t],enumerable:!0})},Cr=(u,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Er(e))!Nr.call(u,s)&&s!==t&&Bt(u,s,{get:()=>e[s],enumerable:!(r=Rr(e,s))||r.enumerable});return u};var kr=u=>Cr(Bt({},"__esModule",{value:!0}),u);var ns={};_r(ns,{AaveClient:()=>ce,AavePool:()=>Ne,AavePoolClient:()=>ke,AaveUtils:()=>ee,AssetClient:()=>te,AssetNotFound:()=>Nt,BASILISK_PARACHAIN_ID:()=>bs,BalanceClient:()=>W,BalanceClientV2:()=>me,BigNumber:()=>S.BigNumber,CachingPoolService:()=>fe,ChainParams:()=>pe,DECIMAL_PLACES:()=>tr,DEFAULT_BLOCK_TIME:()=>Vt,DEFAULT_MIN_BUDGET:()=>Yt,ERC20:()=>G,EvmClient:()=>Ee,EvmRpcAdapter:()=>Re,FarmClient:()=>tt,H160:()=>Y,HUB_ASSET_ID:()=>Je,HYDRADX_PARACHAIN_ID:()=>Ps,HYDRADX_SS58_PREFIX:()=>X,INFINITY:()=>Dr,LbpMath:()=>V,LbpPool:()=>De,LbpPoolClient:()=>Me,MmOracleClient:()=>de,ONE:()=>E,ORDER_MIN_BLOCK_PERIOD:()=>Kt,OmniMath:()=>R,OmniPool:()=>Le,OmniPoolClient:()=>He,PERBILL_DENOMINATOR:()=>jt,PERMILL_DENOMINATOR:()=>ne,PolkadotApiClient:()=>H,PoolConfigNotFound:()=>Et,PoolError:()=>se,PoolFactory:()=>be,PoolNotFound:()=>Ae,PoolService:()=>ye,PoolType:()=>N,ProviderConfigNotFound:()=>kt,RUNTIME_DECIMALS:()=>Te,RouteNotFound:()=>Fe,Router:()=>Pe,SYSTEM_ASSET_DECIMALS:()=>Qt,SYSTEM_ASSET_ID:()=>_,StableMath:()=>M,StableSwap:()=>ae,StableSwapClient:()=>Ge,StorageConfigNotFound:()=>_t,SubscriptionNotSupported:()=>Ct,TRADEABLE_DEFAULT:()=>Oe,TWAP_BLOCK_PERIOD:()=>Se,TWAP_MAX_DURATION:()=>ft,TWAP_MAX_PRICE_IMPACT:()=>yt,TWAP_TX_MULTIPLIER:()=>rs,TradeOrderError:()=>Xt,TradeOrderType:()=>ht,TradeRouteBuilder:()=>z,TradeRouter:()=>oe,TradeScheduler:()=>xe,TradeType:()=>gt,TxBuilderFactory:()=>we,XykMath:()=>J,XykPool:()=>Ue,XykPoolClient:()=>qe,ZERO:()=>B,bnFormatter:()=>$r,bnum:()=>p,calculateBuyFee:()=>zt,calculateDiffToAvg:()=>ts,calculateDiffToRef:()=>ve,calculateSellFee:()=>Wt,createChain:()=>Dt,createSdkContext:()=>is,findNestedKey:()=>Ce,findNestedObj:()=>Kr,getFraction:()=>ie,hashPools:()=>Jr,isEvmAccount:()=>Jt,isEvmAddress:()=>Zt,isSs58Address:()=>er,scale:()=>A,toBn:()=>Mr,toDecimals:()=>I});module.exports=kr(ns);var Qe=[{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 wt=[{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 $t="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Tt="0x112b087b60C1a166130d59266363C45F8aa99db0",Ot="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",le=1000000n;var ds=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var ce=class{rpcAdapter;constructor(e){this.rpcAdapter=e.getRPCAdapter()}async getBlockTimestamp(){let e=await this.rpcAdapter.getBlock();return Number(e.timestamp)}async getReservesData(){return await this.rpcAdapter.readContract({abi:wt,address:Tt,functionName:"getReservesData",args:[Ot]})}async getUserReservesData(e){return await this.rpcAdapter.readContract({abi:wt,address:Tt,functionName:"getUserReservesData",args:[Ot,e]})}async getUserAccountData(e){return await this.rpcAdapter.readContract({abi:Qe,address:$t,functionName:"getUserAccountData",args:[e]})}};var Z=require("@polkadot/util-crypto"),ue=require("@polkadot/util"),j=require("buffer");var bs=2090,ne=1e6,jt=1e9,Je="1",Ps=2034,X=63,Te=18,_="0",Qt=12,Oe=15;var It="ETH\0";function Jt(u){if(!u)return!1;try{let e=(0,Z.decodeAddress)(u,!0),t=j.Buffer.from(It);return j.Buffer.from(e.subarray(0,t.length)).equals(t)}catch{return!1}}function Zt(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function er(u){try{let e=(0,ue.isHex)(u)?(0,ue.hexToU8a)(u):(0,Z.decodeAddress)(u);return(0,Z.encodeAddress)(e),!0}catch{return!1}}var Y=class u{static toAccount=e=>{let t=j.Buffer.from(e.slice(2),"hex"),r=j.Buffer.from(It);return(0,Z.encodeAddress)(new Uint8Array(j.Buffer.concat([r,t,j.Buffer.alloc(8)])),63)};static fromAccount=e=>{let t=(0,Z.decodeAddress)(e),r=j.Buffer.from(It),s=t.slice(r.length,-8);return"0x"+j.Buffer.from(s).toString("hex")};static fromSS58=e=>{let r=(0,Z.decodeAddress)(e).slice(0,20);return(0,ue.u8aToHex)(r)};static fromAny=e=>{if(Zt(e))return e;if(Jt(e))return u.fromAccount(e);if(er(e))return u.fromSS58(e);throw new Error("Unknown address type")}};var Ie=require("buffer"),G=class{static fromAssetId(e){let t=Number(e),r=Ie.Buffer.alloc(20,0);return r[15]=1,r.writeUInt32BE(t,16),"0x"+r.toString("hex")}static toAssetId(e){let t=Ie.Buffer.from(e.replace("0x",""),"hex");return t.length!==20||!this.isAssetAddress(e)?null:t.readUInt32BE(16)}static isAssetAddress(e){let t=Ie.Buffer.from("0000000000000000000000000000000100000000","hex"),r=Ie.Buffer.from(e.replace("0x",""),"hex");return r.length!==20?!1:r.subarray(0,16).equals(t.subarray(0,16))}};var S=require("bignumber.js"),tr=12;S.BigNumber.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:tr});var B=p(0),E=p(1),Dr=p("Infinity");function A(u,e){let t=new S.BigNumber(e.toString()),r=new S.BigNumber(10).pow(t);return u.times(r).decimalPlaces(4)}function p(u){return new S.BigNumber(u.toString())}function Mr(u,e){let t=p(u);return A(t,e)}function I(u,e){return u.shiftedBy(-1*e).toString()}var Ze=p("1e27"),Lr=p("1.01"),Hr=p("31536000"),rr=4,et=-1,ee=class{client;constructor(e){this.client=new ce(e)}async getSummary(e){let t=Y.fromAny(e),[r,s,i,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(t),this.client.getUserAccountData(t),this.client.getBlockTimestamp()]),[o]=r,[n,l]=s,[c,m,d,h,g,f]=i,y=p(f).dividedBy(1e18).decimalPlaces(6,S.BigNumber.ROUND_DOWN),v=p(c),P=p(m),x=[];for(let O of n){let T=O.underlyingAsset.toLowerCase(),w=o.find(({underlyingAsset:Fr})=>Fr.toLowerCase()===T);if(!w)throw new Error("Missing pool reserve for "+T);let D=p(O.scaledATokenBalance),q=p(w.liquidityIndex),Ke=p(w.liquidityRate),$e=p(w.availableLiquidity),vt=p(w.priceInMarketReferenceCurrency),St=a+6,xt=this.calculateLinearInterest(Ke,w.lastUpdateTimestamp,St),je=q.multipliedBy(xt).dividedBy(Ze).decimalPlaces(0,S.BigNumber.ROUND_DOWN),Tr=D.multipliedBy(je).dividedBy(Ze).decimalPlaces(0,S.BigNumber.ROUND_DOWN),Or=p(l!==0&&l===w.eModeCategoryId?w.eModeLiquidationThreshold:w.reserveLiquidationThreshold).div(1e4),Ir=w.usageAsCollateralEnabled&&O.usageAsCollateralEnabledOnUser&&p(O.scaledATokenBalance).gt(0),Ar=G.toAssetId(T);x.push({aTokenBalance:Tr,availableLiquidity:$e,decimals:Number(w.decimals),isCollateral:Ir,priceInRef:vt,reserveId:Ar,reserveAsset:T,reserveLiquidationThreshold:Or})}return{healthFactor:y.toNumber(),currentLiquidationThreshold:p(h).dividedBy(10**rr).toNumber(),totalCollateral:v,totalDebt:P,reserves:x}}async hasBorrowPositions(e){let t=Y.fromAny(e),r=await this.client.getUserAccountData(t),[s,i]=r;return i>0n}async getHealthFactor(e){let t=Y.fromAny(e),r=await this.client.getUserAccountData(t),[s,i,a,o,n,l]=r;return this.calculateHealthFactorFromBalances(p(i),p(s),p(o))}async getHealthFactorAfterWithdraw(e,t,r){let{totalCollateral:s,totalDebt:i,reserves:a,currentLiquidationThreshold:o}=await this.getSummary(e);if(i.lte(0))return et;let n=G.fromAssetId(t),l=a.find(x=>x.reserveAsset===n);if(!l)throw new Error("Missing reserve ctx for "+n);let{decimals:c,isCollateral:m,priceInRef:d,reserveLiquidationThreshold:h}=l,g=A(p(r),c).decimalPlaces(0,S.BigNumber.ROUND_DOWN),f=m?g.multipliedBy(d).dividedBy(p(10).pow(c)).decimalPlaces(0,S.BigNumber.ROUND_DOWN):B,y=s.minus(f);if(y.lte(0))return 0;let v=s.multipliedBy(p(o)).minus(f.multipliedBy(h)).dividedBy(y);return y.multipliedBy(v).dividedBy(i).decimalPlaces(6,S.BigNumber.ROUND_DOWN).toNumber()}async getHealthFactorAfterSupply(e,t,r){let{totalCollateral:s,totalDebt:i,reserves:a,currentLiquidationThreshold:o}=await this.getSummary(e);if(i.lte(0))return et;let n=G.fromAssetId(t),l=a.find(P=>P.reserveAsset===n);if(!l)throw new Error("Missing reserve ctx for "+n);let{decimals:c,priceInRef:m,reserveLiquidationThreshold:d}=l,g=A(p(r),c).decimalPlaces(0,S.BigNumber.ROUND_DOWN).multipliedBy(m).dividedBy(p(10).pow(c)).decimalPlaces(0,S.BigNumber.ROUND_DOWN),f=s.plus(g);if(f.lte(0))return 0;let y=s.multipliedBy(p(o)).plus(g.multipliedBy(d)).dividedBy(f);return f.multipliedBy(y).dividedBy(i).decimalPlaces(6,S.BigNumber.ROUND_DOWN).toNumber()}async getHealthFactorAfterSwap(e,t,r,s,i){let{totalDebt:a,reserves:o,healthFactor:n}=await this.getSummary(e);if(a.lte(0))return et;let l=G.fromAssetId(r),c=G.fromAssetId(i),m=o.find(w=>w.reserveAsset===l),d=o.find(w=>w.reserveAsset===c);if(!m)throw new Error(`Missing reserve ctx for ${l}`);if(!d)throw new Error(`Missing reserve ctx for ${c}`);let h=A(p(t),m.decimals).decimalPlaces(0,S.BigNumber.ROUND_DOWN),g=A(p(s),d.decimals).decimalPlaces(0,S.BigNumber.ROUND_DOWN),f=h.multipliedBy(m.priceInRef).dividedBy(p(10).pow(m.decimals)).decimalPlaces(0,S.BigNumber.ROUND_DOWN),y=g.multipliedBy(d.priceInRef).dividedBy(p(10).pow(d.decimals)).decimalPlaces(0,S.BigNumber.ROUND_DOWN),v=m.isCollateral?f.multipliedBy(m.reserveLiquidationThreshold):B,O=y.multipliedBy(d.reserveLiquidationThreshold).minus(v).dividedBy(a);return p(n).plus(O).decimalPlaces(6,S.BigNumber.ROUND_DOWN).toNumber()}async getMaxWithdraw(e,t){let{totalDebt:r,reserves:s,healthFactor:i}=await this.getSummary(e),a=G.fromAssetId(t),o=s.find(n=>n.reserveAsset===a);if(!o)throw new Error("Missing reserve data for "+a);return this.calculateWithdrawMax(o,r,i)}async getMaxWithdrawAll(e){let{totalDebt:t,reserves:r,healthFactor:s}=await this.getSummary(e),i={};for(let a of r){let o=this.calculateWithdrawMax(a,t,s);a.reserveId&&(i[a.reserveId]=o)}return i}calculateWithdrawMax(e,t,r){let{aTokenBalance:s,availableLiquidity:i,decimals:a,priceInRef:o,reserveLiquidationThreshold:n,isCollateral:l}=e,c=s;if(l&&t.gt(0)){let d=p(r).minus(Lr);if(d.gt(0)){let g=d.multipliedBy(t).dividedBy(n).decimalPlaces(0,S.BigNumber.ROUND_DOWN).dividedBy(o).multipliedBy(p(10).pow(a)).decimalPlaces(0,S.BigNumber.ROUND_DOWN);c=S.BigNumber.minimum(s,g)}else c=B}return{amount:S.BigNumber.minimum(c,i),decimals:a}}calculateLinearInterest(e,t,r){let s=r-t;return s<=0?Ze:e.multipliedBy(s).dividedBy(Hr).plus(Ze).decimalPlaces(0,S.BigNumber.ROUND_DOWN)}calculateHealthFactorFromBalances(e,t,r){return e.lte(0)?et:t.multipliedBy(r).dividedBy(e).dividedBy(p(10).pow(rr)).decimalPlaces(6,S.BigNumber.ROUND_DOWN).toNumber()}};function sr(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var Ms=require("@galacticcouncil/api-augment/hydradx"),Ls=require("@galacticcouncil/api-augment/basilisk"),H=class{api;constructor(e){this.api=e}get chainDecimals(){return this.api.registry.chainDecimals[0]}get chainToken(){return this.api.registry.chainTokens[0]}log(e,...t){let r=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");sr(r)&&console.log(e,...t)}};var te=class extends H{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(e){super(e)}async safeSharesQuery(){try{let e=await this.api.query.stableswap.pools.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}async safeBondsQuery(){try{let e=await this.api.query.bonds.bonds.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}async metadataQuery(){try{let e=await this.api.query.assetRegistry.assetMetadataMap.entries();return new Map(e.map(([{args:[t]},r])=>{let{decimals:s,symbol:i}=r.unwrap();return[t.toString(),{decimals:s.toNumber(),symbol:i.toHuman()}]}))}catch{return new Map([])}}async locationsQuery(){try{let e=await this.api.query.assetRegistry.assetLocations.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}getSystemTokenName(e){switch(e){case"HDX":return"Hydration";case"BSX":return"Basilisk";default:return e}}getToken(e,t,r,s){if(e=="0"){let m=this.api.consts.balances.existentialDeposit;return{id:"0",name:this.getSystemTokenName(this.chainToken),symbol:this.chainToken,decimals:this.chainDecimals,icon:this.chainToken,type:"Token",isSufficient:!0,existentialDeposit:m.toString()}}let{name:i,assetType:a,isSufficient:o,existentialDeposit:n}=t,{symbol:l,decimals:c}=r.get(e)??{};return{id:e,name:i.toHuman(),symbol:l,decimals:c,icon:l,type:a.toHuman(),isSufficient:o?o.toHuman():!0,location:s?.toJSON(),existentialDeposit:n.toString()}}getBond(e,t,r,s){let[i,a]=s,{assetType:o,isSufficient:n,existentialDeposit:l}=t,{symbol:c,decimals:m}=this.getToken(i.toString(),t,r),d=a.toNumber(),h=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",h.format(d)].join(" ");return{id:e,name:g,symbol:c+"b",decimals:m,icon:c,type:o.toString(),isSufficient:n.toHuman(),existentialDeposit:l.toString(),underlyingAssetId:i.toString(),maturity:d}}getShares(e,t,r,s){let{assets:i}=s,{name:a,symbol:o,assetType:n,isSufficient:l,existentialDeposit:c}=t,d=i.map(f=>f.toString()).map(f=>{let{symbol:y}=this.getToken(f,t,r);return[f,y]}),h=Object.fromEntries(d),g=Object.values(h);return{id:e,name:g.join(", "),symbol:o?.isSome?o.toHuman():a.toHuman(),decimals:18,icon:g.join("/"),type:n.toString(),isSufficient:l.toHuman(),existentialDeposit:c.toString(),meta:h}}getExternal(e,t,r,s){let i=this.getToken(e,t,new Map,s),a=r?.find(o=>o.internalId===i.id);return a?{...i,decimals:a.decimals,name:a.name,symbol:a.symbol,icon:a.symbol,isWhiteListed:a.isWhiteListed}:i}normalizeMetadata(e,t){return t.size?t:new Map(e.map(([{args:[r]},s])=>{let{decimals:i,symbol:a}=s.unwrap();return[r.toString(),{decimals:Number(i.toString()),symbol:a.toHuman()}]}))}getSupportedAssets(e){return e.filter(([t,r])=>{if(r.isNone)return!1;let s=r.unwrap();return this.isSupportedAsset(s)})}async getOnChainAssets(e,t){let[r,s,i,a,o]=await Promise.all([this.api.query.assetRegistry.assets.entries(),this.locationsQuery(),this.safeSharesQuery(),this.safeBondsQuery(),this.metadataQuery()]),n=this.getSupportedAssets(r),l=this.normalizeMetadata(n,o),c=n.map(([{args:[m]},d])=>{let h=d.unwrap(),g=s.get(m.toString()),{assetType:f}=h;switch(f.toString()){case"Bond":let y=a.get(m.toString());return this.getBond(m.toString(),h,l,y);case"StableSwap":let v=i.get(m.toString());return this.getShares(m.toString(),h,l,v);case"External":return this.getExternal(m.toString(),h,t,g);default:return this.getToken(m.toString(),h,l,g)}});return e?c:c.filter(m=>this.isValidAsset(m))}isValidAsset(e){let t=Math.sign(e.decimals);return!!e.symbol&&(t===0||t===1)}isSupportedAsset(e){let t=e.assetType.toString();return this.SUPPORTED_TYPES.includes(t)}};var W=class extends H{constructor(e){super(e)}async getBalance(e,t){let r=await this.api.query.assetRegistry.assets(t),{assetType:s}=r.unwrap();return s.toString()==="Erc20"?this.getErc20Balance(e,t):t==="0"?this.getSystemBalance(e):this.getTokenBalance(e,t)}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateFreeBalance(t)}async getTokenBalance(e,t){let r=await this.api.query.tokens.accounts(e,t);return this.calculateFreeBalance(r)}async getErc20Balance(e,t){let r=await this.getTokenBalanceData(e,t);return this.calculateFreeBalance(r)}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t("0",this.calculateFreeBalance(r)))}async subscribeSystemBalances(e,t){return this.api.query.system.account.multi(e,r=>{let s=[];r.forEach((i,a)=>{let o=this.calculateFreeBalance(i.data),n=e[a];s.push([n,o])}),t(s)})}async subscribeTokenBalance(e,t,r){let s=await this.api.query.tokens.accounts.keys(e),i=r?r.map(a=>[e,a]):s.map(({args:[a,o]})=>[a.toString(),o.toString()]);return this.api.query.tokens.accounts.multi(i,a=>{let o=[];a.forEach((n,l)=>{let c=this.calculateFreeBalance(n),m=i[l][1];o.push([m,c])}),t(o)})}async subscribeTokenBalances(e,t){return this.api.query.tokens.accounts.multi(e,r=>{let s=[];r.forEach((i,a)=>{let o=this.calculateFreeBalance(i),n=e[a];s.push([n,o])}),t(s)})}async subscribeErc20Balance(e,t,r){let i=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([n,l])=>{let{assetType:c}=l.unwrap();return c.toString()==="Erc20"}).map(([{args:[n]}])=>n.toString()))(),a=async()=>{let o=await Promise.all(i.map(async n=>[n,await this.getErc20Balance(e,n)]));t(o)};return this.api.rpc.chain.subscribeNewHeads(async()=>{a()})}async subscribeErc20Balances(e,t){let r=async()=>{let s=await Promise.all(e.map(async i=>{let[a,o]=i;return[i,await this.getErc20Balance(a,o)]}));t(s)};return this.api.rpc.chain.subscribeNewHeads(async()=>{r()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateFreeBalance(e){let t=e.free.toString(),r=e.frozen.toString();return(0,S.BigNumber)(t).lt(r)?(0,S.BigNumber)(0):(0,S.BigNumber)(t).minus(r)}};var me=class extends H{constructor(e){super(e)}async getBalance(e,t){let r=await this.api.query.assetRegistry.assets(t),{assetType:s}=r.unwrap();return s.toString()==="Erc20"?this.getErc20Balance(e,t):t==="0"?this.getSystemBalance(e):this.getTokenBalance(e,t)}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateBalance(t)}async getTokenBalance(e,t){let r=await this.api.query.tokens.accounts(e,t);return this.calculateBalance(r)}async getErc20Balance(e,t){let r=await this.getTokenBalanceData(e,t);return this.calculateBalance(r)}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t("0",this.calculateBalance(r)))}async subscribeTokenBalance(e,t,r){let s=await this.api.query.tokens.accounts.keys(e),i=r?r.map(a=>[e,a]):s.map(({args:[a,o]})=>[a.toString(),o.toString()]);return this.api.query.tokens.accounts.multi(i,a=>{let o=[];a.forEach((n,l)=>{let c=i[l][1],m=this.calculateBalance(n);o.push([c,m])}),t(o)})}async subscribeErc20Balance(e,t,r){let i=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([n,l])=>{let{assetType:c}=l.unwrap();return c.toString()==="Erc20"}).map(([{args:[n]}])=>n.toString()))(),a=async()=>{let o=await Promise.all(i.map(async n=>[n,await this.getErc20Balance(e,n)]));t(o)};return this.api.rpc.chain.subscribeNewHeads(async()=>{a()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateBalance(e){let t=(0,S.BigNumber)(e.free.toString()),r=e.frozen.toString(),s=e.reserved.toString(),i=t.gte(r)?t.minus(r).toString():"0",a=t.plus(s).toString();return{free:t.toString(),total:a,transferable:i,reserved:s,frozen:r}}};var pe=class{api;_minOrderBudget;_blockTime;constructor(e){this.api=e}get blockTime(){return this._blockTime===void 0&&(this._blockTime=this.api.consts.aura.slotDuration.toNumber()),this._blockTime}get minOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=this.api.consts.dca.minBudgetInNativeCurrency.toString()),p(this._minOrderBudget)}};var At=require("@galacticcouncil/math-liquidity-mining"),ir=require("@polkadot/types"),Ft=require("@polkadot/util"),Rt=require("@polkadot/util-crypto");var tt=class extends H{balanceClient;constructor(e){super(e),this.balanceClient=new W(e)}secondsInYear=new S.BigNumber(365.2425).times(24).times(60).times(60);async getOmnipoolFarms(e){let t=await this.api.query.omnipoolWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,i])=>{let[,a]=s.args,o=i.unwrap().toString(),n=a.toString(),l=(await this.api.query.omnipoolWarehouseLM.globalFarm(n)).unwrap(),c=(await this.api.query.omnipoolWarehouseLM.yieldFarm(e,n,o)).unwrap(),m=await this.getOraclePrice(l)??l.priceAdjustment.toString(),h=this.getAccountResolver(this.api.registry)(Number(n),!1).toString(),g=l.rewardCurrency.toString(),f=await this.balanceClient.getTokenBalanceData(h,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:m,potBalance:f.free.toString()}}))}async getIsolatedPoolFarms(e){let t=await this.api.query.xykWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,i])=>{let[,a]=s.args,o=i.unwrap().toString(),n=a.toString(),l=(await this.api.query.xykWarehouseLM.globalFarm(n)).unwrap(),c=(await this.api.query.xykWarehouseLM.yieldFarm(e,n,o)).unwrap(),m=await this.getOraclePrice(l)??l.priceAdjustment.toString(),h=this.getAccountResolver(this.api.registry)(Number(n),!0).toString(),g=l.rewardCurrency.toString(),f=await this.balanceClient.getTokenBalanceData(h,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:m,potBalance:f.free.toString()}}))}async getOraclePrice(e){let t=e.rewardCurrency.toString(),r=e.incentivizedAsset.toString(),s=[t,r].sort();if(t===r)return new S.BigNumber(1).shiftedBy(18).toString();let i=await this.api.query.emaOracle.oracles("omnipool",s,"TenMinutes");if(i.isNone)return;let[a]=i.unwrap(),o=a.price.n.toString(),n=a.price.d.toString(),l;return Number(t)<Number(r)?l=(0,At.fixed_from_rational)(o,n):l=(0,At.fixed_from_rational)(n,o),l}getGlobalRewardPerPeriod(e,t,r,s){let a=e.times(t).shiftedBy(-18).times(s).shiftedBy(-18);return a.gte(r)?r:a}getPoolYieldPerPeriod(e,t,r,s){return e.times(t).div(r.times(s).shiftedBy(-18))}padEndU8a(e,t){return(0,Ft.u8aConcat)(e,Array(Math.max(0,t-e.length)).fill(0))}getAccountResolver=e=>(t,r)=>{let s="modl",i=r?"0x78796b4c4d704944":"0x4f6d6e6957684c4d";return new ir.GenericAccountId32(e,this.padEndU8a((0,Ft.u8aConcat)(s,i,typeof t!="number"?t.toU8a():[t]),32))};async getFarmApr(e,t){if(t==="isolatedpool"&&!(0,Rt.isAddress)(e))throw new Error("You must pass an address of isolated pool as id");if(t==="omnipool"&&(0,Rt.isAddress)(e))throw new Error("You must pass an asset id of omnipool");let r=6,s=t==="omnipool"?await this.getOmnipoolFarms(e):await this.getIsolatedPoolFarms(e);return s.length?s.map(({yieldFarm:o,globalFarm:n,priceAdjustment:l,potBalance:c})=>{let m=new S.BigNumber(n.totalSharesZ.toString()),d=n.plannedYieldingPeriods.toString(),h=new S.BigNumber(n.yieldPerPeriod.toString()),g=new S.BigNumber(n.maxRewardPerPeriod.toString()),f=n.blocksPerPeriod.toString(),y=new S.BigNumber(o.multiplier.toString()).shiftedBy(-18),v=this.secondsInYear.div(new S.BigNumber(r).times(f)),P;if(m.isZero())P=h.times(y).times(v);else{let D=this.getGlobalRewardPerPeriod(m,h,g,l);P=this.getPoolYieldPerPeriod(D,y,m,l).times(v)}let x=new S.BigNumber(n.pendingRewards.toString()).plus(n.accumulatedPaidRewards.toString()),O=g.times(d),T=c?x.plus(c):O;return x.div(T).gte(.999)?B:P.div(t==="isolatedpool"?2:1).times(100)}).reduce((o,n)=>o.plus(n),B).toString():void 0}};var Ae=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},Et=class extends Error{constructor(e,t){super(),this.message=`${e} pool missing ${t}`,this.name="PoolConfigNotFound"}},Fe=class extends Error{constructor(e,t){super(),this.message=`Route from ${e} to ${t} not found in pool configuration`,this.name="RouteNotFound"}},Nt=class extends Error{constructor(e){super(),this.message=`Asset ${e} not available in current network`,this.name="AssetNotFound"}},_t=class extends Error{constructor(e){super(),this.message=`Storage missing ${e}`,this.name="StorageConfigNotFound"}},Ct=class extends Error{constructor(e){super(),this.message=`Subscription type "${e}" not supported`,this.name="SubscriptionNotSupported"}},kt=class extends Error{constructor(e){super(),this.message=`${e}`,this.name="ProviderConfigNotFound"}};var rt=require("viem"),Ur=1e7,Re=class{api;constructor(e){this.api=e}async getBlock(){let e=await this.api.query.ethereum.currentBlock(),{header:t}=e.unwrap(),r=t.timestamp.toBigInt()/1000n,s=t.number.toBigInt();return{timestamp:r,number:s}}readContract=(async e=>{let{abi:t,address:r,functionName:s,args:i}=e,a=(0,rt.encodeFunctionData)({abi:t,functionName:s,args:i}),o=await this.api.call.ethereumRuntimeRPCApi.call("",r,a,0,Ur,null,null,null,!1,[]);if(o.isErr)throw console.error(s,o.asErr.toHuman()),new Error("Contract read failure");let{value:n,exitReason:l,usedGas:c}=o.asOk;if(l.isSucceed)return(0,rt.decodeFunctionResult)({abi:t,functionName:s,data:n.toHex()});throw console.log(s,l.toString(),c.toHuman()),new Error("Contract read error")})};var nr=require("viem"),qr=["wss://hydration-rpc.n.dwellir.com","wss://hydration.dotters.network","wss://rpc.helikon.io/hydradx","wss://hydration.ibp.network","wss://rpc.cay.hydration.cloud","wss://rpc.parm.hydration.cloud","wss://rpc.roach.hydration.cloud","wss://rpc.zipp.hydration.cloud","wss://rpc.sin.hydration.cloud","wss://rpc.coke.hydration.cloud"],Dt=u=>{let t=[u.endpoint,...qr],r=Array.from(new Set(t.map(s=>s.replace("wss://","https://").replace("ws://","http://"))));return(0,nr.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:r}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1})};var Q=require("viem");function ar(u){let e=async({method:t,params:r})=>{let s=Array.isArray(r)?r:[];return u.send(t,s)};return()=>({request:e,config:{name:"PolkadotWsTransport",type:"webSocket",key:"polkadotWs",request:e}})}var Ee=class{api;chain;constructor(e){this.api=e,this.chain=Dt(this.provider)}get provider(){let{provider:e}=this.api._options;return e}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return(0,Q.createPublicClient)({chain:this.chain,transport:(0,Q.http)()})}getWsProvider(){return(0,Q.createPublicClient)({chain:this.chain,transport:ar(this.provider)})}getSigner(e){return(0,Q.createWalletClient)({account:e,chain:this.chain,transport:(0,Q.custom)(window.ethereum)})}getRPCAdapter(){return new Re(this.api)}};var Mt=[{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"description",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"version",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint80",name:"_roundId",type:"uint80"}],name:"getRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"},{inputs:[],name:"latestRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"}];var de=class{rpcAdapter;constructor(e){this.rpcAdapter=e.getRPCAdapter()}async getData(e,t=6){let[r,s,i]=await Promise.all([this.rpcAdapter.readContract({abi:Mt,address:e,functionName:"latestRoundData"}),this.rpcAdapter.readContract({abi:Mt,address:e,functionName:"decimals"}),this.rpcAdapter.getBlock()]),[a,o,n,l]=r,c=i.number-(i.timestamp-l)/BigInt(t),m=Number(c);return{price:o,decimals:s,updatedAt:m<0?0:m}}};var re=(u,e=new Map)=>t=>{let r;return e.has(t)?e.get(t):(e.set(t,r=u(t)),r)};var N=(a=>(a.Aave="Aave",a.LBP="Lbp",a.Omni="Omnipool",a.Stable="Stableswap",a.XYK="Xyk",a.HSM="Hsm",a))(N||{}),se=(c=>(c.UnknownError="UnknownError",c.FacilitatorCapacityExceeded="FacilitatorCapacityExceeded",c.InsufficientTradingAmount="InsufficientTradingAmount",c.InsufficientCollateral="InsufficientCollateral",c.MaxHoldingExceeded="MaxHoldingExceeded",c.MaxInRatioExceeded="MaxInRatioExceeded",c.MaxOutRatioExceeded="MaxOutRatioExceeded",c.TradeNotAllowed="TradeNotAllowed",c.MaxBuyBackExceeded="MaxBuyBackExceeded",c.MaxBuyPriceExceeded="MaxBuyPriceExceeded",c))(se||{});var Ne=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new u(e)}constructor(e){this.type="Aave",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(n=>[n.id,n])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),o=p(i.balance);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:a,balanceOut:o,assetInED:B,assetOutED:B}}validateAndBuy(e,t){let r=this.calculateInGivenOut(e,t),s=[];return t.isGreaterThan(e.balanceOut)&&s.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:t,feePct:0,errors:s}}validateAndSell(e,t){let r=this.calculateOutGivenIn(e,t),s=[];return r.isGreaterThan(e.balanceOut)&&s.push("TradeNotAllowed"),{amountIn:t,calculatedOut:r,amountOut:r,feePct:0,errors:s}}calculateInGivenOut(e,t){return t}calculateOutGivenIn(e,t){return t}spotPriceInGivenOut(e){return A(E,e.decimalsOut)}spotPriceOutGivenIn(e){return A(E,e.decimalsIn)}calculateTradeFee(e,t){return B}};var hr=require("@polkadot/util-crypto"),yr=require("@polkadot/util"),fr=require("viem");var _e=(u,e)=>u===e?0:u==null?e==null?0:-1:e==null?u==null?0:1:typeof u.compare=="function"?u.compare(e):typeof e.compare=="function"?-e.compare(u):u<e?-1:u>e?1:0;var st=(u,e=t=>t!==void 0?": "+t:"")=>class extends Error{origMessage;constructor(t){super(u(t)+e(t)),this.origMessage=t!==void 0?String(t):""}};var Gr=st(()=>"illegal argument(s)"),or=u=>{throw new Gr(u)};var Wr=st(()=>"index out of bounds"),Lt=u=>{throw new Wr(u)},it=(u,e,t)=>(u<e||u>=t)&&Lt(u);var lr=23283064365386963e-26,nt=class{float(e=1){return this.int()*lr*e}probability(e){return this.float()<e}norm(e=1){return(this.int()*lr-.5)*2*e}normMinMax(e,t){let r=this.minmax(e,t);return this.float()<.5?r:-r}minmax(e,t){return this.float()*(t-e)+e}minmaxInt(e,t){e|=0;let r=(t|0)-e;return r?e+this.int()%r:e}minmaxUint(e,t){e>>>=0;let r=(t>>>0)-e;return r?e+this.int()%r:e}};var at=class extends nt{constructor(e){super(),this.rnd=e}float(e=1){return this.rnd()*e}norm(e=1){return(this.rnd()-.5)*2*e}int(){return this.rnd()*4294967296>>>0}};var cr=new at(Math.random);var ur=u=>u!=null&&typeof u!="function"&&u.length!==void 0;var mr=Object.getPrototypeOf({}),ot="function",pr="string",ge=(u,e)=>{let t;if(u===e)return!0;if(u!=null){if(typeof u.equiv===ot)return u.equiv(e)}else return u==e;if(e!=null){if(typeof e.equiv===ot)return e.equiv(u)}else return u==e;return typeof u===pr||typeof e===pr?!1:(t=Object.getPrototypeOf(u),(t==null||t===mr)&&(t=Object.getPrototypeOf(e),t==null||t===mr)?Yr(u,e):typeof u!==ot&&u.length!==void 0&&typeof e!==ot&&e.length!==void 0?zr(u,e):u instanceof Set&&e instanceof Set?Xr(u,e):u instanceof Map&&e instanceof Map?Vr(u,e):u instanceof Date&&e instanceof Date?u.getTime()===e.getTime():u instanceof RegExp&&e instanceof RegExp?u.toString()===e.toString():u!==u&&e!==e)},zr=(u,e,t=ge)=>{let r=u.length;if(r===e.length)for(;r-- >0&&t(u[r],e[r]););return r<0},Xr=(u,e,t=ge)=>u.size===e.size&&t([...u.keys()].sort(),[...e.keys()].sort()),Vr=(u,e,t=ge)=>u.size===e.size&&t([...u].sort(),[...e].sort()),Yr=(u,e,t=ge)=>{if(Object.keys(u).length!==Object.keys(e).length)return!1;for(let r in u)if(!e.hasOwnProperty(r)||!t(u[r],e[r]))return!1;return!0};var Ht=class{value;constructor(e){this.value=e}deref(){return this.value}};var dr=u=>u instanceof Ht;var lt=class u{_head;_length=0;constructor(e){e&&this.into(e)}get length(){return this._length}get head(){return this._head}[Symbol.iterator](){return gr("next",this._head)}reverseIterator(){return gr("prev",this.tail)}clear(){this.release()}compare(e,t=_e){let r=this._length;if(r<e._length)return-1;if(r>e._length)return 1;if(r===0)return 0;{let s=this._head,i=e._head,a=0;for(;r-- >0&&a===0;)a=t(s.value,i.value),s=s.next,i=i.next;return a}}concat(...e){let t=this.copy();for(let r of e)t.into(r);return t}equiv(e){if(!(e instanceof u||ur(e))||this._length!==e.length)return!1;if(!this._length||this===e)return!0;let t=e[Symbol.iterator](),r=this._head;for(let s=this._length;s-- >0;){if(!ge(r.value,t.next().value))return!1;r=r.next}return!0}filter(e){let t=this.empty();return this.traverse(r=>(e(r.value)&&t.append(r.value),!0)),t}find(e){return this.traverse(t=>t.value!==e)}findWith(e){return this.traverse(t=>!e(t.value))}first(){return this._head?.value}insertSorted(e,t){t=t||_e;for(let r=this._head,s=this._length;s-- >0;){if(t(e,r.value)<=0)return this.insertBefore(r,e);r=r.next}return this.append(e)}into(e){for(let t of e)this.append(t);return this}nth(e,t){let r=this.nthCell(e);return r?r.value:t}nthCellUnsafe(e){let t,r;for(e<=this._length>>>1?(t=this._head,r="next"):(t=this.tail,r="prev",e=this._length-e-1);e-- >0&&t;)t=t[r];return t}peek(){return this.tail?.value}$reduce(e,t){let r=this._head;for(let s=this._length;s-- >0&&!dr(t);)t=e(t,r.value),r=r.next;return t}reduce(e,t){return this.$reduce(e,t)}release(){let e=this._head;if(!e)return!0;let t;for(let r=this._length;r-- >0;)t=e.next,delete e.value,delete e.prev,delete e.next,e=t;return this._head=void 0,this._length=0,!0}reverse(){let e=this._head,t=this.tail,r=(this._length>>>1)+(this._length&1);for(;e&&t&&r>0;){let s=e.value;e.value=t.value,t.value=s,e=e.next,t=t.prev,r--}return this}setHead(e){let t=this._head;return t?(t.value=e,t):this.prepend(e)}setNth(e,t){let r=this.nthCell(e);return!r&&Lt(e),r.value=t,r}setTail(e){let t=this.tail;return t?(t.value=e,t):this.append(e)}swap(e,t){if(e!==t){let r=e.value;e.value=t.value,t.value=r}return this}toArray(e=[]){return this.traverse(t=>(e.push(t.value),!0)),e}toJSON(){return this.toArray()}toString(){let e=[];return this.traverse(t=>(e.push(String(t.value)),!0)),e.join(", ")}traverse(e,t=this._head,r){if(!this._head)return;let s=t;do{if(!e(s))break;s=s.next}while(s!==r);return s}_map(e,t){return this.traverse(r=>(e.append(t(r.value)),!0)),e}};function*gr(u,e){for(;e;)yield e.value,e=e[u]}var ct=class u extends lt{_tail;constructor(e){super(),e&&this.into(e)}get tail(){return this._tail}append(e){if(this._tail){let t={value:e,prev:this._tail};return this._tail.next=t,this._tail=t,this._length++,t}else return this.prepend(e)}asHead(e){return e===this._head?this:(this.remove(e),this._head.prev=e,e.next=this._head,e.prev=void 0,this._head=e,this._length++,this)}asTail(e){return e===this._tail?this:(this.remove(e),this._tail.next=e,e.prev=this._tail,e.next=void 0,this._tail=e,this._length++,this)}cons(e){return this.prepend(e),this}copy(){return new u(this)}*cycle(){for(;;)yield*this}drop(){let e=this._head;if(e)return this._head=e.next,this._head?this._head.prev=void 0:this._tail=void 0,this._length--,e.value}empty(){return new u}insertAfter(e,t){let r={value:t,next:e.next,prev:e};return e.next?e.next.prev=r:this._tail=r,e.next=r,this._length++,r}insertAfterNth(e,t){return e<0&&(e+=this._length),e>=this._length-1?this.append(t):(it(e,0,this._length),this.insertAfter(this.nthCellUnsafe(e),t))}insertBefore(e,t){let r={value:t,next:e,prev:e.prev};return e.prev?e.prev.next=r:this._head=r,e.prev=r,this._length++,r}insertBeforeNth(e,t){return e<0&&(e+=this._length),e<=0?this.prepend(t):(it(e,0,this._length),this.insertBefore(this.nthCellUnsafe(e),t))}map(e){return this._map(new u,e)}nth(e,t){let r=this.nthCell(e);return r?r.value:t}nthCell(e){if(e<0&&(e+=this._length),!(e<0||e>=this._length))return this.nthCellUnsafe(e)}pop(){let e=this._tail;if(e)return this._tail=e.prev,this._tail?this._tail.next=void 0:this._head=void 0,this._length--,e.value}prepend(e){let t={value:e,next:this._head};return this._head?this._head.prev=t:this._tail=t,this._head=t,this._length++,t}push(e){return this.append(e),this}release(){return this._tail=void 0,super.release()}remove(e){return e.prev?e.prev.next=e.next:this._head=e.next,e.next?e.next.prev=e.prev:this._tail=e.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 e=this.peek();return this.pop(),this.prepend(e),this}}seq(e=0,t=this.length){if(e>=t||e<0)return;let r=this.nthCell(e),s=this.nthCell(t-1),i=a=>({first(){return a.value},next(){return a!==s&&a.next?i(a.next):void 0}});return r?i(r):void 0}shuffle(e,t=cr){if(this._length<2)return this;for(e=e!==void 0?e:Math.ceil(1.5*Math.log2(this._length));e>0;e--){let r=this._head;for(;r;){let s=r.next;t.probability(.5)?this.asHead(r):this.asTail(r),r=s}}return this}slice(e=0,t=this.length){let r=e<0?e+this._length:e,s=t<0?t+this._length:t;(r<0||s<0)&&or("invalid indices: ${from} / ${to}");let i=new u,a=this.nthCell(r);for(;a&&++r<=s;)i.push(a.value),a=a.next;return i}sort(e=_e){if(!this._length)return this;let t=1;for(;;){let r=this._head;this._head=void 0,this._tail=void 0;let s=0;for(;r;){s++;let i=r,a=0;for(let n=0;n<t&&(a++,i=i.next,!!i);n++);let o=t;for(;a>0||o>0&&i;){let n;a===0?(n=i,i=i.next,o--):!i||o===0||e(r.value,i.value)<=0?(n=r,r=r.next,a--):(n=i,i=i.next,o--),this._tail?this._tail.next=n:this._head=n,n.prev=this._tail,this._tail=n}r=i}if(this._tail.next=void 0,s<=1)return this;t*=2}}splice(e,t=0,r){let s;typeof e=="number"?(e<0&&(e+=this._length),it(e,0,this._length),s=this.nthCellUnsafe(e)):s=e;let i=new u;if(t>0)for(;s&&t-- >0;)this.remove(s),i.push(s.value),s=s.next;else s&&(s=s.next);if(r)if(s)for(let a of r)this.insertBefore(s,a);else for(let a of r)this.push(a);return i}};var ut=class u{map;items;opts;_size;constructor(e,t){let r={maxlen:1/0,maxsize:1/0,map:()=>new Map,ksize:()=>0,vsize:()=>0,...t};this.map=r.map(),this.items=new ct,this._size=0,this.opts=r,e&&this.into(e)}get length(){return this.items.length}get size(){return this._size}[Symbol.iterator](){return this.entries()}*entries(){for(let e of this.items)yield[e.k,e]}*keys(){for(let e of this.items)yield e.k}*values(){for(let e of this.items)yield e.v}copy(){let e=this.empty();e.items=this.items.copy();let t=e.items.head;for(;t;)e.map.set(t.value.k,t),t=t.next;return e}empty(){return new u(null,this.opts)}release(){this._size=0,this.map.clear();let e=this.opts.release;if(e){let t;for(;t=this.items.drop();)e(t.k,t.v);return!0}return this.items.release()}has(e){return this.map.has(e)}get(e,t){let r=this.map.get(e);return r?this.resetEntry(r):t}set(e,t){let r=this.opts.ksize(e)+this.opts.vsize(t),s=this.map.get(e),i=Math.max(0,r-(s?s.value.s:0));return this._size+=i,this.ensureSize()?this.doSetEntry(s,e,t,r):this._size-=i,t}into(e){for(let t of e)this.set(t[0],t[1]);return this}async getSet(e,t){let r=this.map.get(e);return r?this.resetEntry(r):this.set(e,await t())}delete(e){let t=this.map.get(e);return t?(this.removeEntry(t),!0):!1}resetEntry(e){return this.items.asTail(e),e.value.v}ensureSize(){let{release:e,maxsize:t,maxlen:r}=this.opts;for(;this._size>t||this.length>=r;){let s=this.items.drop();if(!s)return!1;this.map.delete(s.k),e?.(s.k,s.v),this._size-=s.s}return!0}removeEntry(e){let t=e.value;this.map.delete(t.k),this.items.remove(e),this.opts.release?.(t.k,t.v),this._size-=t.s}doSetEntry(e,t,r,s){e?(this.opts.update?.(t,e.value.v,r),e.value.v=r,e.value.s=s,this.items.asTail(e)):(this.items.push({k:t,v:r,s}),this.map.set(t,this.items.tail))}};var he=class u extends ut{constructor(e,t){super(e,{ttl:3600*1e3,autoExtend:!1,...t})}empty(){return new u(null,this.opts)}has(e){return this.get(e)!==void 0}get(e,t){let r=this.map.get(e);if(r){if(r.value.t>=Date.now())return this.resetEntry(r);this.removeEntry(r)}return t}set(e,t,r=this.opts.ttl){let s=this.opts.ksize(e)+this.opts.vsize(t),i=this.map.get(e),a=Math.max(0,s-(i?i.value.s:0));return this._size+=a,this.ensureSize()?this.doSetEntry(i,e,t,s,r):this._size-=a,t}async getSet(e,t,r=this.opts.ttl){let s=this.get(e);return s!==void 0?s:this.set(e,await t(),r)}prune(){let e=Date.now(),t=this.items.head,r=0;for(;t;)t.value.t<e&&(this.removeEntry(t),r++),t=t.next;return r}ensureSize(){let{maxlen:e,maxsize:t}=this.opts,r=Date.now(),s=this.items.head;for(;s&&(this._size>t||this.length>=e);)s.value.t<r&&this.removeEntry(s),s=s.next;return super.ensureSize()}doSetEntry(e,t,r,s,i=this.opts.ttl){let a=Date.now()+i;e?(this.opts.update?.(t,e.value.v,r),e.value.v=r,e.value.s=s,e.value.t=a,this.items.asTail(e)):(this.items.push({k:t,v:r,s,t:a,ttl:i}),this.map.set(t,this.items.tail))}resetEntry(e){return this.opts.autoExtend&&(e.value.t=Date.now()+e.value.ttl),super.resetEntry(e)}};var U=class extends W{evm;mmOracle;pools=[];subs=[];assets=new Map([]);mem=0;onNewBlockHandler;onEventsHandler;memPoolsCache=new he(null,{maxlen:1,ttl:3600*1e3,release:e=>{this.mem>e&&this.log(this.getPoolType(),`mem ${e} released at`,new Date)}});memPools=re(e=>(this.log(this.getPoolType(),`mem ${e} sync`),this.getPools()),this.memPoolsCache);constructor(e,t){super(e),this.evm=t,this.mmOracle=new de(t),this.onNewBlockHandler=this.onNewBlock.bind(this),this.onEventsHandler=this.onEvents.bind(this)}onNewBlock(e){}onEvents(e){}get augmentedPools(){return this.pools.filter(e=>this.isValidPool(e)).map(e=>this.withMetadata(e))}async withAssets(e){this.assets=new Map(e.map(t=>[t.id,t])),this.mem=this.mem+1}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){this.unsubscribe(),this.pools=await this.loadPools();let e=this.subscribeBalances(),t=this.subscribeUpdates();this.subs.push(e),this.subs.push(t);let r=this.getPoolType();return this.log(r,`mem ${this.mem} pools(${this.augmentedPools.length})`),this.log(r,`mem ${this.mem} subs(${this.subs.length})`),this.augmentedPools}async subscribeBalances(){let e=[],t=[],r=[],s=[];for(let o of this.augmentedPools){let{address:n,tokens:l}=o;l.filter(c=>c.id==="0").forEach(()=>{e.push(n)}),l.filter(c=>["Token","StableSwap"].includes(c.type)&&c.id!=="0"&&c.id!==o.id).forEach(c=>{t.push([n,c.id])}),l.filter(c=>c.type==="Erc20").forEach(c=>{r.push([n,c.id])})}let i=o=>{o.forEach(([n,l])=>{let c=this.pools.find(m=>m.address===n);if(c){let m=c.tokens.findIndex(d=>d.id==="0");c.tokens[m].balance=l.toString()}})},a=o=>{o.forEach(([n,l])=>{let[c,m]=n,d=this.pools.find(h=>h.address===c);if(d){let h=d.tokens.findIndex(g=>g.id===m);d.tokens[h].balance=l.toString()}})};if(e.length>0){let o=await this.subscribeSystemBalances(e,i);s.push(o)}if(t.length>0){let o=await this.subscribeTokenBalances(t,a);s.push(o)}if(r.length>0){let o=await this.subscribeErc20Balances(r,a);s.push(o)}return()=>{for(let o of s)try{o()}catch(n){console.warn("Balance unsub failed",n)}}}unsubscribe(){this.subs.forEach(e=>{e.then(t=>t()).catch(t=>console.warn("Unsub failed",t))})}isValidPool(e){return e.type==="Xyk"?e.tokens.every(t=>this.assets.get(t.id)):!0}withMetadata(e){return e.tokens=e.tokens.map(t=>{let r=this.assets.get(t.id);return{...t,...r}}),e}};function Ce(u,e){let t=[];return JSON.stringify(u,(r,s)=>(s&&s[e]&&t.push(s),s)),t[0]}function Kr(u,e,t){let r;return JSON.stringify(u,(s,i)=>(i&&i[e]===t&&(r=i),i)),r}var $r=(u,e)=>typeof e=="bigint"?e.toString():e;var jr=["Supply","Withdraw","Repay","Borrow"],ke=class extends U{getPoolType(){return"Aave"}getPoolId(e,t){let r="aave:"+e+"/"+t;return(0,hr.encodeAddress)((0,yr.stringToU8a)(r.padEnd(32,"\0")),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:0}}getReserveH160Id(e){return e.type==="Erc20"?Ce(e.location,"accountKey20").accountKey20.key:G.fromAssetId(e.id)}isSupported(){return this.api.call.aaveTradeExecutor.pools!==void 0}async loadPools(){return(await this.api.call.aaveTradeExecutor.pools()).map(({reserve:t,atoken:r,liqudityIn:s,liqudityOut:i})=>({address:this.getPoolId(t.toString(),r.toString()),type:"Aave",tokens:[{id:t.toString(),balance:s.toString()},{id:r.toString(),balance:i.toString()}],...this.getPoolLimits()}))}async getPoolFees(e,t,r){return{}}onEvents(e){e.forEach(t=>{let{event:r}=t,s=`${r.section}:${r.method}`;if(s==="router:Executed"){let[i,a]=r.data.toJSON();this.pools.filter(o=>o.tokens.some(n=>n.id===i.toString()||n.id===a.toString())).forEach(o=>{this.log(`Sync AAVE via [router:Executed] :: ${i}:${a}`),this.updatePoolState(o)})}if(s==="evm:Log"){let[i]=r.data.toJSON();try{let{eventName:a,args:o}=(0,fr.decodeEventLog)({abi:Qe,topics:i.topics,data:i.data});if(jr.includes(a)){let n=o.reserve.toLowerCase();this.pools.filter(l=>{let[c]=l.tokens;return this.getReserveH160Id(c).toLowerCase()===n}).forEach(l=>{this.log(`Sync AAVE via [evm:Log] :: ${a} ${n}`),this.updatePoolState(l)})}}catch{}}})}async subscribeBalances(){return()=>{}}async subscribeUpdates(){return()=>{}}async updatePoolState(e){let[t,r]=e.tokens,{liqudityIn:s,liqudityOut:i}=await this.api.call.aaveTradeExecutor.pool(t.id,r.id);e.tokens=e.tokens.map(a=>{let o=a.id===t.id?s.toString():i.toString();return{...a,balance:o}})}};var K=require("@galacticcouncil/math-lbp"),V=class{static getSpotPrice(e,t,r,s,i){return(0,K.get_spot_price)(e,t,r,s,i)}static calculateInGivenOut(e,t,r,s,i){return(0,K.calculate_in_given_out)(e,t,r,s,i)}static calculateOutGivenIn(e,t,r,s,i){return(0,K.calculate_out_given_in)(e,t,r,s,i)}static calculateLinearWeights(e,t,r,s,i){return(0,K.calculate_linear_weights)(e,t,r,s,i)}static calculatePoolTradeFee(e,t,r){return(0,K.calculate_pool_trade_fee)(e,t,r)}};var b=class u{static toPct(e){let[t,r]=e;return u.safeDivide(t*100,r)}static toRaw(e){let[t,r]=e;return u.safeDivide(t,r)}static fromPermill(e){return[e,1e6]}static fromPerbill(e){return[e,1e9]}static fromRate(e,t){return[e,t]}static safeDivide(e,t,r=12){let s=10**r;return Math.round(e*s/t)/s}static safeRound(e){return parseFloat(e.toPrecision(15))}};var De=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(e){return new u(e)}constructor(e){this.type="Lbp",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.fee=e.fee,this.repayFeeApply=e.repayFeeApply}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(n=>[n.id,n])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),o=p(i.balance);return{assetIn:e,assetOut:t,balanceIn:a,balanceOut:o,decimalsIn:s.decimals,decimalsOut:i.decimals,weightIn:s.weight,weightOut:i.weight}}validateAndBuy(e,t,r){let s=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let a=e.balanceOut.div(this.maxOutRatio);if(t.isGreaterThan(a)&&i.push("MaxOutRatioExceeded"),s===e.assetOut){let o=this.calculateTradeFee(t,r),n=b.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),l=t.plus(o),c=this.calculateInGivenOut(e,l),m=e.balanceIn.div(this.maxInRatio);return c.isGreaterThan(m)&&i.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:t,feePct:n,errors:i}}else{let o=this.calculateInGivenOut(e,t),n=e.balanceIn.div(this.maxInRatio);return o.isGreaterThan(n)&&i.push("MaxInRatioExceeded"),{amountIn:o,calculatedIn:o,amountOut:t,feePct:0,errors:i}}}validateAndSell(e,t,r){let s=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let a=e.balanceIn.div(this.maxInRatio);if(t.isGreaterThan(a)&&i.push("MaxInRatioExceeded"),s===e.assetIn){let o=this.calculateOutGivenIn(e,t),n=e.balanceOut.div(this.maxOutRatio);return o.isGreaterThan(n)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:o,amountOut:o,feePct:0,errors:i}}else{let o=this.calculateOutGivenIn(e,t),n=this.calculateTradeFee(o,r),l=b.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),c=o.minus(n),m=e.balanceOut.div(this.maxOutRatio);return c.isGreaterThan(m)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:o,amountOut:c,feePct:l,errors:i}}}calculateInGivenOut(e,t){let r=V.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?B:s}calculateOutGivenIn(e,t){let r=V.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?B:s}spotPriceInGivenOut(e){let t=V.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),A(E,e.decimalsOut).toString());return p(t)}spotPriceOutGivenIn(e){let t=V.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),A(E,e.decimalsIn).toString());return p(t)}calculateTradeFee(e,t){let r=V.calculatePoolTradeFee(e.toString(),this.repayFeeApply?t.repayFee[0]:t.exchangeFee[0],this.repayFeeApply?t.repayFee[1]:t.exchangeFee[1]);return p(r)}};var Me=class extends U{MAX_FINAL_WEIGHT=A(p(100),6);poolsData=new Map([]);getPoolType(){return"Lbp"}getPoolLimits(){let e=this.api.consts.lbp.maxInRatio.toNumber(),t=this.api.consts.lbp.maxOutRatio.toNumber(),r=this.api.consts.lbp.minTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}async getPoolDelta(e,t,r){let{start:s,end:i,assets:a,initialWeight:o,finalWeight:n,repayTarget:l,feeCollector:c}=t,m=V.calculateLinearWeights(s.toString(),i.toString(),o.toString(),n.toString(),r),[d,h]=a,g=d.toString(),f=p(m),y=h.toString(),v=this.MAX_FINAL_WEIGHT.minus(p(f)),[P,x,O]=await Promise.all([this.isRepayFeeApplied(g,l.toString(),c.toString()),this.getBalance(e,g),this.getBalance(e,y)]);return{repayFeeApply:P,tokens:[{id:g,weight:f,balance:x.toString()},{id:y,weight:v,balance:O.toString()}]}}isActivePool(e,t){if(e.start.isEmpty||e.end.isEmpty)return!1;let r=e.start.unwrap().toNumber(),s=e.end.unwrap().toNumber();return t>=r&&t<s}async isRepayFeeApplied(e,t,r){let s=p(t);if(s.isZero())return!1;try{return(await this.getBalance(e,r)).isLessThan(s)}catch{return!0}}isSupported(){return this.api.query.lbp!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.lbp.poolData.entries(),this.api.query.parachainSystem.validationData()]),{relayParentNumber:r}=t.unwrap(),s=e.filter(([i,a])=>this.isActivePool(a.unwrap(),r.toNumber())).map(async([{args:[i]},a])=>{let o=a.unwrap(),n=i.toString(),l=await this.getPoolDelta(n,o,r.toString());this.poolsData.set(i.toString(),o);let[c,m]=o.fee;return{address:n,type:"Lbp",fee:b.fromRate(c.toNumber(),m.toNumber()),...l,...this.getPoolLimits()}});return Promise.all(s)}async getPoolFees(e,t,r){let s=this.pools.find(i=>i.address===r);return{repayFee:this.getRepayFee(),exchangeFee:s.fee}}getRepayFee(){let[e,t]=this.api.consts.lbp.repayFee;return b.fromRate(e.toNumber(),t.toNumber())}async subscribeUpdates(){return this.api.query.parachainSystem.validationData(async e=>{let{relayParentNumber:t}=e.unwrap();this.pools.forEach(async r=>{let s=this.poolsData.get(r.address);if(s)if(this.isActivePool(s,t.toNumber())){let a=await this.getPoolDelta(r.address,s,t.toString());Object.assign(r,a)}else{let a=this.pools.findIndex(o=>o.address==r.address);this.pools.splice(a,1)}})})}};var F=require("@galacticcouncil/math-omnipool");var R=class{static calculateSpotPrice(e,t,r,s){return(0,F.calculate_spot_price)(e,t,r,s)}static calculateLrnaSpotPrice(e,t){return(0,F.calculate_lrna_spot_price)(e,t)}static calculateInGivenOut(e,t,r,s,i,a,o,n,l){return(0,F.calculate_in_given_out)(e,t,r,s,i,a,o,n,l)}static calculateLrnaInGivenOut(e,t,r,s,i){return(0,F.calculate_lrna_in_given_out)(e,t,r,s,i)}static calculateOutGivenIn(e,t,r,s,i,a,o,n,l){return(0,F.calculate_out_given_in)(e,t,r,s,i,a,o,n,l)}static calculateOutGivenLrnaIn(e,t,r,s,i){return(0,F.calculate_out_given_lrna_in)(e,t,r,s,i)}static calculateShares(e,t,r,s){return(0,F.calculate_shares)(e,t,r,s)}static calculateLiquidityOut(e,t,r,s,i,a,o,n){return(0,F.calculate_liquidity_out)(e,t,r,s,i,a,o,n)}static calculateLiquidityLRNAOut(e,t,r,s,i,a,o,n){return(0,F.calculate_liquidity_lrna_out)(e,t,r,s,i,a,o,n)}static calculateCapDifference(e,t,r,s){let i=(0,S.BigNumber)(t),a=(0,S.BigNumber)(e),o=(0,S.BigNumber)(s),l=(0,S.BigNumber)(r).shiftedBy(-18);if(i.div(o).lt(l)){let m=l.times(o).minus(i).times(a),d=i.times((0,S.BigNumber)(1).minus(l));return m.div(d).toFixed(0)}else return"0"}static calculateLimitHubIn(e,t,r,s){return(0,F.calculate_liquidity_hub_in)(e,t,r,s)}static isSellAllowed(e){return(0,F.is_sell_allowed)(e)}static isBuyAllowed(e){return(0,F.is_buy_allowed)(e)}static isAddLiquidityAllowed(e){return(0,F.is_add_liquidity_allowed)(e)}static isRemoveLiquidityAllowed(e){return(0,F.is_remove_liquidity_allowed)(e)}static recalculateAssetFee(e,t,r,s,i,a,o,n,l,c,m){return(0,F.recalculate_asset_fee)(e,t,r,s,i,a,o,n,l,c,m)}static recalculateProtocolFee(e,t,r,s,i,a,o,n,l,c,m){return(0,F.recalculate_protocol_fee)(e,t,r,s,i,a,o,n,l,c,m)}static verifyAssetCap(e,t,r,s){return(0,F.verify_asset_cap)(e,t,r,s)}};var Le=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(e){return new u(e)}constructor(e){this.type="Omnipool",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.hubAssetId=e.hubAssetId}validatePair(e,t){return this.hubAssetId!=t}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),o=p(i.balance),n=p(s.existentialDeposit),l=p(i.existentialDeposit);return{assetIn:e,assetOut:t,hubReservesIn:s.hubReserves,hubReservesOut:i.hubReserves,sharesIn:s.shares,sharesOut:i.shares,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:a,balanceOut:o,tradeableIn:s.tradeable,tradeableOut:i.tradeable,assetInED:n,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),a=i.minus(s),o=s===B?B:a.div(s).multipliedBy(100).decimalPlaces(4),n=[],l=R.isSellAllowed(e.tradeableIn),c=R.isBuyAllowed(e.tradeableOut);(!l||!c)&&n.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&n.push("InsufficientTradingAmount");let m=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(m)&&n.push("MaxOutRatioExceeded");let d=e.balanceIn.div(this.maxInRatio);return i.isGreaterThan(d)&&n.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:o.toNumber(),errors:n}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,r),o=s.minus(i).div(s).multipliedBy(100).decimalPlaces(4),n=[],l=R.isSellAllowed(e.tradeableIn),c=R.isBuyAllowed(e.tradeableOut);(!l||!c)&&n.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&n.push("InsufficientTradingAmount");let m=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(m)&&n.push("MaxInRatioExceeded");let d=e.balanceOut.div(this.maxOutRatio);return i.isGreaterThan(d)&&n.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:o.toNumber(),errors:n}}calculateInGivenOut(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(e,t,r);let s=R.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?b.toRaw(r.assetFee).toString():B.toString(),r?b.toRaw(r.protocolFee).toString():B.toString()),i=p(s);return i.isNegative()?B:i}calculateLrnaInGivenOut(e,t,r){let s=R.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?b.toRaw(r.assetFee).toString():B.toString()),i=p(s);return i.isNegative()?B:i}calculateOutGivenIn(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,r);let s=R.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?b.toRaw(r.assetFee).toString():B.toString(),r?b.toRaw(r.protocolFee).toString():B.toString()),i=p(s);return i.isNegative()?B:i}calculateOutGivenLrnaIn(e,t,r){let s=R.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?b.toRaw(r.assetFee).toString():B.toString()),i=p(s);return i.isNegative()?B:i}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=R.calculateSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString(),e.balanceIn.toString(),e.hubReservesIn.toString());return p(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceLrnaInGivenOut(e){let t=R.calculateLrnaSpotPrice(e.hubReservesOut.toString(),e.balanceOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceOutGivenIn(e){if(e.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(e);let t=R.calculateSpotPrice(e.balanceIn.toString(),e.hubReservesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}spotPriceOutGivenLrnaIn(e){let t=R.calculateLrnaSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}};var vr=require("@polkadot/util-crypto"),Sr=require("@polkadot/util");var br="omnipool",Pr="Short",He=class extends U{dynamicFees=new Map;dynamicFeesConfiguration=new Map;oracles=new Map;memQueryCache=new he(null,{ttl:6*1e3});memOracleQuery=re(e=>{let t=e.split(":");return this.api.query.emaOracle.oracles(br,t,Pr)},this.memQueryCache);memFeesQuery=re(e=>this.api.query.dynamicFees.assetFee(e),this.memQueryCache);memFeesConfigurationQuery=re(e=>this.api.query.dynamicFees.assetFeeConfiguration(e),this.memQueryCache);getPoolType(){return"Omnipool"}getPoolId(){return(0,vr.encodeAddress)((0,Sr.stringToU8a)("modlomnipool".padEnd(32,"\0")),63)}getOracleKey(e){return e==="0"?["0","1"]:["1",e]}getPoolLimits(){let e=this.api.consts.omnipool.maxInRatio.toNumber(),t=this.api.consts.omnipool.maxOutRatio.toNumber(),r=this.api.consts.omnipool.minimumTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}async getDynamicFees(e){return this.dynamicFees.has(e)?this.dynamicFees.get(e):this.memFeesQuery(e)}async getDynamicFeesConfiguration(e){return this.dynamicFeesConfiguration.has(e)?this.dynamicFeesConfiguration.get(e):this.memFeesConfigurationQuery(e)}async getOraclePrice(e){let r=this.getOracleKey(e).join(":");return this.oracles.has(r)?this.oracles.get(r):this.memOracleQuery(r)}isSupported(){return this.api.query.omnipool!==void 0}isAssetConfigSupported(){return this.api.query.dynamicFees.assetFeeConfiguration!==void 0}async loadPools(){let e=this.api.consts.omnipool.hubAssetId.toString(),t=this.getPoolId(),[r,s,i]=await Promise.all([this.api.query.omnipool.assets.entries(),this.api.query.omnipool.hubAssetTradability(),this.getBalance(t,e)]),a=r.map(async([{args:[n]},l])=>{let{hubReserve:c,shares:m,tradable:d,cap:h,protocolShares:g}=l.unwrap(),f=await this.getBalance(t,n.toString());return{id:n.toString(),hubReserves:p(c.toString()),shares:p(m.toString()),tradeable:d.bits.toNumber(),balance:f.toString(),cap:p(h.toString()),protocolShares:p(g.toString())}}),o=await Promise.all(a);return o.push({id:e,tradeable:s.bits.toNumber(),balance:i.toString()}),[{address:t,type:"Omnipool",hubAssetId:e,tokens:o,...this.getPoolLimits()}]}async getPoolFees(e,t,r){let s=t.assetOut,i=t.assetIn,a;if(this.isAssetConfigSupported()&&(a=await this.getDynamicFeesConfiguration(s).then(P=>P.unwrapOr(null))),a?.isFixed){let P=a.asFixed.assetFee.toNumber(),x=a.asFixed.protocolFee.toNumber();return{assetFee:b.fromPermill(P),protocolFee:b.fromPermill(x)}}let[o,n,l]=await Promise.all([this.getDynamicFees(s),this.getOraclePrice(s),this.getOraclePrice(i)]),[c,m,d]=this.getAssetFee(t,e,o,n,a?.isDynamic?a.asDynamic.assetFeeParams:void 0),[h,g,f]=i==="1"?[0,0,0]:this.getProtocolFee(t,e,o,l,a?.isDynamic?a.asDynamic.protocolFeeParams:void 0),y=c+h,v=d+f;return{assetFee:b.fromPermill(m),protocolFee:b.fromPermill(g),min:b.fromPermill(y),max:b.fromPermill(v)}}getAssetFee(e,t,r,s,i){let{assetOut:a,balanceOut:o}=e,{minFee:n,maxFee:l,decay:c,amplification:m}=i||this.api.consts.dynamicFees.assetFeeParameters,d=b.fromPermill(n.toNumber()),h=b.fromPermill(l.toNumber());if(r.isNone||s.isNone)return[n.toNumber(),n.toNumber(),l.toNumber()];let[g]=s.unwrap(),{assetFee:f,timestamp:y}=r.unwrap(),v=Math.max(1,t-y.toNumber()),P=g.volume.bIn.toString(),x=g.volume.bOut.toString(),O=g.liquidity.b.toString();a==="0"&&(P=g.volume.aIn.toString(),x=g.volume.aOut.toString(),O=g.liquidity.a.toString());let T=b.fromPermill(f.toNumber()),w=R.recalculateAssetFee(P,x,O,"9",o.toString(),b.toRaw(T).toString(),v.toString(),b.toRaw(d).toString(),b.toRaw(h).toString(),c.toString(),m.toString());return[n.toNumber(),Number(w)*1e6,l.toNumber()]}getProtocolFee(e,t,r,s,i){let{assetIn:a,balanceIn:o}=e,{minFee:n,maxFee:l,decay:c,amplification:m}=i||this.api.consts.dynamicFees.protocolFeeParameters,d=b.fromPermill(n.toNumber()),h=b.fromPermill(l.toNumber());if(r.isNone||s.isNone)return[n.toNumber(),n.toNumber(),l.toNumber()];let[g]=s.unwrap(),{protocolFee:f,timestamp:y}=r.unwrap(),v=Math.max(1,t-y.toNumber()),P=g.volume.bIn.toString(),x=g.volume.bOut.toString(),O=g.liquidity.b.toString();a==="0"&&(P=g.volume.aIn.toString(),x=g.volume.aOut.toString(),O=g.liquidity.a.toString());let T=b.fromPermill(f.toNumber()),w=R.recalculateProtocolFee(P,x,O,"9",o.toString(),b.toRaw(T).toString(),v.toString(),b.toRaw(d).toString(),b.toRaw(h).toString(),c.toString(),m.toString());return[n.toNumber(),Number(w)*1e6,l.toNumber()]}async subscribeUpdates(){let[e]=this.pools,t=e.tokens.map(n=>n.id),r=[],s=await this.api.query.omnipool.assets.multi(t,n=>{e.tokens=n.map((l,c)=>{let m=e.tokens[c];if(l.isNone)return m;let d=l.unwrap();return this.updateTokenState(m,d)})});r.push(s);let i=await this.api.query.dynamicFees.assetFee.multi(t,n=>{n.forEach((l,c)=>{let m=t[c];this.dynamicFees.set(m,l)})});if(r.push(i),this.isAssetConfigSupported()){let n=await this.api.query.dynamicFees.assetFeeConfiguration.multi(t,l=>{l.forEach((c,m)=>{let d=t[m];this.dynamicFeesConfiguration.set(d,c)})});r.push(n)}let a=t.map(n=>{let l=this.getOracleKey(n);return[br,l,Pr]}),o=await this.api.query.emaOracle.oracles.multi(a,n=>{n.forEach(async(l,c)=>{let m=a[c],[d,h,g]=m;this.oracles.set(h.join(":"),l)})});return r.push(o),()=>{for(let n of r)try{n()}catch(l){console.warn("Omnipool unsubscribe failed",l)}}}updateTokenState(e,t){let{hubReserve:r,shares:s,tradable:i,cap:a,protocolShares:o}=t;return{...e,hubReserves:p(r.toString()),shares:p(s.toString()),cap:p(a.toString()),protocolShares:p(o.toString()),tradeable:i.bits.toNumber()}}};var C=require("@galacticcouncil/math-xyk"),J=class{static getSpotPrice(e,t,r){return(0,C.get_spot_price)(e,t,r)}static calculateInGivenOut(e,t,r){return(0,C.calculate_in_given_out)(e,t,r)}static calculateOutGivenIn(e,t,r){return(0,C.calculate_out_given_in)(e,t,r)}static calculatePoolTradeFee(e,t,r){return(0,C.calculate_pool_trade_fee)(e,t,r)}static calculateLiquidityIn(e,t,r){return(0,C.calculate_liquidity_in)(e,t,r)}static calculateSpotPrice(e,t){return(0,C.calculate_spot_price)(e,t)}static calculateSpotPriceWithFee(e,t,r,s){return(0,C.calculate_spot_price_with_fee)(e,t,r,s)}static calculateShares(e,t,r){return(0,C.calculate_shares)(e,t,r)}static calculateLiquidityOutAssetA(e,t,r,s){return(0,C.calculate_liquidity_out_asset_a)(e,t,r,s)}static calculateLiquidityOutAssetB(e,t,r,s){return(0,C.calculate_liquidity_out_asset_b)(e,t,r,s)}};var Ue=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new u(e)}constructor(e){this.type="Xyk",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),o=p(i.balance),n=p(s.existentialDeposit),l=p(i.existentialDeposit);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:a,balanceOut:o,assetInED:n,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateTradeFee(s,r),a=b.toPct(r.exchangeFee),o=s.plus(i),n=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&n.push("InsufficientTradingAmount");let l=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(l)&&n.push("MaxOutRatioExceeded");let c=e.balanceIn.div(this.maxInRatio);return o.isGreaterThan(c)&&n.push("MaxInRatioExceeded"),{amountIn:o,calculatedIn:s,amountOut:t,feePct:a,errors:n}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateTradeFee(s,r),a=b.toPct(r.exchangeFee),o=s.minus(i),n=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&n.push("InsufficientTradingAmount");let l=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(l)&&n.push("MaxInRatioExceeded");let c=e.balanceOut.div(this.maxOutRatio);return o.isGreaterThan(c)&&n.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:o,feePct:a,errors:n}}calculateInGivenOut(e,t){let r=J.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?B:s}calculateOutGivenIn(e,t){let r=J.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?B:s}spotPriceInGivenOut(e){let t=J.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),r=A(E,18-e.decimalsOut);return p(t).div(r)}spotPriceOutGivenIn(e){let t=J.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),r=A(E,18-e.decimalsIn);return p(t).div(r)}calculateTradeFee(e,t){let r=J.calculatePoolTradeFee(e.toString(),t.exchangeFee[0],t.exchangeFee[1]);return p(r)}};var qe=class extends U{getPoolType(){return"Xyk"}getPoolLimits(){let e=this.api.consts.xyk.maxInRatio.toNumber(),t=this.api.consts.xyk.maxOutRatio.toNumber(),r=this.api.consts.xyk.minTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}isSupported(){return this.api.query.xyk!==void 0}async loadPools(){let t=(await this.api.query.xyk.poolAssets.entries()).map(async([{args:[r]},s])=>{let i=r.toString(),[a,o]=s.unwrap(),[n,l]=await Promise.all([this.getBalance(i,a.toString()),this.getBalance(i,o.toString())]);return{address:i,type:"Xyk",tokens:[{id:a.toString(),balance:n.toString()},{id:o.toString(),balance:l.toString()}],...this.getPoolLimits()}});return Promise.all(t)}async getPoolFees(e,t,r){return{exchangeFee:this.getExchangeFee()}}getExchangeFee(){let[e,t]=this.api.consts.xyk.getExchangeFee;return b.fromRate(e.toNumber(),t.toNumber())}async subscribeUpdates(){return()=>{}}};var k=require("@galacticcouncil/math-stableswap"),M=class{static getPoolAddress(e){return(0,k.pool_account_name)(e)}static defaultPegs(e){let t=[];for(let r=0;r<e;r++)t.push(["1","1"]);return t}static calculateAmplification(e,t,r,s,i){return(0,k.calculate_amplification)(e,t,r,s,i)}static calculateInGivenOut(e,t,r,s,i,a,o){return(0,k.calculate_in_given_out)(e,t,r,s,i,a,o)}static calculateAddOneAsset(e,t,r,s,i,a,o){return(0,k.calculate_add_one_asset)(e,t,r,s,i,a,o)}static calculateSharesForAmount(e,t,r,s,i,a,o){return(0,k.calculate_shares_for_amount)(e,t,r,s,i,a,o)}static calculateOutGivenIn(e,t,r,s,i,a,o){return(0,k.calculate_out_given_in)(e,t,r,s,i,a,o)}static calculateLiquidityOutOneAsset(e,t,r,s,i,a,o){return(0,k.calculate_liquidity_out_one_asset)(e,t,r,s,i,a,o)}static calculateShares(e,t,r,s,i,a){return(0,k.calculate_shares)(e,t,r,s,i,a)}static calculateSpotPriceWithFee(e,t,r,s,i,a,o,n){return(0,k.calculate_spot_price_with_fee)(e,t,r,s,i,a,o,n)}static recalculatePegs(e,t,r,s,i,a){let o=(0,k.recalculate_peg)(e,t,r,s,i,a);return JSON.parse(o)}};var ae=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;pegs;pegsFee;static fromPool(e){return new u(e)}constructor(e){this.type="Stableswap",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.amplification=e.amplification,this.id=e.id,this.fee=e.fee,this.totalIssuance=e.totalIssuance,this.pegs=e.pegs,this.pegsFee=e.pegsFee}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),o=p(i.balance),n=p(s.existentialDeposit),l=p(i.existentialDeposit);return{assetIn:e,assetOut:t,balanceIn:a,balanceOut:o,decimalsIn:s.decimals,decimalsOut:i.decimals,tradeableIn:this.id===e?15:s.tradeable,tradeableOut:this.id===t?15:i.tradeable,assetInED:n,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),a=i.minus(s),o=s===B?B:a.div(s).multipliedBy(100).decimalPlaces(4),n=[],l=R.isSellAllowed(e.tradeableIn),c=R.isBuyAllowed(e.tradeableOut);return(!l||!c)&&n.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&n.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:o.toNumber(),errors:n}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,r),o=s.minus(i).div(s).multipliedBy(100).decimalPlaces(4),n=[],l=R.isSellAllowed(e.tradeableIn),c=R.isBuyAllowed(e.tradeableOut);return(!l||!c)&&n.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&n.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:o.toNumber(),errors:n}}calculateIn(e,t,r){let s=M.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?b.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=p(s);return i.isNegative()?B:i}calculateAddOneAsset(e,t,r){let s=M.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,r?b.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=p(s);return i.isNegative()?B:i}calculateSharesForAmount(e,t,r){let s=M.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,r?b.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=p(s);return i.isNegative()?B:i}calculateInGivenOut(e,t,r){return e.assetOut==this.id?this.calculateAddOneAsset(e,t,r):e.assetIn==this.id?this.calculateSharesForAmount(e,t,r):this.calculateIn(e,t,r)}spotPriceInGivenOut(e){let t=M.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetOut,e.assetIn,this.totalIssuance,"0",this.getPegs());if(e.assetOut==this.id)return p(t);if(e.assetIn==this.id){let s=A(E,e.decimalsIn-e.decimalsOut);return p(t).div(s).decimalPlaces(0,1)}let r=A(E,18-e.decimalsIn);return p(t).div(r).decimalPlaces(0,1)}calculateOut(e,t,r){let s=M.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?b.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=p(s);return i.isNegative()?B:i}calculateWithdrawOneAsset(e,t,r){let s=M.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,r?b.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=p(s);return i.isNegative()?B:i}calculateShares(e,t,r){let s=M.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,r?b.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=p(s);return i.isNegative()?B:i}calculateOutGivenIn(e,t,r){return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t,r):e.assetOut==this.id?this.calculateShares(e,t,r):this.calculateOut(e,t,r)}spotPriceOutGivenIn(e){let t=M.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetIn,e.assetOut,this.totalIssuance,"0",this.getPegs());if(e.assetIn==this.id)return p(t);if(e.assetOut==this.id){let s=A(E,e.decimalsOut-e.decimalsIn);return p(t).div(s).decimalPlaces(0,1)}let r=A(E,18-e.decimalsOut);return p(t).div(r).decimalPlaces(0,1)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let e=this.tokens.filter(t=>t.id!=this.id).map(({id:t,balance:r,decimals:s})=>({asset_id:Number(t),amount:r,decimals:s}));return JSON.stringify(e)}getAssets(e,t){let r={asset_id:Number(e),amount:t.toFixed(0)};return JSON.stringify([r])}};var mt=require("@polkadot/util-crypto");var Ge=class extends U{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(e){let t=Number(e),r=M.getPoolAddress(t);return(0,mt.encodeAddress)((0,mt.blake2AsHex)(r),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:this.api.consts.stableswap.minTradingLimit.toNumber()}}async getPoolDelta(e,t,r){let{initialAmplification:s,finalAmplification:i,initialBlock:a,finalBlock:o}=t,n=M.calculateAmplification(s.toString(),i.toString(),a.toString(),o.toString(),r),l=await this.api.query.tokens.totalIssuance(e);return{amplification:n,totalIssuance:l.toString()}}async getPoolTokens(e,t,r){let{assets:s}=r,i=s.map(async a=>{let[o,n]=await Promise.all([this.api.query.stableswap.assetTradability(t,a.toString()),this.getBalance(e,a.toString())]);return{id:a.toString(),tradeable:o.bits.toNumber(),balance:n.toString()}});return Promise.all(i)}isSupported(){return this.api.query.stableswap!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.stableswap.pools.entries(),this.api.query.system.number()]),r=t.toNumber(),s=e.map(async([{args:[a]},o])=>{try{let n=o.unwrap(),l=a.toString(),c=this.getPoolAddress(l),[m,d,h]=await Promise.all([this.getPoolDelta(l,n,r.toString()),this.getPoolTokens(c,l,n),this.getPoolPegs(l,n,r.toString())]);return d.push({id:l,tradeable:15,balance:m.totalIssuance}),this.poolsData.set(c,n),{address:c,id:l,type:"Stableswap",fee:b.fromPermill(n.fee.toNumber()),tokens:d,...m,...h,...this.getPoolLimits()}}catch(n){return console.warn(`Skipping pool ${a.toString()}
1
+ "use strict";var Bt=Object.defineProperty;var Rr=Object.getOwnPropertyDescriptor;var Er=Object.getOwnPropertyNames;var Nr=Object.prototype.hasOwnProperty;var _r=(u,e)=>{for(var t in e)Bt(u,t,{get:e[t],enumerable:!0})},Cr=(u,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Er(e))!Nr.call(u,s)&&s!==t&&Bt(u,s,{get:()=>e[s],enumerable:!(r=Rr(e,s))||r.enumerable});return u};var kr=u=>Cr(Bt({},"__esModule",{value:!0}),u);var ns={};_r(ns,{AaveClient:()=>ce,AavePool:()=>Ne,AavePoolClient:()=>ke,AaveUtils:()=>ee,AssetClient:()=>te,AssetNotFound:()=>Nt,BASILISK_PARACHAIN_ID:()=>bs,BalanceClient:()=>W,BalanceClientV2:()=>me,BigNumber:()=>S.BigNumber,CachingPoolService:()=>fe,ChainParams:()=>pe,DECIMAL_PLACES:()=>tr,DEFAULT_BLOCK_TIME:()=>Vt,DEFAULT_MIN_BUDGET:()=>Yt,ERC20:()=>G,EvmClient:()=>Ee,EvmRpcAdapter:()=>Re,FarmClient:()=>tt,H160:()=>Y,HUB_ASSET_ID:()=>Je,HYDRADX_PARACHAIN_ID:()=>Ps,HYDRADX_SS58_PREFIX:()=>X,INFINITY:()=>Dr,LbpMath:()=>V,LbpPool:()=>De,LbpPoolClient:()=>Me,MmOracleClient:()=>de,ONE:()=>E,ORDER_MIN_BLOCK_PERIOD:()=>Kt,OmniMath:()=>R,OmniPool:()=>Le,OmniPoolClient:()=>He,PERBILL_DENOMINATOR:()=>jt,PERMILL_DENOMINATOR:()=>ne,PolkadotApiClient:()=>H,PoolConfigNotFound:()=>Et,PoolError:()=>se,PoolFactory:()=>be,PoolNotFound:()=>Ae,PoolService:()=>ye,PoolType:()=>N,ProviderConfigNotFound:()=>kt,RUNTIME_DECIMALS:()=>Te,RouteNotFound:()=>Fe,Router:()=>Pe,SYSTEM_ASSET_DECIMALS:()=>Qt,SYSTEM_ASSET_ID:()=>_,StableMath:()=>M,StableSwap:()=>ae,StableSwapClient:()=>Ge,StorageConfigNotFound:()=>_t,SubscriptionNotSupported:()=>Ct,TRADEABLE_DEFAULT:()=>Oe,TWAP_BLOCK_PERIOD:()=>Se,TWAP_MAX_DURATION:()=>ft,TWAP_MAX_PRICE_IMPACT:()=>yt,TWAP_TX_MULTIPLIER:()=>rs,TradeOrderError:()=>Xt,TradeOrderType:()=>ht,TradeRouteBuilder:()=>z,TradeRouter:()=>oe,TradeScheduler:()=>xe,TradeType:()=>gt,TxBuilderFactory:()=>we,XykMath:()=>J,XykPool:()=>Ue,XykPoolClient:()=>qe,ZERO:()=>B,bnFormatter:()=>$r,bnum:()=>p,calculateBuyFee:()=>zt,calculateDiffToAvg:()=>ts,calculateDiffToRef:()=>ve,calculateSellFee:()=>Wt,createChain:()=>Dt,createSdkContext:()=>is,findNestedKey:()=>Ce,findNestedObj:()=>Kr,getFraction:()=>ie,hashPools:()=>Jr,isEvmAccount:()=>Jt,isEvmAddress:()=>Zt,isSs58Address:()=>er,scale:()=>A,toBn:()=>Mr,toDecimals:()=>I});module.exports=kr(ns);var Qe=[{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 wt=[{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 $t="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Tt="0x112b087b60C1a166130d59266363C45F8aa99db0",Ot="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",le=1000000n;var ds=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var ce=class{rpcAdapter;constructor(e){this.rpcAdapter=e.getRPCAdapter()}async getBlockTimestamp(){let e=await this.rpcAdapter.getBlock();return Number(e.timestamp)}async getReservesData(){return await this.rpcAdapter.readContract({abi:wt,address:Tt,functionName:"getReservesData",args:[Ot]})}async getUserReservesData(e){return await this.rpcAdapter.readContract({abi:wt,address:Tt,functionName:"getUserReservesData",args:[Ot,e]})}async getUserAccountData(e){return await this.rpcAdapter.readContract({abi:Qe,address:$t,functionName:"getUserAccountData",args:[e]})}};var Z=require("@polkadot/util-crypto"),ue=require("@polkadot/util"),j=require("buffer");var bs=2090,ne=1e6,jt=1e9,Je="1",Ps=2034,X=63,Te=18,_="0",Qt=12,Oe=15;var It="ETH\0";function Jt(u){if(!u)return!1;try{let e=(0,Z.decodeAddress)(u,!0),t=j.Buffer.from(It);return j.Buffer.from(e.subarray(0,t.length)).equals(t)}catch{return!1}}function Zt(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function er(u){try{let e=(0,ue.isHex)(u)?(0,ue.hexToU8a)(u):(0,Z.decodeAddress)(u);return(0,Z.encodeAddress)(e),!0}catch{return!1}}var Y=class u{static toAccount=e=>{let t=j.Buffer.from(e.slice(2),"hex"),r=j.Buffer.from(It);return(0,Z.encodeAddress)(new Uint8Array(j.Buffer.concat([r,t,j.Buffer.alloc(8)])),63)};static fromAccount=e=>{let t=(0,Z.decodeAddress)(e),r=j.Buffer.from(It),s=t.slice(r.length,-8);return"0x"+j.Buffer.from(s).toString("hex")};static fromSS58=e=>{let r=(0,Z.decodeAddress)(e).slice(0,20);return(0,ue.u8aToHex)(r)};static fromAny=e=>{if(Zt(e))return e;if(Jt(e))return u.fromAccount(e);if(er(e))return u.fromSS58(e);throw new Error("Unknown address type")}};var Ie=require("buffer"),G=class{static fromAssetId(e){let t=Number(e),r=Ie.Buffer.alloc(20,0);return r[15]=1,r.writeUInt32BE(t,16),"0x"+r.toString("hex")}static toAssetId(e){let t=Ie.Buffer.from(e.replace("0x",""),"hex");return t.length!==20||!this.isAssetAddress(e)?null:t.readUInt32BE(16)}static isAssetAddress(e){let t=Ie.Buffer.from("0000000000000000000000000000000100000000","hex"),r=Ie.Buffer.from(e.replace("0x",""),"hex");return r.length!==20?!1:r.subarray(0,16).equals(t.subarray(0,16))}};var S=require("bignumber.js"),tr=12;S.BigNumber.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:tr});var B=p(0),E=p(1),Dr=p("Infinity");function A(u,e){let t=new S.BigNumber(e.toString()),r=new S.BigNumber(10).pow(t);return u.times(r).decimalPlaces(4)}function p(u){return new S.BigNumber(u.toString())}function Mr(u,e){let t=p(u);return A(t,e)}function I(u,e){return u.shiftedBy(-1*e).toString()}var Ze=p("1e27"),Lr=p("1.01"),Hr=p("31536000"),rr=4,et=-1,ee=class{client;constructor(e){this.client=new ce(e)}async getSummary(e){let t=Y.fromAny(e),[r,s,i,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(t),this.client.getUserAccountData(t),this.client.getBlockTimestamp()]),[o]=r,[n,l]=s,[c,m,d,h,g,f]=i,y=p(f).dividedBy(1e18).decimalPlaces(6,S.BigNumber.ROUND_DOWN),v=p(c),P=p(m),x=[];for(let O of n){let T=O.underlyingAsset.toLowerCase(),w=o.find(({underlyingAsset:Fr})=>Fr.toLowerCase()===T);if(!w)throw new Error("Missing pool reserve for "+T);let D=p(O.scaledATokenBalance),q=p(w.liquidityIndex),Ke=p(w.liquidityRate),$e=p(w.availableLiquidity),vt=p(w.priceInMarketReferenceCurrency),St=a+6,xt=this.calculateLinearInterest(Ke,w.lastUpdateTimestamp,St),je=q.multipliedBy(xt).dividedBy(Ze).decimalPlaces(0,S.BigNumber.ROUND_DOWN),Tr=D.multipliedBy(je).dividedBy(Ze).decimalPlaces(0,S.BigNumber.ROUND_DOWN),Or=p(l!==0&&l===w.eModeCategoryId?w.eModeLiquidationThreshold:w.reserveLiquidationThreshold).div(1e4),Ir=w.usageAsCollateralEnabled&&O.usageAsCollateralEnabledOnUser&&p(O.scaledATokenBalance).gt(0),Ar=G.toAssetId(T);x.push({aTokenBalance:Tr,availableLiquidity:$e,decimals:Number(w.decimals),isCollateral:Ir,priceInRef:vt,reserveId:Ar,reserveAsset:T,reserveLiquidationThreshold:Or})}return{healthFactor:y.toNumber(),currentLiquidationThreshold:p(h).dividedBy(10**rr).toNumber(),totalCollateral:v,totalDebt:P,reserves:x}}async hasBorrowPositions(e){let t=Y.fromAny(e),r=await this.client.getUserAccountData(t),[s,i]=r;return i>0n}async getHealthFactor(e){let t=Y.fromAny(e),r=await this.client.getUserAccountData(t),[s,i,a,o,n,l]=r;return this.calculateHealthFactorFromBalances(p(i),p(s),p(o))}async getHealthFactorAfterWithdraw(e,t,r){let{totalCollateral:s,totalDebt:i,reserves:a,currentLiquidationThreshold:o}=await this.getSummary(e);if(i.lte(0))return et;let n=G.fromAssetId(t),l=a.find(x=>x.reserveAsset===n);if(!l)throw new Error("Missing reserve ctx for "+n);let{decimals:c,isCollateral:m,priceInRef:d,reserveLiquidationThreshold:h}=l,g=A(p(r),c).decimalPlaces(0,S.BigNumber.ROUND_DOWN),f=m?g.multipliedBy(d).dividedBy(p(10).pow(c)).decimalPlaces(0,S.BigNumber.ROUND_DOWN):B,y=s.minus(f);if(y.lte(0))return 0;let v=s.multipliedBy(p(o)).minus(f.multipliedBy(h)).dividedBy(y);return y.multipliedBy(v).dividedBy(i).decimalPlaces(6,S.BigNumber.ROUND_DOWN).toNumber()}async getHealthFactorAfterSupply(e,t,r){let{totalCollateral:s,totalDebt:i,reserves:a,currentLiquidationThreshold:o}=await this.getSummary(e);if(i.lte(0))return et;let n=G.fromAssetId(t),l=a.find(P=>P.reserveAsset===n);if(!l)throw new Error("Missing reserve ctx for "+n);let{decimals:c,priceInRef:m,reserveLiquidationThreshold:d}=l,g=A(p(r),c).decimalPlaces(0,S.BigNumber.ROUND_DOWN).multipliedBy(m).dividedBy(p(10).pow(c)).decimalPlaces(0,S.BigNumber.ROUND_DOWN),f=s.plus(g);if(f.lte(0))return 0;let y=s.multipliedBy(p(o)).plus(g.multipliedBy(d)).dividedBy(f);return f.multipliedBy(y).dividedBy(i).decimalPlaces(6,S.BigNumber.ROUND_DOWN).toNumber()}async getHealthFactorAfterSwap(e,t,r,s,i){let{totalDebt:a,reserves:o,healthFactor:n}=await this.getSummary(e);if(a.lte(0))return et;let l=G.fromAssetId(r),c=G.fromAssetId(i),m=o.find(w=>w.reserveAsset===l),d=o.find(w=>w.reserveAsset===c);if(!m)throw new Error(`Missing reserve ctx for ${l}`);if(!d)throw new Error(`Missing reserve ctx for ${c}`);let h=A(p(t),m.decimals).decimalPlaces(0,S.BigNumber.ROUND_DOWN),g=A(p(s),d.decimals).decimalPlaces(0,S.BigNumber.ROUND_DOWN),f=h.multipliedBy(m.priceInRef).dividedBy(p(10).pow(m.decimals)).decimalPlaces(0,S.BigNumber.ROUND_DOWN),y=g.multipliedBy(d.priceInRef).dividedBy(p(10).pow(d.decimals)).decimalPlaces(0,S.BigNumber.ROUND_DOWN),v=m.isCollateral?f.multipliedBy(m.reserveLiquidationThreshold):B,O=y.multipliedBy(d.reserveLiquidationThreshold).minus(v).dividedBy(a);return p(n).plus(O).decimalPlaces(6,S.BigNumber.ROUND_DOWN).toNumber()}async getMaxWithdraw(e,t){let{totalDebt:r,reserves:s,healthFactor:i}=await this.getSummary(e),a=G.fromAssetId(t),o=s.find(n=>n.reserveAsset===a);if(!o)throw new Error("Missing reserve data for "+a);return this.calculateWithdrawMax(o,r,i)}async getMaxWithdrawAll(e){let{totalDebt:t,reserves:r,healthFactor:s}=await this.getSummary(e),i={};for(let a of r){let o=this.calculateWithdrawMax(a,t,s);a.reserveId&&(i[a.reserveId]=o)}return i}calculateWithdrawMax(e,t,r){let{aTokenBalance:s,availableLiquidity:i,decimals:a,priceInRef:o,reserveLiquidationThreshold:n,isCollateral:l}=e,c=s;if(l&&t.gt(0)){let d=p(r).minus(Lr);if(d.gt(0)){let g=d.multipliedBy(t).dividedBy(n).decimalPlaces(0,S.BigNumber.ROUND_DOWN).dividedBy(o).multipliedBy(p(10).pow(a)).decimalPlaces(0,S.BigNumber.ROUND_DOWN);c=S.BigNumber.minimum(s,g)}else c=B}return{amount:S.BigNumber.minimum(c,i),decimals:a}}calculateLinearInterest(e,t,r){let s=r-t;return s<=0?Ze:e.multipliedBy(s).dividedBy(Hr).plus(Ze).decimalPlaces(0,S.BigNumber.ROUND_DOWN)}calculateHealthFactorFromBalances(e,t,r){return e.lte(0)?et:t.multipliedBy(r).dividedBy(e).dividedBy(p(10).pow(rr)).decimalPlaces(6,S.BigNumber.ROUND_DOWN).toNumber()}};function sr(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var Ms=require("@galacticcouncil/api-augment/hydradx"),Ls=require("@galacticcouncil/api-augment/basilisk"),H=class{api;constructor(e){this.api=e}get chainDecimals(){return this.api.registry.chainDecimals[0]}get chainToken(){return this.api.registry.chainTokens[0]}log(e,...t){let r=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");sr(r)&&console.log(e,...t)}};var te=class extends H{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(e){super(e)}async safeSharesQuery(){try{let e=await this.api.query.stableswap.pools.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}async safeBondsQuery(){try{let e=await this.api.query.bonds.bonds.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}async metadataQuery(){try{let e=await this.api.query.assetRegistry.assetMetadataMap.entries();return new Map(e.map(([{args:[t]},r])=>{let{decimals:s,symbol:i}=r.unwrap();return[t.toString(),{decimals:s.toNumber(),symbol:i.toHuman()}]}))}catch{return new Map([])}}async locationsQuery(){try{let e=await this.api.query.assetRegistry.assetLocations.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}getSystemTokenName(e){switch(e){case"HDX":return"Hydration";case"BSX":return"Basilisk";default:return e}}getToken(e,t,r,s){if(e=="0"){let m=this.api.consts.balances.existentialDeposit;return{id:"0",name:this.getSystemTokenName(this.chainToken),symbol:this.chainToken,decimals:this.chainDecimals,icon:this.chainToken,type:"Token",isSufficient:!0,existentialDeposit:m.toString()}}let{name:i,assetType:a,isSufficient:o,existentialDeposit:n}=t,{symbol:l,decimals:c}=r.get(e)??{};return{id:e,name:i.toHuman(),symbol:l,decimals:c,icon:l,type:a.toHuman(),isSufficient:o?o.toHuman():!0,location:s?.toJSON(),existentialDeposit:n.toString()}}getBond(e,t,r,s){let[i,a]=s,{assetType:o,isSufficient:n,existentialDeposit:l}=t,{symbol:c,decimals:m}=this.getToken(i.toString(),t,r),d=a.toNumber(),h=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",h.format(d)].join(" ");return{id:e,name:g,symbol:c+"b",decimals:m,icon:c,type:o.toString(),isSufficient:n.toHuman(),existentialDeposit:l.toString(),underlyingAssetId:i.toString(),maturity:d}}getShares(e,t,r,s){let{assets:i}=s,{name:a,symbol:o,assetType:n,isSufficient:l,existentialDeposit:c}=t,d=i.map(f=>f.toString()).map(f=>{let{symbol:y}=this.getToken(f,t,r);return[f,y]}),h=Object.fromEntries(d),g=Object.values(h);return{id:e,name:g.join(", "),symbol:o?.isSome?o.toHuman():a.toHuman(),decimals:18,icon:g.join("/"),type:n.toString(),isSufficient:l.toHuman(),existentialDeposit:c.toString(),meta:h}}getExternal(e,t,r,s){let i=this.getToken(e,t,new Map,s),a=r?.find(o=>o.internalId===i.id);return a?{...i,decimals:a.decimals,name:a.name,symbol:a.symbol,icon:a.symbol,isWhiteListed:a.isWhiteListed}:i}normalizeMetadata(e,t){return t.size?t:new Map(e.map(([{args:[r]},s])=>{let{decimals:i,symbol:a}=s.unwrap();return[r.toString(),{decimals:Number(i.toString()),symbol:a.toHuman()}]}))}getSupportedAssets(e){return e.filter(([t,r])=>{if(r.isNone)return!1;let s=r.unwrap();return this.isSupportedAsset(s)})}async getOnChainAssets(e,t){let[r,s,i,a,o]=await Promise.all([this.api.query.assetRegistry.assets.entries(),this.locationsQuery(),this.safeSharesQuery(),this.safeBondsQuery(),this.metadataQuery()]),n=this.getSupportedAssets(r),l=this.normalizeMetadata(n,o),c=n.map(([{args:[m]},d])=>{let h=d.unwrap(),g=s.get(m.toString()),{assetType:f}=h;switch(f.toString()){case"Bond":let y=a.get(m.toString());return this.getBond(m.toString(),h,l,y);case"StableSwap":let v=i.get(m.toString());return this.getShares(m.toString(),h,l,v);case"External":return this.getExternal(m.toString(),h,t,g);default:return this.getToken(m.toString(),h,l,g)}});return e?c:c.filter(m=>this.isValidAsset(m))}isValidAsset(e){let t=Math.sign(e.decimals);return!!e.symbol&&(t===0||t===1)}isSupportedAsset(e){let t=e.assetType.toString();return this.SUPPORTED_TYPES.includes(t)}};var W=class extends H{constructor(e){super(e)}async getBalance(e,t){let r=await this.api.query.assetRegistry.assets(t),{assetType:s}=r.unwrap();return s.toString()==="Erc20"?this.getErc20Balance(e,t):t==="0"?this.getSystemBalance(e):this.getTokenBalance(e,t)}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateFreeBalance(t)}async getTokenBalance(e,t){let r=await this.api.query.tokens.accounts(e,t);return this.calculateFreeBalance(r)}async getErc20Balance(e,t){let r=await this.getTokenBalanceData(e,t);return this.calculateFreeBalance(r)}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t("0",this.calculateFreeBalance(r)))}async subscribeSystemBalances(e,t){return this.api.query.system.account.multi(e,r=>{let s=[];r.forEach((i,a)=>{let o=this.calculateFreeBalance(i.data),n=e[a];s.push([n,o])}),t(s)})}async subscribeTokenBalance(e,t,r){let s=await this.api.query.tokens.accounts.keys(e),i=r?r.map(a=>[e,a]):s.map(({args:[a,o]})=>[a.toString(),o.toString()]);return this.api.query.tokens.accounts.multi(i,a=>{let o=[];a.forEach((n,l)=>{let c=this.calculateFreeBalance(n),m=i[l][1];o.push([m,c])}),t(o)})}async subscribeTokenBalances(e,t){return this.api.query.tokens.accounts.multi(e,r=>{let s=[];r.forEach((i,a)=>{let o=this.calculateFreeBalance(i),n=e[a];s.push([n,o])}),t(s)})}async subscribeErc20Balance(e,t,r){let i=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([n,l])=>{let{assetType:c}=l.unwrap();return c.toString()==="Erc20"}).map(([{args:[n]}])=>n.toString()))(),a=async()=>{let o=await Promise.all(i.map(async n=>[n,await this.getErc20Balance(e,n)]));t(o)};return this.api.rpc.chain.subscribeNewHeads(async()=>{a()})}async subscribeErc20Balances(e,t){let r=async()=>{let s=await Promise.all(e.map(async i=>{let[a,o]=i;return[i,await this.getErc20Balance(a,o)]}));t(s)};return this.api.rpc.chain.subscribeNewHeads(async()=>{r()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateFreeBalance(e){let t=e.free.toString(),r=e.frozen.toString();return(0,S.BigNumber)(t).lt(r)?(0,S.BigNumber)(0):(0,S.BigNumber)(t).minus(r)}};var me=class extends H{constructor(e){super(e)}async getBalance(e,t){let r=await this.api.query.assetRegistry.assets(t),{assetType:s}=r.unwrap();return s.toString()==="Erc20"?this.getErc20Balance(e,t):t==="0"?this.getSystemBalance(e):this.getTokenBalance(e,t)}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateBalance(t)}async getTokenBalance(e,t){let r=await this.api.query.tokens.accounts(e,t);return this.calculateBalance(r)}async getErc20Balance(e,t){let r=await this.getTokenBalanceData(e,t);return this.calculateBalance(r)}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t("0",this.calculateBalance(r)))}async subscribeTokenBalance(e,t,r){let s=await this.api.query.tokens.accounts.keys(e),i=r?r.map(a=>[e,a]):s.map(({args:[a,o]})=>[a.toString(),o.toString()]);return this.api.query.tokens.accounts.multi(i,a=>{let o=[];a.forEach((n,l)=>{let c=i[l][1],m=this.calculateBalance(n);o.push([c,m])}),t(o)})}async subscribeErc20Balance(e,t,r){let i=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([n,l])=>{let{assetType:c}=l.unwrap();return c.toString()==="Erc20"}).map(([{args:[n]}])=>n.toString()))(),a=async()=>{let o=await Promise.all(i.map(async n=>[n,await this.getErc20Balance(e,n)]));t(o)};return this.api.rpc.chain.subscribeNewHeads(async()=>{a()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateBalance(e){let t=(0,S.BigNumber)(e.free.toString()),r=e.frozen.toString(),s=e.reserved.toString(),i=t.gte(r)?t.minus(r).toString():"0",a=t.plus(s).toString();return{free:t.toString(),total:a,transferable:i,reserved:s,frozen:r}}};var pe=class{api;_minOrderBudget;_blockTime;constructor(e){this.api=e}get blockTime(){return this._blockTime===void 0&&(this._blockTime=this.api.consts.aura.slotDuration.toNumber()),this._blockTime}get minOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=this.api.consts.dca.minBudgetInNativeCurrency.toString()),p(this._minOrderBudget)}};var At=require("@galacticcouncil/math-liquidity-mining"),ir=require("@polkadot/types"),Ft=require("@polkadot/util"),Rt=require("@polkadot/util-crypto");var tt=class extends H{balanceClient;constructor(e){super(e),this.balanceClient=new W(e)}secondsInYear=new S.BigNumber(365.2425).times(24).times(60).times(60);async getOmnipoolFarms(e){let t=await this.api.query.omnipoolWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,i])=>{let[,a]=s.args,o=i.unwrap().toString(),n=a.toString(),l=(await this.api.query.omnipoolWarehouseLM.globalFarm(n)).unwrap(),c=(await this.api.query.omnipoolWarehouseLM.yieldFarm(e,n,o)).unwrap(),m=await this.getOraclePrice(l)??l.priceAdjustment.toString(),h=this.getAccountResolver(this.api.registry)(Number(n),!1).toString(),g=l.rewardCurrency.toString(),f=await this.balanceClient.getTokenBalanceData(h,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:m,potBalance:f.free.toString()}}))}async getIsolatedPoolFarms(e){let t=await this.api.query.xykWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,i])=>{let[,a]=s.args,o=i.unwrap().toString(),n=a.toString(),l=(await this.api.query.xykWarehouseLM.globalFarm(n)).unwrap(),c=(await this.api.query.xykWarehouseLM.yieldFarm(e,n,o)).unwrap(),m=await this.getOraclePrice(l)??l.priceAdjustment.toString(),h=this.getAccountResolver(this.api.registry)(Number(n),!0).toString(),g=l.rewardCurrency.toString(),f=await this.balanceClient.getTokenBalanceData(h,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:m,potBalance:f.free.toString()}}))}async getOraclePrice(e){let t=e.rewardCurrency.toString(),r=e.incentivizedAsset.toString(),s=[t,r].sort();if(t===r)return new S.BigNumber(1).shiftedBy(18).toString();let i=await this.api.query.emaOracle.oracles("omnipool",s,"TenMinutes");if(i.isNone)return;let[a]=i.unwrap(),o=a.price.n.toString(),n=a.price.d.toString(),l;return Number(t)<Number(r)?l=(0,At.fixed_from_rational)(o,n):l=(0,At.fixed_from_rational)(n,o),l}getGlobalRewardPerPeriod(e,t,r,s){let a=e.times(t).shiftedBy(-18).times(s).shiftedBy(-18);return a.gte(r)?r:a}getPoolYieldPerPeriod(e,t,r,s){return e.times(t).div(r.times(s).shiftedBy(-18))}padEndU8a(e,t){return(0,Ft.u8aConcat)(e,Array(Math.max(0,t-e.length)).fill(0))}getAccountResolver=e=>(t,r)=>{let s="modl",i=r?"0x78796b4c4d704944":"0x4f6d6e6957684c4d";return new ir.GenericAccountId32(e,this.padEndU8a((0,Ft.u8aConcat)(s,i,typeof t!="number"?t.toU8a():[t]),32))};async getFarmApr(e,t){if(t==="isolatedpool"&&!(0,Rt.isAddress)(e))throw new Error("You must pass an address of isolated pool as id");if(t==="omnipool"&&(0,Rt.isAddress)(e))throw new Error("You must pass an asset id of omnipool");let r=6,s=t==="omnipool"?await this.getOmnipoolFarms(e):await this.getIsolatedPoolFarms(e);return s.length?s.map(({yieldFarm:o,globalFarm:n,priceAdjustment:l,potBalance:c})=>{let m=new S.BigNumber(n.totalSharesZ.toString()),d=n.plannedYieldingPeriods.toString(),h=new S.BigNumber(n.yieldPerPeriod.toString()),g=new S.BigNumber(n.maxRewardPerPeriod.toString()),f=n.blocksPerPeriod.toString(),y=new S.BigNumber(o.multiplier.toString()).shiftedBy(-18),v=this.secondsInYear.div(new S.BigNumber(r).times(f)),P;if(m.isZero())P=h.times(y).times(v);else{let D=this.getGlobalRewardPerPeriod(m,h,g,l);P=this.getPoolYieldPerPeriod(D,y,m,l).times(v)}let x=new S.BigNumber(n.pendingRewards.toString()).plus(n.accumulatedPaidRewards.toString()),O=g.times(d),T=c?x.plus(c):O;return x.div(T).gte(.999)?B:P.div(t==="isolatedpool"?2:1).times(100)}).reduce((o,n)=>o.plus(n),B).toString():void 0}};var Ae=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},Et=class extends Error{constructor(e,t){super(),this.message=`${e} pool missing ${t}`,this.name="PoolConfigNotFound"}},Fe=class extends Error{constructor(e,t){super(),this.message=`Route from ${e} to ${t} not found in pool configuration`,this.name="RouteNotFound"}},Nt=class extends Error{constructor(e){super(),this.message=`Asset ${e} not available in current network`,this.name="AssetNotFound"}},_t=class extends Error{constructor(e){super(),this.message=`Storage missing ${e}`,this.name="StorageConfigNotFound"}},Ct=class extends Error{constructor(e){super(),this.message=`Subscription type "${e}" not supported`,this.name="SubscriptionNotSupported"}},kt=class extends Error{constructor(e){super(),this.message=`${e}`,this.name="ProviderConfigNotFound"}};var rt=require("viem"),Ur=1e7,Re=class{api;constructor(e){this.api=e}async getBlock(){let e=await this.api.query.ethereum.currentBlock(),{header:t}=e.unwrap(),r=t.timestamp.toBigInt()/1000n,s=t.number.toBigInt();return{timestamp:r,number:s}}readContract=(async e=>{let{abi:t,address:r,functionName:s,args:i}=e,a=(0,rt.encodeFunctionData)({abi:t,functionName:s,args:i}),o=this.api.call.ethereumRuntimeRPCApi.call,n=o.meta.params,l=["",r,a,0,Ur,null,null,null,!1,[]];n.find(g=>g.name==="authorization_list")&&l.push([]);let c=await o(...l);if(c.isErr)throw console.error(s,c.asErr.toHuman()),new Error("Contract read failure");let{value:m,exitReason:d,usedGas:h}=c.asOk;if(d.isSucceed)return(0,rt.decodeFunctionResult)({abi:t,functionName:s,data:m.toHex()});throw console.log(s,d.toString(),h.toHuman()),new Error("Contract read error")})};var nr=require("viem"),qr=["wss://hydration-rpc.n.dwellir.com","wss://hydration.dotters.network","wss://rpc.helikon.io/hydradx","wss://hydration.ibp.network","wss://rpc.cay.hydration.cloud","wss://rpc.parm.hydration.cloud","wss://rpc.roach.hydration.cloud","wss://rpc.zipp.hydration.cloud","wss://rpc.sin.hydration.cloud","wss://rpc.coke.hydration.cloud"],Dt=u=>{let t=[u.endpoint,...qr],r=Array.from(new Set(t.map(s=>s.replace("wss://","https://").replace("ws://","http://"))));return(0,nr.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:r}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1})};var Q=require("viem");function ar(u){let e=async({method:t,params:r})=>{let s=Array.isArray(r)?r:[];return u.send(t,s)};return()=>({request:e,config:{name:"PolkadotWsTransport",type:"webSocket",key:"polkadotWs",request:e}})}var Ee=class{api;chain;constructor(e){this.api=e,this.chain=Dt(this.provider)}get provider(){let{provider:e}=this.api._options;return e}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return(0,Q.createPublicClient)({chain:this.chain,transport:(0,Q.http)()})}getWsProvider(){return(0,Q.createPublicClient)({chain:this.chain,transport:ar(this.provider)})}getSigner(e){return(0,Q.createWalletClient)({account:e,chain:this.chain,transport:(0,Q.custom)(window.ethereum)})}getRPCAdapter(){return new Re(this.api)}};var Mt=[{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"description",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"version",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint80",name:"_roundId",type:"uint80"}],name:"getRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"},{inputs:[],name:"latestRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"}];var de=class{rpcAdapter;constructor(e){this.rpcAdapter=e.getRPCAdapter()}async getData(e,t=6){let[r,s,i]=await Promise.all([this.rpcAdapter.readContract({abi:Mt,address:e,functionName:"latestRoundData"}),this.rpcAdapter.readContract({abi:Mt,address:e,functionName:"decimals"}),this.rpcAdapter.getBlock()]),[a,o,n,l]=r,c=i.number-(i.timestamp-l)/BigInt(t),m=Number(c);return{price:o,decimals:s,updatedAt:m<0?0:m}}};var re=(u,e=new Map)=>t=>{let r;return e.has(t)?e.get(t):(e.set(t,r=u(t)),r)};var N=(a=>(a.Aave="Aave",a.LBP="Lbp",a.Omni="Omnipool",a.Stable="Stableswap",a.XYK="Xyk",a.HSM="Hsm",a))(N||{}),se=(c=>(c.UnknownError="UnknownError",c.FacilitatorCapacityExceeded="FacilitatorCapacityExceeded",c.InsufficientTradingAmount="InsufficientTradingAmount",c.InsufficientCollateral="InsufficientCollateral",c.MaxHoldingExceeded="MaxHoldingExceeded",c.MaxInRatioExceeded="MaxInRatioExceeded",c.MaxOutRatioExceeded="MaxOutRatioExceeded",c.TradeNotAllowed="TradeNotAllowed",c.MaxBuyBackExceeded="MaxBuyBackExceeded",c.MaxBuyPriceExceeded="MaxBuyPriceExceeded",c))(se||{});var Ne=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new u(e)}constructor(e){this.type="Aave",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(n=>[n.id,n])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),o=p(i.balance);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:a,balanceOut:o,assetInED:B,assetOutED:B}}validateAndBuy(e,t){let r=this.calculateInGivenOut(e,t),s=[];return t.isGreaterThan(e.balanceOut)&&s.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:t,feePct:0,errors:s}}validateAndSell(e,t){let r=this.calculateOutGivenIn(e,t),s=[];return r.isGreaterThan(e.balanceOut)&&s.push("TradeNotAllowed"),{amountIn:t,calculatedOut:r,amountOut:r,feePct:0,errors:s}}calculateInGivenOut(e,t){return t}calculateOutGivenIn(e,t){return t}spotPriceInGivenOut(e){return A(E,e.decimalsOut)}spotPriceOutGivenIn(e){return A(E,e.decimalsIn)}calculateTradeFee(e,t){return B}};var hr=require("@polkadot/util-crypto"),yr=require("@polkadot/util"),fr=require("viem");var _e=(u,e)=>u===e?0:u==null?e==null?0:-1:e==null?u==null?0:1:typeof u.compare=="function"?u.compare(e):typeof e.compare=="function"?-e.compare(u):u<e?-1:u>e?1:0;var st=(u,e=t=>t!==void 0?": "+t:"")=>class extends Error{origMessage;constructor(t){super(u(t)+e(t)),this.origMessage=t!==void 0?String(t):""}};var Gr=st(()=>"illegal argument(s)"),or=u=>{throw new Gr(u)};var Wr=st(()=>"index out of bounds"),Lt=u=>{throw new Wr(u)},it=(u,e,t)=>(u<e||u>=t)&&Lt(u);var lr=23283064365386963e-26,nt=class{float(e=1){return this.int()*lr*e}probability(e){return this.float()<e}norm(e=1){return(this.int()*lr-.5)*2*e}normMinMax(e,t){let r=this.minmax(e,t);return this.float()<.5?r:-r}minmax(e,t){return this.float()*(t-e)+e}minmaxInt(e,t){e|=0;let r=(t|0)-e;return r?e+this.int()%r:e}minmaxUint(e,t){e>>>=0;let r=(t>>>0)-e;return r?e+this.int()%r:e}};var at=class extends nt{constructor(e){super(),this.rnd=e}float(e=1){return this.rnd()*e}norm(e=1){return(this.rnd()-.5)*2*e}int(){return this.rnd()*4294967296>>>0}};var cr=new at(Math.random);var ur=u=>u!=null&&typeof u!="function"&&u.length!==void 0;var mr=Object.getPrototypeOf({}),ot="function",pr="string",ge=(u,e)=>{let t;if(u===e)return!0;if(u!=null){if(typeof u.equiv===ot)return u.equiv(e)}else return u==e;if(e!=null){if(typeof e.equiv===ot)return e.equiv(u)}else return u==e;return typeof u===pr||typeof e===pr?!1:(t=Object.getPrototypeOf(u),(t==null||t===mr)&&(t=Object.getPrototypeOf(e),t==null||t===mr)?Yr(u,e):typeof u!==ot&&u.length!==void 0&&typeof e!==ot&&e.length!==void 0?zr(u,e):u instanceof Set&&e instanceof Set?Xr(u,e):u instanceof Map&&e instanceof Map?Vr(u,e):u instanceof Date&&e instanceof Date?u.getTime()===e.getTime():u instanceof RegExp&&e instanceof RegExp?u.toString()===e.toString():u!==u&&e!==e)},zr=(u,e,t=ge)=>{let r=u.length;if(r===e.length)for(;r-- >0&&t(u[r],e[r]););return r<0},Xr=(u,e,t=ge)=>u.size===e.size&&t([...u.keys()].sort(),[...e.keys()].sort()),Vr=(u,e,t=ge)=>u.size===e.size&&t([...u].sort(),[...e].sort()),Yr=(u,e,t=ge)=>{if(Object.keys(u).length!==Object.keys(e).length)return!1;for(let r in u)if(!e.hasOwnProperty(r)||!t(u[r],e[r]))return!1;return!0};var Ht=class{value;constructor(e){this.value=e}deref(){return this.value}};var dr=u=>u instanceof Ht;var lt=class u{_head;_length=0;constructor(e){e&&this.into(e)}get length(){return this._length}get head(){return this._head}[Symbol.iterator](){return gr("next",this._head)}reverseIterator(){return gr("prev",this.tail)}clear(){this.release()}compare(e,t=_e){let r=this._length;if(r<e._length)return-1;if(r>e._length)return 1;if(r===0)return 0;{let s=this._head,i=e._head,a=0;for(;r-- >0&&a===0;)a=t(s.value,i.value),s=s.next,i=i.next;return a}}concat(...e){let t=this.copy();for(let r of e)t.into(r);return t}equiv(e){if(!(e instanceof u||ur(e))||this._length!==e.length)return!1;if(!this._length||this===e)return!0;let t=e[Symbol.iterator](),r=this._head;for(let s=this._length;s-- >0;){if(!ge(r.value,t.next().value))return!1;r=r.next}return!0}filter(e){let t=this.empty();return this.traverse(r=>(e(r.value)&&t.append(r.value),!0)),t}find(e){return this.traverse(t=>t.value!==e)}findWith(e){return this.traverse(t=>!e(t.value))}first(){return this._head?.value}insertSorted(e,t){t=t||_e;for(let r=this._head,s=this._length;s-- >0;){if(t(e,r.value)<=0)return this.insertBefore(r,e);r=r.next}return this.append(e)}into(e){for(let t of e)this.append(t);return this}nth(e,t){let r=this.nthCell(e);return r?r.value:t}nthCellUnsafe(e){let t,r;for(e<=this._length>>>1?(t=this._head,r="next"):(t=this.tail,r="prev",e=this._length-e-1);e-- >0&&t;)t=t[r];return t}peek(){return this.tail?.value}$reduce(e,t){let r=this._head;for(let s=this._length;s-- >0&&!dr(t);)t=e(t,r.value),r=r.next;return t}reduce(e,t){return this.$reduce(e,t)}release(){let e=this._head;if(!e)return!0;let t;for(let r=this._length;r-- >0;)t=e.next,delete e.value,delete e.prev,delete e.next,e=t;return this._head=void 0,this._length=0,!0}reverse(){let e=this._head,t=this.tail,r=(this._length>>>1)+(this._length&1);for(;e&&t&&r>0;){let s=e.value;e.value=t.value,t.value=s,e=e.next,t=t.prev,r--}return this}setHead(e){let t=this._head;return t?(t.value=e,t):this.prepend(e)}setNth(e,t){let r=this.nthCell(e);return!r&&Lt(e),r.value=t,r}setTail(e){let t=this.tail;return t?(t.value=e,t):this.append(e)}swap(e,t){if(e!==t){let r=e.value;e.value=t.value,t.value=r}return this}toArray(e=[]){return this.traverse(t=>(e.push(t.value),!0)),e}toJSON(){return this.toArray()}toString(){let e=[];return this.traverse(t=>(e.push(String(t.value)),!0)),e.join(", ")}traverse(e,t=this._head,r){if(!this._head)return;let s=t;do{if(!e(s))break;s=s.next}while(s!==r);return s}_map(e,t){return this.traverse(r=>(e.append(t(r.value)),!0)),e}};function*gr(u,e){for(;e;)yield e.value,e=e[u]}var ct=class u extends lt{_tail;constructor(e){super(),e&&this.into(e)}get tail(){return this._tail}append(e){if(this._tail){let t={value:e,prev:this._tail};return this._tail.next=t,this._tail=t,this._length++,t}else return this.prepend(e)}asHead(e){return e===this._head?this:(this.remove(e),this._head.prev=e,e.next=this._head,e.prev=void 0,this._head=e,this._length++,this)}asTail(e){return e===this._tail?this:(this.remove(e),this._tail.next=e,e.prev=this._tail,e.next=void 0,this._tail=e,this._length++,this)}cons(e){return this.prepend(e),this}copy(){return new u(this)}*cycle(){for(;;)yield*this}drop(){let e=this._head;if(e)return this._head=e.next,this._head?this._head.prev=void 0:this._tail=void 0,this._length--,e.value}empty(){return new u}insertAfter(e,t){let r={value:t,next:e.next,prev:e};return e.next?e.next.prev=r:this._tail=r,e.next=r,this._length++,r}insertAfterNth(e,t){return e<0&&(e+=this._length),e>=this._length-1?this.append(t):(it(e,0,this._length),this.insertAfter(this.nthCellUnsafe(e),t))}insertBefore(e,t){let r={value:t,next:e,prev:e.prev};return e.prev?e.prev.next=r:this._head=r,e.prev=r,this._length++,r}insertBeforeNth(e,t){return e<0&&(e+=this._length),e<=0?this.prepend(t):(it(e,0,this._length),this.insertBefore(this.nthCellUnsafe(e),t))}map(e){return this._map(new u,e)}nth(e,t){let r=this.nthCell(e);return r?r.value:t}nthCell(e){if(e<0&&(e+=this._length),!(e<0||e>=this._length))return this.nthCellUnsafe(e)}pop(){let e=this._tail;if(e)return this._tail=e.prev,this._tail?this._tail.next=void 0:this._head=void 0,this._length--,e.value}prepend(e){let t={value:e,next:this._head};return this._head?this._head.prev=t:this._tail=t,this._head=t,this._length++,t}push(e){return this.append(e),this}release(){return this._tail=void 0,super.release()}remove(e){return e.prev?e.prev.next=e.next:this._head=e.next,e.next?e.next.prev=e.prev:this._tail=e.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 e=this.peek();return this.pop(),this.prepend(e),this}}seq(e=0,t=this.length){if(e>=t||e<0)return;let r=this.nthCell(e),s=this.nthCell(t-1),i=a=>({first(){return a.value},next(){return a!==s&&a.next?i(a.next):void 0}});return r?i(r):void 0}shuffle(e,t=cr){if(this._length<2)return this;for(e=e!==void 0?e:Math.ceil(1.5*Math.log2(this._length));e>0;e--){let r=this._head;for(;r;){let s=r.next;t.probability(.5)?this.asHead(r):this.asTail(r),r=s}}return this}slice(e=0,t=this.length){let r=e<0?e+this._length:e,s=t<0?t+this._length:t;(r<0||s<0)&&or("invalid indices: ${from} / ${to}");let i=new u,a=this.nthCell(r);for(;a&&++r<=s;)i.push(a.value),a=a.next;return i}sort(e=_e){if(!this._length)return this;let t=1;for(;;){let r=this._head;this._head=void 0,this._tail=void 0;let s=0;for(;r;){s++;let i=r,a=0;for(let n=0;n<t&&(a++,i=i.next,!!i);n++);let o=t;for(;a>0||o>0&&i;){let n;a===0?(n=i,i=i.next,o--):!i||o===0||e(r.value,i.value)<=0?(n=r,r=r.next,a--):(n=i,i=i.next,o--),this._tail?this._tail.next=n:this._head=n,n.prev=this._tail,this._tail=n}r=i}if(this._tail.next=void 0,s<=1)return this;t*=2}}splice(e,t=0,r){let s;typeof e=="number"?(e<0&&(e+=this._length),it(e,0,this._length),s=this.nthCellUnsafe(e)):s=e;let i=new u;if(t>0)for(;s&&t-- >0;)this.remove(s),i.push(s.value),s=s.next;else s&&(s=s.next);if(r)if(s)for(let a of r)this.insertBefore(s,a);else for(let a of r)this.push(a);return i}};var ut=class u{map;items;opts;_size;constructor(e,t){let r={maxlen:1/0,maxsize:1/0,map:()=>new Map,ksize:()=>0,vsize:()=>0,...t};this.map=r.map(),this.items=new ct,this._size=0,this.opts=r,e&&this.into(e)}get length(){return this.items.length}get size(){return this._size}[Symbol.iterator](){return this.entries()}*entries(){for(let e of this.items)yield[e.k,e]}*keys(){for(let e of this.items)yield e.k}*values(){for(let e of this.items)yield e.v}copy(){let e=this.empty();e.items=this.items.copy();let t=e.items.head;for(;t;)e.map.set(t.value.k,t),t=t.next;return e}empty(){return new u(null,this.opts)}release(){this._size=0,this.map.clear();let e=this.opts.release;if(e){let t;for(;t=this.items.drop();)e(t.k,t.v);return!0}return this.items.release()}has(e){return this.map.has(e)}get(e,t){let r=this.map.get(e);return r?this.resetEntry(r):t}set(e,t){let r=this.opts.ksize(e)+this.opts.vsize(t),s=this.map.get(e),i=Math.max(0,r-(s?s.value.s:0));return this._size+=i,this.ensureSize()?this.doSetEntry(s,e,t,r):this._size-=i,t}into(e){for(let t of e)this.set(t[0],t[1]);return this}async getSet(e,t){let r=this.map.get(e);return r?this.resetEntry(r):this.set(e,await t())}delete(e){let t=this.map.get(e);return t?(this.removeEntry(t),!0):!1}resetEntry(e){return this.items.asTail(e),e.value.v}ensureSize(){let{release:e,maxsize:t,maxlen:r}=this.opts;for(;this._size>t||this.length>=r;){let s=this.items.drop();if(!s)return!1;this.map.delete(s.k),e?.(s.k,s.v),this._size-=s.s}return!0}removeEntry(e){let t=e.value;this.map.delete(t.k),this.items.remove(e),this.opts.release?.(t.k,t.v),this._size-=t.s}doSetEntry(e,t,r,s){e?(this.opts.update?.(t,e.value.v,r),e.value.v=r,e.value.s=s,this.items.asTail(e)):(this.items.push({k:t,v:r,s}),this.map.set(t,this.items.tail))}};var he=class u extends ut{constructor(e,t){super(e,{ttl:3600*1e3,autoExtend:!1,...t})}empty(){return new u(null,this.opts)}has(e){return this.get(e)!==void 0}get(e,t){let r=this.map.get(e);if(r){if(r.value.t>=Date.now())return this.resetEntry(r);this.removeEntry(r)}return t}set(e,t,r=this.opts.ttl){let s=this.opts.ksize(e)+this.opts.vsize(t),i=this.map.get(e),a=Math.max(0,s-(i?i.value.s:0));return this._size+=a,this.ensureSize()?this.doSetEntry(i,e,t,s,r):this._size-=a,t}async getSet(e,t,r=this.opts.ttl){let s=this.get(e);return s!==void 0?s:this.set(e,await t(),r)}prune(){let e=Date.now(),t=this.items.head,r=0;for(;t;)t.value.t<e&&(this.removeEntry(t),r++),t=t.next;return r}ensureSize(){let{maxlen:e,maxsize:t}=this.opts,r=Date.now(),s=this.items.head;for(;s&&(this._size>t||this.length>=e);)s.value.t<r&&this.removeEntry(s),s=s.next;return super.ensureSize()}doSetEntry(e,t,r,s,i=this.opts.ttl){let a=Date.now()+i;e?(this.opts.update?.(t,e.value.v,r),e.value.v=r,e.value.s=s,e.value.t=a,this.items.asTail(e)):(this.items.push({k:t,v:r,s,t:a,ttl:i}),this.map.set(t,this.items.tail))}resetEntry(e){return this.opts.autoExtend&&(e.value.t=Date.now()+e.value.ttl),super.resetEntry(e)}};var U=class extends W{evm;mmOracle;pools=[];subs=[];assets=new Map([]);mem=0;onNewBlockHandler;onEventsHandler;memPoolsCache=new he(null,{maxlen:1,ttl:3600*1e3,release:e=>{this.mem>e&&this.log(this.getPoolType(),`mem ${e} released at`,new Date)}});memPools=re(e=>(this.log(this.getPoolType(),`mem ${e} sync`),this.getPools()),this.memPoolsCache);constructor(e,t){super(e),this.evm=t,this.mmOracle=new de(t),this.onNewBlockHandler=this.onNewBlock.bind(this),this.onEventsHandler=this.onEvents.bind(this)}onNewBlock(e){}onEvents(e){}get augmentedPools(){return this.pools.filter(e=>this.isValidPool(e)).map(e=>this.withMetadata(e))}async withAssets(e){this.assets=new Map(e.map(t=>[t.id,t])),this.mem=this.mem+1}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){this.unsubscribe(),this.pools=await this.loadPools();let e=this.subscribeBalances(),t=this.subscribeUpdates();this.subs.push(e),this.subs.push(t);let r=this.getPoolType();return this.log(r,`mem ${this.mem} pools(${this.augmentedPools.length})`),this.log(r,`mem ${this.mem} subs(${this.subs.length})`),this.augmentedPools}async subscribeBalances(){let e=[],t=[],r=[],s=[];for(let o of this.augmentedPools){let{address:n,tokens:l}=o;l.filter(c=>c.id==="0").forEach(()=>{e.push(n)}),l.filter(c=>["Token","StableSwap"].includes(c.type)&&c.id!=="0"&&c.id!==o.id).forEach(c=>{t.push([n,c.id])}),l.filter(c=>c.type==="Erc20").forEach(c=>{r.push([n,c.id])})}let i=o=>{o.forEach(([n,l])=>{let c=this.pools.find(m=>m.address===n);if(c){let m=c.tokens.findIndex(d=>d.id==="0");c.tokens[m].balance=l.toString()}})},a=o=>{o.forEach(([n,l])=>{let[c,m]=n,d=this.pools.find(h=>h.address===c);if(d){let h=d.tokens.findIndex(g=>g.id===m);d.tokens[h].balance=l.toString()}})};if(e.length>0){let o=await this.subscribeSystemBalances(e,i);s.push(o)}if(t.length>0){let o=await this.subscribeTokenBalances(t,a);s.push(o)}if(r.length>0){let o=await this.subscribeErc20Balances(r,a);s.push(o)}return()=>{for(let o of s)try{o()}catch(n){console.warn("Balance unsub failed",n)}}}unsubscribe(){this.subs.forEach(e=>{e.then(t=>t()).catch(t=>console.warn("Unsub failed",t))})}isValidPool(e){return e.type==="Xyk"?e.tokens.every(t=>this.assets.get(t.id)):!0}withMetadata(e){return e.tokens=e.tokens.map(t=>{let r=this.assets.get(t.id);return{...t,...r}}),e}};function Ce(u,e){let t=[];return JSON.stringify(u,(r,s)=>(s&&s[e]&&t.push(s),s)),t[0]}function Kr(u,e,t){let r;return JSON.stringify(u,(s,i)=>(i&&i[e]===t&&(r=i),i)),r}var $r=(u,e)=>typeof e=="bigint"?e.toString():e;var jr=["Supply","Withdraw","Repay","Borrow"],ke=class extends U{getPoolType(){return"Aave"}getPoolId(e,t){let r="aave:"+e+"/"+t;return(0,hr.encodeAddress)((0,yr.stringToU8a)(r.padEnd(32,"\0")),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:0}}getReserveH160Id(e){return e.type==="Erc20"?Ce(e.location,"accountKey20").accountKey20.key:G.fromAssetId(e.id)}isSupported(){return this.api.call.aaveTradeExecutor.pools!==void 0}async loadPools(){return(await this.api.call.aaveTradeExecutor.pools()).map(({reserve:t,atoken:r,liqudityIn:s,liqudityOut:i})=>({address:this.getPoolId(t.toString(),r.toString()),type:"Aave",tokens:[{id:t.toString(),balance:s.toString()},{id:r.toString(),balance:i.toString()}],...this.getPoolLimits()}))}async getPoolFees(e,t,r){return{}}onEvents(e){e.forEach(t=>{let{event:r}=t,s=`${r.section}:${r.method}`;if(s==="router:Executed"){let[i,a]=r.data.toJSON();this.pools.filter(o=>o.tokens.some(n=>n.id===i.toString()||n.id===a.toString())).forEach(o=>{this.log(`Sync AAVE via [router:Executed] :: ${i}:${a}`),this.updatePoolState(o)})}if(s==="evm:Log"){let[i]=r.data.toJSON();try{let{eventName:a,args:o}=(0,fr.decodeEventLog)({abi:Qe,topics:i.topics,data:i.data});if(jr.includes(a)){let n=o.reserve.toLowerCase();this.pools.filter(l=>{let[c]=l.tokens;return this.getReserveH160Id(c).toLowerCase()===n}).forEach(l=>{this.log(`Sync AAVE via [evm:Log] :: ${a} ${n}`),this.updatePoolState(l)})}}catch{}}})}async subscribeBalances(){return()=>{}}async subscribeUpdates(){return()=>{}}async updatePoolState(e){let[t,r]=e.tokens,{liqudityIn:s,liqudityOut:i}=await this.api.call.aaveTradeExecutor.pool(t.id,r.id);e.tokens=e.tokens.map(a=>{let o=a.id===t.id?s.toString():i.toString();return{...a,balance:o}})}};var K=require("@galacticcouncil/math-lbp"),V=class{static getSpotPrice(e,t,r,s,i){return(0,K.get_spot_price)(e,t,r,s,i)}static calculateInGivenOut(e,t,r,s,i){return(0,K.calculate_in_given_out)(e,t,r,s,i)}static calculateOutGivenIn(e,t,r,s,i){return(0,K.calculate_out_given_in)(e,t,r,s,i)}static calculateLinearWeights(e,t,r,s,i){return(0,K.calculate_linear_weights)(e,t,r,s,i)}static calculatePoolTradeFee(e,t,r){return(0,K.calculate_pool_trade_fee)(e,t,r)}};var b=class u{static toPct(e){let[t,r]=e;return u.safeDivide(t*100,r)}static toRaw(e){let[t,r]=e;return u.safeDivide(t,r)}static fromPermill(e){return[e,1e6]}static fromPerbill(e){return[e,1e9]}static fromRate(e,t){return[e,t]}static safeDivide(e,t,r=12){let s=10**r;return Math.round(e*s/t)/s}static safeRound(e){return parseFloat(e.toPrecision(15))}};var De=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(e){return new u(e)}constructor(e){this.type="Lbp",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.fee=e.fee,this.repayFeeApply=e.repayFeeApply}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(n=>[n.id,n])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),o=p(i.balance);return{assetIn:e,assetOut:t,balanceIn:a,balanceOut:o,decimalsIn:s.decimals,decimalsOut:i.decimals,weightIn:s.weight,weightOut:i.weight}}validateAndBuy(e,t,r){let s=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let a=e.balanceOut.div(this.maxOutRatio);if(t.isGreaterThan(a)&&i.push("MaxOutRatioExceeded"),s===e.assetOut){let o=this.calculateTradeFee(t,r),n=b.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),l=t.plus(o),c=this.calculateInGivenOut(e,l),m=e.balanceIn.div(this.maxInRatio);return c.isGreaterThan(m)&&i.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:t,feePct:n,errors:i}}else{let o=this.calculateInGivenOut(e,t),n=e.balanceIn.div(this.maxInRatio);return o.isGreaterThan(n)&&i.push("MaxInRatioExceeded"),{amountIn:o,calculatedIn:o,amountOut:t,feePct:0,errors:i}}}validateAndSell(e,t,r){let s=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let a=e.balanceIn.div(this.maxInRatio);if(t.isGreaterThan(a)&&i.push("MaxInRatioExceeded"),s===e.assetIn){let o=this.calculateOutGivenIn(e,t),n=e.balanceOut.div(this.maxOutRatio);return o.isGreaterThan(n)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:o,amountOut:o,feePct:0,errors:i}}else{let o=this.calculateOutGivenIn(e,t),n=this.calculateTradeFee(o,r),l=b.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),c=o.minus(n),m=e.balanceOut.div(this.maxOutRatio);return c.isGreaterThan(m)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:o,amountOut:c,feePct:l,errors:i}}}calculateInGivenOut(e,t){let r=V.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?B:s}calculateOutGivenIn(e,t){let r=V.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?B:s}spotPriceInGivenOut(e){let t=V.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),A(E,e.decimalsOut).toString());return p(t)}spotPriceOutGivenIn(e){let t=V.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),A(E,e.decimalsIn).toString());return p(t)}calculateTradeFee(e,t){let r=V.calculatePoolTradeFee(e.toString(),this.repayFeeApply?t.repayFee[0]:t.exchangeFee[0],this.repayFeeApply?t.repayFee[1]:t.exchangeFee[1]);return p(r)}};var Me=class extends U{MAX_FINAL_WEIGHT=A(p(100),6);poolsData=new Map([]);getPoolType(){return"Lbp"}getPoolLimits(){let e=this.api.consts.lbp.maxInRatio.toNumber(),t=this.api.consts.lbp.maxOutRatio.toNumber(),r=this.api.consts.lbp.minTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}async getPoolDelta(e,t,r){let{start:s,end:i,assets:a,initialWeight:o,finalWeight:n,repayTarget:l,feeCollector:c}=t,m=V.calculateLinearWeights(s.toString(),i.toString(),o.toString(),n.toString(),r),[d,h]=a,g=d.toString(),f=p(m),y=h.toString(),v=this.MAX_FINAL_WEIGHT.minus(p(f)),[P,x,O]=await Promise.all([this.isRepayFeeApplied(g,l.toString(),c.toString()),this.getBalance(e,g),this.getBalance(e,y)]);return{repayFeeApply:P,tokens:[{id:g,weight:f,balance:x.toString()},{id:y,weight:v,balance:O.toString()}]}}isActivePool(e,t){if(e.start.isEmpty||e.end.isEmpty)return!1;let r=e.start.unwrap().toNumber(),s=e.end.unwrap().toNumber();return t>=r&&t<s}async isRepayFeeApplied(e,t,r){let s=p(t);if(s.isZero())return!1;try{return(await this.getBalance(e,r)).isLessThan(s)}catch{return!0}}isSupported(){return this.api.query.lbp!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.lbp.poolData.entries(),this.api.query.parachainSystem.validationData()]),{relayParentNumber:r}=t.unwrap(),s=e.filter(([i,a])=>this.isActivePool(a.unwrap(),r.toNumber())).map(async([{args:[i]},a])=>{let o=a.unwrap(),n=i.toString(),l=await this.getPoolDelta(n,o,r.toString());this.poolsData.set(i.toString(),o);let[c,m]=o.fee;return{address:n,type:"Lbp",fee:b.fromRate(c.toNumber(),m.toNumber()),...l,...this.getPoolLimits()}});return Promise.all(s)}async getPoolFees(e,t,r){let s=this.pools.find(i=>i.address===r);return{repayFee:this.getRepayFee(),exchangeFee:s.fee}}getRepayFee(){let[e,t]=this.api.consts.lbp.repayFee;return b.fromRate(e.toNumber(),t.toNumber())}async subscribeUpdates(){return this.api.query.parachainSystem.validationData(async e=>{let{relayParentNumber:t}=e.unwrap();this.pools.forEach(async r=>{let s=this.poolsData.get(r.address);if(s)if(this.isActivePool(s,t.toNumber())){let a=await this.getPoolDelta(r.address,s,t.toString());Object.assign(r,a)}else{let a=this.pools.findIndex(o=>o.address==r.address);this.pools.splice(a,1)}})})}};var F=require("@galacticcouncil/math-omnipool");var R=class{static calculateSpotPrice(e,t,r,s){return(0,F.calculate_spot_price)(e,t,r,s)}static calculateLrnaSpotPrice(e,t){return(0,F.calculate_lrna_spot_price)(e,t)}static calculateInGivenOut(e,t,r,s,i,a,o,n,l){return(0,F.calculate_in_given_out)(e,t,r,s,i,a,o,n,l)}static calculateLrnaInGivenOut(e,t,r,s,i){return(0,F.calculate_lrna_in_given_out)(e,t,r,s,i)}static calculateOutGivenIn(e,t,r,s,i,a,o,n,l){return(0,F.calculate_out_given_in)(e,t,r,s,i,a,o,n,l)}static calculateOutGivenLrnaIn(e,t,r,s,i){return(0,F.calculate_out_given_lrna_in)(e,t,r,s,i)}static calculateShares(e,t,r,s){return(0,F.calculate_shares)(e,t,r,s)}static calculateLiquidityOut(e,t,r,s,i,a,o,n){return(0,F.calculate_liquidity_out)(e,t,r,s,i,a,o,n)}static calculateLiquidityLRNAOut(e,t,r,s,i,a,o,n){return(0,F.calculate_liquidity_lrna_out)(e,t,r,s,i,a,o,n)}static calculateCapDifference(e,t,r,s){let i=(0,S.BigNumber)(t),a=(0,S.BigNumber)(e),o=(0,S.BigNumber)(s),l=(0,S.BigNumber)(r).shiftedBy(-18);if(i.div(o).lt(l)){let m=l.times(o).minus(i).times(a),d=i.times((0,S.BigNumber)(1).minus(l));return m.div(d).toFixed(0)}else return"0"}static calculateLimitHubIn(e,t,r,s){return(0,F.calculate_liquidity_hub_in)(e,t,r,s)}static isSellAllowed(e){return(0,F.is_sell_allowed)(e)}static isBuyAllowed(e){return(0,F.is_buy_allowed)(e)}static isAddLiquidityAllowed(e){return(0,F.is_add_liquidity_allowed)(e)}static isRemoveLiquidityAllowed(e){return(0,F.is_remove_liquidity_allowed)(e)}static recalculateAssetFee(e,t,r,s,i,a,o,n,l,c,m){return(0,F.recalculate_asset_fee)(e,t,r,s,i,a,o,n,l,c,m)}static recalculateProtocolFee(e,t,r,s,i,a,o,n,l,c,m){return(0,F.recalculate_protocol_fee)(e,t,r,s,i,a,o,n,l,c,m)}static verifyAssetCap(e,t,r,s){return(0,F.verify_asset_cap)(e,t,r,s)}};var Le=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(e){return new u(e)}constructor(e){this.type="Omnipool",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.hubAssetId=e.hubAssetId}validatePair(e,t){return this.hubAssetId!=t}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),o=p(i.balance),n=p(s.existentialDeposit),l=p(i.existentialDeposit);return{assetIn:e,assetOut:t,hubReservesIn:s.hubReserves,hubReservesOut:i.hubReserves,sharesIn:s.shares,sharesOut:i.shares,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:a,balanceOut:o,tradeableIn:s.tradeable,tradeableOut:i.tradeable,assetInED:n,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),a=i.minus(s),o=s===B?B:a.div(s).multipliedBy(100).decimalPlaces(4),n=[],l=R.isSellAllowed(e.tradeableIn),c=R.isBuyAllowed(e.tradeableOut);(!l||!c)&&n.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&n.push("InsufficientTradingAmount");let m=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(m)&&n.push("MaxOutRatioExceeded");let d=e.balanceIn.div(this.maxInRatio);return i.isGreaterThan(d)&&n.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:o.toNumber(),errors:n}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,r),o=s.minus(i).div(s).multipliedBy(100).decimalPlaces(4),n=[],l=R.isSellAllowed(e.tradeableIn),c=R.isBuyAllowed(e.tradeableOut);(!l||!c)&&n.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&n.push("InsufficientTradingAmount");let m=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(m)&&n.push("MaxInRatioExceeded");let d=e.balanceOut.div(this.maxOutRatio);return i.isGreaterThan(d)&&n.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:o.toNumber(),errors:n}}calculateInGivenOut(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(e,t,r);let s=R.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?b.toRaw(r.assetFee).toString():B.toString(),r?b.toRaw(r.protocolFee).toString():B.toString()),i=p(s);return i.isNegative()?B:i}calculateLrnaInGivenOut(e,t,r){let s=R.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?b.toRaw(r.assetFee).toString():B.toString()),i=p(s);return i.isNegative()?B:i}calculateOutGivenIn(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,r);let s=R.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?b.toRaw(r.assetFee).toString():B.toString(),r?b.toRaw(r.protocolFee).toString():B.toString()),i=p(s);return i.isNegative()?B:i}calculateOutGivenLrnaIn(e,t,r){let s=R.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?b.toRaw(r.assetFee).toString():B.toString()),i=p(s);return i.isNegative()?B:i}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=R.calculateSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString(),e.balanceIn.toString(),e.hubReservesIn.toString());return p(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceLrnaInGivenOut(e){let t=R.calculateLrnaSpotPrice(e.hubReservesOut.toString(),e.balanceOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceOutGivenIn(e){if(e.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(e);let t=R.calculateSpotPrice(e.balanceIn.toString(),e.hubReservesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}spotPriceOutGivenLrnaIn(e){let t=R.calculateLrnaSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}};var vr=require("@polkadot/util-crypto"),Sr=require("@polkadot/util");var br="omnipool",Pr="Short",He=class extends U{dynamicFees=new Map;dynamicFeesConfiguration=new Map;oracles=new Map;memQueryCache=new he(null,{ttl:6*1e3});memOracleQuery=re(e=>{let t=e.split(":");return this.api.query.emaOracle.oracles(br,t,Pr)},this.memQueryCache);memFeesQuery=re(e=>this.api.query.dynamicFees.assetFee(e),this.memQueryCache);memFeesConfigurationQuery=re(e=>this.api.query.dynamicFees.assetFeeConfiguration(e),this.memQueryCache);getPoolType(){return"Omnipool"}getPoolId(){return(0,vr.encodeAddress)((0,Sr.stringToU8a)("modlomnipool".padEnd(32,"\0")),63)}getOracleKey(e){return e==="0"?["0","1"]:["1",e]}getPoolLimits(){let e=this.api.consts.omnipool.maxInRatio.toNumber(),t=this.api.consts.omnipool.maxOutRatio.toNumber(),r=this.api.consts.omnipool.minimumTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}async getDynamicFees(e){return this.dynamicFees.has(e)?this.dynamicFees.get(e):this.memFeesQuery(e)}async getDynamicFeesConfiguration(e){return this.dynamicFeesConfiguration.has(e)?this.dynamicFeesConfiguration.get(e):this.memFeesConfigurationQuery(e)}async getOraclePrice(e){let r=this.getOracleKey(e).join(":");return this.oracles.has(r)?this.oracles.get(r):this.memOracleQuery(r)}isSupported(){return this.api.query.omnipool!==void 0}isAssetConfigSupported(){return this.api.query.dynamicFees.assetFeeConfiguration!==void 0}async loadPools(){let e=this.api.consts.omnipool.hubAssetId.toString(),t=this.getPoolId(),[r,s,i]=await Promise.all([this.api.query.omnipool.assets.entries(),this.api.query.omnipool.hubAssetTradability(),this.getBalance(t,e)]),a=r.map(async([{args:[n]},l])=>{let{hubReserve:c,shares:m,tradable:d,cap:h,protocolShares:g}=l.unwrap(),f=await this.getBalance(t,n.toString());return{id:n.toString(),hubReserves:p(c.toString()),shares:p(m.toString()),tradeable:d.bits.toNumber(),balance:f.toString(),cap:p(h.toString()),protocolShares:p(g.toString())}}),o=await Promise.all(a);return o.push({id:e,tradeable:s.bits.toNumber(),balance:i.toString()}),[{address:t,type:"Omnipool",hubAssetId:e,tokens:o,...this.getPoolLimits()}]}async getPoolFees(e,t,r){let s=t.assetOut,i=t.assetIn,a;if(this.isAssetConfigSupported()&&(a=await this.getDynamicFeesConfiguration(s).then(P=>P.unwrapOr(null))),a?.isFixed){let P=a.asFixed.assetFee.toNumber(),x=a.asFixed.protocolFee.toNumber();return{assetFee:b.fromPermill(P),protocolFee:b.fromPermill(x)}}let[o,n,l]=await Promise.all([this.getDynamicFees(s),this.getOraclePrice(s),this.getOraclePrice(i)]),[c,m,d]=this.getAssetFee(t,e,o,n,a?.isDynamic?a.asDynamic.assetFeeParams:void 0),[h,g,f]=i==="1"?[0,0,0]:this.getProtocolFee(t,e,o,l,a?.isDynamic?a.asDynamic.protocolFeeParams:void 0),y=c+h,v=d+f;return{assetFee:b.fromPermill(m),protocolFee:b.fromPermill(g),min:b.fromPermill(y),max:b.fromPermill(v)}}getAssetFee(e,t,r,s,i){let{assetOut:a,balanceOut:o}=e,{minFee:n,maxFee:l,decay:c,amplification:m}=i||this.api.consts.dynamicFees.assetFeeParameters,d=b.fromPermill(n.toNumber()),h=b.fromPermill(l.toNumber());if(r.isNone||s.isNone)return[n.toNumber(),n.toNumber(),l.toNumber()];let[g]=s.unwrap(),{assetFee:f,timestamp:y}=r.unwrap(),v=Math.max(1,t-y.toNumber()),P=g.volume.bIn.toString(),x=g.volume.bOut.toString(),O=g.liquidity.b.toString();a==="0"&&(P=g.volume.aIn.toString(),x=g.volume.aOut.toString(),O=g.liquidity.a.toString());let T=b.fromPermill(f.toNumber()),w=R.recalculateAssetFee(P,x,O,"9",o.toString(),b.toRaw(T).toString(),v.toString(),b.toRaw(d).toString(),b.toRaw(h).toString(),c.toString(),m.toString());return[n.toNumber(),Number(w)*1e6,l.toNumber()]}getProtocolFee(e,t,r,s,i){let{assetIn:a,balanceIn:o}=e,{minFee:n,maxFee:l,decay:c,amplification:m}=i||this.api.consts.dynamicFees.protocolFeeParameters,d=b.fromPermill(n.toNumber()),h=b.fromPermill(l.toNumber());if(r.isNone||s.isNone)return[n.toNumber(),n.toNumber(),l.toNumber()];let[g]=s.unwrap(),{protocolFee:f,timestamp:y}=r.unwrap(),v=Math.max(1,t-y.toNumber()),P=g.volume.bIn.toString(),x=g.volume.bOut.toString(),O=g.liquidity.b.toString();a==="0"&&(P=g.volume.aIn.toString(),x=g.volume.aOut.toString(),O=g.liquidity.a.toString());let T=b.fromPermill(f.toNumber()),w=R.recalculateProtocolFee(P,x,O,"9",o.toString(),b.toRaw(T).toString(),v.toString(),b.toRaw(d).toString(),b.toRaw(h).toString(),c.toString(),m.toString());return[n.toNumber(),Number(w)*1e6,l.toNumber()]}async subscribeUpdates(){let[e]=this.pools,t=e.tokens.map(n=>n.id),r=[],s=await this.api.query.omnipool.assets.multi(t,n=>{e.tokens=n.map((l,c)=>{let m=e.tokens[c];if(l.isNone)return m;let d=l.unwrap();return this.updateTokenState(m,d)})});r.push(s);let i=await this.api.query.dynamicFees.assetFee.multi(t,n=>{n.forEach((l,c)=>{let m=t[c];this.dynamicFees.set(m,l)})});if(r.push(i),this.isAssetConfigSupported()){let n=await this.api.query.dynamicFees.assetFeeConfiguration.multi(t,l=>{l.forEach((c,m)=>{let d=t[m];this.dynamicFeesConfiguration.set(d,c)})});r.push(n)}let a=t.map(n=>{let l=this.getOracleKey(n);return[br,l,Pr]}),o=await this.api.query.emaOracle.oracles.multi(a,n=>{n.forEach(async(l,c)=>{let m=a[c],[d,h,g]=m;this.oracles.set(h.join(":"),l)})});return r.push(o),()=>{for(let n of r)try{n()}catch(l){console.warn("Omnipool unsubscribe failed",l)}}}updateTokenState(e,t){let{hubReserve:r,shares:s,tradable:i,cap:a,protocolShares:o}=t;return{...e,hubReserves:p(r.toString()),shares:p(s.toString()),cap:p(a.toString()),protocolShares:p(o.toString()),tradeable:i.bits.toNumber()}}};var C=require("@galacticcouncil/math-xyk"),J=class{static getSpotPrice(e,t,r){return(0,C.get_spot_price)(e,t,r)}static calculateInGivenOut(e,t,r){return(0,C.calculate_in_given_out)(e,t,r)}static calculateOutGivenIn(e,t,r){return(0,C.calculate_out_given_in)(e,t,r)}static calculatePoolTradeFee(e,t,r){return(0,C.calculate_pool_trade_fee)(e,t,r)}static calculateLiquidityIn(e,t,r){return(0,C.calculate_liquidity_in)(e,t,r)}static calculateSpotPrice(e,t){return(0,C.calculate_spot_price)(e,t)}static calculateSpotPriceWithFee(e,t,r,s){return(0,C.calculate_spot_price_with_fee)(e,t,r,s)}static calculateShares(e,t,r){return(0,C.calculate_shares)(e,t,r)}static calculateLiquidityOutAssetA(e,t,r,s){return(0,C.calculate_liquidity_out_asset_a)(e,t,r,s)}static calculateLiquidityOutAssetB(e,t,r,s){return(0,C.calculate_liquidity_out_asset_b)(e,t,r,s)}};var Ue=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new u(e)}constructor(e){this.type="Xyk",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),o=p(i.balance),n=p(s.existentialDeposit),l=p(i.existentialDeposit);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:a,balanceOut:o,assetInED:n,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateTradeFee(s,r),a=b.toPct(r.exchangeFee),o=s.plus(i),n=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&n.push("InsufficientTradingAmount");let l=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(l)&&n.push("MaxOutRatioExceeded");let c=e.balanceIn.div(this.maxInRatio);return o.isGreaterThan(c)&&n.push("MaxInRatioExceeded"),{amountIn:o,calculatedIn:s,amountOut:t,feePct:a,errors:n}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateTradeFee(s,r),a=b.toPct(r.exchangeFee),o=s.minus(i),n=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&n.push("InsufficientTradingAmount");let l=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(l)&&n.push("MaxInRatioExceeded");let c=e.balanceOut.div(this.maxOutRatio);return o.isGreaterThan(c)&&n.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:o,feePct:a,errors:n}}calculateInGivenOut(e,t){let r=J.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?B:s}calculateOutGivenIn(e,t){let r=J.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?B:s}spotPriceInGivenOut(e){let t=J.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),r=A(E,18-e.decimalsOut);return p(t).div(r)}spotPriceOutGivenIn(e){let t=J.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),r=A(E,18-e.decimalsIn);return p(t).div(r)}calculateTradeFee(e,t){let r=J.calculatePoolTradeFee(e.toString(),t.exchangeFee[0],t.exchangeFee[1]);return p(r)}};var qe=class extends U{getPoolType(){return"Xyk"}getPoolLimits(){let e=this.api.consts.xyk.maxInRatio.toNumber(),t=this.api.consts.xyk.maxOutRatio.toNumber(),r=this.api.consts.xyk.minTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}isSupported(){return this.api.query.xyk!==void 0}async loadPools(){let t=(await this.api.query.xyk.poolAssets.entries()).map(async([{args:[r]},s])=>{let i=r.toString(),[a,o]=s.unwrap(),[n,l]=await Promise.all([this.getBalance(i,a.toString()),this.getBalance(i,o.toString())]);return{address:i,type:"Xyk",tokens:[{id:a.toString(),balance:n.toString()},{id:o.toString(),balance:l.toString()}],...this.getPoolLimits()}});return Promise.all(t)}async getPoolFees(e,t,r){return{exchangeFee:this.getExchangeFee()}}getExchangeFee(){let[e,t]=this.api.consts.xyk.getExchangeFee;return b.fromRate(e.toNumber(),t.toNumber())}async subscribeUpdates(){return()=>{}}};var k=require("@galacticcouncil/math-stableswap"),M=class{static getPoolAddress(e){return(0,k.pool_account_name)(e)}static defaultPegs(e){let t=[];for(let r=0;r<e;r++)t.push(["1","1"]);return t}static calculateAmplification(e,t,r,s,i){return(0,k.calculate_amplification)(e,t,r,s,i)}static calculateInGivenOut(e,t,r,s,i,a,o){return(0,k.calculate_in_given_out)(e,t,r,s,i,a,o)}static calculateAddOneAsset(e,t,r,s,i,a,o){return(0,k.calculate_add_one_asset)(e,t,r,s,i,a,o)}static calculateSharesForAmount(e,t,r,s,i,a,o){return(0,k.calculate_shares_for_amount)(e,t,r,s,i,a,o)}static calculateOutGivenIn(e,t,r,s,i,a,o){return(0,k.calculate_out_given_in)(e,t,r,s,i,a,o)}static calculateLiquidityOutOneAsset(e,t,r,s,i,a,o){return(0,k.calculate_liquidity_out_one_asset)(e,t,r,s,i,a,o)}static calculateShares(e,t,r,s,i,a){return(0,k.calculate_shares)(e,t,r,s,i,a)}static calculateSpotPriceWithFee(e,t,r,s,i,a,o,n){return(0,k.calculate_spot_price_with_fee)(e,t,r,s,i,a,o,n)}static recalculatePegs(e,t,r,s,i,a){let o=(0,k.recalculate_peg)(e,t,r,s,i,a);return JSON.parse(o)}};var ae=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;pegs;pegsFee;static fromPool(e){return new u(e)}constructor(e){this.type="Stableswap",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.amplification=e.amplification,this.id=e.id,this.fee=e.fee,this.totalIssuance=e.totalIssuance,this.pegs=e.pegs,this.pegsFee=e.pegsFee}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),o=p(i.balance),n=p(s.existentialDeposit),l=p(i.existentialDeposit);return{assetIn:e,assetOut:t,balanceIn:a,balanceOut:o,decimalsIn:s.decimals,decimalsOut:i.decimals,tradeableIn:this.id===e?15:s.tradeable,tradeableOut:this.id===t?15:i.tradeable,assetInED:n,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),a=i.minus(s),o=s===B?B:a.div(s).multipliedBy(100).decimalPlaces(4),n=[],l=R.isSellAllowed(e.tradeableIn),c=R.isBuyAllowed(e.tradeableOut);return(!l||!c)&&n.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&n.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:o.toNumber(),errors:n}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,r),o=s.minus(i).div(s).multipliedBy(100).decimalPlaces(4),n=[],l=R.isSellAllowed(e.tradeableIn),c=R.isBuyAllowed(e.tradeableOut);return(!l||!c)&&n.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&n.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:o.toNumber(),errors:n}}calculateIn(e,t,r){let s=M.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?b.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=p(s);return i.isNegative()?B:i}calculateAddOneAsset(e,t,r){let s=M.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,r?b.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=p(s);return i.isNegative()?B:i}calculateSharesForAmount(e,t,r){let s=M.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,r?b.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=p(s);return i.isNegative()?B:i}calculateInGivenOut(e,t,r){return e.assetOut==this.id?this.calculateAddOneAsset(e,t,r):e.assetIn==this.id?this.calculateSharesForAmount(e,t,r):this.calculateIn(e,t,r)}spotPriceInGivenOut(e){let t=M.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetOut,e.assetIn,this.totalIssuance,"0",this.getPegs());if(e.assetOut==this.id)return p(t);if(e.assetIn==this.id){let s=A(E,e.decimalsIn-e.decimalsOut);return p(t).div(s).decimalPlaces(0,1)}let r=A(E,18-e.decimalsIn);return p(t).div(r).decimalPlaces(0,1)}calculateOut(e,t,r){let s=M.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?b.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=p(s);return i.isNegative()?B:i}calculateWithdrawOneAsset(e,t,r){let s=M.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,r?b.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=p(s);return i.isNegative()?B:i}calculateShares(e,t,r){let s=M.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,r?b.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=p(s);return i.isNegative()?B:i}calculateOutGivenIn(e,t,r){return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t,r):e.assetOut==this.id?this.calculateShares(e,t,r):this.calculateOut(e,t,r)}spotPriceOutGivenIn(e){let t=M.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetIn,e.assetOut,this.totalIssuance,"0",this.getPegs());if(e.assetIn==this.id)return p(t);if(e.assetOut==this.id){let s=A(E,e.decimalsOut-e.decimalsIn);return p(t).div(s).decimalPlaces(0,1)}let r=A(E,18-e.decimalsOut);return p(t).div(r).decimalPlaces(0,1)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let e=this.tokens.filter(t=>t.id!=this.id).map(({id:t,balance:r,decimals:s})=>({asset_id:Number(t),amount:r,decimals:s}));return JSON.stringify(e)}getAssets(e,t){let r={asset_id:Number(e),amount:t.toFixed(0)};return JSON.stringify([r])}};var mt=require("@polkadot/util-crypto");var Ge=class extends U{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(e){let t=Number(e),r=M.getPoolAddress(t);return(0,mt.encodeAddress)((0,mt.blake2AsHex)(r),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:this.api.consts.stableswap.minTradingLimit.toNumber()}}async getPoolDelta(e,t,r){let{initialAmplification:s,finalAmplification:i,initialBlock:a,finalBlock:o}=t,n=M.calculateAmplification(s.toString(),i.toString(),a.toString(),o.toString(),r),l=await this.api.query.tokens.totalIssuance(e);return{amplification:n,totalIssuance:l.toString()}}async getPoolTokens(e,t,r){let{assets:s}=r,i=s.map(async a=>{let[o,n]=await Promise.all([this.api.query.stableswap.assetTradability(t,a.toString()),this.getBalance(e,a.toString())]);return{id:a.toString(),tradeable:o.bits.toNumber(),balance:n.toString()}});return Promise.all(i)}isSupported(){return this.api.query.stableswap!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.stableswap.pools.entries(),this.api.query.system.number()]),r=t.toNumber(),s=e.map(async([{args:[a]},o])=>{try{let n=o.unwrap(),l=a.toString(),c=this.getPoolAddress(l),[m,d,h]=await Promise.all([this.getPoolDelta(l,n,r.toString()),this.getPoolTokens(c,l,n),this.getPoolPegs(l,n,r.toString())]);return d.push({id:l,tradeable:15,balance:m.totalIssuance}),this.poolsData.set(c,n),{address:c,id:l,type:"Stableswap",fee:b.fromPermill(n.fee.toNumber()),tokens:d,...m,...h,...this.getPoolLimits()}}catch(n){return console.warn(`Skipping pool ${a.toString()}
2
2
  `,String(n)),null}});return(await Promise.all(s)).filter(a=>a!==null)}async getPoolFees(e,t,r){return{fee:this.pools.find(i=>i.address===r).pegsFee}}async getPoolPegs(e,t,r){let s=await this.api.query.stableswap.poolPegs(e);if(s.isNone)return this.getDefaultPegs(t);let i=s.unwrap(),a=await this.getLatestPegs(t,i,r),o=a.map(({pair:y,updatedAt:v})=>[y,v]),n=this.getRecentPegs(i),l=b.fromPermill(t.fee.toNumber()),c=b.fromPerbill(i.maxPegUpdate.toNumber()),m=a.find(y=>y.source),d=i.updatedAt?i.updatedAt.toString():m?.updatedAt;if(!d)throw Error(e+" current peg unknown");let[h,g]=M.recalculatePegs(JSON.stringify(n),d,JSON.stringify(o),r,b.toRaw(c).toString(),b.toRaw(l).toString()),f=Number(h)*1e6;return{pegsFee:b.fromPermill(f),pegs:g}}getDefaultPegs(e){let t=e.fee,r=M.defaultPegs(e.assets.length);return{pegsFee:b.fromPermill(t.toNumber()),pegs:r}}getRecentPegs(e){let{current:t}=e;return Array.from(t.entries()).map(([r,s])=>s.map(i=>i.toString()))}async getLatestPegs(e,t,r){let{source:s}=t,i=Array.from(e.assets.entries()).map(([o,n])=>n.toString()),a=s.map(async(o,n)=>{if(o.isOracle){let[l,c,m]=o.asOracle,d=[m.toString(),i[n]].map(x=>Number(x)).sort((x,O)=>x-O),h=await this.api.query.emaOracle.oracles(l,d,c),[{price:g,updatedAt:f}]=h.unwrap(),y=g.n.toString(),v=g.d.toString();return{pair:m.toString()===d[0].toString()?[y,v]:[v,y],updatedAt:f.toString(),source:"ema"}}else if(o.isMmOracle){let l=o.asMmOracle,{price:c,decimals:m,updatedAt:d}=await this.mmOracle.getData(l.toString()),h=10**m;return{pair:[c.toString(),h.toString()],updatedAt:d.toString(),source:"mm"}}else{if(o.isValue)return{pair:o.asValue.map(c=>c.toString()),updatedAt:r};throw Error(o.type+" is not supported")}});return Promise.all(a)}async subscribeUpdates(){return this.api.query.system.number(async e=>{let t=e.toString();this.pools.forEach(async r=>{let s=this.poolsData.get(r.address);if(s){let[i,a]=await Promise.all([this.getPoolDelta(r.id,s,t),this.getPoolPegs(r.id,s,t)]),o=r.tokens.map(n=>n.id===r.id?{...n,balance:i.totalIssuance}:n);Object.assign(r,{tokens:o},i,a)}})})}};var L=require("@galacticcouncil/math-hsm"),$=class{static calculateCollateralInGivenHollarOut(e,t,r){return(0,L.calculate_collateral_in_given_hollar_out)(e,t,r)}static calculateCollateralOutGivenHollarIn(e,t,r){return(0,L.calculate_collateral_out_given_hollar_in)(e,t,r)}static calculateHollarOutGivenCollateralIn(e,t,r){return(0,L.calculate_hollar_out_given_collateral_in)(e,t,r)}static calculateHollarInGivenCollateralOut(e,t,r){return(0,L.calculate_hollar_in_given_collateral_out)(e,t,r)}static calculateImbalance(e,t,r){return(0,L.calculate_imbalance)(e,t,r)}static calculateBuybackLimit(e,t){return(0,L.calculate_buyback_limit)(e,t)}static calculateBuybackPriceWithFee(e,t,r){return(0,L.calculate_buyback_price_with_fee)(e,t,r)}static calculateMaxPrice(e,t){return(0,L.calculate_max_price)(e,t)}};var pt=class u extends ae{hsmAddress;hsmMintCapacity;hollarId;hollarH160;collateralId;collateralBalance;maxBuyPriceCoefficient;maxInHolding;purchaseFee;buyBackFee;buyBackRate;static fromPool(e){return new u(e)}constructor(e){super(e),this.type="Hsm",this.hsmAddress=e.hsmAddress,this.hsmMintCapacity=e.hsmMintCapacity,this.hollarId=e.hollarId,this.hollarH160=e.hollarH160,this.collateralId=e.collateralId,this.collateralBalance=e.collateralBalance,this.maxBuyPriceCoefficient=e.maxBuyPriceCoefficient,this.maxInHolding=e.maxInHolding,this.purchaseFee=e.purchaseFee,this.buyBackFee=e.buyBackFee,this.buyBackRate=e.buyBackRate}validatePair(e,t){return!0}parsePair(e,t){return super.parsePair(e,t)}validateTradeHollarIn(e,t,r,s){let i=this.calculateBuybackLimit(e);t.gt(i)&&s.push("MaxBuyBackExceeded");let a=this.calculateBuyPrice(e,t,r),o=this.calculateMaxPrice(e);return a.gt(o)&&s.push("MaxBuyPriceExceeded"),r.gt(this.collateralBalance)&&s.push("InsufficientCollateral"),s}validateTradeHollarOut(e,t,r){return this.collateralBalance.plus(e).gt(this.maxInHolding)&&r.push("MaxHoldingExceeded"),t.gt(this.hsmMintCapacity)&&r.push("FacilitatorCapacityExceeded"),r}validateTradeConstraints(e,t,r){let s=[];return e.assetIn===this.hollarId?this.validateTradeHollarIn(e,t,r,s):this.validateTradeHollarOut(t,r,s)}validateAndBuy(e,t){let r=this.calculateInGivenOut(e,t),s=this.validateTradeConstraints(e,r,t);return{amountIn:r,calculatedIn:r,amountOut:t,feePct:0,errors:s}}validateAndSell(e,t){let r=this.calculateOutGivenIn(e,t),s=this.validateTradeConstraints(e,t,r);return{amountIn:t,calculatedOut:r,amountOut:r,feePct:0,errors:s}}calculateHollarInGivenCollateralOut(e,t){let r=super.calculateInGivenOut(e,t,{fee:this.fee}),s=$.calculateHollarInGivenCollateralOut(t.toFixed(0),r.toFixed(0),b.toRaw(this.buyBackFee).toString());return p(s)}calculateCollateralInGivenHollarOut(e){let t=this.getCollateralPeg(),r=$.calculateCollateralInGivenHollarOut(e.toFixed(0),JSON.stringify(t),b.toRaw(this.purchaseFee).toString());return p(r)}calculateInGivenOut(e,t){return e.assetOut==this.hollarId?this.calculateCollateralInGivenHollarOut(t):this.calculateHollarInGivenCollateralOut(e,t)}calculateCollateralOutGivenHollarIn(e,t){let r=super.calculateOutGivenIn(e,t,{fee:this.fee}),s=$.calculateCollateralOutGivenHollarIn(t.toFixed(0),r.toFixed(0),b.toRaw(this.buyBackFee).toString());return p(s)}calculateHollarOutGivenCollateralIn(e){let t=this.getCollateralPeg(),r=$.calculateHollarOutGivenCollateralIn(e.toFixed(0),JSON.stringify(t),b.toRaw(this.purchaseFee).toString());return p(r)}calculateOutGivenIn(e,t){return e.assetIn==this.hollarId?this.calculateCollateralOutGivenHollarIn(e,t):this.calculateHollarOutGivenCollateralIn(t)}calculateImbalance(e){let t=this.getCollateralPeg(),r=$.calculateImbalance(e.balanceIn.toString(),JSON.stringify(t),e.balanceOut.toString());return p(r)}calculateBuybackLimit(e){let t=this.calculateImbalance(e),r=$.calculateBuybackLimit(t.toString(),b.toRaw(this.buyBackRate).toString());return p(r)}calculateBuyPrice(e,t,r){let s=t.dividedBy(p(10).pow(e.decimalsIn));return r.dividedBy(p(10).pow(e.decimalsOut)).dividedBy(s)}calculateMaxPrice(e){let t=this.getCollateralPeg(),r=$.calculateMaxPrice(JSON.stringify(t),this.maxBuyPriceCoefficient.toFixed(0)),[s,i]=JSON.parse(r);return p(s).div(p(i)).shiftedBy(-1*e.decimalsOut)}spotPriceInGivenOut(e){let t=A(E,e.decimalsOut);return this.calculateInGivenOut(e,t)}spotPriceOutGivenIn(e){let t=A(E,e.decimalsIn);return this.calculateOutGivenIn(e,t)}getCollateralPeg(){let e=this.tokens.findIndex(s=>s.id!==this.hollarId),t=this.pegs[e],r=this.tokens[e].decimals;return this.isDefaultPeg(t)?[A(E,18).toString(),A(E,r).toString()]:t}isDefaultPeg(e){let[t,r]=e;return Array.isArray(e)&&e.length===2&&t==="1"&&r==="1"}};var Ut=require("@polkadot/util"),qt=require("@polkadot/util-crypto"),xr=require("viem");var We=[{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 ze=class{rpcAdapter;constructor(e){this.rpcAdapter=e.getRPCAdapter()}async getFacilitatorCapacity(e,t){let[r,s]=await this.rpcAdapter.readContract({abi:We,address:e,functionName:"getFacilitatorBucket",args:[t]});return r-s}};var Qr=["FacilitatorBucketCapacityUpdated","FacilitatorBucketLevelUpdated"],dt=class extends U{stableClient;ghoTokenClient;constructor(e,t,r){super(e,t),this.stableClient=r,this.ghoTokenClient=new ze(t)}getPoolType(){return"Hsm"}getPoolId(e){let t="hsm:"+e;return(0,qt.encodeAddress)((0,Ut.stringToU8a)(t.padEnd(32,"\0")),63)}getFacilitatorAddress(){return(0,qt.encodeAddress)((0,Ut.stringToU8a)("modlpy/hsmod".padEnd(32,"\0")),63)}getHollarAddress(e){return Ce(e,"accountKey20").accountKey20.key}isSupported(){return this.api.query.hsm!==void 0}async loadPools(){let e=this.api.consts.hsm.hollarId.toString(),[t,r,s]=await Promise.all([this.api.query.assetRegistry.assetLocations(e),this.api.query.hsm.collaterals.entries(),this.stableClient.getPoolsMem()]);if(r.length===0)return[];let i=this.getFacilitatorAddress(),a=Y.fromAny(i),o=this.getHollarAddress(t.unwrap()),n=await this.ghoTokenClient.getFacilitatorCapacity(o,a),l=r.map(async([{args:[m]},d])=>{let h=d.unwrap(),g=m.toString(),{poolId:f,maxBuyPriceCoefficient:y,maxInHolding:v,purchaseFee:P,buyBackFee:x,buybackRate:O}=h,T=s.find(w=>w.id===f.toString());if(T){let w=this.getPoolId(f.toString()),D=await this.getBalance(i,g);return{...T,address:w,type:"Hsm",tokens:T.tokens.filter(q=>q.id!==f.toString()),hsmAddress:i,hsmMintCapacity:p(n),hollarId:e,hollarH160:o,collateralId:g,collateralBalance:D,maxBuyPriceCoefficient:p(y.toString()),maxInHolding:p(v.unwrap().toString()),purchaseFee:b.fromPermill(P.toNumber()),buyBackFee:b.fromPermill(x.toNumber()),buyBackRate:b.fromPerbill(O.toNumber())}}});return(await Promise.all(l)).filter(m=>m!==null)}async getPoolFees(e,t,r){return{}}onEvents(e){e.forEach(async t=>{let{event:r}=t;if(`${r.section}:${r.method}`==="evm:Log"){let[i]=r.data.toJSON();try{let{eventName:a,args:o}=(0,xr.decodeEventLog)({abi:We,topics:i.topics,data:i.data}),[n]=this.pools,{hsmAddress:l,hollarH160:c}=n,m=Y.fromAny(l),d=m.toLowerCase()===o.facilitatorAddress.toLowerCase();if(Qr.includes(a)&&d){let h=await this.ghoTokenClient.getFacilitatorCapacity(c,m);this.log(`Sync HSM facilitator via [evm:Log] :: ${a} ${h}`),this.pools.forEach(g=>{Object.assign(g,{hsmMintCapacity:h})})}}catch{}}})}async subscribeBalances(){let e=[],t=[],r=[];for(let i of this.pools){let{tokens:a,hsmAddress:o,collateralId:n}=i;a.find(c=>c.id===n).type==="Erc20"?t.push([o,n]):e.push([o,n])}let s=i=>{i.forEach(([a,o])=>{let[n,l]=a,c=this.pools.find(m=>m.tokens.some(d=>d.id===l));c&&Object.assign(c,{collateralBalance:o})})};if(e.length>0){let i=await this.subscribeTokenBalances(e,s);r.push(i)}if(t.length>0){let i=await this.subscribeErc20Balances(t,s);r.push(i)}return()=>{for(let i of r)try{i()}catch(a){console.warn("Balance unsub failed",a)}}}async subscribeUpdates(){return()=>{}}};var ye=class extends H{api;evm;assetClient;aaveClient;xykClient;omniClient;lbpClient;stableClient;hsmClient;clients=[];onChainAssets=[];block=0;blockHandlers=[];eventHandlers=[];disconnectSubscribeNewHeads=null;disconnectSubscribeEvents=null;memRegistry=re(e=>(this.log(`Registry mem ${e} sync`),this.syncRegistry()));constructor(e,t){super(e),this.api=e,this.evm=t,this.assetClient=new te(this.api),this.aaveClient=new ke(this.api,t),this.xykClient=new qe(this.api,t),this.omniClient=new He(this.api,t),this.lbpClient=new Me(this.api,t),this.stableClient=new Ge(this.api,t),this.hsmClient=new dt(this.api,t,this.stableClient),this.clients=[this.aaveClient,this.xykClient,this.omniClient,this.lbpClient,this.stableClient,this.hsmClient],this.blockHandlers=this.clients.map(r=>r.onNewBlockHandler),this.eventHandlers=this.clients.map(r=>r.onEventsHandler),this.api.rpc.chain.subscribeNewHeads(async r=>{let s=r.number.toNumber();this.onNewBlock(s)}).then(r=>{this.disconnectSubscribeNewHeads=r}),this.api.query.system.events(r=>{this.onEvents(r)}).then(r=>{this.disconnectSubscribeEvents=r})}onNewBlock(e){this.block=e;for(let t of this.blockHandlers)try{t(e)}catch(r){this.log("onNewBlock handler error",r)}}onEvents(e){for(let t of this.eventHandlers)try{t(e)}catch(r){this.log("onEvents handler error",r)}}get assets(){return this.onChainAssets}get isRegistrySynced(){return this.onChainAssets.length>0}async syncRegistry(e){let t=await this.assetClient.getOnChainAssets(!1,e);this.clients.forEach(r=>r.withAssets(t)),this.onChainAssets=t}async getPools(e={}){this.isRegistrySynced||await this.memRegistry(1);let{includeOnly:t=[],exclude:r=[]}=e;return t.length>0?this.getFilteredPools(s=>t.includes(s.getPoolType())):r.length>0?this.getFilteredPools(s=>!r.includes(s.getPoolType())):this.getFilteredPools(s=>s.isSupported())}async getFilteredPools(e){let t=this.clients.filter(e);return(await Promise.all(t.map(s=>s.getPoolsMem()))).flat()}destroy(){this.aaveClient.unsubscribe(),this.xykClient.unsubscribe(),this.omniClient.unsubscribe(),this.lbpClient.unsubscribe(),this.stableClient.unsubscribe(),this.hsmClient.unsubscribe(),this.disconnectSubscribeNewHeads?.(),this.disconnectSubscribeEvents?.()}async getPoolFees(e,t){switch(t.type){case"Aave":return this.aaveClient.getPoolFees(this.block,e,t.address);case"Xyk":return this.xykClient.getPoolFees(this.block,e,t.address);case"Omnipool":return this.omniClient.getPoolFees(this.block,e,t.address);case"Lbp":return this.lbpClient.getPoolFees(this.block,e,t.address);case"Stableswap":return this.stableClient.getPoolFees(this.block,e,t.address);case"Hsm":return this.hsmClient.getPoolFees(this.block,e,t.address);default:throw new Ae(t.type)}}};var fe=class extends ye{feeCache=new Map;constructor(e,t){super(e,t)}onNewBlock(e){super.onNewBlock(e),this.feeCache.clear()}async getPoolFees(e,t){let r=[t.address,e.assetIn,e.assetOut].join("-");if(this.feeCache.has(r))return this.feeCache.get(r);let s=super.getPoolFees(e,t);return this.feeCache.set(r,s),s}async destroy(){this.feeCache.clear(),super.destroy()}};var be=class{static get(e){switch(e.type){case"Aave":return Ne.fromPool(e);case"Xyk":return Ue.fromPool(e);case"Omnipool":return Le.fromPool(e);case"Lbp":return De.fromPool(e);case"Stableswap":return ae.fromPool(e);case"Hsm":return pt.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};var Br=require("@noble/hashes/sha2"),wr=require("@noble/hashes/utils");function Jr(u){let e=u.map(s=>s.address).sort().join(":"),t=new TextEncoder().encode(e),r=(0,Br.sha256)(t);return(0,wr.bytesToHex)(r)}var Xe=class{constructor(e=1/0){this.capacity=e}storage=[];enqueue(e){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(e)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Zr=10,Ve=class{isNotVisited(e,t){let r=!0;return t.forEach(s=>{(s[0]===e[0]||s[1]===e[1])&&(r=!1)}),r}findPaths(e,t,r){let s=[],i=new Xe,a=[];for(a.push([t,""]),i.enqueue(a);i.size()>0;){let o=i.dequeue();if(!o||o.length>Zr)continue;let n=o[o.length-1];(r===null||n[0]===r)&&s.push(o),e.get(n[0])?.forEach(c=>{if(this.isNotVisited(c,o)){let m=[...o];m.push(c),i.enqueue(m)}})}return s}findShortestPaths(e,t,r){let s=[],i=new Xe,a=[];a.push([t,""]),i.enqueue(a);let o=1/0;for(;i.size()>0;){let n=i.dequeue();if(!n)continue;let l=n[n.length-1];if(l[0]===r){n.length<o?(o=n.length,s.length=0,s.push(n)):n.length===o&&s.push(n);continue}let c=e.get(l[0]);for(let m of c??[])this.isNotVisited(m,n)&&i.enqueue([...n,m])}return s}buildAndPopulateGraph(e,t){let r=new Map;for(let s of e)r.set(parseInt(s),[]);for(let[s,i,a]of t){let o=parseInt(i),n=parseInt(a);r.get(o)?.push([n,s])}return r}};function Gt(u){let e={};for(let t of u){let r=t.tokens.length;for(let s=0;s<r;s++){e[t.tokens[s].id]||(e[t.tokens[s].id]=[]);for(let i=0;i<r;i++){if(s==i)continue;let a=[t.address,t.tokens[s].id,t.tokens[i].id];e[t.tokens[s].id].push(a)}}}return e}var Ye=class{getProposals(e,t,r){let s=r.filter(P=>P.type==="Xyk"),i=r.filter(P=>P.type!=="Xyk"),a=parseInt(e),o=parseInt(t),n=new Set(i.map(P=>P.tokens).flat().map(P=>P.id)),l=n.has(e),c=n.has(t),m=new Ve,d=P=>{let x=Gt(P),O=Object.keys(x),T=O.flatMap(w=>x[w]);return m.buildAndPopulateGraph(O,T)};if(!l&&!c){let P=s.filter(T=>T.tokens.find(w=>w.id===e)||T.tokens.find(w=>w.id===t)),x=d(P),O=m.findPaths(x,a,o);return this.parsePaths(O)}if(l&&c){let P=d(i),x=m.findPaths(P,a,o);return this.parsePaths(x)}let h=l?t:e,g=s.filter(P=>P.tokens.some(x=>x.id===h));if(g.length===0)return[];let f=[...i,...g],y=d(f),v=m.findPaths(y,a,o);return this.parsePaths(v)}parsePaths(e){let t=[];for(let r of e){let s=[];for(let i=0;i<r.length;i++){let a=r[i],o=r[i+1];if(o==null)break;s.push(this.toEdge(a,o))}t.push(s)}return t}toEdge(e,t){return[t[1],e[0].toString(),t[0].toString()]}};var Pe=class{routeSuggester;routeProposals;routerOptions;poolService;constructor(e,t={}){this.poolService=e,this.routeSuggester=new Ye,this.routeProposals=new Map,this.routerOptions=Object.freeze(t)}buildRouteKey(e,t,r){return`${e}->${t}::${r.length}`}async getPools(){return this.poolService.getPools(this.routerOptions)}async getAllAssets(){let e=await this.getPools(),t=this.getAssets(e);return[...new Map(t).values()]}async getRouteableAssets(e){let t=await this.getAllAssets();return(await Promise.all(t.map(s=>s.id).filter(s=>s!==e).map(s=>this.getRoutes(s,e)))).filter(s=>s.length>0).map(([s])=>s[0].assetIn).sort()}async getRoutes(e,t){let r=await this.getPools();return this.validateInput(e,t,r),this.getPaths(e,t,r)}validateInput(e,t,r){if(r.length===0)throw new Error("No pools configured");if(e===t)throw new Error("Trading pair can't be identical");let s=this.getAssets(r);if(s.get(e)===null)throw new Error(e+" is not supported asset");if(s.get(t)===null)throw new Error(t+" is not supported asset");return this.toPoolsMap(r)}getAssets(e){let t=e.map(r=>r.tokens.map(s=>({id:s.id,name:s.name,symbol:s.symbol,decimals:s.decimals,icon:s.icon,type:s.type,isSufficient:s.isSufficient,existentialDeposit:s.existentialDeposit,meta:s.meta,location:s.location,isWhiteListed:s.isWhiteListed}))).flat();return new Map(t.map(r=>[r.id,r]))}getPaths(e,t,r){let s=this.toPoolsMap(r);return this.getProposals(e,t,r).filter(o=>this.validPath(o,s)).map(o=>this.toHops(o,s))}getProposals(e,t,r){let s=this.buildRouteKey(e,t,r);if(this.routeProposals.has(s))return this.routeProposals.get(s);let i=this.routeSuggester.getProposals(e,t,r);return this.routeProposals.set(s,i),i}validPath(e,t){return e.length>0&&e.map(r=>this.validEdge(r,t)).reduce((r,s)=>r&&s)}validEdge([e,t,r],s){return s.get(e)?.validatePair(t,r)||!1}toPoolsMap(e){return new Map(e.map(t=>[t.address,be.get(t)]))}toHops(e,t){return e.map(([r,s,i])=>{let a=t.get(r);return{poolAddress:r,poolId:a?.id,pool:a?.type,assetIn:s,assetOut:i}})}};var es=p("100");function ts(u,e){return u.minus(e).abs().div(u.plus(e).div(2)).multipliedBy(100).decimalPlaces(2)}function ve(u,e){return u.minus(e).div(e).multipliedBy(100).decimalPlaces(2)}function Wt(u,e){return E.minus(e.div(u)).multipliedBy(100).decimalPlaces(4)}function zt(u,e){return e.div(u).minus(E).multipliedBy(100).decimalPlaces(4)}function ie(u,e){return(e<.01||e>100)&&new Error("Supported range is from 0.01% - 100%"),u.div(es).multipliedBy(e).decimalPlaces(0,1)}var gt=(t=>(t.Buy="Buy",t.Sell="Sell",t))(gt||{}),ht=(r=>(r.Dca="Dca",r.TwapSell="TwapSell",r.TwapBuy="TwapBuy",r))(ht||{}),Xt=(r=>(r.OrderTooSmall="OrderTooSmall",r.OrderTooBig="OrderTooBig",r.OrderImpactTooBig="OrderImpactTooBig",r))(Xt||{});var oe=class extends Pe{mlr;poolsSnapshot;constructor(e,t={}){super(e,t),this.mlr=new Map}buildCtxSync(e,t){let r=this.poolsSnapshot,s=super.validateInput(e,t,r),i=super.getPaths(e,t,r);if(!i.length)throw new Fe(e,t);return{paths:i,pools:r,poolsMap:s}}async withCtx(e,t,r){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let s=this.buildCtxSync(e,t);return r(s)}isDirectTrade(e){return e.length==1}findBestSellRoute(e){let t=e.sort((r,s)=>{let i=r[r.length-1].amountOut,a=s[s.length-1].amountOut;return i.isGreaterThan(a)?-1:1});return t.find(r=>r.every(s=>s.errors.length==0))||t[0]}getRouteFeeRange(e){if(e.filter(r=>r.tradeFeeRange).length>0){let r=e.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,a)=>i+a),s=e.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,a)=>i+a);return[r,s]}}getPoolFeeRange(e){let t=e.min?b.toPct(e.min):void 0,r=e.max?b.toPct(e.max):void 0;if(t&&r)return[t,r]}async getBestSell(e,t,r){return this.getSell(e,t,r)}async getSell(e,t,r,s){return this.withCtx(e,t,async({paths:i,poolsMap:a})=>{let o;if(s)o=await this.toSellSwaps(r,s,a);else{let n=i.map(c=>this.toSellSwaps(r,c,a)),l=await Promise.all(n);o=this.findBestSellRoute(l)}return this.buildSell(a,o)})}async getSellTrades(e,t,r){return this.withCtx(e,t,async({paths:s,poolsMap:i})=>{let a=s.map(n=>this.toSellSwaps(r,n,i));return(await Promise.all(a)).filter(n=>n.every(l=>l.errors.length==0)).map(n=>this.buildSell(i,n)).sort((n,l)=>n.amountOut.isGreaterThan(l.amountOut)?-1:1)})}buildSell(e,t){let r=t[0],s=t[t.length-1],i=this.isDirectTrade(t),a=t.map(f=>f.spotPrice.shiftedBy(-1*f.assetOutDecimals)).reduce((f,y)=>f.multipliedBy(y)),o=A(a,s.assetOutDecimals),n=i?s.calculatedOut:this.calculateDelta0Y(r.amountIn,t,e),l=s.amountOut,c=i?s.tradeFeePct:Wt(n,l).toNumber(),m=n.minus(l),d=this.getRouteFeeRange(t),h=r.amountIn.shiftedBy(-1*r.assetInDecimals).multipliedBy(o),g=ve(n,h);return{type:"Sell",amountIn:r.amountIn,amountOut:s.amountOut,spotPrice:o,tradeFee:m,tradeFeePct:c,tradeFeeRange:d,priceImpactPct:g.toNumber(),swaps:t,toHuman(){return{type:"Sell",amountIn:I(r.amountIn,r.assetInDecimals),amountOut:I(s.amountOut,s.assetOutDecimals),spotPrice:I(o,s.assetOutDecimals),tradeFee:I(m,s.assetOutDecimals),tradeFeePct:c,tradeFeeRange:d,priceImpactPct:g.toNumber(),swaps:t.map(f=>f.toHuman())}}}}calculateDelta0Y(e,t,r){let s=[];for(let i=0;i<t.length;i++){let a=t[i],o=r.get(a.poolAddress);if(o==null)throw new Error("Pool does not exit");let n=o.parsePair(a.assetIn,a.assetOut),l;i>0?l=s[i-1]:l=e;let c=o.calculateOutGivenIn(n,l);s.push(c)}return s[s.length-1]}async calculateMostLiquidRoute(e,t,r){let{paths:s,pools:i,poolsMap:a}=r,c=i.filter(y=>y.tokens.some(v=>v.id===e)).map(y=>y.type==="Aave"?y.tokens:y.tokens.filter(v=>v.id===e)).map(y=>y.map(v=>p(v.balance).shiftedBy(-1*v.decimals)).reduce((v,P)=>v.plus(P))).sort((y,v)=>v.isLessThan(y)?-1:1)[0].div(100).multipliedBy(.1),m=s.map(async y=>await this.toSellSwaps(c,y,a)),d=await Promise.all(m),g=this.findBestSellRoute(d).map(y=>({poolAddress:y.poolAddress,poolId:y?.poolId,pool:y.pool,assetIn:y.assetIn,assetOut:y.assetOut})),f=this.buildRouteKey(e,t,i);return this.mlr.set(f,g),g}async toSellSwaps(e,t,r){let s=[],i=[];for(let n=0;n<t.length;n++){let l=t[n],c=r.get(l.poolAddress);if(!c)throw new Error("Pool does not exit");let m=c.parsePair(l.assetIn,l.assetOut);s[n]=c,i[n]=m}let a=await Promise.all(i.map((n,l)=>this.poolService.getPoolFees(n,s[l]))),o=[];for(let n=0;n<t.length;n++){let l=t[n],c=s[n],m=a[n],d=i[n],h;n>0?h=o[n-1].amountOut:h=A(p(e),d.decimalsIn).decimalPlaces(0,1);let{amountOut:g,calculatedOut:f,feePct:y,errors:v}=c.validateAndSell(d,h,m),P=this.getPoolFeeRange(m),x=c.spotPriceOutGivenIn(d),O=h.shiftedBy(-1*d.decimalsIn).multipliedBy(x),T=ve(f,O),w=c.type==="Aave";o.push({...l,assetInDecimals:d.decimalsIn,assetOutDecimals:d.decimalsOut,amountIn:h,amountOut:g,calculatedOut:f,spotPrice:x,tradeFeePct:y,tradeFeeRange:P,priceImpactPct:T.toNumber(),errors:v,isSupply:()=>w&&c.tokens[0].id===l.assetIn,isWithdraw:()=>w&&c.tokens[1].id===l.assetIn,toHuman(){return{...l,amountIn:I(h,d.decimalsIn),amountOut:I(g,d.decimalsOut),calculatedOut:I(f,d.decimalsOut),spotPrice:I(x,d.decimalsOut),tradeFeePct:y,priceImpactPct:T.toNumber(),errors:v}}})}return o}async getMostLiquidRoute(e,t){return this.withCtx(e,t,async r=>{let s=this.buildRouteKey(e,t,r.pools),i=this.mlr.get(s);return i||this.calculateMostLiquidRoute(e,t,r)})}async getBestSpotPrice(e,t){return this.withCtx(e,t,async r=>{let{pools:s,poolsMap:i}=r,a=this.buildRouteKey(e,t,s),o=this.mlr.get(a);o||(o=await this.calculateMostLiquidRoute(e,t,r));let n=await this.toSellSwaps("1",o,i),l=n.map(d=>d.spotPrice.shiftedBy(-1*d.assetOutDecimals)).reduce((d,h)=>d.multipliedBy(h)),c=n[n.length-1].assetOutDecimals;return{amount:A(l,c),decimals:c}}).catch(()=>{})}findBestBuyRoute(e){let t=e.sort((r,s)=>{let i=r[0].amountIn,a=s[0].amountIn;return i.isGreaterThan(a)?1:-1});return t.find(r=>r.every(s=>s.errors.length==0))||t[0]}async getBestBuy(e,t,r){return this.getBuy(e,t,r)}async getBuy(e,t,r,s){return this.withCtx(e,t,async({paths:i,poolsMap:a})=>{let o;if(s)o=await this.toBuySwaps(r,s,a);else{let n=i.map(c=>this.toBuySwaps(r,c,a)),l=await Promise.all(n);o=this.findBestBuyRoute(l)}return this.buildBuy(a,o)})}async getBuyTrades(e,t,r){return this.withCtx(e,t,async({paths:s,poolsMap:i})=>{let a=s.map(n=>this.toBuySwaps(r,n,i));return(await Promise.all(a)).filter(n=>n.every(l=>l.errors.length==0)).map(n=>this.buildBuy(i,n)).sort((n,l)=>n.amountIn.isGreaterThan(l.amountIn)?1:-1)})}buildBuy(e,t){let r=t[t.length-1],s=t[0],i=this.isDirectTrade(t),a=t.map(f=>f.spotPrice.shiftedBy(-1*f.assetInDecimals)).reduce((f,y)=>f.multipliedBy(y)),o=A(a,s.assetInDecimals),n=i?s.calculatedIn:this.calculateDelta0X(r.amountOut,t,e),l=s.amountIn,c=i?s.tradeFeePct:zt(n,l).toNumber(),m=l.minus(n),d=this.getRouteFeeRange(t),h=r.amountOut.shiftedBy(-1*r.assetOutDecimals).multipliedBy(o),g;return n.isZero()?g=-100:g=ve(h,n).toNumber(),{type:"Buy",amountOut:r.amountOut,amountIn:s.amountIn,spotPrice:o,tradeFee:m,tradeFeePct:c,tradeFeeRange:d,priceImpactPct:g,swaps:t,toHuman(){return{type:"Buy",amountOut:I(r.amountOut,r.assetOutDecimals),amountIn:I(s.amountIn,s.assetInDecimals),spotPrice:I(o,s.assetInDecimals),tradeFee:I(m,s.assetInDecimals),tradeFeePct:c,tradeFeeRange:d,priceImpactPct:g,swaps:t.map(f=>f.toHuman())}}}}calculateDelta0X(e,t,r){let s=[];for(let i=t.length-1;i>=0;i--){let a=t[i],o=r.get(a.poolAddress);if(o==null)throw new Error("Pool does not exit");let n=o.parsePair(a.assetIn,a.assetOut),l;i==t.length-1?l=e:l=s[0];let c=o.calculateInGivenOut(n,l);s.unshift(c)}return s[0]}async toBuySwaps(e,t,r){let s=[],i=[];for(let n=0;n<t.length;n++){let l=t[n],c=r.get(l.poolAddress);if(!c)throw new Error("Pool does not exit");let m=c.parsePair(l.assetIn,l.assetOut);s[n]=c,i[n]=m}let a=await Promise.all(i.map((n,l)=>this.poolService.getPoolFees(n,s[l]))),o=[];for(let n=t.length-1;n>=0;n--){let l=t[n],c=s[n],m=a[n],d=i[n],h;n==t.length-1?h=A(p(e),d.decimalsOut).decimalPlaces(0,1):h=o[0].amountIn;let{amountIn:g,calculatedIn:f,feePct:y,errors:v}=c.validateAndBuy(d,h,m),P=this.getPoolFeeRange(m),x=c.spotPriceInGivenOut(d),O=h.shiftedBy(-1*d.decimalsOut).multipliedBy(x),T;f.isZero()?T=-100:T=ve(O,f).toNumber(),o.unshift({...l,assetInDecimals:d.decimalsIn,assetOutDecimals:d.decimalsOut,amountIn:g,amountOut:h,calculatedIn:f,spotPrice:x,tradeFeePct:y,tradeFeeRange:P,priceImpactPct:T,errors:v,isSupply(){return c.type==="Aave"&&c.tokens[0].id===l.assetIn},isWithdraw(){return c.type==="Aave"&&c.tokens[1].id===l.assetIn},toHuman(){return{...l,amountIn:I(g,d.decimalsIn),amountOut:I(h,d.decimalsOut),calculatedIn:I(f,d.decimalsIn),spotPrice:I(x,d.decimalsIn),tradeFeePct:y,tradeFeeRange:P,priceImpactPct:T,errors:v}}})}return o}};var Vt=6e3,Yt=p(1e15),Se=6,yt=-5,ft=360*60*1e3,rs=3,Kt=6;var z=class{static build(e){return e.map(({assetIn:t,assetOut:r,pool:s,poolId:i})=>s==="Stableswap"?{pool:{Stableswap:i},assetIn:t,assetOut:r}:{pool:s,assetIn:t,assetOut:r})}};var xe=class{schedulerOptions;router;constructor(e,t={}){this.router=e,this.schedulerOptions=Object.freeze({blockTime:t.blockTime??Vt,minBudgetInNative:t.minBudgetInNative??Yt})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(e,t,r,s,i){let[a,o]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,r)]),{amountIn:n,swaps:l,priceImpactPct:c}=o,m=l[0],d=l[l.length-1],{assetInDecimals:h}=m,{assetOutDecimals:g}=d,f=Math.abs(c),y=this.getMinimumTradeCount(n,a),v=this.getOptimalTradeCount(f),P=i?Math.round(s/i):v,x=Math.ceil(s/y),O=Math.round(s/v),T=Math.round(s/P),w=n.dividedBy(P).decimalPlaces(0,1),D=await this.router.getBestSell(e,t,I(w,h)),q=n.isLessThan(a),Ke=[];q&&Ke.push("OrderTooSmall");let $e=D.amountOut.multipliedBy(P),vt=this.toBlockPeriod(T),St=D.tradeFee.multipliedBy(P),xt=z.build(l),je={assetIn:e,assetOut:t,errors:Ke,frequencyMin:x,frequencyOpt:O,frequency:T,tradeCount:P,tradeFee:St,tradeImpactPct:D.priceImpactPct,tradePeriod:vt,tradeRoute:xt,type:"Dca"};return{...je,amountIn:n,amountOut:$e,tradeAmountIn:D.amountIn,tradeAmountOut:D.amountOut,toHuman(){return{...je,amountIn:I(n,h),amountOut:I($e,g),tradeAmountIn:I(D.amountIn,h),tradeAmountOut:I(D.amountOut,g)}}}}async getMinimumOrderBudget(e){if("0"===e)return this.minOrderBudget;let t=await this.router.getBestSpotPrice("0",e);if(t)return this.minOrderBudget.times(t.amount).div(p(10).pow(12)).decimalPlaces(0,1);throw new Error("Unable to calculate order budget")}getMinimumTradeCount(e,t){let r=t.multipliedBy(.2),s=e.dividedBy(r).toNumber();return Math.round(s)}getOptimalTradeCount(e){let t=Math.round(e*10)||1;return Math.max(t,3)}async getTwapSellOrder(e,t,r){let[s,i]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,r)]),{amountIn:a,swaps:o,priceImpactPct:n}=i,l=o[0],c=o[o.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,h=Math.abs(n),g=this.getTwapTradeCount(h),f=a.dividedBy(g).decimalPlaces(0,1),y=await this.router.getBestSell(l.assetIn,c.assetOut,I(f,m)),v=g===1,P=a.isLessThan(s),x=y.priceImpactPct<yt,O=[];P||v?O.push("OrderTooSmall"):x&&O.push("OrderImpactTooBig");let T=y.amountOut.multipliedBy(g),w=y.tradeFee.multipliedBy(g),D=z.build(o),q={assetIn:e,assetOut:t,errors:O,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:Se,tradeRoute:D,type:"TwapSell"};return{...q,amountIn:a,amountOut:T,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:w,toHuman(){return{...q,amountIn:I(a,m),amountOut:I(T,d),tradeAmountIn:I(y.amountIn,m),tradeAmountOut:I(y.amountOut,d),tradeFee:I(w,d)}}}}async getTwapBuyOrder(e,t,r){let[s,i]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestBuy(e,t,r)]),{amountOut:a,swaps:o,priceImpactPct:n}=i,l=o[0],c=o[o.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,h=Math.abs(n),g=this.getTwapTradeCount(h),f=a.dividedBy(g).decimalPlaces(0,1),y=await this.router.getBestBuy(l.assetIn,c.assetOut,I(f,d)),v=y.amountIn.multipliedBy(g),P=g===1,x=v.isLessThan(s),O=y.priceImpactPct<yt,T=[];x||P?T.push("OrderTooSmall"):O&&T.push("OrderImpactTooBig");let w=y.tradeFee.multipliedBy(g),D=z.build(o),q={assetIn:e,assetOut:t,errors:T,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:Se,tradeRoute:D,type:"TwapBuy"};return{...q,amountIn:v,amountOut:a,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:w,toHuman(){return{...q,amountIn:I(v,m),amountOut:I(a,d),tradeAmountIn:I(y.amountIn,m),tradeAmountOut:I(y.amountOut,d),tradeFee:I(w,m)}}}}getTwapTradeCount(e){let t=this.getOptimalTradeCount(e);if(this.getTwapExecutionTime(t)>ft){let s=ft/(this.blockTime*Se);return Math.round(s)}return t}getTwapExecutionTime(e){return e*Se*this.blockTime}toBlockPeriod(e){let t=e/this.blockTime,r=Math.round(t);return Math.max(r,Kt)}};var Be=class extends H{evm;evmClient;balanceClient;aaveUtils;constructor(e,t){super(e),this.evm=t,this.evmClient=t.getWsProvider(),this.balanceClient=new W(e),this.aaveUtils=new ee(t)}wrapTx(e,t,r){return{hex:t.toHex(),name:e,extraGas:r,get:()=>t,dryRun:s=>this.dryRun(s,t)}}async dryRun(e,t){let r;try{r=await this.api.call.dryRunApi.dryRunCall({System:{Signed:e}},t.inner.toHex())}catch(s){throw console.error(s),new Error("Dry run execution failed!")}if(r.isOk)return r.asOk;throw console.log(r.asErr.toHuman()),new Error("Dry run execution error!")}dispatchWithExtraGas(e){return this.api.tx.dispatcher.dispatchWithExtraGas(e.inner.toHex(),le)}isDirectOmnipoolTrade(e){return e.length===1&&e[0].pool==="Omnipool"}};var bt=class extends Be{_trade;_beneficiary;_slippagePct=1;setTrade(e){return this._trade=e,this}withBeneficiary(e){return this._beneficiary=e,this}withSlippage(e){return this._slippagePct=e,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:e,swaps:t,type:r}=this.trade;if(r==="Buy")return this.buildBuyTx();let s=t[0],{assetIn:i,assetOut:a}=s,n=(await this.balanceClient.getBalance(this.beneficiary,i)).minus(5),l=!0;return s.isWithdraw()&&(l=(await this.aaveUtils.getMaxWithdraw(this.beneficiary,a)).amount.isGreaterThanOrEqualTo(n)),l&&e.isGreaterThanOrEqualTo(n)?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:e,amountOut:t,swaps:r}=this.trade,s=r[0],i=r[r.length-1],a=ie(e,this.slippagePct),o=s.assetIn,n=i.assetOut,l=e.plus(a),c;if(this.isDirectOmnipoolTrade(r)?c=this.api.tx.omnipool.buy(n,o,t.toFixed(),l.toFixed()):c=this.api.tx.router.buy(o,n,t.toFixed(),l.toFixed(),z.build(r)),await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let d=this.dispatchWithExtraGas(c);return this.wrapTx("RouterBuy",d,le)}return this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:e,amountOut:t,swaps:r}=this.trade,s=r[0],i=r[r.length-1],a=ie(t,this.slippagePct),o=s.assetIn,n=i.assetOut,l=t.minus(a),c;if(this.isDirectOmnipoolTrade(r)?c=this.api.tx.omnipool.sell(o,n,e.toFixed(),l.toFixed()):c=this.api.tx.router.sell(o,n,e.toFixed(),l.toFixed(),z.build(r)),await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let d=this.dispatchWithExtraGas(c);return this.wrapTx("RouterSell",d,le)}return this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:e,swaps:t}=this.trade,r=t[0],s=t[t.length-1],i=ie(e,this.slippagePct),a=r.assetIn,o=s.assetOut,n=e.minus(i),l=this.api.tx.router.sellAll(a,o,n.toFixed(),z.build(t));if(await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let m=this.dispatchWithExtraGas(l);return this.wrapTx("RouterSellAll",m,le)}return this.wrapTx("RouterSellAll",l)}};var Pt=class extends Be{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(e){return this._order=e,this}withBeneficiary(e){return this._beneficiary=e,this}withMaxRetries(e){return this._maxRetries=e,this}withSlippage(e){return this._slippagePct=e,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:e}=this.order;switch(e){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${e}`)}}buildDcaTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradePeriod:i,tradeRoute:a}=this.order,o=this.api.tx.dca.schedule({owner:this.beneficiary,period:i,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Sell:{assetIn:t,assetOut:r,amountIn:s.toFixed(),minAmountOut:"0",route:a}}},null);return this.wrapTx("DcaSchedule",o)}buildTwapSellTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:a,tradeRoute:o}=this.order,n=ie(i,this.slippagePct),l=i.minus(n),c=this.api.tx.dca.schedule({owner:this.beneficiary,period:a,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Sell:{assetIn:t,assetOut:r,amountIn:s.toFixed(),minAmountOut:l.toFixed(),route:o}}},null);return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:a,tradeRoute:o}=this.order,n=ie(s,this.slippagePct),l=s.plus(n),c=this.api.tx.dca.schedule({owner:this.beneficiary,period:a,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Buy:{assetIn:t,assetOut:r,amountOut:i.toFixed(),maxAmountIn:l.toFixed(),route:o}}},null);return this.wrapTx("DcaSchedule.twapBuy",c)}};var we=class{api;evm;constructor(e,t){this.api=e,this.evm=t}trade(e){return new bt(this.api,this.evm).setTrade(e)}order(e){return new Pt(this.api,this.evm).setOrder(e)}};var ss={router:{}};function is(u,e=ss){let t=new pe(u),r=new Ee(u),s=new fe(u,r),i=new ee(r),a=new oe(s,e.router),o=new oe(s,{exclude:["Hsm"]}),n=new xe(o,{blockTime:t.blockTime,minBudgetInNative:t.minOrderBudget});return{api:{aave:i,router:a,scheduler:n},client:{asset:new te(u),balance:new W(u),balanceV2:new me(u)},ctx:{pool:s},evm:r,tx:new we(u,r),destroy:()=>{s.destroy()}}}0&&(module.exports={AaveClient,AavePool,AavePoolClient,AaveUtils,AssetClient,AssetNotFound,BASILISK_PARACHAIN_ID,BalanceClient,BalanceClientV2,BigNumber,CachingPoolService,ChainParams,DECIMAL_PLACES,DEFAULT_BLOCK_TIME,DEFAULT_MIN_BUDGET,ERC20,EvmClient,EvmRpcAdapter,FarmClient,H160,HUB_ASSET_ID,HYDRADX_PARACHAIN_ID,HYDRADX_SS58_PREFIX,INFINITY,LbpMath,LbpPool,LbpPoolClient,MmOracleClient,ONE,ORDER_MIN_BLOCK_PERIOD,OmniMath,OmniPool,OmniPoolClient,PERBILL_DENOMINATOR,PERMILL_DENOMINATOR,PolkadotApiClient,PoolConfigNotFound,PoolError,PoolFactory,PoolNotFound,PoolService,PoolType,ProviderConfigNotFound,RUNTIME_DECIMALS,RouteNotFound,Router,SYSTEM_ASSET_DECIMALS,SYSTEM_ASSET_ID,StableMath,StableSwap,StableSwapClient,StorageConfigNotFound,SubscriptionNotSupported,TRADEABLE_DEFAULT,TWAP_BLOCK_PERIOD,TWAP_MAX_DURATION,TWAP_MAX_PRICE_IMPACT,TWAP_TX_MULTIPLIER,TradeOrderError,TradeOrderType,TradeRouteBuilder,TradeRouter,TradeScheduler,TradeType,TxBuilderFactory,XykMath,XykPool,XykPoolClient,ZERO,bnFormatter,bnum,calculateBuyFee,calculateDiffToAvg,calculateDiffToRef,calculateSellFee,createChain,createSdkContext,findNestedKey,findNestedObj,getFraction,hashPools,isEvmAccount,isEvmAddress,isSs58Address,scale,toBn,toDecimals});
package/build/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var we=[{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 ze=[{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 ct="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Je="0x112b087b60C1a166130d59266363C45F8aa99db0",Ze="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",J=1000000n;var Os=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var re=class{rpcAdapter;constructor(e){this.rpcAdapter=e.getRPCAdapter()}async getBlockTimestamp(){let e=await this.rpcAdapter.getBlock();return Number(e.timestamp)}async getReservesData(){return await this.rpcAdapter.readContract({abi:ze,address:Je,functionName:"getReservesData",args:[Ze]})}async getUserReservesData(e){return await this.rpcAdapter.readContract({abi:ze,address:Je,functionName:"getUserReservesData",args:[Ze,e]})}async getUserAccountData(e){return await this.rpcAdapter.readContract({abi:we,address:ct,functionName:"getUserAccountData",args:[e]})}};import{decodeAddress as Oe,encodeAddress as pt}from"@polkadot/util-crypto";import{hexToU8a as Ut,isHex as qt,u8aToHex as Wt}from"@polkadot/util";import{Buffer as V}from"buffer";var Ns=2090,K=1e6,ut=1e9,Te="1",Es=2034,L=63,se=18,N="0",mt=12,ie=15;var et="ETH\0";function Xt(d){if(!d)return!1;try{let e=Oe(d,!0),t=V.from(et);return V.from(e.subarray(0,t.length)).equals(t)}catch{return!1}}function Vt(d){return!!/^0x[a-fA-F0-9]{40}$/.test(d)}function Yt(d){try{let e=qt(d)?Ut(d):Oe(d);return pt(e),!0}catch{return!1}}var X=class d{static toAccount=e=>{let t=V.from(e.slice(2),"hex"),r=V.from(et);return pt(new Uint8Array(V.concat([r,t,V.alloc(8)])),63)};static fromAccount=e=>{let t=Oe(e),r=V.from(et),s=t.slice(r.length,-8);return"0x"+V.from(s).toString("hex")};static fromSS58=e=>{let r=Oe(e).slice(0,20);return Wt(r)};static fromAny=e=>{if(Vt(e))return e;if(Xt(e))return d.fromAccount(e);if(Yt(e))return d.fromSS58(e);throw new Error("Unknown address type")}};import{Buffer as Ie}from"buffer";var H=class{static fromAssetId(e){let t=Number(e),r=Ie.alloc(20,0);return r[15]=1,r.writeUInt32BE(t,16),"0x"+r.toString("hex")}static toAssetId(e){let t=Ie.from(e.replace("0x",""),"hex");return t.length!==20||!this.isAssetAddress(e)?null:t.readUInt32BE(16)}static isAssetAddress(e){let t=Ie.from("0000000000000000000000000000000100000000","hex"),r=Ie.from(e.replace("0x",""),"hex");return r.length!==20?!1:r.subarray(0,16).equals(t.subarray(0,16))}};import{BigNumber as x}from"bignumber.js";var Kt=12;x.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:Kt});var v=m(0),R=m(1),qs=m("Infinity");function A(d,e){let t=new x(e.toString()),r=new x(10).pow(t);return d.times(r).decimalPlaces(4)}function m(d){return new x(d.toString())}function Ws(d,e){let t=m(d);return A(t,e)}function I(d,e){return d.shiftedBy(-1*e).toString()}var Ae=m("1e27"),$t=m("1.01"),Qt=m("31536000"),dt=4,Fe=-1,$=class{client;constructor(e){this.client=new re(e)}async getSummary(e){let t=X.fromAny(e),[r,s,i,o]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(t),this.client.getUserAccountData(t),this.client.getBlockTimestamp()]),[n]=r,[a,l]=s,[c,u,p,h,g,b]=i,y=m(b).dividedBy(1e18).decimalPlaces(6,x.ROUND_DOWN),S=m(c),f=m(u),B=[];for(let O of a){let T=O.underlyingAsset.toLowerCase(),w=n.find(({underlyingAsset:Gt})=>Gt.toLowerCase()===T);if(!w)throw new Error("Missing pool reserve for "+T);let C=m(O.scaledATokenBalance),M=m(w.liquidityIndex),Be=m(w.liquidityRate),xe=m(w.availableLiquidity),$e=m(w.priceInMarketReferenceCurrency),Qe=o+6,je=this.calculateLinearInterest(Be,w.lastUpdateTimestamp,Qe),ve=M.multipliedBy(je).dividedBy(Ae).decimalPlaces(0,x.ROUND_DOWN),Dt=C.multipliedBy(ve).dividedBy(Ae).decimalPlaces(0,x.ROUND_DOWN),Mt=m(l!==0&&l===w.eModeCategoryId?w.eModeLiquidationThreshold:w.reserveLiquidationThreshold).div(1e4),Lt=w.usageAsCollateralEnabled&&O.usageAsCollateralEnabledOnUser&&m(O.scaledATokenBalance).gt(0),Ht=H.toAssetId(T);B.push({aTokenBalance:Dt,availableLiquidity:xe,decimals:Number(w.decimals),isCollateral:Lt,priceInRef:$e,reserveId:Ht,reserveAsset:T,reserveLiquidationThreshold:Mt})}return{healthFactor:y.toNumber(),currentLiquidationThreshold:m(h).dividedBy(10**dt).toNumber(),totalCollateral:S,totalDebt:f,reserves:B}}async hasBorrowPositions(e){let t=X.fromAny(e),r=await this.client.getUserAccountData(t),[s,i]=r;return i>0n}async getHealthFactor(e){let t=X.fromAny(e),r=await this.client.getUserAccountData(t),[s,i,o,n,a,l]=r;return this.calculateHealthFactorFromBalances(m(i),m(s),m(n))}async getHealthFactorAfterWithdraw(e,t,r){let{totalCollateral:s,totalDebt:i,reserves:o,currentLiquidationThreshold:n}=await this.getSummary(e);if(i.lte(0))return Fe;let a=H.fromAssetId(t),l=o.find(B=>B.reserveAsset===a);if(!l)throw new Error("Missing reserve ctx for "+a);let{decimals:c,isCollateral:u,priceInRef:p,reserveLiquidationThreshold:h}=l,g=A(m(r),c).decimalPlaces(0,x.ROUND_DOWN),b=u?g.multipliedBy(p).dividedBy(m(10).pow(c)).decimalPlaces(0,x.ROUND_DOWN):v,y=s.minus(b);if(y.lte(0))return 0;let S=s.multipliedBy(m(n)).minus(b.multipliedBy(h)).dividedBy(y);return y.multipliedBy(S).dividedBy(i).decimalPlaces(6,x.ROUND_DOWN).toNumber()}async getHealthFactorAfterSupply(e,t,r){let{totalCollateral:s,totalDebt:i,reserves:o,currentLiquidationThreshold:n}=await this.getSummary(e);if(i.lte(0))return Fe;let a=H.fromAssetId(t),l=o.find(f=>f.reserveAsset===a);if(!l)throw new Error("Missing reserve ctx for "+a);let{decimals:c,priceInRef:u,reserveLiquidationThreshold:p}=l,g=A(m(r),c).decimalPlaces(0,x.ROUND_DOWN).multipliedBy(u).dividedBy(m(10).pow(c)).decimalPlaces(0,x.ROUND_DOWN),b=s.plus(g);if(b.lte(0))return 0;let y=s.multipliedBy(m(n)).plus(g.multipliedBy(p)).dividedBy(b);return b.multipliedBy(y).dividedBy(i).decimalPlaces(6,x.ROUND_DOWN).toNumber()}async getHealthFactorAfterSwap(e,t,r,s,i){let{totalDebt:o,reserves:n,healthFactor:a}=await this.getSummary(e);if(o.lte(0))return Fe;let l=H.fromAssetId(r),c=H.fromAssetId(i),u=n.find(w=>w.reserveAsset===l),p=n.find(w=>w.reserveAsset===c);if(!u)throw new Error(`Missing reserve ctx for ${l}`);if(!p)throw new Error(`Missing reserve ctx for ${c}`);let h=A(m(t),u.decimals).decimalPlaces(0,x.ROUND_DOWN),g=A(m(s),p.decimals).decimalPlaces(0,x.ROUND_DOWN),b=h.multipliedBy(u.priceInRef).dividedBy(m(10).pow(u.decimals)).decimalPlaces(0,x.ROUND_DOWN),y=g.multipliedBy(p.priceInRef).dividedBy(m(10).pow(p.decimals)).decimalPlaces(0,x.ROUND_DOWN),S=u.isCollateral?b.multipliedBy(u.reserveLiquidationThreshold):v,O=y.multipliedBy(p.reserveLiquidationThreshold).minus(S).dividedBy(o);return m(a).plus(O).decimalPlaces(6,x.ROUND_DOWN).toNumber()}async getMaxWithdraw(e,t){let{totalDebt:r,reserves:s,healthFactor:i}=await this.getSummary(e),o=H.fromAssetId(t),n=s.find(a=>a.reserveAsset===o);if(!n)throw new Error("Missing reserve data for "+o);return this.calculateWithdrawMax(n,r,i)}async getMaxWithdrawAll(e){let{totalDebt:t,reserves:r,healthFactor:s}=await this.getSummary(e),i={};for(let o of r){let n=this.calculateWithdrawMax(o,t,s);o.reserveId&&(i[o.reserveId]=n)}return i}calculateWithdrawMax(e,t,r){let{aTokenBalance:s,availableLiquidity:i,decimals:o,priceInRef:n,reserveLiquidationThreshold:a,isCollateral:l}=e,c=s;if(l&&t.gt(0)){let p=m(r).minus($t);if(p.gt(0)){let g=p.multipliedBy(t).dividedBy(a).decimalPlaces(0,x.ROUND_DOWN).dividedBy(n).multipliedBy(m(10).pow(o)).decimalPlaces(0,x.ROUND_DOWN);c=x.minimum(s,g)}else c=v}return{amount:x.minimum(c,i),decimals:o}}calculateLinearInterest(e,t,r){let s=r-t;return s<=0?Ae:e.multipliedBy(s).dividedBy(Qt).plus(Ae).decimalPlaces(0,x.ROUND_DOWN)}calculateHealthFactorFromBalances(e,t,r){return e.lte(0)?Fe:t.multipliedBy(r).dividedBy(e).dividedBy(m(10).pow(dt)).decimalPlaces(6,x.ROUND_DOWN).toNumber()}};function gt(d){switch(d){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}import"@galacticcouncil/api-augment/hydradx";import"@galacticcouncil/api-augment/basilisk";var _=class{api;constructor(e){this.api=e}get chainDecimals(){return this.api.registry.chainDecimals[0]}get chainToken(){return this.api.registry.chainTokens[0]}log(e,...t){let r=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");gt(r)&&console.log(e,...t)}};var Q=class extends _{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(e){super(e)}async safeSharesQuery(){try{let e=await this.api.query.stableswap.pools.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}async safeBondsQuery(){try{let e=await this.api.query.bonds.bonds.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}async metadataQuery(){try{let e=await this.api.query.assetRegistry.assetMetadataMap.entries();return new Map(e.map(([{args:[t]},r])=>{let{decimals:s,symbol:i}=r.unwrap();return[t.toString(),{decimals:s.toNumber(),symbol:i.toHuman()}]}))}catch{return new Map([])}}async locationsQuery(){try{let e=await this.api.query.assetRegistry.assetLocations.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}getSystemTokenName(e){switch(e){case"HDX":return"Hydration";case"BSX":return"Basilisk";default:return e}}getToken(e,t,r,s){if(e=="0"){let u=this.api.consts.balances.existentialDeposit;return{id:"0",name:this.getSystemTokenName(this.chainToken),symbol:this.chainToken,decimals:this.chainDecimals,icon:this.chainToken,type:"Token",isSufficient:!0,existentialDeposit:u.toString()}}let{name:i,assetType:o,isSufficient:n,existentialDeposit:a}=t,{symbol:l,decimals:c}=r.get(e)??{};return{id:e,name:i.toHuman(),symbol:l,decimals:c,icon:l,type:o.toHuman(),isSufficient:n?n.toHuman():!0,location:s?.toJSON(),existentialDeposit:a.toString()}}getBond(e,t,r,s){let[i,o]=s,{assetType:n,isSufficient:a,existentialDeposit:l}=t,{symbol:c,decimals:u}=this.getToken(i.toString(),t,r),p=o.toNumber(),h=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",h.format(p)].join(" ");return{id:e,name:g,symbol:c+"b",decimals:u,icon:c,type:n.toString(),isSufficient:a.toHuman(),existentialDeposit:l.toString(),underlyingAssetId:i.toString(),maturity:p}}getShares(e,t,r,s){let{assets:i}=s,{name:o,symbol:n,assetType:a,isSufficient:l,existentialDeposit:c}=t,p=i.map(b=>b.toString()).map(b=>{let{symbol:y}=this.getToken(b,t,r);return[b,y]}),h=Object.fromEntries(p),g=Object.values(h);return{id:e,name:g.join(", "),symbol:n?.isSome?n.toHuman():o.toHuman(),decimals:18,icon:g.join("/"),type:a.toString(),isSufficient:l.toHuman(),existentialDeposit:c.toString(),meta:h}}getExternal(e,t,r,s){let i=this.getToken(e,t,new Map,s),o=r?.find(n=>n.internalId===i.id);return o?{...i,decimals:o.decimals,name:o.name,symbol:o.symbol,icon:o.symbol,isWhiteListed:o.isWhiteListed}:i}normalizeMetadata(e,t){return t.size?t:new Map(e.map(([{args:[r]},s])=>{let{decimals:i,symbol:o}=s.unwrap();return[r.toString(),{decimals:Number(i.toString()),symbol:o.toHuman()}]}))}getSupportedAssets(e){return e.filter(([t,r])=>{if(r.isNone)return!1;let s=r.unwrap();return this.isSupportedAsset(s)})}async getOnChainAssets(e,t){let[r,s,i,o,n]=await Promise.all([this.api.query.assetRegistry.assets.entries(),this.locationsQuery(),this.safeSharesQuery(),this.safeBondsQuery(),this.metadataQuery()]),a=this.getSupportedAssets(r),l=this.normalizeMetadata(a,n),c=a.map(([{args:[u]},p])=>{let h=p.unwrap(),g=s.get(u.toString()),{assetType:b}=h;switch(b.toString()){case"Bond":let y=o.get(u.toString());return this.getBond(u.toString(),h,l,y);case"StableSwap":let S=i.get(u.toString());return this.getShares(u.toString(),h,l,S);case"External":return this.getExternal(u.toString(),h,t,g);default:return this.getToken(u.toString(),h,l,g)}});return e?c:c.filter(u=>this.isValidAsset(u))}isValidAsset(e){let t=Math.sign(e.decimals);return!!e.symbol&&(t===0||t===1)}isSupportedAsset(e){let t=e.assetType.toString();return this.SUPPORTED_TYPES.includes(t)}};var G=class extends _{constructor(e){super(e)}async getBalance(e,t){let r=await this.api.query.assetRegistry.assets(t),{assetType:s}=r.unwrap();return s.toString()==="Erc20"?this.getErc20Balance(e,t):t==="0"?this.getSystemBalance(e):this.getTokenBalance(e,t)}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateFreeBalance(t)}async getTokenBalance(e,t){let r=await this.api.query.tokens.accounts(e,t);return this.calculateFreeBalance(r)}async getErc20Balance(e,t){let r=await this.getTokenBalanceData(e,t);return this.calculateFreeBalance(r)}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t("0",this.calculateFreeBalance(r)))}async subscribeSystemBalances(e,t){return this.api.query.system.account.multi(e,r=>{let s=[];r.forEach((i,o)=>{let n=this.calculateFreeBalance(i.data),a=e[o];s.push([a,n])}),t(s)})}async subscribeTokenBalance(e,t,r){let s=await this.api.query.tokens.accounts.keys(e),i=r?r.map(o=>[e,o]):s.map(({args:[o,n]})=>[o.toString(),n.toString()]);return this.api.query.tokens.accounts.multi(i,o=>{let n=[];o.forEach((a,l)=>{let c=this.calculateFreeBalance(a),u=i[l][1];n.push([u,c])}),t(n)})}async subscribeTokenBalances(e,t){return this.api.query.tokens.accounts.multi(e,r=>{let s=[];r.forEach((i,o)=>{let n=this.calculateFreeBalance(i),a=e[o];s.push([a,n])}),t(s)})}async subscribeErc20Balance(e,t,r){let i=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([a,l])=>{let{assetType:c}=l.unwrap();return c.toString()==="Erc20"}).map(([{args:[a]}])=>a.toString()))(),o=async()=>{let n=await Promise.all(i.map(async a=>[a,await this.getErc20Balance(e,a)]));t(n)};return this.api.rpc.chain.subscribeNewHeads(async()=>{o()})}async subscribeErc20Balances(e,t){let r=async()=>{let s=await Promise.all(e.map(async i=>{let[o,n]=i;return[i,await this.getErc20Balance(o,n)]}));t(s)};return this.api.rpc.chain.subscribeNewHeads(async()=>{r()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateFreeBalance(e){let t=e.free.toString(),r=e.frozen.toString();return x(t).lt(r)?x(0):x(t).minus(r)}};var ae=class extends _{constructor(e){super(e)}async getBalance(e,t){let r=await this.api.query.assetRegistry.assets(t),{assetType:s}=r.unwrap();return s.toString()==="Erc20"?this.getErc20Balance(e,t):t==="0"?this.getSystemBalance(e):this.getTokenBalance(e,t)}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateBalance(t)}async getTokenBalance(e,t){let r=await this.api.query.tokens.accounts(e,t);return this.calculateBalance(r)}async getErc20Balance(e,t){let r=await this.getTokenBalanceData(e,t);return this.calculateBalance(r)}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t("0",this.calculateBalance(r)))}async subscribeTokenBalance(e,t,r){let s=await this.api.query.tokens.accounts.keys(e),i=r?r.map(o=>[e,o]):s.map(({args:[o,n]})=>[o.toString(),n.toString()]);return this.api.query.tokens.accounts.multi(i,o=>{let n=[];o.forEach((a,l)=>{let c=i[l][1],u=this.calculateBalance(a);n.push([c,u])}),t(n)})}async subscribeErc20Balance(e,t,r){let i=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([a,l])=>{let{assetType:c}=l.unwrap();return c.toString()==="Erc20"}).map(([{args:[a]}])=>a.toString()))(),o=async()=>{let n=await Promise.all(i.map(async a=>[a,await this.getErc20Balance(e,a)]));t(n)};return this.api.rpc.chain.subscribeNewHeads(async()=>{o()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateBalance(e){let t=x(e.free.toString()),r=e.frozen.toString(),s=e.reserved.toString(),i=t.gte(r)?t.minus(r).toString():"0",o=t.plus(s).toString();return{free:t.toString(),total:o,transferable:i,reserved:s,frozen:r}}};var ne=class{api;_minOrderBudget;_blockTime;constructor(e){this.api=e}get blockTime(){return this._blockTime===void 0&&(this._blockTime=this.api.consts.aura.slotDuration.toNumber()),this._blockTime}get minOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=this.api.consts.dca.minBudgetInNativeCurrency.toString()),m(this._minOrderBudget)}};import{fixed_from_rational as ht}from"@galacticcouncil/math-liquidity-mining";import{GenericAccountId32 as jt}from"@polkadot/types";import{u8aConcat as yt}from"@polkadot/util";import{isAddress as bt}from"@polkadot/util-crypto";var tt=class extends _{balanceClient;constructor(e){super(e),this.balanceClient=new G(e)}secondsInYear=new x(365.2425).times(24).times(60).times(60);async getOmnipoolFarms(e){let t=await this.api.query.omnipoolWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,i])=>{let[,o]=s.args,n=i.unwrap().toString(),a=o.toString(),l=(await this.api.query.omnipoolWarehouseLM.globalFarm(a)).unwrap(),c=(await this.api.query.omnipoolWarehouseLM.yieldFarm(e,a,n)).unwrap(),u=await this.getOraclePrice(l)??l.priceAdjustment.toString(),h=this.getAccountResolver(this.api.registry)(Number(a),!1).toString(),g=l.rewardCurrency.toString(),b=await this.balanceClient.getTokenBalanceData(h,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:u,potBalance:b.free.toString()}}))}async getIsolatedPoolFarms(e){let t=await this.api.query.xykWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,i])=>{let[,o]=s.args,n=i.unwrap().toString(),a=o.toString(),l=(await this.api.query.xykWarehouseLM.globalFarm(a)).unwrap(),c=(await this.api.query.xykWarehouseLM.yieldFarm(e,a,n)).unwrap(),u=await this.getOraclePrice(l)??l.priceAdjustment.toString(),h=this.getAccountResolver(this.api.registry)(Number(a),!0).toString(),g=l.rewardCurrency.toString(),b=await this.balanceClient.getTokenBalanceData(h,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:u,potBalance:b.free.toString()}}))}async getOraclePrice(e){let t=e.rewardCurrency.toString(),r=e.incentivizedAsset.toString(),s=[t,r].sort();if(t===r)return new x(1).shiftedBy(18).toString();let i=await this.api.query.emaOracle.oracles("omnipool",s,"TenMinutes");if(i.isNone)return;let[o]=i.unwrap(),n=o.price.n.toString(),a=o.price.d.toString(),l;return Number(t)<Number(r)?l=ht(n,a):l=ht(a,n),l}getGlobalRewardPerPeriod(e,t,r,s){let o=e.times(t).shiftedBy(-18).times(s).shiftedBy(-18);return o.gte(r)?r:o}getPoolYieldPerPeriod(e,t,r,s){return e.times(t).div(r.times(s).shiftedBy(-18))}padEndU8a(e,t){return yt(e,Array(Math.max(0,t-e.length)).fill(0))}getAccountResolver=e=>(t,r)=>{let s="modl",i=r?"0x78796b4c4d704944":"0x4f6d6e6957684c4d";return new jt(e,this.padEndU8a(yt(s,i,typeof t!="number"?t.toU8a():[t]),32))};async getFarmApr(e,t){if(t==="isolatedpool"&&!bt(e))throw new Error("You must pass an address of isolated pool as id");if(t==="omnipool"&&bt(e))throw new Error("You must pass an asset id of omnipool");let r=6,s=t==="omnipool"?await this.getOmnipoolFarms(e):await this.getIsolatedPoolFarms(e);return s.length?s.map(({yieldFarm:n,globalFarm:a,priceAdjustment:l,potBalance:c})=>{let u=new x(a.totalSharesZ.toString()),p=a.plannedYieldingPeriods.toString(),h=new x(a.yieldPerPeriod.toString()),g=new x(a.maxRewardPerPeriod.toString()),b=a.blocksPerPeriod.toString(),y=new x(n.multiplier.toString()).shiftedBy(-18),S=this.secondsInYear.div(new x(r).times(b)),f;if(u.isZero())f=h.times(y).times(S);else{let C=this.getGlobalRewardPerPeriod(u,h,g,l);f=this.getPoolYieldPerPeriod(C,y,u,l).times(S)}let B=new x(a.pendingRewards.toString()).plus(a.accumulatedPaidRewards.toString()),O=g.times(p),T=c?B.plus(c):O;return B.div(T).gte(.999)?v:f.div(t==="isolatedpool"?2:1).times(100)}).reduce((n,a)=>n.plus(a),v).toString():void 0}};var Re=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},Pt=class extends Error{constructor(e,t){super(),this.message=`${e} pool missing ${t}`,this.name="PoolConfigNotFound"}},Ne=class extends Error{constructor(e,t){super(),this.message=`Route from ${e} to ${t} not found in pool configuration`,this.name="RouteNotFound"}},ft=class extends Error{constructor(e){super(),this.message=`Asset ${e} not available in current network`,this.name="AssetNotFound"}},St=class extends Error{constructor(e){super(),this.message=`Storage missing ${e}`,this.name="StorageConfigNotFound"}},Bt=class extends Error{constructor(e){super(),this.message=`Subscription type "${e}" not supported`,this.name="SubscriptionNotSupported"}},xt=class extends Error{constructor(e){super(),this.message=`${e}`,this.name="ProviderConfigNotFound"}};import{encodeFunctionData as zt,decodeFunctionResult as Jt}from"viem";var Zt=1e7,Ee=class{api;constructor(e){this.api=e}async getBlock(){let e=await this.api.query.ethereum.currentBlock(),{header:t}=e.unwrap(),r=t.timestamp.toBigInt()/1000n,s=t.number.toBigInt();return{timestamp:r,number:s}}readContract=(async e=>{let{abi:t,address:r,functionName:s,args:i}=e,o=zt({abi:t,functionName:s,args:i}),n=await this.api.call.ethereumRuntimeRPCApi.call("",r,o,0,Zt,null,null,null,!1,[]);if(n.isErr)throw console.error(s,n.asErr.toHuman()),new Error("Contract read failure");let{value:a,exitReason:l,usedGas:c}=n.asOk;if(l.isSucceed)return Jt({abi:t,functionName:s,data:a.toHex()});throw console.log(s,l.toString(),c.toHuman()),new Error("Contract read error")})};import{defineChain as er}from"viem";var tr=["wss://hydration-rpc.n.dwellir.com","wss://hydration.dotters.network","wss://rpc.helikon.io/hydradx","wss://hydration.ibp.network","wss://rpc.cay.hydration.cloud","wss://rpc.parm.hydration.cloud","wss://rpc.roach.hydration.cloud","wss://rpc.zipp.hydration.cloud","wss://rpc.sin.hydration.cloud","wss://rpc.coke.hydration.cloud"],vt=d=>{let t=[d.endpoint,...tr],r=Array.from(new Set(t.map(s=>s.replace("wss://","https://").replace("ws://","http://"))));return er({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:r}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1})};import{createPublicClient as Tt,createWalletClient as rr,custom as sr,http as ir}from"viem";function wt(d){let e=async({method:t,params:r})=>{let s=Array.isArray(r)?r:[];return d.send(t,s)};return()=>({request:e,config:{name:"PolkadotWsTransport",type:"webSocket",key:"polkadotWs",request:e}})}var Ce=class{api;chain;constructor(e){this.api=e,this.chain=vt(this.provider)}get provider(){let{provider:e}=this.api._options;return e}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return Tt({chain:this.chain,transport:ir()})}getWsProvider(){return Tt({chain:this.chain,transport:wt(this.provider)})}getSigner(e){return rr({account:e,chain:this.chain,transport:sr(window.ethereum)})}getRPCAdapter(){return new Ee(this.api)}};var rt=[{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"description",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"version",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint80",name:"_roundId",type:"uint80"}],name:"getRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"},{inputs:[],name:"latestRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"}];var oe=class{rpcAdapter;constructor(e){this.rpcAdapter=e.getRPCAdapter()}async getData(e,t=6){let[r,s,i]=await Promise.all([this.rpcAdapter.readContract({abi:rt,address:e,functionName:"latestRoundData"}),this.rpcAdapter.readContract({abi:rt,address:e,functionName:"decimals"}),this.rpcAdapter.getBlock()]),[o,n,a,l]=r,c=i.number-(i.timestamp-l)/BigInt(t),u=Number(c);return{price:n,decimals:s,updatedAt:u<0?0:u}}};import{memoize1 as gs}from"@thi.ng/memoize";var E=(o=>(o.Aave="Aave",o.LBP="Lbp",o.Omni="Omnipool",o.Stable="Stableswap",o.XYK="Xyk",o.HSM="Hsm",o))(E||{}),j=(c=>(c.UnknownError="UnknownError",c.FacilitatorCapacityExceeded="FacilitatorCapacityExceeded",c.InsufficientTradingAmount="InsufficientTradingAmount",c.InsufficientCollateral="InsufficientCollateral",c.MaxHoldingExceeded="MaxHoldingExceeded",c.MaxInRatioExceeded="MaxInRatioExceeded",c.MaxOutRatioExceeded="MaxOutRatioExceeded",c.TradeNotAllowed="TradeNotAllowed",c.MaxBuyBackExceeded="MaxBuyBackExceeded",c.MaxBuyPriceExceeded="MaxBuyPriceExceeded",c))(j||{});var ke=class d{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new d(e)}constructor(e){this.type="Aave",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(a=>[a.id,a])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let o=m(s.balance),n=m(i.balance);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:o,balanceOut:n,assetInED:v,assetOutED:v}}validateAndBuy(e,t){let r=this.calculateInGivenOut(e,t),s=[];return t.isGreaterThan(e.balanceOut)&&s.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:t,feePct:0,errors:s}}validateAndSell(e,t){let r=this.calculateOutGivenIn(e,t),s=[];return r.isGreaterThan(e.balanceOut)&&s.push("TradeNotAllowed"),{amountIn:t,calculatedOut:r,amountOut:r,feePct:0,errors:s}}calculateInGivenOut(e,t){return t}calculateOutGivenIn(e,t){return t}spotPriceInGivenOut(e){return A(R,e.decimalsOut)}spotPriceOutGivenIn(e){return A(R,e.decimalsIn)}calculateTradeFee(e,t){return v}};import{encodeAddress as or}from"@polkadot/util-crypto";import{stringToU8a as lr}from"@polkadot/util";import{decodeEventLog as cr}from"viem";import{memoize1 as ar}from"@thi.ng/memoize";import{TLRUCache as nr}from"@thi.ng/cache";var D=class extends G{evm;mmOracle;pools=[];subs=[];assets=new Map([]);mem=0;onNewBlockHandler;onEventsHandler;memPoolsCache=new nr(null,{maxlen:1,ttl:3600*1e3,release:e=>{this.mem>e&&this.log(this.getPoolType(),`mem ${e} released at`,new Date)}});memPools=ar(e=>(this.log(this.getPoolType(),`mem ${e} sync`),this.getPools()),this.memPoolsCache);constructor(e,t){super(e),this.evm=t,this.mmOracle=new oe(t),this.onNewBlockHandler=this.onNewBlock.bind(this),this.onEventsHandler=this.onEvents.bind(this)}onNewBlock(e){}onEvents(e){}get augmentedPools(){return this.pools.filter(e=>this.isValidPool(e)).map(e=>this.withMetadata(e))}async withAssets(e){this.assets=new Map(e.map(t=>[t.id,t])),this.mem=this.mem+1}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){this.unsubscribe(),this.pools=await this.loadPools();let e=this.subscribeBalances(),t=this.subscribeUpdates();this.subs.push(e),this.subs.push(t);let r=this.getPoolType();return this.log(r,`mem ${this.mem} pools(${this.augmentedPools.length})`),this.log(r,`mem ${this.mem} subs(${this.subs.length})`),this.augmentedPools}async subscribeBalances(){let e=[],t=[],r=[],s=[];for(let n of this.augmentedPools){let{address:a,tokens:l}=n;l.filter(c=>c.id==="0").forEach(()=>{e.push(a)}),l.filter(c=>["Token","StableSwap"].includes(c.type)&&c.id!=="0"&&c.id!==n.id).forEach(c=>{t.push([a,c.id])}),l.filter(c=>c.type==="Erc20").forEach(c=>{r.push([a,c.id])})}let i=n=>{n.forEach(([a,l])=>{let c=this.pools.find(u=>u.address===a);if(c){let u=c.tokens.findIndex(p=>p.id==="0");c.tokens[u].balance=l.toString()}})},o=n=>{n.forEach(([a,l])=>{let[c,u]=a,p=this.pools.find(h=>h.address===c);if(p){let h=p.tokens.findIndex(g=>g.id===u);p.tokens[h].balance=l.toString()}})};if(e.length>0){let n=await this.subscribeSystemBalances(e,i);s.push(n)}if(t.length>0){let n=await this.subscribeTokenBalances(t,o);s.push(n)}if(r.length>0){let n=await this.subscribeErc20Balances(r,o);s.push(n)}return()=>{for(let n of s)try{n()}catch(a){console.warn("Balance unsub failed",a)}}}unsubscribe(){this.subs.forEach(e=>{e.then(t=>t()).catch(t=>console.warn("Unsub failed",t))})}isValidPool(e){return e.type==="Xyk"?e.tokens.every(t=>this.assets.get(t.id)):!0}withMetadata(e){return e.tokens=e.tokens.map(t=>{let r=this.assets.get(t.id);return{...t,...r}}),e}};function _e(d,e){let t=[];return JSON.stringify(d,(r,s)=>(s&&s[e]&&t.push(s),s)),t[0]}function Ra(d,e,t){let r;return JSON.stringify(d,(s,i)=>(i&&i[e]===t&&(r=i),i)),r}var Na=(d,e)=>typeof e=="bigint"?e.toString():e;var ur=["Supply","Withdraw","Repay","Borrow"],De=class extends D{getPoolType(){return"Aave"}getPoolId(e,t){let r="aave:"+e+"/"+t;return or(lr(r.padEnd(32,"\0")),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:0}}getReserveH160Id(e){return e.type==="Erc20"?_e(e.location,"accountKey20").accountKey20.key:H.fromAssetId(e.id)}isSupported(){return this.api.call.aaveTradeExecutor.pools!==void 0}async loadPools(){return(await this.api.call.aaveTradeExecutor.pools()).map(({reserve:t,atoken:r,liqudityIn:s,liqudityOut:i})=>({address:this.getPoolId(t.toString(),r.toString()),type:"Aave",tokens:[{id:t.toString(),balance:s.toString()},{id:r.toString(),balance:i.toString()}],...this.getPoolLimits()}))}async getPoolFees(e,t,r){return{}}onEvents(e){e.forEach(t=>{let{event:r}=t,s=`${r.section}:${r.method}`;if(s==="router:Executed"){let[i,o]=r.data.toJSON();this.pools.filter(n=>n.tokens.some(a=>a.id===i.toString()||a.id===o.toString())).forEach(n=>{this.log(`Sync AAVE via [router:Executed] :: ${i}:${o}`),this.updatePoolState(n)})}if(s==="evm:Log"){let[i]=r.data.toJSON();try{let{eventName:o,args:n}=cr({abi:we,topics:i.topics,data:i.data});if(ur.includes(o)){let a=n.reserve.toLowerCase();this.pools.filter(l=>{let[c]=l.tokens;return this.getReserveH160Id(c).toLowerCase()===a}).forEach(l=>{this.log(`Sync AAVE via [evm:Log] :: ${o} ${a}`),this.updatePoolState(l)})}}catch{}}})}async subscribeBalances(){return()=>{}}async subscribeUpdates(){return()=>{}}async updatePoolState(e){let[t,r]=e.tokens,{liqudityIn:s,liqudityOut:i}=await this.api.call.aaveTradeExecutor.pool(t.id,r.id);e.tokens=e.tokens.map(o=>{let n=o.id===t.id?s.toString():i.toString();return{...o,balance:n}})}};import{calculate_in_given_out as mr,calculate_out_given_in as pr,calculate_linear_weights as dr,calculate_pool_trade_fee as gr,get_spot_price as hr}from"@galacticcouncil/math-lbp";var q=class{static getSpotPrice(e,t,r,s,i){return hr(e,t,r,s,i)}static calculateInGivenOut(e,t,r,s,i){return mr(e,t,r,s,i)}static calculateOutGivenIn(e,t,r,s,i){return pr(e,t,r,s,i)}static calculateLinearWeights(e,t,r,s,i){return dr(e,t,r,s,i)}static calculatePoolTradeFee(e,t,r){return gr(e,t,r)}};var P=class d{static toPct(e){let[t,r]=e;return d.safeDivide(t*100,r)}static toRaw(e){let[t,r]=e;return d.safeDivide(t,r)}static fromPermill(e){return[e,1e6]}static fromPerbill(e){return[e,1e9]}static fromRate(e,t){return[e,t]}static safeDivide(e,t,r=12){let s=10**r;return Math.round(e*s/t)/s}static safeRound(e){return parseFloat(e.toPrecision(15))}};var Me=class d{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(e){return new d(e)}constructor(e){this.type="Lbp",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.fee=e.fee,this.repayFeeApply=e.repayFeeApply}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(a=>[a.id,a])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let o=m(s.balance),n=m(i.balance);return{assetIn:e,assetOut:t,balanceIn:o,balanceOut:n,decimalsIn:s.decimals,decimalsOut:i.decimals,weightIn:s.weight,weightOut:i.weight}}validateAndBuy(e,t,r){let s=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let o=e.balanceOut.div(this.maxOutRatio);if(t.isGreaterThan(o)&&i.push("MaxOutRatioExceeded"),s===e.assetOut){let n=this.calculateTradeFee(t,r),a=P.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),l=t.plus(n),c=this.calculateInGivenOut(e,l),u=e.balanceIn.div(this.maxInRatio);return c.isGreaterThan(u)&&i.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:t,feePct:a,errors:i}}else{let n=this.calculateInGivenOut(e,t),a=e.balanceIn.div(this.maxInRatio);return n.isGreaterThan(a)&&i.push("MaxInRatioExceeded"),{amountIn:n,calculatedIn:n,amountOut:t,feePct:0,errors:i}}}validateAndSell(e,t,r){let s=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let o=e.balanceIn.div(this.maxInRatio);if(t.isGreaterThan(o)&&i.push("MaxInRatioExceeded"),s===e.assetIn){let n=this.calculateOutGivenIn(e,t),a=e.balanceOut.div(this.maxOutRatio);return n.isGreaterThan(a)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:n,amountOut:n,feePct:0,errors:i}}else{let n=this.calculateOutGivenIn(e,t),a=this.calculateTradeFee(n,r),l=P.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),c=n.minus(a),u=e.balanceOut.div(this.maxOutRatio);return c.isGreaterThan(u)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:n,amountOut:c,feePct:l,errors:i}}}calculateInGivenOut(e,t){let r=q.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=m(r);return s.isNegative()?v:s}calculateOutGivenIn(e,t){let r=q.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=m(r);return s.isNegative()?v:s}spotPriceInGivenOut(e){let t=q.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),A(R,e.decimalsOut).toString());return m(t)}spotPriceOutGivenIn(e){let t=q.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),A(R,e.decimalsIn).toString());return m(t)}calculateTradeFee(e,t){let r=q.calculatePoolTradeFee(e.toString(),this.repayFeeApply?t.repayFee[0]:t.exchangeFee[0],this.repayFeeApply?t.repayFee[1]:t.exchangeFee[1]);return m(r)}};var Le=class extends D{MAX_FINAL_WEIGHT=A(m(100),6);poolsData=new Map([]);getPoolType(){return"Lbp"}getPoolLimits(){let e=this.api.consts.lbp.maxInRatio.toNumber(),t=this.api.consts.lbp.maxOutRatio.toNumber(),r=this.api.consts.lbp.minTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}async getPoolDelta(e,t,r){let{start:s,end:i,assets:o,initialWeight:n,finalWeight:a,repayTarget:l,feeCollector:c}=t,u=q.calculateLinearWeights(s.toString(),i.toString(),n.toString(),a.toString(),r),[p,h]=o,g=p.toString(),b=m(u),y=h.toString(),S=this.MAX_FINAL_WEIGHT.minus(m(b)),[f,B,O]=await Promise.all([this.isRepayFeeApplied(g,l.toString(),c.toString()),this.getBalance(e,g),this.getBalance(e,y)]);return{repayFeeApply:f,tokens:[{id:g,weight:b,balance:B.toString()},{id:y,weight:S,balance:O.toString()}]}}isActivePool(e,t){if(e.start.isEmpty||e.end.isEmpty)return!1;let r=e.start.unwrap().toNumber(),s=e.end.unwrap().toNumber();return t>=r&&t<s}async isRepayFeeApplied(e,t,r){let s=m(t);if(s.isZero())return!1;try{return(await this.getBalance(e,r)).isLessThan(s)}catch{return!0}}isSupported(){return this.api.query.lbp!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.lbp.poolData.entries(),this.api.query.parachainSystem.validationData()]),{relayParentNumber:r}=t.unwrap(),s=e.filter(([i,o])=>this.isActivePool(o.unwrap(),r.toNumber())).map(async([{args:[i]},o])=>{let n=o.unwrap(),a=i.toString(),l=await this.getPoolDelta(a,n,r.toString());this.poolsData.set(i.toString(),n);let[c,u]=n.fee;return{address:a,type:"Lbp",fee:P.fromRate(c.toNumber(),u.toNumber()),...l,...this.getPoolLimits()}});return Promise.all(s)}async getPoolFees(e,t,r){let s=this.pools.find(i=>i.address===r);return{repayFee:this.getRepayFee(),exchangeFee:s.fee}}getRepayFee(){let[e,t]=this.api.consts.lbp.repayFee;return P.fromRate(e.toNumber(),t.toNumber())}async subscribeUpdates(){return this.api.query.parachainSystem.validationData(async e=>{let{relayParentNumber:t}=e.unwrap();this.pools.forEach(async r=>{let s=this.poolsData.get(r.address);if(s)if(this.isActivePool(s,t.toNumber())){let o=await this.getPoolDelta(r.address,s,t.toString());Object.assign(r,o)}else{let o=this.pools.findIndex(n=>n.address==r.address);this.pools.splice(o,1)}})})}};import{calculate_in_given_out as yr,calculate_lrna_in_given_out as br,calculate_out_given_in as Pr,calculate_out_given_lrna_in as fr,calculate_spot_price as Sr,calculate_lrna_spot_price as Br,calculate_shares as xr,calculate_liquidity_out as vr,calculate_liquidity_lrna_out as wr,calculate_liquidity_hub_in as Tr,is_sell_allowed as Or,is_buy_allowed as Ir,is_add_liquidity_allowed as Ar,is_remove_liquidity_allowed as Fr,recalculate_asset_fee as Rr,recalculate_protocol_fee as Nr,verify_asset_cap as Er}from"@galacticcouncil/math-omnipool";var F=class{static calculateSpotPrice(e,t,r,s){return Sr(e,t,r,s)}static calculateLrnaSpotPrice(e,t){return Br(e,t)}static calculateInGivenOut(e,t,r,s,i,o,n,a,l){return yr(e,t,r,s,i,o,n,a,l)}static calculateLrnaInGivenOut(e,t,r,s,i){return br(e,t,r,s,i)}static calculateOutGivenIn(e,t,r,s,i,o,n,a,l){return Pr(e,t,r,s,i,o,n,a,l)}static calculateOutGivenLrnaIn(e,t,r,s,i){return fr(e,t,r,s,i)}static calculateShares(e,t,r,s){return xr(e,t,r,s)}static calculateLiquidityOut(e,t,r,s,i,o,n,a){return vr(e,t,r,s,i,o,n,a)}static calculateLiquidityLRNAOut(e,t,r,s,i,o,n,a){return wr(e,t,r,s,i,o,n,a)}static calculateCapDifference(e,t,r,s){let i=x(t),o=x(e),n=x(s),l=x(r).shiftedBy(-18);if(i.div(n).lt(l)){let u=l.times(n).minus(i).times(o),p=i.times(x(1).minus(l));return u.div(p).toFixed(0)}else return"0"}static calculateLimitHubIn(e,t,r,s){return Tr(e,t,r,s)}static isSellAllowed(e){return Or(e)}static isBuyAllowed(e){return Ir(e)}static isAddLiquidityAllowed(e){return Ar(e)}static isRemoveLiquidityAllowed(e){return Fr(e)}static recalculateAssetFee(e,t,r,s,i,o,n,a,l,c,u){return Rr(e,t,r,s,i,o,n,a,l,c,u)}static recalculateProtocolFee(e,t,r,s,i,o,n,a,l,c,u){return Nr(e,t,r,s,i,o,n,a,l,c,u)}static verifyAssetCap(e,t,r,s){return Er(e,t,r,s)}};var He=class d{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(e){return new d(e)}constructor(e){this.type="Omnipool",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.hubAssetId=e.hubAssetId}validatePair(e,t){return this.hubAssetId!=t}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let o=m(s.balance),n=m(i.balance),a=m(s.existentialDeposit),l=m(i.existentialDeposit);return{assetIn:e,assetOut:t,hubReservesIn:s.hubReserves,hubReservesOut:i.hubReserves,sharesIn:s.shares,sharesOut:i.shares,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:o,balanceOut:n,tradeableIn:s.tradeable,tradeableOut:i.tradeable,assetInED:a,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),o=i.minus(s),n=s===v?v:o.div(s).multipliedBy(100).decimalPlaces(4),a=[],l=F.isSellAllowed(e.tradeableIn),c=F.isBuyAllowed(e.tradeableOut);(!l||!c)&&a.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&a.push("InsufficientTradingAmount");let u=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(u)&&a.push("MaxOutRatioExceeded");let p=e.balanceIn.div(this.maxInRatio);return i.isGreaterThan(p)&&a.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:n.toNumber(),errors:a}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,r),n=s.minus(i).div(s).multipliedBy(100).decimalPlaces(4),a=[],l=F.isSellAllowed(e.tradeableIn),c=F.isBuyAllowed(e.tradeableOut);(!l||!c)&&a.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&a.push("InsufficientTradingAmount");let u=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(u)&&a.push("MaxInRatioExceeded");let p=e.balanceOut.div(this.maxOutRatio);return i.isGreaterThan(p)&&a.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:n.toNumber(),errors:a}}calculateInGivenOut(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(e,t,r);let s=F.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toRaw(r.assetFee).toString():v.toString(),r?P.toRaw(r.protocolFee).toString():v.toString()),i=m(s);return i.isNegative()?v:i}calculateLrnaInGivenOut(e,t,r){let s=F.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toRaw(r.assetFee).toString():v.toString()),i=m(s);return i.isNegative()?v:i}calculateOutGivenIn(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,r);let s=F.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toRaw(r.assetFee).toString():v.toString(),r?P.toRaw(r.protocolFee).toString():v.toString()),i=m(s);return i.isNegative()?v:i}calculateOutGivenLrnaIn(e,t,r){let s=F.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toRaw(r.assetFee).toString():v.toString()),i=m(s);return i.isNegative()?v:i}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=F.calculateSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString(),e.balanceIn.toString(),e.hubReservesIn.toString());return m(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceLrnaInGivenOut(e){let t=F.calculateLrnaSpotPrice(e.hubReservesOut.toString(),e.balanceOut.toString());return m(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceOutGivenIn(e){if(e.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(e);let t=F.calculateSpotPrice(e.balanceIn.toString(),e.hubReservesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString());return m(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}spotPriceOutGivenLrnaIn(e){let t=F.calculateLrnaSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString());return m(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}};import{encodeAddress as Cr}from"@polkadot/util-crypto";import{stringToU8a as kr}from"@polkadot/util";import{memoize1 as st}from"@thi.ng/memoize";import{TLRUCache as _r}from"@thi.ng/cache";var Ot="omnipool",It="Short",Ge=class extends D{dynamicFees=new Map;dynamicFeesConfiguration=new Map;oracles=new Map;memQueryCache=new _r(null,{ttl:6*1e3});memOracleQuery=st(e=>{let t=e.split(":");return this.api.query.emaOracle.oracles(Ot,t,It)},this.memQueryCache);memFeesQuery=st(e=>this.api.query.dynamicFees.assetFee(e),this.memQueryCache);memFeesConfigurationQuery=st(e=>this.api.query.dynamicFees.assetFeeConfiguration(e),this.memQueryCache);getPoolType(){return"Omnipool"}getPoolId(){return Cr(kr("modlomnipool".padEnd(32,"\0")),63)}getOracleKey(e){return e==="0"?["0","1"]:["1",e]}getPoolLimits(){let e=this.api.consts.omnipool.maxInRatio.toNumber(),t=this.api.consts.omnipool.maxOutRatio.toNumber(),r=this.api.consts.omnipool.minimumTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}async getDynamicFees(e){return this.dynamicFees.has(e)?this.dynamicFees.get(e):this.memFeesQuery(e)}async getDynamicFeesConfiguration(e){return this.dynamicFeesConfiguration.has(e)?this.dynamicFeesConfiguration.get(e):this.memFeesConfigurationQuery(e)}async getOraclePrice(e){let r=this.getOracleKey(e).join(":");return this.oracles.has(r)?this.oracles.get(r):this.memOracleQuery(r)}isSupported(){return this.api.query.omnipool!==void 0}isAssetConfigSupported(){return this.api.query.dynamicFees.assetFeeConfiguration!==void 0}async loadPools(){let e=this.api.consts.omnipool.hubAssetId.toString(),t=this.getPoolId(),[r,s,i]=await Promise.all([this.api.query.omnipool.assets.entries(),this.api.query.omnipool.hubAssetTradability(),this.getBalance(t,e)]),o=r.map(async([{args:[a]},l])=>{let{hubReserve:c,shares:u,tradable:p,cap:h,protocolShares:g}=l.unwrap(),b=await this.getBalance(t,a.toString());return{id:a.toString(),hubReserves:m(c.toString()),shares:m(u.toString()),tradeable:p.bits.toNumber(),balance:b.toString(),cap:m(h.toString()),protocolShares:m(g.toString())}}),n=await Promise.all(o);return n.push({id:e,tradeable:s.bits.toNumber(),balance:i.toString()}),[{address:t,type:"Omnipool",hubAssetId:e,tokens:n,...this.getPoolLimits()}]}async getPoolFees(e,t,r){let s=t.assetOut,i=t.assetIn,o;if(this.isAssetConfigSupported()&&(o=await this.getDynamicFeesConfiguration(s).then(f=>f.unwrapOr(null))),o?.isFixed){let f=o.asFixed.assetFee.toNumber(),B=o.asFixed.protocolFee.toNumber();return{assetFee:P.fromPermill(f),protocolFee:P.fromPermill(B)}}let[n,a,l]=await Promise.all([this.getDynamicFees(s),this.getOraclePrice(s),this.getOraclePrice(i)]),[c,u,p]=this.getAssetFee(t,e,n,a,o?.isDynamic?o.asDynamic.assetFeeParams:void 0),[h,g,b]=i==="1"?[0,0,0]:this.getProtocolFee(t,e,n,l,o?.isDynamic?o.asDynamic.protocolFeeParams:void 0),y=c+h,S=p+b;return{assetFee:P.fromPermill(u),protocolFee:P.fromPermill(g),min:P.fromPermill(y),max:P.fromPermill(S)}}getAssetFee(e,t,r,s,i){let{assetOut:o,balanceOut:n}=e,{minFee:a,maxFee:l,decay:c,amplification:u}=i||this.api.consts.dynamicFees.assetFeeParameters,p=P.fromPermill(a.toNumber()),h=P.fromPermill(l.toNumber());if(r.isNone||s.isNone)return[a.toNumber(),a.toNumber(),l.toNumber()];let[g]=s.unwrap(),{assetFee:b,timestamp:y}=r.unwrap(),S=Math.max(1,t-y.toNumber()),f=g.volume.bIn.toString(),B=g.volume.bOut.toString(),O=g.liquidity.b.toString();o==="0"&&(f=g.volume.aIn.toString(),B=g.volume.aOut.toString(),O=g.liquidity.a.toString());let T=P.fromPermill(b.toNumber()),w=F.recalculateAssetFee(f,B,O,"9",n.toString(),P.toRaw(T).toString(),S.toString(),P.toRaw(p).toString(),P.toRaw(h).toString(),c.toString(),u.toString());return[a.toNumber(),Number(w)*1e6,l.toNumber()]}getProtocolFee(e,t,r,s,i){let{assetIn:o,balanceIn:n}=e,{minFee:a,maxFee:l,decay:c,amplification:u}=i||this.api.consts.dynamicFees.protocolFeeParameters,p=P.fromPermill(a.toNumber()),h=P.fromPermill(l.toNumber());if(r.isNone||s.isNone)return[a.toNumber(),a.toNumber(),l.toNumber()];let[g]=s.unwrap(),{protocolFee:b,timestamp:y}=r.unwrap(),S=Math.max(1,t-y.toNumber()),f=g.volume.bIn.toString(),B=g.volume.bOut.toString(),O=g.liquidity.b.toString();o==="0"&&(f=g.volume.aIn.toString(),B=g.volume.aOut.toString(),O=g.liquidity.a.toString());let T=P.fromPermill(b.toNumber()),w=F.recalculateProtocolFee(f,B,O,"9",n.toString(),P.toRaw(T).toString(),S.toString(),P.toRaw(p).toString(),P.toRaw(h).toString(),c.toString(),u.toString());return[a.toNumber(),Number(w)*1e6,l.toNumber()]}async subscribeUpdates(){let[e]=this.pools,t=e.tokens.map(a=>a.id),r=[],s=await this.api.query.omnipool.assets.multi(t,a=>{e.tokens=a.map((l,c)=>{let u=e.tokens[c];if(l.isNone)return u;let p=l.unwrap();return this.updateTokenState(u,p)})});r.push(s);let i=await this.api.query.dynamicFees.assetFee.multi(t,a=>{a.forEach((l,c)=>{let u=t[c];this.dynamicFees.set(u,l)})});if(r.push(i),this.isAssetConfigSupported()){let a=await this.api.query.dynamicFees.assetFeeConfiguration.multi(t,l=>{l.forEach((c,u)=>{let p=t[u];this.dynamicFeesConfiguration.set(p,c)})});r.push(a)}let o=t.map(a=>{let l=this.getOracleKey(a);return[Ot,l,It]}),n=await this.api.query.emaOracle.oracles.multi(o,a=>{a.forEach(async(l,c)=>{let u=o[c],[p,h,g]=u;this.oracles.set(h.join(":"),l)})});return r.push(n),()=>{for(let a of r)try{a()}catch(l){console.warn("Omnipool unsubscribe failed",l)}}}updateTokenState(e,t){let{hubReserve:r,shares:s,tradable:i,cap:o,protocolShares:n}=t;return{...e,hubReserves:m(r.toString()),shares:m(s.toString()),cap:m(o.toString()),protocolShares:m(n.toString()),tradeable:i.bits.toNumber()}}};import{calculate_in_given_out as Dr,calculate_out_given_in as Mr,calculate_pool_trade_fee as Lr,get_spot_price as Hr,calculate_liquidity_in as Gr,calculate_shares as Ur,calculate_spot_price as qr,calculate_spot_price_with_fee as Wr,calculate_liquidity_out_asset_a as Xr,calculate_liquidity_out_asset_b as Vr}from"@galacticcouncil/math-xyk";var Y=class{static getSpotPrice(e,t,r){return Hr(e,t,r)}static calculateInGivenOut(e,t,r){return Dr(e,t,r)}static calculateOutGivenIn(e,t,r){return Mr(e,t,r)}static calculatePoolTradeFee(e,t,r){return Lr(e,t,r)}static calculateLiquidityIn(e,t,r){return Gr(e,t,r)}static calculateSpotPrice(e,t){return qr(e,t)}static calculateSpotPriceWithFee(e,t,r,s){return Wr(e,t,r,s)}static calculateShares(e,t,r){return Ur(e,t,r)}static calculateLiquidityOutAssetA(e,t,r,s){return Xr(e,t,r,s)}static calculateLiquidityOutAssetB(e,t,r,s){return Vr(e,t,r,s)}};var Ue=class d{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new d(e)}constructor(e){this.type="Xyk",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let o=m(s.balance),n=m(i.balance),a=m(s.existentialDeposit),l=m(i.existentialDeposit);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:o,balanceOut:n,assetInED:a,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateTradeFee(s,r),o=P.toPct(r.exchangeFee),n=s.plus(i),a=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&a.push("InsufficientTradingAmount");let l=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(l)&&a.push("MaxOutRatioExceeded");let c=e.balanceIn.div(this.maxInRatio);return n.isGreaterThan(c)&&a.push("MaxInRatioExceeded"),{amountIn:n,calculatedIn:s,amountOut:t,feePct:o,errors:a}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateTradeFee(s,r),o=P.toPct(r.exchangeFee),n=s.minus(i),a=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&a.push("InsufficientTradingAmount");let l=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(l)&&a.push("MaxInRatioExceeded");let c=e.balanceOut.div(this.maxOutRatio);return n.isGreaterThan(c)&&a.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:n,feePct:o,errors:a}}calculateInGivenOut(e,t){let r=Y.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=m(r);return s.isNegative()?v:s}calculateOutGivenIn(e,t){let r=Y.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=m(r);return s.isNegative()?v:s}spotPriceInGivenOut(e){let t=Y.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),r=A(R,18-e.decimalsOut);return m(t).div(r)}spotPriceOutGivenIn(e){let t=Y.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),r=A(R,18-e.decimalsIn);return m(t).div(r)}calculateTradeFee(e,t){let r=Y.calculatePoolTradeFee(e.toString(),t.exchangeFee[0],t.exchangeFee[1]);return m(r)}};var qe=class extends D{getPoolType(){return"Xyk"}getPoolLimits(){let e=this.api.consts.xyk.maxInRatio.toNumber(),t=this.api.consts.xyk.maxOutRatio.toNumber(),r=this.api.consts.xyk.minTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}isSupported(){return this.api.query.xyk!==void 0}async loadPools(){let t=(await this.api.query.xyk.poolAssets.entries()).map(async([{args:[r]},s])=>{let i=r.toString(),[o,n]=s.unwrap(),[a,l]=await Promise.all([this.getBalance(i,o.toString()),this.getBalance(i,n.toString())]);return{address:i,type:"Xyk",tokens:[{id:o.toString(),balance:a.toString()},{id:n.toString(),balance:l.toString()}],...this.getPoolLimits()}});return Promise.all(t)}async getPoolFees(e,t,r){return{exchangeFee:this.getExchangeFee()}}getExchangeFee(){let[e,t]=this.api.consts.xyk.getExchangeFee;return P.fromRate(e.toNumber(),t.toNumber())}async subscribeUpdates(){return()=>{}}};import{calculate_in_given_out as Yr,calculate_out_given_in as Kr,calculate_amplification as $r,calculate_add_one_asset as Qr,calculate_liquidity_out_one_asset as jr,calculate_shares as zr,calculate_shares_for_amount as Jr,calculate_spot_price_with_fee as Zr,pool_account_name as es,recalculate_peg as ts}from"@galacticcouncil/math-stableswap";var k=class{static getPoolAddress(e){return es(e)}static defaultPegs(e){let t=[];for(let r=0;r<e;r++)t.push(["1","1"]);return t}static calculateAmplification(e,t,r,s,i){return $r(e,t,r,s,i)}static calculateInGivenOut(e,t,r,s,i,o,n){return Yr(e,t,r,s,i,o,n)}static calculateAddOneAsset(e,t,r,s,i,o,n){return Qr(e,t,r,s,i,o,n)}static calculateSharesForAmount(e,t,r,s,i,o,n){return Jr(e,t,r,s,i,o,n)}static calculateOutGivenIn(e,t,r,s,i,o,n){return Kr(e,t,r,s,i,o,n)}static calculateLiquidityOutOneAsset(e,t,r,s,i,o,n){return jr(e,t,r,s,i,o,n)}static calculateShares(e,t,r,s,i,o){return zr(e,t,r,s,i,o)}static calculateSpotPriceWithFee(e,t,r,s,i,o,n,a){return Zr(e,t,r,s,i,o,n,a)}static recalculatePegs(e,t,r,s,i,o){let n=ts(e,t,r,s,i,o);return JSON.parse(n)}};var Z=class d{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;pegs;pegsFee;static fromPool(e){return new d(e)}constructor(e){this.type="Stableswap",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.amplification=e.amplification,this.id=e.id,this.fee=e.fee,this.totalIssuance=e.totalIssuance,this.pegs=e.pegs,this.pegsFee=e.pegsFee}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let o=m(s.balance),n=m(i.balance),a=m(s.existentialDeposit),l=m(i.existentialDeposit);return{assetIn:e,assetOut:t,balanceIn:o,balanceOut:n,decimalsIn:s.decimals,decimalsOut:i.decimals,tradeableIn:this.id===e?15:s.tradeable,tradeableOut:this.id===t?15:i.tradeable,assetInED:a,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),o=i.minus(s),n=s===v?v:o.div(s).multipliedBy(100).decimalPlaces(4),a=[],l=F.isSellAllowed(e.tradeableIn),c=F.isBuyAllowed(e.tradeableOut);return(!l||!c)&&a.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&a.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:n.toNumber(),errors:a}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,r),n=s.minus(i).div(s).multipliedBy(100).decimalPlaces(4),a=[],l=F.isSellAllowed(e.tradeableIn),c=F.isBuyAllowed(e.tradeableOut);return(!l||!c)&&a.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&a.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:n.toNumber(),errors:a}}calculateIn(e,t,r){let s=k.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?P.toRaw(r.fee).toString():v.toString(),this.getPegs()),i=m(s);return i.isNegative()?v:i}calculateAddOneAsset(e,t,r){let s=k.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,r?P.toRaw(r.fee).toString():v.toString(),this.getPegs()),i=m(s);return i.isNegative()?v:i}calculateSharesForAmount(e,t,r){let s=k.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,r?P.toRaw(r.fee).toString():v.toString(),this.getPegs()),i=m(s);return i.isNegative()?v:i}calculateInGivenOut(e,t,r){return e.assetOut==this.id?this.calculateAddOneAsset(e,t,r):e.assetIn==this.id?this.calculateSharesForAmount(e,t,r):this.calculateIn(e,t,r)}spotPriceInGivenOut(e){let t=k.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetOut,e.assetIn,this.totalIssuance,"0",this.getPegs());if(e.assetOut==this.id)return m(t);if(e.assetIn==this.id){let s=A(R,e.decimalsIn-e.decimalsOut);return m(t).div(s).decimalPlaces(0,1)}let r=A(R,18-e.decimalsIn);return m(t).div(r).decimalPlaces(0,1)}calculateOut(e,t,r){let s=k.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?P.toRaw(r.fee).toString():v.toString(),this.getPegs()),i=m(s);return i.isNegative()?v:i}calculateWithdrawOneAsset(e,t,r){let s=k.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,r?P.toRaw(r.fee).toString():v.toString(),this.getPegs()),i=m(s);return i.isNegative()?v:i}calculateShares(e,t,r){let s=k.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,r?P.toRaw(r.fee).toString():v.toString(),this.getPegs()),i=m(s);return i.isNegative()?v:i}calculateOutGivenIn(e,t,r){return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t,r):e.assetOut==this.id?this.calculateShares(e,t,r):this.calculateOut(e,t,r)}spotPriceOutGivenIn(e){let t=k.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetIn,e.assetOut,this.totalIssuance,"0",this.getPegs());if(e.assetIn==this.id)return m(t);if(e.assetOut==this.id){let s=A(R,e.decimalsOut-e.decimalsIn);return m(t).div(s).decimalPlaces(0,1)}let r=A(R,18-e.decimalsOut);return m(t).div(r).decimalPlaces(0,1)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let e=this.tokens.filter(t=>t.id!=this.id).map(({id:t,balance:r,decimals:s})=>({asset_id:Number(t),amount:r,decimals:s}));return JSON.stringify(e)}getAssets(e,t){let r={asset_id:Number(e),amount:t.toFixed(0)};return JSON.stringify([r])}};import{blake2AsHex as rs,encodeAddress as ss}from"@polkadot/util-crypto";var We=class extends D{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(e){let t=Number(e),r=k.getPoolAddress(t);return ss(rs(r),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:this.api.consts.stableswap.minTradingLimit.toNumber()}}async getPoolDelta(e,t,r){let{initialAmplification:s,finalAmplification:i,initialBlock:o,finalBlock:n}=t,a=k.calculateAmplification(s.toString(),i.toString(),o.toString(),n.toString(),r),l=await this.api.query.tokens.totalIssuance(e);return{amplification:a,totalIssuance:l.toString()}}async getPoolTokens(e,t,r){let{assets:s}=r,i=s.map(async o=>{let[n,a]=await Promise.all([this.api.query.stableswap.assetTradability(t,o.toString()),this.getBalance(e,o.toString())]);return{id:o.toString(),tradeable:n.bits.toNumber(),balance:a.toString()}});return Promise.all(i)}isSupported(){return this.api.query.stableswap!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.stableswap.pools.entries(),this.api.query.system.number()]),r=t.toNumber(),s=e.map(async([{args:[o]},n])=>{try{let a=n.unwrap(),l=o.toString(),c=this.getPoolAddress(l),[u,p,h]=await Promise.all([this.getPoolDelta(l,a,r.toString()),this.getPoolTokens(c,l,a),this.getPoolPegs(l,a,r.toString())]);return p.push({id:l,tradeable:15,balance:u.totalIssuance}),this.poolsData.set(c,a),{address:c,id:l,type:"Stableswap",fee:P.fromPermill(a.fee.toNumber()),tokens:p,...u,...h,...this.getPoolLimits()}}catch(a){return console.warn(`Skipping pool ${o.toString()}
1
+ var we=[{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 ze=[{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 ct="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Je="0x112b087b60C1a166130d59266363C45F8aa99db0",Ze="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",J=1000000n;var Os=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var re=class{rpcAdapter;constructor(e){this.rpcAdapter=e.getRPCAdapter()}async getBlockTimestamp(){let e=await this.rpcAdapter.getBlock();return Number(e.timestamp)}async getReservesData(){return await this.rpcAdapter.readContract({abi:ze,address:Je,functionName:"getReservesData",args:[Ze]})}async getUserReservesData(e){return await this.rpcAdapter.readContract({abi:ze,address:Je,functionName:"getUserReservesData",args:[Ze,e]})}async getUserAccountData(e){return await this.rpcAdapter.readContract({abi:we,address:ct,functionName:"getUserAccountData",args:[e]})}};import{decodeAddress as Oe,encodeAddress as pt}from"@polkadot/util-crypto";import{hexToU8a as Ut,isHex as qt,u8aToHex as Wt}from"@polkadot/util";import{Buffer as V}from"buffer";var Ns=2090,K=1e6,ut=1e9,Te="1",Es=2034,L=63,se=18,N="0",mt=12,ie=15;var et="ETH\0";function Xt(d){if(!d)return!1;try{let e=Oe(d,!0),t=V.from(et);return V.from(e.subarray(0,t.length)).equals(t)}catch{return!1}}function Vt(d){return!!/^0x[a-fA-F0-9]{40}$/.test(d)}function Yt(d){try{let e=qt(d)?Ut(d):Oe(d);return pt(e),!0}catch{return!1}}var X=class d{static toAccount=e=>{let t=V.from(e.slice(2),"hex"),r=V.from(et);return pt(new Uint8Array(V.concat([r,t,V.alloc(8)])),63)};static fromAccount=e=>{let t=Oe(e),r=V.from(et),s=t.slice(r.length,-8);return"0x"+V.from(s).toString("hex")};static fromSS58=e=>{let r=Oe(e).slice(0,20);return Wt(r)};static fromAny=e=>{if(Vt(e))return e;if(Xt(e))return d.fromAccount(e);if(Yt(e))return d.fromSS58(e);throw new Error("Unknown address type")}};import{Buffer as Ie}from"buffer";var H=class{static fromAssetId(e){let t=Number(e),r=Ie.alloc(20,0);return r[15]=1,r.writeUInt32BE(t,16),"0x"+r.toString("hex")}static toAssetId(e){let t=Ie.from(e.replace("0x",""),"hex");return t.length!==20||!this.isAssetAddress(e)?null:t.readUInt32BE(16)}static isAssetAddress(e){let t=Ie.from("0000000000000000000000000000000100000000","hex"),r=Ie.from(e.replace("0x",""),"hex");return r.length!==20?!1:r.subarray(0,16).equals(t.subarray(0,16))}};import{BigNumber as x}from"bignumber.js";var Kt=12;x.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:Kt});var v=m(0),R=m(1),qs=m("Infinity");function A(d,e){let t=new x(e.toString()),r=new x(10).pow(t);return d.times(r).decimalPlaces(4)}function m(d){return new x(d.toString())}function Ws(d,e){let t=m(d);return A(t,e)}function I(d,e){return d.shiftedBy(-1*e).toString()}var Ae=m("1e27"),$t=m("1.01"),Qt=m("31536000"),dt=4,Fe=-1,$=class{client;constructor(e){this.client=new re(e)}async getSummary(e){let t=X.fromAny(e),[r,s,i,o]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(t),this.client.getUserAccountData(t),this.client.getBlockTimestamp()]),[n]=r,[a,l]=s,[c,u,p,h,g,b]=i,y=m(b).dividedBy(1e18).decimalPlaces(6,x.ROUND_DOWN),S=m(c),f=m(u),B=[];for(let O of a){let T=O.underlyingAsset.toLowerCase(),w=n.find(({underlyingAsset:Gt})=>Gt.toLowerCase()===T);if(!w)throw new Error("Missing pool reserve for "+T);let C=m(O.scaledATokenBalance),M=m(w.liquidityIndex),Be=m(w.liquidityRate),xe=m(w.availableLiquidity),$e=m(w.priceInMarketReferenceCurrency),Qe=o+6,je=this.calculateLinearInterest(Be,w.lastUpdateTimestamp,Qe),ve=M.multipliedBy(je).dividedBy(Ae).decimalPlaces(0,x.ROUND_DOWN),Dt=C.multipliedBy(ve).dividedBy(Ae).decimalPlaces(0,x.ROUND_DOWN),Mt=m(l!==0&&l===w.eModeCategoryId?w.eModeLiquidationThreshold:w.reserveLiquidationThreshold).div(1e4),Lt=w.usageAsCollateralEnabled&&O.usageAsCollateralEnabledOnUser&&m(O.scaledATokenBalance).gt(0),Ht=H.toAssetId(T);B.push({aTokenBalance:Dt,availableLiquidity:xe,decimals:Number(w.decimals),isCollateral:Lt,priceInRef:$e,reserveId:Ht,reserveAsset:T,reserveLiquidationThreshold:Mt})}return{healthFactor:y.toNumber(),currentLiquidationThreshold:m(h).dividedBy(10**dt).toNumber(),totalCollateral:S,totalDebt:f,reserves:B}}async hasBorrowPositions(e){let t=X.fromAny(e),r=await this.client.getUserAccountData(t),[s,i]=r;return i>0n}async getHealthFactor(e){let t=X.fromAny(e),r=await this.client.getUserAccountData(t),[s,i,o,n,a,l]=r;return this.calculateHealthFactorFromBalances(m(i),m(s),m(n))}async getHealthFactorAfterWithdraw(e,t,r){let{totalCollateral:s,totalDebt:i,reserves:o,currentLiquidationThreshold:n}=await this.getSummary(e);if(i.lte(0))return Fe;let a=H.fromAssetId(t),l=o.find(B=>B.reserveAsset===a);if(!l)throw new Error("Missing reserve ctx for "+a);let{decimals:c,isCollateral:u,priceInRef:p,reserveLiquidationThreshold:h}=l,g=A(m(r),c).decimalPlaces(0,x.ROUND_DOWN),b=u?g.multipliedBy(p).dividedBy(m(10).pow(c)).decimalPlaces(0,x.ROUND_DOWN):v,y=s.minus(b);if(y.lte(0))return 0;let S=s.multipliedBy(m(n)).minus(b.multipliedBy(h)).dividedBy(y);return y.multipliedBy(S).dividedBy(i).decimalPlaces(6,x.ROUND_DOWN).toNumber()}async getHealthFactorAfterSupply(e,t,r){let{totalCollateral:s,totalDebt:i,reserves:o,currentLiquidationThreshold:n}=await this.getSummary(e);if(i.lte(0))return Fe;let a=H.fromAssetId(t),l=o.find(f=>f.reserveAsset===a);if(!l)throw new Error("Missing reserve ctx for "+a);let{decimals:c,priceInRef:u,reserveLiquidationThreshold:p}=l,g=A(m(r),c).decimalPlaces(0,x.ROUND_DOWN).multipliedBy(u).dividedBy(m(10).pow(c)).decimalPlaces(0,x.ROUND_DOWN),b=s.plus(g);if(b.lte(0))return 0;let y=s.multipliedBy(m(n)).plus(g.multipliedBy(p)).dividedBy(b);return b.multipliedBy(y).dividedBy(i).decimalPlaces(6,x.ROUND_DOWN).toNumber()}async getHealthFactorAfterSwap(e,t,r,s,i){let{totalDebt:o,reserves:n,healthFactor:a}=await this.getSummary(e);if(o.lte(0))return Fe;let l=H.fromAssetId(r),c=H.fromAssetId(i),u=n.find(w=>w.reserveAsset===l),p=n.find(w=>w.reserveAsset===c);if(!u)throw new Error(`Missing reserve ctx for ${l}`);if(!p)throw new Error(`Missing reserve ctx for ${c}`);let h=A(m(t),u.decimals).decimalPlaces(0,x.ROUND_DOWN),g=A(m(s),p.decimals).decimalPlaces(0,x.ROUND_DOWN),b=h.multipliedBy(u.priceInRef).dividedBy(m(10).pow(u.decimals)).decimalPlaces(0,x.ROUND_DOWN),y=g.multipliedBy(p.priceInRef).dividedBy(m(10).pow(p.decimals)).decimalPlaces(0,x.ROUND_DOWN),S=u.isCollateral?b.multipliedBy(u.reserveLiquidationThreshold):v,O=y.multipliedBy(p.reserveLiquidationThreshold).minus(S).dividedBy(o);return m(a).plus(O).decimalPlaces(6,x.ROUND_DOWN).toNumber()}async getMaxWithdraw(e,t){let{totalDebt:r,reserves:s,healthFactor:i}=await this.getSummary(e),o=H.fromAssetId(t),n=s.find(a=>a.reserveAsset===o);if(!n)throw new Error("Missing reserve data for "+o);return this.calculateWithdrawMax(n,r,i)}async getMaxWithdrawAll(e){let{totalDebt:t,reserves:r,healthFactor:s}=await this.getSummary(e),i={};for(let o of r){let n=this.calculateWithdrawMax(o,t,s);o.reserveId&&(i[o.reserveId]=n)}return i}calculateWithdrawMax(e,t,r){let{aTokenBalance:s,availableLiquidity:i,decimals:o,priceInRef:n,reserveLiquidationThreshold:a,isCollateral:l}=e,c=s;if(l&&t.gt(0)){let p=m(r).minus($t);if(p.gt(0)){let g=p.multipliedBy(t).dividedBy(a).decimalPlaces(0,x.ROUND_DOWN).dividedBy(n).multipliedBy(m(10).pow(o)).decimalPlaces(0,x.ROUND_DOWN);c=x.minimum(s,g)}else c=v}return{amount:x.minimum(c,i),decimals:o}}calculateLinearInterest(e,t,r){let s=r-t;return s<=0?Ae:e.multipliedBy(s).dividedBy(Qt).plus(Ae).decimalPlaces(0,x.ROUND_DOWN)}calculateHealthFactorFromBalances(e,t,r){return e.lte(0)?Fe:t.multipliedBy(r).dividedBy(e).dividedBy(m(10).pow(dt)).decimalPlaces(6,x.ROUND_DOWN).toNumber()}};function gt(d){switch(d){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}import"@galacticcouncil/api-augment/hydradx";import"@galacticcouncil/api-augment/basilisk";var _=class{api;constructor(e){this.api=e}get chainDecimals(){return this.api.registry.chainDecimals[0]}get chainToken(){return this.api.registry.chainTokens[0]}log(e,...t){let r=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");gt(r)&&console.log(e,...t)}};var Q=class extends _{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(e){super(e)}async safeSharesQuery(){try{let e=await this.api.query.stableswap.pools.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}async safeBondsQuery(){try{let e=await this.api.query.bonds.bonds.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}async metadataQuery(){try{let e=await this.api.query.assetRegistry.assetMetadataMap.entries();return new Map(e.map(([{args:[t]},r])=>{let{decimals:s,symbol:i}=r.unwrap();return[t.toString(),{decimals:s.toNumber(),symbol:i.toHuman()}]}))}catch{return new Map([])}}async locationsQuery(){try{let e=await this.api.query.assetRegistry.assetLocations.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}getSystemTokenName(e){switch(e){case"HDX":return"Hydration";case"BSX":return"Basilisk";default:return e}}getToken(e,t,r,s){if(e=="0"){let u=this.api.consts.balances.existentialDeposit;return{id:"0",name:this.getSystemTokenName(this.chainToken),symbol:this.chainToken,decimals:this.chainDecimals,icon:this.chainToken,type:"Token",isSufficient:!0,existentialDeposit:u.toString()}}let{name:i,assetType:o,isSufficient:n,existentialDeposit:a}=t,{symbol:l,decimals:c}=r.get(e)??{};return{id:e,name:i.toHuman(),symbol:l,decimals:c,icon:l,type:o.toHuman(),isSufficient:n?n.toHuman():!0,location:s?.toJSON(),existentialDeposit:a.toString()}}getBond(e,t,r,s){let[i,o]=s,{assetType:n,isSufficient:a,existentialDeposit:l}=t,{symbol:c,decimals:u}=this.getToken(i.toString(),t,r),p=o.toNumber(),h=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",h.format(p)].join(" ");return{id:e,name:g,symbol:c+"b",decimals:u,icon:c,type:n.toString(),isSufficient:a.toHuman(),existentialDeposit:l.toString(),underlyingAssetId:i.toString(),maturity:p}}getShares(e,t,r,s){let{assets:i}=s,{name:o,symbol:n,assetType:a,isSufficient:l,existentialDeposit:c}=t,p=i.map(b=>b.toString()).map(b=>{let{symbol:y}=this.getToken(b,t,r);return[b,y]}),h=Object.fromEntries(p),g=Object.values(h);return{id:e,name:g.join(", "),symbol:n?.isSome?n.toHuman():o.toHuman(),decimals:18,icon:g.join("/"),type:a.toString(),isSufficient:l.toHuman(),existentialDeposit:c.toString(),meta:h}}getExternal(e,t,r,s){let i=this.getToken(e,t,new Map,s),o=r?.find(n=>n.internalId===i.id);return o?{...i,decimals:o.decimals,name:o.name,symbol:o.symbol,icon:o.symbol,isWhiteListed:o.isWhiteListed}:i}normalizeMetadata(e,t){return t.size?t:new Map(e.map(([{args:[r]},s])=>{let{decimals:i,symbol:o}=s.unwrap();return[r.toString(),{decimals:Number(i.toString()),symbol:o.toHuman()}]}))}getSupportedAssets(e){return e.filter(([t,r])=>{if(r.isNone)return!1;let s=r.unwrap();return this.isSupportedAsset(s)})}async getOnChainAssets(e,t){let[r,s,i,o,n]=await Promise.all([this.api.query.assetRegistry.assets.entries(),this.locationsQuery(),this.safeSharesQuery(),this.safeBondsQuery(),this.metadataQuery()]),a=this.getSupportedAssets(r),l=this.normalizeMetadata(a,n),c=a.map(([{args:[u]},p])=>{let h=p.unwrap(),g=s.get(u.toString()),{assetType:b}=h;switch(b.toString()){case"Bond":let y=o.get(u.toString());return this.getBond(u.toString(),h,l,y);case"StableSwap":let S=i.get(u.toString());return this.getShares(u.toString(),h,l,S);case"External":return this.getExternal(u.toString(),h,t,g);default:return this.getToken(u.toString(),h,l,g)}});return e?c:c.filter(u=>this.isValidAsset(u))}isValidAsset(e){let t=Math.sign(e.decimals);return!!e.symbol&&(t===0||t===1)}isSupportedAsset(e){let t=e.assetType.toString();return this.SUPPORTED_TYPES.includes(t)}};var G=class extends _{constructor(e){super(e)}async getBalance(e,t){let r=await this.api.query.assetRegistry.assets(t),{assetType:s}=r.unwrap();return s.toString()==="Erc20"?this.getErc20Balance(e,t):t==="0"?this.getSystemBalance(e):this.getTokenBalance(e,t)}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateFreeBalance(t)}async getTokenBalance(e,t){let r=await this.api.query.tokens.accounts(e,t);return this.calculateFreeBalance(r)}async getErc20Balance(e,t){let r=await this.getTokenBalanceData(e,t);return this.calculateFreeBalance(r)}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t("0",this.calculateFreeBalance(r)))}async subscribeSystemBalances(e,t){return this.api.query.system.account.multi(e,r=>{let s=[];r.forEach((i,o)=>{let n=this.calculateFreeBalance(i.data),a=e[o];s.push([a,n])}),t(s)})}async subscribeTokenBalance(e,t,r){let s=await this.api.query.tokens.accounts.keys(e),i=r?r.map(o=>[e,o]):s.map(({args:[o,n]})=>[o.toString(),n.toString()]);return this.api.query.tokens.accounts.multi(i,o=>{let n=[];o.forEach((a,l)=>{let c=this.calculateFreeBalance(a),u=i[l][1];n.push([u,c])}),t(n)})}async subscribeTokenBalances(e,t){return this.api.query.tokens.accounts.multi(e,r=>{let s=[];r.forEach((i,o)=>{let n=this.calculateFreeBalance(i),a=e[o];s.push([a,n])}),t(s)})}async subscribeErc20Balance(e,t,r){let i=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([a,l])=>{let{assetType:c}=l.unwrap();return c.toString()==="Erc20"}).map(([{args:[a]}])=>a.toString()))(),o=async()=>{let n=await Promise.all(i.map(async a=>[a,await this.getErc20Balance(e,a)]));t(n)};return this.api.rpc.chain.subscribeNewHeads(async()=>{o()})}async subscribeErc20Balances(e,t){let r=async()=>{let s=await Promise.all(e.map(async i=>{let[o,n]=i;return[i,await this.getErc20Balance(o,n)]}));t(s)};return this.api.rpc.chain.subscribeNewHeads(async()=>{r()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateFreeBalance(e){let t=e.free.toString(),r=e.frozen.toString();return x(t).lt(r)?x(0):x(t).minus(r)}};var ae=class extends _{constructor(e){super(e)}async getBalance(e,t){let r=await this.api.query.assetRegistry.assets(t),{assetType:s}=r.unwrap();return s.toString()==="Erc20"?this.getErc20Balance(e,t):t==="0"?this.getSystemBalance(e):this.getTokenBalance(e,t)}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateBalance(t)}async getTokenBalance(e,t){let r=await this.api.query.tokens.accounts(e,t);return this.calculateBalance(r)}async getErc20Balance(e,t){let r=await this.getTokenBalanceData(e,t);return this.calculateBalance(r)}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t("0",this.calculateBalance(r)))}async subscribeTokenBalance(e,t,r){let s=await this.api.query.tokens.accounts.keys(e),i=r?r.map(o=>[e,o]):s.map(({args:[o,n]})=>[o.toString(),n.toString()]);return this.api.query.tokens.accounts.multi(i,o=>{let n=[];o.forEach((a,l)=>{let c=i[l][1],u=this.calculateBalance(a);n.push([c,u])}),t(n)})}async subscribeErc20Balance(e,t,r){let i=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([a,l])=>{let{assetType:c}=l.unwrap();return c.toString()==="Erc20"}).map(([{args:[a]}])=>a.toString()))(),o=async()=>{let n=await Promise.all(i.map(async a=>[a,await this.getErc20Balance(e,a)]));t(n)};return this.api.rpc.chain.subscribeNewHeads(async()=>{o()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateBalance(e){let t=x(e.free.toString()),r=e.frozen.toString(),s=e.reserved.toString(),i=t.gte(r)?t.minus(r).toString():"0",o=t.plus(s).toString();return{free:t.toString(),total:o,transferable:i,reserved:s,frozen:r}}};var ne=class{api;_minOrderBudget;_blockTime;constructor(e){this.api=e}get blockTime(){return this._blockTime===void 0&&(this._blockTime=this.api.consts.aura.slotDuration.toNumber()),this._blockTime}get minOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=this.api.consts.dca.minBudgetInNativeCurrency.toString()),m(this._minOrderBudget)}};import{fixed_from_rational as ht}from"@galacticcouncil/math-liquidity-mining";import{GenericAccountId32 as jt}from"@polkadot/types";import{u8aConcat as yt}from"@polkadot/util";import{isAddress as bt}from"@polkadot/util-crypto";var tt=class extends _{balanceClient;constructor(e){super(e),this.balanceClient=new G(e)}secondsInYear=new x(365.2425).times(24).times(60).times(60);async getOmnipoolFarms(e){let t=await this.api.query.omnipoolWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,i])=>{let[,o]=s.args,n=i.unwrap().toString(),a=o.toString(),l=(await this.api.query.omnipoolWarehouseLM.globalFarm(a)).unwrap(),c=(await this.api.query.omnipoolWarehouseLM.yieldFarm(e,a,n)).unwrap(),u=await this.getOraclePrice(l)??l.priceAdjustment.toString(),h=this.getAccountResolver(this.api.registry)(Number(a),!1).toString(),g=l.rewardCurrency.toString(),b=await this.balanceClient.getTokenBalanceData(h,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:u,potBalance:b.free.toString()}}))}async getIsolatedPoolFarms(e){let t=await this.api.query.xykWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,i])=>{let[,o]=s.args,n=i.unwrap().toString(),a=o.toString(),l=(await this.api.query.xykWarehouseLM.globalFarm(a)).unwrap(),c=(await this.api.query.xykWarehouseLM.yieldFarm(e,a,n)).unwrap(),u=await this.getOraclePrice(l)??l.priceAdjustment.toString(),h=this.getAccountResolver(this.api.registry)(Number(a),!0).toString(),g=l.rewardCurrency.toString(),b=await this.balanceClient.getTokenBalanceData(h,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:u,potBalance:b.free.toString()}}))}async getOraclePrice(e){let t=e.rewardCurrency.toString(),r=e.incentivizedAsset.toString(),s=[t,r].sort();if(t===r)return new x(1).shiftedBy(18).toString();let i=await this.api.query.emaOracle.oracles("omnipool",s,"TenMinutes");if(i.isNone)return;let[o]=i.unwrap(),n=o.price.n.toString(),a=o.price.d.toString(),l;return Number(t)<Number(r)?l=ht(n,a):l=ht(a,n),l}getGlobalRewardPerPeriod(e,t,r,s){let o=e.times(t).shiftedBy(-18).times(s).shiftedBy(-18);return o.gte(r)?r:o}getPoolYieldPerPeriod(e,t,r,s){return e.times(t).div(r.times(s).shiftedBy(-18))}padEndU8a(e,t){return yt(e,Array(Math.max(0,t-e.length)).fill(0))}getAccountResolver=e=>(t,r)=>{let s="modl",i=r?"0x78796b4c4d704944":"0x4f6d6e6957684c4d";return new jt(e,this.padEndU8a(yt(s,i,typeof t!="number"?t.toU8a():[t]),32))};async getFarmApr(e,t){if(t==="isolatedpool"&&!bt(e))throw new Error("You must pass an address of isolated pool as id");if(t==="omnipool"&&bt(e))throw new Error("You must pass an asset id of omnipool");let r=6,s=t==="omnipool"?await this.getOmnipoolFarms(e):await this.getIsolatedPoolFarms(e);return s.length?s.map(({yieldFarm:n,globalFarm:a,priceAdjustment:l,potBalance:c})=>{let u=new x(a.totalSharesZ.toString()),p=a.plannedYieldingPeriods.toString(),h=new x(a.yieldPerPeriod.toString()),g=new x(a.maxRewardPerPeriod.toString()),b=a.blocksPerPeriod.toString(),y=new x(n.multiplier.toString()).shiftedBy(-18),S=this.secondsInYear.div(new x(r).times(b)),f;if(u.isZero())f=h.times(y).times(S);else{let C=this.getGlobalRewardPerPeriod(u,h,g,l);f=this.getPoolYieldPerPeriod(C,y,u,l).times(S)}let B=new x(a.pendingRewards.toString()).plus(a.accumulatedPaidRewards.toString()),O=g.times(p),T=c?B.plus(c):O;return B.div(T).gte(.999)?v:f.div(t==="isolatedpool"?2:1).times(100)}).reduce((n,a)=>n.plus(a),v).toString():void 0}};var Re=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},Pt=class extends Error{constructor(e,t){super(),this.message=`${e} pool missing ${t}`,this.name="PoolConfigNotFound"}},Ne=class extends Error{constructor(e,t){super(),this.message=`Route from ${e} to ${t} not found in pool configuration`,this.name="RouteNotFound"}},ft=class extends Error{constructor(e){super(),this.message=`Asset ${e} not available in current network`,this.name="AssetNotFound"}},St=class extends Error{constructor(e){super(),this.message=`Storage missing ${e}`,this.name="StorageConfigNotFound"}},Bt=class extends Error{constructor(e){super(),this.message=`Subscription type "${e}" not supported`,this.name="SubscriptionNotSupported"}},xt=class extends Error{constructor(e){super(),this.message=`${e}`,this.name="ProviderConfigNotFound"}};import{encodeFunctionData as zt,decodeFunctionResult as Jt}from"viem";var Zt=1e7,Ee=class{api;constructor(e){this.api=e}async getBlock(){let e=await this.api.query.ethereum.currentBlock(),{header:t}=e.unwrap(),r=t.timestamp.toBigInt()/1000n,s=t.number.toBigInt();return{timestamp:r,number:s}}readContract=(async e=>{let{abi:t,address:r,functionName:s,args:i}=e,o=zt({abi:t,functionName:s,args:i}),n=this.api.call.ethereumRuntimeRPCApi.call,a=n.meta.params,l=["",r,o,0,Zt,null,null,null,!1,[]];a.find(g=>g.name==="authorization_list")&&l.push([]);let c=await n(...l);if(c.isErr)throw console.error(s,c.asErr.toHuman()),new Error("Contract read failure");let{value:u,exitReason:p,usedGas:h}=c.asOk;if(p.isSucceed)return Jt({abi:t,functionName:s,data:u.toHex()});throw console.log(s,p.toString(),h.toHuman()),new Error("Contract read error")})};import{defineChain as er}from"viem";var tr=["wss://hydration-rpc.n.dwellir.com","wss://hydration.dotters.network","wss://rpc.helikon.io/hydradx","wss://hydration.ibp.network","wss://rpc.cay.hydration.cloud","wss://rpc.parm.hydration.cloud","wss://rpc.roach.hydration.cloud","wss://rpc.zipp.hydration.cloud","wss://rpc.sin.hydration.cloud","wss://rpc.coke.hydration.cloud"],vt=d=>{let t=[d.endpoint,...tr],r=Array.from(new Set(t.map(s=>s.replace("wss://","https://").replace("ws://","http://"))));return er({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:r}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1})};import{createPublicClient as Tt,createWalletClient as rr,custom as sr,http as ir}from"viem";function wt(d){let e=async({method:t,params:r})=>{let s=Array.isArray(r)?r:[];return d.send(t,s)};return()=>({request:e,config:{name:"PolkadotWsTransport",type:"webSocket",key:"polkadotWs",request:e}})}var Ce=class{api;chain;constructor(e){this.api=e,this.chain=vt(this.provider)}get provider(){let{provider:e}=this.api._options;return e}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return Tt({chain:this.chain,transport:ir()})}getWsProvider(){return Tt({chain:this.chain,transport:wt(this.provider)})}getSigner(e){return rr({account:e,chain:this.chain,transport:sr(window.ethereum)})}getRPCAdapter(){return new Ee(this.api)}};var rt=[{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"description",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"version",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint80",name:"_roundId",type:"uint80"}],name:"getRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"},{inputs:[],name:"latestRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"}];var oe=class{rpcAdapter;constructor(e){this.rpcAdapter=e.getRPCAdapter()}async getData(e,t=6){let[r,s,i]=await Promise.all([this.rpcAdapter.readContract({abi:rt,address:e,functionName:"latestRoundData"}),this.rpcAdapter.readContract({abi:rt,address:e,functionName:"decimals"}),this.rpcAdapter.getBlock()]),[o,n,a,l]=r,c=i.number-(i.timestamp-l)/BigInt(t),u=Number(c);return{price:n,decimals:s,updatedAt:u<0?0:u}}};import{memoize1 as gs}from"@thi.ng/memoize";var E=(o=>(o.Aave="Aave",o.LBP="Lbp",o.Omni="Omnipool",o.Stable="Stableswap",o.XYK="Xyk",o.HSM="Hsm",o))(E||{}),j=(c=>(c.UnknownError="UnknownError",c.FacilitatorCapacityExceeded="FacilitatorCapacityExceeded",c.InsufficientTradingAmount="InsufficientTradingAmount",c.InsufficientCollateral="InsufficientCollateral",c.MaxHoldingExceeded="MaxHoldingExceeded",c.MaxInRatioExceeded="MaxInRatioExceeded",c.MaxOutRatioExceeded="MaxOutRatioExceeded",c.TradeNotAllowed="TradeNotAllowed",c.MaxBuyBackExceeded="MaxBuyBackExceeded",c.MaxBuyPriceExceeded="MaxBuyPriceExceeded",c))(j||{});var ke=class d{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new d(e)}constructor(e){this.type="Aave",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(a=>[a.id,a])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let o=m(s.balance),n=m(i.balance);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:o,balanceOut:n,assetInED:v,assetOutED:v}}validateAndBuy(e,t){let r=this.calculateInGivenOut(e,t),s=[];return t.isGreaterThan(e.balanceOut)&&s.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:t,feePct:0,errors:s}}validateAndSell(e,t){let r=this.calculateOutGivenIn(e,t),s=[];return r.isGreaterThan(e.balanceOut)&&s.push("TradeNotAllowed"),{amountIn:t,calculatedOut:r,amountOut:r,feePct:0,errors:s}}calculateInGivenOut(e,t){return t}calculateOutGivenIn(e,t){return t}spotPriceInGivenOut(e){return A(R,e.decimalsOut)}spotPriceOutGivenIn(e){return A(R,e.decimalsIn)}calculateTradeFee(e,t){return v}};import{encodeAddress as or}from"@polkadot/util-crypto";import{stringToU8a as lr}from"@polkadot/util";import{decodeEventLog as cr}from"viem";import{memoize1 as ar}from"@thi.ng/memoize";import{TLRUCache as nr}from"@thi.ng/cache";var D=class extends G{evm;mmOracle;pools=[];subs=[];assets=new Map([]);mem=0;onNewBlockHandler;onEventsHandler;memPoolsCache=new nr(null,{maxlen:1,ttl:3600*1e3,release:e=>{this.mem>e&&this.log(this.getPoolType(),`mem ${e} released at`,new Date)}});memPools=ar(e=>(this.log(this.getPoolType(),`mem ${e} sync`),this.getPools()),this.memPoolsCache);constructor(e,t){super(e),this.evm=t,this.mmOracle=new oe(t),this.onNewBlockHandler=this.onNewBlock.bind(this),this.onEventsHandler=this.onEvents.bind(this)}onNewBlock(e){}onEvents(e){}get augmentedPools(){return this.pools.filter(e=>this.isValidPool(e)).map(e=>this.withMetadata(e))}async withAssets(e){this.assets=new Map(e.map(t=>[t.id,t])),this.mem=this.mem+1}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){this.unsubscribe(),this.pools=await this.loadPools();let e=this.subscribeBalances(),t=this.subscribeUpdates();this.subs.push(e),this.subs.push(t);let r=this.getPoolType();return this.log(r,`mem ${this.mem} pools(${this.augmentedPools.length})`),this.log(r,`mem ${this.mem} subs(${this.subs.length})`),this.augmentedPools}async subscribeBalances(){let e=[],t=[],r=[],s=[];for(let n of this.augmentedPools){let{address:a,tokens:l}=n;l.filter(c=>c.id==="0").forEach(()=>{e.push(a)}),l.filter(c=>["Token","StableSwap"].includes(c.type)&&c.id!=="0"&&c.id!==n.id).forEach(c=>{t.push([a,c.id])}),l.filter(c=>c.type==="Erc20").forEach(c=>{r.push([a,c.id])})}let i=n=>{n.forEach(([a,l])=>{let c=this.pools.find(u=>u.address===a);if(c){let u=c.tokens.findIndex(p=>p.id==="0");c.tokens[u].balance=l.toString()}})},o=n=>{n.forEach(([a,l])=>{let[c,u]=a,p=this.pools.find(h=>h.address===c);if(p){let h=p.tokens.findIndex(g=>g.id===u);p.tokens[h].balance=l.toString()}})};if(e.length>0){let n=await this.subscribeSystemBalances(e,i);s.push(n)}if(t.length>0){let n=await this.subscribeTokenBalances(t,o);s.push(n)}if(r.length>0){let n=await this.subscribeErc20Balances(r,o);s.push(n)}return()=>{for(let n of s)try{n()}catch(a){console.warn("Balance unsub failed",a)}}}unsubscribe(){this.subs.forEach(e=>{e.then(t=>t()).catch(t=>console.warn("Unsub failed",t))})}isValidPool(e){return e.type==="Xyk"?e.tokens.every(t=>this.assets.get(t.id)):!0}withMetadata(e){return e.tokens=e.tokens.map(t=>{let r=this.assets.get(t.id);return{...t,...r}}),e}};function _e(d,e){let t=[];return JSON.stringify(d,(r,s)=>(s&&s[e]&&t.push(s),s)),t[0]}function Ra(d,e,t){let r;return JSON.stringify(d,(s,i)=>(i&&i[e]===t&&(r=i),i)),r}var Na=(d,e)=>typeof e=="bigint"?e.toString():e;var ur=["Supply","Withdraw","Repay","Borrow"],De=class extends D{getPoolType(){return"Aave"}getPoolId(e,t){let r="aave:"+e+"/"+t;return or(lr(r.padEnd(32,"\0")),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:0}}getReserveH160Id(e){return e.type==="Erc20"?_e(e.location,"accountKey20").accountKey20.key:H.fromAssetId(e.id)}isSupported(){return this.api.call.aaveTradeExecutor.pools!==void 0}async loadPools(){return(await this.api.call.aaveTradeExecutor.pools()).map(({reserve:t,atoken:r,liqudityIn:s,liqudityOut:i})=>({address:this.getPoolId(t.toString(),r.toString()),type:"Aave",tokens:[{id:t.toString(),balance:s.toString()},{id:r.toString(),balance:i.toString()}],...this.getPoolLimits()}))}async getPoolFees(e,t,r){return{}}onEvents(e){e.forEach(t=>{let{event:r}=t,s=`${r.section}:${r.method}`;if(s==="router:Executed"){let[i,o]=r.data.toJSON();this.pools.filter(n=>n.tokens.some(a=>a.id===i.toString()||a.id===o.toString())).forEach(n=>{this.log(`Sync AAVE via [router:Executed] :: ${i}:${o}`),this.updatePoolState(n)})}if(s==="evm:Log"){let[i]=r.data.toJSON();try{let{eventName:o,args:n}=cr({abi:we,topics:i.topics,data:i.data});if(ur.includes(o)){let a=n.reserve.toLowerCase();this.pools.filter(l=>{let[c]=l.tokens;return this.getReserveH160Id(c).toLowerCase()===a}).forEach(l=>{this.log(`Sync AAVE via [evm:Log] :: ${o} ${a}`),this.updatePoolState(l)})}}catch{}}})}async subscribeBalances(){return()=>{}}async subscribeUpdates(){return()=>{}}async updatePoolState(e){let[t,r]=e.tokens,{liqudityIn:s,liqudityOut:i}=await this.api.call.aaveTradeExecutor.pool(t.id,r.id);e.tokens=e.tokens.map(o=>{let n=o.id===t.id?s.toString():i.toString();return{...o,balance:n}})}};import{calculate_in_given_out as mr,calculate_out_given_in as pr,calculate_linear_weights as dr,calculate_pool_trade_fee as gr,get_spot_price as hr}from"@galacticcouncil/math-lbp";var q=class{static getSpotPrice(e,t,r,s,i){return hr(e,t,r,s,i)}static calculateInGivenOut(e,t,r,s,i){return mr(e,t,r,s,i)}static calculateOutGivenIn(e,t,r,s,i){return pr(e,t,r,s,i)}static calculateLinearWeights(e,t,r,s,i){return dr(e,t,r,s,i)}static calculatePoolTradeFee(e,t,r){return gr(e,t,r)}};var P=class d{static toPct(e){let[t,r]=e;return d.safeDivide(t*100,r)}static toRaw(e){let[t,r]=e;return d.safeDivide(t,r)}static fromPermill(e){return[e,1e6]}static fromPerbill(e){return[e,1e9]}static fromRate(e,t){return[e,t]}static safeDivide(e,t,r=12){let s=10**r;return Math.round(e*s/t)/s}static safeRound(e){return parseFloat(e.toPrecision(15))}};var Me=class d{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(e){return new d(e)}constructor(e){this.type="Lbp",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.fee=e.fee,this.repayFeeApply=e.repayFeeApply}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(a=>[a.id,a])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let o=m(s.balance),n=m(i.balance);return{assetIn:e,assetOut:t,balanceIn:o,balanceOut:n,decimalsIn:s.decimals,decimalsOut:i.decimals,weightIn:s.weight,weightOut:i.weight}}validateAndBuy(e,t,r){let s=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let o=e.balanceOut.div(this.maxOutRatio);if(t.isGreaterThan(o)&&i.push("MaxOutRatioExceeded"),s===e.assetOut){let n=this.calculateTradeFee(t,r),a=P.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),l=t.plus(n),c=this.calculateInGivenOut(e,l),u=e.balanceIn.div(this.maxInRatio);return c.isGreaterThan(u)&&i.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:t,feePct:a,errors:i}}else{let n=this.calculateInGivenOut(e,t),a=e.balanceIn.div(this.maxInRatio);return n.isGreaterThan(a)&&i.push("MaxInRatioExceeded"),{amountIn:n,calculatedIn:n,amountOut:t,feePct:0,errors:i}}}validateAndSell(e,t,r){let s=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let o=e.balanceIn.div(this.maxInRatio);if(t.isGreaterThan(o)&&i.push("MaxInRatioExceeded"),s===e.assetIn){let n=this.calculateOutGivenIn(e,t),a=e.balanceOut.div(this.maxOutRatio);return n.isGreaterThan(a)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:n,amountOut:n,feePct:0,errors:i}}else{let n=this.calculateOutGivenIn(e,t),a=this.calculateTradeFee(n,r),l=P.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),c=n.minus(a),u=e.balanceOut.div(this.maxOutRatio);return c.isGreaterThan(u)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:n,amountOut:c,feePct:l,errors:i}}}calculateInGivenOut(e,t){let r=q.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=m(r);return s.isNegative()?v:s}calculateOutGivenIn(e,t){let r=q.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=m(r);return s.isNegative()?v:s}spotPriceInGivenOut(e){let t=q.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),A(R,e.decimalsOut).toString());return m(t)}spotPriceOutGivenIn(e){let t=q.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),A(R,e.decimalsIn).toString());return m(t)}calculateTradeFee(e,t){let r=q.calculatePoolTradeFee(e.toString(),this.repayFeeApply?t.repayFee[0]:t.exchangeFee[0],this.repayFeeApply?t.repayFee[1]:t.exchangeFee[1]);return m(r)}};var Le=class extends D{MAX_FINAL_WEIGHT=A(m(100),6);poolsData=new Map([]);getPoolType(){return"Lbp"}getPoolLimits(){let e=this.api.consts.lbp.maxInRatio.toNumber(),t=this.api.consts.lbp.maxOutRatio.toNumber(),r=this.api.consts.lbp.minTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}async getPoolDelta(e,t,r){let{start:s,end:i,assets:o,initialWeight:n,finalWeight:a,repayTarget:l,feeCollector:c}=t,u=q.calculateLinearWeights(s.toString(),i.toString(),n.toString(),a.toString(),r),[p,h]=o,g=p.toString(),b=m(u),y=h.toString(),S=this.MAX_FINAL_WEIGHT.minus(m(b)),[f,B,O]=await Promise.all([this.isRepayFeeApplied(g,l.toString(),c.toString()),this.getBalance(e,g),this.getBalance(e,y)]);return{repayFeeApply:f,tokens:[{id:g,weight:b,balance:B.toString()},{id:y,weight:S,balance:O.toString()}]}}isActivePool(e,t){if(e.start.isEmpty||e.end.isEmpty)return!1;let r=e.start.unwrap().toNumber(),s=e.end.unwrap().toNumber();return t>=r&&t<s}async isRepayFeeApplied(e,t,r){let s=m(t);if(s.isZero())return!1;try{return(await this.getBalance(e,r)).isLessThan(s)}catch{return!0}}isSupported(){return this.api.query.lbp!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.lbp.poolData.entries(),this.api.query.parachainSystem.validationData()]),{relayParentNumber:r}=t.unwrap(),s=e.filter(([i,o])=>this.isActivePool(o.unwrap(),r.toNumber())).map(async([{args:[i]},o])=>{let n=o.unwrap(),a=i.toString(),l=await this.getPoolDelta(a,n,r.toString());this.poolsData.set(i.toString(),n);let[c,u]=n.fee;return{address:a,type:"Lbp",fee:P.fromRate(c.toNumber(),u.toNumber()),...l,...this.getPoolLimits()}});return Promise.all(s)}async getPoolFees(e,t,r){let s=this.pools.find(i=>i.address===r);return{repayFee:this.getRepayFee(),exchangeFee:s.fee}}getRepayFee(){let[e,t]=this.api.consts.lbp.repayFee;return P.fromRate(e.toNumber(),t.toNumber())}async subscribeUpdates(){return this.api.query.parachainSystem.validationData(async e=>{let{relayParentNumber:t}=e.unwrap();this.pools.forEach(async r=>{let s=this.poolsData.get(r.address);if(s)if(this.isActivePool(s,t.toNumber())){let o=await this.getPoolDelta(r.address,s,t.toString());Object.assign(r,o)}else{let o=this.pools.findIndex(n=>n.address==r.address);this.pools.splice(o,1)}})})}};import{calculate_in_given_out as yr,calculate_lrna_in_given_out as br,calculate_out_given_in as Pr,calculate_out_given_lrna_in as fr,calculate_spot_price as Sr,calculate_lrna_spot_price as Br,calculate_shares as xr,calculate_liquidity_out as vr,calculate_liquidity_lrna_out as wr,calculate_liquidity_hub_in as Tr,is_sell_allowed as Or,is_buy_allowed as Ir,is_add_liquidity_allowed as Ar,is_remove_liquidity_allowed as Fr,recalculate_asset_fee as Rr,recalculate_protocol_fee as Nr,verify_asset_cap as Er}from"@galacticcouncil/math-omnipool";var F=class{static calculateSpotPrice(e,t,r,s){return Sr(e,t,r,s)}static calculateLrnaSpotPrice(e,t){return Br(e,t)}static calculateInGivenOut(e,t,r,s,i,o,n,a,l){return yr(e,t,r,s,i,o,n,a,l)}static calculateLrnaInGivenOut(e,t,r,s,i){return br(e,t,r,s,i)}static calculateOutGivenIn(e,t,r,s,i,o,n,a,l){return Pr(e,t,r,s,i,o,n,a,l)}static calculateOutGivenLrnaIn(e,t,r,s,i){return fr(e,t,r,s,i)}static calculateShares(e,t,r,s){return xr(e,t,r,s)}static calculateLiquidityOut(e,t,r,s,i,o,n,a){return vr(e,t,r,s,i,o,n,a)}static calculateLiquidityLRNAOut(e,t,r,s,i,o,n,a){return wr(e,t,r,s,i,o,n,a)}static calculateCapDifference(e,t,r,s){let i=x(t),o=x(e),n=x(s),l=x(r).shiftedBy(-18);if(i.div(n).lt(l)){let u=l.times(n).minus(i).times(o),p=i.times(x(1).minus(l));return u.div(p).toFixed(0)}else return"0"}static calculateLimitHubIn(e,t,r,s){return Tr(e,t,r,s)}static isSellAllowed(e){return Or(e)}static isBuyAllowed(e){return Ir(e)}static isAddLiquidityAllowed(e){return Ar(e)}static isRemoveLiquidityAllowed(e){return Fr(e)}static recalculateAssetFee(e,t,r,s,i,o,n,a,l,c,u){return Rr(e,t,r,s,i,o,n,a,l,c,u)}static recalculateProtocolFee(e,t,r,s,i,o,n,a,l,c,u){return Nr(e,t,r,s,i,o,n,a,l,c,u)}static verifyAssetCap(e,t,r,s){return Er(e,t,r,s)}};var He=class d{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(e){return new d(e)}constructor(e){this.type="Omnipool",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.hubAssetId=e.hubAssetId}validatePair(e,t){return this.hubAssetId!=t}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let o=m(s.balance),n=m(i.balance),a=m(s.existentialDeposit),l=m(i.existentialDeposit);return{assetIn:e,assetOut:t,hubReservesIn:s.hubReserves,hubReservesOut:i.hubReserves,sharesIn:s.shares,sharesOut:i.shares,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:o,balanceOut:n,tradeableIn:s.tradeable,tradeableOut:i.tradeable,assetInED:a,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),o=i.minus(s),n=s===v?v:o.div(s).multipliedBy(100).decimalPlaces(4),a=[],l=F.isSellAllowed(e.tradeableIn),c=F.isBuyAllowed(e.tradeableOut);(!l||!c)&&a.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&a.push("InsufficientTradingAmount");let u=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(u)&&a.push("MaxOutRatioExceeded");let p=e.balanceIn.div(this.maxInRatio);return i.isGreaterThan(p)&&a.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:n.toNumber(),errors:a}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,r),n=s.minus(i).div(s).multipliedBy(100).decimalPlaces(4),a=[],l=F.isSellAllowed(e.tradeableIn),c=F.isBuyAllowed(e.tradeableOut);(!l||!c)&&a.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&a.push("InsufficientTradingAmount");let u=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(u)&&a.push("MaxInRatioExceeded");let p=e.balanceOut.div(this.maxOutRatio);return i.isGreaterThan(p)&&a.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:n.toNumber(),errors:a}}calculateInGivenOut(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(e,t,r);let s=F.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toRaw(r.assetFee).toString():v.toString(),r?P.toRaw(r.protocolFee).toString():v.toString()),i=m(s);return i.isNegative()?v:i}calculateLrnaInGivenOut(e,t,r){let s=F.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toRaw(r.assetFee).toString():v.toString()),i=m(s);return i.isNegative()?v:i}calculateOutGivenIn(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,r);let s=F.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toRaw(r.assetFee).toString():v.toString(),r?P.toRaw(r.protocolFee).toString():v.toString()),i=m(s);return i.isNegative()?v:i}calculateOutGivenLrnaIn(e,t,r){let s=F.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toRaw(r.assetFee).toString():v.toString()),i=m(s);return i.isNegative()?v:i}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=F.calculateSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString(),e.balanceIn.toString(),e.hubReservesIn.toString());return m(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceLrnaInGivenOut(e){let t=F.calculateLrnaSpotPrice(e.hubReservesOut.toString(),e.balanceOut.toString());return m(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceOutGivenIn(e){if(e.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(e);let t=F.calculateSpotPrice(e.balanceIn.toString(),e.hubReservesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString());return m(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}spotPriceOutGivenLrnaIn(e){let t=F.calculateLrnaSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString());return m(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}};import{encodeAddress as Cr}from"@polkadot/util-crypto";import{stringToU8a as kr}from"@polkadot/util";import{memoize1 as st}from"@thi.ng/memoize";import{TLRUCache as _r}from"@thi.ng/cache";var Ot="omnipool",It="Short",Ge=class extends D{dynamicFees=new Map;dynamicFeesConfiguration=new Map;oracles=new Map;memQueryCache=new _r(null,{ttl:6*1e3});memOracleQuery=st(e=>{let t=e.split(":");return this.api.query.emaOracle.oracles(Ot,t,It)},this.memQueryCache);memFeesQuery=st(e=>this.api.query.dynamicFees.assetFee(e),this.memQueryCache);memFeesConfigurationQuery=st(e=>this.api.query.dynamicFees.assetFeeConfiguration(e),this.memQueryCache);getPoolType(){return"Omnipool"}getPoolId(){return Cr(kr("modlomnipool".padEnd(32,"\0")),63)}getOracleKey(e){return e==="0"?["0","1"]:["1",e]}getPoolLimits(){let e=this.api.consts.omnipool.maxInRatio.toNumber(),t=this.api.consts.omnipool.maxOutRatio.toNumber(),r=this.api.consts.omnipool.minimumTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}async getDynamicFees(e){return this.dynamicFees.has(e)?this.dynamicFees.get(e):this.memFeesQuery(e)}async getDynamicFeesConfiguration(e){return this.dynamicFeesConfiguration.has(e)?this.dynamicFeesConfiguration.get(e):this.memFeesConfigurationQuery(e)}async getOraclePrice(e){let r=this.getOracleKey(e).join(":");return this.oracles.has(r)?this.oracles.get(r):this.memOracleQuery(r)}isSupported(){return this.api.query.omnipool!==void 0}isAssetConfigSupported(){return this.api.query.dynamicFees.assetFeeConfiguration!==void 0}async loadPools(){let e=this.api.consts.omnipool.hubAssetId.toString(),t=this.getPoolId(),[r,s,i]=await Promise.all([this.api.query.omnipool.assets.entries(),this.api.query.omnipool.hubAssetTradability(),this.getBalance(t,e)]),o=r.map(async([{args:[a]},l])=>{let{hubReserve:c,shares:u,tradable:p,cap:h,protocolShares:g}=l.unwrap(),b=await this.getBalance(t,a.toString());return{id:a.toString(),hubReserves:m(c.toString()),shares:m(u.toString()),tradeable:p.bits.toNumber(),balance:b.toString(),cap:m(h.toString()),protocolShares:m(g.toString())}}),n=await Promise.all(o);return n.push({id:e,tradeable:s.bits.toNumber(),balance:i.toString()}),[{address:t,type:"Omnipool",hubAssetId:e,tokens:n,...this.getPoolLimits()}]}async getPoolFees(e,t,r){let s=t.assetOut,i=t.assetIn,o;if(this.isAssetConfigSupported()&&(o=await this.getDynamicFeesConfiguration(s).then(f=>f.unwrapOr(null))),o?.isFixed){let f=o.asFixed.assetFee.toNumber(),B=o.asFixed.protocolFee.toNumber();return{assetFee:P.fromPermill(f),protocolFee:P.fromPermill(B)}}let[n,a,l]=await Promise.all([this.getDynamicFees(s),this.getOraclePrice(s),this.getOraclePrice(i)]),[c,u,p]=this.getAssetFee(t,e,n,a,o?.isDynamic?o.asDynamic.assetFeeParams:void 0),[h,g,b]=i==="1"?[0,0,0]:this.getProtocolFee(t,e,n,l,o?.isDynamic?o.asDynamic.protocolFeeParams:void 0),y=c+h,S=p+b;return{assetFee:P.fromPermill(u),protocolFee:P.fromPermill(g),min:P.fromPermill(y),max:P.fromPermill(S)}}getAssetFee(e,t,r,s,i){let{assetOut:o,balanceOut:n}=e,{minFee:a,maxFee:l,decay:c,amplification:u}=i||this.api.consts.dynamicFees.assetFeeParameters,p=P.fromPermill(a.toNumber()),h=P.fromPermill(l.toNumber());if(r.isNone||s.isNone)return[a.toNumber(),a.toNumber(),l.toNumber()];let[g]=s.unwrap(),{assetFee:b,timestamp:y}=r.unwrap(),S=Math.max(1,t-y.toNumber()),f=g.volume.bIn.toString(),B=g.volume.bOut.toString(),O=g.liquidity.b.toString();o==="0"&&(f=g.volume.aIn.toString(),B=g.volume.aOut.toString(),O=g.liquidity.a.toString());let T=P.fromPermill(b.toNumber()),w=F.recalculateAssetFee(f,B,O,"9",n.toString(),P.toRaw(T).toString(),S.toString(),P.toRaw(p).toString(),P.toRaw(h).toString(),c.toString(),u.toString());return[a.toNumber(),Number(w)*1e6,l.toNumber()]}getProtocolFee(e,t,r,s,i){let{assetIn:o,balanceIn:n}=e,{minFee:a,maxFee:l,decay:c,amplification:u}=i||this.api.consts.dynamicFees.protocolFeeParameters,p=P.fromPermill(a.toNumber()),h=P.fromPermill(l.toNumber());if(r.isNone||s.isNone)return[a.toNumber(),a.toNumber(),l.toNumber()];let[g]=s.unwrap(),{protocolFee:b,timestamp:y}=r.unwrap(),S=Math.max(1,t-y.toNumber()),f=g.volume.bIn.toString(),B=g.volume.bOut.toString(),O=g.liquidity.b.toString();o==="0"&&(f=g.volume.aIn.toString(),B=g.volume.aOut.toString(),O=g.liquidity.a.toString());let T=P.fromPermill(b.toNumber()),w=F.recalculateProtocolFee(f,B,O,"9",n.toString(),P.toRaw(T).toString(),S.toString(),P.toRaw(p).toString(),P.toRaw(h).toString(),c.toString(),u.toString());return[a.toNumber(),Number(w)*1e6,l.toNumber()]}async subscribeUpdates(){let[e]=this.pools,t=e.tokens.map(a=>a.id),r=[],s=await this.api.query.omnipool.assets.multi(t,a=>{e.tokens=a.map((l,c)=>{let u=e.tokens[c];if(l.isNone)return u;let p=l.unwrap();return this.updateTokenState(u,p)})});r.push(s);let i=await this.api.query.dynamicFees.assetFee.multi(t,a=>{a.forEach((l,c)=>{let u=t[c];this.dynamicFees.set(u,l)})});if(r.push(i),this.isAssetConfigSupported()){let a=await this.api.query.dynamicFees.assetFeeConfiguration.multi(t,l=>{l.forEach((c,u)=>{let p=t[u];this.dynamicFeesConfiguration.set(p,c)})});r.push(a)}let o=t.map(a=>{let l=this.getOracleKey(a);return[Ot,l,It]}),n=await this.api.query.emaOracle.oracles.multi(o,a=>{a.forEach(async(l,c)=>{let u=o[c],[p,h,g]=u;this.oracles.set(h.join(":"),l)})});return r.push(n),()=>{for(let a of r)try{a()}catch(l){console.warn("Omnipool unsubscribe failed",l)}}}updateTokenState(e,t){let{hubReserve:r,shares:s,tradable:i,cap:o,protocolShares:n}=t;return{...e,hubReserves:m(r.toString()),shares:m(s.toString()),cap:m(o.toString()),protocolShares:m(n.toString()),tradeable:i.bits.toNumber()}}};import{calculate_in_given_out as Dr,calculate_out_given_in as Mr,calculate_pool_trade_fee as Lr,get_spot_price as Hr,calculate_liquidity_in as Gr,calculate_shares as Ur,calculate_spot_price as qr,calculate_spot_price_with_fee as Wr,calculate_liquidity_out_asset_a as Xr,calculate_liquidity_out_asset_b as Vr}from"@galacticcouncil/math-xyk";var Y=class{static getSpotPrice(e,t,r){return Hr(e,t,r)}static calculateInGivenOut(e,t,r){return Dr(e,t,r)}static calculateOutGivenIn(e,t,r){return Mr(e,t,r)}static calculatePoolTradeFee(e,t,r){return Lr(e,t,r)}static calculateLiquidityIn(e,t,r){return Gr(e,t,r)}static calculateSpotPrice(e,t){return qr(e,t)}static calculateSpotPriceWithFee(e,t,r,s){return Wr(e,t,r,s)}static calculateShares(e,t,r){return Ur(e,t,r)}static calculateLiquidityOutAssetA(e,t,r,s){return Xr(e,t,r,s)}static calculateLiquidityOutAssetB(e,t,r,s){return Vr(e,t,r,s)}};var Ue=class d{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new d(e)}constructor(e){this.type="Xyk",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let o=m(s.balance),n=m(i.balance),a=m(s.existentialDeposit),l=m(i.existentialDeposit);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:o,balanceOut:n,assetInED:a,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateTradeFee(s,r),o=P.toPct(r.exchangeFee),n=s.plus(i),a=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&a.push("InsufficientTradingAmount");let l=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(l)&&a.push("MaxOutRatioExceeded");let c=e.balanceIn.div(this.maxInRatio);return n.isGreaterThan(c)&&a.push("MaxInRatioExceeded"),{amountIn:n,calculatedIn:s,amountOut:t,feePct:o,errors:a}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateTradeFee(s,r),o=P.toPct(r.exchangeFee),n=s.minus(i),a=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&a.push("InsufficientTradingAmount");let l=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(l)&&a.push("MaxInRatioExceeded");let c=e.balanceOut.div(this.maxOutRatio);return n.isGreaterThan(c)&&a.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:n,feePct:o,errors:a}}calculateInGivenOut(e,t){let r=Y.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=m(r);return s.isNegative()?v:s}calculateOutGivenIn(e,t){let r=Y.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=m(r);return s.isNegative()?v:s}spotPriceInGivenOut(e){let t=Y.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),r=A(R,18-e.decimalsOut);return m(t).div(r)}spotPriceOutGivenIn(e){let t=Y.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),r=A(R,18-e.decimalsIn);return m(t).div(r)}calculateTradeFee(e,t){let r=Y.calculatePoolTradeFee(e.toString(),t.exchangeFee[0],t.exchangeFee[1]);return m(r)}};var qe=class extends D{getPoolType(){return"Xyk"}getPoolLimits(){let e=this.api.consts.xyk.maxInRatio.toNumber(),t=this.api.consts.xyk.maxOutRatio.toNumber(),r=this.api.consts.xyk.minTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}isSupported(){return this.api.query.xyk!==void 0}async loadPools(){let t=(await this.api.query.xyk.poolAssets.entries()).map(async([{args:[r]},s])=>{let i=r.toString(),[o,n]=s.unwrap(),[a,l]=await Promise.all([this.getBalance(i,o.toString()),this.getBalance(i,n.toString())]);return{address:i,type:"Xyk",tokens:[{id:o.toString(),balance:a.toString()},{id:n.toString(),balance:l.toString()}],...this.getPoolLimits()}});return Promise.all(t)}async getPoolFees(e,t,r){return{exchangeFee:this.getExchangeFee()}}getExchangeFee(){let[e,t]=this.api.consts.xyk.getExchangeFee;return P.fromRate(e.toNumber(),t.toNumber())}async subscribeUpdates(){return()=>{}}};import{calculate_in_given_out as Yr,calculate_out_given_in as Kr,calculate_amplification as $r,calculate_add_one_asset as Qr,calculate_liquidity_out_one_asset as jr,calculate_shares as zr,calculate_shares_for_amount as Jr,calculate_spot_price_with_fee as Zr,pool_account_name as es,recalculate_peg as ts}from"@galacticcouncil/math-stableswap";var k=class{static getPoolAddress(e){return es(e)}static defaultPegs(e){let t=[];for(let r=0;r<e;r++)t.push(["1","1"]);return t}static calculateAmplification(e,t,r,s,i){return $r(e,t,r,s,i)}static calculateInGivenOut(e,t,r,s,i,o,n){return Yr(e,t,r,s,i,o,n)}static calculateAddOneAsset(e,t,r,s,i,o,n){return Qr(e,t,r,s,i,o,n)}static calculateSharesForAmount(e,t,r,s,i,o,n){return Jr(e,t,r,s,i,o,n)}static calculateOutGivenIn(e,t,r,s,i,o,n){return Kr(e,t,r,s,i,o,n)}static calculateLiquidityOutOneAsset(e,t,r,s,i,o,n){return jr(e,t,r,s,i,o,n)}static calculateShares(e,t,r,s,i,o){return zr(e,t,r,s,i,o)}static calculateSpotPriceWithFee(e,t,r,s,i,o,n,a){return Zr(e,t,r,s,i,o,n,a)}static recalculatePegs(e,t,r,s,i,o){let n=ts(e,t,r,s,i,o);return JSON.parse(n)}};var Z=class d{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;pegs;pegsFee;static fromPool(e){return new d(e)}constructor(e){this.type="Stableswap",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.amplification=e.amplification,this.id=e.id,this.fee=e.fee,this.totalIssuance=e.totalIssuance,this.pegs=e.pegs,this.pegsFee=e.pegsFee}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let o=m(s.balance),n=m(i.balance),a=m(s.existentialDeposit),l=m(i.existentialDeposit);return{assetIn:e,assetOut:t,balanceIn:o,balanceOut:n,decimalsIn:s.decimals,decimalsOut:i.decimals,tradeableIn:this.id===e?15:s.tradeable,tradeableOut:this.id===t?15:i.tradeable,assetInED:a,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),o=i.minus(s),n=s===v?v:o.div(s).multipliedBy(100).decimalPlaces(4),a=[],l=F.isSellAllowed(e.tradeableIn),c=F.isBuyAllowed(e.tradeableOut);return(!l||!c)&&a.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&a.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:n.toNumber(),errors:a}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,r),n=s.minus(i).div(s).multipliedBy(100).decimalPlaces(4),a=[],l=F.isSellAllowed(e.tradeableIn),c=F.isBuyAllowed(e.tradeableOut);return(!l||!c)&&a.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&a.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:n.toNumber(),errors:a}}calculateIn(e,t,r){let s=k.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?P.toRaw(r.fee).toString():v.toString(),this.getPegs()),i=m(s);return i.isNegative()?v:i}calculateAddOneAsset(e,t,r){let s=k.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,r?P.toRaw(r.fee).toString():v.toString(),this.getPegs()),i=m(s);return i.isNegative()?v:i}calculateSharesForAmount(e,t,r){let s=k.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,r?P.toRaw(r.fee).toString():v.toString(),this.getPegs()),i=m(s);return i.isNegative()?v:i}calculateInGivenOut(e,t,r){return e.assetOut==this.id?this.calculateAddOneAsset(e,t,r):e.assetIn==this.id?this.calculateSharesForAmount(e,t,r):this.calculateIn(e,t,r)}spotPriceInGivenOut(e){let t=k.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetOut,e.assetIn,this.totalIssuance,"0",this.getPegs());if(e.assetOut==this.id)return m(t);if(e.assetIn==this.id){let s=A(R,e.decimalsIn-e.decimalsOut);return m(t).div(s).decimalPlaces(0,1)}let r=A(R,18-e.decimalsIn);return m(t).div(r).decimalPlaces(0,1)}calculateOut(e,t,r){let s=k.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?P.toRaw(r.fee).toString():v.toString(),this.getPegs()),i=m(s);return i.isNegative()?v:i}calculateWithdrawOneAsset(e,t,r){let s=k.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,r?P.toRaw(r.fee).toString():v.toString(),this.getPegs()),i=m(s);return i.isNegative()?v:i}calculateShares(e,t,r){let s=k.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,r?P.toRaw(r.fee).toString():v.toString(),this.getPegs()),i=m(s);return i.isNegative()?v:i}calculateOutGivenIn(e,t,r){return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t,r):e.assetOut==this.id?this.calculateShares(e,t,r):this.calculateOut(e,t,r)}spotPriceOutGivenIn(e){let t=k.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetIn,e.assetOut,this.totalIssuance,"0",this.getPegs());if(e.assetIn==this.id)return m(t);if(e.assetOut==this.id){let s=A(R,e.decimalsOut-e.decimalsIn);return m(t).div(s).decimalPlaces(0,1)}let r=A(R,18-e.decimalsOut);return m(t).div(r).decimalPlaces(0,1)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let e=this.tokens.filter(t=>t.id!=this.id).map(({id:t,balance:r,decimals:s})=>({asset_id:Number(t),amount:r,decimals:s}));return JSON.stringify(e)}getAssets(e,t){let r={asset_id:Number(e),amount:t.toFixed(0)};return JSON.stringify([r])}};import{blake2AsHex as rs,encodeAddress as ss}from"@polkadot/util-crypto";var We=class extends D{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(e){let t=Number(e),r=k.getPoolAddress(t);return ss(rs(r),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:this.api.consts.stableswap.minTradingLimit.toNumber()}}async getPoolDelta(e,t,r){let{initialAmplification:s,finalAmplification:i,initialBlock:o,finalBlock:n}=t,a=k.calculateAmplification(s.toString(),i.toString(),o.toString(),n.toString(),r),l=await this.api.query.tokens.totalIssuance(e);return{amplification:a,totalIssuance:l.toString()}}async getPoolTokens(e,t,r){let{assets:s}=r,i=s.map(async o=>{let[n,a]=await Promise.all([this.api.query.stableswap.assetTradability(t,o.toString()),this.getBalance(e,o.toString())]);return{id:o.toString(),tradeable:n.bits.toNumber(),balance:a.toString()}});return Promise.all(i)}isSupported(){return this.api.query.stableswap!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.stableswap.pools.entries(),this.api.query.system.number()]),r=t.toNumber(),s=e.map(async([{args:[o]},n])=>{try{let a=n.unwrap(),l=o.toString(),c=this.getPoolAddress(l),[u,p,h]=await Promise.all([this.getPoolDelta(l,a,r.toString()),this.getPoolTokens(c,l,a),this.getPoolPegs(l,a,r.toString())]);return p.push({id:l,tradeable:15,balance:u.totalIssuance}),this.poolsData.set(c,a),{address:c,id:l,type:"Stableswap",fee:P.fromPermill(a.fee.toNumber()),tokens:p,...u,...h,...this.getPoolLimits()}}catch(a){return console.warn(`Skipping pool ${o.toString()}
2
2
  `,String(a)),null}});return(await Promise.all(s)).filter(o=>o!==null)}async getPoolFees(e,t,r){return{fee:this.pools.find(i=>i.address===r).pegsFee}}async getPoolPegs(e,t,r){let s=await this.api.query.stableswap.poolPegs(e);if(s.isNone)return this.getDefaultPegs(t);let i=s.unwrap(),o=await this.getLatestPegs(t,i,r),n=o.map(({pair:y,updatedAt:S})=>[y,S]),a=this.getRecentPegs(i),l=P.fromPermill(t.fee.toNumber()),c=P.fromPerbill(i.maxPegUpdate.toNumber()),u=o.find(y=>y.source),p=i.updatedAt?i.updatedAt.toString():u?.updatedAt;if(!p)throw Error(e+" current peg unknown");let[h,g]=k.recalculatePegs(JSON.stringify(a),p,JSON.stringify(n),r,P.toRaw(c).toString(),P.toRaw(l).toString()),b=Number(h)*1e6;return{pegsFee:P.fromPermill(b),pegs:g}}getDefaultPegs(e){let t=e.fee,r=k.defaultPegs(e.assets.length);return{pegsFee:P.fromPermill(t.toNumber()),pegs:r}}getRecentPegs(e){let{current:t}=e;return Array.from(t.entries()).map(([r,s])=>s.map(i=>i.toString()))}async getLatestPegs(e,t,r){let{source:s}=t,i=Array.from(e.assets.entries()).map(([n,a])=>a.toString()),o=s.map(async(n,a)=>{if(n.isOracle){let[l,c,u]=n.asOracle,p=[u.toString(),i[a]].map(B=>Number(B)).sort((B,O)=>B-O),h=await this.api.query.emaOracle.oracles(l,p,c),[{price:g,updatedAt:b}]=h.unwrap(),y=g.n.toString(),S=g.d.toString();return{pair:u.toString()===p[0].toString()?[y,S]:[S,y],updatedAt:b.toString(),source:"ema"}}else if(n.isMmOracle){let l=n.asMmOracle,{price:c,decimals:u,updatedAt:p}=await this.mmOracle.getData(l.toString()),h=10**u;return{pair:[c.toString(),h.toString()],updatedAt:p.toString(),source:"mm"}}else{if(n.isValue)return{pair:n.asValue.map(c=>c.toString()),updatedAt:r};throw Error(n.type+" is not supported")}});return Promise.all(o)}async subscribeUpdates(){return this.api.query.system.number(async e=>{let t=e.toString();this.pools.forEach(async r=>{let s=this.poolsData.get(r.address);if(s){let[i,o]=await Promise.all([this.getPoolDelta(r.id,s,t),this.getPoolPegs(r.id,s,t)]),n=r.tokens.map(a=>a.id===r.id?{...a,balance:i.totalIssuance}:a);Object.assign(r,{tokens:n},i,o)}})})}};import{calculate_collateral_in_given_hollar_out as is,calculate_collateral_out_given_hollar_in as as,calculate_hollar_in_given_collateral_out as ns,calculate_hollar_out_given_collateral_in as os,calculate_imbalance as ls,calculate_max_price as cs,calculate_buyback_limit as us,calculate_buyback_price_with_fee as ms}from"@galacticcouncil/math-hsm";var W=class{static calculateCollateralInGivenHollarOut(e,t,r){return is(e,t,r)}static calculateCollateralOutGivenHollarIn(e,t,r){return as(e,t,r)}static calculateHollarOutGivenCollateralIn(e,t,r){return os(e,t,r)}static calculateHollarInGivenCollateralOut(e,t,r){return ns(e,t,r)}static calculateImbalance(e,t,r){return ls(e,t,r)}static calculateBuybackLimit(e,t){return us(e,t)}static calculateBuybackPriceWithFee(e,t,r){return ms(e,t,r)}static calculateMaxPrice(e,t){return cs(e,t)}};var Xe=class d extends Z{hsmAddress;hsmMintCapacity;hollarId;hollarH160;collateralId;collateralBalance;maxBuyPriceCoefficient;maxInHolding;purchaseFee;buyBackFee;buyBackRate;static fromPool(e){return new d(e)}constructor(e){super(e),this.type="Hsm",this.hsmAddress=e.hsmAddress,this.hsmMintCapacity=e.hsmMintCapacity,this.hollarId=e.hollarId,this.hollarH160=e.hollarH160,this.collateralId=e.collateralId,this.collateralBalance=e.collateralBalance,this.maxBuyPriceCoefficient=e.maxBuyPriceCoefficient,this.maxInHolding=e.maxInHolding,this.purchaseFee=e.purchaseFee,this.buyBackFee=e.buyBackFee,this.buyBackRate=e.buyBackRate}validatePair(e,t){return!0}parsePair(e,t){return super.parsePair(e,t)}validateTradeHollarIn(e,t,r,s){let i=this.calculateBuybackLimit(e);t.gt(i)&&s.push("MaxBuyBackExceeded");let o=this.calculateBuyPrice(e,t,r),n=this.calculateMaxPrice(e);return o.gt(n)&&s.push("MaxBuyPriceExceeded"),r.gt(this.collateralBalance)&&s.push("InsufficientCollateral"),s}validateTradeHollarOut(e,t,r){return this.collateralBalance.plus(e).gt(this.maxInHolding)&&r.push("MaxHoldingExceeded"),t.gt(this.hsmMintCapacity)&&r.push("FacilitatorCapacityExceeded"),r}validateTradeConstraints(e,t,r){let s=[];return e.assetIn===this.hollarId?this.validateTradeHollarIn(e,t,r,s):this.validateTradeHollarOut(t,r,s)}validateAndBuy(e,t){let r=this.calculateInGivenOut(e,t),s=this.validateTradeConstraints(e,r,t);return{amountIn:r,calculatedIn:r,amountOut:t,feePct:0,errors:s}}validateAndSell(e,t){let r=this.calculateOutGivenIn(e,t),s=this.validateTradeConstraints(e,t,r);return{amountIn:t,calculatedOut:r,amountOut:r,feePct:0,errors:s}}calculateHollarInGivenCollateralOut(e,t){let r=super.calculateInGivenOut(e,t,{fee:this.fee}),s=W.calculateHollarInGivenCollateralOut(t.toFixed(0),r.toFixed(0),P.toRaw(this.buyBackFee).toString());return m(s)}calculateCollateralInGivenHollarOut(e){let t=this.getCollateralPeg(),r=W.calculateCollateralInGivenHollarOut(e.toFixed(0),JSON.stringify(t),P.toRaw(this.purchaseFee).toString());return m(r)}calculateInGivenOut(e,t){return e.assetOut==this.hollarId?this.calculateCollateralInGivenHollarOut(t):this.calculateHollarInGivenCollateralOut(e,t)}calculateCollateralOutGivenHollarIn(e,t){let r=super.calculateOutGivenIn(e,t,{fee:this.fee}),s=W.calculateCollateralOutGivenHollarIn(t.toFixed(0),r.toFixed(0),P.toRaw(this.buyBackFee).toString());return m(s)}calculateHollarOutGivenCollateralIn(e){let t=this.getCollateralPeg(),r=W.calculateHollarOutGivenCollateralIn(e.toFixed(0),JSON.stringify(t),P.toRaw(this.purchaseFee).toString());return m(r)}calculateOutGivenIn(e,t){return e.assetIn==this.hollarId?this.calculateCollateralOutGivenHollarIn(e,t):this.calculateHollarOutGivenCollateralIn(t)}calculateImbalance(e){let t=this.getCollateralPeg(),r=W.calculateImbalance(e.balanceIn.toString(),JSON.stringify(t),e.balanceOut.toString());return m(r)}calculateBuybackLimit(e){let t=this.calculateImbalance(e),r=W.calculateBuybackLimit(t.toString(),P.toRaw(this.buyBackRate).toString());return m(r)}calculateBuyPrice(e,t,r){let s=t.dividedBy(m(10).pow(e.decimalsIn));return r.dividedBy(m(10).pow(e.decimalsOut)).dividedBy(s)}calculateMaxPrice(e){let t=this.getCollateralPeg(),r=W.calculateMaxPrice(JSON.stringify(t),this.maxBuyPriceCoefficient.toFixed(0)),[s,i]=JSON.parse(r);return m(s).div(m(i)).shiftedBy(-1*e.decimalsOut)}spotPriceInGivenOut(e){let t=A(R,e.decimalsOut);return this.calculateInGivenOut(e,t)}spotPriceOutGivenIn(e){let t=A(R,e.decimalsIn);return this.calculateOutGivenIn(e,t)}getCollateralPeg(){let e=this.tokens.findIndex(s=>s.id!==this.hollarId),t=this.pegs[e],r=this.tokens[e].decimals;return this.isDefaultPeg(t)?[A(R,18).toString(),A(R,r).toString()]:t}isDefaultPeg(e){let[t,r]=e;return Array.isArray(e)&&e.length===2&&t==="1"&&r==="1"}};import{stringToU8a as At}from"@polkadot/util";import{encodeAddress as Ft}from"@polkadot/util-crypto";import{decodeEventLog as ps}from"viem";var le=[{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 ce=class{rpcAdapter;constructor(e){this.rpcAdapter=e.getRPCAdapter()}async getFacilitatorCapacity(e,t){let[r,s]=await this.rpcAdapter.readContract({abi:le,address:e,functionName:"getFacilitatorBucket",args:[t]});return r-s}};var ds=["FacilitatorBucketCapacityUpdated","FacilitatorBucketLevelUpdated"],Ve=class extends D{stableClient;ghoTokenClient;constructor(e,t,r){super(e,t),this.stableClient=r,this.ghoTokenClient=new ce(t)}getPoolType(){return"Hsm"}getPoolId(e){let t="hsm:"+e;return Ft(At(t.padEnd(32,"\0")),63)}getFacilitatorAddress(){return Ft(At("modlpy/hsmod".padEnd(32,"\0")),63)}getHollarAddress(e){return _e(e,"accountKey20").accountKey20.key}isSupported(){return this.api.query.hsm!==void 0}async loadPools(){let e=this.api.consts.hsm.hollarId.toString(),[t,r,s]=await Promise.all([this.api.query.assetRegistry.assetLocations(e),this.api.query.hsm.collaterals.entries(),this.stableClient.getPoolsMem()]);if(r.length===0)return[];let i=this.getFacilitatorAddress(),o=X.fromAny(i),n=this.getHollarAddress(t.unwrap()),a=await this.ghoTokenClient.getFacilitatorCapacity(n,o),l=r.map(async([{args:[u]},p])=>{let h=p.unwrap(),g=u.toString(),{poolId:b,maxBuyPriceCoefficient:y,maxInHolding:S,purchaseFee:f,buyBackFee:B,buybackRate:O}=h,T=s.find(w=>w.id===b.toString());if(T){let w=this.getPoolId(b.toString()),C=await this.getBalance(i,g);return{...T,address:w,type:"Hsm",tokens:T.tokens.filter(M=>M.id!==b.toString()),hsmAddress:i,hsmMintCapacity:m(a),hollarId:e,hollarH160:n,collateralId:g,collateralBalance:C,maxBuyPriceCoefficient:m(y.toString()),maxInHolding:m(S.unwrap().toString()),purchaseFee:P.fromPermill(f.toNumber()),buyBackFee:P.fromPermill(B.toNumber()),buyBackRate:P.fromPerbill(O.toNumber())}}});return(await Promise.all(l)).filter(u=>u!==null)}async getPoolFees(e,t,r){return{}}onEvents(e){e.forEach(async t=>{let{event:r}=t;if(`${r.section}:${r.method}`==="evm:Log"){let[i]=r.data.toJSON();try{let{eventName:o,args:n}=ps({abi:le,topics:i.topics,data:i.data}),[a]=this.pools,{hsmAddress:l,hollarH160:c}=a,u=X.fromAny(l),p=u.toLowerCase()===n.facilitatorAddress.toLowerCase();if(ds.includes(o)&&p){let h=await this.ghoTokenClient.getFacilitatorCapacity(c,u);this.log(`Sync HSM facilitator via [evm:Log] :: ${o} ${h}`),this.pools.forEach(g=>{Object.assign(g,{hsmMintCapacity:h})})}}catch{}}})}async subscribeBalances(){let e=[],t=[],r=[];for(let i of this.pools){let{tokens:o,hsmAddress:n,collateralId:a}=i;o.find(c=>c.id===a).type==="Erc20"?t.push([n,a]):e.push([n,a])}let s=i=>{i.forEach(([o,n])=>{let[a,l]=o,c=this.pools.find(u=>u.tokens.some(p=>p.id===l));c&&Object.assign(c,{collateralBalance:n})})};if(e.length>0){let i=await this.subscribeTokenBalances(e,s);r.push(i)}if(t.length>0){let i=await this.subscribeErc20Balances(t,s);r.push(i)}return()=>{for(let i of r)try{i()}catch(o){console.warn("Balance unsub failed",o)}}}async subscribeUpdates(){return()=>{}}};var ue=class extends _{api;evm;assetClient;aaveClient;xykClient;omniClient;lbpClient;stableClient;hsmClient;clients=[];onChainAssets=[];block=0;blockHandlers=[];eventHandlers=[];disconnectSubscribeNewHeads=null;disconnectSubscribeEvents=null;memRegistry=gs(e=>(this.log(`Registry mem ${e} sync`),this.syncRegistry()));constructor(e,t){super(e),this.api=e,this.evm=t,this.assetClient=new Q(this.api),this.aaveClient=new De(this.api,t),this.xykClient=new qe(this.api,t),this.omniClient=new Ge(this.api,t),this.lbpClient=new Le(this.api,t),this.stableClient=new We(this.api,t),this.hsmClient=new Ve(this.api,t,this.stableClient),this.clients=[this.aaveClient,this.xykClient,this.omniClient,this.lbpClient,this.stableClient,this.hsmClient],this.blockHandlers=this.clients.map(r=>r.onNewBlockHandler),this.eventHandlers=this.clients.map(r=>r.onEventsHandler),this.api.rpc.chain.subscribeNewHeads(async r=>{let s=r.number.toNumber();this.onNewBlock(s)}).then(r=>{this.disconnectSubscribeNewHeads=r}),this.api.query.system.events(r=>{this.onEvents(r)}).then(r=>{this.disconnectSubscribeEvents=r})}onNewBlock(e){this.block=e;for(let t of this.blockHandlers)try{t(e)}catch(r){this.log("onNewBlock handler error",r)}}onEvents(e){for(let t of this.eventHandlers)try{t(e)}catch(r){this.log("onEvents handler error",r)}}get assets(){return this.onChainAssets}get isRegistrySynced(){return this.onChainAssets.length>0}async syncRegistry(e){let t=await this.assetClient.getOnChainAssets(!1,e);this.clients.forEach(r=>r.withAssets(t)),this.onChainAssets=t}async getPools(e={}){this.isRegistrySynced||await this.memRegistry(1);let{includeOnly:t=[],exclude:r=[]}=e;return t.length>0?this.getFilteredPools(s=>t.includes(s.getPoolType())):r.length>0?this.getFilteredPools(s=>!r.includes(s.getPoolType())):this.getFilteredPools(s=>s.isSupported())}async getFilteredPools(e){let t=this.clients.filter(e);return(await Promise.all(t.map(s=>s.getPoolsMem()))).flat()}destroy(){this.aaveClient.unsubscribe(),this.xykClient.unsubscribe(),this.omniClient.unsubscribe(),this.lbpClient.unsubscribe(),this.stableClient.unsubscribe(),this.hsmClient.unsubscribe(),this.disconnectSubscribeNewHeads?.(),this.disconnectSubscribeEvents?.()}async getPoolFees(e,t){switch(t.type){case"Aave":return this.aaveClient.getPoolFees(this.block,e,t.address);case"Xyk":return this.xykClient.getPoolFees(this.block,e,t.address);case"Omnipool":return this.omniClient.getPoolFees(this.block,e,t.address);case"Lbp":return this.lbpClient.getPoolFees(this.block,e,t.address);case"Stableswap":return this.stableClient.getPoolFees(this.block,e,t.address);case"Hsm":return this.hsmClient.getPoolFees(this.block,e,t.address);default:throw new Re(t.type)}}};var me=class extends ue{feeCache=new Map;constructor(e,t){super(e,t)}onNewBlock(e){super.onNewBlock(e),this.feeCache.clear()}async getPoolFees(e,t){let r=[t.address,e.assetIn,e.assetOut].join("-");if(this.feeCache.has(r))return this.feeCache.get(r);let s=super.getPoolFees(e,t);return this.feeCache.set(r,s),s}async destroy(){this.feeCache.clear(),super.destroy()}};var pe=class{static get(e){switch(e.type){case"Aave":return ke.fromPool(e);case"Xyk":return Ue.fromPool(e);case"Omnipool":return He.fromPool(e);case"Lbp":return Me.fromPool(e);case"Stableswap":return Z.fromPool(e);case"Hsm":return Xe.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};import{sha256 as hs}from"@noble/hashes/sha2";import{bytesToHex as ys}from"@noble/hashes/utils";function Kc(d){let e=d.map(s=>s.address).sort().join(":"),t=new TextEncoder().encode(e),r=hs(t);return ys(r)}var de=class{constructor(e=1/0){this.capacity=e}storage=[];enqueue(e){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(e)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var bs=10,ge=class{isNotVisited(e,t){let r=!0;return t.forEach(s=>{(s[0]===e[0]||s[1]===e[1])&&(r=!1)}),r}findPaths(e,t,r){let s=[],i=new de,o=[];for(o.push([t,""]),i.enqueue(o);i.size()>0;){let n=i.dequeue();if(!n||n.length>bs)continue;let a=n[n.length-1];(r===null||a[0]===r)&&s.push(n),e.get(a[0])?.forEach(c=>{if(this.isNotVisited(c,n)){let u=[...n];u.push(c),i.enqueue(u)}})}return s}findShortestPaths(e,t,r){let s=[],i=new de,o=[];o.push([t,""]),i.enqueue(o);let n=1/0;for(;i.size()>0;){let a=i.dequeue();if(!a)continue;let l=a[a.length-1];if(l[0]===r){a.length<n?(n=a.length,s.length=0,s.push(a)):a.length===n&&s.push(a);continue}let c=e.get(l[0]);for(let u of c??[])this.isNotVisited(u,a)&&i.enqueue([...a,u])}return s}buildAndPopulateGraph(e,t){let r=new Map;for(let s of e)r.set(parseInt(s),[]);for(let[s,i,o]of t){let n=parseInt(i),a=parseInt(o);r.get(n)?.push([a,s])}return r}};function it(d){let e={};for(let t of d){let r=t.tokens.length;for(let s=0;s<r;s++){e[t.tokens[s].id]||(e[t.tokens[s].id]=[]);for(let i=0;i<r;i++){if(s==i)continue;let o=[t.address,t.tokens[s].id,t.tokens[i].id];e[t.tokens[s].id].push(o)}}}return e}var he=class{getProposals(e,t,r){let s=r.filter(f=>f.type==="Xyk"),i=r.filter(f=>f.type!=="Xyk"),o=parseInt(e),n=parseInt(t),a=new Set(i.map(f=>f.tokens).flat().map(f=>f.id)),l=a.has(e),c=a.has(t),u=new ge,p=f=>{let B=it(f),O=Object.keys(B),T=O.flatMap(w=>B[w]);return u.buildAndPopulateGraph(O,T)};if(!l&&!c){let f=s.filter(T=>T.tokens.find(w=>w.id===e)||T.tokens.find(w=>w.id===t)),B=p(f),O=u.findPaths(B,o,n);return this.parsePaths(O)}if(l&&c){let f=p(i),B=u.findPaths(f,o,n);return this.parsePaths(B)}let h=l?t:e,g=s.filter(f=>f.tokens.some(B=>B.id===h));if(g.length===0)return[];let b=[...i,...g],y=p(b),S=u.findPaths(y,o,n);return this.parsePaths(S)}parsePaths(e){let t=[];for(let r of e){let s=[];for(let i=0;i<r.length;i++){let o=r[i],n=r[i+1];if(n==null)break;s.push(this.toEdge(o,n))}t.push(s)}return t}toEdge(e,t){return[t[1],e[0].toString(),t[0].toString()]}};var ye=class{routeSuggester;routeProposals;routerOptions;poolService;constructor(e,t={}){this.poolService=e,this.routeSuggester=new he,this.routeProposals=new Map,this.routerOptions=Object.freeze(t)}buildRouteKey(e,t,r){return`${e}->${t}::${r.length}`}async getPools(){return this.poolService.getPools(this.routerOptions)}async getAllAssets(){let e=await this.getPools(),t=this.getAssets(e);return[...new Map(t).values()]}async getRouteableAssets(e){let t=await this.getAllAssets();return(await Promise.all(t.map(s=>s.id).filter(s=>s!==e).map(s=>this.getRoutes(s,e)))).filter(s=>s.length>0).map(([s])=>s[0].assetIn).sort()}async getRoutes(e,t){let r=await this.getPools();return this.validateInput(e,t,r),this.getPaths(e,t,r)}validateInput(e,t,r){if(r.length===0)throw new Error("No pools configured");if(e===t)throw new Error("Trading pair can't be identical");let s=this.getAssets(r);if(s.get(e)===null)throw new Error(e+" is not supported asset");if(s.get(t)===null)throw new Error(t+" is not supported asset");return this.toPoolsMap(r)}getAssets(e){let t=e.map(r=>r.tokens.map(s=>({id:s.id,name:s.name,symbol:s.symbol,decimals:s.decimals,icon:s.icon,type:s.type,isSufficient:s.isSufficient,existentialDeposit:s.existentialDeposit,meta:s.meta,location:s.location,isWhiteListed:s.isWhiteListed}))).flat();return new Map(t.map(r=>[r.id,r]))}getPaths(e,t,r){let s=this.toPoolsMap(r);return this.getProposals(e,t,r).filter(n=>this.validPath(n,s)).map(n=>this.toHops(n,s))}getProposals(e,t,r){let s=this.buildRouteKey(e,t,r);if(this.routeProposals.has(s))return this.routeProposals.get(s);let i=this.routeSuggester.getProposals(e,t,r);return this.routeProposals.set(s,i),i}validPath(e,t){return e.length>0&&e.map(r=>this.validEdge(r,t)).reduce((r,s)=>r&&s)}validEdge([e,t,r],s){return s.get(e)?.validatePair(t,r)||!1}toPoolsMap(e){return new Map(e.map(t=>[t.address,pe.get(t)]))}toHops(e,t){return e.map(([r,s,i])=>{let o=t.get(r);return{poolAddress:r,poolId:o?.id,pool:o?.type,assetIn:s,assetOut:i}})}};var Ps=m("100");function Mu(d,e){return d.minus(e).abs().div(d.plus(e).div(2)).multipliedBy(100).decimalPlaces(2)}function be(d,e){return d.minus(e).div(e).multipliedBy(100).decimalPlaces(2)}function Rt(d,e){return R.minus(e.div(d)).multipliedBy(100).decimalPlaces(4)}function Nt(d,e){return e.div(d).minus(R).multipliedBy(100).decimalPlaces(4)}function z(d,e){return(e<.01||e>100)&&new Error("Supported range is from 0.01% - 100%"),d.div(Ps).multipliedBy(e).decimalPlaces(0,1)}var at=(t=>(t.Buy="Buy",t.Sell="Sell",t))(at||{}),nt=(r=>(r.Dca="Dca",r.TwapSell="TwapSell",r.TwapBuy="TwapBuy",r))(nt||{}),Et=(r=>(r.OrderTooSmall="OrderTooSmall",r.OrderTooBig="OrderTooBig",r.OrderImpactTooBig="OrderImpactTooBig",r))(Et||{});var ee=class extends ye{mlr;poolsSnapshot;constructor(e,t={}){super(e,t),this.mlr=new Map}buildCtxSync(e,t){let r=this.poolsSnapshot,s=super.validateInput(e,t,r),i=super.getPaths(e,t,r);if(!i.length)throw new Ne(e,t);return{paths:i,pools:r,poolsMap:s}}async withCtx(e,t,r){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let s=this.buildCtxSync(e,t);return r(s)}isDirectTrade(e){return e.length==1}findBestSellRoute(e){let t=e.sort((r,s)=>{let i=r[r.length-1].amountOut,o=s[s.length-1].amountOut;return i.isGreaterThan(o)?-1:1});return t.find(r=>r.every(s=>s.errors.length==0))||t[0]}getRouteFeeRange(e){if(e.filter(r=>r.tradeFeeRange).length>0){let r=e.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,o)=>i+o),s=e.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,o)=>i+o);return[r,s]}}getPoolFeeRange(e){let t=e.min?P.toPct(e.min):void 0,r=e.max?P.toPct(e.max):void 0;if(t&&r)return[t,r]}async getBestSell(e,t,r){return this.getSell(e,t,r)}async getSell(e,t,r,s){return this.withCtx(e,t,async({paths:i,poolsMap:o})=>{let n;if(s)n=await this.toSellSwaps(r,s,o);else{let a=i.map(c=>this.toSellSwaps(r,c,o)),l=await Promise.all(a);n=this.findBestSellRoute(l)}return this.buildSell(o,n)})}async getSellTrades(e,t,r){return this.withCtx(e,t,async({paths:s,poolsMap:i})=>{let o=s.map(a=>this.toSellSwaps(r,a,i));return(await Promise.all(o)).filter(a=>a.every(l=>l.errors.length==0)).map(a=>this.buildSell(i,a)).sort((a,l)=>a.amountOut.isGreaterThan(l.amountOut)?-1:1)})}buildSell(e,t){let r=t[0],s=t[t.length-1],i=this.isDirectTrade(t),o=t.map(b=>b.spotPrice.shiftedBy(-1*b.assetOutDecimals)).reduce((b,y)=>b.multipliedBy(y)),n=A(o,s.assetOutDecimals),a=i?s.calculatedOut:this.calculateDelta0Y(r.amountIn,t,e),l=s.amountOut,c=i?s.tradeFeePct:Rt(a,l).toNumber(),u=a.minus(l),p=this.getRouteFeeRange(t),h=r.amountIn.shiftedBy(-1*r.assetInDecimals).multipliedBy(n),g=be(a,h);return{type:"Sell",amountIn:r.amountIn,amountOut:s.amountOut,spotPrice:n,tradeFee:u,tradeFeePct:c,tradeFeeRange:p,priceImpactPct:g.toNumber(),swaps:t,toHuman(){return{type:"Sell",amountIn:I(r.amountIn,r.assetInDecimals),amountOut:I(s.amountOut,s.assetOutDecimals),spotPrice:I(n,s.assetOutDecimals),tradeFee:I(u,s.assetOutDecimals),tradeFeePct:c,tradeFeeRange:p,priceImpactPct:g.toNumber(),swaps:t.map(b=>b.toHuman())}}}}calculateDelta0Y(e,t,r){let s=[];for(let i=0;i<t.length;i++){let o=t[i],n=r.get(o.poolAddress);if(n==null)throw new Error("Pool does not exit");let a=n.parsePair(o.assetIn,o.assetOut),l;i>0?l=s[i-1]:l=e;let c=n.calculateOutGivenIn(a,l);s.push(c)}return s[s.length-1]}async calculateMostLiquidRoute(e,t,r){let{paths:s,pools:i,poolsMap:o}=r,c=i.filter(y=>y.tokens.some(S=>S.id===e)).map(y=>y.type==="Aave"?y.tokens:y.tokens.filter(S=>S.id===e)).map(y=>y.map(S=>m(S.balance).shiftedBy(-1*S.decimals)).reduce((S,f)=>S.plus(f))).sort((y,S)=>S.isLessThan(y)?-1:1)[0].div(100).multipliedBy(.1),u=s.map(async y=>await this.toSellSwaps(c,y,o)),p=await Promise.all(u),g=this.findBestSellRoute(p).map(y=>({poolAddress:y.poolAddress,poolId:y?.poolId,pool:y.pool,assetIn:y.assetIn,assetOut:y.assetOut})),b=this.buildRouteKey(e,t,i);return this.mlr.set(b,g),g}async toSellSwaps(e,t,r){let s=[],i=[];for(let a=0;a<t.length;a++){let l=t[a],c=r.get(l.poolAddress);if(!c)throw new Error("Pool does not exit");let u=c.parsePair(l.assetIn,l.assetOut);s[a]=c,i[a]=u}let o=await Promise.all(i.map((a,l)=>this.poolService.getPoolFees(a,s[l]))),n=[];for(let a=0;a<t.length;a++){let l=t[a],c=s[a],u=o[a],p=i[a],h;a>0?h=n[a-1].amountOut:h=A(m(e),p.decimalsIn).decimalPlaces(0,1);let{amountOut:g,calculatedOut:b,feePct:y,errors:S}=c.validateAndSell(p,h,u),f=this.getPoolFeeRange(u),B=c.spotPriceOutGivenIn(p),O=h.shiftedBy(-1*p.decimalsIn).multipliedBy(B),T=be(b,O),w=c.type==="Aave";n.push({...l,assetInDecimals:p.decimalsIn,assetOutDecimals:p.decimalsOut,amountIn:h,amountOut:g,calculatedOut:b,spotPrice:B,tradeFeePct:y,tradeFeeRange:f,priceImpactPct:T.toNumber(),errors:S,isSupply:()=>w&&c.tokens[0].id===l.assetIn,isWithdraw:()=>w&&c.tokens[1].id===l.assetIn,toHuman(){return{...l,amountIn:I(h,p.decimalsIn),amountOut:I(g,p.decimalsOut),calculatedOut:I(b,p.decimalsOut),spotPrice:I(B,p.decimalsOut),tradeFeePct:y,priceImpactPct:T.toNumber(),errors:S}}})}return n}async getMostLiquidRoute(e,t){return this.withCtx(e,t,async r=>{let s=this.buildRouteKey(e,t,r.pools),i=this.mlr.get(s);return i||this.calculateMostLiquidRoute(e,t,r)})}async getBestSpotPrice(e,t){return this.withCtx(e,t,async r=>{let{pools:s,poolsMap:i}=r,o=this.buildRouteKey(e,t,s),n=this.mlr.get(o);n||(n=await this.calculateMostLiquidRoute(e,t,r));let a=await this.toSellSwaps("1",n,i),l=a.map(p=>p.spotPrice.shiftedBy(-1*p.assetOutDecimals)).reduce((p,h)=>p.multipliedBy(h)),c=a[a.length-1].assetOutDecimals;return{amount:A(l,c),decimals:c}}).catch(()=>{})}findBestBuyRoute(e){let t=e.sort((r,s)=>{let i=r[0].amountIn,o=s[0].amountIn;return i.isGreaterThan(o)?1:-1});return t.find(r=>r.every(s=>s.errors.length==0))||t[0]}async getBestBuy(e,t,r){return this.getBuy(e,t,r)}async getBuy(e,t,r,s){return this.withCtx(e,t,async({paths:i,poolsMap:o})=>{let n;if(s)n=await this.toBuySwaps(r,s,o);else{let a=i.map(c=>this.toBuySwaps(r,c,o)),l=await Promise.all(a);n=this.findBestBuyRoute(l)}return this.buildBuy(o,n)})}async getBuyTrades(e,t,r){return this.withCtx(e,t,async({paths:s,poolsMap:i})=>{let o=s.map(a=>this.toBuySwaps(r,a,i));return(await Promise.all(o)).filter(a=>a.every(l=>l.errors.length==0)).map(a=>this.buildBuy(i,a)).sort((a,l)=>a.amountIn.isGreaterThan(l.amountIn)?1:-1)})}buildBuy(e,t){let r=t[t.length-1],s=t[0],i=this.isDirectTrade(t),o=t.map(b=>b.spotPrice.shiftedBy(-1*b.assetInDecimals)).reduce((b,y)=>b.multipliedBy(y)),n=A(o,s.assetInDecimals),a=i?s.calculatedIn:this.calculateDelta0X(r.amountOut,t,e),l=s.amountIn,c=i?s.tradeFeePct:Nt(a,l).toNumber(),u=l.minus(a),p=this.getRouteFeeRange(t),h=r.amountOut.shiftedBy(-1*r.assetOutDecimals).multipliedBy(n),g;return a.isZero()?g=-100:g=be(h,a).toNumber(),{type:"Buy",amountOut:r.amountOut,amountIn:s.amountIn,spotPrice:n,tradeFee:u,tradeFeePct:c,tradeFeeRange:p,priceImpactPct:g,swaps:t,toHuman(){return{type:"Buy",amountOut:I(r.amountOut,r.assetOutDecimals),amountIn:I(s.amountIn,s.assetInDecimals),spotPrice:I(n,s.assetInDecimals),tradeFee:I(u,s.assetInDecimals),tradeFeePct:c,tradeFeeRange:p,priceImpactPct:g,swaps:t.map(b=>b.toHuman())}}}}calculateDelta0X(e,t,r){let s=[];for(let i=t.length-1;i>=0;i--){let o=t[i],n=r.get(o.poolAddress);if(n==null)throw new Error("Pool does not exit");let a=n.parsePair(o.assetIn,o.assetOut),l;i==t.length-1?l=e:l=s[0];let c=n.calculateInGivenOut(a,l);s.unshift(c)}return s[0]}async toBuySwaps(e,t,r){let s=[],i=[];for(let a=0;a<t.length;a++){let l=t[a],c=r.get(l.poolAddress);if(!c)throw new Error("Pool does not exit");let u=c.parsePair(l.assetIn,l.assetOut);s[a]=c,i[a]=u}let o=await Promise.all(i.map((a,l)=>this.poolService.getPoolFees(a,s[l]))),n=[];for(let a=t.length-1;a>=0;a--){let l=t[a],c=s[a],u=o[a],p=i[a],h;a==t.length-1?h=A(m(e),p.decimalsOut).decimalPlaces(0,1):h=n[0].amountIn;let{amountIn:g,calculatedIn:b,feePct:y,errors:S}=c.validateAndBuy(p,h,u),f=this.getPoolFeeRange(u),B=c.spotPriceInGivenOut(p),O=h.shiftedBy(-1*p.decimalsOut).multipliedBy(B),T;b.isZero()?T=-100:T=be(O,b).toNumber(),n.unshift({...l,assetInDecimals:p.decimalsIn,assetOutDecimals:p.decimalsOut,amountIn:g,amountOut:h,calculatedIn:b,spotPrice:B,tradeFeePct:y,tradeFeeRange:f,priceImpactPct:T,errors:S,isSupply(){return c.type==="Aave"&&c.tokens[0].id===l.assetIn},isWithdraw(){return c.type==="Aave"&&c.tokens[1].id===l.assetIn},toHuman(){return{...l,amountIn:I(g,p.decimalsIn),amountOut:I(h,p.decimalsOut),calculatedIn:I(b,p.decimalsIn),spotPrice:I(B,p.decimalsIn),tradeFeePct:y,tradeFeeRange:f,priceImpactPct:T,errors:S}}})}return n}};var Ct=6e3,kt=m(1e15),Pe=6,ot=-5,lt=360*60*1e3,nm=3,_t=6;var U=class{static build(e){return e.map(({assetIn:t,assetOut:r,pool:s,poolId:i})=>s==="Stableswap"?{pool:{Stableswap:i},assetIn:t,assetOut:r}:{pool:s,assetIn:t,assetOut:r})}};var fe=class{schedulerOptions;router;constructor(e,t={}){this.router=e,this.schedulerOptions=Object.freeze({blockTime:t.blockTime??Ct,minBudgetInNative:t.minBudgetInNative??kt})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(e,t,r,s,i){let[o,n]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,r)]),{amountIn:a,swaps:l,priceImpactPct:c}=n,u=l[0],p=l[l.length-1],{assetInDecimals:h}=u,{assetOutDecimals:g}=p,b=Math.abs(c),y=this.getMinimumTradeCount(a,o),S=this.getOptimalTradeCount(b),f=i?Math.round(s/i):S,B=Math.ceil(s/y),O=Math.round(s/S),T=Math.round(s/f),w=a.dividedBy(f).decimalPlaces(0,1),C=await this.router.getBestSell(e,t,I(w,h)),M=a.isLessThan(o),Be=[];M&&Be.push("OrderTooSmall");let xe=C.amountOut.multipliedBy(f),$e=this.toBlockPeriod(T),Qe=C.tradeFee.multipliedBy(f),je=U.build(l),ve={assetIn:e,assetOut:t,errors:Be,frequencyMin:B,frequencyOpt:O,frequency:T,tradeCount:f,tradeFee:Qe,tradeImpactPct:C.priceImpactPct,tradePeriod:$e,tradeRoute:je,type:"Dca"};return{...ve,amountIn:a,amountOut:xe,tradeAmountIn:C.amountIn,tradeAmountOut:C.amountOut,toHuman(){return{...ve,amountIn:I(a,h),amountOut:I(xe,g),tradeAmountIn:I(C.amountIn,h),tradeAmountOut:I(C.amountOut,g)}}}}async getMinimumOrderBudget(e){if("0"===e)return this.minOrderBudget;let t=await this.router.getBestSpotPrice("0",e);if(t)return this.minOrderBudget.times(t.amount).div(m(10).pow(12)).decimalPlaces(0,1);throw new Error("Unable to calculate order budget")}getMinimumTradeCount(e,t){let r=t.multipliedBy(.2),s=e.dividedBy(r).toNumber();return Math.round(s)}getOptimalTradeCount(e){let t=Math.round(e*10)||1;return Math.max(t,3)}async getTwapSellOrder(e,t,r){let[s,i]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,r)]),{amountIn:o,swaps:n,priceImpactPct:a}=i,l=n[0],c=n[n.length-1],{assetInDecimals:u}=l,{assetOutDecimals:p}=c,h=Math.abs(a),g=this.getTwapTradeCount(h),b=o.dividedBy(g).decimalPlaces(0,1),y=await this.router.getBestSell(l.assetIn,c.assetOut,I(b,u)),S=g===1,f=o.isLessThan(s),B=y.priceImpactPct<ot,O=[];f||S?O.push("OrderTooSmall"):B&&O.push("OrderImpactTooBig");let T=y.amountOut.multipliedBy(g),w=y.tradeFee.multipliedBy(g),C=U.build(n),M={assetIn:e,assetOut:t,errors:O,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:Pe,tradeRoute:C,type:"TwapSell"};return{...M,amountIn:o,amountOut:T,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:w,toHuman(){return{...M,amountIn:I(o,u),amountOut:I(T,p),tradeAmountIn:I(y.amountIn,u),tradeAmountOut:I(y.amountOut,p),tradeFee:I(w,p)}}}}async getTwapBuyOrder(e,t,r){let[s,i]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestBuy(e,t,r)]),{amountOut:o,swaps:n,priceImpactPct:a}=i,l=n[0],c=n[n.length-1],{assetInDecimals:u}=l,{assetOutDecimals:p}=c,h=Math.abs(a),g=this.getTwapTradeCount(h),b=o.dividedBy(g).decimalPlaces(0,1),y=await this.router.getBestBuy(l.assetIn,c.assetOut,I(b,p)),S=y.amountIn.multipliedBy(g),f=g===1,B=S.isLessThan(s),O=y.priceImpactPct<ot,T=[];B||f?T.push("OrderTooSmall"):O&&T.push("OrderImpactTooBig");let w=y.tradeFee.multipliedBy(g),C=U.build(n),M={assetIn:e,assetOut:t,errors:T,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:Pe,tradeRoute:C,type:"TwapBuy"};return{...M,amountIn:S,amountOut:o,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:w,toHuman(){return{...M,amountIn:I(S,u),amountOut:I(o,p),tradeAmountIn:I(y.amountIn,u),tradeAmountOut:I(y.amountOut,p),tradeFee:I(w,u)}}}}getTwapTradeCount(e){let t=this.getOptimalTradeCount(e);if(this.getTwapExecutionTime(t)>lt){let s=lt/(this.blockTime*Pe);return Math.round(s)}return t}getTwapExecutionTime(e){return e*Pe*this.blockTime}toBlockPeriod(e){let t=e/this.blockTime,r=Math.round(t);return Math.max(r,_t)}};var te=class extends _{evm;evmClient;balanceClient;aaveUtils;constructor(e,t){super(e),this.evm=t,this.evmClient=t.getWsProvider(),this.balanceClient=new G(e),this.aaveUtils=new $(t)}wrapTx(e,t,r){return{hex:t.toHex(),name:e,extraGas:r,get:()=>t,dryRun:s=>this.dryRun(s,t)}}async dryRun(e,t){let r;try{r=await this.api.call.dryRunApi.dryRunCall({System:{Signed:e}},t.inner.toHex())}catch(s){throw console.error(s),new Error("Dry run execution failed!")}if(r.isOk)return r.asOk;throw console.log(r.asErr.toHuman()),new Error("Dry run execution error!")}dispatchWithExtraGas(e){return this.api.tx.dispatcher.dispatchWithExtraGas(e.inner.toHex(),J)}isDirectOmnipoolTrade(e){return e.length===1&&e[0].pool==="Omnipool"}};var Ye=class extends te{_trade;_beneficiary;_slippagePct=1;setTrade(e){return this._trade=e,this}withBeneficiary(e){return this._beneficiary=e,this}withSlippage(e){return this._slippagePct=e,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:e,swaps:t,type:r}=this.trade;if(r==="Buy")return this.buildBuyTx();let s=t[0],{assetIn:i,assetOut:o}=s,a=(await this.balanceClient.getBalance(this.beneficiary,i)).minus(5),l=!0;return s.isWithdraw()&&(l=(await this.aaveUtils.getMaxWithdraw(this.beneficiary,o)).amount.isGreaterThanOrEqualTo(a)),l&&e.isGreaterThanOrEqualTo(a)?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:e,amountOut:t,swaps:r}=this.trade,s=r[0],i=r[r.length-1],o=z(e,this.slippagePct),n=s.assetIn,a=i.assetOut,l=e.plus(o),c;if(this.isDirectOmnipoolTrade(r)?c=this.api.tx.omnipool.buy(a,n,t.toFixed(),l.toFixed()):c=this.api.tx.router.buy(n,a,t.toFixed(),l.toFixed(),U.build(r)),await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let p=this.dispatchWithExtraGas(c);return this.wrapTx("RouterBuy",p,J)}return this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:e,amountOut:t,swaps:r}=this.trade,s=r[0],i=r[r.length-1],o=z(t,this.slippagePct),n=s.assetIn,a=i.assetOut,l=t.minus(o),c;if(this.isDirectOmnipoolTrade(r)?c=this.api.tx.omnipool.sell(n,a,e.toFixed(),l.toFixed()):c=this.api.tx.router.sell(n,a,e.toFixed(),l.toFixed(),U.build(r)),await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let p=this.dispatchWithExtraGas(c);return this.wrapTx("RouterSell",p,J)}return this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:e,swaps:t}=this.trade,r=t[0],s=t[t.length-1],i=z(e,this.slippagePct),o=r.assetIn,n=s.assetOut,a=e.minus(i),l=this.api.tx.router.sellAll(o,n,a.toFixed(),U.build(t));if(await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let u=this.dispatchWithExtraGas(l);return this.wrapTx("RouterSellAll",u,J)}return this.wrapTx("RouterSellAll",l)}};var Ke=class extends te{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(e){return this._order=e,this}withBeneficiary(e){return this._beneficiary=e,this}withMaxRetries(e){return this._maxRetries=e,this}withSlippage(e){return this._slippagePct=e,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:e}=this.order;switch(e){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${e}`)}}buildDcaTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradePeriod:i,tradeRoute:o}=this.order,n=this.api.tx.dca.schedule({owner:this.beneficiary,period:i,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Sell:{assetIn:t,assetOut:r,amountIn:s.toFixed(),minAmountOut:"0",route:o}}},null);return this.wrapTx("DcaSchedule",n)}buildTwapSellTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:o,tradeRoute:n}=this.order,a=z(i,this.slippagePct),l=i.minus(a),c=this.api.tx.dca.schedule({owner:this.beneficiary,period:o,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Sell:{assetIn:t,assetOut:r,amountIn:s.toFixed(),minAmountOut:l.toFixed(),route:n}}},null);return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:o,tradeRoute:n}=this.order,a=z(s,this.slippagePct),l=s.plus(a),c=this.api.tx.dca.schedule({owner:this.beneficiary,period:o,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Buy:{assetIn:t,assetOut:r,amountOut:i.toFixed(),maxAmountIn:l.toFixed(),route:n}}},null);return this.wrapTx("DcaSchedule.twapBuy",c)}};var Se=class{api;evm;constructor(e,t){this.api=e,this.evm=t}trade(e){return new Ye(this.api,this.evm).setTrade(e)}order(e){return new Ke(this.api,this.evm).setOrder(e)}};var fs={router:{}};function sp(d,e=fs){let t=new ne(d),r=new Ce(d),s=new me(d,r),i=new $(r),o=new ee(s,e.router),n=new ee(s,{exclude:["Hsm"]}),a=new fe(n,{blockTime:t.blockTime,minBudgetInNative:t.minOrderBudget});return{api:{aave:i,router:o,scheduler:a},client:{asset:new Q(d),balance:new G(d),balanceV2:new ae(d)},ctx:{pool:s},evm:r,tx:new Se(d,r),destroy:()=>{s.destroy()}}}export{re as AaveClient,ke as AavePool,De as AavePoolClient,$ as AaveUtils,Q as AssetClient,ft as AssetNotFound,Ns as BASILISK_PARACHAIN_ID,G as BalanceClient,ae as BalanceClientV2,x as BigNumber,me as CachingPoolService,ne as ChainParams,Kt as DECIMAL_PLACES,Ct as DEFAULT_BLOCK_TIME,kt as DEFAULT_MIN_BUDGET,H as ERC20,Ce as EvmClient,Ee as EvmRpcAdapter,tt as FarmClient,X as H160,Te as HUB_ASSET_ID,Es as HYDRADX_PARACHAIN_ID,L as HYDRADX_SS58_PREFIX,qs as INFINITY,q as LbpMath,Me as LbpPool,Le as LbpPoolClient,oe as MmOracleClient,R as ONE,_t as ORDER_MIN_BLOCK_PERIOD,F as OmniMath,He as OmniPool,Ge as OmniPoolClient,ut as PERBILL_DENOMINATOR,K as PERMILL_DENOMINATOR,_ as PolkadotApiClient,Pt as PoolConfigNotFound,j as PoolError,pe as PoolFactory,Re as PoolNotFound,ue as PoolService,E as PoolType,xt as ProviderConfigNotFound,se as RUNTIME_DECIMALS,Ne as RouteNotFound,ye as Router,mt as SYSTEM_ASSET_DECIMALS,N as SYSTEM_ASSET_ID,k as StableMath,Z as StableSwap,We as StableSwapClient,St as StorageConfigNotFound,Bt as SubscriptionNotSupported,ie as TRADEABLE_DEFAULT,Pe as TWAP_BLOCK_PERIOD,lt as TWAP_MAX_DURATION,ot as TWAP_MAX_PRICE_IMPACT,nm as TWAP_TX_MULTIPLIER,Et as TradeOrderError,nt as TradeOrderType,U as TradeRouteBuilder,ee as TradeRouter,fe as TradeScheduler,at as TradeType,Se as TxBuilderFactory,Y as XykMath,Ue as XykPool,qe as XykPoolClient,v as ZERO,Na as bnFormatter,m as bnum,Nt as calculateBuyFee,Mu as calculateDiffToAvg,be as calculateDiffToRef,Rt as calculateSellFee,vt as createChain,sp as createSdkContext,_e as findNestedKey,Ra as findNestedObj,z as getFraction,Kc as hashPools,Xt as isEvmAccount,Vt as isEvmAddress,Yt as isSs58Address,A as scale,Ws as toBn,I as toDecimals};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@galacticcouncil/sdk",
3
- "version": "10.5.0",
3
+ "version": "10.6.0",
4
4
  "description": "Galactic off-chain routing & optimization of orders across pools for best price execution",
5
5
  "author": "GalacticCouncil",
6
6
  "repository": {