@galacticcouncil/sdk-next 0.8.0-pr203-e2c1241 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var ur=Object.create;var de=Object.defineProperty;var mr=Object.getOwnPropertyDescriptor;var pr=Object.getOwnPropertyNames;var dr=Object.getPrototypeOf,gr=Object.prototype.hasOwnProperty;var xn=(u,t)=>()=>(u&&(t=u(u=0)),t);var I=(u,t)=>{for(var e in t)de(u,e,{get:t[e],enumerable:!0})},pe=(u,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of pr(t))!gr.call(u,r)&&r!==e&&de(u,r,{get:()=>t[r],enumerable:!(n=mr(t,r))||n.enumerable});return u},ft=(u,t,e)=>(pe(u,t,"default"),e&&pe(e,t,"default")),nt=(u,t,e)=>(e=u!=null?ur(dr(u)):{},pe(t||!u||!u.__esModule?de(e,"default",{value:u,enumerable:!0}):e,u)),yr=u=>pe(de({},"__esModule",{value:!0}),u);var Dt={};var On=xn(()=>{ft(Dt,require("@polkadot-api/ws-provider/node"))});var Mt={};var An=xn(()=>{ft(Mt,require("@polkadot-api/ws-provider/web"))});var Xr={};I(Xr,{aave:()=>Ye,api:()=>Re,big:()=>f,client:()=>Xe,const:()=>qe,createSdkContext:()=>Yr,erc20:()=>dt,error:()=>ze,evm:()=>$e,farm:()=>tn,fmt:()=>O,h160:()=>Nt,json:()=>lt,math:()=>A,pool:()=>ln,sor:()=>yn,staking:()=>Pn,tx:()=>Sn,xc:()=>We});module.exports=yr(Xr);var Re={};I(Re,{Papi:()=>D,getWs:()=>br});var vn=require("@galacticcouncil/descriptors");function In(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var D=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(vn.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");In(n)&&console.log(t,...e)}};var Bn=require("polkadot-api"),_n=require("polkadot-api/polkadot-sdk-compat"),br=async u=>{let t=typeof u=="string"?u.split(","):u,r=(typeof window>"u"?(await Promise.resolve().then(()=>(On(),Dt))).getWsProvider:(await Promise.resolve().then(()=>(An(),Mt))).getWsProvider)(t);return(0,Bn.createClient)((0,_n.withPolkadotSdkCompat)(r))};var Ye={};I(Ye,{AAVE_GAS_LIMIT:()=>Ee,AAVE_LENDING_POOL_ADDRESS:()=>be,AAVE_POOL_ABI:()=>Fe,AAVE_POOL_DATA_PROVIDER:()=>ye,AAVE_POOL_DATA_PROVIDER_ABI:()=>ge,AAVE_POOL_PROXY:()=>ke,AAVE_ROUNDING_THRESHOLD:()=>li,AAVE_UINT_256_MAX:()=>hr,AaveClient:()=>Lt,AaveUtils:()=>gt});var Fe=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"to",type:"address"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"interestRateMode",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"address",name:"onBehalfOf",type:"address"}],name:"borrow",outputs:[],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getUserAccountData",outputs:[{internalType:"uint256",name:"totalCollateralBase",type:"uint256"},{internalType:"uint256",name:"totalDebtBase",type:"uint256"},{internalType:"uint256",name:"availableBorrowsBase",type:"uint256"},{internalType:"uint256",name:"currentLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"ltv",type:"uint256"},{internalType:"uint256",name:"healthFactor",type:"uint256"}],stateMutability:"view",type:"function"}];var ge=[{inputs:[{internalType:"contract IEACAggregatorProxy",name:"_networkBaseTokenPriceInUsdProxyAggregator",type:"address"},{internalType:"contract IEACAggregatorProxy",name:"_marketReferenceCurrencyPriceInUsdProxyAggregator",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"ETH_CURRENCY_UNIT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MKR_ADDRESS",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_bytes32",type:"bytes32"}],name:"bytes32ToString",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"decimals",type:"uint256"},{internalType:"uint256",name:"baseLTVasCollateral",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationBonus",type:"uint256"},{internalType:"uint256",name:"reserveFactor",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabled",type:"bool"},{internalType:"bool",name:"borrowingEnabled",type:"bool"},{internalType:"bool",name:"stableBorrowRateEnabled",type:"bool"},{internalType:"bool",name:"isActive",type:"bool"},{internalType:"bool",name:"isFrozen",type:"bool"},{internalType:"uint128",name:"liquidityIndex",type:"uint128"},{internalType:"uint128",name:"variableBorrowIndex",type:"uint128"},{internalType:"uint128",name:"liquidityRate",type:"uint128"},{internalType:"uint128",name:"variableBorrowRate",type:"uint128"},{internalType:"uint128",name:"stableBorrowRate",type:"uint128"},{internalType:"uint40",name:"lastUpdateTimestamp",type:"uint40"},{internalType:"address",name:"aTokenAddress",type:"address"},{internalType:"address",name:"stableDebtTokenAddress",type:"address"},{internalType:"address",name:"variableDebtTokenAddress",type:"address"},{internalType:"address",name:"interestRateStrategyAddress",type:"address"},{internalType:"uint256",name:"availableLiquidity",type:"uint256"},{internalType:"uint256",name:"totalPrincipalStableDebt",type:"uint256"},{internalType:"uint256",name:"averageStableRate",type:"uint256"},{internalType:"uint256",name:"stableDebtLastUpdateTimestamp",type:"uint256"},{internalType:"uint256",name:"totalScaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"priceInMarketReferenceCurrency",type:"uint256"},{internalType:"address",name:"priceOracle",type:"address"},{internalType:"uint256",name:"variableRateSlope1",type:"uint256"},{internalType:"uint256",name:"variableRateSlope2",type:"uint256"},{internalType:"uint256",name:"stableRateSlope1",type:"uint256"},{internalType:"uint256",name:"stableRateSlope2",type:"uint256"},{internalType:"uint256",name:"baseStableBorrowRate",type:"uint256"},{internalType:"uint256",name:"baseVariableBorrowRate",type:"uint256"},{internalType:"uint256",name:"optimalUsageRatio",type:"uint256"},{internalType:"bool",name:"isPaused",type:"bool"},{internalType:"bool",name:"isSiloedBorrowing",type:"bool"},{internalType:"uint128",name:"accruedToTreasury",type:"uint128"},{internalType:"uint128",name:"unbacked",type:"uint128"},{internalType:"uint128",name:"isolationModeTotalDebt",type:"uint128"},{internalType:"bool",name:"flashLoanEnabled",type:"bool"},{internalType:"uint256",name:"debtCeiling",type:"uint256"},{internalType:"uint256",name:"debtCeilingDecimals",type:"uint256"},{internalType:"uint8",name:"eModeCategoryId",type:"uint8"},{internalType:"uint256",name:"borrowCap",type:"uint256"},{internalType:"uint256",name:"supplyCap",type:"uint256"},{internalType:"uint16",name:"eModeLtv",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationThreshold",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationBonus",type:"uint16"},{internalType:"address",name:"eModePriceSource",type:"address"},{internalType:"string",name:"eModeLabel",type:"string"},{internalType:"bool",name:"borrowableInIsolation",type:"bool"}],internalType:"struct IUiPoolDataProviderV3.AggregatedReserveData[]",name:"",type:"tuple[]"},{components:[{internalType:"uint256",name:"marketReferenceCurrencyUnit",type:"uint256"},{internalType:"int256",name:"marketReferenceCurrencyPriceInUsd",type:"int256"},{internalType:"int256",name:"networkBaseTokenPriceInUsd",type:"int256"},{internalType:"uint8",name:"networkBaseTokenPriceDecimals",type:"uint8"}],internalType:"struct IUiPoolDataProviderV3.BaseCurrencyInfo",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"},{internalType:"address",name:"user",type:"address"}],name:"getUserReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"uint256",name:"scaledATokenBalance",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabledOnUser",type:"bool"},{internalType:"uint256",name:"stableBorrowRate",type:"uint256"},{internalType:"uint256",name:"scaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"principalStableDebt",type:"uint256"},{internalType:"uint256",name:"stableBorrowLastUpdateTimestamp",type:"uint256"}],internalType:"struct IUiPoolDataProviderV3.UserReserveData[]",name:"",type:"tuple[]"},{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"marketReferenceCurrencyPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"networkBaseTokenPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"}];var ke="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",ye="0x112b087b60C1a166130d59266363C45F8aa99db0",be="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Ee=1000000n,li=5,hr=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Lt=class{client;constructor(t){this.client=t.getWsProvider()}async getBlockTimestamp(){let t=await this.client.getBlock();return Number(t.timestamp)}async getReservesData(){return await this.client.readContract({abi:ge,address:ye,args:[be],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:ge,address:ye,args:[be,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:Fe,address:ke,args:[t],functionName:"getUserAccountData"})}};var it=nt(require("big.js"));var f={};I(f,{asBigInt:()=>Sr,toBigInt:()=>fr,toDecimal:()=>Pr});var ot=nt(require("big.js"));ot.default.NE=-18;function Pr(u,t,e=6,n){let r=(0,ot.default)(u.toString()),i=(0,ot.default)(10).pow(t);return r.div(i).round(e,n).toString()}function fr(u,t){let e=(0,ot.default)(10).pow(t),r=(0,ot.default)(u).mul(e).toFixed(0,ot.default.roundDown);return BigInt(r)}function Sr(u){return BigInt(u.round(0,ot.default.roundDown).toFixed(0))}var dt={};I(dt,{ERC20:()=>Ce});var Ce=class{static fromAssetId(t){let e=Buffer.alloc(20,0);return e[15]=1,e.writeUInt32BE(t,16),"0x"+e.toString("hex")}static toAssetId(t){let e=Buffer.from(t.replace("0x",""),"hex");return e.length!==20||!this.isAssetAddress(t)?null:e.readUInt32BE(16)}static isAssetAddress(t){let e=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(t.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(e.subarray(0,16))}};var O={};I(O,{FeeUtils:()=>Ne,shiftNeg:()=>xr});var Rn=nt(require("big.js"));var qe={};I(qe,{HUB_ASSET_ID:()=>Le,HYDRATION_OMNIPOOL_ADDRESS:()=>wr,HYDRATION_PARACHAIN_ID:()=>Tr,HYDRATION_SS58_PREFIX:()=>G,PERBILL_DENOMINATOR:()=>De,PERMILL_DENOMINATOR:()=>qt,RUNTIME_DECIMALS:()=>_,SYSTEM_ASSET_DECIMALS:()=>Me,SYSTEM_ASSET_ID:()=>N,TRADEABLE_DEFAULT:()=>St});var _=18,qt=1e6,De=1e9,N=0,Me=12,Tr=2034,G=63,wr="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Le=1,St=15;var Ne=class u{static toPct(t){let[e,n]=t;return u.safeDivide(e*100,n)}static toRaw(t){let[e,n]=t;return u.safeDivide(e,n)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,n=12){let r=10**n;return Math.round(t*r/e)/r}static safeRound(t){return parseFloat(t.toPrecision(15))}};function xr(u,t){let e=(0,Rn.default)(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Nt={};I(Nt,{H160:()=>Ve,isEvmAccount:()=>Fn,isEvmAddress:()=>kn,isSs58Address:()=>En});var Tt=require("polkadot-api"),Ge=require("@polkadot-api/utils"),rt=require("buffer");var Ue="ETH\0";function Fn(u){if(!u)return!1;try{let t=(0,Tt.AccountId)().enc(u),e=rt.Buffer.from(Ue);return rt.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function kn(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function En(u){try{return(0,Tt.AccountId)(63).enc(u),!0}catch{return!1}}var Ve=class u{static toAccount=t=>{let e=rt.Buffer.from(t.slice(2),"hex"),n=rt.Buffer.from(Ue),r=Uint8Array.from(rt.Buffer.concat([n,e,rt.Buffer.alloc(8)])),i=(0,Ge.toHex)(r);return(0,Tt.AccountId)(63).dec(i)};static fromAccount=t=>{let e=(0,Tt.AccountId)().enc(t),n=rt.Buffer.from(Ue),r=e.slice(n.length,-8);return"0x"+rt.Buffer.from(r).toString("hex")};static fromSS58=t=>{let n=(0,Tt.AccountId)().enc(t).slice(0,20);return(0,Ge.toHex)(n)};static fromAny=t=>{if(kn(t))return t;if(Fn(t))return u.fromAccount(t);if(En(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var lt={};I(lt,{findNestedKey:()=>Ir,findNestedObj:()=>vr,jsonFormatter:()=>Or});var Ir=(u,t)=>{let e=[];return JSON.stringify(u,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},vr=(u,t,e)=>{let n;return JSON.stringify(u,(r,i)=>(i&&i[t]===e&&(n=i),i)),n},Or=(u,t)=>typeof t=="bigint"?t.toString():t;var A={};I(A,{calculateBuyFee:()=>Rr,calculateDiffToAvg:()=>Ar,calculateDiffToRef:()=>Br,calculateSellFee:()=>_r,getFraction:()=>Fr});var Q=nt(require("big.js"));function Ar(u,t){let e=(0,Q.default)(u.toString()),n=(0,Q.default)(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Br(u,t){if(t===0n)return 0;let e=(0,Q.default)(u.toString()),n=(0,Q.default)(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function _r(u,t){let e=(0,Q.default)(u.toString()),n=(0,Q.default)(t.toString());return(0,Q.default)(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Rr(u,t){let e=(0,Q.default)(u.toString());return(0,Q.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Fr(u,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),r=BigInt(t*n);return u*r/BigInt(100*n)}var We={};I(We,{convertToId:()=>kr});var Cn=require("buffer");function kr(u){let e=Cn.Buffer.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:he}=dt,{H160:He}=Nt,Er=1.01,Cr=31536000n,Pe=10n**27n,gt=class{client;constructor(t){this.client=new Lt(t)}async getSummary(t){let e=He.fromAny(t),[n,r,i,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e),this.client.getBlockTimestamp()]),[s]=n,[o,l]=r,[c,m,d,p,g,b]=i,y=f.toDecimal(b,18),h=[];for(let P of o){let S=P.underlyingAsset.toLowerCase(),T=s.find(({underlyingAsset:_e})=>_e.toLowerCase()===S);if(!T)throw new Error("Missing pool reserve for "+S);let q=P.scaledATokenBalance,U=T.liquidityIndex,k=T.liquidityRate,M=T.availableLiquidity,j=T.priceInMarketReferenceCurrency,$=a+6,V=this.calculateLinearInterest(k,T.lastUpdateTimestamp,$),at=U*V/Pe,Ct=q*at/Pe,ce=Number(l!==0&&l===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,ue=T.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,me=he.toAssetId(S);h.push({aTokenBalance:Ct,availableLiquidity:M,decimals:Number(T.decimals),isCollateral:ue,priceInRef:j,reserveId:me,reserveAsset:S,reserveLiquidationThreshold:ce})}return{healthFactor:Number(y),totalCollateral:c,totalDebt:m,reserves:h}}async hasBorrowPositions(t){let e=He.fromAny(t),n=await this.client.getUserAccountData(e),[r,i]=n;return i>0n}async getHealthFactor(t){let e=He.fromAny(t),n=await this.client.getUserAccountData(e),[r,i,a,s,o,l]=n,c=f.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:r,totalDebt:i,reserves:a}=await this.getSummary(t),s=he.fromAssetId(e),o=a.find(h=>h.reserveAsset===s);if(!o)throw new Error("Missing reserve ctx for "+s);let{decimals:l,isCollateral:c,priceInRef:m,reserveLiquidationThreshold:d}=o,p=f.toBigInt(n,l),g=c?p*m/10n**BigInt(l):0n,b=r-g;if(b<=0n)return 0;let y=(0,it.default)(b.toString()).mul(d).div(i.toString()).toFixed(6,it.default.roundDown);return Number(y)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:i,reserves:a}=await this.getSummary(t),s=he.fromAssetId(e),o=a.find(y=>y.reserveAsset===s);if(!o)throw new Error("Missing reserve ctx for "+s);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:m}=o,p=f.toBigInt(n,l)*c/10n**BigInt(l),g=r+p;if(g<=0n)return 0;let b=(0,it.default)(g.toString()).mul(m).div(i.toString()).toFixed(6,it.default.roundDown);return Number(b)}async getMaxWithdraw(t,e){let{totalDebt:n,reserves:r,healthFactor:i}=await this.getSummary(t),a=he.fromAssetId(e),s=r.find(o=>o.reserveAsset===a);if(!s)throw new Error("Missing reserve ctx for "+a);return this.calculateWithdrawMax(s,n,i)}async getMaxWithdrawAll(t){let{totalDebt:e,reserves:n,healthFactor:r}=await this.getSummary(t),i={};for(let a of n){let s=this.calculateWithdrawMax(a,e,r);a.reserveId&&(i[a.reserveId]=s)}return i}calculateWithdrawMax(t,e,n){let{aTokenBalance:r,availableLiquidity:i,decimals:a,priceInRef:s,reserveLiquidationThreshold:o,isCollateral:l}=t,c=r;if(l&&e>0n){let d=n-Er;if(d>0){let p=(0,it.default)(d).mul(e.toString()).div(o).toFixed(0,it.default.roundDown),g=(0,it.default)(p).div(s.toString()).mul(10**a).toFixed(0,it.default.roundDown);c=r<BigInt(g)?r:BigInt(g)}else c=0n}return{amount:c<i?c:i,decimals:a}}calculateLinearInterest(t,e,n){let r=n-e;if(r<=0)return Pe;let i=t*BigInt(r)/Cr;return Pe+i}};var Xe={};I(Xe,{AssetClient:()=>wt,BalanceClient:()=>J,ChainParams:()=>xt});var wt=class extends D{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(t){super(t)}async queryShares(){let e=await this.api.query.Stableswap.Pools.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:r}=n;return this.SUPPORTED_TYPES.includes(r.type)}).map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[i]=n;return[i,r]}))}async mapToken(t,e,n,r){let{name:i,asset_type:a,is_sufficient:s,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:i?.asText(),symbol:l,decimals:c,icon:l,type:a.type,isSufficient:s,location:r,existentialDeposit:o}}async mapBond(t,e,n,r){let[i,a]=r,{asset_type:s,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:m}=await this.mapToken(i,e,n),d=Number(a),p=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",p.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:m,icon:c,type:s.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:i,maturity:d}}async mapShares(t,e,n,r){let{assets:i}=r,{name:a,symbol:s,asset_type:o,is_sufficient:l,existential_deposit:c}=e,m=await Promise.all(i.map(async g=>{let{symbol:b}=await this.mapToken(g,e,n);return[g,b]})),d=Object.fromEntries(m),p=Object.values(d);return{id:t,name:p.join(", "),symbol:s?.asText()||a?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:d}}async mapExternal(t,e,n,r){let i=await this.mapToken(t,e,new Map,r),a=n?.find(s=>s.internalId===i.id);return a?{...i,decimals:a.decimals,name:a.name,symbol:a.symbol,icon:a.symbol,isWhiteListed:a.isWhiteListed}:i}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,r,i,a]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),s=this.parseMetadata(n),o=[];for(let[l,c]of Array.from(n)){let m=r.get(l),{asset_type:d}=c,p;switch(d.type){case"Bond":let g=a.get(l);p=await this.mapBond(l,c,s,g);break;case"StableSwap":let b=i.get(l);p=await this.mapShares(l,c,s,b);break;case"External":p=await this.mapExternal(l,c,e,m);break;default:p=await this.mapToken(l,c,s,m)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};var x=require("rxjs");var J=class extends D{constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getTokenBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:n}=await e.getValue(t);return this.calculateBalance(n)}async getTokenBalance(t,e){let r=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(r)}calculateBalance(t){let e=t.free>=t.frozen?t.free-t.frozen:0n,n=t.free+t.reserved;return{free:t.free,reserved:t.reserved,frozen:t.frozen,total:n,transferable:e}}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),r=this.subscribeErc20Balance(t);return(0,x.combineLatest)([e,n,r]).pipe((0,x.debounceTime)(250),(0,x.map)(i=>i.flat()),(0,x.startWith)([]),(0,x.bufferCount)(2,1),(0,x.map)(([i,a],s)=>{if(s===0)return a;let o=i.reduce((c,m)=>(c.set(m.id,m.balance),c),new Map);return a.filter(c=>!Dn(c.balance,o.get(c.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,x.map)(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,x.map)(r=>({id:e,balance:r})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,x.distinctUntilChanged)((n,r)=>!r.deltas),(0,x.map)(({deltas:n})=>{let r=[];return n?.deleted.forEach(i=>{let[a,s]=i.args;r.push({id:s,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(i=>{let[a,s]=i.args;r.push({id:s,balance:this.calculateBalance(i.value)})}),r}))}subscribeErc20Balance(t,e){let n=new x.Subject,r=n.pipe((0,x.shareReplay)(1)),i=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:c}=l;return c.type==="Erc20"}).map(({keyArgs:l})=>{let[c]=l;return c}),a=async()=>{let o=e||await i(),l=async()=>{let d=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,balance:g}));n.next(d)};await l();let c=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>c.unsubscribe()},s;return a().then(o=>s=o),r.pipe((0,x.finalize)(()=>s?.()),(0,x.pairwise)(),(0,x.map)(([o,l],c)=>{if(c===0)return l;let m=o.reduce((p,g)=>(p.set(g.id,g.balance),p),new Map);return l.filter(p=>!Dn(p.balance,m.get(p.id)))}),(0,x.distinctUntilChanged)((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},Dn=(u,t)=>u!==void 0&&t!==void 0&&u.transferable===t.transferable&&u.total===t.total;var xt=class extends D{_minOrderBudget;_blockTime;constructor(t){super(t)}async getBlockTime(){if(this._blockTime===void 0){let t=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(t)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};var ze={};I(ze,{AssetNotFound:()=>Ke,PoolNotFound:()=>Gt,RouteNotFound:()=>Ut});var Ke=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},Gt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},Ut=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var $e={};I($e,{EvmClient:()=>Vt,createChain:()=>je});var Mn=require("viem"),Dr=["https://hydration-rpc.n.dwellir.com","https://hydration.dotters.network","https://rpc.helikon.io/hydradx","https://hydration.ibp.network","https://rpc.cay.hydration.cloud","https://rpc.parm.hydration.cloud","https://rpc.roach.hydration.cloud","https://rpc.zipp.hydration.cloud","https://rpc.sin.hydration.cloud","https://rpc.coke.hydration.cloud"],je=()=>(0,Mn.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Dr}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});var Z=require("viem");var Vt=class{client;chain;constructor(t){this.client=t,this.chain=je()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return(0,Z.createPublicClient)({chain:this.chain,transport:(0,Z.http)()})}getWsProvider(){return(0,Z.createPublicClient)({transport:(0,Z.custom)({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return(0,Z.createWalletClient)({account:t,chain:this.chain,transport:(0,Z.custom)(window.ethereum)})}};var tn={};I(tn,{LiquidityMiningApi:()=>Wt,LiquidityMiningClient:()=>Ht});var Nn=require("polkadot-api"),L=nt(require("big.js")),Ze=require("@galacticcouncil/math-liquidity-mining");var fe=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let n=0;n<t.length;++n){let[r,i]=t[n];this.result.set(this.getKey(i,r),e[n].free)}}freeBalance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,n,r){let i=this.getKey(t,e),a=this.getKey(t,n),s=this.result.get(i)??0n,o=this.result.get(a)??0n;if(s<r)throw new Error("Attempting to transfer more than is present");this.result.set(i,s+r),this.result.set(a,o+r)}};var ct=nt(require("big.js")),K=require("@galacticcouncil/math-liquidity-mining");var Qe=nt(require("big.js")),Je=(0,Qe.default)(10).pow(18),Ln=BigInt((0,Qe.default)(1).pow(18).toString()),qn=6e3;var Mr="1000000000000000000",Se=class{constructor(t,e,n){this.getAccount=t;this.getAsset=e;this.multiCurrency=n}async syncGlobalFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===e)return null;if(t.total_shares_z===0n)return t;let r=await this.getAsset(t.reward_currency),i=e-t.updated_at,a=this.getAccount(t.id),s=r?.existential_deposit;if(!s)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.freeBalance(t.reward_currency,a),l=(0,ct.default)(s.toString()),c=(0,ct.default)(o.toString()).minus(l.lt(o.toString())?s.toString():o.toString()),m=(0,ct.default)((0,K.calculate_global_farm_rewards)(t.total_shares_z.toString(),n.toString(),(0,ct.default)(t.yield_per_period.toString()).mul(Je).round(0,ct.default.roundDown).toFixed(),t.max_reward_per_period.toString(),i.toFixed()));if(c.lt(m)&&(m=c),m.eq(0))return t;let d=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,a,d,BigInt(m.toFixed())),{...t,accumulated_rpz:BigInt((0,K.calculate_accumulated_rps)(t.accumulated_rpz.toString(),t.total_shares_z.toString(),m.toFixed()))}}syncYieldFarm(t,e,n){if(t.state.type!=="Active"||t.updated_at===n)return null;if(t.total_valued_shares===0n)return{...t,updated_at:n};let r=(0,K.calculate_yield_farm_delta_rpvs)(t.accumulated_rpz.toString(),e.accumulated_rpz.toString(),t.multiplier.toString(),t.total_valued_shares.toString());return{...t,accumulated_rpvs:t.accumulated_rpvs+BigInt(r),updated_at:n}}getLoyaltyMultiplier(t,e){let n=(0,ct.default)(1).mul(Je).round(0,ct.default.roundDown).toString();if(!e)return n;let{initial_reward_percentage:r,scale_coef:i}=e;return(0,K.calculate_loyalty_multiplier)(t.toFixed(),r.toString(),i.toFixed())}async claimRewards(t,e,n,r,i){if(e.state.type==="Terminated")return null;let a=Math.floor(r/t.blocks_per_period);if(n.updated_at===a)return null;let s=await this.syncGlobalFarm(t,a,i);if(!s)return null;let o=this.syncYieldFarm(e,s,a);if(!o)return null;let l=o.total_stopped-n.stopped_at_creation,c=o.updated_at-n.entered_at-l,m=this.getLoyaltyMultiplier(c,o.loyalty_curve),d=BigInt((0,K.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),m)),p=BigInt((0,K.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),Mr));return{reward:d,maxReward:p,assetId:s.reward_currency}}};var Lr=(0,L.default)(365.2425).times(24).times(60).times(60),Wt=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??qn})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((i,a)=>i-a);if(t===e)return Ln;let r=await this.client.getOraclePrice(n);if(r){let{n:i,d:a}=r[0].price,s;return t<e?s=(0,Ze.fixed_from_rational)(i.toString(),a.toString()):s=(0,Ze.fixed_from_rational)(a.toString(),i.toString()),BigInt(s)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),r=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),i=Buffer.from([t]),a=Buffer.concat([n,r,i]),o="0x"+Buffer.concat([a,Buffer.alloc(32-a.length)]).toString("hex");return(0,Nn.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let i=(0,L.default)(r).times(t.toString()).times(e.toString()).div(18);return i.gte(n.toString())?n.toString():i.toString()}getPoolYieldPerPeriod(t,e,n,r){let i=(0,L.default)(t.toString()).times(e),a=(0,L.default)(n.toString()).times(r);return i.div(a.toString()).toString()}farmData(t,e,n){let{yieldFarm:r,globalFarm:i,priceAdjustment:a,balance:s,id:o}=t,{multiplier:l,loyalty_curve:c}=r,{blocks_per_period:m,yield_per_period:d,total_shares_z:p,max_reward_per_period:g,pending_rewards:b,accumulated_paid_rewards:y,planned_yielding_periods:h,updated_at:P,incentivized_asset:S,reward_currency:T,price_adjustment:q,min_deposit:U}=i,k=O.shiftNeg(a??q,18),M=O.shiftNeg(l,18),j=O.shiftNeg(c?.initial_reward_percentage??0,18),$=Lr.div((0,L.default)(this.blockTime).div(1e3).times(m)).toString(),V;if(p<=0)V=(0,L.default)(M).times(d.toString()).times($).toString();else{let lr=this.getGlobalRewardPerPeriod(p,d,g,k),cr=this.getPoolYieldPerPeriod(lr,M,p,k);V=(0,L.default)(cr).times($).toString()}let at=b+y,Ct=g*BigInt(h),pt=s.transferable+at,Tn=pt-at,ce=(0,L.default)(Tn.toString()).div(g.toString()),ue=(0,L.default)(e).div(m.toString()).toString(),me=(p>=0?ce.plus(P):ce.plus(ue)).toString(),_e=(0,L.default)(me).times(m).toString(),ar=(0,L.default)(p.toString()).div((0,L.default)(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(k).toFixed(2),wn=(0,L.default)(at.toString()).div(pt.toString()).gte(.999);V=wn?"0":(0,L.default)(V).div(n?2:1).times(100).toString();let or=j?(0,L.default)(V).times(j).toString():void 0;return{apr:V,minApr:or,isDistributed:wn,estimatedEndPeriod:me,estimatedEndBlock:_e,maxRewards:Ct,incentivizedAsset:S,rewardCurrency:T,loyaltyCurve:c,currentPeriod:ue,potMaxRewards:pt,fullness:ar,yieldFarmId:r.id,globalFarmId:i.id,poolId:o,distributedRewards:at,plannedYieldingPeriods:h,minDeposit:U}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((r,i)=>r.includes(i.keyArgs[0].toString())?r:[...r,i.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async r=>{let i=await this.getOmnipoolFarms(r);if(i)return[r,i]}));return Object.fromEntries(n.filter(r=>!!r))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:i,value:a})=>{let[,s]=i,o=a,l=await this.client.getOmnipoolGlobalFarm(s),c=await this.client.getOmnipoolYieldFarm(Number(t),s,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(s),g=await this.getOraclePrice(m,d),b=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b}}));return n?r.map(i=>i?this.farmData(i,n):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((r,i)=>r.includes(i.keyArgs[0].toString())?r:[...r,i.keyArgs[0].toString()],[]),n=await Promise.all(e.map(async r=>{let i=await this.getIsolatedFarms(r);if(i)return[r,i]}));return Object.fromEntries(n.filter(r=>!!r))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:i,value:a})=>{let[,s]=i,o=a,l=await this.client.getIsolatedGlobalFarm(s),c=await this.client.getIsolatedYieldFarm(t,s,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(s,!0),g=await this.getOraclePrice(m,d),b=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b,farmAddress:p}}));return n?r.map(i=>i?this.farmData(i,n,!0):void 0):[]}async getDepositReward(t,e,n,r){let i=e.global_farm_id,a=e.yield_farm_id,s=n?await this.client.getIsolatedYieldFarm(t,i,a):await this.client.getOmnipoolYieldFarm(Number(t),i,a),o=n?await this.client.getIsolatedGlobalFarm(i):await this.client.getOmnipoolGlobalFarm(i);if(!o||!s)return;let l=o.reward_currency,c=o.incentivized_asset,m=[[this.getFarmAddress(0,n),o.reward_currency],[this.getFarmAddress(o.id,n),o.reward_currency]],d=await this.getAccountAssetBalances(m),p=await this.getOraclePrice(l,c),g=new fe(m,d),y=await new Se(P=>this.getFarmAddress(P),P=>this.client.getAsset(P),g).claimRewards(o,s,e,r,p??o.price_adjustment);if(!y)return;let h=await this.client.getAsset(y.assetId);if(h&&!(y.reward<=h.existential_deposit))return y}async getAccountAssetBalances(t){let[e,n]=await Promise.all([Promise.all(t.filter(([i,a])=>a!==0).map(([i,a])=>this.balanceClient.getTokenBalance(i,a))),Promise.all(t.filter(([i,a])=>a===0).map(([i])=>this.balanceClient.getSystemBalance(i)))]),r=[];for(let i=0,a=0;i+a<t.length;){let s=i+a,[,o]=t[s];o===0?(r.push(n[a]),a+=1):(r.push(e[i]),i+=1)}return r}};var Te=require("polkadot-api"),Ht=class extends D{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(Te.Binary.fromText("omnipool"),t,(0,Te.Enum)("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getAllOmnipooFarms(){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries()}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,n){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,n)}async getAllIsolatedFarms(){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries()}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,n){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,n)}async getAsset(t){return this.api.query.AssetRegistry.Assets.getValue(t)}};var ln={};I(ln,{PoolContextProvider:()=>Bt,PoolError:()=>yt,PoolFactory:()=>At,PoolType:()=>E,aave:()=>on,lbp:()=>nn,omni:()=>rn,stable:()=>sn,xyk:()=>an});var nn={};I(nn,{LbpMath:()=>z,LbpPool:()=>Yt,LbpPoolClient:()=>Kt});var tt=require("@galacticcouncil/math-lbp"),z=class{static getSpotPrice(t,e,n,r,i){return(0,tt.get_spot_price)(t,e,n,r,i)}static calculateInGivenOut(t,e,n,r,i){return(0,tt.calculate_in_given_out)(t,e,n,r,i)}static calculateOutGivenIn(t,e,n,r,i){return(0,tt.calculate_out_given_in)(t,e,n,r,i)}static calculateLinearWeights(t,e,n,r,i){return(0,tt.calculate_linear_weights)(t,e,n,r,i)}static calculatePoolTradeFee(t,e,n){return(0,tt.calculate_pool_trade_fee)(t,e,n)}};var E=(i=>(i.Aave="Aave",i.LBP="LBP",i.Omni="Omnipool",i.Stable="Stableswap",i.XYK="XYK",i))(E||{}),yt=(i=>(i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i.UnknownError="UnknownError",i))(yt||{});var{FeeUtils:Gn}=O,Yt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,r,i,a,s){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i,this.fee=a,this.repayFeeApply=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:i.balance,decimalsIn:r.decimals,decimalsOut:i.decimals,weightIn:r.weight,weightOut:i.weight}}validateAndBuy(t,e,n){let r=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let a=t.balanceOut/this.maxOutRatio;if(e>a&&i.push("MaxOutRatioExceeded"),r===t.assetOut){let s=this.calculateTradeFee(e,n),o=Gn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+s,c=this.calculateInGivenOut(t,l),m=t.balanceIn/this.maxInRatio;return c>m&&i.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:i}}else{let s=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return s>o&&i.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:i}}}validateAndSell(t,e,n){let r=this.tokens[0].id,i=[];e<this.minTradingLimit&&i.push("InsufficientTradingAmount");let a=t.balanceIn/this.maxInRatio;if(e>a&&i.push("MaxInRatioExceeded"),r===t.assetIn){let s=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return s>o&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:i}}else{let s=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(s,n),l=Gn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=s-o,m=t.balanceOut/this.maxOutRatio;return c>m&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:c,feePct:l,errors:i}}}calculateInGivenOut(t,e){let n=z.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=z.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=z.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=z.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=z.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};var Vn=require("polkadot-api"),bt=require("rxjs");var Un=(u,t=new Map)=>e=>{let n;return t.has(e)?t.get(e):(t.set(e,n=u(e)),n)};var v=require("rxjs");var en=[{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 Xt=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,r,i]=await Promise.all([this.client.readContract({abi:en,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:en,address:t,functionName:"decimals"}),this.client.getBlock()]),[a,s,o,l]=n,c=i.number-(i.timestamp-l)/BigInt(e),m=Number(c);return{price:s,decimals:r,updatedAt:m<0?0:m}}};var Y=class extends J{evm;mmOracle;override=[];mem=0;memPools=Un(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new Xt(e)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=(0,v.from)(this.getPoolsMem()).pipe((0,v.switchMap)(e=>this.subscribe(e)),(0,v.combineLatestAll)());return(0,v.firstValueFrom)(t)}getSubscriber(){return(0,v.from)(this.getPoolsMem()).pipe((0,v.switchMap)(t=>this.subscribe(t)),(0,v.mergeAll)())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>(0,v.combineLatest)([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe((0,v.debounceTime)(250),(0,v.map)(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return(0,v.of)([]);let e=[this.subscribeTokensBalance(t.address)];if(this.hasSystemAsset(t)){let n=this.subscribeSystemBalance(t.address);e.push(n)}if(this.hasErc20Asset(t)){let n=t.tokens.filter(i=>i.type==="Erc20").map(i=>i.id),r=this.subscribeErc20Balance(t.address,n);e.push(r)}return(0,v.combineLatest)(e).pipe((0,v.map)(n=>n.map(r=>Array.isArray(r)?r:[r]).flat()))}hasSystemAsset(t){return t.tokens.some(e=>e.id===0)}hasErc20Asset(t){return t.tokens.some(e=>e.type==="Erc20")}hasValidAssets(t){return t.tokens.every(({id:e,decimals:n,balance:r})=>{let i=this.override.find(s=>s.id===e),a=!!n||!!i?.decimals;return r>0n&&a})}updatePool=(t,e)=>{let n=t.tokens.map(r=>{let i=e.find(s=>s.id===r.id),a=this.override.find(s=>s.id===r.id);return i?{...r,balance:i.balance.transferable,decimals:r.decimals||a?.decimals}:{...r,decimals:r.decimals||a?.decimals}});return{...t,tokens:n}}};var Kt=class extends Y{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),r=e?.relay_parent_number||0,i=t.filter(({value:a})=>e&&this.isActivePool(a,r)).map(async({keyArgs:a,value:s})=>{let[o]=a,l=o.toString(),c=await this.getPoolDelta(l,s,r);return{address:l,type:"LBP",fee:s.fee,...c,...n}});return Promise.all(i)}async getPoolDelta(t,e,n){let{start:r,end:i,assets:a,initial_weight:s,final_weight:o,repay_target:l,fee_collector:c}=e,m=z.calculateLinearWeights(r?r.toString():"0",i?i.toString():"0",s.toString(),o.toString(),n.toString()),[d,p]=a,g=BigInt(m),b=this.MAX_FINAL_WEIGHT-BigInt(g),[y,h,P,S,T]=await Promise.all([this.isRepayFeeApplied(d,l,c.toString()),this.getBalance(t,d),this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(t,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:y,tokens:[{id:d,decimals:P?.decimals,existentialDeposit:P?.existential_deposit,balance:h.transferable,weight:g,type:P?.asset_type.type},{id:p,decimals:T?.decimals,existentialDeposit:T?.existential_deposit,balance:S.transferable,weight:b,type:T?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:r}=t;return n&&r?e>=n&&e<r:!1}async isRepayFeeApplied(t,e,n){if(e===0n)return!1;try{return(await this.getBalance(n,t)).transferable<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t){return{repayFee:await this.getRepayFee(),exchangeFee:t.fee}}getPoolType(){return"LBP"}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(Vn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe((0,bt.switchMap)(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):(0,bt.of)(t)),(0,bt.map)(r=>Object.assign({},t,r))):(0,bt.of)(t)}};var rn={};I(rn,{OmniMath:()=>B,OmniPool:()=>zt,OmniPoolClient:()=>$t});var w=require("@galacticcouncil/math-omnipool"),ht=nt(require("big.js")),B=class{static calculateSpotPrice(t,e,n,r){return(0,w.calculate_spot_price)(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return(0,w.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,r,i,a,s,o,l){return(0,w.calculate_in_given_out)(t,e,n,r,i,a,s,o,l)}static calculateLrnaInGivenOut(t,e,n,r,i){return(0,w.calculate_lrna_in_given_out)(t,e,n,r,i)}static calculateOutGivenIn(t,e,n,r,i,a,s,o,l){return(0,w.calculate_out_given_in)(t,e,n,r,i,a,s,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,i){return(0,w.calculate_out_given_lrna_in)(t,e,n,r,i)}static calculateShares(t,e,n,r){return(0,w.calculate_shares)(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,i,a,s,o){return(0,w.calculate_liquidity_out)(t,e,n,r,i,a,s,o)}static calculateLiquidityLRNAOut(t,e,n,r,i,a,s,o){return(0,w.calculate_liquidity_lrna_out)(t,e,n,r,i,a,s,o)}static calculateCapDifference(t,e,n,r){let i=(0,ht.default)(e),a=(0,ht.default)(t),s=(0,ht.default)(r),o=(0,ht.default)(n),l=(0,ht.default)(10).pow(18),c=o.div(l);if(i.div(s).lt(c)){let d=c.times(s).minus(i).times(a),p=i.times((0,ht.default)(1).minus(c));return d.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return(0,w.verify_asset_cap)(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return(0,w.calculate_liquidity_hub_in)(t,e,n,r)}static isSellAllowed(t){return(0,w.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,w.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,w.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,w.is_remove_liquidity_allowed)(t)}};var{FeeUtils:It}=O,zt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,r,i,a){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i,this.hubAssetId=a}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:r.hubReserves,hubReservesOut:i.hubReserves,sharesIn:r.shares,sharesOut:i.shares,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:r.balance,balanceOut:i.balance,tradeableIn:r.tradeable,tradeableOut:i.tradeable,assetInEd:r.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,n),a=r===0n?0:A.calculateDiffToRef(i,r),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&s.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&s.push("MaxOutRatioExceeded");let m=t.balanceIn/this.maxInRatio;return i>m&&s.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:r,amountOut:e,feePct:a,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,n),a=A.calculateDiffToRef(r,i),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&s.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&s.push("MaxInRatioExceeded");let m=t.balanceOut/this.maxOutRatio;return i>m&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:i,feePct:a,errors:s}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let r=B.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?It.toRaw(n.assetFee).toString():"0",n?It.toRaw(n.protocolFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateLrnaInGivenOut(t,e,n){let r=B.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?It.toRaw(n.assetFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let r=B.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?It.toRaw(n.assetFee).toString():"0",n?It.toRaw(n.protocolFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateOutGivenLrnaIn(t,e,n){let r=B.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?It.toRaw(n.assetFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=B.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=B.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=B.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=B.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var we=require("polkadot-api"),Wn=require("@polkadot-api/utils"),jt=require("rxjs");var{FeeUtils:ut}=O,$t=class extends Y{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,r,i,a,s]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:c,value:m})=>{let[d]=c,{hub_reserve:p,shares:g,tradable:b,cap:y,protocol_shares:h}=m,[P,S]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:P?.decimals,existentialDeposit:P?.existential_deposit,balance:S.transferable,cap:y,hubReserves:p,protocolShares:h,shares:g,tradeable:b,type:P?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:a.transferable,tradeable:r,type:i?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...s}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=(0,Wn.toHex)(e);return(0,we.AccountId)(63).dec(n)}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t,e){let[n,r,i]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),a=n.min_fee+r.min_fee,s=n.max_fee+r.max_fee;if(i){let{asset_fee:o,protocol_fee:l}=i;return{assetFee:ut.fromPermill(o),protocolFee:ut.fromPermill(l),min:ut.fromPermill(a),max:ut.fromPermill(s)}}else return{assetFee:ut.fromPermill(n.min_fee),protocolFee:ut.fromPermill(r.min_fee),min:ut.fromPermill(a),max:ut.fromPermill(s)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(we.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,jt.distinctUntilChanged)((n,r)=>!r.deltas),(0,jt.map)(({entries:n})=>n.map(r=>{let[i]=r.args,{hub_reserve:a,shares:s,tradable:o,cap:l,protocol_shares:c}=r.value,m=t.tokens.findIndex(p=>p.id===i);return{...t.tokens[m],cap:l,hubReserves:a,protocolShares:c,shares:s,tradeable:o}})),(0,jt.map)(n=>{let r=t.tokens.find(i=>i.id===1);return{...t,tokens:[...n,r]}}))}};var sn={};I(sn,{StableMath:()=>C,StableSwap:()=>Qt,StableSwapClient:()=>Jt});var R=require("@galacticcouncil/math-stableswap"),C=class{static getPoolAddress(t){return(0,R.pool_account_name)(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,r,i){return(0,R.calculate_amplification)(t,e,n,r,i)}static calculateInGivenOut(t,e,n,r,i,a,s){return(0,R.calculate_in_given_out)(t,e,n,r,i,a,s)}static calculateAddOneAsset(t,e,n,r,i,a,s){return(0,R.calculate_add_one_asset)(t,e,n,r,i,a,s)}static calculateSharesForAmount(t,e,n,r,i,a,s){return(0,R.calculate_shares_for_amount)(t,e,n,r,i,a,s)}static calculateOutGivenIn(t,e,n,r,i,a,s){return(0,R.calculate_out_given_in)(t,e,n,r,i,a,s)}static calculateLiquidityOutOneAsset(t,e,n,r,i,a,s){return(0,R.calculate_liquidity_out_one_asset)(t,e,n,r,i,a,s)}static calculateShares(t,e,n,r,i,a){return(0,R.calculate_shares)(t,e,n,r,i,a)}static calculateSpotPriceWithFee(t,e,n,r,i,a,s,o){return(0,R.calculate_spot_price_with_fee)(t,e,n,r,i,a,s,o)}static recalculatePegs(t,e,n,r,i){let a=(0,R.recalculate_peg)(t,e,n,r,i);return JSON.parse(a)}};var{FeeUtils:mt}=O,Qt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.id,t.fee,t.totalIssuance)}constructor(t,e,n,r,i,a,s,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i,this.amplification=a,this.id=s,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:i.balance,decimalsIn:r.decimals,decimalsOut:i.decimals,tradeableIn:this.id===t?15:r.tradeable,tradeableOut:this.id===e?15:i.tradeable,assetInEd:r.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=this.calculateInGivenOut(t,e,n),a=mt.toPct(n.fee),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&s.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:r,amountOut:e,feePct:a,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=this.calculateOutGivenIn(t,e,n),a=mt.toPct(n.fee),s=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&s.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:r,amountOut:i,feePct:a,errors:s}}calculateIn(t,e,n){let r=C.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateAddOneAsset(t,e,n){let r=C.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateSharesForAmount(t,e,n){let r=C.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=C.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let r=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let r=C.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateWithdrawOneAsset(t,e,n){let r=C.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateShares(t,e,n){let r=C.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?mt.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=C.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let r=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=C.defaultPegs(this.tokens.length-1);return JSON.stringify(t)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:r})=>({asset_id:e,amount:n,decimals:r}));return JSON.stringify(t,lt.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],lt.jsonFormatter)}};var xe=require("polkadot-api"),Hn=require("@polkadot-api/utils"),Yn=require("@noble/hashes/blake2b"),vt=require("rxjs");var{FeeUtils:Pt}=O,Jt=class extends Y{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=C.getPoolAddress(t),n=(0,Yn.blake2b)(e,{dkLen:32}),r=(0,Hn.toHex)(n);return(0,xe.AccountId)(63).dec(r)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolDelta(t,e,n){let{initial_amplification:r,final_amplification:i,initial_block:a,final_block:s}=e,o=C.calculateAmplification(r.toString(),i.toString(),a.toString(),s.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),r=e.assets.map(async i=>{let[a,s,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,i),this.api.query.AssetRegistry.Assets.getValue(i),this.getBalance(n,i)]);return{id:i,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:o.transferable,tradeable:a,type:s?.asset_type.type}});return Promise.all(r)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(xe.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),r=t.map(async({keyArgs:i,value:a})=>{let[s]=i,o=this.getPoolAddress(s),[l,c,m]=await Promise.all([this.getPoolDelta(s,a,e),this.getPoolTokens(s,a),this.getPoolPegs(s,a,e)]);return c.push({id:s,tradeable:15,balance:l.totalIssuance,decimals:18}),this.poolsData.set(o,a),{address:o,id:s,type:"Stableswap",fee:Pt.fromPermill(a.fee),tokens:c,...l,...m,...n}});return Promise.all(r)}async getPoolFees(t){return{fee:t.fee}}async getPoolPegs(t,e,n){let r=await this.api.query.Stableswap.PoolPegs.getValue(t);if(!r)return this.getDefaultPegs(e);let i=await this.getLatestPegs(e,r,n),a=this.getRecentPegs(r),s=Pt.fromPermill(r.max_peg_update),o=Pt.fromPermill(e.fee),[l,c]=C.recalculatePegs(JSON.stringify(a),JSON.stringify(i),n.toString(),Pt.toRaw(s).toString(),Pt.toRaw(o).toString()),m=Number(l)*1e6;return{pegsFee:Pt.fromPermill(m),pegs:c}}getDefaultPegs(t){let e=t.fee,n=C.defaultPegs(t.assets.length);return{pegsFee:Pt.fromPermill(e),pegs:n}}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,r])=>r.map(i=>i.toString()))}async getLatestPegs(t,e,n){let{source:r}=e,i=Array.from(t.assets.entries()).map(([s,o])=>o),a=r.map(async(s,o)=>{if(s.type==="Oracle"){let[l,c,m]=s.value,d=[m,i[o]].sort((P,S)=>P-S),p=await this.api.query.EmaOracle.Oracles.getValue(l,d,c);if(!p)return;let[{price:g,updated_at:b}]=p,y=g.n.toString(),h=g.d.toString();return m.toString()===d[0].toString()?[[y,h],b.toString()]:[[h,y],b.toString()]}else if(s.type==="MMOracle"){let l=s.value.asHex(),{price:c,decimals:m,updatedAt:d}=await this.mmOracle.getData(l),p=10**m;return[[c.toString(),p.toString()],d.toString()]}else return[s.value.map(l=>l.toString()),n.toString()]});return Promise.all(a)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?(0,vt.of)(t):e.watchValue("best").pipe((0,vt.switchMap)(r=>Promise.all([this.getPoolDelta(t.id,n,r),this.getPoolPegs(t.id,n,r)])),(0,vt.map)(([r,i])=>{let a=t.tokens.map(s=>s.id===t.id?{...s,balance:r.totalIssuance}:s);return Object.assign(t,{tokens:a},r,i)}))}};var an={};I(an,{XykMath:()=>st,XykPool:()=>Zt,XykPoolClient:()=>te});var F=require("@galacticcouncil/math-xyk"),st=class{static getSpotPrice(t,e,n){return(0,F.get_spot_price)(t,e,n)}static calculateInGivenOut(t,e,n){return(0,F.calculate_in_given_out)(t,e,n)}static calculateOutGivenIn(t,e,n){return(0,F.calculate_out_given_in)(t,e,n)}static calculatePoolTradeFee(t,e,n){return(0,F.calculate_pool_trade_fee)(t,e,n)}static calculateLiquidityIn(t,e,n){return(0,F.calculate_liquidity_in)(t,e,n)}static calculateSpotPrice(t,e){return(0,F.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return(0,F.calculate_spot_price_with_fee)(t,e,n,r)}static calculateShares(t,e,n){return(0,F.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return(0,F.calculate_liquidity_out_asset_a)(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return(0,F.calculate_liquidity_out_asset_b)(t,e,n,r)}};var{FeeUtils:Xn}=O,Zt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,i){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:r.decimals,decimalsOut:i.decimals,balanceIn:r.balance,balanceOut:i.balance,assetInEd:r.existentialDeposit,assetOutEd:i.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=this.calculateTradeFee(r,n),a=Xn.toPct(n.exchangeFee),s=r+i,o=[];(e<this.minTradingLimit||r<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let c=t.balanceIn/this.maxInRatio;return s>c&&o.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:r,amountOut:e,feePct:a,errors:o}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=this.calculateTradeFee(r,n),a=Xn.toPct(n.exchangeFee),s=r-i,o=[];(e<this.minTradingLimit||r<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let c=t.balanceOut/this.maxOutRatio;return s>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:s,feePct:a,errors:o}}calculateInGivenOut(t,e){let n=st.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=st.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=st.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=st.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=st.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};var Kn=require("polkadot-api"),zn=require("rxjs");var te=class extends Y{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),r=e.map(async({keyArgs:i,value:a})=>{let[s]=i,[o,l]=a,[c,m,d,p]=await Promise.all([this.getBalance(s,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(s,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:s,type:"XYK",tokens:[{id:o,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:c.transferable,type:m?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:d.transferable,type:p?.asset_type.type}],...n}});return Promise.all(r)}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}getPoolType(){return"XYK"}async isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(Kn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,zn.of)(t)}};var on={};I(on,{AavePool:()=>ee,AavePoolClient:()=>ne});var ee=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,i){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(a=>[a.id,a])),r=n.get(t),i=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:i.balance,decimalsIn:r.decimals,decimalsOut:i.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),i=[];return e>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:i}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),i=[];return r>t.balanceOut&&i.push("TradeNotAllowed"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:i}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};var $n=require("polkadot-api"),Qn=require("@polkadot-api/utils"),Ot=require("rxjs"),Jn=require("viem");var jn=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:qr}=dt,Nr=["Supply","Withdraw","Repay","Borrow"],ne=class extends Y{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:r,liqudity_in:i,liqudity_out:a})=>{let[s,o,l,c]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(r),this.api.query.AssetRegistry.AssetLocations.getValue(r)]);return{address:this.getPoolId(n,r),type:"Aave",tokens:[{id:n,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:i,location:o,type:s?.asset_type.type},{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:a,location:c,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:r,liqudity_out:i}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(a=>{let s=a.id===e.id?r:i;return{...a,balance:s}})}getPoolId(t,e){let n=t+"/"+e,r=new TextEncoder().encode(n.padEnd(32,"\0")),i=(0,Qn.toHex)(r);return(0,$n.AccountId)(63).dec(i)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(t,e){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(t){let[e,n]=t.tokens,r=this.getReserveH160Id(e),i=this.api.event.Router.Executed.watch(({asset_in:s,asset_out:o})=>s===n.id||o===n.id),a=this.api.event.EVM.Log.watch(({log:s})=>{let{topics:o,data:l}=s,c=o.map(g=>g.asHex()),m=l.asHex(),{eventName:d,args:p}=(0,Jn.decodeEventLog)({abi:jn,topics:c,data:m});return Nr.includes(d)&&p.reserve.toLowerCase()===r.toLowerCase()});return(0,Ot.merge)([i,a]).pipe((0,Ot.switchMap)(()=>this.getPoolDelta(t)),(0,Ot.map)(s=>({...t,tokens:[...s]})))}getReserveH160Id(t){return t.type==="Erc20"?lt.findNestedKey(t.location,"AccountKey20").AccountKey20.key:qr.fromAssetId(t.id)}};var At=class{static get(t){switch(t.type){case"Aave":return ee.fromPool(t);case"XYK":return Zt.fromPool(t);case"Omnipool":return zt.fromPool(t);case"LBP":return Yt.fromPool(t);case"Stableswap":return Qt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var et=require("rxjs");var Bt=class extends D{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=et.Subscription.EMPTY;omniSub=et.Subscription.EMPTY;stableSub=et.Subscription.EMPTY;xykSub=et.Subscription.EMPTY;aaveSub=et.Subscription.EMPTY;isReady=!1;isDestroyed=new et.Subject;constructor(t,e){super(t),this.evm=e,this.lbpClient=new Kt(t,e),this.omniClient=new $t(t,e),this.stableClient=new Jt(t,e),this.xykClient=new te(t,e),this.aaveClient=new ne(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe((0,et.takeUntil)(this.isDestroyed)).subscribe(e=>{this.pools.set(e.address,e)})}withOmnipool(){return this.omniSub.unsubscribe(),this.omniSub=this.subscribe(this.omniClient),this.active.add("Omnipool"),this}withStableswap(){return this.stableSub.unsubscribe(),this.stableSub=this.subscribe(this.stableClient),this.active.add("Stableswap"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbpClient),this.active.add("LBP"),this}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aaveClient),this.active.add("Aave"),this}withXyk(t){return this.xykClient.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xykClient),this.active.add("XYK"),this}destroy(){this.isDestroyed.next(!0),this.isDestroyed.complete(),this.active.clear(),this.pools.clear(),this.isReady=!1}async getPools(t={}){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let{useOnly:e=[],exclude:n=[]}=t,r=new Set(e),i=new Set(n),a=async s=>{let o=s.getPoolType();return r.size>0?r.has(o):i.size>0?!i.has(o):s.isSupported()};return this.getFilteredPools(a)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((i,a)=>e[a]);return(await Promise.all(n.map(i=>i.getPoolsMem()))).flat()}async getPoolFees(t,e){let n=this.clients.find(r=>r.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new Gt(t.type)}};var yn={};I(yn,{DEFAULT_BLOCK_TIME:()=>tr,DEFAULT_MIN_BUDGET:()=>mn,ORDER_MIN_BLOCK_PERIOD:()=>er,Router:()=>_t,TWAP_BLOCK_PERIOD:()=>ae,TWAP_MAX_DURATION:()=>dn,TWAP_MAX_PRICE_IMPACT:()=>pn,TWAP_TX_MULTIPLIER:()=>ac,TradeOrderError:()=>un,TradeOrderType:()=>ve,TradeRouteBuilder:()=>X,TradeRouter:()=>Rt,TradeScheduler:()=>Ft,TradeType:()=>Ie});var re=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Gr=8,ie=class{isNotVisited(t,e){let n=!0;return e.forEach(r=>{(r[0]===t[0]||r[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let r=[],i=new re,a=[];for(a.push([e,""]),i.enqueue(a);i.size()>0;){let s=i.dequeue();if(!s||s.length>Gr)continue;let o=s[s.length-1];(n===null||o[0]===n)&&r.push(s),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,s)){let m=[...s];m.push(c),i.enqueue(m)}})}return r}findShortestPaths(t,e,n){let r=[],i=new re,a=[];a.push([e,""]),i.enqueue(a);let s=1/0;for(;i.size()>0;){let o=i.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<s?(s=o.length,r.length=0,r.push(o)):o.length===s&&r.push(o);continue}let c=t.get(l[0]);for(let m of c??[])this.isNotVisited(m,o)&&i.enqueue([...o,m])}return r}buildAndPopulateGraph(t,e){let n=new Map;for(let r of t)n.set(parseInt(r),[]);for(let[r,i,a]of e)n.get(i)?.push([a,r]);return n}};function cn(u){let t={};for(let e of u){let n=e.tokens.length;for(let r=0;r<n;r++){t[e.tokens[r].id]||(t[e.tokens[r].id]=[]);for(let i=0;i<n;i++){if(r==i)continue;let a=[e.address,e.tokens[r].id,e.tokens[i].id];t[e.tokens[r].id].push(a)}}}return t}var se=class{getProposals(t,e,n){let r=n.filter(y=>y.type==="XYK"),i=n.filter(y=>y.type!=="XYK"),a=new Set(i.map(y=>y.tokens).flat().map(y=>y.id)),s=a.has(t),o=a.has(e),l=new ie,c=y=>{let h=cn(y),P=Object.keys(h),S=P.flatMap(T=>h[T]);return l.buildAndPopulateGraph(P,S)};if(!s&&!o){let y=r.filter(S=>S.tokens.find(T=>T.id===t)||S.tokens.find(T=>T.id===e)),h=c(y),P=l.findPaths(h,t,e);return this.parsePaths(P)}if(s&&o){let y=c(i),h=l.findPaths(y,t,e);return this.parsePaths(h)}let m=s?e:t,d=r.filter(y=>y.tokens.some(h=>h.id===m));if(d.length===0)return[];let p=[...i,...d],g=c(p),b=l.findPaths(g,t,e);return this.parsePaths(b)}parsePaths(t){let e=[];for(let n of t){let r=[];for(let i=0;i<n.length;i++){let a=n[i],s=n[i+1];if(s==null)break;r.push(this.toEdge(a,s))}e.push(r)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var _t=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new se,this.routeProposals=new Map,this.routerOptions=Object.freeze(e)}buildRouteKey(t,e,n){return`${t}->${e}::${n.length}`}async getPools(){return this.ctx.getPools(this.routerOptions)}async getRoutes(t,e){let n=await this.getPools();return this.validateInput(t,e,n),this.getPaths(t,e,n)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}async getRouteableAssets(t){let e=await this.getTradeableAssets();return(await Promise.all(e.filter(r=>r!==t).map(r=>this.getRoutes(r,t)))).filter(r=>r.length>0).map(([r])=>r[0].assetIn).sort()}validateInput(t,e,n){if(n.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let r=this.getAssets(n);if(!r.has(t))throw new Error(t+" is not supported asset");if(!r.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(r=>r.id)).flat().sort((n,r)=>n>r?1:-1);return new Set(e)}getPaths(t,e,n){let r=this.toPoolsMap(n);return this.getProposals(t,e,n).filter(a=>this.validPath(a,r)).map(a=>this.toHops(a,r))}getProposals(t,e,n){let r=this.buildRouteKey(t,e,n);if(this.routeProposals.has(r))return this.routeProposals.get(r);let i=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(r,i),i}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,r)=>n&&r)}validEdge([t,e,n],r){return r.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,At.get(e)]))}toHops(t,e){return t.map(([n,r,i])=>{let a=e.get(n);return{poolAddress:n,poolId:a?.id,pool:a?.type,assetIn:r,assetOut:i}})}};var Ie=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Ie||{}),ve=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(ve||{}),un=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(un||{});var{FeeUtils:Zn}=O,Rt=class extends _t{mlr;poolsSnapshot;constructor(t,e={}){super(t,e),this.mlr=new Map}buildCtxSync(t,e){let n=this.poolsSnapshot,r=super.validateInput(t,e,n),i=super.getPaths(t,e,n);if(!i.length)throw new Ut(t,e);return{paths:i,pools:n,poolsMap:r}}async withCtx(t,e,n){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let r=this.buildCtxSync(t,e);return n(r)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,r)=>{let i=n[n.length-1].amountOut,a=r[r.length-1].amountOut;return i>a?-1:1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,a)=>i+a),r=t.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,a)=>i+a);return[n,r]}}getPoolFeeRange(t){let e=t.min?Zn.toPct(t.min):void 0,n=t.max?Zn.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetOutDecimals).reduce((s,o)=>s+o),r=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),i=n-e.assetOutDecimals,a=Math.pow(10,i);return r/BigInt(a)}async getSell(t,e,n,r){return this.withCtx(t,e,async({paths:i,poolsMap:a})=>{let s;if(r)s=await this.toSellSwaps(n,r,a);else{let o=i.map(c=>this.toSellSwaps(n,c,a)),l=await Promise.all(o);s=this.findBestSellRoute(l)}return this.buildSell(a,s)})}buildSell(t,e){let n=e[0],r=e[e.length-1],i=this.isDirectTrade(e),a=this.getSellSpot(e),s=r.amountOut,o=i?r.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-s,c=this.getRouteFeeRange(e),m=i?r.tradeFeePct:A.calculateSellFee(o,s),d=Math.pow(10,n.assetInDecimals),p=n.amountIn*a/BigInt(d),g=A.calculateDiffToRef(o,p);return{type:"Sell",amountIn:n.amountIn,amountOut:r.amountOut,spotPrice:a,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:f.toDecimal(n.amountIn,n.assetInDecimals),amountOut:f.toDecimal(r.amountOut,r.assetOutDecimals),spotPrice:f.toDecimal(a,r.assetOutDecimals),tradeFee:f.toDecimal(l,r.assetOutDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0Y(t,e,n){let r=[];for(let i=0;i<e.length;i++){let a=e[i],s=n.get(a.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(a.assetIn,a.assetOut),l;i>0?l=r[i-1]:l=t;let c=s.calculateOutGivenIn(o,l);r.push(c)}return r[r.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:r,pools:i,poolsMap:a}=n,l=i.filter(b=>b.tokens.some(y=>y.id===t)).map(b=>b.type==="Aave"?b.tokens:b.tokens.filter(y=>y.id===t)).map(b=>b.map(y=>y.balance).reduce((y,h)=>y+h)).sort((b,y)=>y<b?-1:1)[0],c=A.getFraction(l,.1),m=await Promise.all(r.map(b=>this.toSellSwaps(c,b,a))),p=this.findBestSellRoute(m).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),g=this.buildRouteKey(t,e,i);return this.mlr.set(g,p),p}async toSellSwaps(t,e,n){let r=[];for(let i=0;i<e.length;i++){let a=e[i],s=n.get(a.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(a.assetIn,a.assetOut),l;i>0?l=r[i-1].amountOut:l=typeof t=="string"?f.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountOut:m,calculatedOut:d,feePct:p,errors:g}=s.validateAndSell(o,l,c),b=this.getPoolFeeRange(c),y=s.spotPriceOutGivenIn(o),h=Math.pow(10,o.decimalsIn),P=l*y/BigInt(h),S=A.calculateDiffToRef(d,P);r.push({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:m,calculatedOut:d,spotPrice:y,tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g,isSupply(){return s.type==="Aave"&&s.tokens[0].id===a.assetIn},isWithdraw(){return s.type==="Aave"&&s.tokens[1].id===a.assetIn},toHuman(){return{...a,amountIn:f.toDecimal(l,o.decimalsIn),amountOut:f.toDecimal(m,o.decimalsOut),calculatedOut:f.toDecimal(d,o.decimalsOut),spotPrice:f.toDecimal(y,o.decimalsOut),tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return r}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let r=this.buildRouteKey(t,e,n.pools),i=this.mlr.get(r);return i||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:r,poolsMap:i}=n,a=this.buildRouteKey(t,e,r),s=this.mlr.get(a);s||(s=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",s,i),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}})}findBestBuyRoute(t){let e=t.sort((n,r)=>{let i=n[0].amountIn,a=r[0].amountIn;return i>a?1:-1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetInDecimals).reduce((s,o)=>s+o),r=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),i=n-e.assetInDecimals,a=Math.pow(10,i);return r/BigInt(a)}async getBuy(t,e,n,r){return this.withCtx(t,e,async({paths:i,poolsMap:a})=>{let s;if(r)s=await this.toBuySwaps(n,r,a);else{let o=i.map(c=>this.toBuySwaps(n,c,a)),l=await Promise.all(o);s=this.findBestBuyRoute(l)}return this.buildBuy(a,s)})}buildBuy(t,e){let n=e[e.length-1],r=e[0],i=this.isDirectTrade(e),a=this.getBuySpot(e),s=r.amountIn,o=i?r.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=s-o,c=this.getRouteFeeRange(e),m=i?r.tradeFeePct:A.calculateBuyFee(o,s),d=Math.pow(10,n.assetOutDecimals),p=n.amountOut*a/BigInt(d),g;return o===0n?g=-100:g=A.calculateDiffToRef(p,o),{type:"Buy",amountOut:n.amountOut,amountIn:r.amountIn,spotPrice:a,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:f.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:f.toDecimal(r.amountIn,r.assetInDecimals),spotPrice:f.toDecimal(a,r.assetInDecimals),tradeFee:f.toDecimal(l,r.assetInDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0X(t,e,n){let r=[];for(let i=e.length-1;i>=0;i--){let a=e[i],s=n.get(a.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(a.assetIn,a.assetOut),l;i==e.length-1?l=t:l=r[0];let c=s.calculateInGivenOut(o,l);r.unshift(c)}return r[0]}async toBuySwaps(t,e,n){let r=[];for(let i=e.length-1;i>=0;i--){let a=e[i],s=n.get(a.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(a.assetIn,a.assetOut),l;i==e.length-1?l=typeof t=="string"?f.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountIn:m,calculatedIn:d,feePct:p,errors:g}=s.validateAndBuy(o,l,c),b=this.getPoolFeeRange(c),y=s.spotPriceInGivenOut(o),h=Math.pow(10,o.decimalsOut),P=l*y/BigInt(h),S;d===0n?S=-100:S=A.calculateDiffToRef(P,d),r.unshift({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:m,calculatedIn:d,spotPrice:y,tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g,isSupply(){return s.type==="Aave"&&s.tokens[0].id===a.assetIn},isWithdraw(){return s.type==="Aave"&&s.tokens[1].id===a.assetIn},toHuman(){return{...a,amountOut:f.toDecimal(l,o.decimalsOut),amountIn:f.toDecimal(m,o.decimalsIn),calculatedIn:f.toDecimal(d,o.decimalsIn),spotPrice:f.toDecimal(y,o.decimalsIn),tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return r}};var tr=6e3,mn=1000000000000000n,ae=6,pn=-5,dn=216e5,ac=3,er=6;var gn=require("polkadot-api");var X=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:i})=>r==="Stableswap"?{pool:(0,gn.Enum)("Stableswap",i),asset_in:e,asset_out:n}:{pool:(0,gn.Enum)(r),asset_in:e,asset_out:n})}};var Ft=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??mn})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,r,i){let[a,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=s,m=l[0],d=l[l.length-1],{assetInDecimals:p}=m,{assetOutDecimals:g}=d,b=Math.abs(c),y=this.getMinimumTradeCount(o,a),h=this.getOptimalTradeCount(b),P=i?Math.round(r/i):h,S=Math.ceil(r/y),T=Math.round(r/h),q=Math.round(r/P),U=o/BigInt(P),k=await this.router.getBestSell(t,e,U),M=o<a,j=[];M&&j.push("OrderTooSmall");let $=k.amountOut*BigInt(P),V=this.toBlockPeriod(q),at=k.tradeFee*BigInt(P),Ct=X.build(l),pt={assetIn:t,assetOut:e,errors:j,frequencyMin:S,frequencyOpt:T,frequency:q,tradeCount:P,tradeFee:at,tradeImpactPct:k.priceImpactPct,tradePeriod:V,tradeRoute:Ct,type:"Dca"};return{...pt,amountIn:o,amountOut:$,tradeAmountIn:k.amountIn,tradeAmountOut:k.amountOut,toHuman(){return{...pt,amountIn:f.toDecimal(o,p),amountOut:f.toDecimal($,g),tradeAmountIn:f.toDecimal(k.amountIn,p),tradeAmountOut:f.toDecimal(k.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),n=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let r=t+n/2n;return Number(r/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[r,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:a,swaps:s,priceImpactPct:o}=i,l=s[0],c=s[s.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),b=a/BigInt(g),y=await this.router.getBestSell(l.assetIn,c.assetOut,b),h=g===1,P=a<r,S=y.priceImpactPct<-5,T=[];P||h?T.push("OrderTooSmall"):S&&T.push("OrderImpactTooBig");let q=y.amountOut*BigInt(g),U=y.tradeFee*BigInt(g),k=X.build(s),M={assetIn:t,assetOut:e,errors:T,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:k,type:"TwapSell"};return{...M,amountIn:a,amountOut:q,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:U,toHuman(){return{...M,amountIn:f.toDecimal(a,m),amountOut:f.toDecimal(q,d),tradeAmountIn:f.toDecimal(y.amountIn,m),tradeAmountOut:f.toDecimal(y.amountOut,d),tradeFee:f.toDecimal(U,d)}}}}async getTwapBuyOrder(t,e,n){let[r,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:a,swaps:s,priceImpactPct:o}=i,l=s[0],c=s[s.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),b=a/BigInt(g),y=await this.router.getBestBuy(l.assetIn,c.assetOut,b),h=y.amountIn*BigInt(g),P=g===1,S=h<r,T=y.priceImpactPct<-5,q=[];S||P?q.push("OrderTooSmall"):T&&q.push("OrderImpactTooBig");let U=y.tradeFee*BigInt(g),k=X.build(s),M={assetIn:t,assetOut:e,errors:q,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:k,type:"TwapBuy"};return{...M,amountIn:h,amountOut:a,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:U,toHuman(){return{...M,amountIn:f.toDecimal(h,m),amountOut:f.toDecimal(a,d),tradeAmountIn:f.toDecimal(y.amountIn,m),tradeAmountOut:f.toDecimal(y.amountOut,d),tradeFee:f.toDecimal(U,m)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let r=216e5/(this.blockTime*6);return Math.round(r)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,n=Math.round(e);return Math.max(n,6)}};var Pn={};I(Pn,{BIG_10:()=>ir,BIG_BILL:()=>hn,StakingApi:()=>oe,StakingClient:()=>le});var nr=require("@polkadot/util-crypto"),rr=require("@polkadot/util"),H=require("@galacticcouncil/math-staking"),W=nt(require("big.js")),bn={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},Ur=u=>Object.keys(bn).includes(u),Vr="20000000000000000",Wr="2000",ir=(0,W.default)(10),hn=(0,W.default)(ir.pow(12));function Hr(u){return(0,nr.encodeAddress)((0,rr.stringToU8a)(("modl"+u).padEnd(32,"\0")),63)}var oe=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getPotBalance(){let t=await this.client.getPalletId(),e=Hr(t);return await this.balanceClient.getBalance(e,0)}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]);if(!e)return;let r=e.created_at,i=await n.reduce(async(a,[s,o])=>{let l=await a,c=s,m=o.amount,d=o.conviction.toString().toLowerCase(),p=await this.client.getReferendumInfo(c);return p&&(p.type==="Approved"||p.type==="Rejected")&&Ur(d)&&l.push({id:c,amount:m,conviction:d}),l},Promise.resolve([]));return{stake:e.stake,rewardPerStake:e.reward_per_stake,createdAt:r,actionPoints:e.action_points,accumulatedUnpaidRewards:e.accumulated_unpaid_rewards,accumulatedSlashPoints:e.accumulated_slash_points,accumulatedLockedRewards:e.accumulated_locked_rewards,votes:i}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,r]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),i=r.find(a=>a)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:i,stakePosition:i?await this.getStakingPosition(i):void 0}}getCurrentActionPoints(t,e,n,r){let i=(0,W.default)(0),a=(0,W.default)(0),s=bn.locked6x,o=(0,W.default)(n.toString()).mul(s),l=100,c=[];t.forEach(p=>{let g=bn[p.conviction],b=r.includes(p.id.toString());b&&c.push(p.id.toString());let y=(0,W.default)(p.amount.toString()).mul(l).div(o);i=i.plus(Math.floor(y.mul(g).toNumber())),a=a.plus(Math.floor(y.mul(b?s:g).toNumber()))});let m=Math.floor((0,W.default)(n.toString()).mul(s).mul(l).div(o).toNumber());r.forEach(p=>{c.includes(p)||(a=a.plus(m))});let d={democracyVote:1};return i=i.mul(d.democracyVote),i=i.plus(e.toString()||"0"),a=a.mul(d.democracyVote),a=a.plus(e.toString()||"0"),{currentActionPoints:i.toString(),maxActionPoints:a.toString()}}async getRewards(t,e,n){let r=await this.getStake(t),{potReservedBalance:i,accumulatedRewardPerStake:a,totalStake:s,stakePosition:o}=r;if(!o)return;let[l,c,m,d,p,g,b]=await Promise.all([this.getPotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getTimePointsPerPeriod(),this.client.getTimePointsWeight(),this.client.getActionPointsWeight(),this.client.getSixBlockSince()]),y=(0,W.default)(l.transferable.toString()).minus(i.toString()),h=y.gt(0)&&s>0?(0,H.calculate_accumulated_rps)(a.toString(),y.toString(),s.toString()):a.toString(),P=(0,H.calculate_period_number)(c.toString(),n,b),S=(0,H.calculate_period_number)(c.toString(),o.createdAt.toString(),b),T=(0,H.calculate_rewards)(h,o.rewardPerStake.toString(),o.stake.toString()),q=this.getCurrentActionPoints(o.votes,o.actionPoints,o.stake,e),U=(0,H.calculate_points)(S,P,d.toString(),p.toString(),q.currentActionPoints,g.toString(),o.accumulatedSlashPoints.toString()),k=(0,H.sigmoid)(U,Vr,Wr),M=(0,W.default)(T).plus(o.accumulatedUnpaidRewards.toString()).plus(o.accumulatedLockedRewards.toString());if((0,W.default)(P).minus(S).lte(m.toString()))return{rewards:"0"};let j=(0,H.calculate_percentage_amount)(M.toString(),k),$=(0,W.default)(o.accumulatedLockedRewards.toString()),V=$.gt(j)?$:(0,W.default)(j);return{rewards:V.div(hn).toString(),maxRewards:M.div(hn).toString(),allocatedRewardsPercentage:V.div(M).mul(100).toNumber()}}};var le=class extends D{async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:a})=>{let[s,o,l]=a;return{address:s,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getTimePointsPerPeriod(){let t=this.api.constants.Staking.TimePointsPerPeriod;return await t()}async getTimePointsWeight(){let t=this.api.constants.Staking.TimePointsWeight;return await t()/1e6}async getActionPointsWeight(){let t=this.api.constants.Staking.ActionPointsWeight;return await t()/1e9}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var Sn={};I(Sn,{TxBuilderFactory:()=>Et});var fn=require("polkadot-api");function sr(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var kt=class extends D{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new J(t),this.aaveUtils=new gt(e)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:n=>this.dryRun(n,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:Ee})}async dryRun(t,e){let n=(0,fn.Enum)("Signed",t),r=(0,fn.Enum)("system",n),a=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,e.decodedCall),s=a.success&&!a.value.execution_result.success?a.value.execution_result.value.error:null;if(s){let o=sr(s.value);throw new Error("Dry run execution error!",{cause:o})}return a}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var Oe=class extends kt{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:r}=e[0],i=await this.balanceClient.getBalance(this.beneficiary,r);return t>=i.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],i=n[n.length-1],a=A.getFraction(t,this.slippagePct),s=r.assetIn,o=i.assetOut,l=t+a,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:s,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:s,asset_out:o,amount_out:e,max_amount_in:l,route:X.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],i=n[n.length-1],a=A.getFraction(e,this.slippagePct),s=r.assetIn,o=i.assetOut,l=e-a,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:s,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:s,asset_out:o,amount_in:t,min_amount_out:l,route:X.build(n)}),r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=await this.dispatchWithExtraGas(c)),this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],r=e[e.length-1],i=A.getFraction(t,this.slippagePct),a=n.assetIn,s=r.assetOut,o=t-i,l=this.api.tx.Router.sell_all({asset_in:a,asset_out:s,min_amount_out:o,route:X.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var Ae=require("polkadot-api");var Be=class extends kt{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradePeriod:i,tradeRoute:a}=this.order,s=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Ae.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:0n,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",s)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:i,tradePeriod:a,tradeRoute:s}=this.order,o=A.getFraction(i,this.slippagePct),l=i-o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:a,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Ae.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:i,tradePeriod:a,tradeRoute:s}=this.order,o=A.getFraction(r,this.slippagePct),l=r+o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:a,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Ae.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:i,max_amount_in:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var Et=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new Oe(this.client,this.evmClient).setTrade(t)}order(t){return new Be(this.client,this.evmClient).setOrder(t)}};async function Yr(u){let t=new xt(u),e=new Vt(u),[n,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),i=new Bt(u,e).withAave().withOmnipool().withStableswap().withXyk(),a=new J(u),s=new le(u),o=new Ht(u),l=new gt(e),c=new Rt(i),m=new Ft(c,{blockTime:n,minBudgetInNative:r}),d=new oe(s,a),p=new Wt(o,a,{blockTime:n});return{api:{aave:l,router:c,scheduler:m,staking:d,farm:p},client:{asset:new wt(u),balance:a,evm:e},ctx:{pool:i},tx:new Et(u,e),destroy:()=>{i.destroy()}}}0&&(module.exports={aave,api,big,client,const:null,createSdkContext,erc20,error,evm,farm,fmt,h160,json,math,pool,sor,staking,tx,xc});
1
+ "use strict";var Fn=Object.create;var ye=Object.defineProperty;var En=Object.getOwnPropertyDescriptor;var kn=Object.getOwnPropertyNames;var Cn=Object.getPrototypeOf,Dn=Object.prototype.hasOwnProperty;var Es=(u,t)=>()=>(u&&(t=u(u=0)),t);var I=(u,t)=>{for(var e in t)ye(u,e,{get:t[e],enumerable:!0})},be=(u,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of kn(t))!Dn.call(u,n)&&n!==e&&ye(u,n,{get:()=>t[n],enumerable:!(s=En(t,n))||s.enumerable});return u},vt=(u,t,e)=>(be(u,t,"default"),e&&be(e,t,"default")),st=(u,t,e)=>(e=u!=null?Fn(Cn(u)):{},be(t||!u||!u.__esModule?ye(e,"default",{value:u,enumerable:!0}):e,u)),Mn=u=>be(ye({},"__esModule",{value:!0}),u);var Nt={};var Ds=Es(()=>{vt(Nt,require("@polkadot-api/ws-provider/node"))});var Ut={};var Ms=Es(()=>{vt(Ut,require("@polkadot-api/ws-provider/web"))});var yr={};I(yr,{QueryBus:()=>Yt,aave:()=>rs,api:()=>Ve,big:()=>S,client:()=>is,const:()=>je,createSdkContext:()=>br,erc20:()=>gt,error:()=>os,evm:()=>us,farm:()=>ds,fmt:()=>A,h160:()=>Ht,json:()=>lt,math:()=>_,pool:()=>Ps,sor:()=>_s,staking:()=>Os,tx:()=>Bs,xc:()=>ts});module.exports=Mn(yr);var Ve={};I(Ve,{Papi:()=>q,getWs:()=>Ln});var Cs=require("@galacticcouncil/descriptors");function ks(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var q=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(Cs.hydration)}log(t,...e){let s=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");ks(s)&&console.log(t,...e)}};var Ls=require("polkadot-api"),qs=require("polkadot-api/polkadot-sdk-compat"),Ln=async u=>{let t=typeof u=="string"?u.split(","):u,n=(typeof window>"u"?(await Promise.resolve().then(()=>(Ds(),Nt))).getWsProvider:(await Promise.resolve().then(()=>(Ms(),Ut))).getWsProvider)(t);return(0,Ls.createClient)((0,qs.withPolkadotSdkCompat)(n))};var rs={};I(rs,{AAVE_GAS_LIMIT:()=>Ye,AAVE_LENDING_POOL_ADDRESS:()=>Se,AAVE_POOL_ABI:()=>He,AAVE_POOL_DATA_PROVIDER:()=>Pe,AAVE_POOL_DATA_PROVIDER_ABI:()=>fe,AAVE_POOL_PROXY:()=>We,AAVE_ROUNDING_THRESHOLD:()=>kr,AAVE_UINT_256_MAX:()=>qn,AaveClient:()=>Gt,AaveUtils:()=>bt});var He=[{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 fe=[{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 We="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Pe="0x112b087b60C1a166130d59266363C45F8aa99db0",Se="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Ye=1000000n,kr=5,qn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Gt=class{client;constructor(t){this.client=t.getWsProvider()}async getBlockTimestamp(){let t=await this.client.getBlock();return Number(t.timestamp)}async getReservesData(){return await this.client.readContract({abi:fe,address:Pe,args:[Se],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:fe,address:Pe,args:[Se,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:He,address:We,args:[t],functionName:"getUserAccountData"})}};var rt=st(require("big.js"));var S={};I(S,{asBigInt:()=>Gn,toBigInt:()=>Un,toDecimal:()=>Nn});var ot=st(require("big.js"));ot.default.NE=-18;function Nn(u,t,e=6,s){let n=(0,ot.default)(u.toString()),r=(0,ot.default)(10).pow(t);return n.div(r).round(e,s).toString()}function Un(u,t){let e=(0,ot.default)(10).pow(t),n=(0,ot.default)(u).mul(e).toFixed(0,ot.default.roundDown);return BigInt(n)}function Gn(u){return BigInt(u.round(0,ot.default.roundDown).toFixed(0))}var gt={};I(gt,{ERC20:()=>ze});var ze=class{static fromAssetId(t){let e=Buffer.alloc(20,0);return e[15]=1,e.writeUInt32BE(t,16),"0x"+e.toString("hex")}static toAssetId(t){let e=Buffer.from(t.replace("0x",""),"hex");return e.length!==20||!this.isAssetAddress(t)?null:e.readUInt32BE(16)}static isAssetAddress(t){let e=Buffer.from("0000000000000000000000000000000100000000","hex"),s=Buffer.from(t.replace("0x",""),"hex");return s.length!==20?!1:s.subarray(0,16).equals(e.subarray(0,16))}};var A={};I(A,{FeeUtils:()=>$e,shiftNeg:()=>Wn});var Ns=st(require("big.js"));var je={};I(je,{HUB_ASSET_ID:()=>Vt,HYDRATION_OMNIPOOL_ADDRESS:()=>Hn,HYDRATION_PARACHAIN_ID:()=>Vn,HYDRATION_SS58_PREFIX:()=>V,PERBILL_DENOMINATOR:()=>Xe,PERMILL_DENOMINATOR:()=>wt,RUNTIME_DECIMALS:()=>B,SYSTEM_ASSET_DECIMALS:()=>Ke,SYSTEM_ASSET_ID:()=>R,TRADEABLE_DEFAULT:()=>Tt});var B=18,wt=1e6,Xe=1e9,R=0,Ke=12,Vn=2034,V=63,Hn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Vt=1,Tt=15;var $e=class u{static toPct(t){let[e,s]=t;return u.safeDivide(e*100,s)}static toRaw(t){let[e,s]=t;return u.safeDivide(e,s)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,s=12){let n=10**s;return Math.round(t*n/e)/n}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Wn(u,t){let e=(0,Ns.default)(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Ht={};I(Ht,{H160:()=>Ze,isEvmAccount:()=>Us,isEvmAddress:()=>Gs,isSs58Address:()=>Vs});var xt=require("polkadot-api"),Qe=require("@polkadot-api/utils"),nt=require("buffer");var Je="ETH\0";function Us(u){if(!u)return!1;try{let t=(0,xt.AccountId)().enc(u),e=nt.Buffer.from(Je);return nt.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Gs(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function Vs(u){try{return(0,xt.AccountId)(63).enc(u),!0}catch{return!1}}var Ze=class u{static toAccount=t=>{let e=nt.Buffer.from(t.slice(2),"hex"),s=nt.Buffer.from(Je),n=Uint8Array.from(nt.Buffer.concat([s,e,nt.Buffer.alloc(8)])),r=(0,Qe.toHex)(n);return(0,xt.AccountId)(63).dec(r)};static fromAccount=t=>{let e=(0,xt.AccountId)().enc(t),s=nt.Buffer.from(Je),n=e.slice(s.length,-8);return"0x"+nt.Buffer.from(n).toString("hex")};static fromSS58=t=>{let s=(0,xt.AccountId)().enc(t).slice(0,20);return(0,Qe.toHex)(s)};static fromAny=t=>{if(Gs(t))return t;if(Us(t))return u.fromAccount(t);if(Vs(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var lt={};I(lt,{findNestedKey:()=>Yn,findNestedObj:()=>zn,jsonFormatter:()=>Xn});var Yn=(u,t)=>{let e=[];return JSON.stringify(u,(s,n)=>(n&&n[t]&&e.push(n),n)),e[0]},zn=(u,t,e)=>{let s;return JSON.stringify(u,(n,r)=>(r&&r[t]===e&&(s=r),r)),s},Xn=(u,t)=>typeof t=="bigint"?t.toString():t;var _={};I(_,{calculateBuyFee:()=>Qn,calculateDiffToAvg:()=>Kn,calculateDiffToRef:()=>jn,calculateSellFee:()=>$n,getFraction:()=>Jn});var Q=st(require("big.js"));function Kn(u,t){let e=(0,Q.default)(u.toString()),s=(0,Q.default)(t.toString());return e.minus(s).abs().div(e.plus(s).div(2)).mul(100).round(2).toNumber()}function jn(u,t){if(t===0n)return 0;let e=(0,Q.default)(u.toString()),s=(0,Q.default)(t.toString());return e.minus(s).div(s).mul(100).round(2).toNumber()}function $n(u,t){let e=(0,Q.default)(u.toString()),s=(0,Q.default)(t.toString());return(0,Q.default)(1).minus(s.div(e)).mul(100).round(2).toNumber()}function Qn(u,t){let e=(0,Q.default)(u.toString());return(0,Q.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Jn(u,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let s=Math.pow(10,e),n=BigInt(t*s);return u*n/BigInt(100*s)}var ts={};I(ts,{convertToId:()=>Zn});var Hs=require("buffer");function Zn(u){let e=Hs.Buffer.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var Wt=(u,t)=>u===t?0:u==null?t==null?0:-1:t==null?u==null?0:1:typeof u.compare=="function"?u.compare(t):typeof t.compare=="function"?-t.compare(u):u<t?-1:u>t?1:0;var ve=(u,t=e=>e!==void 0?": "+e:"")=>class extends Error{origMessage;constructor(e){super(u(e)+t(e)),this.origMessage=e!==void 0?String(e):""}};var tr=ve(()=>"illegal argument(s)"),Ws=u=>{throw new tr(u)};var er=ve(()=>"index out of bounds"),es=u=>{throw new er(u)},we=(u,t,e)=>(u<t||u>=e)&&es(u);var Ys=23283064365386963e-26,Te=class{float(t=1){return this.int()*Ys*t}probability(t){return this.float()<t}norm(t=1){return(this.int()*Ys-.5)*2*t}normMinMax(t,e){let s=this.minmax(t,e);return this.float()<.5?s:-s}minmax(t,e){return this.float()*(e-t)+t}minmaxInt(t,e){t|=0;let s=(e|0)-t;return s?t+this.int()%s:t}minmaxUint(t,e){t>>>=0;let s=(e>>>0)-t;return s?t+this.int()%s:t}};var xe=class extends Te{constructor(t){super(),this.rnd=t}float(t=1){return this.rnd()*t}norm(t=1){return(this.rnd()-.5)*2*t}int(){return this.rnd()*4294967296>>>0}};var zs=new xe(Math.random);var Xs=u=>u!=null&&typeof u!="function"&&u.length!==void 0;var Ks=Object.getPrototypeOf({}),Ie="function",js="string",It=(u,t)=>{let e;if(u===t)return!0;if(u!=null){if(typeof u.equiv===Ie)return u.equiv(t)}else return u==t;if(t!=null){if(typeof t.equiv===Ie)return t.equiv(u)}else return u==t;return typeof u===js||typeof t===js?!1:(e=Object.getPrototypeOf(u),(e==null||e===Ks)&&(e=Object.getPrototypeOf(t),e==null||e===Ks)?ir(u,t):typeof u!==Ie&&u.length!==void 0&&typeof t!==Ie&&t.length!==void 0?sr(u,t):u instanceof Set&&t instanceof Set?nr(u,t):u instanceof Map&&t instanceof Map?rr(u,t):u instanceof Date&&t instanceof Date?u.getTime()===t.getTime():u instanceof RegExp&&t instanceof RegExp?u.toString()===t.toString():u!==u&&t!==t)},sr=(u,t,e=It)=>{let s=u.length;if(s===t.length)for(;s-- >0&&e(u[s],t[s]););return s<0},nr=(u,t,e=It)=>u.size===t.size&&e([...u.keys()].sort(),[...t.keys()].sort()),rr=(u,t,e=It)=>u.size===t.size&&e([...u].sort(),[...t].sort()),ir=(u,t,e=It)=>{if(Object.keys(u).length!==Object.keys(t).length)return!1;for(let s in u)if(!t.hasOwnProperty(s)||!e(u[s],t[s]))return!1;return!0};var ss=class{value;constructor(t){this.value=t}deref(){return this.value}};var $s=u=>u instanceof ss;var _e=class u{_head;_length=0;constructor(t){t&&this.into(t)}get length(){return this._length}get head(){return this._head}[Symbol.iterator](){return Qs("next",this._head)}reverseIterator(){return Qs("prev",this.tail)}clear(){this.release()}compare(t,e=Wt){let s=this._length;if(s<t._length)return-1;if(s>t._length)return 1;if(s===0)return 0;{let n=this._head,r=t._head,i=0;for(;s-- >0&&i===0;)i=e(n.value,r.value),n=n.next,r=r.next;return i}}concat(...t){let e=this.copy();for(let s of t)e.into(s);return e}equiv(t){if(!(t instanceof u||Xs(t))||this._length!==t.length)return!1;if(!this._length||this===t)return!0;let e=t[Symbol.iterator](),s=this._head;for(let n=this._length;n-- >0;){if(!It(s.value,e.next().value))return!1;s=s.next}return!0}filter(t){let e=this.empty();return this.traverse(s=>(t(s.value)&&e.append(s.value),!0)),e}find(t){return this.traverse(e=>e.value!==t)}findWith(t){return this.traverse(e=>!t(e.value))}first(){return this._head?.value}insertSorted(t,e){e=e||Wt;for(let s=this._head,n=this._length;n-- >0;){if(e(t,s.value)<=0)return this.insertBefore(s,t);s=s.next}return this.append(t)}into(t){for(let e of t)this.append(e);return this}nth(t,e){let s=this.nthCell(t);return s?s.value:e}nthCellUnsafe(t){let e,s;for(t<=this._length>>>1?(e=this._head,s="next"):(e=this.tail,s="prev",t=this._length-t-1);t-- >0&&e;)e=e[s];return e}peek(){return this.tail?.value}$reduce(t,e){let s=this._head;for(let n=this._length;n-- >0&&!$s(e);)e=t(e,s.value),s=s.next;return e}reduce(t,e){return this.$reduce(t,e)}release(){let t=this._head;if(!t)return!0;let e;for(let s=this._length;s-- >0;)e=t.next,delete t.value,delete t.prev,delete t.next,t=e;return this._head=void 0,this._length=0,!0}reverse(){let t=this._head,e=this.tail,s=(this._length>>>1)+(this._length&1);for(;t&&e&&s>0;){let n=t.value;t.value=e.value,e.value=n,t=t.next,e=e.prev,s--}return this}setHead(t){let e=this._head;return e?(e.value=t,e):this.prepend(t)}setNth(t,e){let s=this.nthCell(t);return!s&&es(t),s.value=e,s}setTail(t){let e=this.tail;return e?(e.value=t,e):this.append(t)}swap(t,e){if(t!==e){let s=t.value;t.value=e.value,e.value=s}return this}toArray(t=[]){return this.traverse(e=>(t.push(e.value),!0)),t}toJSON(){return this.toArray()}toString(){let t=[];return this.traverse(e=>(t.push(String(e.value)),!0)),t.join(", ")}traverse(t,e=this._head,s){if(!this._head)return;let n=e;do{if(!t(n))break;n=n.next}while(n!==s);return n}_map(t,e){return this.traverse(s=>(t.append(e(s.value)),!0)),t}};function*Qs(u,t){for(;t;)yield t.value,t=t[u]}var Oe=class u extends _e{_tail;constructor(t){super(),t&&this.into(t)}get tail(){return this._tail}append(t){if(this._tail){let e={value:t,prev:this._tail};return this._tail.next=e,this._tail=e,this._length++,e}else return this.prepend(t)}asHead(t){return t===this._head?this:(this.remove(t),this._head.prev=t,t.next=this._head,t.prev=void 0,this._head=t,this._length++,this)}asTail(t){return t===this._tail?this:(this.remove(t),this._tail.next=t,t.prev=this._tail,t.next=void 0,this._tail=t,this._length++,this)}cons(t){return this.prepend(t),this}copy(){return new u(this)}*cycle(){for(;;)yield*this}drop(){let t=this._head;if(t)return this._head=t.next,this._head?this._head.prev=void 0:this._tail=void 0,this._length--,t.value}empty(){return new u}insertAfter(t,e){let s={value:e,next:t.next,prev:t};return t.next?t.next.prev=s:this._tail=s,t.next=s,this._length++,s}insertAfterNth(t,e){return t<0&&(t+=this._length),t>=this._length-1?this.append(e):(we(t,0,this._length),this.insertAfter(this.nthCellUnsafe(t),e))}insertBefore(t,e){let s={value:e,next:t,prev:t.prev};return t.prev?t.prev.next=s:this._head=s,t.prev=s,this._length++,s}insertBeforeNth(t,e){return t<0&&(t+=this._length),t<=0?this.prepend(e):(we(t,0,this._length),this.insertBefore(this.nthCellUnsafe(t),e))}map(t){return this._map(new u,t)}nth(t,e){let s=this.nthCell(t);return s?s.value:e}nthCell(t){if(t<0&&(t+=this._length),!(t<0||t>=this._length))return this.nthCellUnsafe(t)}pop(){let t=this._tail;if(t)return this._tail=t.prev,this._tail?this._tail.next=void 0:this._head=void 0,this._length--,t.value}prepend(t){let e={value:t,next:this._head};return this._head?this._head.prev=e:this._tail=e,this._head=e,this._length++,e}push(t){return this.append(t),this}release(){return this._tail=void 0,super.release()}remove(t){return t.prev?t.prev.next=t.next:this._head=t.next,t.next?t.next.prev=t.prev:this._tail=t.prev,this._length--,this}rotateLeft(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:return this.push(this.drop())}}rotateRight(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:let t=this.peek();return this.pop(),this.prepend(t),this}}seq(t=0,e=this.length){if(t>=e||t<0)return;let s=this.nthCell(t),n=this.nthCell(e-1),r=i=>({first(){return i.value},next(){return i!==n&&i.next?r(i.next):void 0}});return s?r(s):void 0}shuffle(t,e=zs){if(this._length<2)return this;for(t=t!==void 0?t:Math.ceil(1.5*Math.log2(this._length));t>0;t--){let s=this._head;for(;s;){let n=s.next;e.probability(.5)?this.asHead(s):this.asTail(s),s=n}}return this}slice(t=0,e=this.length){let s=t<0?t+this._length:t,n=e<0?e+this._length:e;(s<0||n<0)&&Ws("invalid indices: ${from} / ${to}");let r=new u,i=this.nthCell(s);for(;i&&++s<=n;)r.push(i.value),i=i.next;return r}sort(t=Wt){if(!this._length)return this;let e=1;for(;;){let s=this._head;this._head=void 0,this._tail=void 0;let n=0;for(;s;){n++;let r=s,i=0;for(let o=0;o<e&&(i++,r=r.next,!!r);o++);let a=e;for(;i>0||a>0&&r;){let o;i===0?(o=r,r=r.next,a--):!r||a===0||t(s.value,r.value)<=0?(o=s,s=s.next,i--):(o=r,r=r.next,a--),this._tail?this._tail.next=o:this._head=o,o.prev=this._tail,this._tail=o}s=r}if(this._tail.next=void 0,n<=1)return this;e*=2}}splice(t,e=0,s){let n;typeof t=="number"?(t<0&&(t+=this._length),we(t,0,this._length),n=this.nthCellUnsafe(t)):n=t;let r=new u;if(e>0)for(;n&&e-- >0;)this.remove(n),r.push(n.value),n=n.next;else n&&(n=n.next);if(s)if(n)for(let i of s)this.insertBefore(n,i);else for(let i of s)this.push(i);return r}};var Ae=class u{map;items;opts;_size;constructor(t,e){let s={maxlen:1/0,maxsize:1/0,map:()=>new Map,ksize:()=>0,vsize:()=>0,...e};this.map=s.map(),this.items=new Oe,this._size=0,this.opts=s,t&&this.into(t)}get length(){return this.items.length}get size(){return this._size}[Symbol.iterator](){return this.entries()}*entries(){for(let t of this.items)yield[t.k,t]}*keys(){for(let t of this.items)yield t.k}*values(){for(let t of this.items)yield t.v}copy(){let t=this.empty();t.items=this.items.copy();let e=t.items.head;for(;e;)t.map.set(e.value.k,e),e=e.next;return t}empty(){return new u(null,this.opts)}release(){this._size=0,this.map.clear();let t=this.opts.release;if(t){let e;for(;e=this.items.drop();)t(e.k,e.v);return!0}return this.items.release()}has(t){return this.map.has(t)}get(t,e){let s=this.map.get(t);return s?this.resetEntry(s):e}set(t,e){let s=this.opts.ksize(t)+this.opts.vsize(e),n=this.map.get(t),r=Math.max(0,s-(n?n.value.s:0));return this._size+=r,this.ensureSize()?this.doSetEntry(n,t,e,s):this._size-=r,e}into(t){for(let e of t)this.set(e[0],e[1]);return this}async getSet(t,e){let s=this.map.get(t);return s?this.resetEntry(s):this.set(t,await e())}delete(t){let e=this.map.get(t);return e?(this.removeEntry(e),!0):!1}resetEntry(t){return this.items.asTail(t),t.value.v}ensureSize(){let{release:t,maxsize:e,maxlen:s}=this.opts;for(;this._size>e||this.length>=s;){let n=this.items.drop();if(!n)return!1;this.map.delete(n.k),t?.(n.k,n.v),this._size-=n.s}return!0}removeEntry(t){let e=t.value;this.map.delete(e.k),this.items.remove(t),this.opts.release?.(e.k,e.v),this._size-=e.s}doSetEntry(t,e,s,n){t?(this.opts.update?.(e,t.value.v,s),t.value.v=s,t.value.s=n,this.items.asTail(t)):(this.items.push({k:e,v:s,s:n}),this.map.set(e,this.items.tail))}};var ht=class u extends Ae{constructor(t,e){super(t,{ttl:3600*1e3,autoExtend:!1,...e})}empty(){return new u(null,this.opts)}has(t){return this.get(t)!==void 0}get(t,e){let s=this.map.get(t);if(s){if(s.value.t>=Date.now())return this.resetEntry(s);this.removeEntry(s)}return e}set(t,e,s=this.opts.ttl){let n=this.opts.ksize(t)+this.opts.vsize(e),r=this.map.get(t),i=Math.max(0,n-(r?r.value.s:0));return this._size+=i,this.ensureSize()?this.doSetEntry(r,t,e,n,s):this._size-=i,e}async getSet(t,e,s=this.opts.ttl){let n=this.get(t);return n!==void 0?n:this.set(t,await e(),s)}prune(){let t=Date.now(),e=this.items.head,s=0;for(;e;)e.value.t<t&&(this.removeEntry(e),s++),e=e.next;return s}ensureSize(){let{maxlen:t,maxsize:e}=this.opts,s=Date.now(),n=this.items.head;for(;n&&(this._size>e||this.length>=t);)n.value.t<s&&this.removeEntry(n),n=n.next;return super.ensureSize()}doSetEntry(t,e,s,n,r=this.opts.ttl){let i=Date.now()+r;t?(this.opts.update?.(e,t.value.v,s),t.value.v=s,t.value.s=n,t.value.t=i,this.items.asTail(t)):(this.items.push({k:e,v:s,s:n,t:i,ttl:r}),this.map.set(e,this.items.tail))}resetEntry(t){return this.opts.autoExtend&&(t.value.t=Date.now()+t.value.ttl),super.resetEntry(t)}};var Yt=class{debug;constructor(t){this.debug=t||!1}log(t,e,s){this.debug&&console.log(t,e,s)}scope(t,e,s,n){let r=new Map,i=n!==void 0?new ht(null,{ttl:n}):new ht;return{get:(...c)=>{let p=s(...c);if(r.has(p)){this.log("[live]",t,p);let m=r.get(p);return Promise.resolve(m)}if(i.has(p))return this.log("[memo]",t,p),i.get(p);this.log("[fetch]",t,p);let d=e(...c).catch(m=>{throw i.delete(p),m});return i.set(p,d),d},set:(c,...p)=>{let d=s(...p);this.log("[set-live]",t,d),r.set(d,c)},clear:()=>{this.log("[clear]",t),r.clear(),i.release()}}}};var{ERC20:Be}=gt,{H160:ns}=Ht,ar=1.01,or=31536000n,Re=10n**27n,bt=class{client;constructor(t){this.client=new Gt(t)}async getSummary(t){let e=ns.fromAny(t),[s,n,r,i]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e),this.client.getBlockTimestamp()]),[a]=s,[o,l]=n,[c,p,d,m,g,b]=r,h=S.toDecimal(b,18),f=[];for(let P of o){let v=P.underlyingAsset.toLowerCase(),T=a.find(({underlyingAsset:Ge})=>Ge.toLowerCase()===v);if(!T)throw new Error("Missing pool reserve for "+v);let M=P.scaledATokenBalance,G=T.liquidityIndex,L=T.liquidityRate,W=T.availableLiquidity,pt=T.priceInMarketReferenceCurrency,mt=i+6,$=this.calculateLinearInterest(L,T.lastUpdateTimestamp,mt),at=G*$/Re,qt=M*at/Re,de=Number(l!==0&&l===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,ge=T.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,he=Be.toAssetId(v);f.push({aTokenBalance:qt,availableLiquidity:W,decimals:Number(T.decimals),isCollateral:ge,priceInRef:pt,reserveId:he,reserveAsset:v,reserveLiquidationThreshold:de})}return{healthFactor:Number(h),totalCollateral:c,totalDebt:p,reserves:f}}async hasBorrowPositions(t){let e=ns.fromAny(t),s=await this.client.getUserAccountData(e),[n,r]=s;return r>0n}async getHealthFactor(t){let e=ns.fromAny(t),s=await this.client.getUserAccountData(e),[n,r,i,a,o,l]=s,c=S.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,s){let{totalCollateral:n,totalDebt:r,reserves:i}=await this.getSummary(t),a=Be.fromAssetId(e),o=i.find(f=>f.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,isCollateral:c,priceInRef:p,reserveLiquidationThreshold:d}=o,m=S.toBigInt(s,l),g=c?m*p/10n**BigInt(l):0n,b=n-g;if(b<=0n)return 0;let h=(0,rt.default)(b.toString()).mul(d).div(r.toString()).toFixed(6,rt.default.roundDown);return Number(h)}async getHealthFactorAfterSupply(t,e,s){let{totalCollateral:n,totalDebt:r,reserves:i}=await this.getSummary(t),a=Be.fromAssetId(e),o=i.find(h=>h.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:p}=o,m=S.toBigInt(s,l)*c/10n**BigInt(l),g=n+m;if(g<=0n)return 0;let b=(0,rt.default)(g.toString()).mul(p).div(r.toString()).toFixed(6,rt.default.roundDown);return Number(b)}async getMaxWithdraw(t,e){let{totalDebt:s,reserves:n,healthFactor:r}=await this.getSummary(t),i=Be.fromAssetId(e),a=n.find(o=>o.reserveAsset===i);if(!a)throw new Error("Missing reserve ctx for "+i);return this.calculateWithdrawMax(a,s,r)}async getMaxWithdrawAll(t){let{totalDebt:e,reserves:s,healthFactor:n}=await this.getSummary(t),r={};for(let i of s){let a=this.calculateWithdrawMax(i,e,n);i.reserveId&&(r[i.reserveId]=a)}return r}calculateWithdrawMax(t,e,s){let{aTokenBalance:n,availableLiquidity:r,decimals:i,priceInRef:a,reserveLiquidationThreshold:o,isCollateral:l}=t,c=n;if(l&&e>0n){let d=s-ar;if(d>0){let m=(0,rt.default)(d).mul(e.toString()).div(o).toFixed(0,rt.default.roundDown),g=(0,rt.default)(m).div(a.toString()).mul(10**i).toFixed(0,rt.default.roundDown);c=n<BigInt(g)?n:BigInt(g)}else c=0n}return{amount:c<r?c:r,decimals:i}}calculateLinearInterest(t,e,s){let n=s-e;if(n<=0)return Re;let r=t*BigInt(n)/or;return Re+r}};var is={};I(is,{AssetClient:()=>_t,BalanceClient:()=>J,ChainParams:()=>Ot});var _t=class extends q{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(t){super(t)}async queryShares(){let e=await this.api.query.Stableswap.Pools.getEntries();return new Map(e.map(({keyArgs:s,value:n})=>{let[r]=s;return[r,n]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:s,value:n})=>{let[r]=s;return[r,n]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:s})=>{let{asset_type:n}=s;return this.SUPPORTED_TYPES.includes(n.type)}).map(({keyArgs:s,value:n})=>{let[r]=s;return[r,n]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:s,value:n})=>{let[r]=s;return[r,n]}))}async mapToken(t,e,s,n){let{name:r,asset_type:i,is_sufficient:a,existential_deposit:o}=e,{symbol:l,decimals:c}=s.get(t)??{};return{id:t,name:r?.asText(),symbol:l,decimals:c,icon:l,type:i.type,isSufficient:a,location:n,existentialDeposit:o}}async mapBond(t,e,s,n){let[r,i]=n,{asset_type:a,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:p}=await this.mapToken(r,e,s),d=Number(i),m=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",m.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:p,icon:c,type:a.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:r,maturity:d}}async mapShares(t,e,s,n){let{assets:r}=n,{name:i,symbol:a,asset_type:o,is_sufficient:l,existential_deposit:c}=e,p=await Promise.all(r.map(async g=>{let{symbol:b}=await this.mapToken(g,e,s);return[g,b]})),d=Object.fromEntries(p),m=Object.values(d);return{id:t,name:m.join(", "),symbol:a?.asText()||i?.asText(),decimals:18,icon:m.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:d}}async mapExternal(t,e,s,n){let r=await this.mapToken(t,e,new Map,n),i=s?.find(a=>a.internalId===r.id);return i?{...r,decimals:i.decimals,name:i.name,symbol:i.symbol,icon:i.symbol,isWhiteListed:i.isWhiteListed}:r}parseMetadata(t){return new Map(Array.from(t,([e,s])=>[e,{symbol:s.symbol?.asText(),decimals:s.decimals}]))}async getOnChainAssets(t,e){let[s,n,r,i]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),a=this.parseMetadata(s),o=[];for(let[l,c]of Array.from(s)){let p=n.get(l),{asset_type:d}=c,m;switch(d.type){case"Bond":let g=i.get(l);m=await this.mapBond(l,c,a,g);break;case"StableSwap":let b=r.get(l);m=await this.mapShares(l,c,a,b);break;case"External":m=await this.mapExternal(l,c,e,p);break;default:m=await this.mapToken(l,c,a,p)}o.push(m)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};var x=require("rxjs");var J=class extends q{constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getTokenBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:s}=await e.getValue(t);return this.calculateBalance(s)}async getTokenBalance(t,e){let n=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(n)}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),s=this.subscribeTokensBalance(t),n=this.subscribeErc20Balance(t);return(0,x.combineLatest)([e,s,n]).pipe((0,x.debounceTime)(250),(0,x.map)(r=>r.flat()),(0,x.startWith)([]),(0,x.bufferCount)(2,1),(0,x.map)(([r,i],a)=>a===0?i:this.getDeltas(r,i)))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,x.map)(s=>({id:0,balance:this.calculateBalance(s.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,x.map)(n=>({id:e,balance:n})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,x.distinctUntilChanged)((s,n)=>!n.deltas),(0,x.map)(({deltas:s})=>{let n=[];return s?.deleted.forEach(r=>{let[i,a]=r.args;n.push({id:a,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),s?.upserted.forEach(r=>{let[i,a]=r.args;n.push({id:a,balance:this.calculateBalance(r.value)})}),n}))}subscribeErc20Balance(t,e){let s=new x.Subject,n=s.pipe((0,x.shareReplay)(1)),r=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:c}=l;return c.type==="Erc20"}).map(({keyArgs:l})=>{let[c]=l;return c}),i=async()=>{let o=e||await r(),l=async()=>{let d=(await Promise.all(o.map(async m=>{let g=await this.getTokenBalanceData(t,m);return[m,g]}))).map(([m,g])=>({id:m,balance:g}));s.next(d)};await l();let c=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>c.unsubscribe()},a;return i().then(o=>a=o),n.pipe((0,x.finalize)(()=>a?.()),(0,x.pairwise)(),(0,x.map)(([o,l],c)=>c===0?l.filter(p=>p.balance.transferable>0n):this.getDeltas(o,l)),(0,x.distinctUntilChanged)((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let s=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(s)}calculateBalance(t){let e=t.free>=t.frozen?t.free-t.frozen:0n,s=t.free+t.reserved;return{free:t.free,reserved:t.reserved,frozen:t.frozen,total:s,transferable:e}}getDeltas(t,e){let s=(r,i)=>r!==void 0&&i!==void 0&&r.transferable===i.transferable&&r.total===i.total,n=t.reduce((r,i)=>(r.set(i.id,i.balance),r),new Map);return e.filter(r=>!s(r.balance,n.get(r.id)))}};var Ot=class extends q{_minOrderBudget;_blockTime;constructor(t){super(t)}async getBlockTime(){if(this._blockTime===void 0){let t=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(t)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};var os={};I(os,{AssetNotFound:()=>as,PoolNotFound:()=>zt,RouteNotFound:()=>Xt});var as=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},zt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},Xt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var us={};I(us,{EvmClient:()=>Kt,createChain:()=>ls});var Js=require("viem"),lr=["https://hydration-rpc.n.dwellir.com","https://hydration.dotters.network","https://rpc.helikon.io/hydradx","https://hydration.ibp.network","https://rpc.cay.hydration.cloud","https://rpc.parm.hydration.cloud","https://rpc.roach.hydration.cloud","https://rpc.zipp.hydration.cloud","https://rpc.sin.hydration.cloud","https://rpc.coke.hydration.cloud"],ls=()=>(0,Js.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:lr}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});var Z=require("viem");var Kt=class{client;chain;constructor(t){this.client=t,this.chain=ls()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return(0,Z.createPublicClient)({chain:this.chain,transport:(0,Z.http)()})}getWsProvider(){return(0,Z.createPublicClient)({transport:(0,Z.custom)({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return(0,Z.createWalletClient)({account:t,chain:this.chain,transport:(0,Z.custom)(window.ethereum)})}};var ds={};I(ds,{LiquidityMiningApi:()=>jt,LiquidityMiningClient:()=>$t});var en=require("polkadot-api"),N=st(require("big.js")),ms=require("@galacticcouncil/math-liquidity-mining");var Fe=class{result=new Map;getKey(t,e){return[e,t.toString()].join(",")}constructor(t,e){for(let s=0;s<t.length;++s){let[n,r]=t[s];this.result.set(this.getKey(r,n),e[s].free)}}freeBalance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,s,n){let r=this.getKey(t,e),i=this.getKey(t,s),a=this.result.get(r)??0n,o=this.result.get(i)??0n;if(a<n)throw new Error("Attempting to transfer more than is present");this.result.set(r,a+n),this.result.set(i,o+n)}};var ut=st(require("big.js")),K=require("@galacticcouncil/math-liquidity-mining");var cs=st(require("big.js")),ps=(0,cs.default)(10).pow(18),Zs=BigInt((0,cs.default)(1).pow(18).toString()),tn=6e3;var ur="1000000000000000000",Ee=class{constructor(t,e,s){this.getAccount=t;this.getAsset=e;this.multiCurrency=s}async syncGlobalFarm(t,e,s){if(t.state.type!=="Active"||t.updated_at===e)return null;if(t.total_shares_z===0n)return t;let n=await this.getAsset(t.reward_currency),r=e-t.updated_at,i=this.getAccount(t.id),a=n?.existential_deposit;if(!a)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.freeBalance(t.reward_currency,i),l=(0,ut.default)(a.toString()),c=(0,ut.default)(o.toString()).minus(l.lt(o.toString())?a.toString():o.toString()),p=(0,ut.default)((0,K.calculate_global_farm_rewards)(t.total_shares_z.toString(),s.toString(),(0,ut.default)(t.yield_per_period.toString()).mul(ps).round(0,ut.default.roundDown).toFixed(),t.max_reward_per_period.toString(),r.toFixed()));if(c.lt(p)&&(p=c),p.eq(0))return t;let d=this.getAccount(0);return this.multiCurrency.transfer(t.reward_currency,i,d,BigInt(p.toFixed())),{...t,accumulated_rpz:BigInt((0,K.calculate_accumulated_rps)(t.accumulated_rpz.toString(),t.total_shares_z.toString(),p.toFixed()))}}syncYieldFarm(t,e,s){if(t.state.type!=="Active"||t.updated_at===s)return null;if(t.total_valued_shares===0n)return{...t,updated_at:s};let n=(0,K.calculate_yield_farm_delta_rpvs)(t.accumulated_rpz.toString(),e.accumulated_rpz.toString(),t.multiplier.toString(),t.total_valued_shares.toString());return{...t,accumulated_rpvs:t.accumulated_rpvs+BigInt(n),updated_at:s}}getLoyaltyMultiplier(t,e){let s=(0,ut.default)(1).mul(ps).round(0,ut.default.roundDown).toString();if(!e)return s;let{initial_reward_percentage:n,scale_coef:r}=e;return(0,K.calculate_loyalty_multiplier)(t.toFixed(),n.toString(),r.toFixed())}async claimRewards(t,e,s,n,r){if(e.state.type==="Terminated")return null;let i=Math.floor(n/t.blocks_per_period);if(s.updated_at===i)return null;let a=await this.syncGlobalFarm(t,i,r);if(!a)return null;let o=this.syncYieldFarm(e,a,i);if(!o)return null;let l=o.total_stopped-s.stopped_at_creation,c=o.updated_at-s.entered_at-l,p=this.getLoyaltyMultiplier(c,o.loyalty_curve),d=BigInt((0,K.calculate_user_reward)(s.accumulated_rpvs.toString(),s.valued_shares.toString(),s.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),p)),m=BigInt((0,K.calculate_user_reward)(s.accumulated_rpvs.toString(),s.valued_shares.toString(),s.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),ur));return{reward:d,maxReward:m,assetId:a.reward_currency}}};var cr=(0,N.default)(365.2425).times(24).times(60).times(60),jt=class{client;balanceClient;options;constructor(t,e,s={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:s.blockTime??tn})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let s=[t,e].sort((r,i)=>r-i);if(t===e)return Zs;let n=await this.client.getOraclePrice(s);if(n){let{n:r,d:i}=n[0].price,a;return t<e?a=(0,ms.fixed_from_rational)(r.toString(),i.toString()):a=(0,ms.fixed_from_rational)(i.toString(),r.toString()),BigInt(a)}}getFarmAddress=(t,e)=>{let s=Buffer.from("modl","utf-8"),n=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),r=Buffer.from([t]),i=Buffer.concat([s,n,r]),o="0x"+Buffer.concat([i,Buffer.alloc(32-i.length)]).toString("hex");return(0,en.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,s,n){let r=(0,N.default)(n).times(t.toString()).times(e.toString()).div(18);return r.gte(s.toString())?s.toString():r.toString()}getPoolYieldPerPeriod(t,e,s,n){let r=(0,N.default)(t.toString()).times(e),i=(0,N.default)(s.toString()).times(n);return r.div(i.toString()).toString()}farmData(t,e,s){let{yieldFarm:n,globalFarm:r,priceAdjustment:i,balance:a,id:o}=t,{multiplier:l,loyalty_curve:c}=n,{blocks_per_period:p,yield_per_period:d,total_shares_z:m,max_reward_per_period:g,pending_rewards:b,accumulated_paid_rewards:h,planned_yielding_periods:f,updated_at:P,incentivized_asset:v,reward_currency:T,price_adjustment:M,min_deposit:G}=r,L=A.shiftNeg(i??M,18),W=A.shiftNeg(l,18),pt=A.shiftNeg(c?.initial_reward_percentage??0,18),mt=cr.div((0,N.default)(this.blockTime).div(1e3).times(p)).toString(),$;if(m<=0)$=(0,N.default)(W).times(d.toString()).times(mt).toString();else{let Bn=this.getGlobalRewardPerPeriod(m,d,g,L),Rn=this.getPoolYieldPerPeriod(Bn,W,m,L);$=(0,N.default)(Rn).times(mt).toString()}let at=b+h,qt=g*BigInt(f),dt=a.transferable+at,Rs=dt-at,de=(0,N.default)(Rs.toString()).div(g.toString()),ge=(0,N.default)(e).div(p.toString()).toString(),he=(m>=0?de.plus(P):de.plus(ge)).toString(),Ge=(0,N.default)(he).times(p).toString(),On=(0,N.default)(m.toString()).div((0,N.default)(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(L).toFixed(2),Fs=(0,N.default)(at.toString()).div(dt.toString()).gte(.999);$=Fs?"0":(0,N.default)($).div(s?2:1).times(100).toString();let An=pt?(0,N.default)($).times(pt).toString():void 0;return{apr:$,minApr:An,isDistributed:Fs,estimatedEndPeriod:he,estimatedEndBlock:Ge,maxRewards:qt,incentivizedAsset:v,rewardCurrency:T,loyaltyCurve:c,currentPeriod:ge,potMaxRewards:dt,fullness:On,yieldFarmId:n.id,globalFarmId:r.id,poolId:o,distributedRewards:at,plannedYieldingPeriods:f,minDeposit:G}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((n,r)=>n.includes(r.keyArgs[0].toString())?n:[...n,r.keyArgs[0].toString()],[]),s=await Promise.all(e.map(async n=>{let r=await this.getOmnipoolFarms(n);if(r)return[n,r]}));return Object.fromEntries(s.filter(n=>!!n))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),s=await this.client.getRelayBlockNumber(),n=await Promise.all(e.map(async({keyArgs:r,value:i})=>{let[,a]=r,o=i,l=await this.client.getOmnipoolGlobalFarm(a),c=await this.client.getOmnipoolYieldFarm(Number(t),a,o);if(!l||!c)return;let p=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(a),g=await this.getOraclePrice(p,d),b=await this.balanceClient.getBalance(m,p);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b}}));return s?n.map(r=>r?this.farmData(r,s):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((n,r)=>n.includes(r.keyArgs[0].toString())?n:[...n,r.keyArgs[0].toString()],[]),s=await Promise.all(e.map(async n=>{let r=await this.getIsolatedFarms(n);if(r)return[n,r]}));return Object.fromEntries(s.filter(n=>!!n))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),s=await this.client.getRelayBlockNumber(),n=await Promise.all(e.map(async({keyArgs:r,value:i})=>{let[,a]=r,o=i,l=await this.client.getIsolatedGlobalFarm(a),c=await this.client.getIsolatedYieldFarm(t,a,o);if(!l||!c)return;let p=l.reward_currency,d=l.incentivized_asset,m=this.getFarmAddress(a,!0),g=await this.getOraclePrice(p,d),b=await this.balanceClient.getBalance(m,p);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b,farmAddress:m}}));return s?n.map(r=>r?this.farmData(r,s,!0):void 0):[]}async getDepositReward(t,e,s,n){let r=e.global_farm_id,i=e.yield_farm_id,a=s?await this.client.getIsolatedYieldFarm(t,r,i):await this.client.getOmnipoolYieldFarm(Number(t),r,i),o=s?await this.client.getIsolatedGlobalFarm(r):await this.client.getOmnipoolGlobalFarm(r);if(!o||!a)return;let l=o.reward_currency,c=o.incentivized_asset,p=[[this.getFarmAddress(0,s),o.reward_currency],[this.getFarmAddress(o.id,s),o.reward_currency]],d=await this.getAccountAssetBalances(p),m=await this.getOraclePrice(l,c),g=new Fe(p,d),h=await new Ee(P=>this.getFarmAddress(P),P=>this.client.getAsset(P),g).claimRewards(o,a,e,n,m??o.price_adjustment);if(!h)return;let f=await this.client.getAsset(h.assetId);if(f&&!(h.reward<=f.existential_deposit))return h}async getAccountAssetBalances(t){let[e,s]=await Promise.all([Promise.all(t.filter(([r,i])=>i!==0).map(([r,i])=>this.balanceClient.getTokenBalance(r,i))),Promise.all(t.filter(([r,i])=>i===0).map(([r])=>this.balanceClient.getSystemBalance(r)))]),n=[];for(let r=0,i=0;r+i<t.length;){let a=r+i,[,o]=t[a];o===0?(n.push(s[i]),i+=1):(n.push(e[r]),r+=1)}return n}};var ke=require("polkadot-api"),$t=class extends q{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(ke.Binary.fromText("omnipool"),t,(0,ke.Enum)("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getAllOmnipooFarms(){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries()}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,s){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,s)}async getAllIsolatedFarms(){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries()}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,s){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,s)}async getAsset(t){return this.api.query.AssetRegistry.Assets.getValue(t)}};var Ps={};I(Ps,{PoolContextProvider:()=>Et,PoolError:()=>yt,PoolFactory:()=>Ft,PoolType:()=>C,aave:()=>fs,lbp:()=>gs,omni:()=>hs,stable:()=>bs,xyk:()=>ys});var gs={};I(gs,{LbpMath:()=>j,LbpPool:()=>Qt,LbpPoolClient:()=>Jt});var tt=require("@galacticcouncil/math-lbp"),j=class{static getSpotPrice(t,e,s,n,r){return(0,tt.get_spot_price)(t,e,s,n,r)}static calculateInGivenOut(t,e,s,n,r){return(0,tt.calculate_in_given_out)(t,e,s,n,r)}static calculateOutGivenIn(t,e,s,n,r){return(0,tt.calculate_out_given_in)(t,e,s,n,r)}static calculateLinearWeights(t,e,s,n,r){return(0,tt.calculate_linear_weights)(t,e,s,n,r)}static calculatePoolTradeFee(t,e,s){return(0,tt.calculate_pool_trade_fee)(t,e,s)}};var C=(r=>(r.Aave="Aave",r.LBP="LBP",r.Omni="Omnipool",r.Stable="Stableswap",r.XYK="XYK",r))(C||{}),yt=(r=>(r.InsufficientTradingAmount="InsufficientTradingAmount",r.MaxInRatioExceeded="MaxInRatioExceeded",r.MaxOutRatioExceeded="MaxOutRatioExceeded",r.TradeNotAllowed="TradeNotAllowed",r.UnknownError="UnknownError",r))(yt||{});var{FeeUtils:sn}=A,Qt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,s,n,r,i,a){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=s,this.maxOutRatio=n,this.minTradingLimit=r,this.fee=i,this.repayFeeApply=a}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(i=>[i.id,i])),n=s.get(t),r=s.get(e);if(n==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:n.balance,balanceOut:r.balance,decimalsIn:n.decimals,decimalsOut:r.decimals,weightIn:n.weight,weightOut:r.weight}}validateAndBuy(t,e,s){let n=this.tokens[0].id,r=[];e<this.minTradingLimit&&r.push("InsufficientTradingAmount");let i=t.balanceOut/this.maxOutRatio;if(e>i&&r.push("MaxOutRatioExceeded"),n===t.assetOut){let a=this.calculateTradeFee(e,s),o=sn.toPct(this.repayFeeApply?s.repayFee:s.exchangeFee),l=e+a,c=this.calculateInGivenOut(t,l),p=t.balanceIn/this.maxInRatio;return c>p&&r.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:r}}else{let a=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return a>o&&r.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:r}}}validateAndSell(t,e,s){let n=this.tokens[0].id,r=[];e<this.minTradingLimit&&r.push("InsufficientTradingAmount");let i=t.balanceIn/this.maxInRatio;if(e>i&&r.push("MaxInRatioExceeded"),n===t.assetIn){let a=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return a>o&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:r}}else{let a=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(a,s),l=sn.toPct(this.repayFeeApply?s.repayFee:s.exchangeFee),c=a-o,p=t.balanceOut/this.maxOutRatio;return c>p&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:c,feePct:l,errors:r}}}calculateInGivenOut(t,e){let s=j.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),n=BigInt(s);return n<0n?0n:n}calculateOutGivenIn(t,e){let s=j.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),n=BigInt(s);return n<0n?0n:n}spotPriceInGivenOut(t){let e=j.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=j.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let s=j.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(s)}};var an=require("polkadot-api"),At=require("rxjs");var nn=(u,t=new Map)=>e=>{let s;return t.has(e)?t.get(e):(t.set(e,s=u(e)),s)};var y=require("rxjs");var rn=require("rxjs"),Ce=class{store$=new rn.BehaviorSubject([]);updateQueue=Promise.resolve();changeset=new Set;get pools(){return this.store$.value}asObservable(){return this.store$.asObservable()}applyChangeset(t){return this.changeset.size===0?[]:t.filter(e=>this.changeset.has(e.address))}set(t){this.changeset=new Set(t.map(e=>e.address)),this.store$.next(t)}update(t){this.updateQueue=this.updateQueue.then(async()=>{let e=this.store$.value,s=new Map(e.map((a,o)=>[a.address,o])),n=await t(e),r=e.slice(),i=new Set;for(let a of n){let o=s.get(a.address);o===void 0?(s.set(a.address,r.length),r.push(a)):r[o]=a,i.add(a.address)}this.changeset=i,this.store$.next(r)}).catch(console.error)}destroy(){this.store$.complete()}};var Y=class extends J{evm;store=new Ce;shared$;mem=0;memPoolsCache=new ht(null,{ttl:6*1e3});memPools=nn(t=>(this.log(this.getPoolType(),"sync mem pools",t),this.loadPools()),this.memPoolsCache);constructor(t,e){super(t),this.evm=e}async getMemPools(){return this.memPools(this.mem)}async getPools(){return(await this.getMemPools()).filter(e=>this.hasValidAssets(e))}getSubscriber(){return this.shared$||(this.shared$=this.subscribeStore()),this.shared$.pipe((0,y.startWith)([]),(0,y.bufferCount)(2,1),(0,y.map)(([t,e])=>t.length===0?e:this.store.applyChangeset(e)),(0,y.filter)(t=>t.length>0),(0,y.throttleTime)(1e3,void 0,{leading:!0,trailing:!0}))}subscribeStore(){return(0,y.defer)(()=>{let t=new y.Subscription;return(0,y.from)(this.getMemPools()).pipe((0,y.map)(s=>s.filter(n=>this.hasValidAssets(n))),(0,y.tap)(s=>this.store.set(s))).pipe((0,y.tap)(()=>{t.add(this.subscribeUpdates())}),(0,y.switchMap)(s=>(0,y.merge)((0,y.of)(s),this.store.asObservable().pipe((0,y.skip)(1)))),(0,y.finalize)(()=>{t.unsubscribe()}))}).pipe((0,y.share)({connector:()=>new y.ReplaySubject(1),resetOnRefCountZero:!0}))}subscribeBalances(){let t=this.store.pools.map(e=>{let{address:s}=e,n=[this.subscribeTokensBalance(s)];if(this.hasSystemAsset(e)){let r=this.subscribeSystemBalance(s);n.push(r)}if(this.hasErc20Asset(e)){let r=e.tokens.filter(a=>a.type==="Erc20").map(a=>a.id),i=this.subscribeErc20Balance(s,r);n.push(i)}return(0,y.combineLatest)(n).pipe((0,y.map)(r=>r.flat()),(0,y.pairwise)(),(0,y.map)(([r,i])=>this.getDeltas(r,i)),(0,y.map)(r=>[s,r]))});return(0,y.combineLatest)(t).pipe((0,y.debounceTime)(250),(0,y.map)(e=>new Map(e))).subscribe(e=>this.store.update(s=>this.updateBalances(s,e)))}hasSystemAsset(t){return t.tokens.some(e=>e.id===0)}hasErc20Asset(t){return t.tokens.some(e=>e.type==="Erc20")}hasValidAssets(t){return t.tokens.every(({decimals:e,balance:s})=>s>0n&&!!e)}updateBalances=(t,e)=>{let s=[],n=new Map(t.map(r=>[r.address,r]));for(let[r,i]of e){let a=n.get(r);if(a){let o=a.tokens.map(l=>{let c=i.find(p=>p.id===l.id);return c&&l.id!==a.id?{...l,balance:c.balance.transferable}:l});s.push({...a,tokens:o})}}return s}};var Jt=class extends Y{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);getPoolType(){return"LBP"}async getPoolLimits(){let[t,e,s]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:s}}getPoolWeights(t,e){let{start:s,end:n,initial_weight:r,final_weight:i}=t,a=j.calculateLinearWeights(s?s.toString():"0",n?n.toString():"0",r.toString(),i.toString(),e.toString()),o=BigInt(a),l=this.MAX_FINAL_WEIGHT-BigInt(o);return[o,l]}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(an.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let[t,e,s]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),n=e?.relay_parent_number||0,r=t.filter(({value:i})=>e&&this.isActivePool(i,n)).map(async({keyArgs:i,value:a})=>{let[o]=i,l=o.toString(),c=await this.getPoolDelta(l,a,n);return{address:l,type:"LBP",fee:a.fee,...c,...s}});return Promise.all(r)}async getPoolDelta(t,e,s){let{assets:n,repay_target:r,fee_collector:i}=e,[a,o]=this.getPoolWeights(e,s),[l,c]=n,[p,d,m,g,b]=await Promise.all([this.isRepayFeeApplied(l,r,i.toString()),this.getBalance(t,l),this.api.query.AssetRegistry.Assets.getValue(l),this.getBalance(t,c),this.api.query.AssetRegistry.Assets.getValue(c)]);return{repayFeeApply:p,tokens:[{id:l,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:d.transferable,weight:a,type:m?.asset_type.type},{id:c,decimals:b?.decimals,existentialDeposit:b?.existential_deposit,balance:g.transferable,weight:o,type:b?.asset_type.type}]}}isActivePool(t,e){let{start:s,end:n}=t;return s&&n?e>=s&&e<n:!1}async isRepayFeeApplied(t,e,s){if(e===0n)return!1;try{return(await this.getBalance(s,t)).transferable<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolFees(t,e){let s=this.store.pools.find(r=>r.address===e);return{repayFee:await this.getRepayFee(),exchangeFee:s.fee}}subscribeValidationData(){return this.api.query.ParachainSystem.ValidationData.watchValue("best").pipe((0,At.filter)(t=>t!==void 0),(0,At.distinctUntilChanged)((t,e)=>t.relay_parent_number===e.relay_parent_number)).subscribe(({relay_parent_number:t})=>{this.store.update(async e=>{let s=[];for(let n of e){let r=this.poolsData.get(n.address);if(r){let{assets:i,repay_target:a,fee_collector:o}=r,[l]=i,[c,p]=this.getPoolWeights(r,t),[d,m]=n.tokens,g=[{...d,weight:c},{...m,weight:p}],b=await this.isRepayFeeApplied(l,a,o.toString());s.push({...n,tokens:g,repayFeeApply:b})}}return s})})}subscribeUpdates(){let t=new At.Subscription;return t.add(this.subscribeValidationData()),t}};var hs={};I(hs,{OmniMath:()=>O,OmniPool:()=>Zt,OmniPoolClient:()=>te});var w=require("@galacticcouncil/math-omnipool"),ft=st(require("big.js")),O=class{static calculateSpotPrice(t,e,s,n){return(0,w.calculate_spot_price)(t,e,s,n)}static calculateLrnaSpotPrice(t,e){return(0,w.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,s,n,r,i,a,o,l){return(0,w.calculate_in_given_out)(t,e,s,n,r,i,a,o,l)}static calculateLrnaInGivenOut(t,e,s,n,r){return(0,w.calculate_lrna_in_given_out)(t,e,s,n,r)}static calculateOutGivenIn(t,e,s,n,r,i,a,o,l){return(0,w.calculate_out_given_in)(t,e,s,n,r,i,a,o,l)}static calculateOutGivenLrnaIn(t,e,s,n,r){return(0,w.calculate_out_given_lrna_in)(t,e,s,n,r)}static calculateShares(t,e,s,n){return(0,w.calculate_shares)(t,e,s,n)}static calculateLiquidityOut(t,e,s,n,r,i,a,o){return(0,w.calculate_liquidity_out)(t,e,s,n,r,i,a,o)}static calculateLiquidityLRNAOut(t,e,s,n,r,i,a,o){return(0,w.calculate_liquidity_lrna_out)(t,e,s,n,r,i,a,o)}static calculateCapDifference(t,e,s,n){let r=(0,ft.default)(e),i=(0,ft.default)(t),a=(0,ft.default)(n),o=(0,ft.default)(s),l=(0,ft.default)(10).pow(18),c=o.div(l);if(r.div(a).lt(c)){let d=c.times(a).minus(r).times(i),m=r.times((0,ft.default)(1).minus(c));return d.div(m).toFixed(0)}else return"0"}static calculateLimitHubIn(t,e,s,n){return(0,w.calculate_liquidity_hub_in)(t,e,s,n)}static isSellAllowed(t){return(0,w.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,w.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,w.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,w.is_remove_liquidity_allowed)(t)}static recalculateAssetFee(t,e,s,n,r,i,a,o,l,c,p){return(0,w.recalculate_asset_fee)(t,e,s,n,r,i,a,o,l,c,p)}static recalculateProtocolFee(t,e,s,n,r,i,a,o,l,c,p){return(0,w.recalculate_protocol_fee)(t,e,s,n,r,i,a,o,l,c,p)}static verifyAssetCap(t,e,s,n){return(0,w.verify_asset_cap)(t,e,s,n)}};var{FeeUtils:Bt}=A,Zt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,s,n,r,i){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=s,this.maxOutRatio=n,this.minTradingLimit=r,this.hubAssetId=i}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let s=new Map(this.tokens.map(i=>[i.id,i])),n=s.get(t),r=s.get(e);if(n==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:n.hubReserves,hubReservesOut:r.hubReserves,sharesIn:n.shares,sharesOut:r.shares,decimalsIn:n.decimals,decimalsOut:r.decimals,balanceIn:n.balance,balanceOut:r.balance,tradeableIn:n.tradeable,tradeableOut:r.tradeable,assetInEd:n.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,s){let n=this.calculateInGivenOut(t,e),r=this.calculateInGivenOut(t,e,s),i=n===0n?0:_.calculateDiffToRef(r,n),a=[],o=O.isSellAllowed(t.tradeableIn),l=O.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||n<t.assetInEd)&&a.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&a.push("MaxOutRatioExceeded");let p=t.balanceIn/this.maxInRatio;return r>p&&a.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:n,amountOut:e,feePct:i,errors:a}}validateAndSell(t,e,s){let n=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,s),i=_.calculateDiffToRef(n,r),a=[],o=O.isSellAllowed(t.tradeableIn),l=O.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||n<t.assetOutEd)&&a.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&a.push("MaxInRatioExceeded");let p=t.balanceOut/this.maxOutRatio;return r>p&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:n,amountOut:r,feePct:i,errors:a}}calculateInGivenOut(t,e,s){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,s);let n=O.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?Bt.toRaw(s.assetFee).toString():"0",s?Bt.toRaw(s.protocolFee).toString():"0"),r=BigInt(n);return r<0n?0n:r}calculateLrnaInGivenOut(t,e,s){let n=O.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?Bt.toRaw(s.assetFee).toString():"0"),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e,s){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,s);let n=O.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?Bt.toRaw(s.assetFee).toString():"0",s?Bt.toRaw(s.protocolFee).toString():"0"),r=BigInt(n);return r<0n?0n:r}calculateOutGivenLrnaIn(t,e,s){let n=O.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),s?Bt.toRaw(s.assetFee).toString():"0"),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=O.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),s=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(s)}spotPriceLrnaInGivenOut(t){let e=O.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),s=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(s)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=O.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),s=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(s)}spotPriceOutGivenLrnaIn(t){let e=O.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),s=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(s)}};var ct=require("polkadot-api"),un=require("@polkadot-api/utils"),k=require("rxjs");var{FeeUtils:D}=A,on=ct.Binary.fromText("omnipool"),ln=(0,ct.Enum)("Short"),te=class extends Y{queryBus=new Yt;block=0;dynamicFeesConfig=this.queryBus.scope("DynamicFees.AssetFeeConfiguration",t=>this.api.query.DynamicFees.AssetFeeConfiguration.getValue(t),t=>String(t));dynamicFees=this.queryBus.scope("DynamicFees.AssetFee",t=>this.api.query.DynamicFees.AssetFee.getValue(t),t=>String(t),6*1e3);emaOracles=this.queryBus.scope("EmaOracle.Oracles.Short",t=>this.api.query.EmaOracle.Oracles.getValue(on,t,ln),t=>t.join(":"),6*1e3);getPoolType(){return"Omnipool"}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),s=(0,un.toHex)(e);return(0,ct.AccountId)(63).dec(s)}getOraclePair(t){return t===0?[0,1]:[1,t]}async getPoolLimits(){let[t,e,s]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:s}}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(ct.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[s,n,r,i,a]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=s.map(async({keyArgs:c,value:p})=>{let[d]=c,{hub_reserve:m,shares:g,tradable:b,cap:h,protocol_shares:f}=p,[P,v]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:P?.decimals,existentialDeposit:P?.existential_deposit,balance:v.transferable,cap:h,hubReserves:m,protocolShares:f,shares:g,tradeable:b,type:P?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:i.transferable,tradeable:n,type:r?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...a}]}async getPoolFees(t){let e=t.assetOut,s=t.assetIn,n=await this.dynamicFeesConfig.get(e);if(n?.type==="Fixed"){let{asset_fee:P,protocol_fee:v}=n.value;return{assetFee:D.fromPermill(P),protocolFee:D.fromPermill(v)}}let r=this.getOraclePair(e),i=this.getOraclePair(s),[a,o,l]=await Promise.all([this.dynamicFees.get(e),this.emaOracles.get(r),this.emaOracles.get(i)]),[c,p,d]=await this.getAssetFee(t,this.block,a,o,n?.value.asset_fee_params),[m,g,b]=s===1?[0,0,0]:await this.getProtocolFee(t,this.block,a,l,n?.value.protocol_fee_params),h=c+m,f=d+b;return{assetFee:D.fromPermill(p),protocolFee:D.fromPermill(g),min:D.fromPermill(h),max:D.fromPermill(f)}}async getAssetFee(t,e,s,n,r){let{assetOut:i,balanceOut:a}=t,{min_fee:o,max_fee:l,decay:c,amplification:p}=r||await this.api.constants.DynamicFees.AssetFeeParameters();if(!s||!n)return[o,o,l];let d=D.fromPermill(o),m=D.fromPermill(l),[g]=n,{asset_fee:b,timestamp:h}=s,f=Math.max(1,e-h),P=g.volume.b_in.toString(),v=g.volume.b_out.toString(),T=g.liquidity.b.toString();i===0&&(P=g.volume.a_in.toString(),v=g.volume.a_out.toString(),T=g.liquidity.a.toString());let M=D.fromPermill(b),G=O.recalculateAssetFee(P,v,T,"9",a.toString(),D.toRaw(M).toString(),f.toString(),D.toRaw(d).toString(),D.toRaw(m).toString(),c.toString(),p.toString());return[o,Number(G)*1e6,l]}async getProtocolFee(t,e,s,n,r){let{assetIn:i,balanceIn:a}=t,{min_fee:o,max_fee:l,decay:c,amplification:p}=r||await this.api.constants.DynamicFees.ProtocolFeeParameters();if(!s||!n)return[o,o,l];let d=D.fromPermill(o),m=D.fromPermill(l),[g]=n,{protocol_fee:b,timestamp:h}=s,f=Math.max(1,e-h),P=g.volume.b_in.toString(),v=g.volume.b_out.toString(),T=g.liquidity.b.toString();i===0&&(P=g.volume.a_in.toString(),v=g.volume.a_out.toString(),T=g.liquidity.a.toString());let M=D.fromPermill(b),G=O.recalculateProtocolFee(P,v,T,"9",a.toString(),D.toRaw(M).toString(),f.toString(),D.toRaw(d).toString(),D.toRaw(m).toString(),c.toString(),p.toString());return[o,Number(G)*1e6,l]}subscribeEmaOracles(){let[t]=this.store.pools,s=t.tokens.map(n=>n.id).map(n=>this.getOraclePair(n)).map(n=>this.api.query.EmaOracle.Oracles.watchValue(on,n,ln,"best").pipe((0,k.filter)(r=>r!==void 0),(0,k.map)(r=>({pair:n,value:r}))));return(0,k.merge)(...s).pipe((0,k.finalize)(()=>{this.log(this.getPoolType(),"unsub ema oracles"),this.emaOracles.clear()})).subscribe(n=>{let{pair:r,value:i}=n;this.emaOracles.set(i,r)})}subscribeDynamicFees(){return this.api.query.DynamicFees.AssetFee.watchEntries({at:"best"}).pipe((0,k.distinctUntilChanged)((t,e)=>!e.deltas),(0,k.finalize)(()=>{(0,k.finalize)(()=>{this.log(this.getPoolType(),"unsub dyn fees"),this.dynamicFees.clear()})})).subscribe(({deltas:t})=>{t?.upserted.forEach(e=>{let[s]=e.args;this.dynamicFees.set(e.value,s)})})}subscribeDynamicFeesConfig(){return this.api.query.DynamicFees.AssetFeeConfiguration.watchEntries({at:"best"}).pipe((0,k.distinctUntilChanged)((t,e)=>!e.deltas),(0,k.finalize)(()=>{this.log(this.getPoolType(),"unsub dyn fees config"),this.dynamicFeesConfig.clear()})).subscribe(({deltas:t})=>{t?.upserted.forEach(e=>{let[s]=e.args;this.dynamicFeesConfig.set(e.value,s)})})}subscribeBlock(){return this.api.query.System.Number.watchValue("best").pipe((0,k.finalize)(()=>{this.log(this.getPoolType(),"unsub block change")})).subscribe(t=>{this.block=t})}subscribeAssets(){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,k.distinctUntilChanged)((t,e)=>!e.deltas),(0,k.finalize)(()=>{this.log(this.getPoolType(),"unsub assets")})).subscribe(({deltas:t})=>{this.store.update(([e])=>{let s=t?.upserted.reduce((r,i)=>{let[a]=i.args;return r.set(a,i.value),r},new Map),n=e.tokens.map(r=>{let i=s?.get(r.id);return i?this.updateTokenState(r,i):r});return[{...e,tokens:n}]})})}subscribeUpdates(){let t=new k.Subscription;return t.add(this.subscribeAssets()),t.add(this.subscribeDynamicFees()),t.add(this.subscribeDynamicFeesConfig()),t.add(this.subscribeEmaOracles()),t.add(this.subscribeBlock()),t}updateTokenState(t,e){let{hub_reserve:s,shares:n,tradable:r,cap:i,protocol_shares:a}=e;return{...t,cap:i,hubReserves:s,protocolShares:a,shares:n,tradeable:r}}};var bs={};I(bs,{StableMath:()=>U,StableSwap:()=>ee,StableSwapClient:()=>se});var F=require("@galacticcouncil/math-stableswap"),U=class{static getPoolAddress(t){return(0,F.pool_account_name)(t)}static defaultPegs(t){let e=[];for(let s=0;s<t;s++)e.push(["1","1"]);return e}static calculateAmplification(t,e,s,n,r){return(0,F.calculate_amplification)(t,e,s,n,r)}static calculateInGivenOut(t,e,s,n,r,i,a){return(0,F.calculate_in_given_out)(t,e,s,n,r,i,a)}static calculateAddOneAsset(t,e,s,n,r,i,a){return(0,F.calculate_add_one_asset)(t,e,s,n,r,i,a)}static calculateSharesForAmount(t,e,s,n,r,i,a){return(0,F.calculate_shares_for_amount)(t,e,s,n,r,i,a)}static calculateOutGivenIn(t,e,s,n,r,i,a){return(0,F.calculate_out_given_in)(t,e,s,n,r,i,a)}static calculateLiquidityOutOneAsset(t,e,s,n,r,i,a){return(0,F.calculate_liquidity_out_one_asset)(t,e,s,n,r,i,a)}static calculateShares(t,e,s,n,r,i){return(0,F.calculate_shares)(t,e,s,n,r,i)}static calculateSpotPriceWithFee(t,e,s,n,r,i,a,o){return(0,F.calculate_spot_price_with_fee)(t,e,s,n,r,i,a,o)}static recalculatePegs(t,e,s,n,r){let i=(0,F.recalculate_peg)(t,e,s,n,r);return JSON.parse(i)}};var{FeeUtils:Rt}=A,ee=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;isRampPeriod;id;fee;totalIssuance;pegs;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.isRampPeriod,t.id,t.fee,t.totalIssuance,t.pegs)}constructor(t,e,s,n,r,i,a,o,l,c,p){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=s,this.maxOutRatio=n,this.minTradingLimit=r,this.amplification=i,this.isRampPeriod=a,this.id=o,this.fee=l,this.totalIssuance=c,this.pegs=p}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(i=>[i.id,i])),n=s.get(t),r=s.get(e);if(n==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:n.balance,balanceOut:r.balance,decimalsIn:n.decimals,decimalsOut:r.decimals,tradeableIn:this.id===t?15:n.tradeable,tradeableOut:this.id===e?15:r.tradeable,assetInEd:n.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,s){let n=this.calculateInGivenOut(t,e),r=this.calculateInGivenOut(t,e,s),i=n===0n?0:_.calculateDiffToRef(r,n),a=[],o=O.isSellAllowed(t.tradeableIn),l=O.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||n<t.assetInEd)&&a.push("InsufficientTradingAmount"),{amountIn:r,calculatedIn:n,amountOut:e,feePct:i,errors:a}}validateAndSell(t,e,s){let n=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,s),i=_.calculateDiffToRef(n,r),a=[],o=O.isSellAllowed(t.tradeableIn),l=O.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||n<t.assetOutEd)&&a.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:n,amountOut:r,feePct:i,errors:a}}calculateIn(t,e,s){let n=U.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),s?Rt.toRaw(s.fee).toString():"0",this.getPegs()),r=BigInt(n);return r<0n?0n:r}calculateAddOneAsset(t,e,s){let n=U.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),s?Rt.toRaw(s.fee).toString():"0",this.getPegs()),r=BigInt(n);return r<0n?0n:r}calculateSharesForAmount(t,e,s){let n=U.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),s?Rt.toRaw(s.fee).toString():"0",this.getPegs()),r=BigInt(n);return r<0n?0n:r}calculateInGivenOut(t,e,s){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,s):t.assetIn==this.id?this.calculateSharesForAmount(t,e,s):this.calculateIn(t,e,s)}spotPriceInGivenOut(t){let e=U.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let n=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(n)}let s=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(s)}calculateOut(t,e,s){let n=U.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),s?Rt.toRaw(s.fee).toString():"0",this.getPegs()),r=BigInt(n);return r<0n?0n:r}calculateWithdrawOneAsset(t,e,s){let n=U.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),s?Rt.toRaw(s.fee).toString():"0",this.getPegs()),r=BigInt(n);return r<0n?0n:r}calculateShares(t,e,s){let n=U.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),s?Rt.toRaw(s.fee).toString():"0",this.getPegs()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e,s){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,s):t.assetOut==this.id?this.calculateShares(t,e,s):this.calculateOut(t,e,s)}spotPriceOutGivenIn(t){let e=U.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let n=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(n)}let s=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(s)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:s,decimals:n})=>({asset_id:e,amount:s,decimals:n}));return JSON.stringify(t,lt.jsonFormatter)}getAssets(t,e){let s={asset_id:Number(t),amount:e.toString()};return JSON.stringify([s],lt.jsonFormatter)}};var De=require("polkadot-api"),cn=require("@polkadot-api/utils"),pn=require("@noble/hashes/blake2b"),z=require("rxjs");var{FeeUtils:pr}=A,se=class extends Y{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=U.getPoolAddress(t),s=(0,pn.blake2b)(e,{dkLen:32}),n=(0,cn.toHex)(s);return(0,De.AccountId)(63).dec(n)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}getPoolAmplification(t,e){let{initial_amplification:s,final_amplification:n,initial_block:r,final_block:i}=t,a=U.calculateAmplification(s.toString(),n.toString(),r.toString(),i.toString(),e.toString()),o=Number(a)<n;return{amplification:BigInt(a),isRampPeriod:o}}async getPoolTokens(t,e){let s=this.getPoolAddress(t),n=e.assets.map(async r=>{let[i,a,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,r),this.api.query.AssetRegistry.Assets.getValue(r),this.getBalance(s,r)]);return{id:r,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:o.transferable,tradeable:i,type:a?.asset_type.type}});return Promise.all(n)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(De.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let[t,e,s]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),n=t.map(async({keyArgs:r,value:i})=>{let[a]=r,o=this.getPoolAddress(a),[l,c,p]=await Promise.all([this.getPoolTokens(a,i),this.api.query.Stableswap.PoolPegs.getValue(a),this.api.query.Tokens.TotalIssuance.getValue(a)]),d=this.getPoolAmplification(i,e),m=c?this.getRecentPegs(c):this.getDefaultPegs(i);return l.push({id:a,tradeable:15,balance:p,decimals:18}),this.poolsData.set(a,i),{address:o,id:a,type:"Stableswap",fee:pr.fromPermill(i.fee),tokens:l,totalIssuance:p,pegs:m,...s,...d}});return Promise.all(n)}async getPoolFees(t,e){return{fee:this.store.pools.find(n=>n.address===e).fee}}getDefaultPegs(t){return U.defaultPegs(t.assets.length)}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([s,n])=>n.map(r=>r.toString()))}subscribeIssuance(){let e=this.store.pools.map(s=>s.id).map(s=>this.api.query.Tokens.TotalIssuance.watchValue(s,"best").pipe((0,z.map)(n=>({id:s,value:n}))));return(0,z.merge)(...e).pipe((0,z.finalize)(()=>{this.log(this.getPoolType(),"unsub total issuance")})).subscribe(s=>{let{id:n,value:r}=s;this.store.update(i=>{let a=[];return i.filter(o=>o.id===n).forEach(o=>{let l=o.tokens.map(c=>c.id===n?{...c,balance:r}:c);a.push({...o,tokens:l,totalIssuance:r})}),a})})}subscribePoolPegs(){return this.api.query.Stableswap.PoolPegs.watchEntries({at:"best"}).pipe((0,z.distinctUntilChanged)((t,e)=>!e.deltas),(0,z.finalize)(()=>{this.log(this.getPoolType(),"unsub pool pegs")})).subscribe(({deltas:t})=>{this.store.update(e=>{let s=[],n=new Map(e.map(r=>[r.id,r]));return t?.upserted.forEach(({args:r,value:i})=>{let[a]=r,o=n.get(a);if(o){let l=this.getRecentPegs(i);s.push({...o,pegs:l})}}),s})})}subscribeBlock(){return this.api.query.System.Number.watchValue("best").pipe((0,z.finalize)(()=>{this.log(this.getPoolType(),"unsub block change")})).subscribe(t=>{this.store.update(e=>{let s=[];return e.filter(n=>n.isRampPeriod).forEach(n=>{let r=this.poolsData.get(n.id);if(r){let i=this.getPoolAmplification(r,t);s.push({...n,...i})}}),s})})}subscribeUpdates(){let t=new z.Subscription;return t.add(this.subscribePoolPegs()),t.add(this.subscribeIssuance()),this.hasOnRamps()&&t.add(this.subscribeBlock()),t}hasOnRamps(){return this.store.pools.filter(t=>t.isRampPeriod).length>0}};var ys={};I(ys,{XykMath:()=>it,XykPool:()=>ne,XykPoolClient:()=>re});var E=require("@galacticcouncil/math-xyk"),it=class{static getSpotPrice(t,e,s){return(0,E.get_spot_price)(t,e,s)}static calculateInGivenOut(t,e,s){return(0,E.calculate_in_given_out)(t,e,s)}static calculateOutGivenIn(t,e,s){return(0,E.calculate_out_given_in)(t,e,s)}static calculatePoolTradeFee(t,e,s){return(0,E.calculate_pool_trade_fee)(t,e,s)}static calculateLiquidityIn(t,e,s){return(0,E.calculate_liquidity_in)(t,e,s)}static calculateSpotPrice(t,e){return(0,E.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,s,n){return(0,E.calculate_spot_price_with_fee)(t,e,s,n)}static calculateShares(t,e,s){return(0,E.calculate_shares)(t,e,s)}static calculateLiquidityOutAssetA(t,e,s,n){return(0,E.calculate_liquidity_out_asset_a)(t,e,s,n)}static calculateLiquidityOutAssetB(t,e,s,n){return(0,E.calculate_liquidity_out_asset_b)(t,e,s,n)}};var{FeeUtils:mn}=A,ne=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,s,n,r){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=s,this.maxOutRatio=n,this.minTradingLimit=r}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(i=>[i.id,i])),n=s.get(t),r=s.get(e);if(n==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:n.decimals,decimalsOut:r.decimals,balanceIn:n.balance,balanceOut:r.balance,assetInEd:n.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,s){let n=this.calculateInGivenOut(t,e),r=this.calculateTradeFee(n,s),i=mn.toPct(s.exchangeFee),a=n+r,o=[];(e<this.minTradingLimit||n<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let c=t.balanceIn/this.maxInRatio;return a>c&&o.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:n,amountOut:e,feePct:i,errors:o}}validateAndSell(t,e,s){let n=this.calculateOutGivenIn(t,e),r=this.calculateTradeFee(n,s),i=mn.toPct(s.exchangeFee),a=n-r,o=[];(e<this.minTradingLimit||n<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let c=t.balanceOut/this.maxOutRatio;return a>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:n,amountOut:a,feePct:i,errors:o}}calculateInGivenOut(t,e){let s=it.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),n=BigInt(s);return n<0n?0n:n}calculateOutGivenIn(t,e){let s=it.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),n=BigInt(s);return n<0n?0n:n}spotPriceInGivenOut(t){let e=it.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),s=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(s)}spotPriceOutGivenIn(t){let e=it.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),s=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(s)}calculateTradeFee(t,e){let s=it.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(s)}};var dn=require("polkadot-api"),gn=require("rxjs");var re=class extends Y{decimals=new Map([]);getPoolType(){return"XYK"}async withOverride(t){this.decimals=t?new Map(t.map(e=>[e.id,e.decimals])):new Map}async getPoolLimits(){let[t,e,s]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:s}}async isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(dn.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,s]=await Promise.all([t.getEntries(),this.getPoolLimits()]),n=e.map(async({keyArgs:r,value:i})=>{let[a]=r,[o,l]=i,[c,p,d,m]=await Promise.all([this.getBalance(a,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(a,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:a,type:"XYK",tokens:[{id:o,decimals:p?.decimals||this.decimals.get(o),existentialDeposit:p?.existential_deposit,balance:c.transferable,type:p?.asset_type.type},{id:l,decimals:m?.decimals||this.decimals.get(l),existentialDeposit:m?.existential_deposit,balance:d.transferable,type:m?.asset_type.type}],...s}});return Promise.all(n)}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}subscribeUpdates(){return gn.Subscription.EMPTY}};var fs={};I(fs,{AavePool:()=>ie,AavePoolClient:()=>ae});var ie=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,s,n,r){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=s,this.maxOutRatio=n,this.minTradingLimit=r}validatePair(t,e){return!0}parsePair(t,e){let s=new Map(this.tokens.map(i=>[i.id,i])),n=s.get(t),r=s.get(e);if(n==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:n.balance,balanceOut:r.balance,decimalsIn:n.decimals,decimalsOut:r.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,s){let n=this.calculateInGivenOut(t,e),r=[];return e>t.balanceOut&&r.push("TradeNotAllowed"),{amountIn:n,calculatedIn:n,amountOut:e,feePct:0,errors:r}}validateAndSell(t,e,s){let n=this.calculateOutGivenIn(t,e),r=[];return n>t.balanceOut&&r.push("TradeNotAllowed"),{amountIn:e,calculatedOut:n,amountOut:n,feePct:0,errors:r}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};var bn=require("polkadot-api"),yn=require("@polkadot-api/utils"),H=require("rxjs"),fn=require("viem");var hn=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:mr}=gt,dr=["Supply","Withdraw","Repay","Borrow"],ae=class extends Y{getPoolType(){return"Aave"}async isSupported(){return!0}getPoolId(t,e){let s=t+"/"+e,n=new TextEncoder().encode(s.padEnd(32,"\0")),r=(0,yn.toHex)(n);return(0,bn.AccountId)(63).dec(r)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:s,atoken:n,liqudity_in:r,liqudity_out:i})=>{let[a,o,l,c]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(s),this.api.query.AssetRegistry.AssetLocations.getValue(s),this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n)]);return{address:this.getPoolId(s,n),type:"Aave",tokens:[{id:s,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:r,location:o,type:a?.asset_type.type},{id:n,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:i,location:c,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,s]=t.tokens,{liqudity_in:n,liqudity_out:r}=await this.api.apis.AaveTradeExecutor.pool(e.id,s.id);return t.tokens.map(i=>{let a=i.id===e.id?n:r;return{...i,balance:a}})}async getPoolFees(){return{}}getReserveH160Id(t){return t.type==="Erc20"?lt.findNestedKey(t.location,"AccountKey20").AccountKey20.key:mr.fromAssetId(t.id)}parseRouterLog(t){let{asset_in:e,asset_out:s}=t;return{assetIn:e,assetOut:s,key:`${e}:${s}`}}parseEvmLog(t){let{topics:e,data:s}=t.log,n=e.map(i=>i.asHex()),r=s.asHex();try{let{eventName:i,args:a}=(0,fn.decodeEventLog)({abi:hn,topics:n,data:r}),o=a.reserve.toLowerCase();return{eventName:i,reserve:o,key:`${i}:${o}`}}catch{return}}subscribeRouterExecuted(){let e=this.store.pools.map(s=>s.tokens).map(([s,n])=>n).map(s=>s.id);return this.api.event.Router.Executed.watch().pipe((0,H.map)(({payload:s})=>this.parseRouterLog(s)),(0,H.filter)(({assetIn:s,assetOut:n})=>e.includes(s)||e.includes(n)),(0,H.finalize)(()=>{this.log(this.getPoolType(),"unsub router executed")})).subscribe(({assetIn:s,assetOut:n,key:r})=>{this.log(this.getPoolType(),"[router:Executed]",r),this.store.update(async i=>{let a=[];for(let o of i){let[l,c]=o.tokens;if(c.id===s||c.id===n){let d=await this.getPoolDelta(o);a.push({...o,tokens:d})}}return a})})}subscribeEvmLog(){return this.api.event.EVM.Log.watch().pipe((0,H.map)(({payload:t})=>this.parseEvmLog(t)),(0,H.filter)(t=>t!==void 0),(0,H.filter)(({eventName:t})=>dr.includes(t)),(0,H.finalize)(()=>{this.log(this.getPoolType(),"unsub evm log")})).subscribe(({reserve:t,key:e})=>{this.log(this.getPoolType(),"[evm:Log]",e),this.store.update(async s=>{let n=[];for(let r of s){let[i]=r.tokens;if(this.getReserveH160Id(i).toLowerCase()===t){let o=await this.getPoolDelta(r);n.push({...r,tokens:o})}}return n})})}subscribeBalances(){return H.Subscription.EMPTY}subscribeUpdates(){let t=new H.Subscription;return t.add(this.subscribeRouterExecuted()),t.add(this.subscribeEvmLog()),t}};var Ft=class{static get(t){switch(t.type){case"Aave":return ie.fromPool(t);case"XYK":return ne.fromPool(t);case"Omnipool":return Zt.fromPool(t);case"LBP":return Qt.fromPool(t);case"Stableswap":return ee.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var et=require("rxjs");var Et=class extends q{evm;aave;omnipool;stableswap;xyk;lbp;active=new Set([]);pools=new Map([]);clients=[];aaveSub=et.Subscription.EMPTY;omniSub=et.Subscription.EMPTY;stableSub=et.Subscription.EMPTY;xykSub=et.Subscription.EMPTY;lbpSub=et.Subscription.EMPTY;isReady=!1;isDestroyed=new et.Subject;constructor(t,e){super(t),this.evm=e,this.lbp=new Jt(t,e),this.omnipool=new te(t,e),this.stableswap=new se(t,e),this.xyk=new re(t,e),this.aave=new ae(t,e),this.clients=[this.lbp,this.omnipool,this.stableswap,this.xyk,this.aave]}subscribe(t){return t.getSubscriber().pipe((0,et.takeUntil)(this.isDestroyed)).subscribe(e=>{e.forEach(s=>{this.pools.set(s.address,s)})})}withOmnipool(){return this.omniSub.unsubscribe(),this.omniSub=this.subscribe(this.omnipool),this.active.add("Omnipool"),this}withStableswap(){return this.stableSub.unsubscribe(),this.stableSub=this.subscribe(this.stableswap),this.active.add("Stableswap"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbp),this.active.add("LBP"),this}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aave),this.active.add("Aave"),this}withXyk(t){return this.xyk.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xyk),this.active.add("XYK"),this}destroy(){this.isDestroyed.next(!0),this.isDestroyed.complete(),this.active.clear(),this.pools.clear(),this.isReady=!1}async getPools(){if(this.isReady){let e=this.pools.values();return Array.from(e)}let t=await Promise.all(this.clients.filter(e=>this.active.has(e.getPoolType())).map(e=>e.getPools()));return this.isReady=!0,t.flat()}async getPoolFees(t,e){let s=this.clients.find(n=>n.getPoolType()===e.type);if(s)return s.getPoolFees(t,e.address);throw new zt(e.type)}};var _s={};I(_s,{DEFAULT_BLOCK_TIME:()=>Sn,DEFAULT_MIN_BUDGET:()=>ws,ORDER_MIN_BLOCK_PERIOD:()=>vn,Router:()=>kt,TWAP_BLOCK_PERIOD:()=>ce,TWAP_MAX_DURATION:()=>xs,TWAP_MAX_PRICE_IMPACT:()=>Ts,TWAP_TX_MULTIPLIER:()=>cc,TradeOrderError:()=>vs,TradeOrderType:()=>Le,TradeRouteBuilder:()=>X,TradeRouter:()=>Ct,TradeScheduler:()=>Dt,TradeType:()=>Me});var oe=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var gr=10,le=class{isNotVisited(t,e){let s=!0;return e.forEach(n=>{(n[0]===t[0]||n[1]===t[1])&&(s=!1)}),s}findPaths(t,e,s){let n=[],r=new oe,i=[];for(i.push([e,""]),r.enqueue(i);r.size()>0;){let a=r.dequeue();if(!a||a.length>gr)continue;let o=a[a.length-1];(s===null||o[0]===s)&&n.push(a),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,a)){let p=[...a];p.push(c),r.enqueue(p)}})}return n}findShortestPaths(t,e,s){let n=[],r=new oe,i=[];i.push([e,""]),r.enqueue(i);let a=1/0;for(;r.size()>0;){let o=r.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===s){o.length<a?(a=o.length,n.length=0,n.push(o)):o.length===a&&n.push(o);continue}let c=t.get(l[0]);for(let p of c??[])this.isNotVisited(p,o)&&r.enqueue([...o,p])}return n}buildAndPopulateGraph(t,e){let s=new Map;for(let n of t)s.set(parseInt(n),[]);for(let[n,r,i]of e)s.get(r)?.push([i,n]);return s}};function Ss(u){let t={};for(let e of u){let s=e.tokens.length;for(let n=0;n<s;n++){t[e.tokens[n].id]||(t[e.tokens[n].id]=[]);for(let r=0;r<s;r++){if(n==r)continue;let i=[e.address,e.tokens[n].id,e.tokens[r].id];t[e.tokens[n].id].push(i)}}}return t}var ue=class{getProposals(t,e,s){let n=s.filter(h=>h.type==="XYK"),r=s.filter(h=>h.type!=="XYK"),i=new Set(r.map(h=>h.tokens).flat().map(h=>h.id)),a=i.has(t),o=i.has(e),l=new le,c=h=>{let f=Ss(h),P=Object.keys(f),v=P.flatMap(T=>f[T]);return l.buildAndPopulateGraph(P,v)};if(!a&&!o){let h=n.filter(v=>v.tokens.find(T=>T.id===t)||v.tokens.find(T=>T.id===e)),f=c(h),P=l.findPaths(f,t,e);return this.parsePaths(P)}if(a&&o){let h=c(r),f=l.findPaths(h,t,e);return this.parsePaths(f)}let p=a?e:t,d=n.filter(h=>h.tokens.some(f=>f.id===p));if(d.length===0)return[];let m=[...r,...d],g=c(m),b=l.findPaths(g,t,e);return this.parsePaths(b)}parsePaths(t){let e=[];for(let s of t){let n=[];for(let r=0;r<s.length;r++){let i=s[r],a=s[r+1];if(a==null)break;n.push(this.toEdge(i,a))}e.push(n)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var kt=class{routeSuggester;routeProposals;ctx;filter={};constructor(t){this.ctx=t,this.routeSuggester=new ue,this.routeProposals=new Map}async withFilter(t){this.filter=t||{}}buildRouteKey(t,e,s){return`${t}->${e}::${s.length}`}applyPoolFilter(t){let{useOnly:e=[],exclude:s=[]}=this.filter,n=new Set(e),r=new Set(s);return t.filter(i=>r.has(i.type)?!1:n.size>0?n.has(i.type):!0)}async getPools(){let t=await this.ctx.getPools();return this.applyPoolFilter(t)}async getRoutes(t,e){let s=await this.getPools();return this.validateInput(t,e,s),this.getPaths(t,e,s)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}async getRouteableAssets(t){let e=await this.getTradeableAssets();return(await Promise.all(e.filter(n=>n!==t).map(n=>this.getRoutes(n,t)))).filter(n=>n.length>0).map(([n])=>n[0].assetIn).sort()}validateInput(t,e,s){if(s.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let n=this.getAssets(s);if(!n.has(t))throw new Error(t+" is not supported asset");if(!n.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(s)}getAssets(t){let e=t.map(s=>s.tokens.map(n=>n.id)).flat().sort((s,n)=>s>n?1:-1);return new Set(e)}getPaths(t,e,s){let n=this.toPoolsMap(s);return this.getProposals(t,e,s).filter(i=>this.validPath(i,n)).map(i=>this.toHops(i,n))}getProposals(t,e,s){let n=this.buildRouteKey(t,e,s);if(this.routeProposals.has(n))return this.routeProposals.get(n);let r=this.routeSuggester.getProposals(t,e,s);return this.routeProposals.set(n,r),r}validPath(t,e){return t.length>0&&t.map(s=>this.validEdge(s,e)).reduce((s,n)=>s&&n)}validEdge([t,e,s],n){return n.get(t)?.validatePair(e,s)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,Ft.get(e)]))}toHops(t,e){return t.map(([s,n,r])=>{let i=e.get(s);return{poolAddress:s,poolId:i?.id,pool:i?.type,assetIn:n,assetOut:r}})}};var Me=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Me||{}),Le=(s=>(s.Dca="Dca",s.TwapSell="TwapSell",s.TwapBuy="TwapBuy",s))(Le||{}),vs=(s=>(s.OrderTooSmall="OrderTooSmall",s.OrderTooBig="OrderTooBig",s.OrderImpactTooBig="OrderImpactTooBig",s))(vs||{});var{FeeUtils:Pn}=A,Ct=class extends kt{mlr;poolsSnapshot;constructor(t){super(t),this.mlr=new Map}buildCtxSync(t,e){let s=this.poolsSnapshot,n=super.validateInput(t,e,s),r=super.getPaths(t,e,s);if(!r.length)throw new Xt(t,e);return{paths:r,pools:s,poolsMap:n}}async withCtx(t,e,s){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let n=this.buildCtxSync(t,e);return s(n)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((s,n)=>{let r=s[s.length-1].amountOut,i=n[n.length-1].amountOut;return r>i?-1:1});return e.find(s=>s.every(n=>n.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(s=>s.tradeFeeRange).length>0){let s=t.map(r=>r.tradeFeeRange?.[0]??r.tradeFeePct).reduce((r,i)=>r+i),n=t.map(r=>r.tradeFeeRange?.[1]??r.tradeFeePct).reduce((r,i)=>r+i);return[s,n]}}getPoolFeeRange(t){let e=t.min?Pn.toPct(t.min):void 0,s=t.max?Pn.toPct(t.max):void 0;if(e&&s)return[e,s]}async getBestSell(t,e,s){return this.getSell(t,e,s)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let s=t.map(a=>a.assetOutDecimals).reduce((a,o)=>a+o),n=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),r=s-e.assetOutDecimals,i=Math.pow(10,r);return n/BigInt(i)}async getSell(t,e,s,n){return this.withCtx(t,e,async({paths:r,poolsMap:i})=>{let a;if(n)a=await this.toSellSwaps(s,n,i);else{let o=r.map(c=>this.toSellSwaps(s,c,i)),l=await Promise.all(o);a=this.findBestSellRoute(l)}return this.buildSell(i,a)})}async getSells(t,e,s){return this.withCtx(t,e,async({paths:n,poolsMap:r})=>{let i=n.map(o=>this.toSellSwaps(s,o,r));return(await Promise.all(i)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildSell(r,o)).sort((o,l)=>o.amountOut>l.amountOut?-1:1)})}buildSell(t,e){let s=e[0],n=e[e.length-1],r=this.isDirectTrade(e),i=this.getSellSpot(e),a=n.amountOut,o=r?n.calculatedOut:this.calculateDelta0Y(s.amountIn,e,t),l=o-a,c=this.getRouteFeeRange(e),p=r?n.tradeFeePct:_.calculateSellFee(o,a),d=Math.pow(10,s.assetInDecimals),m=s.amountIn*i/BigInt(d),g=_.calculateDiffToRef(o,m);return{type:"Sell",amountIn:s.amountIn,amountOut:n.amountOut,spotPrice:i,tradeFee:l,tradeFeePct:p,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:S.toDecimal(s.amountIn,s.assetInDecimals),amountOut:S.toDecimal(n.amountOut,n.assetOutDecimals),spotPrice:S.toDecimal(i,n.assetOutDecimals),tradeFee:S.toDecimal(l,n.assetOutDecimals),tradeFeePct:p,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0Y(t,e,s){let n=[];for(let r=0;r<e.length;r++){let i=e[r],a=s.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;r>0?l=n[r-1]:l=t;let c=a.calculateOutGivenIn(o,l);n.push(c)}return n[n.length-1]}async calculateMostLiquidRoute(t,e,s){let{paths:n,pools:r,poolsMap:i}=s,l=r.filter(b=>b.tokens.some(h=>h.id===t)).map(b=>b.type==="Aave"?b.tokens:b.tokens.filter(h=>h.id===t)).map(b=>b.map(h=>h.balance).reduce((h,f)=>h+f)).sort((b,h)=>h<b?-1:1)[0],c=_.getFraction(l,.1),p=await Promise.all(n.map(b=>this.toSellSwaps(c,b,i))),m=this.findBestSellRoute(p).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),g=this.buildRouteKey(t,e,r);return this.mlr.set(g,m),m}async toSellSwaps(t,e,s){let n=[];for(let r=0;r<e.length;r++){let i=e[r],a=s.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;r>0?l=n[r-1].amountOut:l=typeof t=="string"?S.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(o,a),{amountOut:p,calculatedOut:d,feePct:m,errors:g}=a.validateAndSell(o,l,c),b=this.getPoolFeeRange(c),h=a.spotPriceOutGivenIn(o),f=Math.pow(10,o.decimalsIn),P=l*h/BigInt(f),v=_.calculateDiffToRef(d,P);n.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:p,calculatedOut:d,spotPrice:h,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:v,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===i.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===i.assetIn},toHuman(){return{...i,amountIn:S.toDecimal(l,o.decimalsIn),amountOut:S.toDecimal(p,o.decimalsOut),calculatedOut:S.toDecimal(d,o.decimalsOut),spotPrice:S.toDecimal(h,o.decimalsOut),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:v,errors:g}}})}return n}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async s=>{let n=this.buildRouteKey(t,e,s.pools),r=this.mlr.get(n);return r||this.calculateMostLiquidRoute(t,e,s)})}async getSpotPrice(t,e){return this.withCtx(t,e,async s=>{let{pools:n,poolsMap:r}=s,i=this.buildRouteKey(t,e,n),a=this.mlr.get(i);a||(a=await this.calculateMostLiquidRoute(t,e,s));let o=await this.toSellSwaps("1",a,r),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}}).catch(()=>{})}findBestBuyRoute(t){let e=t.sort((s,n)=>{let r=s[0].amountIn,i=n[0].amountIn;return r>i?1:-1});return e.find(s=>s.every(n=>n.errors.length==0))||e[0]}async getBestBuy(t,e,s){return this.getBuy(t,e,s)}getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let s=t.map(a=>a.assetInDecimals).reduce((a,o)=>a+o),n=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),r=s-e.assetInDecimals,i=Math.pow(10,r);return n/BigInt(i)}async getBuy(t,e,s,n){return this.withCtx(t,e,async({paths:r,poolsMap:i})=>{let a;if(n)a=await this.toBuySwaps(s,n,i);else{let o=r.map(c=>this.toBuySwaps(s,c,i)),l=await Promise.all(o);a=this.findBestBuyRoute(l)}return this.buildBuy(i,a)})}async getBuys(t,e,s){return this.withCtx(t,e,async({paths:n,poolsMap:r})=>{let i=n.map(o=>this.toBuySwaps(s,o,r));return(await Promise.all(i)).filter(o=>o.every(l=>l.errors.length==0)).map(o=>this.buildBuy(r,o)).sort((o,l)=>o.amountIn>l.amountIn?1:-1)})}buildBuy(t,e){let s=e[e.length-1],n=e[0],r=this.isDirectTrade(e),i=this.getBuySpot(e),a=n.amountIn,o=r?n.calculatedIn:this.calculateDelta0X(s.amountOut,e,t),l=a-o,c=this.getRouteFeeRange(e),p=r?n.tradeFeePct:_.calculateBuyFee(o,a),d=Math.pow(10,s.assetOutDecimals),m=s.amountOut*i/BigInt(d),g;return o===0n?g=-100:g=_.calculateDiffToRef(m,o),{type:"Buy",amountOut:s.amountOut,amountIn:n.amountIn,spotPrice:i,tradeFee:l,tradeFeePct:p,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:S.toDecimal(s.amountOut,s.assetOutDecimals),amountIn:S.toDecimal(n.amountIn,n.assetInDecimals),spotPrice:S.toDecimal(i,n.assetInDecimals),tradeFee:S.toDecimal(l,n.assetInDecimals),tradeFeePct:p,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0X(t,e,s){let n=[];for(let r=e.length-1;r>=0;r--){let i=e[r],a=s.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;r==e.length-1?l=t:l=n[0];let c=a.calculateInGivenOut(o,l);n.unshift(c)}return n[0]}async toBuySwaps(t,e,s){let n=[];for(let r=e.length-1;r>=0;r--){let i=e[r],a=s.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;r==e.length-1?l=typeof t=="string"?S.toBigInt(t,o.decimalsOut):t:l=n[0].amountIn;let c=await this.ctx.getPoolFees(o,a),{amountIn:p,calculatedIn:d,feePct:m,errors:g}=a.validateAndBuy(o,l,c),b=this.getPoolFeeRange(c),h=a.spotPriceInGivenOut(o),f=Math.pow(10,o.decimalsOut),P=l*h/BigInt(f),v;d===0n?v=-100:v=_.calculateDiffToRef(P,d),n.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:p,calculatedIn:d,spotPrice:h,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:v,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===i.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===i.assetIn},toHuman(){return{...i,amountOut:S.toDecimal(l,o.decimalsOut),amountIn:S.toDecimal(p,o.decimalsIn),calculatedIn:S.toDecimal(d,o.decimalsIn),spotPrice:S.toDecimal(h,o.decimalsIn),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:v,errors:g}}})}return n}};var Sn=6e3,ws=1000000000000000n,ce=6,Ts=-5,xs=216e5,cc=3,vn=6;var Is=require("polkadot-api");var X=class{static build(t){return t.map(({assetIn:e,assetOut:s,pool:n,poolId:r})=>n==="Stableswap"?{pool:(0,Is.Enum)("Stableswap",r),asset_in:e,asset_out:s}:{pool:(0,Is.Enum)(n),asset_in:e,asset_out:s})}};var Dt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??ws})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,s,n,r){let[i,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,s)]),{amountIn:o,swaps:l,priceImpactPct:c}=a,p=l[0],d=l[l.length-1],{assetInDecimals:m}=p,{assetOutDecimals:g}=d,b=Math.abs(c),h=this.getMinimumTradeCount(o,i),f=this.getOptimalTradeCount(b),P=r?Math.round(n/r):f,v=Math.ceil(n/h),T=Math.round(n/f),M=Math.round(n/P),G=o/BigInt(P),L=await this.router.getBestSell(t,e,G),W=o<i,pt=[];W&&pt.push("OrderTooSmall");let mt=L.amountOut*BigInt(P),$=this.toBlockPeriod(M),at=L.tradeFee*BigInt(P),qt=X.build(l),dt={assetIn:t,assetOut:e,errors:pt,frequencyMin:v,frequencyOpt:T,frequency:M,tradeCount:P,tradeFee:at,tradeImpactPct:L.priceImpactPct,tradePeriod:$,tradeRoute:qt,type:"Dca"};return{...dt,amountIn:o,amountOut:mt,tradeAmountIn:L.amountIn,tradeAmountOut:L.amountOut,toHuman(){return{...dt,amountIn:S.toDecimal(o,m),amountOut:S.toDecimal(mt,g),tradeAmountIn:S.toDecimal(L.amountIn,m),tradeAmountOut:S.toDecimal(L.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),s=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/s;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let s=e*2n/10n;if(s===0n)return 0;let n=t+s/2n;return Number(n/s)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,s){let[n,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,s)]),{amountIn:i,swaps:a,priceImpactPct:o}=r,l=a[0],c=a[a.length-1],{assetInDecimals:p}=l,{assetOutDecimals:d}=c,m=Math.abs(o),g=this.getTwapTradeCount(m),b=i/BigInt(g),h=await this.router.getBestSell(l.assetIn,c.assetOut,b),f=g===1,P=i<n,v=h.priceImpactPct<-5,T=[];P||f?T.push("OrderTooSmall"):v&&T.push("OrderImpactTooBig");let M=h.amountOut*BigInt(g),G=h.tradeFee*BigInt(g),L=X.build(a),W={assetIn:t,assetOut:e,errors:T,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:L,type:"TwapSell"};return{...W,amountIn:i,amountOut:M,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:G,toHuman(){return{...W,amountIn:S.toDecimal(i,p),amountOut:S.toDecimal(M,d),tradeAmountIn:S.toDecimal(h.amountIn,p),tradeAmountOut:S.toDecimal(h.amountOut,d),tradeFee:S.toDecimal(G,d)}}}}async getTwapBuyOrder(t,e,s){let[n,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,s)]),{amountOut:i,swaps:a,priceImpactPct:o}=r,l=a[0],c=a[a.length-1],{assetInDecimals:p}=l,{assetOutDecimals:d}=c,m=Math.abs(o),g=this.getTwapTradeCount(m),b=i/BigInt(g),h=await this.router.getBestBuy(l.assetIn,c.assetOut,b),f=h.amountIn*BigInt(g),P=g===1,v=f<n,T=h.priceImpactPct<-5,M=[];v||P?M.push("OrderTooSmall"):T&&M.push("OrderImpactTooBig");let G=h.tradeFee*BigInt(g),L=X.build(a),W={assetIn:t,assetOut:e,errors:M,tradeCount:g,tradeImpactPct:h.priceImpactPct,tradePeriod:6,tradeRoute:L,type:"TwapBuy"};return{...W,amountIn:f,amountOut:i,tradeAmountIn:h.amountIn,tradeAmountOut:h.amountOut,tradeFee:G,toHuman(){return{...W,amountIn:S.toDecimal(f,p),amountOut:S.toDecimal(i,d),tradeAmountIn:S.toDecimal(h.amountIn,p),tradeAmountOut:S.toDecimal(h.amountOut,d),tradeFee:S.toDecimal(G,p)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let n=216e5/(this.blockTime*6);return Math.round(n)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,s=Math.round(e);return Math.max(s,6)}};var Os={};I(Os,{BIG_10:()=>xn,BIG_BILL:()=>In,StakingApi:()=>pe,StakingClient:()=>me});var wn=require("@polkadot/util-crypto"),Tn=require("@polkadot/util"),St=require("@galacticcouncil/math-staking"),Pt=st(require("big.js")),xn=(0,Pt.default)(10),In=(0,Pt.default)(xn.pow(12));function hr(u){return(0,wn.encodeAddress)((0,Tn.stringToU8a)(("modl"+u).padEnd(32,"\0")),63)}var pe=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=hr(t);return(await this.balanceClient.getBalance(e,0)).transferable}async getStakingPosition(t){let[e,s]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]),n=e?.created_at,r=await s.reduce(async(i,[a,o])=>{let l=await i,c=a,p=o.amount,d=o.conviction.toString(),m=await this.client.getReferendumInfo(c);return m&&(m.type==="Approved"||m.type==="Rejected")&&l.push({id:c,amount:p,conviction:d}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt:n,actionPoints:e?.action_points,accumulatedUnpaidRewards:e?.accumulated_unpaid_rewards,accumulatedSlashPoints:e?.accumulated_slash_points,accumulatedLockedRewards:e?.accumulated_locked_rewards,votes:r}}async getStake(t){let e=await this.client.getNFTCollectionId(),[s,n]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),r=n.find(i=>i)?.itemId;return{totalStake:s?.total_stake,accumulatedRewardPerStake:s?.accumulated_reward_per_stake,potReservedBalance:s?.pot_reserved_balance,positionId:r,stakePosition:r?await this.getStakingPosition(r):void 0}}async getRewards(t,e){let s=await this.getStake(t),{potReservedBalance:n,accumulatedRewardPerStake:r,totalStake:i,stakePosition:a}=s;if(!a)return;let[o,l,c,p]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=(0,Pt.default)(o.toString()).minus(n.toString()),m=r.toString(),g=(0,Pt.default)(e).plus(1).toString();d.gt(0)&&i>0&&(m=(0,St.calculate_accumulated_rps)(r.toString(),d.toString(),i.toString()));let b=(0,St.calculate_period_number)(l.toString(),e,p??g),h=(0,St.calculate_period_number)(l.toString(),a.createdAt?.toString()??"",p??g),f=(0,St.calculate_rewards)(m,a.rewardPerStake?.toString()??"",a.stake?.toString()??""),P=(0,Pt.default)(f).plus(a.accumulatedUnpaidRewards?.toString()||"0").plus(a.accumulatedLockedRewards?.toString()||"0");if(!(0,Pt.default)(b).minus(h).lte(c.toString()))return P.div(In).toString()}};var me=class extends q{async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:i})=>{let[a,o,l]=i;return{address:a,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var Bs={};I(Bs,{TxBuilderFactory:()=>Lt});var As=require("polkadot-api");function _n(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var Mt=class extends q{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new J(t),this.aaveUtils=new bt(e)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:s=>this.dryRun(s,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:Ye})}async dryRun(t,e){let s=(0,As.Enum)("Signed",t),n=(0,As.Enum)("system",s),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(n,e.decodedCall),a=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(a){let o=_n(a.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var qe=class extends Mt{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:s}=this.trade;if(s==="Buy")return this.buildBuyTx();let{assetIn:n}=e[0],r=await this.balanceClient.getBalance(this.beneficiary,n);return t>=r.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:s}=this.trade,n=s[0],r=s[s.length-1],i=_.getFraction(t,this.slippagePct),a=n.assetIn,o=r.assetOut,l=t+i,c;return this.isDirectOmnipoolTrade(s)?c=this.api.tx.Omnipool.buy({asset_in:a,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:a,asset_out:o,amount_out:e,max_amount_in:l,route:X.build(s)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:s}=this.trade,n=s[0],r=s[s.length-1],i=_.getFraction(e,this.slippagePct),a=n.assetIn,o=r.assetOut,l=e-i,c;return this.isDirectOmnipoolTrade(s)?c=this.api.tx.Omnipool.sell({asset_in:a,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:a,asset_out:o,amount_in:t,min_amount_out:l,route:X.build(s)}),n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=await this.dispatchWithExtraGas(c)),this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,s=e[0],n=e[e.length-1],r=_.getFraction(t,this.slippagePct),i=s.assetIn,a=n.assetOut,o=t-r,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:a,min_amount_out:o,route:X.build(e)});return s.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var Ne=require("polkadot-api");var Ue=class extends Mt{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:s,tradeAmountIn:n,tradePeriod:r,tradeRoute:i}=this.order,a=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:r,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Ne.Enum)("Sell",{asset_in:e,asset_out:s,amount_in:n,min_amount_out:0n,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",a)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:s,tradeAmountIn:n,tradeAmountOut:r,tradePeriod:i,tradeRoute:a}=this.order,o=_.getFraction(r,this.slippagePct),l=r-o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Ne.Enum)("Sell",{asset_in:e,asset_out:s,amount_in:n,min_amount_out:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:s,tradeAmountIn:n,tradeAmountOut:r,tradePeriod:i,tradeRoute:a}=this.order,o=_.getFraction(n,this.slippagePct),l=n+o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Ne.Enum)("Buy",{asset_in:e,asset_out:s,amount_out:r,max_amount_in:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var Lt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new qe(this.client,this.evmClient).setTrade(t)}order(t){return new Ue(this.client,this.evmClient).setOrder(t)}};async function br(u){let t=new Ot(u),e=new Kt(u),[s,n]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),r=new Et(u,e).withAave().withOmnipool().withStableswap().withXyk(),i=new J(u),a=new me(u),o=new $t(u),l=new bt(e),c=new Ct(r),p=new Dt(c,{blockTime:s,minBudgetInNative:n}),d=new pe(a,i),m=new jt(o,i,{blockTime:s});return{api:{aave:l,router:c,scheduler:p,staking:d,farm:m},client:{asset:new _t(u),balance:i,evm:e},ctx:{pool:r},tx:new Lt(u,e),destroy:()=>{r.destroy()}}}0&&(module.exports={QueryBus,aave,api,big,client,const:null,createSdkContext,erc20,error,evm,farm,fmt,h160,json,math,pool,sor,staking,tx,xc});