@galacticcouncil/sdk-next 0.8.0-pr203-91dcafe → 0.8.0-pr203-a290925

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 lr=Object.create;var pe=Object.defineProperty;var cr=Object.getOwnPropertyDescriptor;var ur=Object.getOwnPropertyNames;var mr=Object.getPrototypeOf,pr=Object.prototype.hasOwnProperty;var wn=(u,t)=>()=>(u&&(t=u(u=0)),t);var I=(u,t)=>{for(var e in t)pe(u,e,{get:t[e],enumerable:!0})},me=(u,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ur(t))!pr.call(u,r)&&r!==e&&pe(u,r,{get:()=>t[r],enumerable:!(n=cr(t,r))||n.enumerable});return u},ft=(u,t,e)=>(me(u,t,"default"),e&&me(e,t,"default")),nt=(u,t,e)=>(e=u!=null?lr(mr(u)):{},me(t||!u||!u.__esModule?pe(e,"default",{value:u,enumerable:!0}):e,u)),dr=u=>me(pe({},"__esModule",{value:!0}),u);var Dt={};var vn=wn(()=>{ft(Dt,require("@polkadot-api/ws-provider/node"))});var Mt={};var On=wn(()=>{ft(Mt,require("@polkadot-api/ws-provider/web"))});var Hr={};I(Hr,{aave:()=>Xe,api:()=>Fe,big:()=>f,client:()=>Ke,const:()=>Ne,createSdkContext:()=>Wr,erc20:()=>dt,error:()=>je,evm:()=>Qe,farm:()=>en,fmt:()=>O,h160:()=>Nt,json:()=>lt,math:()=>A,pool:()=>cn,sor:()=>bn,staking:()=>fn,tx:()=>Tn,xc:()=>He});module.exports=dr(Hr);var Fe={};I(Fe,{Papi:()=>D,getWs:()=>gr});var In=require("@galacticcouncil/descriptors");function xn(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(In.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");xn(n)&&console.log(t,...e)}};var An=require("polkadot-api"),Bn=require("polkadot-api/polkadot-sdk-compat"),gr=async u=>{let t=typeof u=="string"?u.split(","):u,r=(typeof window>"u"?(await Promise.resolve().then(()=>(vn(),Dt))).getWsProvider:(await Promise.resolve().then(()=>(On(),Mt))).getWsProvider)(t);return(0,An.createClient)((0,Bn.withPolkadotSdkCompat)(r))};var Xe={};I(Xe,{AAVE_GAS_LIMIT:()=>Ce,AAVE_LENDING_POOL_ADDRESS:()=>ye,AAVE_POOL_ABI:()=>ke,AAVE_POOL_DATA_PROVIDER:()=>ge,AAVE_POOL_DATA_PROVIDER_ABI:()=>de,AAVE_POOL_PROXY:()=>Ee,AAVE_ROUNDING_THRESHOLD:()=>ai,AAVE_UINT_256_MAX:()=>yr,AaveClient:()=>Lt,AaveUtils:()=>gt});var ke=[{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 de=[{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 Ee="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",ge="0x112b087b60C1a166130d59266363C45F8aa99db0",ye="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Ce=1000000n,ai=5,yr=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:de,address:ge,args:[ye],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:de,address:ge,args:[ye,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:ke,address:Ee,args:[t],functionName:"getUserAccountData"})}};var it=nt(require("big.js"));var f={};I(f,{asBigInt:()=>Pr,toBigInt:()=>hr,toDecimal:()=>br});var ot=nt(require("big.js"));ot.default.NE=-18;function br(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 hr(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 Pr(u){return BigInt(u.round(0,ot.default.roundDown).toFixed(0))}var dt={};I(dt,{ERC20:()=>De});var De=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:()=>Ge,shiftNeg:()=>Tr});var _n=nt(require("big.js"));var Ne={};I(Ne,{HUB_ASSET_ID:()=>qe,HYDRATION_OMNIPOOL_ADDRESS:()=>Sr,HYDRATION_PARACHAIN_ID:()=>fr,HYDRATION_SS58_PREFIX:()=>V,PERBILL_DENOMINATOR:()=>Me,PERMILL_DENOMINATOR:()=>qt,RUNTIME_DECIMALS:()=>_,SYSTEM_ASSET_DECIMALS:()=>Le,SYSTEM_ASSET_ID:()=>q,TRADEABLE_DEFAULT:()=>St});var _=18,qt=1e6,Me=1e9,q=0,Le=12,fr=2034,V=63,Sr="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",qe=1,St=15;var Ge=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 Tr(u,t){let e=(0,_n.default)(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Nt={};I(Nt,{H160:()=>We,isEvmAccount:()=>Rn,isEvmAddress:()=>Fn,isSs58Address:()=>kn});var Tt=require("polkadot-api"),Ue=require("@polkadot-api/utils"),rt=require("buffer");var Ve="ETH\0";function Rn(u){if(!u)return!1;try{let t=(0,Tt.AccountId)().enc(u),e=rt.Buffer.from(Ve);return rt.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Fn(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function kn(u){try{return(0,Tt.AccountId)(63).enc(u),!0}catch{return!1}}var We=class u{static toAccount=t=>{let e=rt.Buffer.from(t.slice(2),"hex"),n=rt.Buffer.from(Ve),r=Uint8Array.from(rt.Buffer.concat([n,e,rt.Buffer.alloc(8)])),i=(0,Ue.toHex)(r);return(0,Tt.AccountId)(63).dec(i)};static fromAccount=t=>{let e=(0,Tt.AccountId)().enc(t),n=rt.Buffer.from(Ve),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,Ue.toHex)(n)};static fromAny=t=>{if(Fn(t))return t;if(Rn(t))return u.fromAccount(t);if(kn(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var lt={};I(lt,{findNestedKey:()=>wr,findNestedObj:()=>xr,jsonFormatter:()=>Ir});var wr=(u,t)=>{let e=[];return JSON.stringify(u,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},xr=(u,t,e)=>{let n;return JSON.stringify(u,(r,i)=>(i&&i[t]===e&&(n=i),i)),n},Ir=(u,t)=>typeof t=="bigint"?t.toString():t;var A={};I(A,{calculateBuyFee:()=>Br,calculateDiffToAvg:()=>vr,calculateDiffToRef:()=>Or,calculateSellFee:()=>Ar,getFraction:()=>_r});var Q=nt(require("big.js"));function vr(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 Or(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 Ar(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 Br(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 _r(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 He={};I(He,{convertToId:()=>Rr});var En=require("buffer");function Rr(u){let e=En.Buffer.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:be}=dt,{H160:Ye}=Nt,Fr=1.01,kr=31536000n,he=10n**27n,gt=class{client;constructor(t){this.client=new Lt(t)}async getSummary(t){let e=Ye.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:ue})=>ue.toLowerCase()===S);if(!T)throw new Error("Missing pool reserve for "+S);let M=P.scaledATokenBalance,L=T.liquidityIndex,E=T.liquidityRate,G=T.availableLiquidity,K=T.priceInMarketReferenceCurrency,U=a+6,$=this.calculateLinearInterest(E,T.lastUpdateTimestamp,U),at=L*$/he,pt=M*at/he,ce=Number(l!==0&&l===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,_e=T.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,Re=be.toAssetId(S);h.push({aTokenBalance:pt,availableLiquidity:G,decimals:Number(T.decimals),isCollateral:_e,priceInRef:K,reserveId:Re,reserveAsset:S,reserveLiquidationThreshold:ce})}return{healthFactor:Number(y),totalCollateral:c,totalDebt:m,reserves:h}}async hasBorrowPositions(t){let e=Ye.fromAny(t),n=await this.client.getUserAccountData(e),[r,i]=n;return i>0n}async getHealthFactor(t){let e=Ye.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=be.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=be.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=be.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-Fr;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 he;let i=t*BigInt(r)/kr;return he+i}};var Ke={};I(Ke,{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=>!Cn(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=>!Cn(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)}},Cn=(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 je={};I(je,{AssetNotFound:()=>ze,PoolNotFound:()=>Gt,RouteNotFound:()=>Ut});var ze=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 Qe={};I(Qe,{EvmClient:()=>Vt,createChain:()=>$e});var Dn=require("viem"),Er=["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"],$e=()=>(0,Dn.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Er}},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=$e()}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 en={};I(en,{LiquidityMiningApi:()=>Wt,LiquidityMiningClient:()=>Ht});var qn=require("polkadot-api"),N=nt(require("big.js")),tn=require("@galacticcouncil/math-liquidity-mining");var Pe=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")),z=require("@galacticcouncil/math-liquidity-mining");var Je=nt(require("big.js")),Ze=(0,Je.default)(10).pow(18),Mn=BigInt((0,Je.default)(1).pow(18).toString()),Ln=6;var Cr="1000000000000000000",fe=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,z.calculate_global_farm_rewards)(t.total_shares_z.toString(),n.toString(),(0,ct.default)(t.yield_per_period.toString()).mul(Ze).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,z.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,z.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(Ze).round(0,ct.default.roundDown).toString();if(!e)return n;let{initial_reward_percentage:r,scale_coef:i}=e;return(0,z.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,z.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),m)),p=BigInt((0,z.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),Cr));return{reward:d,maxReward:p,assetId:s.reward_currency}}};var Dr=(0,N.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??Ln})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((i,a)=>i-a);if(t===e)return Mn;let r=await this.client.getOraclePrice(n);if(r){let{n:i,d:a}=r[0].price,s;return t<e?s=(0,tn.fixed_from_rational)(i.toString(),a.toString()):s=(0,tn.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,qn.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let i=(0,N.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,N.default)(t.toString()).times(e),a=(0,N.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:M}=i,L=O.shiftNeg(a??M,18),E=O.shiftNeg(l,18),G=O.shiftNeg(c?.initial_reward_percentage??0,18),K=Dr.div((0,N.default)(this.blockTime).times(m)).toString(),U;if(p<=0)U=(0,N.default)(E).times(d.toString()).times(K).toString();else{let ar=this.getGlobalRewardPerPeriod(p,d,g,L),or=this.getPoolYieldPerPeriod(ar,E,p,L);U=(0,N.default)(or).times(K).toString()}let $=b+y,at=g*BigInt(h),pt=s.transferable+$,Ct=pt-$,Be=(0,N.default)(Ct.toString()).div(g.toString()),ce=(0,N.default)(e).div(m.toString()).toString(),_e=(p>=0?Be.plus(P):Be.plus(ce)).toString(),Re=(0,N.default)(p.toString()).div((0,N.default)(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(L).toFixed(2),ue=(0,N.default)($.toString()).div(pt.toString()).gte(.999);U=ue?"0":(0,N.default)(U).div(n?2:1).times(100).toString();let sr=G?(0,N.default)(U).times(G).toString():void 0;return{apr:U,minApr:sr,isDistributed:ue,estimatedEndPeriod:_e,maxRewards:at,incentivizedAsset:S,rewardCurrency:T,loyaltyCurve:c,currentPeriod:ce,potMaxRewards:pt,fullness:Re,yieldFarmId:r.id,globalFarmId:i.id,poolId:o}}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 Pe(m,d),y=await new fe(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 Se=require("polkadot-api"),Ht=class extends D{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(Se.Binary.fromText("omnipool"),t,(0,Se.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 cn={};I(cn,{PoolContextProvider:()=>Bt,PoolError:()=>yt,PoolFactory:()=>At,PoolType:()=>k,aave:()=>ln,lbp:()=>rn,omni:()=>sn,stable:()=>an,xyk:()=>on});var rn={};I(rn,{LbpMath:()=>j,LbpPool:()=>Yt,LbpPoolClient:()=>Kt});var tt=require("@galacticcouncil/math-lbp"),j=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 k=(i=>(i.Aave="Aave",i.LBP="LBP",i.Omni="Omnipool",i.Stable="Stableswap",i.XYK="XYK",i))(k||{}),yt=(i=>(i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i.UnknownError="UnknownError",i))(yt||{});var{FeeUtils:Nn}=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=Nn.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=Nn.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=j.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=j.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=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 n=j.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};var Un=require("polkadot-api"),bt=require("rxjs");var Gn=(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 nn=[{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:nn,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:nn,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=Gn(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=j.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(Un.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 sn={};I(sn,{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 Te=require("polkadot-api"),Vn=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,Vn.toHex)(e);return(0,Te.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(Te.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 an={};I(an,{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 we=require("polkadot-api"),Wn=require("@polkadot-api/utils"),Hn=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,Hn.blake2b)(e,{dkLen:32}),r=(0,Wn.toHex)(n);return(0,we.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(we.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 on={};I(on,{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:Yn}=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=Yn.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=Yn.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 Xn=require("polkadot-api"),Kn=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(Xn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,Kn.of)(t)}};var ln={};I(ln,{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 jn=require("polkadot-api"),$n=require("@polkadot-api/utils"),Ot=require("rxjs"),Qn=require("viem");var zn=[{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}=dt,Lr=["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,$n.toHex)(r);return(0,jn.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,Qn.decodeEventLog)({abi:zn,topics:c,data:m});return Lr.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:Mr.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 bn={};I(bn,{DEFAULT_BLOCK_TIME:()=>Zn,DEFAULT_MIN_BUDGET:()=>pn,ORDER_MIN_BLOCK_PERIOD:()=>tr,Router:()=>_t,TWAP_BLOCK_PERIOD:()=>ae,TWAP_MAX_DURATION:()=>gn,TWAP_MAX_PRICE_IMPACT:()=>dn,TWAP_TX_MULTIPLIER:()=>ic,TradeOrderError:()=>mn,TradeOrderType:()=>Ie,TradeRouteBuilder:()=>X,TradeRouter:()=>Rt,TradeScheduler:()=>Ft,TradeType:()=>xe});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 qr=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>qr)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 un(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=un(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 xe=(e=>(e.Buy="Buy",e.Sell="Sell",e))(xe||{}),Ie=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(Ie||{}),mn=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(mn||{});var{FeeUtils:Jn}=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?Jn.toPct(t.min):void 0,n=t.max?Jn.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 Zn=6e3,pn=1000000000000000n,ae=6,dn=-5,gn=216e5,ic=3,tr=6;var yn=require("polkadot-api");var X=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:i})=>r==="Stableswap"?{pool:(0,yn.Enum)("Stableswap",i),asset_in:e,asset_out:n}:{pool:(0,yn.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??pn})}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),M=Math.round(r/P),L=o/BigInt(P),E=await this.router.getBestSell(t,e,L),G=o<a,K=[];G&&K.push("OrderTooSmall");let U=E.amountOut*BigInt(P),$=this.toBlockPeriod(M),at=E.tradeFee*BigInt(P),pt=X.build(l),Ct={assetIn:t,assetOut:e,errors:K,frequencyMin:S,frequencyOpt:T,frequency:M,tradeCount:P,tradeFee:at,tradeImpactPct:E.priceImpactPct,tradePeriod:$,tradeRoute:pt,type:"Dca"};return{...Ct,amountIn:o,amountOut:U,tradeAmountIn:E.amountIn,tradeAmountOut:E.amountOut,toHuman(){return{...Ct,amountIn:f.toDecimal(o,p),amountOut:f.toDecimal(U,g),tradeAmountIn:f.toDecimal(E.amountIn,p),tradeAmountOut:f.toDecimal(E.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 M=y.amountOut*BigInt(g),L=y.tradeFee*BigInt(g),E=X.build(s),G={assetIn:t,assetOut:e,errors:T,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:E,type:"TwapSell"};return{...G,amountIn:a,amountOut:M,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:L,toHuman(){return{...G,amountIn:f.toDecimal(a,m),amountOut:f.toDecimal(M,d),tradeAmountIn:f.toDecimal(y.amountIn,m),tradeAmountOut:f.toDecimal(y.amountOut,d),tradeFee:f.toDecimal(L,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,M=[];S||P?M.push("OrderTooSmall"):T&&M.push("OrderImpactTooBig");let L=y.tradeFee*BigInt(g),E=X.build(s),G={assetIn:t,assetOut:e,errors:M,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:E,type:"TwapBuy"};return{...G,amountIn:h,amountOut:a,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:L,toHuman(){return{...G,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(L,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 fn={};I(fn,{BIG_10:()=>rr,BIG_BILL:()=>Pn,StakingApi:()=>oe,StakingClient:()=>le});var er=require("@polkadot/util-crypto"),nr=require("@polkadot/util"),H=require("@galacticcouncil/math-staking"),W=nt(require("big.js")),hn={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},Nr=u=>Object.keys(hn).includes(u),Gr="20000000000000000",Ur="2000",rr=(0,W.default)(10),Pn=(0,W.default)(rr.pow(12));function Vr(u){return(0,er.encodeAddress)((0,nr.stringToU8a)(("modl"+u).padEnd(32,"\0")),63)}var oe=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=Vr(t);return(await this.balanceClient.getBalance(e,0)).transferable}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")&&Nr(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=hn.locked6x,o=(0,W.default)(n.toString()).mul(s),l=100,c=[];t.forEach(p=>{let g=hn[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.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getTimePointsPerPeriod(),this.client.getTimePointsWeight(),this.client.getActionPointsWeight(),this.client.getSixBlockSince()]),y=(0,W.default)(l.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()),M=this.getCurrentActionPoints(o.votes,o.actionPoints,o.stake,e),L=(0,H.calculate_points)(S,P,d.toString(),p.toString(),M.currentActionPoints,g.toString(),o.accumulatedSlashPoints.toString()),E=(0,W.default)(L).div(2).toString(),G=(0,H.sigmoid)(E,Gr,Ur),K=(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 U=(0,H.calculate_percentage_amount)(K.toString(),G),$=(0,W.default)(o.accumulatedLockedRewards.toString()),at=$.gt(U)?$:(0,W.default)(U);return{rewards:at.div(Pn).toString(),maxRewards:K.div(Pn).toString(),allocatedRewardsPercentage:at.div(K).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 Tn={};I(Tn,{TxBuilderFactory:()=>Et});var Sn=require("polkadot-api");function ir(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:Ce})}async dryRun(t,e){let n=(0,Sn.Enum)("Signed",t),r=(0,Sn.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=ir(s.value);throw new Error("Dry run execution error!",{cause:o})}return a}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var ve=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 Oe=require("polkadot-api");var Ae=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,Oe.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,Oe.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,Oe.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 ve(this.client,this.evmClient).setTrade(t)}order(t){return new Ae(this.client,this.evmClient).setOrder(t)}};async function Wr(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 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")),rt=(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 st=rt(require("big.js"));var f={};I(f,{asBigInt:()=>Sr,toBigInt:()=>fr,toDecimal:()=>Pr});var ot=rt(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=rt(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:()=>q,TRADEABLE_DEFAULT:()=>St});var _=18,qt=1e6,De=1e9,q=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"),it=require("buffer");var Ue="ETH\0";function Fn(u){if(!u)return!1;try{let t=(0,Tt.AccountId)().enc(u),e=it.Buffer.from(Ue);return it.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=it.Buffer.from(t.slice(2),"hex"),n=it.Buffer.from(Ue),r=Uint8Array.from(it.Buffer.concat([n,e,it.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=it.Buffer.from(Ue),r=e.slice(n.length,-8);return"0x"+it.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 J=rt(require("big.js"));function Ar(u,t){let e=(0,J.default)(u.toString()),n=(0,J.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,J.default)(u.toString()),n=(0,J.default)(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function _r(u,t){let e=(0,J.default)(u.toString()),n=(0,J.default)(t.toString());return(0,J.default)(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Rr(u,t){let e=(0,J.default)(u.toString());return(0,J.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 L=P.scaledATokenBalance,V=T.liquidityIndex,k=T.liquidityRate,N=T.availableLiquidity,K=T.priceInMarketReferenceCurrency,Q=a+6,W=this.calculateLinearInterest(k,T.lastUpdateTimestamp,Q),z=V*W/Pe,Ct=L*z/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:N,decimals:Number(T.decimals),isCollateral:ue,priceInRef:K,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,st.default)(b.toString()).mul(d).div(i.toString()).toFixed(6,st.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,st.default)(g.toString()).mul(m).div(i.toString()).toFixed(6,st.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,st.default)(d).mul(e.toString()).div(o).toFixed(0,st.default.roundDown),g=(0,st.default)(p).div(s.toString()).mul(10**a).toFixed(0,st.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:()=>Z,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 Z=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 tt=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,tt.createPublicClient)({chain:this.chain,transport:(0,tt.http)()})}getWsProvider(){return(0,tt.createPublicClient)({transport:(0,tt.custom)({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return(0,tt.createWalletClient)({account:t,chain:this.chain,transport:(0,tt.custom)(window.ethereum)})}};var tn={};I(tn,{LiquidityMiningApi:()=>Wt,LiquidityMiningClient:()=>Ht});var Nn=require("polkadot-api"),M=rt(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=rt(require("big.js")),j=require("@galacticcouncil/math-liquidity-mining");var Qe=rt(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,j.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,j.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,j.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,j.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,j.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),m)),p=BigInt((0,j.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,M.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,M.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,M.default)(t.toString()).times(e),a=(0,M.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:L,min_deposit:V}=i,k=O.shiftNeg(a??L,18),N=O.shiftNeg(l,18),K=O.shiftNeg(c?.initial_reward_percentage??0,18),Q=Lr.div((0,M.default)(this.blockTime).div(1e3).times(m)).toString(),W;if(p<=0)W=(0,M.default)(N).times(d.toString()).times(Q).toString();else{let lr=this.getGlobalRewardPerPeriod(p,d,g,k),cr=this.getPoolYieldPerPeriod(lr,N,p,k);W=(0,M.default)(cr).times(Q).toString()}let z=b+y,Ct=g*BigInt(h),pt=s.transferable+z,Tn=pt-z,ce=(0,M.default)(Tn.toString()).div(g.toString()),ue=(0,M.default)(e).div(m.toString()).toString(),me=(p>=0?ce.plus(P):ce.plus(ue)).toString(),_e=(0,M.default)(me).times(m).toString(),ar=(0,M.default)(p.toString()).div((0,M.default)(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(k).toFixed(2),wn=(0,M.default)(z.toString()).div(pt.toString()).gte(.999);W=wn?"0":(0,M.default)(W).div(n?2:1).times(100).toString();let or=K?(0,M.default)(W).times(K).toString():void 0;return{apr:W,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:z,plannedYieldingPeriods:h,minDeposit:V}}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:()=>$,LbpPool:()=>Yt,LbpPoolClient:()=>Kt});var et=require("@galacticcouncil/math-lbp"),$=class{static getSpotPrice(t,e,n,r,i){return(0,et.get_spot_price)(t,e,n,r,i)}static calculateInGivenOut(t,e,n,r,i){return(0,et.calculate_in_given_out)(t,e,n,r,i)}static calculateOutGivenIn(t,e,n,r,i){return(0,et.calculate_out_given_in)(t,e,n,r,i)}static calculateLinearWeights(t,e,n,r,i){return(0,et.calculate_linear_weights)(t,e,n,r,i)}static calculatePoolTradeFee(t,e,n){return(0,et.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=$.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=$.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=$.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=$.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=$.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 Z{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=$.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=rt(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:()=>at,XykPool:()=>Zt,XykPoolClient:()=>te});var F=require("@galacticcouncil/math-xyk"),at=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=at.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=at.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=at.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=at.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=at.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 nt=require("rxjs");var Bt=class extends D{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=nt.Subscription.EMPTY;omniSub=nt.Subscription.EMPTY;stableSub=nt.Subscription.EMPTY;xykSub=nt.Subscription.EMPTY;aaveSub=nt.Subscription.EMPTY;isReady=!1;isDestroyed=new nt.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,nt.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),L=Math.round(r/P),V=o/BigInt(P),k=await this.router.getBestSell(t,e,V),N=o<a,K=[];N&&K.push("OrderTooSmall");let Q=k.amountOut*BigInt(P),W=this.toBlockPeriod(L),z=k.tradeFee*BigInt(P),Ct=X.build(l),pt={assetIn:t,assetOut:e,errors:K,frequencyMin:S,frequencyOpt:T,frequency:L,tradeCount:P,tradeFee:z,tradeImpactPct:k.priceImpactPct,tradePeriod:W,tradeRoute:Ct,type:"Dca"};return{...pt,amountIn:o,amountOut:Q,tradeAmountIn:k.amountIn,tradeAmountOut:k.amountOut,toHuman(){return{...pt,amountIn:f.toDecimal(o,p),amountOut:f.toDecimal(Q,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 L=y.amountOut*BigInt(g),V=y.tradeFee*BigInt(g),k=X.build(s),N={assetIn:t,assetOut:e,errors:T,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:k,type:"TwapSell"};return{...N,amountIn:a,amountOut:L,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:V,toHuman(){return{...N,amountIn:f.toDecimal(a,m),amountOut:f.toDecimal(L,d),tradeAmountIn:f.toDecimal(y.amountIn,m),tradeAmountOut:f.toDecimal(y.amountOut,d),tradeFee:f.toDecimal(V,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,L=[];S||P?L.push("OrderTooSmall"):T&&L.push("OrderImpactTooBig");let V=y.tradeFee*BigInt(g),k=X.build(s),N={assetIn:t,assetOut:e,errors:L,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:k,type:"TwapBuy"};return{...N,amountIn:h,amountOut:a,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:V,toHuman(){return{...N,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(V,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"),U=rt(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,U.default)(10),hn=(0,U.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 getFreePotBalance(){let t=await this.client.getPalletId(),e=Hr(t);return(await this.balanceClient.getBalance(e,0)).transferable}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,U.default)(0),a=(0,U.default)(0),s=bn.locked6x,o=(0,U.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,U.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,U.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.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getTimePointsPerPeriod(),this.client.getTimePointsWeight(),this.client.getActionPointsWeight(),this.client.getSixBlockSince()]),y=(0,U.default)(l.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()),L=this.getCurrentActionPoints(o.votes,o.actionPoints,o.stake,e),V=(0,H.calculate_points)(S,P,d.toString(),p.toString(),L.currentActionPoints,g.toString(),o.accumulatedSlashPoints.toString()),k=(0,U.default)(V).div(2).toString(),N=(0,H.sigmoid)(k,Vr,Wr),K=(0,U.default)(T).plus(o.accumulatedUnpaidRewards.toString()).plus(o.accumulatedLockedRewards.toString());if((0,U.default)(P).minus(S).lte(m.toString()))return{rewards:"0"};let Q=(0,H.calculate_percentage_amount)(K.toString(),N),W=(0,U.default)(o.accumulatedLockedRewards.toString()),z=W.gt(Q)?W:(0,U.default)(Q);return{rewards:z.div(hn).toString(),maxRewards:K.div(hn).toString(),allocatedRewardsPercentage:z.div(K).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 Z(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 Z(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});
package/build/index.mjs CHANGED
@@ -1 +1 @@
1
- var Rn=Object.defineProperty;var w=(u,t)=>{for(var e in t)Rn(u,e,{get:t[e],enumerable:!0})};var qe={};w(qe,{Papi:()=>R,getWs:()=>Cn});import{hydration as Fn}from"@galacticcouncil/descriptors";function Le(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var R=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(Fn)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Le(n)&&console.log(t,...e)}};import{createClient as kn}from"polkadot-api";import{withPolkadotSdkCompat as En}from"polkadot-api/polkadot-sdk-compat";var Cn=async u=>{let t=typeof u=="string"?u.split(","):u,r=(typeof window>"u"?(await import("polkadot-api/ws-provider/node")).getWsProvider:(await import("polkadot-api/ws-provider/web")).getWsProvider)(t);return kn(En(r))};var Ye={};w(Ye,{AAVE_GAS_LIMIT:()=>me,AAVE_LENDING_POOL_ADDRESS:()=>$t,AAVE_POOL_ABI:()=>ce,AAVE_POOL_DATA_PROVIDER:()=>jt,AAVE_POOL_DATA_PROVIDER_ABI:()=>zt,AAVE_POOL_PROXY:()=>ue,AAVE_ROUNDING_THRESHOLD:()=>gs,AAVE_UINT_256_MAX:()=>Dn,AaveClient:()=>St,AaveUtils:()=>et});var ce=[{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 zt=[{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 ue="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",jt="0x112b087b60C1a166130d59266363C45F8aa99db0",$t="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",me=1000000n,gs=5,Dn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var St=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:zt,address:jt,args:[$t],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:zt,address:jt,args:[$t,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:ce,address:ue,args:[t],functionName:"getUserAccountData"})}};import j from"big.js";var f={};w(f,{asBigInt:()=>qn,toBigInt:()=>Ln,toDecimal:()=>Mn});import Z from"big.js";Z.NE=-18;function Mn(u,t,e=6,n){let r=Z(u.toString()),i=Z(10).pow(t);return r.div(i).round(e,n).toString()}function Ln(u,t){let e=Z(10).pow(t),r=Z(u).mul(e).toFixed(0,Z.roundDown);return BigInt(r)}function qn(u){return BigInt(u.round(0,Z.roundDown).toFixed(0))}var st={};w(st,{ERC20:()=>pe});var pe=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 v={};w(v,{FeeUtils:()=>be,shiftNeg:()=>Vn});import Un from"big.js";var Ne={};w(Ne,{HUB_ASSET_ID:()=>ye,HYDRATION_OMNIPOOL_ADDRESS:()=>Gn,HYDRATION_PARACHAIN_ID:()=>Nn,HYDRATION_SS58_PREFIX:()=>M,PERBILL_DENOMINATOR:()=>de,PERMILL_DENOMINATOR:()=>Tt,RUNTIME_DECIMALS:()=>I,SYSTEM_ASSET_DECIMALS:()=>ge,SYSTEM_ASSET_ID:()=>E,TRADEABLE_DEFAULT:()=>at});var I=18,Tt=1e6,de=1e9,E=0,ge=12,Nn=2034,M=63,Gn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",ye=1,at=15;var be=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 Vn(u,t){let e=Un(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Qt={};w(Qt,{H160:()=>Pe,isEvmAccount:()=>Ue,isEvmAddress:()=>Ve,isSs58Address:()=>We});import{AccountId as wt}from"polkadot-api";import{toHex as Ge}from"@polkadot-api/utils";import{Buffer as z}from"buffer";var he="ETH\0";function Ue(u){if(!u)return!1;try{let t=wt().enc(u),e=z.from(he);return z.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Ve(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function We(u){try{return wt(63).enc(u),!0}catch{return!1}}var Pe=class u{static toAccount=t=>{let e=z.from(t.slice(2),"hex"),n=z.from(he),r=Uint8Array.from(z.concat([n,e,z.alloc(8)])),i=Ge(r);return wt(63).dec(i)};static fromAccount=t=>{let e=wt().enc(t),n=z.from(he),r=e.slice(n.length,-8);return"0x"+z.from(r).toString("hex")};static fromSS58=t=>{let n=wt().enc(t).slice(0,20);return Ge(n)};static fromAny=t=>{if(Ve(t))return t;if(Ue(t))return u.fromAccount(t);if(We(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var tt={};w(tt,{findNestedKey:()=>Wn,findNestedObj:()=>Hn,jsonFormatter:()=>Yn});var Wn=(u,t)=>{let e=[];return JSON.stringify(u,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},Hn=(u,t,e)=>{let n;return JSON.stringify(u,(r,i)=>(i&&i[t]===e&&(n=i),i)),n},Yn=(u,t)=>typeof t=="bigint"?t.toString():t;var O={};w(O,{calculateBuyFee:()=>jn,calculateDiffToAvg:()=>Xn,calculateDiffToRef:()=>Kn,calculateSellFee:()=>zn,getFraction:()=>$n});import Y from"big.js";function Xn(u,t){let e=Y(u.toString()),n=Y(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Kn(u,t){if(t===0n)return 0;let e=Y(u.toString()),n=Y(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function zn(u,t){let e=Y(u.toString()),n=Y(t.toString());return Y(1).minus(n.div(e)).mul(100).round(2).toNumber()}function jn(u,t){let e=Y(u.toString());return Y(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function $n(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 He={};w(He,{convertToId:()=>Jn});import{Buffer as Qn}from"buffer";function Jn(u){let e=Qn.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Jt}=st,{H160:fe}=Qt,Zn=1.01,tr=31536000n,Zt=10n**27n,et=class{client;constructor(t){this.client=new St(t)}async getSummary(t){let e=fe.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:Kt})=>Kt.toLowerCase()===S);if(!T)throw new Error("Missing pool reserve for "+S);let F=P.scaledATokenBalance,k=T.liquidityIndex,B=T.liquidityRate,C=T.availableLiquidity,U=T.priceInMarketReferenceCurrency,D=a+6,W=this.calculateLinearInterest(B,T.lastUpdateTimestamp,D),K=k*W/Zt,J=F*K/Zt,Xt=Number(l!==0&&l===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,oe=T.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,le=Jt.toAssetId(S);h.push({aTokenBalance:J,availableLiquidity:C,decimals:Number(T.decimals),isCollateral:oe,priceInRef:U,reserveId:le,reserveAsset:S,reserveLiquidationThreshold:Xt})}return{healthFactor:Number(y),totalCollateral:c,totalDebt:m,reserves:h}}async hasBorrowPositions(t){let e=fe.fromAny(t),n=await this.client.getUserAccountData(e),[r,i]=n;return i>0n}async getHealthFactor(t){let e=fe.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=Jt.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=j(b.toString()).mul(d).div(i.toString()).toFixed(6,j.roundDown);return Number(y)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:i,reserves:a}=await this.getSummary(t),s=Jt.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=j(g.toString()).mul(m).div(i.toString()).toFixed(6,j.roundDown);return Number(b)}async getMaxWithdraw(t,e){let{totalDebt:n,reserves:r,healthFactor:i}=await this.getSummary(t),a=Jt.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-Zn;if(d>0){let p=j(d).mul(e.toString()).div(o).toFixed(0,j.roundDown),g=j(p).div(s.toString()).mul(10**a).toFixed(0,j.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 Zt;let i=t*BigInt(r)/tr;return Zt+i}};var ze={};w(ze,{AssetClient:()=>ot,BalanceClient:()=>H,ChainParams:()=>ct});var ot=class extends R{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)}};import{Subject as er,bufferCount as nr,combineLatest as rr,debounceTime as ir,distinctUntilChanged as Xe,finalize as sr,map as lt,pairwise as ar,shareReplay as or,startWith as lr}from"rxjs";var H=class extends R{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 rr([e,n,r]).pipe(ir(250),lt(i=>i.flat()),lr([]),nr(2,1),lt(([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=>!Ke(c.balance,o.get(c.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe(lt(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(lt(r=>({id:e,balance:r})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(Xe((n,r)=>!r.deltas),lt(({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 er,r=n.pipe(or(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(sr(()=>s?.()),ar(),lt(([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=>!Ke(p.balance,m.get(p.id)))}),Xe((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},Ke=(u,t)=>u!==void 0&&t!==void 0&&u.transferable===t.transferable&&u.total===t.total;var ct=class extends R{_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 je={};w(je,{AssetNotFound:()=>Se,PoolNotFound:()=>xt,RouteNotFound:()=>It});var Se=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},xt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},It=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var Je={};w(Je,{EvmClient:()=>vt,createChain:()=>Te});import{defineChain as cr}from"viem";var ur=["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"],Te=()=>cr({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:ur}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});import{createPublicClient as $e,createWalletClient as mr,custom as Qe,http as pr}from"viem";var vt=class{client;chain;constructor(t){this.client=t,this.chain=Te()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return $e({chain:this.chain,transport:pr()})}getWsProvider(){return $e({transport:Qe({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return mr({account:t,chain:this.chain,transport:Qe(window.ethereum)})}};var sn={};w(sn,{LiquidityMiningApi:()=>Ot,LiquidityMiningClient:()=>At});import{AccountId as Pr}from"polkadot-api";import L from"big.js";import{fixed_from_rational as rn}from"@galacticcouncil/math-liquidity-mining";var te=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)}};import nt from"big.js";import{calculate_accumulated_rps as dr,calculate_global_farm_rewards as gr,calculate_loyalty_multiplier as yr,calculate_user_reward as nn,calculate_yield_farm_delta_rpvs as br}from"@galacticcouncil/math-liquidity-mining";import Ze from"big.js";var we=Ze(10).pow(18),tn=BigInt(Ze(1).pow(18).toString()),en=6;var hr="1000000000000000000",ee=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=nt(s.toString()),c=nt(o.toString()).minus(l.lt(o.toString())?s.toString():o.toString()),m=nt(gr(t.total_shares_z.toString(),n.toString(),nt(t.yield_per_period.toString()).mul(we).round(0,nt.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(dr(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=br(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=nt(1).mul(we).round(0,nt.roundDown).toString();if(!e)return n;let{initial_reward_percentage:r,scale_coef:i}=e;return yr(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(nn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),m)),p=BigInt(nn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),hr));return{reward:d,maxReward:p,assetId:s.reward_currency}}};var fr=L(365.2425).times(24).times(60).times(60),Ot=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??en})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((i,a)=>i-a);if(t===e)return tn;let r=await this.client.getOraclePrice(n);if(r){let{n:i,d:a}=r[0].price,s;return t<e?s=rn(i.toString(),a.toString()):s=rn(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 Pr(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let i=L(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=L(t.toString()).times(e),a=L(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:F}=i,k=v.shiftNeg(a??F,18),B=v.shiftNeg(l,18),C=v.shiftNeg(c?.initial_reward_percentage??0,18),U=fr.div(L(this.blockTime).times(m)).toString(),D;if(p<=0)D=L(B).times(d.toString()).times(U).toString();else{let Bn=this.getGlobalRewardPerPeriod(p,d,g,k),_n=this.getPoolYieldPerPeriod(Bn,B,p,k);D=L(_n).times(U).toString()}let W=b+y,K=g*BigInt(h),J=s.transferable+W,ft=J-W,ae=L(ft.toString()).div(g.toString()),Xt=L(e).div(m.toString()).toString(),oe=(p>=0?ae.plus(P):ae.plus(Xt)).toString(),le=L(p.toString()).div(L(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(k).toFixed(2),Kt=L(W.toString()).div(J.toString()).gte(.999);D=Kt?"0":L(D).div(n?2:1).times(100).toString();let An=C?L(D).times(C).toString():void 0;return{apr:D,minApr:An,isDistributed:Kt,estimatedEndPeriod:oe,maxRewards:K,incentivizedAsset:S,rewardCurrency:T,loyaltyCurve:c,currentPeriod:Xt,potMaxRewards:J,fullness:le,yieldFarmId:r.id,globalFarmId:i.id,poolId:o}}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 te(m,d),y=await new ee(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}};import{Binary as Sr,Enum as Tr}from"polkadot-api";var At=class extends R{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(Sr.fromText("omnipool"),t,Tr("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 yn={};w(yn,{PoolContextProvider:()=>dt,PoolError:()=>rt,PoolFactory:()=>pt,PoolType:()=>A,aave:()=>Be,lbp:()=>Ie,omni:()=>ve,stable:()=>Oe,xyk:()=>Ae});var Ie={};w(Ie,{LbpMath:()=>V,LbpPool:()=>Bt,LbpPoolClient:()=>Rt});import{calculate_in_given_out as wr,calculate_out_given_in as xr,calculate_linear_weights as Ir,calculate_pool_trade_fee as vr,get_spot_price as Or}from"@galacticcouncil/math-lbp";var V=class{static getSpotPrice(t,e,n,r,i){return Or(t,e,n,r,i)}static calculateInGivenOut(t,e,n,r,i){return wr(t,e,n,r,i)}static calculateOutGivenIn(t,e,n,r,i){return xr(t,e,n,r,i)}static calculateLinearWeights(t,e,n,r,i){return Ir(t,e,n,r,i)}static calculatePoolTradeFee(t,e,n){return vr(t,e,n)}};var A=(i=>(i.Aave="Aave",i.LBP="LBP",i.Omni="Omnipool",i.Stable="Stableswap",i.XYK="XYK",i))(A||{}),rt=(i=>(i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i.UnknownError="UnknownError",i))(rt||{});var{FeeUtils:an}=v,Bt=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=an.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=an.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=V.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=V.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=V.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=V.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=V.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Er}from"polkadot-api";import{map as Cr,of as mn,switchMap as Dr}from"rxjs";import{memoize1 as Ar}from"@thi.ng/memoize";import{combineLatest as on,combineLatestAll as Br,debounceTime as _r,firstValueFrom as Rr,from as ln,map as cn,mergeAll as Fr,of as kr,switchMap as un}from"rxjs";var xe=[{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 _t=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,r,i]=await Promise.all([this.client.readContract({abi:xe,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:xe,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 N=class extends H{evm;mmOracle;override=[];mem=0;memPools=Ar(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new _t(e)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=ln(this.getPoolsMem()).pipe(un(e=>this.subscribe(e)),Br());return Rr(t)}getSubscriber(){return ln(this.getPoolsMem()).pipe(un(t=>this.subscribe(t)),Fr())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>on([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe(_r(250),cn(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return kr([]);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 on(e).pipe(cn(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 Rt=class extends N{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=V.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(Er.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe(Dr(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):mn(t)),Cr(r=>Object.assign({},t,r))):mn(t)}};var ve={};w(ve,{OmniMath:()=>x,OmniPool:()=>Ft,OmniPoolClient:()=>kt});import{calculate_in_given_out as Mr,calculate_lrna_in_given_out as Lr,calculate_out_given_in as qr,calculate_out_given_lrna_in as Nr,calculate_spot_price as Gr,calculate_lrna_spot_price as Ur,calculate_shares as Vr,calculate_liquidity_out as Wr,calculate_liquidity_lrna_out as Hr,verify_asset_cap as Yr,calculate_liquidity_hub_in as Xr,is_sell_allowed as Kr,is_buy_allowed as zr,is_add_liquidity_allowed as jr,is_remove_liquidity_allowed as $r}from"@galacticcouncil/math-omnipool";import ut from"big.js";var x=class{static calculateSpotPrice(t,e,n,r){return Gr(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return Ur(t,e)}static calculateInGivenOut(t,e,n,r,i,a,s,o,l){return Mr(t,e,n,r,i,a,s,o,l)}static calculateLrnaInGivenOut(t,e,n,r,i){return Lr(t,e,n,r,i)}static calculateOutGivenIn(t,e,n,r,i,a,s,o,l){return qr(t,e,n,r,i,a,s,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,i){return Nr(t,e,n,r,i)}static calculateShares(t,e,n,r){return Vr(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,i,a,s,o){return Wr(t,e,n,r,i,a,s,o)}static calculateLiquidityLRNAOut(t,e,n,r,i,a,s,o){return Hr(t,e,n,r,i,a,s,o)}static calculateCapDifference(t,e,n,r){let i=ut(e),a=ut(t),s=ut(r),o=ut(n),l=ut(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(ut(1).minus(c));return d.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return Yr(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return Xr(t,e,n,r)}static isSellAllowed(t){return Kr(t)}static isBuyAllowed(t){return zr(t)}static isAddLiquidityAllowed(t){return jr(t)}static isRemoveLiquidityAllowed(t){return $r(t)}};var{FeeUtils:mt}=v,Ft=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:O.calculateDiffToRef(i,r),s=[],o=x.isSellAllowed(t.tradeableIn),l=x.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=O.calculateDiffToRef(r,i),s=[],o=x.isSellAllowed(t.tradeableIn),l=x.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=x.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?mt.toRaw(n.assetFee).toString():"0",n?mt.toRaw(n.protocolFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateLrnaInGivenOut(t,e,n){let r=x.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?mt.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=x.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?mt.toRaw(n.assetFee).toString():"0",n?mt.toRaw(n.protocolFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateOutGivenLrnaIn(t,e,n){let r=x.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?mt.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=x.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=x.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=x.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=x.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as Qr,CompatibilityLevel as Jr}from"polkadot-api";import{toHex as Zr}from"@polkadot-api/utils";import{distinctUntilChanged as ti,map as pn}from"rxjs";var{FeeUtils:$}=v,kt=class extends N{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=Zr(e);return Qr(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:$.fromPermill(o),protocolFee:$.fromPermill(l),min:$.fromPermill(a),max:$.fromPermill(s)}}else return{assetFee:$.fromPermill(n.min_fee),protocolFee:$.fromPermill(r.min_fee),min:$.fromPermill(a),max:$.fromPermill(s)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(Jr.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(ti((n,r)=>!r.deltas),pn(({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}})),pn(n=>{let r=t.tokens.find(i=>i.id===1);return{...t,tokens:[...n,r]}}))}};var Oe={};w(Oe,{StableMath:()=>_,StableSwap:()=>Et,StableSwapClient:()=>Ct});import{calculate_in_given_out as ei,calculate_out_given_in as ni,calculate_amplification as ri,calculate_add_one_asset as ii,calculate_liquidity_out_one_asset as si,calculate_shares as ai,calculate_shares_for_amount as oi,calculate_spot_price_with_fee as li,pool_account_name as ci,recalculate_peg as ui}from"@galacticcouncil/math-stableswap";var _=class{static getPoolAddress(t){return ci(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 ri(t,e,n,r,i)}static calculateInGivenOut(t,e,n,r,i,a,s){return ei(t,e,n,r,i,a,s)}static calculateAddOneAsset(t,e,n,r,i,a,s){return ii(t,e,n,r,i,a,s)}static calculateSharesForAmount(t,e,n,r,i,a,s){return oi(t,e,n,r,i,a,s)}static calculateOutGivenIn(t,e,n,r,i,a,s){return ni(t,e,n,r,i,a,s)}static calculateLiquidityOutOneAsset(t,e,n,r,i,a,s){return si(t,e,n,r,i,a,s)}static calculateShares(t,e,n,r,i,a){return ai(t,e,n,r,i,a)}static calculateSpotPriceWithFee(t,e,n,r,i,a,s,o){return li(t,e,n,r,i,a,s,o)}static recalculatePegs(t,e,n,r,i){let a=ui(t,e,n,r,i);return JSON.parse(a)}};var{FeeUtils:Q}=v,Et=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=Q.toPct(n.fee),s=[],o=x.isSellAllowed(t.tradeableIn),l=x.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=Q.toPct(n.fee),s=[],o=x.isSellAllowed(t.tradeableIn),l=x.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=_.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?Q.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateAddOneAsset(t,e,n){let r=_.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?Q.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateSharesForAmount(t,e,n){let r=_.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?Q.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=_.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=_.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?Q.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateWithdrawOneAsset(t,e,n){let r=_.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?Q.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateShares(t,e,n){let r=_.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?Q.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=_.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=_.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,tt.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],tt.jsonFormatter)}};import{AccountId as mi,CompatibilityLevel as pi}from"polkadot-api";import{toHex as di}from"@polkadot-api/utils";import{blake2b as gi}from"@noble/hashes/blake2b";import{map as yi,of as bi,switchMap as hi}from"rxjs";var{FeeUtils:it}=v,Ct=class extends N{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=_.getPoolAddress(t),n=gi(e,{dkLen:32}),r=di(n);return mi(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=_.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(pi.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:it.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=it.fromPermill(r.max_peg_update),o=it.fromPermill(e.fee),[l,c]=_.recalculatePegs(JSON.stringify(a),JSON.stringify(i),n.toString(),it.toRaw(s).toString(),it.toRaw(o).toString()),m=Number(l)*1e6;return{pegsFee:it.fromPermill(m),pegs:c}}getDefaultPegs(t){let e=t.fee,n=_.defaultPegs(t.assets.length);return{pegsFee:it.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?bi(t):e.watchValue("best").pipe(hi(r=>Promise.all([this.getPoolDelta(t.id,n,r),this.getPoolPegs(t.id,n,r)])),yi(([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 Ae={};w(Ae,{XykMath:()=>X,XykPool:()=>Dt,XykPoolClient:()=>Mt});import{calculate_in_given_out as Pi,calculate_out_given_in as fi,calculate_pool_trade_fee as Si,get_spot_price as Ti,calculate_liquidity_in as wi,calculate_shares as xi,calculate_spot_price as Ii,calculate_spot_price_with_fee as vi,calculate_liquidity_out_asset_a as Oi,calculate_liquidity_out_asset_b as Ai}from"@galacticcouncil/math-xyk";var X=class{static getSpotPrice(t,e,n){return Ti(t,e,n)}static calculateInGivenOut(t,e,n){return Pi(t,e,n)}static calculateOutGivenIn(t,e,n){return fi(t,e,n)}static calculatePoolTradeFee(t,e,n){return Si(t,e,n)}static calculateLiquidityIn(t,e,n){return wi(t,e,n)}static calculateSpotPrice(t,e){return Ii(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return vi(t,e,n,r)}static calculateShares(t,e,n){return xi(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return Oi(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return Ai(t,e,n,r)}};var{FeeUtils:dn}=v,Dt=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=dn.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=dn.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=X.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=X.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=X.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=X.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=X.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Bi}from"polkadot-api";import{of as _i}from"rxjs";var Mt=class extends N{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(Bi.BackwardsCompatible,e)}subscribePoolChange(t){return _i(t)}};var Be={};w(Be,{AavePool:()=>Lt,AavePoolClient:()=>qt});var Lt=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}};import{AccountId as Ri}from"polkadot-api";import{toHex as Fi}from"@polkadot-api/utils";import{map as ki,merge as Ei,switchMap as Ci}from"rxjs";import{decodeEventLog as Di}from"viem";var gn=[{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:Mi}=st,Li=["Supply","Withdraw","Repay","Borrow"],qt=class extends N{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=Fi(r);return Ri(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}=Di({abi:gn,topics:c,data:m});return Li.includes(d)&&p.reserve.toLowerCase()===r.toLowerCase()});return Ei([i,a]).pipe(Ci(()=>this.getPoolDelta(t)),ki(s=>({...t,tokens:[...s]})))}getReserveH160Id(t){return t.type==="Erc20"?tt.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Mi.fromAssetId(t.id)}};var pt=class{static get(t){switch(t.type){case"Aave":return Lt.fromPool(t);case"XYK":return Dt.fromPool(t);case"Omnipool":return Ft.fromPool(t);case"LBP":return Bt.fromPool(t);case"Stableswap":return Et.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as qi,Subscription as Nt,takeUntil as Ni}from"rxjs";var dt=class extends R{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=Nt.EMPTY;omniSub=Nt.EMPTY;stableSub=Nt.EMPTY;xykSub=Nt.EMPTY;aaveSub=Nt.EMPTY;isReady=!1;isDestroyed=new qi;constructor(t,e){super(t),this.evm=e,this.lbpClient=new Rt(t,e),this.omniClient=new kt(t,e),this.stableClient=new Ct(t,e),this.xykClient=new Mt(t,e),this.aaveClient=new qt(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe(Ni(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 xt(t.type)}};var Sn={};w(Sn,{DEFAULT_BLOCK_TIME:()=>hn,DEFAULT_MIN_BUDGET:()=>Fe,ORDER_MIN_BLOCK_PERIOD:()=>Pn,Router:()=>gt,TWAP_BLOCK_PERIOD:()=>Wt,TWAP_MAX_DURATION:()=>Ee,TWAP_MAX_PRICE_IMPACT:()=>ke,TWAP_TX_MULTIPLIER:()=>Qu,TradeOrderError:()=>Re,TradeOrderType:()=>re,TradeRouteBuilder:()=>G,TradeRouter:()=>yt,TradeScheduler:()=>bt,TradeType:()=>ne});var Gt=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 Gi=8,Ut=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 Gt,a=[];for(a.push([e,""]),i.enqueue(a);i.size()>0;){let s=i.dequeue();if(!s||s.length>Gi)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 Gt,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 _e(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 Vt=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 Ut,c=y=>{let h=_e(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 gt=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new Vt,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,pt.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 ne=(e=>(e.Buy="Buy",e.Sell="Sell",e))(ne||{}),re=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(re||{}),Re=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Re||{});var{FeeUtils:bn}=v,yt=class extends gt{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 It(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?bn.toPct(t.min):void 0,n=t.max?bn.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:O.calculateSellFee(o,s),d=Math.pow(10,n.assetInDecimals),p=n.amountIn*a/BigInt(d),g=O.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=O.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=O.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:O.calculateBuyFee(o,s),d=Math.pow(10,n.assetOutDecimals),p=n.amountOut*a/BigInt(d),g;return o===0n?g=-100:g=O.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=O.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 hn=6e3,Fe=1000000000000000n,Wt=6,ke=-5,Ee=216e5,Qu=3,Pn=6;import{Enum as fn}from"polkadot-api";var G=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:i})=>r==="Stableswap"?{pool:fn("Stableswap",i),asset_in:e,asset_out:n}:{pool:fn(r),asset_in:e,asset_out:n})}};var bt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Fe})}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),F=Math.round(r/P),k=o/BigInt(P),B=await this.router.getBestSell(t,e,k),C=o<a,U=[];C&&U.push("OrderTooSmall");let D=B.amountOut*BigInt(P),W=this.toBlockPeriod(F),K=B.tradeFee*BigInt(P),J=G.build(l),ft={assetIn:t,assetOut:e,errors:U,frequencyMin:S,frequencyOpt:T,frequency:F,tradeCount:P,tradeFee:K,tradeImpactPct:B.priceImpactPct,tradePeriod:W,tradeRoute:J,type:"Dca"};return{...ft,amountIn:o,amountOut:D,tradeAmountIn:B.amountIn,tradeAmountOut:B.amountOut,toHuman(){return{...ft,amountIn:f.toDecimal(o,p),amountOut:f.toDecimal(D,g),tradeAmountIn:f.toDecimal(B.amountIn,p),tradeAmountOut:f.toDecimal(B.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 F=y.amountOut*BigInt(g),k=y.tradeFee*BigInt(g),B=G.build(s),C={assetIn:t,assetOut:e,errors:T,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:B,type:"TwapSell"};return{...C,amountIn:a,amountOut:F,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:k,toHuman(){return{...C,amountIn:f.toDecimal(a,m),amountOut:f.toDecimal(F,d),tradeAmountIn:f.toDecimal(y.amountIn,m),tradeAmountOut:f.toDecimal(y.amountOut,d),tradeFee:f.toDecimal(k,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,F=[];S||P?F.push("OrderTooSmall"):T&&F.push("OrderImpactTooBig");let k=y.tradeFee*BigInt(g),B=G.build(s),C={assetIn:t,assetOut:e,errors:F,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:B,type:"TwapBuy"};return{...C,amountIn:h,amountOut:a,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:k,toHuman(){return{...C,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(k,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 xn={};w(xn,{BIG_10:()=>wn,BIG_BILL:()=>De,StakingApi:()=>Ht,StakingClient:()=>Yt});import{encodeAddress as Ui}from"@polkadot/util-crypto";import{stringToU8a as Vi}from"@polkadot/util";import{calculate_accumulated_rps as Wi,calculate_percentage_amount as Hi,calculate_period_number as Tn,calculate_points as Yi,calculate_rewards as Xi,sigmoid as Ki}from"@galacticcouncil/math-staking";import q from"big.js";var Ce={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},zi=u=>Object.keys(Ce).includes(u),ji="20000000000000000",$i="2000",wn=q(10),De=q(wn.pow(12));function Qi(u){return Ui(Vi(("modl"+u).padEnd(32,"\0")),63)}var Ht=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=Qi(t);return(await this.balanceClient.getBalance(e,0)).transferable}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")&&zi(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=q(0),a=q(0),s=Ce.locked6x,o=q(n.toString()).mul(s),l=100,c=[];t.forEach(p=>{let g=Ce[p.conviction],b=r.includes(p.id.toString());b&&c.push(p.id.toString());let y=q(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(q(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.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getTimePointsPerPeriod(),this.client.getTimePointsWeight(),this.client.getActionPointsWeight(),this.client.getSixBlockSince()]),y=q(l.toString()).minus(i.toString()),h=y.gt(0)&&s>0?Wi(a.toString(),y.toString(),s.toString()):a.toString(),P=Tn(c.toString(),n,b),S=Tn(c.toString(),o.createdAt.toString(),b),T=Xi(h,o.rewardPerStake.toString(),o.stake.toString()),F=this.getCurrentActionPoints(o.votes,o.actionPoints,o.stake,e),k=Yi(S,P,d.toString(),p.toString(),F.currentActionPoints,g.toString(),o.accumulatedSlashPoints.toString()),B=q(k).div(2).toString(),C=Ki(B,ji,$i),U=q(T).plus(o.accumulatedUnpaidRewards.toString()).plus(o.accumulatedLockedRewards.toString());if(q(P).minus(S).lte(m.toString()))return{rewards:"0"};let D=Hi(U.toString(),C),W=q(o.accumulatedLockedRewards.toString()),K=W.gt(D)?W:q(D);return{rewards:K.div(De).toString(),maxRewards:U.div(De).toString(),allocatedRewardsPercentage:K.div(U).mul(100).toNumber()}}};var Yt=class extends R{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 On={};w(On,{TxBuilderFactory:()=>Pt});import{Enum as vn}from"polkadot-api";function In(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var ht=class extends R{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new H(t),this.aaveUtils=new et(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:me})}async dryRun(t,e){let n=vn("Signed",t),r=vn("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=In(s.value);throw new Error("Dry run execution error!",{cause:o})}return a}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var ie=class extends ht{_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=O.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:G.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=O.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:G.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=O.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:G.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as Me}from"polkadot-api";var se=class extends ht{_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:Me("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=O.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:Me("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=O.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:Me("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 Pt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new ie(this.client,this.evmClient).setTrade(t)}order(t){return new se(this.client,this.evmClient).setOrder(t)}};async function ap(u){let t=new ct(u),e=new vt(u),[n,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),i=new dt(u,e).withAave().withOmnipool().withStableswap().withXyk(),a=new H(u),s=new Yt(u),o=new At(u),l=new et(e),c=new yt(i),m=new bt(c,{blockTime:n,minBudgetInNative:r}),d=new Ht(s,a),p=new Ot(o,a,{blockTime:n});return{api:{aave:l,router:c,scheduler:m,staking:d,farm:p},client:{asset:new ot(u),balance:a,evm:e},ctx:{pool:i},tx:new Pt(u,e),destroy:()=>{i.destroy()}}}export{Ye as aave,qe as api,f as big,ze as client,Ne as const,ap as createSdkContext,st as erc20,je as error,Je as evm,sn as farm,v as fmt,Qt as h160,tt as json,O as math,yn as pool,Sn as sor,xn as staking,On as tx,He as xc};
1
+ var kn=Object.defineProperty;var w=(u,t)=>{for(var e in t)kn(u,e,{get:t[e],enumerable:!0})};var Ne={};w(Ne,{Papi:()=>R,getWs:()=>Mn});import{hydration as En}from"@galacticcouncil/descriptors";function qe(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var R=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(En)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");qe(n)&&console.log(t,...e)}};import{createClient as Cn}from"polkadot-api";import{withPolkadotSdkCompat as Dn}from"polkadot-api/polkadot-sdk-compat";var Mn=async u=>{let t=typeof u=="string"?u.split(","):u,r=(typeof window>"u"?(await import("polkadot-api/ws-provider/node")).getWsProvider:(await import("polkadot-api/ws-provider/web")).getWsProvider)(t);return Cn(Dn(r))};var Xe={};w(Xe,{AAVE_GAS_LIMIT:()=>ue,AAVE_LENDING_POOL_ADDRESS:()=>Qt,AAVE_POOL_ABI:()=>le,AAVE_POOL_DATA_PROVIDER:()=>$t,AAVE_POOL_DATA_PROVIDER_ABI:()=>jt,AAVE_POOL_PROXY:()=>ce,AAVE_ROUNDING_THRESHOLD:()=>bs,AAVE_UINT_256_MAX:()=>Ln,AaveClient:()=>St,AaveUtils:()=>et});var le=[{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 jt=[{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 ce="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",$t="0x112b087b60C1a166130d59266363C45F8aa99db0",Qt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",ue=1000000n,bs=5,Ln=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var St=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:jt,address:$t,args:[Qt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:jt,address:$t,args:[Qt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:le,address:ce,args:[t],functionName:"getUserAccountData"})}};import j from"big.js";var f={};w(f,{asBigInt:()=>Gn,toBigInt:()=>Nn,toDecimal:()=>qn});import Z from"big.js";Z.NE=-18;function qn(u,t,e=6,n){let r=Z(u.toString()),i=Z(10).pow(t);return r.div(i).round(e,n).toString()}function Nn(u,t){let e=Z(10).pow(t),r=Z(u).mul(e).toFixed(0,Z.roundDown);return BigInt(r)}function Gn(u){return BigInt(u.round(0,Z.roundDown).toFixed(0))}var st={};w(st,{ERC20:()=>me});var me=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 v={};w(v,{FeeUtils:()=>ye,shiftNeg:()=>Hn});import Wn from"big.js";var Ge={};w(Ge,{HUB_ASSET_ID:()=>ge,HYDRATION_OMNIPOOL_ADDRESS:()=>Vn,HYDRATION_PARACHAIN_ID:()=>Un,HYDRATION_SS58_PREFIX:()=>D,PERBILL_DENOMINATOR:()=>pe,PERMILL_DENOMINATOR:()=>Tt,RUNTIME_DECIMALS:()=>I,SYSTEM_ASSET_DECIMALS:()=>de,SYSTEM_ASSET_ID:()=>k,TRADEABLE_DEFAULT:()=>at});var I=18,Tt=1e6,pe=1e9,k=0,de=12,Un=2034,D=63,Vn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",ge=1,at=15;var ye=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 Hn(u,t){let e=Wn(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Jt={};w(Jt,{H160:()=>he,isEvmAccount:()=>Ve,isEvmAddress:()=>We,isSs58Address:()=>He});import{AccountId as wt}from"polkadot-api";import{toHex as Ue}from"@polkadot-api/utils";import{Buffer as z}from"buffer";var be="ETH\0";function Ve(u){if(!u)return!1;try{let t=wt().enc(u),e=z.from(be);return z.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function We(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function He(u){try{return wt(63).enc(u),!0}catch{return!1}}var he=class u{static toAccount=t=>{let e=z.from(t.slice(2),"hex"),n=z.from(be),r=Uint8Array.from(z.concat([n,e,z.alloc(8)])),i=Ue(r);return wt(63).dec(i)};static fromAccount=t=>{let e=wt().enc(t),n=z.from(be),r=e.slice(n.length,-8);return"0x"+z.from(r).toString("hex")};static fromSS58=t=>{let n=wt().enc(t).slice(0,20);return Ue(n)};static fromAny=t=>{if(We(t))return t;if(Ve(t))return u.fromAccount(t);if(He(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var tt={};w(tt,{findNestedKey:()=>Yn,findNestedObj:()=>Xn,jsonFormatter:()=>Kn});var Yn=(u,t)=>{let e=[];return JSON.stringify(u,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},Xn=(u,t,e)=>{let n;return JSON.stringify(u,(r,i)=>(i&&i[t]===e&&(n=i),i)),n},Kn=(u,t)=>typeof t=="bigint"?t.toString():t;var O={};w(O,{calculateBuyFee:()=>Qn,calculateDiffToAvg:()=>zn,calculateDiffToRef:()=>jn,calculateSellFee:()=>$n,getFraction:()=>Jn});import X from"big.js";function zn(u,t){let e=X(u.toString()),n=X(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function jn(u,t){if(t===0n)return 0;let e=X(u.toString()),n=X(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function $n(u,t){let e=X(u.toString()),n=X(t.toString());return X(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Qn(u,t){let e=X(u.toString());return X(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 n=Math.pow(10,e),r=BigInt(t*n);return u*r/BigInt(100*n)}var Ye={};w(Ye,{convertToId:()=>tr});import{Buffer as Zn}from"buffer";function tr(u){let e=Zn.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Zt}=st,{H160:Pe}=Jt,er=1.01,nr=31536000n,te=10n**27n,et=class{client;constructor(t){this.client=new St(t)}async getSummary(t){let e=Pe.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:oe})=>oe.toLowerCase()===S);if(!T)throw new Error("Missing pool reserve for "+S);let F=P.scaledATokenBalance,M=T.liquidityIndex,A=T.liquidityRate,C=T.availableLiquidity,U=T.priceInMarketReferenceCurrency,H=a+6,L=this.calculateLinearInterest(A,T.lastUpdateTimestamp,H),V=M*L/te,ft=F*V/te,Xt=Number(l!==0&&l===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,Kt=T.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,zt=Zt.toAssetId(S);h.push({aTokenBalance:ft,availableLiquidity:C,decimals:Number(T.decimals),isCollateral:Kt,priceInRef:U,reserveId:zt,reserveAsset:S,reserveLiquidationThreshold:Xt})}return{healthFactor:Number(y),totalCollateral:c,totalDebt:m,reserves:h}}async hasBorrowPositions(t){let e=Pe.fromAny(t),n=await this.client.getUserAccountData(e),[r,i]=n;return i>0n}async getHealthFactor(t){let e=Pe.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=Zt.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=j(b.toString()).mul(d).div(i.toString()).toFixed(6,j.roundDown);return Number(y)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:i,reserves:a}=await this.getSummary(t),s=Zt.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=j(g.toString()).mul(m).div(i.toString()).toFixed(6,j.roundDown);return Number(b)}async getMaxWithdraw(t,e){let{totalDebt:n,reserves:r,healthFactor:i}=await this.getSummary(t),a=Zt.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=j(d).mul(e.toString()).div(o).toFixed(0,j.roundDown),g=j(p).div(s.toString()).mul(10**a).toFixed(0,j.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 te;let i=t*BigInt(r)/nr;return te+i}};var je={};w(je,{AssetClient:()=>ot,BalanceClient:()=>Y,ChainParams:()=>ct});var ot=class extends R{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)}};import{Subject as rr,bufferCount as ir,combineLatest as sr,debounceTime as ar,distinctUntilChanged as Ke,finalize as or,map as lt,pairwise as lr,shareReplay as cr,startWith as ur}from"rxjs";var Y=class extends R{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 sr([e,n,r]).pipe(ar(250),lt(i=>i.flat()),ur([]),ir(2,1),lt(([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=>!ze(c.balance,o.get(c.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe(lt(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(lt(r=>({id:e,balance:r})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(Ke((n,r)=>!r.deltas),lt(({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 rr,r=n.pipe(cr(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(or(()=>s?.()),lr(),lt(([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=>!ze(p.balance,m.get(p.id)))}),Ke((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},ze=(u,t)=>u!==void 0&&t!==void 0&&u.transferable===t.transferable&&u.total===t.total;var ct=class extends R{_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 $e={};w($e,{AssetNotFound:()=>fe,PoolNotFound:()=>xt,RouteNotFound:()=>It});var fe=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},xt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},It=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var Ze={};w(Ze,{EvmClient:()=>vt,createChain:()=>Se});import{defineChain as mr}from"viem";var pr=["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"],Se=()=>mr({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:pr}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});import{createPublicClient as Qe,createWalletClient as dr,custom as Je,http as gr}from"viem";var vt=class{client;chain;constructor(t){this.client=t,this.chain=Se()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return Qe({chain:this.chain,transport:gr()})}getWsProvider(){return Qe({transport:Je({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return dr({account:t,chain:this.chain,transport:Je(window.ethereum)})}};var an={};w(an,{LiquidityMiningApi:()=>Ot,LiquidityMiningClient:()=>At});import{AccountId as Sr}from"polkadot-api";import E from"big.js";import{fixed_from_rational as sn}from"@galacticcouncil/math-liquidity-mining";var ee=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)}};import nt from"big.js";import{calculate_accumulated_rps as yr,calculate_global_farm_rewards as br,calculate_loyalty_multiplier as hr,calculate_user_reward as rn,calculate_yield_farm_delta_rpvs as Pr}from"@galacticcouncil/math-liquidity-mining";import tn from"big.js";var Te=tn(10).pow(18),en=BigInt(tn(1).pow(18).toString()),nn=6e3;var fr="1000000000000000000",ne=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=nt(s.toString()),c=nt(o.toString()).minus(l.lt(o.toString())?s.toString():o.toString()),m=nt(br(t.total_shares_z.toString(),n.toString(),nt(t.yield_per_period.toString()).mul(Te).round(0,nt.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(yr(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=Pr(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=nt(1).mul(Te).round(0,nt.roundDown).toString();if(!e)return n;let{initial_reward_percentage:r,scale_coef:i}=e;return hr(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(rn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),m)),p=BigInt(rn(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),fr));return{reward:d,maxReward:p,assetId:s.reward_currency}}};var Tr=E(365.2425).times(24).times(60).times(60),Ot=class{client;balanceClient;options;constructor(t,e,n={}){this.client=t,this.balanceClient=e,this.options=Object.freeze({blockTime:n.blockTime??nn})}get blockTime(){return this.options.blockTime}async getOraclePrice(t,e){let n=[t,e].sort((i,a)=>i-a);if(t===e)return en;let r=await this.client.getOraclePrice(n);if(r){let{n:i,d:a}=r[0].price,s;return t<e?s=sn(i.toString(),a.toString()):s=sn(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 Sr(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let i=E(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=E(t.toString()).times(e),a=E(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:F,min_deposit:M}=i,A=v.shiftNeg(a??F,18),C=v.shiftNeg(l,18),U=v.shiftNeg(c?.initial_reward_percentage??0,18),H=Tr.div(E(this.blockTime).div(1e3).times(m)).toString(),L;if(p<=0)L=E(C).times(d.toString()).times(H).toString();else{let Rn=this.getGlobalRewardPerPeriod(p,d,g,A),Fn=this.getPoolYieldPerPeriod(Rn,C,p,A);L=E(Fn).times(H).toString()}let V=b+y,ft=g*BigInt(h),J=s.transferable+V,Me=J-V,Xt=E(Me.toString()).div(g.toString()),Kt=E(e).div(m.toString()).toString(),zt=(p>=0?Xt.plus(P):Xt.plus(Kt)).toString(),oe=E(zt).times(m).toString(),Bn=E(p.toString()).div(E(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(A).toFixed(2),Le=E(V.toString()).div(J.toString()).gte(.999);L=Le?"0":E(L).div(n?2:1).times(100).toString();let _n=U?E(L).times(U).toString():void 0;return{apr:L,minApr:_n,isDistributed:Le,estimatedEndPeriod:zt,estimatedEndBlock:oe,maxRewards:ft,incentivizedAsset:S,rewardCurrency:T,loyaltyCurve:c,currentPeriod:Kt,potMaxRewards:J,fullness:Bn,yieldFarmId:r.id,globalFarmId:i.id,poolId:o,distributedRewards:V,plannedYieldingPeriods:h,minDeposit:M}}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 ee(m,d),y=await new ne(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}};import{Binary as wr,Enum as xr}from"polkadot-api";var At=class extends R{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(wr.fromText("omnipool"),t,xr("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 bn={};w(bn,{PoolContextProvider:()=>dt,PoolError:()=>rt,PoolFactory:()=>pt,PoolType:()=>B,aave:()=>Ae,lbp:()=>xe,omni:()=>Ie,stable:()=>ve,xyk:()=>Oe});var xe={};w(xe,{LbpMath:()=>W,LbpPool:()=>Bt,LbpPoolClient:()=>Rt});import{calculate_in_given_out as Ir,calculate_out_given_in as vr,calculate_linear_weights as Or,calculate_pool_trade_fee as Ar,get_spot_price as Br}from"@galacticcouncil/math-lbp";var W=class{static getSpotPrice(t,e,n,r,i){return Br(t,e,n,r,i)}static calculateInGivenOut(t,e,n,r,i){return Ir(t,e,n,r,i)}static calculateOutGivenIn(t,e,n,r,i){return vr(t,e,n,r,i)}static calculateLinearWeights(t,e,n,r,i){return Or(t,e,n,r,i)}static calculatePoolTradeFee(t,e,n){return Ar(t,e,n)}};var B=(i=>(i.Aave="Aave",i.LBP="LBP",i.Omni="Omnipool",i.Stable="Stableswap",i.XYK="XYK",i))(B||{}),rt=(i=>(i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i.UnknownError="UnknownError",i))(rt||{});var{FeeUtils:on}=v,Bt=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=on.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=on.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=W.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=W.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=W.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=W.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=W.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Dr}from"polkadot-api";import{map as Mr,of as pn,switchMap as Lr}from"rxjs";import{memoize1 as _r}from"@thi.ng/memoize";import{combineLatest as ln,combineLatestAll as Rr,debounceTime as Fr,firstValueFrom as kr,from as cn,map as un,mergeAll as Er,of as Cr,switchMap as mn}from"rxjs";var we=[{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 _t=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,r,i]=await Promise.all([this.client.readContract({abi:we,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:we,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 N=class extends Y{evm;mmOracle;override=[];mem=0;memPools=_r(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new _t(e)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=cn(this.getPoolsMem()).pipe(mn(e=>this.subscribe(e)),Rr());return kr(t)}getSubscriber(){return cn(this.getPoolsMem()).pipe(mn(t=>this.subscribe(t)),Er())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>ln([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe(Fr(250),un(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return Cr([]);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 ln(e).pipe(un(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 Rt=class extends N{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=W.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(Dr.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe(Lr(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):pn(t)),Mr(r=>Object.assign({},t,r))):pn(t)}};var Ie={};w(Ie,{OmniMath:()=>x,OmniPool:()=>Ft,OmniPoolClient:()=>kt});import{calculate_in_given_out as qr,calculate_lrna_in_given_out as Nr,calculate_out_given_in as Gr,calculate_out_given_lrna_in as Ur,calculate_spot_price as Vr,calculate_lrna_spot_price as Wr,calculate_shares as Hr,calculate_liquidity_out as Yr,calculate_liquidity_lrna_out as Xr,verify_asset_cap as Kr,calculate_liquidity_hub_in as zr,is_sell_allowed as jr,is_buy_allowed as $r,is_add_liquidity_allowed as Qr,is_remove_liquidity_allowed as Jr}from"@galacticcouncil/math-omnipool";import ut from"big.js";var x=class{static calculateSpotPrice(t,e,n,r){return Vr(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return Wr(t,e)}static calculateInGivenOut(t,e,n,r,i,a,s,o,l){return qr(t,e,n,r,i,a,s,o,l)}static calculateLrnaInGivenOut(t,e,n,r,i){return Nr(t,e,n,r,i)}static calculateOutGivenIn(t,e,n,r,i,a,s,o,l){return Gr(t,e,n,r,i,a,s,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,i){return Ur(t,e,n,r,i)}static calculateShares(t,e,n,r){return Hr(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,i,a,s,o){return Yr(t,e,n,r,i,a,s,o)}static calculateLiquidityLRNAOut(t,e,n,r,i,a,s,o){return Xr(t,e,n,r,i,a,s,o)}static calculateCapDifference(t,e,n,r){let i=ut(e),a=ut(t),s=ut(r),o=ut(n),l=ut(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(ut(1).minus(c));return d.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return Kr(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return zr(t,e,n,r)}static isSellAllowed(t){return jr(t)}static isBuyAllowed(t){return $r(t)}static isAddLiquidityAllowed(t){return Qr(t)}static isRemoveLiquidityAllowed(t){return Jr(t)}};var{FeeUtils:mt}=v,Ft=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:O.calculateDiffToRef(i,r),s=[],o=x.isSellAllowed(t.tradeableIn),l=x.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=O.calculateDiffToRef(r,i),s=[],o=x.isSellAllowed(t.tradeableIn),l=x.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=x.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?mt.toRaw(n.assetFee).toString():"0",n?mt.toRaw(n.protocolFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateLrnaInGivenOut(t,e,n){let r=x.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?mt.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=x.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?mt.toRaw(n.assetFee).toString():"0",n?mt.toRaw(n.protocolFee).toString():"0"),i=BigInt(r);return i<0n?0n:i}calculateOutGivenLrnaIn(t,e,n){let r=x.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?mt.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=x.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=x.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=x.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=x.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as Zr,CompatibilityLevel as ti}from"polkadot-api";import{toHex as ei}from"@polkadot-api/utils";import{distinctUntilChanged as ni,map as dn}from"rxjs";var{FeeUtils:$}=v,kt=class extends N{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=ei(e);return Zr(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:$.fromPermill(o),protocolFee:$.fromPermill(l),min:$.fromPermill(a),max:$.fromPermill(s)}}else return{assetFee:$.fromPermill(n.min_fee),protocolFee:$.fromPermill(r.min_fee),min:$.fromPermill(a),max:$.fromPermill(s)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(ti.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(ni((n,r)=>!r.deltas),dn(({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}})),dn(n=>{let r=t.tokens.find(i=>i.id===1);return{...t,tokens:[...n,r]}}))}};var ve={};w(ve,{StableMath:()=>_,StableSwap:()=>Et,StableSwapClient:()=>Ct});import{calculate_in_given_out as ri,calculate_out_given_in as ii,calculate_amplification as si,calculate_add_one_asset as ai,calculate_liquidity_out_one_asset as oi,calculate_shares as li,calculate_shares_for_amount as ci,calculate_spot_price_with_fee as ui,pool_account_name as mi,recalculate_peg as pi}from"@galacticcouncil/math-stableswap";var _=class{static getPoolAddress(t){return mi(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 si(t,e,n,r,i)}static calculateInGivenOut(t,e,n,r,i,a,s){return ri(t,e,n,r,i,a,s)}static calculateAddOneAsset(t,e,n,r,i,a,s){return ai(t,e,n,r,i,a,s)}static calculateSharesForAmount(t,e,n,r,i,a,s){return ci(t,e,n,r,i,a,s)}static calculateOutGivenIn(t,e,n,r,i,a,s){return ii(t,e,n,r,i,a,s)}static calculateLiquidityOutOneAsset(t,e,n,r,i,a,s){return oi(t,e,n,r,i,a,s)}static calculateShares(t,e,n,r,i,a){return li(t,e,n,r,i,a)}static calculateSpotPriceWithFee(t,e,n,r,i,a,s,o){return ui(t,e,n,r,i,a,s,o)}static recalculatePegs(t,e,n,r,i){let a=pi(t,e,n,r,i);return JSON.parse(a)}};var{FeeUtils:Q}=v,Et=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=Q.toPct(n.fee),s=[],o=x.isSellAllowed(t.tradeableIn),l=x.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=Q.toPct(n.fee),s=[],o=x.isSellAllowed(t.tradeableIn),l=x.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=_.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?Q.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateAddOneAsset(t,e,n){let r=_.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?Q.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateSharesForAmount(t,e,n){let r=_.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?Q.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=_.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=_.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?Q.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateWithdrawOneAsset(t,e,n){let r=_.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?Q.toRaw(n.fee).toString():"0",this.getPegs()),i=BigInt(r);return i<0n?0n:i}calculateShares(t,e,n){let r=_.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?Q.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=_.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=_.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,tt.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],tt.jsonFormatter)}};import{AccountId as di,CompatibilityLevel as gi}from"polkadot-api";import{toHex as yi}from"@polkadot-api/utils";import{blake2b as bi}from"@noble/hashes/blake2b";import{map as hi,of as Pi,switchMap as fi}from"rxjs";var{FeeUtils:it}=v,Ct=class extends N{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=_.getPoolAddress(t),n=bi(e,{dkLen:32}),r=yi(n);return di(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=_.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(gi.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:it.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=it.fromPermill(r.max_peg_update),o=it.fromPermill(e.fee),[l,c]=_.recalculatePegs(JSON.stringify(a),JSON.stringify(i),n.toString(),it.toRaw(s).toString(),it.toRaw(o).toString()),m=Number(l)*1e6;return{pegsFee:it.fromPermill(m),pegs:c}}getDefaultPegs(t){let e=t.fee,n=_.defaultPegs(t.assets.length);return{pegsFee:it.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?Pi(t):e.watchValue("best").pipe(fi(r=>Promise.all([this.getPoolDelta(t.id,n,r),this.getPoolPegs(t.id,n,r)])),hi(([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 Oe={};w(Oe,{XykMath:()=>K,XykPool:()=>Dt,XykPoolClient:()=>Mt});import{calculate_in_given_out as Si,calculate_out_given_in as Ti,calculate_pool_trade_fee as wi,get_spot_price as xi,calculate_liquidity_in as Ii,calculate_shares as vi,calculate_spot_price as Oi,calculate_spot_price_with_fee as Ai,calculate_liquidity_out_asset_a as Bi,calculate_liquidity_out_asset_b as _i}from"@galacticcouncil/math-xyk";var K=class{static getSpotPrice(t,e,n){return xi(t,e,n)}static calculateInGivenOut(t,e,n){return Si(t,e,n)}static calculateOutGivenIn(t,e,n){return Ti(t,e,n)}static calculatePoolTradeFee(t,e,n){return wi(t,e,n)}static calculateLiquidityIn(t,e,n){return Ii(t,e,n)}static calculateSpotPrice(t,e){return Oi(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return Ai(t,e,n,r)}static calculateShares(t,e,n){return vi(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return Bi(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return _i(t,e,n,r)}};var{FeeUtils:gn}=v,Dt=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=gn.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=gn.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=K.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=K.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=K.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=K.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=K.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Ri}from"polkadot-api";import{of as Fi}from"rxjs";var Mt=class extends N{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(Ri.BackwardsCompatible,e)}subscribePoolChange(t){return Fi(t)}};var Ae={};w(Ae,{AavePool:()=>Lt,AavePoolClient:()=>qt});var Lt=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}};import{AccountId as ki}from"polkadot-api";import{toHex as Ei}from"@polkadot-api/utils";import{map as Ci,merge as Di,switchMap as Mi}from"rxjs";import{decodeEventLog as Li}from"viem";var yn=[{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:qi}=st,Ni=["Supply","Withdraw","Repay","Borrow"],qt=class extends N{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=Ei(r);return ki(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}=Li({abi:yn,topics:c,data:m});return Ni.includes(d)&&p.reserve.toLowerCase()===r.toLowerCase()});return Di([i,a]).pipe(Mi(()=>this.getPoolDelta(t)),Ci(s=>({...t,tokens:[...s]})))}getReserveH160Id(t){return t.type==="Erc20"?tt.findNestedKey(t.location,"AccountKey20").AccountKey20.key:qi.fromAssetId(t.id)}};var pt=class{static get(t){switch(t.type){case"Aave":return Lt.fromPool(t);case"XYK":return Dt.fromPool(t);case"Omnipool":return Ft.fromPool(t);case"LBP":return Bt.fromPool(t);case"Stableswap":return Et.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as Gi,Subscription as Nt,takeUntil as Ui}from"rxjs";var dt=class extends R{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=Nt.EMPTY;omniSub=Nt.EMPTY;stableSub=Nt.EMPTY;xykSub=Nt.EMPTY;aaveSub=Nt.EMPTY;isReady=!1;isDestroyed=new Gi;constructor(t,e){super(t),this.evm=e,this.lbpClient=new Rt(t,e),this.omniClient=new kt(t,e),this.stableClient=new Ct(t,e),this.xykClient=new Mt(t,e),this.aaveClient=new qt(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe(Ui(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 xt(t.type)}};var Tn={};w(Tn,{DEFAULT_BLOCK_TIME:()=>Pn,DEFAULT_MIN_BUDGET:()=>Re,ORDER_MIN_BLOCK_PERIOD:()=>fn,Router:()=>gt,TWAP_BLOCK_PERIOD:()=>Wt,TWAP_MAX_DURATION:()=>ke,TWAP_MAX_PRICE_IMPACT:()=>Fe,TWAP_TX_MULTIPLIER:()=>Zu,TradeOrderError:()=>_e,TradeOrderType:()=>ie,TradeRouteBuilder:()=>G,TradeRouter:()=>yt,TradeScheduler:()=>bt,TradeType:()=>re});var Gt=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 Vi=8,Ut=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 Gt,a=[];for(a.push([e,""]),i.enqueue(a);i.size()>0;){let s=i.dequeue();if(!s||s.length>Vi)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 Gt,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 Be(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 Vt=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 Ut,c=y=>{let h=Be(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 gt=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new Vt,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,pt.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 re=(e=>(e.Buy="Buy",e.Sell="Sell",e))(re||{}),ie=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(ie||{}),_e=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(_e||{});var{FeeUtils:hn}=v,yt=class extends gt{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 It(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?hn.toPct(t.min):void 0,n=t.max?hn.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:O.calculateSellFee(o,s),d=Math.pow(10,n.assetInDecimals),p=n.amountIn*a/BigInt(d),g=O.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=O.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=O.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:O.calculateBuyFee(o,s),d=Math.pow(10,n.assetOutDecimals),p=n.amountOut*a/BigInt(d),g;return o===0n?g=-100:g=O.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=O.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 Pn=6e3,Re=1000000000000000n,Wt=6,Fe=-5,ke=216e5,Zu=3,fn=6;import{Enum as Sn}from"polkadot-api";var G=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:i})=>r==="Stableswap"?{pool:Sn("Stableswap",i),asset_in:e,asset_out:n}:{pool:Sn(r),asset_in:e,asset_out:n})}};var bt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Re})}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),F=Math.round(r/P),M=o/BigInt(P),A=await this.router.getBestSell(t,e,M),C=o<a,U=[];C&&U.push("OrderTooSmall");let H=A.amountOut*BigInt(P),L=this.toBlockPeriod(F),V=A.tradeFee*BigInt(P),ft=G.build(l),J={assetIn:t,assetOut:e,errors:U,frequencyMin:S,frequencyOpt:T,frequency:F,tradeCount:P,tradeFee:V,tradeImpactPct:A.priceImpactPct,tradePeriod:L,tradeRoute:ft,type:"Dca"};return{...J,amountIn:o,amountOut:H,tradeAmountIn:A.amountIn,tradeAmountOut:A.amountOut,toHuman(){return{...J,amountIn:f.toDecimal(o,p),amountOut:f.toDecimal(H,g),tradeAmountIn:f.toDecimal(A.amountIn,p),tradeAmountOut:f.toDecimal(A.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 F=y.amountOut*BigInt(g),M=y.tradeFee*BigInt(g),A=G.build(s),C={assetIn:t,assetOut:e,errors:T,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:A,type:"TwapSell"};return{...C,amountIn:a,amountOut:F,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:M,toHuman(){return{...C,amountIn:f.toDecimal(a,m),amountOut:f.toDecimal(F,d),tradeAmountIn:f.toDecimal(y.amountIn,m),tradeAmountOut:f.toDecimal(y.amountOut,d),tradeFee:f.toDecimal(M,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,F=[];S||P?F.push("OrderTooSmall"):T&&F.push("OrderImpactTooBig");let M=y.tradeFee*BigInt(g),A=G.build(s),C={assetIn:t,assetOut:e,errors:F,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:A,type:"TwapBuy"};return{...C,amountIn:h,amountOut:a,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:M,toHuman(){return{...C,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(M,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 In={};w(In,{BIG_10:()=>xn,BIG_BILL:()=>Ce,StakingApi:()=>Ht,StakingClient:()=>Yt});import{encodeAddress as Wi}from"@polkadot/util-crypto";import{stringToU8a as Hi}from"@polkadot/util";import{calculate_accumulated_rps as Yi,calculate_percentage_amount as Xi,calculate_period_number as wn,calculate_points as Ki,calculate_rewards as zi,sigmoid as ji}from"@galacticcouncil/math-staking";import q from"big.js";var Ee={none:.1,locked1x:1,locked2x:2,locked3x:3,locked4x:4,locked5x:5,locked6x:6},$i=u=>Object.keys(Ee).includes(u),Qi="20000000000000000",Ji="2000",xn=q(10),Ce=q(xn.pow(12));function Zi(u){return Wi(Hi(("modl"+u).padEnd(32,"\0")),63)}var Ht=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=Zi(t);return(await this.balanceClient.getBalance(e,0)).transferable}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")&&$i(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=q(0),a=q(0),s=Ee.locked6x,o=q(n.toString()).mul(s),l=100,c=[];t.forEach(p=>{let g=Ee[p.conviction],b=r.includes(p.id.toString());b&&c.push(p.id.toString());let y=q(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(q(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.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getTimePointsPerPeriod(),this.client.getTimePointsWeight(),this.client.getActionPointsWeight(),this.client.getSixBlockSince()]),y=q(l.toString()).minus(i.toString()),h=y.gt(0)&&s>0?Yi(a.toString(),y.toString(),s.toString()):a.toString(),P=wn(c.toString(),n,b),S=wn(c.toString(),o.createdAt.toString(),b),T=zi(h,o.rewardPerStake.toString(),o.stake.toString()),F=this.getCurrentActionPoints(o.votes,o.actionPoints,o.stake,e),M=Ki(S,P,d.toString(),p.toString(),F.currentActionPoints,g.toString(),o.accumulatedSlashPoints.toString()),A=q(M).div(2).toString(),C=ji(A,Qi,Ji),U=q(T).plus(o.accumulatedUnpaidRewards.toString()).plus(o.accumulatedLockedRewards.toString());if(q(P).minus(S).lte(m.toString()))return{rewards:"0"};let H=Xi(U.toString(),C),L=q(o.accumulatedLockedRewards.toString()),V=L.gt(H)?L:q(H);return{rewards:V.div(Ce).toString(),maxRewards:U.div(Ce).toString(),allocatedRewardsPercentage:V.div(U).mul(100).toNumber()}}};var Yt=class extends R{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 An={};w(An,{TxBuilderFactory:()=>Pt});import{Enum as On}from"polkadot-api";function vn(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var ht=class extends R{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new Y(t),this.aaveUtils=new et(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:ue})}async dryRun(t,e){let n=On("Signed",t),r=On("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=vn(s.value);throw new Error("Dry run execution error!",{cause:o})}return a}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var se=class extends ht{_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=O.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:G.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=O.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:G.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=O.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:G.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as De}from"polkadot-api";var ae=class extends ht{_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:De("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=O.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:De("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=O.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:De("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 Pt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new se(this.client,this.evmClient).setTrade(t)}order(t){return new ae(this.client,this.evmClient).setOrder(t)}};async function lp(u){let t=new ct(u),e=new vt(u),[n,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),i=new dt(u,e).withAave().withOmnipool().withStableswap().withXyk(),a=new Y(u),s=new Yt(u),o=new At(u),l=new et(e),c=new yt(i),m=new bt(c,{blockTime:n,minBudgetInNative:r}),d=new Ht(s,a),p=new Ot(o,a,{blockTime:n});return{api:{aave:l,router:c,scheduler:m,staking:d,farm:p},client:{asset:new ot(u),balance:a,evm:e},ctx:{pool:i},tx:new Pt(u,e),destroy:()=>{i.destroy()}}}export{Xe as aave,Ne as api,f as big,je as client,Ge as const,lp as createSdkContext,st as erc20,$e as error,Ze as evm,an as farm,v as fmt,Jt as h160,tt as json,O as math,bn as pool,Tn as sor,In as staking,An as tx,Ye as xc};
@@ -1,4 +1,4 @@
1
1
  import Big from 'big.js';
2
2
  export declare const BN_QUINTILL: Big.Big;
3
3
  export declare const DEFAULT_ORACLE_PRICE: bigint;
4
- export declare const DEFAULT_BLOCK_TIME = 6;
4
+ export declare const DEFAULT_BLOCK_TIME = 6000;
@@ -26,6 +26,7 @@ export type Farm = {
26
26
  minApr: string | undefined;
27
27
  isDistributed: boolean;
28
28
  estimatedEndPeriod: string;
29
+ estimatedEndBlock: string;
29
30
  maxRewards: bigint;
30
31
  incentivizedAsset: number;
31
32
  rewardCurrency: number;
@@ -36,4 +37,7 @@ export type Farm = {
36
37
  yieldFarmId: number;
37
38
  globalFarmId: number;
38
39
  poolId: string;
40
+ distributedRewards: bigint;
41
+ plannedYieldingPeriods: number;
42
+ minDeposit: bigint;
39
43
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@galacticcouncil/sdk-next",
3
- "version": "0.8.0-pr203-91dcafe",
3
+ "version": "0.8.0-pr203-a290925",
4
4
  "description": "Galactic next gen sdk (papi)",
5
5
  "author": "GalacticCouncil",
6
6
  "repository": {