@galacticcouncil/sdk-next 0.7.0-pr193-3d86320 → 0.7.0-pr193-9afe5f7

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 tr=Object.create;var ue=Object.defineProperty;var er=Object.getOwnPropertyDescriptor;var nr=Object.getOwnPropertyNames;var rr=Object.getPrototypeOf,ar=Object.prototype.hasOwnProperty;var gn=(c,t)=>()=>(c&&(t=c(c=0)),t);var x=(c,t)=>{for(var e in t)ue(c,e,{get:t[e],enumerable:!0})},le=(c,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of nr(t))!ar.call(c,r)&&r!==e&&ue(c,r,{get:()=>t[r],enumerable:!(n=er(t,r))||n.enumerable});return c},bt=(c,t,e)=>(le(c,t,"default"),e&&le(e,t,"default")),ot=(c,t,e)=>(e=c!=null?tr(rr(c)):{},le(t||!c||!c.__esModule?ue(e,"default",{value:c,enumerable:!0}):e,c)),ir=c=>le(ue({},"__esModule",{value:!0}),c);var Dt={};var hn=gn(()=>{bt(Dt,require("@polkadot-api/ws-provider/node"))});var Mt={};var Pn=gn(()=>{bt(Mt,require("@polkadot-api/ws-provider/web"))});var Mr={};x(Mr,{aave:()=>qe,api:()=>xe,big:()=>h,client:()=>Ue,const:()=>Fe,createSdkContext:()=>Dr,erc20:()=>lt,error:()=>Ye,evm:()=>Ke,fmt:()=>k,h160:()=>Gt,json:()=>nt,math:()=>O,pool:()=>tn,sor:()=>ln,staking:()=>un,tx:()=>pn,xc:()=>Me});module.exports=ir(Mr);var xe={};x(xe,{Papi:()=>C,getWs:()=>sr});var bn=require("@galacticcouncil/descriptors");function yn(c){switch(c){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var C=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(bn.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");yn(n)&&console.log(t,...e)}};var fn=require("polkadot-api"),Sn=require("polkadot-api/polkadot-sdk-compat"),sr=async c=>{let t=typeof c=="string"?c.split(","):c,r=(typeof window>"u"?(await Promise.resolve().then(()=>(hn(),Dt))).getWsProvider:(await Promise.resolve().then(()=>(Pn(),Mt))).getWsProvider)(t);return(0,fn.createClient)((0,Sn.withPolkadotSdkCompat)(r))};var qe={};x(qe,{AAVE_GAS_LIMIT:()=>Oe,AAVE_LENDING_POOL_ADDRESS:()=>me,AAVE_POOL_ABI:()=>Ie,AAVE_POOL_DATA_PROVIDER:()=>pe,AAVE_POOL_DATA_PROVIDER_ABI:()=>ce,AAVE_POOL_PROXY:()=>ve,AAVE_ROUNDING_THRESHOLD:()=>Jr,AAVE_UINT_256_MAX:()=>or,AaveClient:()=>Lt,AaveUtils:()=>ut});var Ie=[{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 ce=[{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 ve="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",pe="0x112b087b60C1a166130d59266363C45F8aa99db0",me="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Oe=1000000n,Jr=5,or=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Lt=class{client;constructor(t){this.client=t.getWsProvider()}async getReservesData(){return await this.client.readContract({abi:ce,address:pe,args:[me],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:ce,address:pe,args:[me,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:Ie,address:ve,args:[t],functionName:"getUserAccountData"})}};var h={};x(h,{asBigInt:()=>cr,toBigInt:()=>ur,toDecimal:()=>lr});var et=ot(require("big.js"));et.default.NE=-18;function lr(c,t,e=6,n){let r=(0,et.default)(c.toString()),a=(0,et.default)(10).pow(t);return r.div(a).round(e,n).toString()}function ur(c,t){let e=(0,et.default)(10).pow(t),r=(0,et.default)(c).mul(e).toFixed(0,et.default.roundDown);return BigInt(r)}function cr(c){return BigInt(c.round(0,et.default.roundDown).toFixed(0))}var lt={};x(lt,{ERC20:()=>Ae});var Ae=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 k={};x(k,{FeeUtils:()=>Ee,shiftNeg:()=>Nt});var Tn=ot(require("big.js"));var Fe={};x(Fe,{HUB_ASSET_ID:()=>Re,HYDRATION_OMNIPOOL_ADDRESS:()=>mr,HYDRATION_PARACHAIN_ID:()=>pr,HYDRATION_SS58_PREFIX:()=>q,PERBILL_DENOMINATOR:()=>_e,PERMILL_DENOMINATOR:()=>qt,RUNTIME_DECIMALS:()=>_,SYSTEM_ASSET_DECIMALS:()=>Be,SYSTEM_ASSET_ID:()=>Y,TRADEABLE_DEFAULT:()=>ht});var _=18,qt=1e6,_e=1e9,Y=0,Be=12,pr=2034,q=63,mr="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Re=1,ht=15;var Ee=class c{static toPct(t){let[e,n]=t;return c.safeDivide(e*100,n)}static toRaw(t){let[e,n]=t;return c.safeDivide(e,n)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,n=12){let r=10**n;return Math.round(t*r/e)/r}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Nt(c,t){let e=(0,Tn.default)(typeof c=="bigint"?c.toString():c);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Gt={};x(Gt,{H160:()=>De,isEvmAccount:()=>wn,isEvmAddress:()=>xn,isSs58Address:()=>In});var Pt=require("polkadot-api"),Ce=require("@polkadot-api/utils"),J=require("buffer");var ke="ETH\0";function wn(c){if(!c)return!1;try{let t=(0,Pt.AccountId)().enc(c),e=J.Buffer.from(ke);return J.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function xn(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function In(c){try{return(0,Pt.AccountId)(63).enc(c),!0}catch{return!1}}var De=class c{static toAccount=t=>{let e=J.Buffer.from(t.slice(2),"hex"),n=J.Buffer.from(ke),r=Uint8Array.from(J.Buffer.concat([n,e,J.Buffer.alloc(8)])),a=(0,Ce.toHex)(r);return(0,Pt.AccountId)(63).dec(a)};static fromAccount=t=>{let e=(0,Pt.AccountId)().enc(t),n=J.Buffer.from(ke),r=e.slice(n.length,-8);return"0x"+J.Buffer.from(r).toString("hex")};static fromSS58=t=>{let n=(0,Pt.AccountId)().enc(t).slice(0,20);return(0,Ce.toHex)(n)};static fromAny=t=>{if(xn(t))return t;if(wn(t))return c.fromAccount(t);if(In(t))return c.fromSS58(t);throw new Error("Unknown address type")}};var nt={};x(nt,{findNestedKey:()=>dr,findNestedObj:()=>gr,jsonFormatter:()=>yr});var dr=(c,t)=>{let e=[];return JSON.stringify(c,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},gr=(c,t,e)=>{let n;return JSON.stringify(c,(r,a)=>(a&&a[t]===e&&(n=a),a)),n},yr=(c,t)=>typeof t=="bigint"?t.toString():t;var O={};x(O,{calculateBuyFee:()=>fr,calculateDiffToAvg:()=>br,calculateDiffToRef:()=>hr,calculateSellFee:()=>Pr,getFraction:()=>Sr});var z=ot(require("big.js"));function br(c,t){let e=(0,z.default)(c.toString()),n=(0,z.default)(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function hr(c,t){if(t===0n)return 0;let e=(0,z.default)(c.toString()),n=(0,z.default)(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Pr(c,t){let e=(0,z.default)(c.toString()),n=(0,z.default)(t.toString());return(0,z.default)(1).minus(n.div(e)).mul(100).round(2).toNumber()}function fr(c,t){let e=(0,z.default)(c.toString());return(0,z.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Sr(c,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 c*r/BigInt(100*n)}var Me={};x(Me,{convertToId:()=>Tr});var vn=require("buffer");function Tr(c){let e=vn.Buffer.from(c.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:de}=lt,{H160:Le}=Gt,wr=1.01,xr=99999,Ir=10n**27n,vr=10n**18n,ut=class{client;constructor(t){this.client=new Lt(t)}async getSummary(t){let e=Le.fromAny(t),[n,r,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[s]=n,[i,o]=r,[l,u,p,d,m,y]=a,b=h.toDecimal(y,18),g=[];for(let P of i){let f=P.underlyingAsset.toLowerCase(),S=s.find(({underlyingAsset:st})=>st.toLowerCase()===f);if(!S)throw new Error("Missing pool reserve for "+f);let v=P.scaledATokenBalance,L=S.liquidityIndex,N=S.priceInMarketReferenceCurrency,M=v*L/Ir,W=Number(o===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,tt=S.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,Ct=de.toAssetId(f);g.push({aTokenBalance:M,decimals:Number(S.decimals),isCollateral:tt,priceInRef:N,reserveId:Ct,reserveAsset:f,reserveLiquidationThreshold:W})}return{healthFactor:Number(b),totalCollateral:l,totalDebt:u,reserves:g}}async hasBorrowPositions(t){let e=Le.fromAny(t),n=await this.client.getUserAccountData(e),[r,a]=n;return a>0n}async getHealthFactor(t){let e=Le.fromAny(t),n=await this.client.getUserAccountData(e),[r,a,s,i,o,l]=n,u=h.toDecimal(l,18);return Number(u)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:r,totalDebt:a,reserves:s}=await this.getSummary(t),i=de.fromAssetId(e),o=s.find(g=>g.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,isCollateral:u,priceInRef:p,reserveLiquidationThreshold:d}=o,m=h.toBigInt(n,l),y=u?m*p/10n**BigInt(l):0n,b=r-y;return b<=0n?0:this.calculateHealthFactor(b,d,a)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:a,reserves:s}=await this.getSummary(t),i=de.fromAssetId(e),o=s.find(b=>b.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,priceInRef:u,reserveLiquidationThreshold:p}=o,m=h.toBigInt(n,l)*u/10n**BigInt(l),y=r+m;return y<=0n?0:this.calculateHealthFactor(y,p,a)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:r,reserves:a}=await this.getSummary(t),s=de.fromAssetId(e),i=a.find(o=>o.reserveAsset===s);if(!i)throw new Error("Missing reserve ctx for "+s);return this.calculateWithdrawMax(i,n,r)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:r}=await this.getSummary(t),a={};for(let s of r){let i=this.calculateWithdrawMax(s,e,n);s.reserveId&&(a[s.reserveId]=i)}return a}calculateHealthFactor(t,e,n){if(n===0n)return xr;let r=10n**6n,a=h.toBigInt(e,18),s=t*a*r,i=n*vr,o=s/i;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let r=h.toBigInt(t,18),a=h.toBigInt(e,18);return(r*n+a-1n)/a}calculateWithdrawMax(t,e,n){let{aTokenBalance:r,decimals:a,priceInRef:s,reserveLiquidationThreshold:i}=t,o=this.calculateRequiredCollateral(wr,i,n),l=e-o;if(l<=0n)return{amount:0n,decimals:a};let u=l*10n**BigInt(a)/s;return{amount:r<u?r:u,decimals:a}}};var Ue={};x(Ue,{AssetClient:()=>ft,BalanceClient:()=>G,ChainParams:()=>St,LiquidityMining:()=>Tt});var ft=class extends C{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[a]=n;return[a,r]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,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[a]=n;return[a,r]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async mapToken(t,e,n,r){let{name:a,asset_type:s,is_sufficient:i,existential_deposit:o}=e,{symbol:l,decimals:u}=n.get(t)??{};return{id:t,name:a?.asText(),symbol:l,decimals:u,icon:l,type:s.type,isSufficient:i,location:r,existentialDeposit:o}}async mapBond(t,e,n,r){let[a,s]=r,{asset_type:i,is_sufficient:o,existential_deposit:l}=e,{symbol:u,decimals:p}=await this.mapToken(a,e,n),d=Number(s),m=new Intl.DateTimeFormat("en-GB"),y=[u,"Bond",m.format(d)].join(" ");return{id:t,name:y,symbol:u+"b",decimals:p,icon:u,type:i.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:a,maturity:d}}async mapShares(t,e,n,r){let{assets:a}=r,{name:s,symbol:i,asset_type:o,is_sufficient:l,existential_deposit:u}=e,p=await Promise.all(a.map(async y=>{let{symbol:b}=await this.mapToken(y,e,n);return[y,b]})),d=Object.fromEntries(p),m=Object.values(d);return{id:t,name:m.join(", "),symbol:i?.asText()||s?.asText(),decimals:18,icon:m.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:d}}async mapExternal(t,e,n,r){let a=await this.mapToken(t,e,new Map,r),s=n?.find(i=>i.internalId===a.id);return s?{...a,decimals:s.decimals,name:s.name,symbol:s.symbol,icon:s.symbol,isWhiteListed:s.isWhiteListed}:a}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,a,s]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),i=this.parseMetadata(n),o=[];for(let[l,u]of Array.from(n)){let p=r.get(l),{asset_type:d}=u,m;switch(d.type){case"Bond":let y=s.get(l);m=await this.mapBond(l,u,i,y);break;case"StableSwap":let b=a.get(l);m=await this.mapShares(l,u,i,b);break;case"External":m=await this.mapExternal(l,u,e,p);break;default:m=await this.mapToken(l,u,i,p)}o.push(m)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};var w=require("rxjs");var G=class extends C{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,w.combineLatest)([e,n,r]).pipe((0,w.debounceTime)(250),(0,w.map)(a=>a.flat()),(0,w.startWith)([]),(0,w.bufferCount)(2,1),(0,w.map)(([a,s],i)=>{if(i===0)return s;let o=a.reduce((u,p)=>(u.set(p.id,p.balance),u),new Map);return s.filter(u=>!On(u.balance,o.get(u.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,w.map)(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,w.map)(r=>({id:e,balance:r})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,w.distinctUntilChanged)((n,r)=>!r.deltas),(0,w.map)(({deltas:n})=>{let r=[];return n?.deleted.forEach(a=>{let[s,i]=a.args;r.push({id:i,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(a=>{let[s,i]=a.args;r.push({id:i,balance:this.calculateBalance(a.value)})}),r}))}subscribeErc20Balance(t,e){let n=new w.Subject,r=n.pipe((0,w.shareReplay)(1)),a=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:u}=l;return u.type==="Erc20"}).map(({keyArgs:l})=>{let[u]=l;return u}),s=async()=>{let o=e||await a(),l=async()=>{let d=(await Promise.all(o.map(async m=>{let y=await this.getTokenBalanceData(t,m);return[m,y]}))).map(([m,y])=>({id:m,balance:y}));n.next(d)};await l();let u=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>u.unsubscribe()},i;return s().then(o=>i=o),r.pipe((0,w.finalize)(()=>i?.()),(0,w.pairwise)(),(0,w.map)(([o,l],u)=>{if(u===0)return l;let p=o.reduce((m,y)=>(m.set(y.id,y.balance),m),new Map);return l.filter(m=>!On(m.balance,p.get(m.id)))}),(0,w.distinctUntilChanged)((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},On=(c,t)=>c!==void 0&&t!==void 0&&c.transferable===t.transferable&&c.total===t.total;var St=class extends C{_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 wt=require("polkadot-api"),Ve=require("@galacticcouncil/math-liquidity-mining"),D=ot(require("big.js"));var rt=ot(require("big.js")),X=require("@galacticcouncil/math-liquidity-mining"),Or="1000000000000000000",ge=class{constructor(t,e,n){this.get_account=t;this.multiCurrency=e;this.getAsset=n}async sync_global_farm(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),a=e-t.updated_at,s=this.get_account(t.id),i=r?.existential_deposit;if(!i)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.free_balance(t.reward_currency,s),l=(0,rt.default)(i.toString()),u=(0,rt.default)(o.toString()).minus(l.lt(o.toString())?i.toString():o.toString()),p=(0,rt.default)((0,X.calculate_global_farm_rewards)(t.total_shares_z.toString(),n.toString(),(0,rt.default)(t.yield_per_period.toString()).mul(Ne).round(0,rt.default.roundDown).toFixed(),t.max_reward_per_period.toString(),a.toFixed()));if(u.lt(p)&&(p=u),p.eq(0))return t;let d=this.get_account(0);return this.multiCurrency.transfer(t.reward_currency,s,d,BigInt(p.toFixed())),{...t,accumulated_rpz:BigInt((0,X.calculate_accumulated_rps)(t.accumulated_rpz.toString(),t.total_shares_z.toString(),p.toFixed()))}}sync_yield_farm(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,X.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}}get_loyalty_multiplier(t,e){let n=(0,rt.default)(1).mul(Ne).round(0,rt.default.roundDown).toString();if(!e)return n;let{initial_reward_percentage:r,scale_coef:a}=e;return(0,X.calculate_loyalty_multiplier)(t.toFixed(),r.toString(),a.toFixed())}async claim_rewards(t,e,n,r,a){if(e.state.type==="Terminated")return null;let s=Math.floor(r/t.blocks_per_period);if(n.updated_at===s)return null;let i=await this.sync_global_farm(t,s,a);if(!i)return null;let o=this.sync_yield_farm(e,i,s);if(!o)return null;let l=o.total_stopped-n.stopped_at_creation,u=o.updated_at-n.entered_at-l,p=this.get_loyalty_multiplier(u,o.loyalty_curve),d=BigInt((0,X.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),p)),m=BigInt((0,X.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),Or));return{reward:d,maxReward:m,assetId:i.reward_currency}}};var Ar=BigInt((0,D.default)(1).pow(18).toString()),_r=6,Tt=class extends C{balanceClient;omnipoolAssetIds=[];secondsInYear=(0,D.default)(365.2425).times(24).times(60).times(60);constructor(t){super(t),this.balanceClient=new G(t)}async getOraclePrice(t,e){let n=[t,e].sort((a,s)=>a-s);if(t===e)return Ar;let r=await this.api.query.EmaOracle.Oracles.getValue(wt.Binary.fromText("omnipool"),n,(0,wt.Enum)("TenMinutes"));if(r){let{n:a,d:s}=r[0].price,i;return t<e?i=(0,Ve.fixed_from_rational)(a.toString(),s.toString()):i=(0,Ve.fixed_from_rational)(s.toString(),a.toString()),BigInt(i)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),r=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),a=Buffer.from([t]),s=Buffer.concat([n,r,a]),o="0x"+Buffer.concat([s,Buffer.alloc(32-s.length)]).toString("hex");return(0,wt.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let a=(0,D.default)(r).times(t.toString()).times(e.toString()).div(18);return a.gte(n.toString())?n.toString():a.toString()}getPoolYieldPerPeriod(t,e,n,r){let a=(0,D.default)(t.toString()).times(e),s=(0,D.default)(n.toString()).times(r);return a.div(s.toString()).toString()}farmData(t,e,n){let{yieldFarm:r,globalFarm:a,priceAdjustment:s,balance:i}=t,{multiplier:o,loyalty_curve:l}=r,{blocks_per_period:u,yield_per_period:p,total_shares_z:d,max_reward_per_period:m,pending_rewards:y,accumulated_paid_rewards:b,planned_yielding_periods:g,updated_at:P,incentivized_asset:f,reward_currency:S,price_adjustment:v}=a,L=Nt(s??v,18),N=Nt(o,18),M=Nt(l?.initial_reward_percentage??0,18),U=this.secondsInYear.div((0,D.default)(_r).times(u)).toString(),W;if(d<0)W=(0,D.default)(N).times(p.toString()).times(U).toString();else{let Jn=this.getGlobalRewardPerPeriod(d,p,m,L),Zn=this.getPoolYieldPerPeriod(Jn,N,d,L);W=(0,D.default)(Zn).times(U).toString()}let tt=y+b,Ct=m*BigInt(g),st=i.transferable+tt,we=st-tt,kt=(0,D.default)(we.toString()).div(m.toString()),mn=(0,D.default)(e).div(u.toString()).toString(),jn=(d>=0?kt.plus(P):kt.plus(mn)).toString(),Qn=(0,D.default)(d.toString()).div((0,D.default)(m.toString()).div(p.toString())).div(Math.pow(10,18)).times(100).times(L).toFixed(2),dn=(0,D.default)(tt.toString()).div(st.toString()).gte(.999);W=dn?"0":(0,D.default)(W).div(n?2:1).times(100).toString();let $n=M?(0,D.default)(W).times(M).toString():void 0;return{apr:W,minApr:$n,isDistributed:dn,estimatedEndPeriod:jn,maxRewards:Ct,incentivizedAsset:f,rewardCurrency:S,loyaltyCurve:l,currentPeriod:mn,potMaxRewards:st,fullness:Qn}}async getOmnipoolFarms(t){let e=await this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(Number(t)),r=(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number,a=await Promise.all(e.map(async({keyArgs:s,value:i})=>{let[,o]=s,l=i,u=await this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(o),p=await this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(Number(t),o,l);if(!u||!p)return;let d=u.reward_currency,m=u.incentivized_asset,y=this.getFarmAddress(o),b=await this.getOraclePrice(d,m),g=await this.balanceClient.getTokenBalance(y,d);return{id:t,globalFarm:u,yieldFarm:p,priceAdjustment:b,balance:g}}));return r?a.map(s=>s?this.farmData(s,r):void 0):[]}async getIsolatedFarms(t){let e=await this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t),r=(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number,a=await Promise.all(e.map(async({keyArgs:s,value:i})=>{let[,o]=s,l=i,u=await this.api.query.XYKWarehouseLM.GlobalFarm.getValue(o),p=await this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,o,l);if(!u||!p)return;let d=u.reward_currency,m=u.incentivized_asset,y=this.getFarmAddress(o,!0),b=await this.getOraclePrice(d,m),g=await this.balanceClient.getBalance(y,d);return{id:t,globalFarm:u,yieldFarm:p,priceAdjustment:b,balance:g,farmAddress:y}}));return r?a.map(s=>s?this.farmData(s,r,!0):void 0):[]}async getDepositReward(t,e,n,r){let a=e.global_farm_id,s=e.yield_farm_id,i=n?await this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,a,s):await this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(Number(t),a,s),o=n?await this.api.query.XYKWarehouseLM.GlobalFarm.getValue(a):await this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(a);if(!o||!i)return;let l=o.reward_currency,u=o.incentivized_asset,p=[[this.getFarmAddress(0,n),o.reward_currency],[this.getFarmAddress(o.id,n),o.reward_currency]],d=await Br(this.api,p)(),m=await this.getOraclePrice(l,u),y=new He(p,d),g=await new ge(f=>this.getFarmAddress(f),y,f=>this.api.query.AssetRegistry.Assets.getValue(f)).claim_rewards(o,i,e,r,m??o.price_adjustment);if(!g)return;let P=await this.api.query.AssetRegistry.Assets.getValue(g.assetId);if(P&&!(g.reward<=P.existential_deposit))return g}},Ne=(0,D.default)(10).pow(18),Ge="0",Br=(c,t)=>async()=>{let[e,n]=await Promise.all([c.query.Tokens.Accounts.getValues(t.filter(([a,s])=>s.toString()!==Ge)),c.query.System.Account.getValues(t.filter(([a,s])=>s.toString()===Ge).map(([a])=>[a]))]),r=[];for(let a=0,s=0;a+s<t.length;){let i=a+s,[,o]=t[i];o.toString()===Ge?(r.push({assetId:o.toString(),free:n[s].data.free,reserved:n[s].data.reserved,frozen:n[s].data.frozen}),s+=1):(r.push({assetId:o.toString(),free:e[a].free,reserved:e[a].reserved,frozen:e[a].frozen}),a+=1)}return r},He=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,a]=t[n];this.result.set(this.getKey(a,r),e[n].free)}}free_balance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,n,r){let a=this.getKey(t,e),s=this.getKey(t,n),i=this.result.get(a)??0n,o=this.result.get(s)??0n;if(i<r)throw new Error("Attempting to transfer more than is present");this.result.set(a,i+r),this.result.set(s,o+r)}};var Ye={};x(Ye,{AssetNotFound:()=>We,PoolNotFound:()=>Vt,RouteNotFound:()=>Ht});var We=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},Vt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},Ht=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var Ke={};x(Ke,{EvmClient:()=>Ut,createChain:()=>Xe});var An=require("viem"),Rr=["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"],Xe=()=>(0,An.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Rr}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});var j=require("viem");var Ut=class{client;chain;constructor(t){this.client=t,this.chain=Xe()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return(0,j.createPublicClient)({chain:this.chain,transport:(0,j.http)()})}getWsProvider(){return(0,j.createPublicClient)({transport:(0,j.custom)({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return(0,j.createWalletClient)({account:t,chain:this.chain,transport:(0,j.custom)(window.ethereum)})}};var tn={};x(tn,{PoolContextProvider:()=>At,PoolError:()=>ct,PoolFactory:()=>Ot,PoolType:()=>F,aave:()=>Ze,lbp:()=>je,omni:()=>Qe,stable:()=>$e,xyk:()=>Je});var je={};x(je,{LbpMath:()=>K,LbpPool:()=>Wt,LbpPoolClient:()=>Xt});var Q=require("@galacticcouncil/math-lbp"),K=class{static getSpotPrice(t,e,n,r,a){return(0,Q.get_spot_price)(t,e,n,r,a)}static calculateInGivenOut(t,e,n,r,a){return(0,Q.calculate_in_given_out)(t,e,n,r,a)}static calculateOutGivenIn(t,e,n,r,a){return(0,Q.calculate_out_given_in)(t,e,n,r,a)}static calculateLinearWeights(t,e,n,r,a){return(0,Q.calculate_linear_weights)(t,e,n,r,a)}static calculatePoolTradeFee(t,e,n){return(0,Q.calculate_pool_trade_fee)(t,e,n)}};var F=(a=>(a.Aave="Aave",a.LBP="LBP",a.Omni="Omnipool",a.Stable="Stableswap",a.XYK="XYK",a))(F||{}),ct=(a=>(a.InsufficientTradingAmount="InsufficientTradingAmount",a.MaxInRatioExceeded="MaxInRatioExceeded",a.MaxOutRatioExceeded="MaxOutRatioExceeded",a.TradeNotAllowed="TradeNotAllowed",a.UnknownError="UnknownError",a))(ct||{});var{FeeUtils:_n}=k,Wt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,r,a,s,i){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.fee=s,this.repayFeeApply=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,weightIn:r.weight,weightOut:a.weight}}validateAndBuy(t,e,n){let r=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let s=t.balanceOut/this.maxOutRatio;if(e>s&&a.push("MaxOutRatioExceeded"),r===t.assetOut){let i=this.calculateTradeFee(e,n),o=_n.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+i,u=this.calculateInGivenOut(t,l),p=t.balanceIn/this.maxInRatio;return u>p&&a.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:a}}else{let i=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return i>o&&a.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:i,amountOut:e,feePct:0,errors:a}}}validateAndSell(t,e,n){let r=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let s=t.balanceIn/this.maxInRatio;if(e>s&&a.push("MaxInRatioExceeded"),r===t.assetIn){let i=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return i>o&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:i,feePct:0,errors:a}}else{let i=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(i,n),l=_n.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),u=i-o,p=t.balanceOut/this.maxOutRatio;return u>p&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:u,feePct:l,errors:a}}}calculateInGivenOut(t,e){let n=K.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=K.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=K.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=K.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=K.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};var Rn=require("polkadot-api"),pt=require("rxjs");var Bn=(c,t=new Map)=>e=>{let n;return t.has(e)?t.get(e):(t.set(e,n=c(e)),n)};var I=require("rxjs");var ze=[{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 Yt=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,r,a]=await Promise.all([this.client.readContract({abi:ze,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:ze,address:t,functionName:"decimals"}),this.client.getBlock()]),[s,i,o,l]=n,u=a.number-(a.timestamp-l)/BigInt(e),p=Number(u);return{price:i,decimals:r,updatedAt:p<0?0:p}}};var V=class extends G{evm;mmOracle;override=[];mem=0;memPools=Bn(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new Yt(e)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=(0,I.from)(this.getPoolsMem()).pipe((0,I.switchMap)(e=>this.subscribe(e)),(0,I.combineLatestAll)());return(0,I.firstValueFrom)(t)}getSubscriber(){return(0,I.from)(this.getPoolsMem()).pipe((0,I.switchMap)(t=>this.subscribe(t)),(0,I.mergeAll)())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>(0,I.combineLatest)([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe((0,I.debounceTime)(250),(0,I.map)(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return(0,I.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(a=>a.type==="Erc20").map(a=>a.id),r=this.subscribeErc20Balance(t.address,n);e.push(r)}return(0,I.combineLatest)(e).pipe((0,I.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 a=this.override.find(i=>i.id===e),s=!!n||!!a?.decimals;return r>0n&&s})}updatePool=(t,e)=>{let n=t.tokens.map(r=>{let a=e.find(i=>i.id===r.id),s=this.override.find(i=>i.id===r.id);return a?{...r,balance:a.balance.transferable,decimals:r.decimals||s?.decimals}:{...r,decimals:r.decimals||s?.decimals}});return{...t,tokens:n}}};var Xt=class extends V{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,a=t.filter(({value:s})=>e&&this.isActivePool(s,r)).map(async({keyArgs:s,value:i})=>{let[o]=s,l=o.toString(),u=await this.getPoolDelta(l,i,r);return{address:l,type:"LBP",fee:i.fee,...u,...n}});return Promise.all(a)}async getPoolDelta(t,e,n){let{start:r,end:a,assets:s,initial_weight:i,final_weight:o,repay_target:l,fee_collector:u}=e,p=K.calculateLinearWeights(r?r.toString():"0",a?a.toString():"0",i.toString(),o.toString(),n.toString()),[d,m]=s,y=BigInt(p),b=this.MAX_FINAL_WEIGHT-BigInt(y),[g,P,f,S,v]=await Promise.all([this.isRepayFeeApplied(d,l,u.toString()),this.getBalance(t,d),this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(t,m),this.api.query.AssetRegistry.Assets.getValue(m)]);return{repayFeeApply:g,tokens:[{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:P.transferable,weight:y,type:f?.asset_type.type},{id:m,decimals:v?.decimals,existentialDeposit:v?.existential_deposit,balance:S.transferable,weight:b,type:v?.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(Rn.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,pt.switchMap)(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):(0,pt.of)(t)),(0,pt.map)(r=>Object.assign({},t,r))):(0,pt.of)(t)}};var Qe={};x(Qe,{OmniMath:()=>A,OmniPool:()=>Kt,OmniPoolClient:()=>jt});var T=require("@galacticcouncil/math-omnipool"),mt=ot(require("big.js")),A=class{static calculateSpotPrice(t,e,n,r){return(0,T.calculate_spot_price)(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return(0,T.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,r,a,s,i,o,l){return(0,T.calculate_in_given_out)(t,e,n,r,a,s,i,o,l)}static calculateLrnaInGivenOut(t,e,n,r,a){return(0,T.calculate_lrna_in_given_out)(t,e,n,r,a)}static calculateOutGivenIn(t,e,n,r,a,s,i,o,l){return(0,T.calculate_out_given_in)(t,e,n,r,a,s,i,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,a){return(0,T.calculate_out_given_lrna_in)(t,e,n,r,a)}static calculateShares(t,e,n,r){return(0,T.calculate_shares)(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,a,s,i,o){return(0,T.calculate_liquidity_out)(t,e,n,r,a,s,i,o)}static calculateLiquidityLRNAOut(t,e,n,r,a,s,i,o){return(0,T.calculate_liquidity_lrna_out)(t,e,n,r,a,s,i,o)}static calculateCapDifference(t,e,n,r){let a=(0,mt.default)(e),s=(0,mt.default)(t),i=(0,mt.default)(r),o=(0,mt.default)(n),l=(0,mt.default)(10).pow(18),u=o.div(l);if(a.div(i).lt(u)){let d=u.times(i).minus(a).times(s),m=a.times((0,mt.default)(1).minus(u));return d.div(m).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return(0,T.verify_asset_cap)(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return(0,T.calculate_liquidity_hub_in)(t,e,n,r)}static isSellAllowed(t){return(0,T.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,T.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,T.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,T.is_remove_liquidity_allowed)(t)}};var{FeeUtils:xt}=k,Kt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,r,a,s){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.hubAssetId=s}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:r.hubReserves,hubReservesOut:a.hubReserves,sharesIn:r.shares,sharesOut:a.shares,decimalsIn:r.decimals,decimalsOut:a.decimals,balanceIn:r.balance,balanceOut:a.balance,tradeableIn:r.tradeable,tradeableOut:a.tradeable,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),s=r===0n?0:O.calculateDiffToRef(a,r),i=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&i.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&i.push("MaxOutRatioExceeded");let p=t.balanceIn/this.maxInRatio;return a>p&&i.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:s,errors:i}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),s=O.calculateDiffToRef(r,a),i=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&i.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&i.push("MaxInRatioExceeded");let p=t.balanceOut/this.maxOutRatio;return a>p&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:s,errors:i}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let r=A.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?xt.toRaw(n.assetFee).toString():"0",n?xt.toRaw(n.protocolFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateLrnaInGivenOut(t,e,n){let r=A.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?xt.toRaw(n.assetFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let r=A.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?xt.toRaw(n.assetFee).toString():"0",n?xt.toRaw(n.protocolFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateOutGivenLrnaIn(t,e,n){let r=A.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?xt.toRaw(n.assetFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=A.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=A.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=A.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=A.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var ye=require("polkadot-api"),Fn=require("@polkadot-api/utils"),zt=require("rxjs");var{FeeUtils:at}=k,jt=class extends V{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,r,a,s,i]=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:u,value:p})=>{let[d]=u,{hub_reserve:m,shares:y,tradable:b,cap:g,protocol_shares:P}=p,[f,S]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:S.transferable,cap:g,hubReserves:m,protocolShares:P,shares:y,tradeable:b,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:s.transferable,tradeable:r,type:a?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...i}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=(0,Fn.toHex)(e);return(0,ye.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,a]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),s=n.min_fee+r.min_fee,i=n.max_fee+r.max_fee;if(a){let{asset_fee:o,protocol_fee:l}=a;return{assetFee:at.fromPermill(o),protocolFee:at.fromPermill(l),min:at.fromPermill(s),max:at.fromPermill(i)}}else return{assetFee:at.fromPermill(n.min_fee),protocolFee:at.fromPermill(r.min_fee),min:at.fromPermill(s),max:at.fromPermill(i)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(ye.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,zt.distinctUntilChanged)((n,r)=>!r.deltas),(0,zt.map)(({entries:n})=>n.map(r=>{let[a]=r.args,{hub_reserve:s,shares:i,tradable:o,cap:l,protocol_shares:u}=r.value,p=t.tokens.findIndex(m=>m.id===a);return{...t.tokens[p],cap:l,hubReserves:s,protocolShares:u,shares:i,tradeable:o}})),(0,zt.map)(n=>{let r=t.tokens.find(a=>a.id===1);return{...t,tokens:[...n,r]}}))}};var $e={};x($e,{StableMath:()=>E,StableSwap:()=>Qt,StableSwapClient:()=>$t});var B=require("@galacticcouncil/math-stableswap"),E=class{static getPoolAddress(t){return(0,B.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,a){return(0,B.calculate_amplification)(t,e,n,r,a)}static calculateInGivenOut(t,e,n,r,a,s,i){return(0,B.calculate_in_given_out)(t,e,n,r,a,s,i)}static calculateAddOneAsset(t,e,n,r,a,s,i){return(0,B.calculate_add_one_asset)(t,e,n,r,a,s,i)}static calculateSharesForAmount(t,e,n,r,a,s,i){return(0,B.calculate_shares_for_amount)(t,e,n,r,a,s,i)}static calculateOutGivenIn(t,e,n,r,a,s,i){return(0,B.calculate_out_given_in)(t,e,n,r,a,s,i)}static calculateLiquidityOutOneAsset(t,e,n,r,a,s,i){return(0,B.calculate_liquidity_out_one_asset)(t,e,n,r,a,s,i)}static calculateShares(t,e,n,r,a,s){return(0,B.calculate_shares)(t,e,n,r,a,s)}static calculateSpotPriceWithFee(t,e,n,r,a,s,i,o){return(0,B.calculate_spot_price_with_fee)(t,e,n,r,a,s,i,o)}static recalculatePegs(t,e,n,r,a){let s=(0,B.recalculate_peg)(t,e,n,r,a);return JSON.parse(s)}};var{FeeUtils:it}=k,Qt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.id,t.fee,t.totalIssuance)}constructor(t,e,n,r,a,s,i,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.amplification=s,this.id=i,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,tradeableIn:this.id===t?15:r.tradeable,tradeableOut:this.id===e?15:a.tradeable,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),s=it.toPct(n.fee),i=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&i.push("InsufficientTradingAmount"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:s,errors:i}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),s=it.toPct(n.fee),i=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&i.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:s,errors:i}}calculateIn(t,e,n){let r=E.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateAddOneAsset(t,e,n){let r=E.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateSharesForAmount(t,e,n){let r=E.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}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=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=E.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateWithdrawOneAsset(t,e,n){let r=E.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateShares(t,e,n){let r=E.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?it.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}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=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=E.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,nt.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],nt.jsonFormatter)}};var be=require("polkadot-api"),En=require("@polkadot-api/utils"),Cn=require("@noble/hashes/blake2b"),It=require("rxjs");var{FeeUtils:dt}=k,$t=class extends V{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=E.getPoolAddress(t),n=(0,Cn.blake2b)(e,{dkLen:32}),r=(0,En.toHex)(n);return(0,be.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:a,initial_block:s,final_block:i}=e,o=E.calculateAmplification(r.toString(),a.toString(),s.toString(),i.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 a=>{let[s,i,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,a),this.api.query.AssetRegistry.Assets.getValue(a),this.getBalance(n,a)]);return{id:a,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:o.transferable,tradeable:s,type:i?.asset_type.type}});return Promise.all(r)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(be.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:a,value:s})=>{let[i]=a,o=this.getPoolAddress(i),[l,u,p]=await Promise.all([this.getPoolDelta(i,s,e),this.getPoolTokens(i,s),this.getPoolPegs(i,s,e)]);return u.push({id:i,tradeable:15,balance:l.totalIssuance,decimals:18}),this.poolsData.set(o,s),{address:o,id:i,type:"Stableswap",fee:dt.fromPermill(s.fee),tokens:u,...l,...p,...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 a=await this.getLatestPegs(e,r,n),s=this.getRecentPegs(r),i=dt.fromPermill(r.max_peg_update),o=dt.fromPermill(e.fee),[l,u]=E.recalculatePegs(JSON.stringify(s),JSON.stringify(a),n.toString(),dt.toRaw(i).toString(),dt.toRaw(o).toString()),p=Number(l)*1e6;return{pegsFee:dt.fromPermill(p),pegs:u}}getDefaultPegs(t){let e=t.fee,n=E.defaultPegs(t.assets.length);return{pegsFee:dt.fromPermill(e),pegs:n}}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,r])=>r.map(a=>a.toString()))}async getLatestPegs(t,e,n){let{source:r}=e,a=Array.from(t.assets.entries()).map(([i,o])=>o),s=r.map(async(i,o)=>{if(i.type==="Oracle"){let[l,u,p]=i.value,d=[p,a[o]].sort((f,S)=>f-S),m=await this.api.query.EmaOracle.Oracles.getValue(l,d,u);if(!m)return;let[{price:y,updated_at:b}]=m,g=y.n.toString(),P=y.d.toString();return p.toString()===d[0].toString()?[[g,P],b.toString()]:[[P,g],b.toString()]}else if(i.type==="MMOracle"){let l=i.value.asHex(),{price:u,decimals:p,updatedAt:d}=await this.mmOracle.getData(l),m=10**p;return[[u.toString(),m.toString()],d.toString()]}else return[i.value.map(l=>l.toString()),n.toString()]});return Promise.all(s)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?(0,It.of)(t):e.watchValue("best").pipe((0,It.switchMap)(r=>Promise.all([this.getPoolDelta(t.id,n,r),this.getPoolPegs(t.id,n,r)])),(0,It.map)(([r,a])=>{let s=t.tokens.map(i=>i.id===t.id?{...i,balance:r.totalIssuance}:i);return Object.assign(t,{tokens:s},r,a)}))}};var Je={};x(Je,{XykMath:()=>Z,XykPool:()=>Jt,XykPoolClient:()=>Zt});var R=require("@galacticcouncil/math-xyk"),Z=class{static getSpotPrice(t,e,n){return(0,R.get_spot_price)(t,e,n)}static calculateInGivenOut(t,e,n){return(0,R.calculate_in_given_out)(t,e,n)}static calculateOutGivenIn(t,e,n){return(0,R.calculate_out_given_in)(t,e,n)}static calculatePoolTradeFee(t,e,n){return(0,R.calculate_pool_trade_fee)(t,e,n)}static calculateLiquidityIn(t,e,n){return(0,R.calculate_liquidity_in)(t,e,n)}static calculateSpotPrice(t,e){return(0,R.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return(0,R.calculate_spot_price_with_fee)(t,e,n,r)}static calculateShares(t,e,n){return(0,R.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return(0,R.calculate_liquidity_out_asset_a)(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return(0,R.calculate_liquidity_out_asset_b)(t,e,n,r)}};var{FeeUtils:kn}=k,Jt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,a){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:r.decimals,decimalsOut:a.decimals,balanceIn:r.balance,balanceOut:a.balance,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateTradeFee(r,n),s=kn.toPct(n.exchangeFee),i=r+a,o=[];(e<this.minTradingLimit||r<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return i>u&&o.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:r,amountOut:e,feePct:s,errors:o}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateTradeFee(r,n),s=kn.toPct(n.exchangeFee),i=r-a,o=[];(e<this.minTradingLimit||r<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return i>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:i,feePct:s,errors:o}}calculateInGivenOut(t,e){let n=Z.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=Z.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=Z.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=Z.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=Z.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};var Dn=require("polkadot-api"),Mn=require("rxjs");var Zt=class extends V{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),r=e.map(async({keyArgs:a,value:s})=>{let[i]=a,[o,l]=s,[u,p,d,m]=await Promise.all([this.getBalance(i,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(i,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:i,type:"XYK",tokens:[{id:o,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:u.transferable,type:p?.asset_type.type},{id:l,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:d.transferable,type:m?.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(Dn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,Mn.of)(t)}};var Ze={};x(Ze,{AavePool:()=>te,AavePoolClient:()=>ee});var te=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,a){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=[];return e>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:a}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=[];return r>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:a}}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 qn=require("polkadot-api"),Nn=require("@polkadot-api/utils"),vt=require("rxjs"),Gn=require("viem");var Ln=[{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:Fr}=lt,Er=["Supply","Withdraw","Repay","Borrow"],ee=class extends V{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:r,liqudity_in:a,liqudity_out:s})=>{let[i,o,l,u]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(r),this.api.query.AssetRegistry.AssetLocations.getValue(r)]);return{address:this.getPoolId(n,r),type:"Aave",tokens:[{id:n,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:a,location:o,type:i?.asset_type.type},{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:s,location:u,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:r,liqudity_out:a}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(s=>{let i=s.id===e.id?r:a;return{...s,balance:i}})}getPoolId(t,e){let n=t+"/"+e,r=new TextEncoder().encode(n.padEnd(32,"\0")),a=(0,Nn.toHex)(r);return(0,qn.AccountId)(63).dec(a)}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),a=this.api.event.Router.Executed.watch(({asset_in:i,asset_out:o})=>i===n.id||o===n.id),s=this.api.event.EVM.Log.watch(({log:i})=>{let{topics:o,data:l}=i,u=o.map(y=>y.asHex()),p=l.asHex(),{eventName:d,args:m}=(0,Gn.decodeEventLog)({abi:Ln,topics:u,data:p});return Er.includes(d)&&m.reserve.toLowerCase()===r.toLowerCase()});return(0,vt.merge)([a,s]).pipe((0,vt.switchMap)(()=>this.getPoolDelta(t)),(0,vt.map)(i=>({...t,tokens:[...i]})))}getReserveH160Id(t){return t.type==="Erc20"?nt.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Fr.fromAssetId(t.id)}};var Ot=class{static get(t){switch(t.type){case"Aave":return te.fromPool(t);case"XYK":return Jt.fromPool(t);case"Omnipool":return Kt.fromPool(t);case"LBP":return Wt.fromPool(t);case"Stableswap":return Qt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var $=require("rxjs");var At=class extends C{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=$.Subscription.EMPTY;omniSub=$.Subscription.EMPTY;stableSub=$.Subscription.EMPTY;xykSub=$.Subscription.EMPTY;aaveSub=$.Subscription.EMPTY;isReady=!1;isDestroyed=new $.Subject;constructor(t,e){super(t),this.evm=e,this.lbpClient=new Xt(t,e),this.omniClient=new jt(t,e),this.stableClient=new $t(t,e),this.xykClient=new Zt(t,e),this.aaveClient=new ee(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe((0,$.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),a=new Set(n),s=async i=>{let o=i.getPoolType();return r.size>0?r.has(o):a.size>0?!a.has(o):i.isSupported()};return this.getFilteredPools(s)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((a,s)=>e[s]);return(await Promise.all(n.map(a=>a.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 Vt(t.type)}};var ln={};x(ln,{DEFAULT_BLOCK_TIME:()=>Hn,DEFAULT_MIN_BUDGET:()=>rn,ORDER_MIN_BLOCK_PERIOD:()=>Un,Router:()=>_t,TWAP_BLOCK_PERIOD:()=>ie,TWAP_MAX_DURATION:()=>sn,TWAP_MAX_PRICE_IMPACT:()=>an,TWAP_TX_MULTIPLIER:()=>jl,TradeOrderError:()=>nn,TradeOrderType:()=>Pe,TradeRouteBuilder:()=>H,TradeRouter:()=>Bt,TradeScheduler:()=>Rt,TradeType:()=>he});var ne=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 Cr=8,re=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=[],a=new ne,s=[];for(s.push([e,""]),a.enqueue(s);a.size()>0;){let i=a.dequeue();if(!i||i.length>Cr)continue;let o=i[i.length-1];(n===null||o[0]===n)&&r.push(i),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,i)){let p=[...i];p.push(u),a.enqueue(p)}})}return r}findShortestPaths(t,e,n){let r=[],a=new ne,s=[];s.push([e,""]),a.enqueue(s);let i=1/0;for(;a.size()>0;){let o=a.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<i?(i=o.length,r.length=0,r.push(o)):o.length===i&&r.push(o);continue}let u=t.get(l[0]);for(let p of u??[])this.isNotVisited(p,o)&&a.enqueue([...o,p])}return r}buildAndPopulateGraph(t,e){let n=new Map;for(let r of t)n.set(parseInt(r),[]);for(let[r,a,s]of e)n.get(a)?.push([s,r]);return n}};function en(c){let t={};for(let e of c){let n=e.tokens.length;for(let r=0;r<n;r++){t[e.tokens[r].id]||(t[e.tokens[r].id]=[]);for(let a=0;a<n;a++){if(r==a)continue;let s=[e.address,e.tokens[r].id,e.tokens[a].id];t[e.tokens[r].id].push(s)}}}return t}var ae=class{getProposals(t,e,n){let r=n.filter(g=>g.type==="XYK"),a=n.filter(g=>g.type!=="XYK"),s=new Set(a.map(g=>g.tokens).flat().map(g=>g.id)),i=s.has(t),o=s.has(e),l=new re,u=g=>{let P=en(g),f=Object.keys(P),S=f.flatMap(v=>P[v]);return l.buildAndPopulateGraph(f,S)};if(!i&&!o){let g=r.filter(S=>S.tokens.find(v=>v.id===t)||S.tokens.find(v=>v.id===e)),P=u(g),f=l.findPaths(P,t,e);return this.parsePaths(f)}if(i&&o){let g=u(a),P=l.findPaths(g,t,e);return this.parsePaths(P)}let p=i?e:t,d=r.filter(g=>g.tokens.some(P=>P.id===p));if(d.length===0)return[];let m=[...a,...d],y=u(m),b=l.findPaths(y,t,e);return this.parsePaths(b)}parsePaths(t){let e=[];for(let n of t){let r=[];for(let a=0;a<n.length;a++){let s=n[a],i=n[a+1];if(i==null)break;r.push(this.toEdge(s,i))}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 ae,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(s=>this.validPath(s,r)).map(s=>this.toHops(s,r))}getProposals(t,e,n){let r=this.buildRouteKey(t,e,n);if(this.routeProposals.has(r))return this.routeProposals.get(r);let a=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(r,a),a}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,Ot.get(e)]))}toHops(t,e){return t.map(([n,r,a])=>{let s=e.get(n);return{poolAddress:n,poolId:s?.id,pool:s?.type,assetIn:r,assetOut:a}})}};var he=(e=>(e.Buy="Buy",e.Sell="Sell",e))(he||{}),Pe=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(Pe||{}),nn=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(nn||{});var{FeeUtils:Vn}=k,Bt=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),a=super.getPaths(t,e,n);if(!a.length)throw new Ht(t,e);return{paths:a,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 a=n[n.length-1].amountOut,s=r[r.length-1].amountOut;return a>s?-1:1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(a=>a.tradeFeeRange?.[0]??a.tradeFeePct).reduce((a,s)=>a+s),r=t.map(a=>a.tradeFeeRange?.[1]??a.tradeFeePct).reduce((a,s)=>a+s);return[n,r]}}getPoolFeeRange(t){let e=t.min?Vn.toPct(t.min):void 0,n=t.max?Vn.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(i=>i.assetOutDecimals).reduce((i,o)=>i+o),r=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),a=n-e.assetOutDecimals,s=Math.pow(10,a);return r/BigInt(s)}async getSell(t,e,n,r){return this.withCtx(t,e,async({paths:a,poolsMap:s})=>{let i;if(r)i=await this.toSellSwaps(n,r,s);else{let o=a.map(u=>this.toSellSwaps(n,u,s)),l=await Promise.all(o);i=this.findBestSellRoute(l)}return this.buildSell(s,i)})}buildSell(t,e){let n=e[0],r=e[e.length-1],a=this.isDirectTrade(e),s=this.getSellSpot(e),i=r.amountOut,o=a?r.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-i,u=this.getRouteFeeRange(e),p=a?r.tradeFeePct:O.calculateSellFee(o,i),d=Math.pow(10,n.assetInDecimals),m=n.amountIn*s/BigInt(d),y=O.calculateDiffToRef(o,m);return{type:"Sell",amountIn:n.amountIn,amountOut:r.amountOut,spotPrice:s,tradeFee:l,tradeFeePct:p,tradeFeeRange:u,priceImpactPct:y,swaps:e,toHuman(){return{type:"Sell",amountIn:h.toDecimal(n.amountIn,n.assetInDecimals),amountOut:h.toDecimal(r.amountOut,r.assetOutDecimals),spotPrice:h.toDecimal(s,r.assetOutDecimals),tradeFee:h.toDecimal(l,r.assetOutDecimals),tradeFeePct:p,tradeFeeRange:u,priceImpactPct:y,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0Y(t,e,n){let r=[];for(let a=0;a<e.length;a++){let s=e[a],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;a>0?l=r[a-1]:l=t;let u=i.calculateOutGivenIn(o,l);r.push(u)}return r[r.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:r,pools:a,poolsMap:s}=n,l=a.filter(b=>b.tokens.some(g=>g.id===t)).map(b=>b.type==="Aave"?b.tokens:b.tokens.filter(g=>g.id===t)).map(b=>b.map(g=>g.balance).reduce((g,P)=>g+P)).sort((b,g)=>g<b?-1:1)[0],u=O.getFraction(l,.1),p=await Promise.all(r.map(b=>this.toSellSwaps(u,b,s))),m=this.findBestSellRoute(p).map(b=>({poolAddress:b.poolAddress,poolId:b?.poolId,pool:b.pool,assetIn:b.assetIn,assetOut:b.assetOut})),y=this.buildRouteKey(t,e,a);return this.mlr.set(y,m),m}async toSellSwaps(t,e,n){let r=[];for(let a=0;a<e.length;a++){let s=e[a],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;a>0?l=r[a-1].amountOut:l=typeof t=="string"?h.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(i,o.assetOut),{amountOut:p,calculatedOut:d,feePct:m,errors:y}=i.validateAndSell(o,l,u),b=this.getPoolFeeRange(u),g=i.spotPriceOutGivenIn(o),P=Math.pow(10,o.decimalsIn),f=l*g/BigInt(P),S=O.calculateDiffToRef(d,f);r.push({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:p,calculatedOut:d,spotPrice:g,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:y,isSupply(){return i.type==="Aave"&&i.tokens[0].id===s.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===s.assetIn},toHuman(){return{...s,amountIn:h.toDecimal(l,o.decimalsIn),amountOut:h.toDecimal(p,o.decimalsOut),calculatedOut:h.toDecimal(d,o.decimalsOut),spotPrice:h.toDecimal(g,o.decimalsOut),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:y}}})}return r}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let r=this.buildRouteKey(t,e,n.pools),a=this.mlr.get(r);return a||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:r,poolsMap:a}=n,s=this.buildRouteKey(t,e,r),i=this.mlr.get(s);i||(i=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",i,a),l=this.getSellSpot(o),u=o[o.length-1].assetOutDecimals;return{amount:l,decimals:u}})}findBestBuyRoute(t){let e=t.sort((n,r)=>{let a=n[0].amountIn,s=r[0].amountIn;return a>s?1:-1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(i=>i.assetInDecimals).reduce((i,o)=>i+o),r=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),a=n-e.assetInDecimals,s=Math.pow(10,a);return r/BigInt(s)}async getBuy(t,e,n,r){return this.withCtx(t,e,async({paths:a,poolsMap:s})=>{let i;if(r)i=await this.toBuySwaps(n,r,s);else{let o=a.map(u=>this.toBuySwaps(n,u,s)),l=await Promise.all(o);i=this.findBestBuyRoute(l)}return this.buildBuy(s,i)})}buildBuy(t,e){let n=e[e.length-1],r=e[0],a=this.isDirectTrade(e),s=this.getBuySpot(e),i=r.amountIn,o=a?r.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=i-o,u=this.getRouteFeeRange(e),p=a?r.tradeFeePct:O.calculateBuyFee(o,i),d=Math.pow(10,n.assetOutDecimals),m=n.amountOut*s/BigInt(d),y;return o===0n?y=-100:y=O.calculateDiffToRef(m,o),{type:"Buy",amountOut:n.amountOut,amountIn:r.amountIn,spotPrice:s,tradeFee:l,tradeFeePct:p,tradeFeeRange:u,priceImpactPct:y,swaps:e,toHuman(){return{type:"Buy",amountOut:h.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:h.toDecimal(r.amountIn,r.assetInDecimals),spotPrice:h.toDecimal(s,r.assetInDecimals),tradeFee:h.toDecimal(l,r.assetInDecimals),tradeFeePct:p,tradeFeeRange:u,priceImpactPct:y,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0X(t,e,n){let r=[];for(let a=e.length-1;a>=0;a--){let s=e[a],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;a==e.length-1?l=t:l=r[0];let u=i.calculateInGivenOut(o,l);r.unshift(u)}return r[0]}async toBuySwaps(t,e,n){let r=[];for(let a=e.length-1;a>=0;a--){let s=e[a],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;a==e.length-1?l=typeof t=="string"?h.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let u=await this.ctx.getPoolFees(i,o.assetOut),{amountIn:p,calculatedIn:d,feePct:m,errors:y}=i.validateAndBuy(o,l,u),b=this.getPoolFeeRange(u),g=i.spotPriceInGivenOut(o),P=Math.pow(10,o.decimalsOut),f=l*g/BigInt(P),S;d===0n?S=-100:S=O.calculateDiffToRef(f,d),r.unshift({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:p,calculatedIn:d,spotPrice:g,tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:y,isSupply(){return i.type==="Aave"&&i.tokens[0].id===s.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===s.assetIn},toHuman(){return{...s,amountOut:h.toDecimal(l,o.decimalsOut),amountIn:h.toDecimal(p,o.decimalsIn),calculatedIn:h.toDecimal(d,o.decimalsIn),spotPrice:h.toDecimal(g,o.decimalsIn),tradeFeePct:m,tradeFeeRange:b,priceImpactPct:S,errors:y}}})}return r}};var Hn=6e3,rn=1000000000000000n,ie=6,an=-5,sn=216e5,jl=3,Un=6;var on=require("polkadot-api");var H=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:a})=>r==="Stableswap"?{pool:(0,on.Enum)("Stableswap",a),asset_in:e,asset_out:n}:{pool:(0,on.Enum)(r),asset_in:e,asset_out:n})}};var Rt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??rn})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,r,a){let[s,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:u}=i,p=l[0],d=l[l.length-1],{assetInDecimals:m}=p,{assetOutDecimals:y}=d,b=Math.abs(u),g=this.getMinimumTradeCount(o,s),P=this.getOptimalTradeCount(b),f=a?Math.round(r/a):P,S=Math.ceil(r/g),v=Math.round(r/P),L=Math.round(r/f),N=o/BigInt(f),M=await this.router.getBestSell(t,e,N),U=o<s,W=[];U&&W.push("OrderTooSmall");let tt=M.amountOut*BigInt(f),Ct=this.toBlockPeriod(L),st=M.tradeFee*BigInt(f),we=H.build(l),kt={assetIn:t,assetOut:e,errors:W,frequencyMin:S,frequencyOpt:v,frequency:L,tradeCount:f,tradeFee:st,tradeImpactPct:M.priceImpactPct,tradePeriod:Ct,tradeRoute:we,type:"Dca"};return{...kt,amountIn:o,amountOut:tt,tradeAmountIn:M.amountIn,tradeAmountOut:M.amountOut,toHuman(){return{...kt,amountIn:h.toDecimal(o,m),amountOut:h.toDecimal(tt,y),tradeAmountIn:h.toDecimal(M.amountIn,m),tradeAmountOut:h.toDecimal(M.amountOut,y)}}}}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,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:s,swaps:i,priceImpactPct:o}=a,l=i[0],u=i[i.length-1],{assetInDecimals:p}=l,{assetOutDecimals:d}=u,m=Math.abs(o),y=this.getTwapTradeCount(m),b=s/BigInt(y),g=await this.router.getBestSell(l.assetIn,u.assetOut,b),P=y===1,f=s<r,S=g.priceImpactPct<-5,v=[];f||P?v.push("OrderTooSmall"):S&&v.push("OrderImpactTooBig");let L=g.amountOut*BigInt(y),N=g.tradeFee*BigInt(y),M=H.build(i),U={assetIn:t,assetOut:e,errors:v,tradeCount:y,tradeImpactPct:g.priceImpactPct,tradePeriod:6,tradeRoute:M,type:"TwapSell"};return{...U,amountIn:s,amountOut:L,tradeAmountIn:g.amountIn,tradeAmountOut:g.amountOut,tradeFee:N,toHuman(){return{...U,amountIn:h.toDecimal(s,p),amountOut:h.toDecimal(L,d),tradeAmountIn:h.toDecimal(g.amountIn,p),tradeAmountOut:h.toDecimal(g.amountOut,d),tradeFee:h.toDecimal(N,d)}}}}async getTwapBuyOrder(t,e,n){let[r,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:s,swaps:i,priceImpactPct:o}=a,l=i[0],u=i[i.length-1],{assetInDecimals:p}=l,{assetOutDecimals:d}=u,m=Math.abs(o),y=this.getTwapTradeCount(m),b=s/BigInt(y),g=await this.router.getBestBuy(l.assetIn,u.assetOut,b),P=g.amountIn*BigInt(y),f=y===1,S=P<r,v=g.priceImpactPct<-5,L=[];S||f?L.push("OrderTooSmall"):v&&L.push("OrderImpactTooBig");let N=g.tradeFee*BigInt(y),M=H.build(i),U={assetIn:t,assetOut:e,errors:L,tradeCount:y,tradeImpactPct:g.priceImpactPct,tradePeriod:6,tradeRoute:M,type:"TwapBuy"};return{...U,amountIn:P,amountOut:s,tradeAmountIn:g.amountIn,tradeAmountOut:g.amountOut,tradeFee:N,toHuman(){return{...U,amountIn:h.toDecimal(P,p),amountOut:h.toDecimal(s,d),tradeAmountIn:h.toDecimal(g.amountIn,p),tradeAmountOut:h.toDecimal(g.amountOut,d),tradeFee:h.toDecimal(N,p)}}}}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 un={};x(un,{BIG_10:()=>Xn,BIG_BILL:()=>Kn,StakingApi:()=>se,StakingClient:()=>oe});var Wn=require("@polkadot/util-crypto"),Yn=require("@polkadot/util"),yt=require("@galacticcouncil/math-staking"),gt=ot(require("big.js")),Xn=(0,gt.default)(10),Kn=(0,gt.default)(Xn.pow(12));function kr(c){return(0,Wn.encodeAddress)((0,Yn.stringToU8a)(("modl"+c).padEnd(32,"\0")),63)}var se=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=kr(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)]),r=e?.created_at,a=await n.reduce(async(s,[i,o])=>{let l=await s,u=i,p=o.amount,d=o.conviction.toString(),m=await this.client.getReferendumInfo(u);return m&&(m.type==="Approved"||m.type==="Rejected")&&l.push({id:u,amount:p,conviction:d}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt:r,actionPoints:e?.action_points,accumulatedUnpaidRewards:e?.accumulated_unpaid_rewards,accumulatedSlashPoints:e?.accumulated_slash_points,accumulatedLockedRewards:e?.accumulated_locked_rewards,votes:a}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,r]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),a=r.find(s=>s)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:a,stakePosition:a?await this.getStakingPosition(a):void 0}}async getRewards(t,e){let n=await this.getStake(t),{potReservedBalance:r,accumulatedRewardPerStake:a,totalStake:s,stakePosition:i}=n;if(!i)return;let[o,l,u,p]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=(0,gt.default)(o.toString()).minus(r.toString()),m=a.toString(),y=(0,gt.default)(e).plus(1).toString();d.gt(0)&&s>0&&(m=(0,yt.calculate_accumulated_rps)(a.toString(),d.toString(),s.toString()));let b=(0,yt.calculate_period_number)(l.toString(),e,p??y),g=(0,yt.calculate_period_number)(l.toString(),i.createdAt?.toString()??"",p??y),P=(0,yt.calculate_rewards)(m,i.rewardPerStake?.toString()??"",i.stake?.toString()??""),f=(0,gt.default)(P).plus(i.accumulatedUnpaidRewards?.toString()||"0").plus(i.accumulatedLockedRewards?.toString()||"0");if(!(0,gt.default)(b).minus(g).lte(u.toString()))return f.div(Kn).toString()}};var oe=class extends C{async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:s})=>{let[i,o,l]=s;return{address:i,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var pn={};x(pn,{TxBuilderFactory:()=>Et});var cn=require("polkadot-api");function zn(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var Ft=class extends C{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new G(t),this.aaveUtils=new ut(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:Oe})}async dryRun(t,e){let n=(0,cn.Enum)("Signed",t),r=(0,cn.Enum)("system",n),s=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,e.decodedCall),i=s.success&&!s.value.execution_result.success?s.value.execution_result.value.error:null;if(i){let o=zn(i.value);throw new Error("Dry run execution error!",{cause:o})}return s}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var fe=class extends Ft{_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],a=await this.balanceClient.getBalance(this.beneficiary,r);return t>=a.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],a=n[n.length-1],s=O.getFraction(t,this.slippagePct),i=r.assetIn,o=a.assetOut,l=t+s,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.buy({asset_in:i,asset_out:o,amount:e,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:i,asset_out:o,amount_out:e,max_amount_in:l,route:H.build(n)}),this.wrapTx("RouterBuy",u)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],a=n[n.length-1],s=O.getFraction(e,this.slippagePct),i=r.assetIn,o=a.assetOut,l=e-s,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.sell({asset_in:i,asset_out:o,amount:t,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:i,asset_out:o,amount_in:t,min_amount_out:l,route:H.build(n)}),r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("RouterSell",u)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],r=e[e.length-1],a=O.getFraction(t,this.slippagePct),s=n.assetIn,i=r.assetOut,o=t-a,l=this.api.tx.Router.sell_all({asset_in:s,asset_out:i,min_amount_out:o,route:H.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var Se=require("polkadot-api");var Te=class extends Ft{_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:a,tradeRoute:s}=this.order,i=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,Se.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:0n,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",i)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:a,tradePeriod:s,tradeRoute:i}=this.order,o=O.getFraction(a,this.slippagePct),l=a-o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Se.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:l,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",u)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:a,tradePeriod:s,tradeRoute:i}=this.order,o=O.getFraction(r,this.slippagePct),l=r+o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,Se.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:a,max_amount_in:l,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",u)}};var Et=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new fe(this.client,this.evmClient).setTrade(t)}order(t){return new Te(this.client,this.evmClient).setOrder(t)}};async function Dr(c){let t=new St(c),e=new Ut(c),[n,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),a=new At(c,e).withAave().withOmnipool().withStableswap().withXyk(),s=new ut(e),i=new Bt(a),o=new Rt(i,{blockTime:n,minBudgetInNative:r}),l=new G(c),u=new oe(c),p=new se(u,l);return{api:{aave:s,router:i,scheduler:o,staking:p},client:{asset:new ft(c),balance:l,evm:e,mining:new Tt(c)},ctx:{pool:a},tx:new Et(c,e),destroy:()=>{a.destroy()}}}0&&(module.exports={aave,api,big,client,const:null,createSdkContext,erc20,error,evm,fmt,h160,json,math,pool,sor,staking,tx,xc});
1
+ "use strict";var nr=Object.create;var oe=Object.defineProperty;var rr=Object.getOwnPropertyDescriptor;var ar=Object.getOwnPropertyNames;var ir=Object.getPrototypeOf,sr=Object.prototype.hasOwnProperty;var yn=(u,t)=>()=>(u&&(t=u(u=0)),t);var x=(u,t)=>{for(var e in t)oe(u,e,{get:t[e],enumerable:!0})},se=(u,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ar(t))!sr.call(u,r)&&r!==e&&oe(u,r,{get:()=>t[r],enumerable:!(n=rr(t,r))||n.enumerable});return u},bt=(u,t,e)=>(se(u,t,"default"),e&&se(e,t,"default")),ot=(u,t,e)=>(e=u!=null?nr(ir(u)):{},se(t||!u||!u.__esModule?oe(e,"default",{value:u,enumerable:!0}):e,u)),or=u=>se(oe({},"__esModule",{value:!0}),u);var Ct={};var Pn=yn(()=>{bt(Ct,require("@polkadot-api/ws-provider/node"))});var kt={};var fn=yn(()=>{bt(kt,require("@polkadot-api/ws-provider/web"))});var Nr={};x(Nr,{aave:()=>Ne,api:()=>Ie,big:()=>h,client:()=>Ge,const:()=>Ee,createSdkContext:()=>qr,erc20:()=>lt,error:()=>Ue,evm:()=>We,fmt:()=>k,h160:()=>qt,json:()=>nt,math:()=>O,pool:()=>$e,sor:()=>an,staking:()=>sn,tx:()=>ln,xc:()=>Le});module.exports=or(Nr);var Ie={};x(Ie,{Papi:()=>C,getWs:()=>lr});var hn=require("@galacticcouncil/descriptors");function bn(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var C=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(hn.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");bn(n)&&console.log(t,...e)}};var Sn=require("polkadot-api"),wn=require("polkadot-api/polkadot-sdk-compat"),lr=async u=>{let t=typeof u=="string"?u.split(","):u,r=(typeof window>"u"?(await Promise.resolve().then(()=>(Pn(),Ct))).getWsProvider:(await Promise.resolve().then(()=>(fn(),kt))).getWsProvider)(t);return(0,Sn.createClient)((0,wn.withPolkadotSdkCompat)(r))};var Ne={};x(Ne,{AAVE_GAS_LIMIT:()=>Ae,AAVE_LENDING_POOL_ADDRESS:()=>ue,AAVE_POOL_ABI:()=>ve,AAVE_POOL_DATA_PROVIDER:()=>ce,AAVE_POOL_DATA_PROVIDER_ABI:()=>le,AAVE_POOL_PROXY:()=>Oe,AAVE_ROUNDING_THRESHOLD:()=>ea,AAVE_UINT_256_MAX:()=>cr,AaveClient:()=>Dt,AaveUtils:()=>ct});var ve=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"to",type:"address"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"interestRateMode",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"address",name:"onBehalfOf",type:"address"}],name:"borrow",outputs:[],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getUserAccountData",outputs:[{internalType:"uint256",name:"totalCollateralBase",type:"uint256"},{internalType:"uint256",name:"totalDebtBase",type:"uint256"},{internalType:"uint256",name:"availableBorrowsBase",type:"uint256"},{internalType:"uint256",name:"currentLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"ltv",type:"uint256"},{internalType:"uint256",name:"healthFactor",type:"uint256"}],stateMutability:"view",type:"function"}];var le=[{inputs:[{internalType:"contract IEACAggregatorProxy",name:"_networkBaseTokenPriceInUsdProxyAggregator",type:"address"},{internalType:"contract IEACAggregatorProxy",name:"_marketReferenceCurrencyPriceInUsdProxyAggregator",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"ETH_CURRENCY_UNIT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MKR_ADDRESS",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_bytes32",type:"bytes32"}],name:"bytes32ToString",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"decimals",type:"uint256"},{internalType:"uint256",name:"baseLTVasCollateral",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationBonus",type:"uint256"},{internalType:"uint256",name:"reserveFactor",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabled",type:"bool"},{internalType:"bool",name:"borrowingEnabled",type:"bool"},{internalType:"bool",name:"stableBorrowRateEnabled",type:"bool"},{internalType:"bool",name:"isActive",type:"bool"},{internalType:"bool",name:"isFrozen",type:"bool"},{internalType:"uint128",name:"liquidityIndex",type:"uint128"},{internalType:"uint128",name:"variableBorrowIndex",type:"uint128"},{internalType:"uint128",name:"liquidityRate",type:"uint128"},{internalType:"uint128",name:"variableBorrowRate",type:"uint128"},{internalType:"uint128",name:"stableBorrowRate",type:"uint128"},{internalType:"uint40",name:"lastUpdateTimestamp",type:"uint40"},{internalType:"address",name:"aTokenAddress",type:"address"},{internalType:"address",name:"stableDebtTokenAddress",type:"address"},{internalType:"address",name:"variableDebtTokenAddress",type:"address"},{internalType:"address",name:"interestRateStrategyAddress",type:"address"},{internalType:"uint256",name:"availableLiquidity",type:"uint256"},{internalType:"uint256",name:"totalPrincipalStableDebt",type:"uint256"},{internalType:"uint256",name:"averageStableRate",type:"uint256"},{internalType:"uint256",name:"stableDebtLastUpdateTimestamp",type:"uint256"},{internalType:"uint256",name:"totalScaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"priceInMarketReferenceCurrency",type:"uint256"},{internalType:"address",name:"priceOracle",type:"address"},{internalType:"uint256",name:"variableRateSlope1",type:"uint256"},{internalType:"uint256",name:"variableRateSlope2",type:"uint256"},{internalType:"uint256",name:"stableRateSlope1",type:"uint256"},{internalType:"uint256",name:"stableRateSlope2",type:"uint256"},{internalType:"uint256",name:"baseStableBorrowRate",type:"uint256"},{internalType:"uint256",name:"baseVariableBorrowRate",type:"uint256"},{internalType:"uint256",name:"optimalUsageRatio",type:"uint256"},{internalType:"bool",name:"isPaused",type:"bool"},{internalType:"bool",name:"isSiloedBorrowing",type:"bool"},{internalType:"uint128",name:"accruedToTreasury",type:"uint128"},{internalType:"uint128",name:"unbacked",type:"uint128"},{internalType:"uint128",name:"isolationModeTotalDebt",type:"uint128"},{internalType:"bool",name:"flashLoanEnabled",type:"bool"},{internalType:"uint256",name:"debtCeiling",type:"uint256"},{internalType:"uint256",name:"debtCeilingDecimals",type:"uint256"},{internalType:"uint8",name:"eModeCategoryId",type:"uint8"},{internalType:"uint256",name:"borrowCap",type:"uint256"},{internalType:"uint256",name:"supplyCap",type:"uint256"},{internalType:"uint16",name:"eModeLtv",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationThreshold",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationBonus",type:"uint16"},{internalType:"address",name:"eModePriceSource",type:"address"},{internalType:"string",name:"eModeLabel",type:"string"},{internalType:"bool",name:"borrowableInIsolation",type:"bool"}],internalType:"struct IUiPoolDataProviderV3.AggregatedReserveData[]",name:"",type:"tuple[]"},{components:[{internalType:"uint256",name:"marketReferenceCurrencyUnit",type:"uint256"},{internalType:"int256",name:"marketReferenceCurrencyPriceInUsd",type:"int256"},{internalType:"int256",name:"networkBaseTokenPriceInUsd",type:"int256"},{internalType:"uint8",name:"networkBaseTokenPriceDecimals",type:"uint8"}],internalType:"struct IUiPoolDataProviderV3.BaseCurrencyInfo",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"},{internalType:"address",name:"user",type:"address"}],name:"getUserReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"uint256",name:"scaledATokenBalance",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabledOnUser",type:"bool"},{internalType:"uint256",name:"stableBorrowRate",type:"uint256"},{internalType:"uint256",name:"scaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"principalStableDebt",type:"uint256"},{internalType:"uint256",name:"stableBorrowLastUpdateTimestamp",type:"uint256"}],internalType:"struct IUiPoolDataProviderV3.UserReserveData[]",name:"",type:"tuple[]"},{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"marketReferenceCurrencyPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"networkBaseTokenPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"}];var Oe="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",ce="0x112b087b60C1a166130d59266363C45F8aa99db0",ue="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Ae=1000000n,ea=5,cr=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Dt=class{client;constructor(t){this.client=t.getWsProvider()}async getReservesData(){return await this.client.readContract({abi:le,address:ce,args:[ue],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:le,address:ce,args:[ue,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:ve,address:Oe,args:[t],functionName:"getUserAccountData"})}};var h={};x(h,{asBigInt:()=>pr,toBigInt:()=>mr,toDecimal:()=>ur});var et=ot(require("big.js"));et.default.NE=-18;function ur(u,t,e=6,n){let r=(0,et.default)(u.toString()),a=(0,et.default)(10).pow(t);return r.div(a).round(e,n).toString()}function mr(u,t){let e=(0,et.default)(10).pow(t),r=(0,et.default)(u).mul(e).toFixed(0,et.default.roundDown);return BigInt(r)}function pr(u){return BigInt(u.round(0,et.default.roundDown).toFixed(0))}var lt={};x(lt,{ERC20:()=>_e});var _e=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 k={};x(k,{FeeUtils:()=>Ce,shiftNeg:()=>Lt});var Tn=ot(require("big.js"));var Ee={};x(Ee,{HUB_ASSET_ID:()=>Fe,HYDRATION_OMNIPOOL_ADDRESS:()=>gr,HYDRATION_PARACHAIN_ID:()=>dr,HYDRATION_SS58_PREFIX:()=>q,PERBILL_DENOMINATOR:()=>Be,PERMILL_DENOMINATOR:()=>Mt,RUNTIME_DECIMALS:()=>_,SYSTEM_ASSET_DECIMALS:()=>Re,SYSTEM_ASSET_ID:()=>W,TRADEABLE_DEFAULT:()=>ht});var _=18,Mt=1e6,Be=1e9,W=0,Re=12,dr=2034,q=63,gr="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Fe=1,ht=15;var Ce=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 Lt(u,t){let e=(0,Tn.default)(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var qt={};x(qt,{H160:()=>Me,isEvmAccount:()=>xn,isEvmAddress:()=>In,isSs58Address:()=>vn});var Pt=require("polkadot-api"),ke=require("@polkadot-api/utils"),J=require("buffer");var De="ETH\0";function xn(u){if(!u)return!1;try{let t=(0,Pt.AccountId)().enc(u),e=J.Buffer.from(De);return J.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function In(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function vn(u){try{return(0,Pt.AccountId)(63).enc(u),!0}catch{return!1}}var Me=class u{static toAccount=t=>{let e=J.Buffer.from(t.slice(2),"hex"),n=J.Buffer.from(De),r=Uint8Array.from(J.Buffer.concat([n,e,J.Buffer.alloc(8)])),a=(0,ke.toHex)(r);return(0,Pt.AccountId)(63).dec(a)};static fromAccount=t=>{let e=(0,Pt.AccountId)().enc(t),n=J.Buffer.from(De),r=e.slice(n.length,-8);return"0x"+J.Buffer.from(r).toString("hex")};static fromSS58=t=>{let n=(0,Pt.AccountId)().enc(t).slice(0,20);return(0,ke.toHex)(n)};static fromAny=t=>{if(In(t))return t;if(xn(t))return u.fromAccount(t);if(vn(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var nt={};x(nt,{findNestedKey:()=>yr,findNestedObj:()=>br,jsonFormatter:()=>hr});var yr=(u,t)=>{let e=[];return JSON.stringify(u,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},br=(u,t,e)=>{let n;return JSON.stringify(u,(r,a)=>(a&&a[t]===e&&(n=a),a)),n},hr=(u,t)=>typeof t=="bigint"?t.toString():t;var O={};x(O,{calculateBuyFee:()=>wr,calculateDiffToAvg:()=>Pr,calculateDiffToRef:()=>fr,calculateSellFee:()=>Sr,getFraction:()=>Tr});var K=ot(require("big.js"));function Pr(u,t){let e=(0,K.default)(u.toString()),n=(0,K.default)(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function fr(u,t){if(t===0n)return 0;let e=(0,K.default)(u.toString()),n=(0,K.default)(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Sr(u,t){let e=(0,K.default)(u.toString()),n=(0,K.default)(t.toString());return(0,K.default)(1).minus(n.div(e)).mul(100).round(2).toNumber()}function wr(u,t){let e=(0,K.default)(u.toString());return(0,K.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Tr(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 Le={};x(Le,{convertToId:()=>xr});var On=require("buffer");function xr(u){let e=On.Buffer.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:me}=lt,{H160:qe}=qt,Ir=1.01,vr=99999,Or=10n**27n,Ar=10n**18n,ct=class{client;constructor(t){this.client=new Dt(t)}async getSummary(t){let e=qe.fromAny(t),[n,r,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[s]=n,[i,o]=r,[l,c,m,d,p,g]=a,b=h.toDecimal(g,18),y=[];for(let P of i){let f=P.underlyingAsset.toLowerCase(),S=s.find(({underlyingAsset:st})=>st.toLowerCase()===f);if(!S)throw new Error("Missing pool reserve for "+f);let v=P.scaledATokenBalance,L=S.liquidityIndex,N=S.priceInMarketReferenceCurrency,M=v*L/Or,V=Number(o===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,tt=S.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,Ft=me.toAssetId(f);y.push({aTokenBalance:M,decimals:Number(S.decimals),isCollateral:tt,priceInRef:N,reserveId:Ft,reserveAsset:f,reserveLiquidationThreshold:V})}return{healthFactor:Number(b),totalCollateral:l,totalDebt:c,reserves:y}}async hasBorrowPositions(t){let e=qe.fromAny(t),n=await this.client.getUserAccountData(e),[r,a]=n;return a>0n}async getHealthFactor(t){let e=qe.fromAny(t),n=await this.client.getUserAccountData(e),[r,a,s,i,o,l]=n,c=h.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:r,totalDebt:a,reserves:s}=await this.getSummary(t),i=me.fromAssetId(e),o=s.find(y=>y.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,isCollateral:c,priceInRef:m,reserveLiquidationThreshold:d}=o,p=h.toBigInt(n,l),g=c?p*m/10n**BigInt(l):0n,b=r-g;return b<=0n?0:this.calculateHealthFactor(b,d,a)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:a,reserves:s}=await this.getSummary(t),i=me.fromAssetId(e),o=s.find(b=>b.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:m}=o,p=h.toBigInt(n,l)*c/10n**BigInt(l),g=r+p;return g<=0n?0:this.calculateHealthFactor(g,m,a)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:r,reserves:a}=await this.getSummary(t),s=me.fromAssetId(e),i=a.find(o=>o.reserveAsset===s);if(!i)throw new Error("Missing reserve ctx for "+s);return this.calculateWithdrawMax(i,n,r)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:r}=await this.getSummary(t),a={};for(let s of r){let i=this.calculateWithdrawMax(s,e,n);s.reserveId&&(a[s.reserveId]=i)}return a}calculateHealthFactor(t,e,n){if(n===0n)return vr;let r=10n**6n,a=h.toBigInt(e,18),s=t*a*r,i=n*Ar,o=s/i;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let r=h.toBigInt(t,18),a=h.toBigInt(e,18);return(r*n+a-1n)/a}calculateWithdrawMax(t,e,n){let{aTokenBalance:r,decimals:a,priceInRef:s,reserveLiquidationThreshold:i}=t,o=this.calculateRequiredCollateral(Ir,i,n),l=e-o;if(l<=0n)return{amount:0n,decimals:a};let c=l*10n**BigInt(a)/s;return{amount:r<c?r:c,decimals:a}}};var Ge={};x(Ge,{AssetClient:()=>ft,BalanceClient:()=>z,ChainParams:()=>St});var ft=class extends C{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[a]=n;return[a,r]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,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[a]=n;return[a,r]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async mapToken(t,e,n,r){let{name:a,asset_type:s,is_sufficient:i,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:a?.asText(),symbol:l,decimals:c,icon:l,type:s.type,isSufficient:i,location:r,existentialDeposit:o}}async mapBond(t,e,n,r){let[a,s]=r,{asset_type:i,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:m}=await this.mapToken(a,e,n),d=Number(s),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:i.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:a,maturity:d}}async mapShares(t,e,n,r){let{assets:a}=r,{name:s,symbol:i,asset_type:o,is_sufficient:l,existential_deposit:c}=e,m=await Promise.all(a.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:i?.asText()||s?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:d}}async mapExternal(t,e,n,r){let a=await this.mapToken(t,e,new Map,r),s=n?.find(i=>i.internalId===a.id);return s?{...a,decimals:s.decimals,name:s.name,symbol:s.symbol,icon:s.symbol,isWhiteListed:s.isWhiteListed}:a}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,a,s]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),i=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=s.get(l);p=await this.mapBond(l,c,i,g);break;case"StableSwap":let b=a.get(l);p=await this.mapShares(l,c,i,b);break;case"External":p=await this.mapExternal(l,c,e,m);break;default:p=await this.mapToken(l,c,i,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 T=require("rxjs");var z=class extends C{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,T.combineLatest)([e,n,r]).pipe((0,T.debounceTime)(250),(0,T.map)(a=>a.flat()),(0,T.startWith)([]),(0,T.bufferCount)(2,1),(0,T.map)(([a,s],i)=>{if(i===0)return s;let o=a.reduce((c,m)=>(c.set(m.id,m.balance),c),new Map);return s.filter(c=>!An(c.balance,o.get(c.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,T.map)(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,T.map)(r=>({id:e,balance:r})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,T.distinctUntilChanged)((n,r)=>!r.deltas),(0,T.map)(({deltas:n})=>{let r=[];return n?.deleted.forEach(a=>{let[s,i]=a.args;r.push({id:i,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(a=>{let[s,i]=a.args;r.push({id:i,balance:this.calculateBalance(a.value)})}),r}))}subscribeErc20Balance(t,e){let n=new T.Subject,r=n.pipe((0,T.shareReplay)(1)),a=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}),s=async()=>{let o=e||await a(),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()},i;return s().then(o=>i=o),r.pipe((0,T.finalize)(()=>i?.()),(0,T.pairwise)(),(0,T.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=>!An(p.balance,m.get(p.id)))}),(0,T.distinctUntilChanged)((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},An=(u,t)=>u!==void 0&&t!==void 0&&u.transferable===t.transferable&&u.total===t.total;var St=class extends C{_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 Ue={};x(Ue,{AssetNotFound:()=>He,PoolNotFound:()=>Nt,RouteNotFound:()=>Gt});var He=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},Nt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},Gt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var We={};x(We,{EvmClient:()=>Ht,createChain:()=>Ve});var _n=require("viem"),_r=["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"],Ve=()=>(0,_n.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:_r}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});var j=require("viem");var Ht=class{client;chain;constructor(t){this.client=t,this.chain=Ve()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return(0,j.createPublicClient)({chain:this.chain,transport:(0,j.http)()})}getWsProvider(){return(0,j.createPublicClient)({transport:(0,j.custom)({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return(0,j.createWalletClient)({account:t,chain:this.chain,transport:(0,j.custom)(window.ethereum)})}};var $e={};x($e,{PoolContextProvider:()=>vt,PoolError:()=>ut,PoolFactory:()=>It,PoolType:()=>F,aave:()=>Qe,lbp:()=>Xe,omni:()=>Ke,stable:()=>ze,xyk:()=>je});var Xe={};x(Xe,{LbpMath:()=>Y,LbpPool:()=>Ut,LbpPoolClient:()=>Wt});var Q=require("@galacticcouncil/math-lbp"),Y=class{static getSpotPrice(t,e,n,r,a){return(0,Q.get_spot_price)(t,e,n,r,a)}static calculateInGivenOut(t,e,n,r,a){return(0,Q.calculate_in_given_out)(t,e,n,r,a)}static calculateOutGivenIn(t,e,n,r,a){return(0,Q.calculate_out_given_in)(t,e,n,r,a)}static calculateLinearWeights(t,e,n,r,a){return(0,Q.calculate_linear_weights)(t,e,n,r,a)}static calculatePoolTradeFee(t,e,n){return(0,Q.calculate_pool_trade_fee)(t,e,n)}};var F=(a=>(a.Aave="Aave",a.LBP="LBP",a.Omni="Omnipool",a.Stable="Stableswap",a.XYK="XYK",a))(F||{}),ut=(a=>(a.InsufficientTradingAmount="InsufficientTradingAmount",a.MaxInRatioExceeded="MaxInRatioExceeded",a.MaxOutRatioExceeded="MaxOutRatioExceeded",a.TradeNotAllowed="TradeNotAllowed",a.UnknownError="UnknownError",a))(ut||{});var{FeeUtils:Bn}=k,Ut=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,a,s,i){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.fee=s,this.repayFeeApply=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,weightIn:r.weight,weightOut:a.weight}}validateAndBuy(t,e,n){let r=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let s=t.balanceOut/this.maxOutRatio;if(e>s&&a.push("MaxOutRatioExceeded"),r===t.assetOut){let i=this.calculateTradeFee(e,n),o=Bn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+i,c=this.calculateInGivenOut(t,l),m=t.balanceIn/this.maxInRatio;return c>m&&a.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:a}}else{let i=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return i>o&&a.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:i,amountOut:e,feePct:0,errors:a}}}validateAndSell(t,e,n){let r=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let s=t.balanceIn/this.maxInRatio;if(e>s&&a.push("MaxInRatioExceeded"),r===t.assetIn){let i=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return i>o&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:i,feePct:0,errors:a}}else{let i=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(i,n),l=Bn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=i-o,m=t.balanceOut/this.maxOutRatio;return c>m&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:c,feePct:l,errors:a}}}calculateInGivenOut(t,e){let n=Y.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=Y.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=Y.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=Y.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=Y.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};var Fn=require("polkadot-api"),mt=require("rxjs");var Rn=(u,t=new Map)=>e=>{let n;return t.has(e)?t.get(e):(t.set(e,n=u(e)),n)};var I=require("rxjs");var Ye=[{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 Vt=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,r,a]=await Promise.all([this.client.readContract({abi:Ye,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:Ye,address:t,functionName:"decimals"}),this.client.getBlock()]),[s,i,o,l]=n,c=a.number-(a.timestamp-l)/BigInt(e),m=Number(c);return{price:i,decimals:r,updatedAt:m<0?0:m}}};var G=class extends z{evm;mmOracle;override=[];mem=0;memPools=Rn(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new Vt(e)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=(0,I.from)(this.getPoolsMem()).pipe((0,I.switchMap)(e=>this.subscribe(e)),(0,I.combineLatestAll)());return(0,I.firstValueFrom)(t)}getSubscriber(){return(0,I.from)(this.getPoolsMem()).pipe((0,I.switchMap)(t=>this.subscribe(t)),(0,I.mergeAll)())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>(0,I.combineLatest)([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe((0,I.debounceTime)(250),(0,I.map)(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return(0,I.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(a=>a.type==="Erc20").map(a=>a.id),r=this.subscribeErc20Balance(t.address,n);e.push(r)}return(0,I.combineLatest)(e).pipe((0,I.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 a=this.override.find(i=>i.id===e),s=!!n||!!a?.decimals;return r>0n&&s})}updatePool=(t,e)=>{let n=t.tokens.map(r=>{let a=e.find(i=>i.id===r.id),s=this.override.find(i=>i.id===r.id);return a?{...r,balance:a.balance.transferable,decimals:r.decimals||s?.decimals}:{...r,decimals:r.decimals||s?.decimals}});return{...t,tokens:n}}};var Wt=class extends G{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,a=t.filter(({value:s})=>e&&this.isActivePool(s,r)).map(async({keyArgs:s,value:i})=>{let[o]=s,l=o.toString(),c=await this.getPoolDelta(l,i,r);return{address:l,type:"LBP",fee:i.fee,...c,...n}});return Promise.all(a)}async getPoolDelta(t,e,n){let{start:r,end:a,assets:s,initial_weight:i,final_weight:o,repay_target:l,fee_collector:c}=e,m=Y.calculateLinearWeights(r?r.toString():"0",a?a.toString():"0",i.toString(),o.toString(),n.toString()),[d,p]=s,g=BigInt(m),b=this.MAX_FINAL_WEIGHT-BigInt(g),[y,P,f,S,v]=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:f?.decimals,existentialDeposit:f?.existential_deposit,balance:P.transferable,weight:g,type:f?.asset_type.type},{id:p,decimals:v?.decimals,existentialDeposit:v?.existential_deposit,balance:S.transferable,weight:b,type:v?.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(Fn.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,mt.switchMap)(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):(0,mt.of)(t)),(0,mt.map)(r=>Object.assign({},t,r))):(0,mt.of)(t)}};var Ke={};x(Ke,{OmniMath:()=>A,OmniPool:()=>Yt,OmniPoolClient:()=>Kt});var w=require("@galacticcouncil/math-omnipool"),pt=ot(require("big.js")),A=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,a,s,i,o,l){return(0,w.calculate_in_given_out)(t,e,n,r,a,s,i,o,l)}static calculateLrnaInGivenOut(t,e,n,r,a){return(0,w.calculate_lrna_in_given_out)(t,e,n,r,a)}static calculateOutGivenIn(t,e,n,r,a,s,i,o,l){return(0,w.calculate_out_given_in)(t,e,n,r,a,s,i,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,a){return(0,w.calculate_out_given_lrna_in)(t,e,n,r,a)}static calculateShares(t,e,n,r){return(0,w.calculate_shares)(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,a,s,i,o){return(0,w.calculate_liquidity_out)(t,e,n,r,a,s,i,o)}static calculateLiquidityLRNAOut(t,e,n,r,a,s,i,o){return(0,w.calculate_liquidity_lrna_out)(t,e,n,r,a,s,i,o)}static calculateCapDifference(t,e,n,r){let a=(0,pt.default)(e),s=(0,pt.default)(t),i=(0,pt.default)(r),o=(0,pt.default)(n),l=(0,pt.default)(10).pow(18),c=o.div(l);if(a.div(i).lt(c)){let d=c.times(i).minus(a).times(s),p=a.times((0,pt.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:wt}=k,Yt=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,a,s){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.hubAssetId=s}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:r.hubReserves,hubReservesOut:a.hubReserves,sharesIn:r.shares,sharesOut:a.shares,decimalsIn:r.decimals,decimalsOut:a.decimals,balanceIn:r.balance,balanceOut:a.balance,tradeableIn:r.tradeable,tradeableOut:a.tradeable,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),s=r===0n?0:O.calculateDiffToRef(a,r),i=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&i.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&i.push("MaxOutRatioExceeded");let m=t.balanceIn/this.maxInRatio;return a>m&&i.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:s,errors:i}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),s=O.calculateDiffToRef(r,a),i=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&i.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&i.push("MaxInRatioExceeded");let m=t.balanceOut/this.maxOutRatio;return a>m&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:s,errors:i}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let r=A.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?wt.toRaw(n.assetFee).toString():"0",n?wt.toRaw(n.protocolFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateLrnaInGivenOut(t,e,n){let r=A.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?wt.toRaw(n.assetFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let r=A.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?wt.toRaw(n.assetFee).toString():"0",n?wt.toRaw(n.protocolFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateOutGivenLrnaIn(t,e,n){let r=A.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?wt.toRaw(n.assetFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=A.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=A.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=A.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=A.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var pe=require("polkadot-api"),En=require("@polkadot-api/utils"),Xt=require("rxjs");var{FeeUtils:rt}=k,Kt=class extends G{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,r,a,s,i]=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:P}=m,[f,S]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:S.transferable,cap:y,hubReserves:p,protocolShares:P,shares:g,tradeable:b,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:s.transferable,tradeable:r,type:a?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...i}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=(0,En.toHex)(e);return(0,pe.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,a]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),s=n.min_fee+r.min_fee,i=n.max_fee+r.max_fee;if(a){let{asset_fee:o,protocol_fee:l}=a;return{assetFee:rt.fromPermill(o),protocolFee:rt.fromPermill(l),min:rt.fromPermill(s),max:rt.fromPermill(i)}}else return{assetFee:rt.fromPermill(n.min_fee),protocolFee:rt.fromPermill(r.min_fee),min:rt.fromPermill(s),max:rt.fromPermill(i)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(pe.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,Xt.distinctUntilChanged)((n,r)=>!r.deltas),(0,Xt.map)(({entries:n})=>n.map(r=>{let[a]=r.args,{hub_reserve:s,shares:i,tradable:o,cap:l,protocol_shares:c}=r.value,m=t.tokens.findIndex(p=>p.id===a);return{...t.tokens[m],cap:l,hubReserves:s,protocolShares:c,shares:i,tradeable:o}})),(0,Xt.map)(n=>{let r=t.tokens.find(a=>a.id===1);return{...t,tokens:[...n,r]}}))}};var ze={};x(ze,{StableMath:()=>E,StableSwap:()=>zt,StableSwapClient:()=>jt});var B=require("@galacticcouncil/math-stableswap"),E=class{static getPoolAddress(t){return(0,B.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,a){return(0,B.calculate_amplification)(t,e,n,r,a)}static calculateInGivenOut(t,e,n,r,a,s,i){return(0,B.calculate_in_given_out)(t,e,n,r,a,s,i)}static calculateAddOneAsset(t,e,n,r,a,s,i){return(0,B.calculate_add_one_asset)(t,e,n,r,a,s,i)}static calculateSharesForAmount(t,e,n,r,a,s,i){return(0,B.calculate_shares_for_amount)(t,e,n,r,a,s,i)}static calculateOutGivenIn(t,e,n,r,a,s,i){return(0,B.calculate_out_given_in)(t,e,n,r,a,s,i)}static calculateLiquidityOutOneAsset(t,e,n,r,a,s,i){return(0,B.calculate_liquidity_out_one_asset)(t,e,n,r,a,s,i)}static calculateShares(t,e,n,r,a,s){return(0,B.calculate_shares)(t,e,n,r,a,s)}static calculateSpotPriceWithFee(t,e,n,r,a,s,i,o){return(0,B.calculate_spot_price_with_fee)(t,e,n,r,a,s,i,o)}static recalculatePegs(t,e,n,r,a){let s=(0,B.recalculate_peg)(t,e,n,r,a);return JSON.parse(s)}};var{FeeUtils:at}=k,zt=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,a,s,i,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.amplification=s,this.id=i,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,tradeableIn:this.id===t?15:r.tradeable,tradeableOut:this.id===e?15:a.tradeable,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),s=at.toPct(n.fee),i=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&i.push("InsufficientTradingAmount"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:s,errors:i}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),s=at.toPct(n.fee),i=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&i.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:s,errors:i}}calculateIn(t,e,n){let r=E.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateAddOneAsset(t,e,n){let r=E.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateSharesForAmount(t,e,n){let r=E.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}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=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=E.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateWithdrawOneAsset(t,e,n){let r=E.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateShares(t,e,n){let r=E.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}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=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=E.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,nt.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],nt.jsonFormatter)}};var de=require("polkadot-api"),Cn=require("@polkadot-api/utils"),kn=require("@noble/hashes/blake2b"),Tt=require("rxjs");var{FeeUtils:dt}=k,jt=class extends G{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=E.getPoolAddress(t),n=(0,kn.blake2b)(e,{dkLen:32}),r=(0,Cn.toHex)(n);return(0,de.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:a,initial_block:s,final_block:i}=e,o=E.calculateAmplification(r.toString(),a.toString(),s.toString(),i.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 a=>{let[s,i,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,a),this.api.query.AssetRegistry.Assets.getValue(a),this.getBalance(n,a)]);return{id:a,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:o.transferable,tradeable:s,type:i?.asset_type.type}});return Promise.all(r)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(de.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),r=t.map(async({keyArgs:a,value:s})=>{let[i]=a,o=this.getPoolAddress(i),[l,c,m]=await Promise.all([this.getPoolDelta(i,s,e),this.getPoolTokens(i,s),this.getPoolPegs(i,s,e)]);return c.push({id:i,tradeable:15,balance:l.totalIssuance,decimals:18}),this.poolsData.set(o,s),{address:o,id:i,type:"Stableswap",fee:dt.fromPermill(s.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 a=await this.getLatestPegs(e,r,n),s=this.getRecentPegs(r),i=dt.fromPermill(r.max_peg_update),o=dt.fromPermill(e.fee),[l,c]=E.recalculatePegs(JSON.stringify(s),JSON.stringify(a),n.toString(),dt.toRaw(i).toString(),dt.toRaw(o).toString()),m=Number(l)*1e6;return{pegsFee:dt.fromPermill(m),pegs:c}}getDefaultPegs(t){let e=t.fee,n=E.defaultPegs(t.assets.length);return{pegsFee:dt.fromPermill(e),pegs:n}}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,r])=>r.map(a=>a.toString()))}async getLatestPegs(t,e,n){let{source:r}=e,a=Array.from(t.assets.entries()).map(([i,o])=>o),s=r.map(async(i,o)=>{if(i.type==="Oracle"){let[l,c,m]=i.value,d=[m,a[o]].sort((f,S)=>f-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(),P=g.d.toString();return m.toString()===d[0].toString()?[[y,P],b.toString()]:[[P,y],b.toString()]}else if(i.type==="MMOracle"){let l=i.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[i.value.map(l=>l.toString()),n.toString()]});return Promise.all(s)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?(0,Tt.of)(t):e.watchValue("best").pipe((0,Tt.switchMap)(r=>Promise.all([this.getPoolDelta(t.id,n,r),this.getPoolPegs(t.id,n,r)])),(0,Tt.map)(([r,a])=>{let s=t.tokens.map(i=>i.id===t.id?{...i,balance:r.totalIssuance}:i);return Object.assign(t,{tokens:s},r,a)}))}};var je={};x(je,{XykMath:()=>Z,XykPool:()=>Qt,XykPoolClient:()=>$t});var R=require("@galacticcouncil/math-xyk"),Z=class{static getSpotPrice(t,e,n){return(0,R.get_spot_price)(t,e,n)}static calculateInGivenOut(t,e,n){return(0,R.calculate_in_given_out)(t,e,n)}static calculateOutGivenIn(t,e,n){return(0,R.calculate_out_given_in)(t,e,n)}static calculatePoolTradeFee(t,e,n){return(0,R.calculate_pool_trade_fee)(t,e,n)}static calculateLiquidityIn(t,e,n){return(0,R.calculate_liquidity_in)(t,e,n)}static calculateSpotPrice(t,e){return(0,R.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return(0,R.calculate_spot_price_with_fee)(t,e,n,r)}static calculateShares(t,e,n){return(0,R.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return(0,R.calculate_liquidity_out_asset_a)(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return(0,R.calculate_liquidity_out_asset_b)(t,e,n,r)}};var{FeeUtils:Dn}=k,Qt=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,a){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:r.decimals,decimalsOut:a.decimals,balanceIn:r.balance,balanceOut:a.balance,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateTradeFee(r,n),s=Dn.toPct(n.exchangeFee),i=r+a,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 i>c&&o.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:r,amountOut:e,feePct:s,errors:o}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateTradeFee(r,n),s=Dn.toPct(n.exchangeFee),i=r-a,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 i>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:i,feePct:s,errors:o}}calculateInGivenOut(t,e){let n=Z.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=Z.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=Z.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=Z.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=Z.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};var Mn=require("polkadot-api"),Ln=require("rxjs");var $t=class extends G{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),r=e.map(async({keyArgs:a,value:s})=>{let[i]=a,[o,l]=s,[c,m,d,p]=await Promise.all([this.getBalance(i,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(i,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:i,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(Mn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,Ln.of)(t)}};var Qe={};x(Qe,{AavePool:()=>Jt,AavePoolClient:()=>Zt});var Jt=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,a){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=[];return e>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:a}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=[];return r>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:a}}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 Nn=require("polkadot-api"),Gn=require("@polkadot-api/utils"),xt=require("rxjs"),Hn=require("viem");var qn=[{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:Br}=lt,Rr=["Supply","Withdraw","Repay","Borrow"],Zt=class extends G{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:r,liqudity_in:a,liqudity_out:s})=>{let[i,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:i?.decimals,existentialDeposit:i?.existential_deposit,balance:a,location:o,type:i?.asset_type.type},{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:s,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:a}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(s=>{let i=s.id===e.id?r:a;return{...s,balance:i}})}getPoolId(t,e){let n=t+"/"+e,r=new TextEncoder().encode(n.padEnd(32,"\0")),a=(0,Gn.toHex)(r);return(0,Nn.AccountId)(63).dec(a)}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),a=this.api.event.Router.Executed.watch(({asset_in:i,asset_out:o})=>i===n.id||o===n.id),s=this.api.event.EVM.Log.watch(({log:i})=>{let{topics:o,data:l}=i,c=o.map(g=>g.asHex()),m=l.asHex(),{eventName:d,args:p}=(0,Hn.decodeEventLog)({abi:qn,topics:c,data:m});return Rr.includes(d)&&p.reserve.toLowerCase()===r.toLowerCase()});return(0,xt.merge)([a,s]).pipe((0,xt.switchMap)(()=>this.getPoolDelta(t)),(0,xt.map)(i=>({...t,tokens:[...i]})))}getReserveH160Id(t){return t.type==="Erc20"?nt.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Br.fromAssetId(t.id)}};var It=class{static get(t){switch(t.type){case"Aave":return Jt.fromPool(t);case"XYK":return Qt.fromPool(t);case"Omnipool":return Yt.fromPool(t);case"LBP":return Ut.fromPool(t);case"Stableswap":return zt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var $=require("rxjs");var vt=class extends C{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=$.Subscription.EMPTY;omniSub=$.Subscription.EMPTY;stableSub=$.Subscription.EMPTY;xykSub=$.Subscription.EMPTY;aaveSub=$.Subscription.EMPTY;isReady=!1;isDestroyed=new $.Subject;constructor(t,e){super(t),this.evm=e,this.lbpClient=new Wt(t,e),this.omniClient=new Kt(t,e),this.stableClient=new jt(t,e),this.xykClient=new $t(t,e),this.aaveClient=new Zt(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe((0,$.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),a=new Set(n),s=async i=>{let o=i.getPoolType();return r.size>0?r.has(o):a.size>0?!a.has(o):i.isSupported()};return this.getFilteredPools(s)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((a,s)=>e[s]);return(await Promise.all(n.map(a=>a.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 Nt(t.type)}};var an={};x(an,{DEFAULT_BLOCK_TIME:()=>Vn,DEFAULT_MIN_BUDGET:()=>tn,ORDER_MIN_BLOCK_PERIOD:()=>Wn,Router:()=>Ot,TWAP_BLOCK_PERIOD:()=>re,TWAP_MAX_DURATION:()=>nn,TWAP_MAX_PRICE_IMPACT:()=>en,TWAP_TX_MULTIPLIER:()=>Ll,TradeOrderError:()=>Ze,TradeOrderType:()=>ye,TradeRouteBuilder:()=>H,TradeRouter:()=>At,TradeScheduler:()=>_t,TradeType:()=>ge});var te=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Fr=8,ee=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=[],a=new te,s=[];for(s.push([e,""]),a.enqueue(s);a.size()>0;){let i=a.dequeue();if(!i||i.length>Fr)continue;let o=i[i.length-1];(n===null||o[0]===n)&&r.push(i),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,i)){let m=[...i];m.push(c),a.enqueue(m)}})}return r}findShortestPaths(t,e,n){let r=[],a=new te,s=[];s.push([e,""]),a.enqueue(s);let i=1/0;for(;a.size()>0;){let o=a.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<i?(i=o.length,r.length=0,r.push(o)):o.length===i&&r.push(o);continue}let c=t.get(l[0]);for(let m of c??[])this.isNotVisited(m,o)&&a.enqueue([...o,m])}return r}buildAndPopulateGraph(t,e){let n=new Map;for(let r of t)n.set(parseInt(r),[]);for(let[r,a,s]of e)n.get(a)?.push([s,r]);return n}};function Je(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 a=0;a<n;a++){if(r==a)continue;let s=[e.address,e.tokens[r].id,e.tokens[a].id];t[e.tokens[r].id].push(s)}}}return t}var ne=class{getProposals(t,e,n){let r=n.filter(y=>y.type==="XYK"),a=n.filter(y=>y.type!=="XYK"),s=new Set(a.map(y=>y.tokens).flat().map(y=>y.id)),i=s.has(t),o=s.has(e),l=new ee,c=y=>{let P=Je(y),f=Object.keys(P),S=f.flatMap(v=>P[v]);return l.buildAndPopulateGraph(f,S)};if(!i&&!o){let y=r.filter(S=>S.tokens.find(v=>v.id===t)||S.tokens.find(v=>v.id===e)),P=c(y),f=l.findPaths(P,t,e);return this.parsePaths(f)}if(i&&o){let y=c(a),P=l.findPaths(y,t,e);return this.parsePaths(P)}let m=i?e:t,d=r.filter(y=>y.tokens.some(P=>P.id===m));if(d.length===0)return[];let p=[...a,...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 a=0;a<n.length;a++){let s=n[a],i=n[a+1];if(i==null)break;r.push(this.toEdge(s,i))}e.push(r)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var Ot=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new ne,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(s=>this.validPath(s,r)).map(s=>this.toHops(s,r))}getProposals(t,e,n){let r=this.buildRouteKey(t,e,n);if(this.routeProposals.has(r))return this.routeProposals.get(r);let a=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(r,a),a}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,It.get(e)]))}toHops(t,e){return t.map(([n,r,a])=>{let s=e.get(n);return{poolAddress:n,poolId:s?.id,pool:s?.type,assetIn:r,assetOut:a}})}};var ge=(e=>(e.Buy="Buy",e.Sell="Sell",e))(ge||{}),ye=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(ye||{}),Ze=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Ze||{});var{FeeUtils:Un}=k,At=class extends Ot{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),a=super.getPaths(t,e,n);if(!a.length)throw new Gt(t,e);return{paths:a,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 a=n[n.length-1].amountOut,s=r[r.length-1].amountOut;return a>s?-1:1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(a=>a.tradeFeeRange?.[0]??a.tradeFeePct).reduce((a,s)=>a+s),r=t.map(a=>a.tradeFeeRange?.[1]??a.tradeFeePct).reduce((a,s)=>a+s);return[n,r]}}getPoolFeeRange(t){let e=t.min?Un.toPct(t.min):void 0,n=t.max?Un.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(i=>i.assetOutDecimals).reduce((i,o)=>i+o),r=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),a=n-e.assetOutDecimals,s=Math.pow(10,a);return r/BigInt(s)}async getSell(t,e,n,r){return this.withCtx(t,e,async({paths:a,poolsMap:s})=>{let i;if(r)i=await this.toSellSwaps(n,r,s);else{let o=a.map(c=>this.toSellSwaps(n,c,s)),l=await Promise.all(o);i=this.findBestSellRoute(l)}return this.buildSell(s,i)})}buildSell(t,e){let n=e[0],r=e[e.length-1],a=this.isDirectTrade(e),s=this.getSellSpot(e),i=r.amountOut,o=a?r.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-i,c=this.getRouteFeeRange(e),m=a?r.tradeFeePct:O.calculateSellFee(o,i),d=Math.pow(10,n.assetInDecimals),p=n.amountIn*s/BigInt(d),g=O.calculateDiffToRef(o,p);return{type:"Sell",amountIn:n.amountIn,amountOut:r.amountOut,spotPrice:s,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:h.toDecimal(n.amountIn,n.assetInDecimals),amountOut:h.toDecimal(r.amountOut,r.assetOutDecimals),spotPrice:h.toDecimal(s,r.assetOutDecimals),tradeFee:h.toDecimal(l,r.assetOutDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0Y(t,e,n){let r=[];for(let a=0;a<e.length;a++){let s=e[a],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;a>0?l=r[a-1]:l=t;let c=i.calculateOutGivenIn(o,l);r.push(c)}return r[r.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:r,pools:a,poolsMap:s}=n,l=a.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,P)=>y+P)).sort((b,y)=>y<b?-1:1)[0],c=O.getFraction(l,.1),m=await Promise.all(r.map(b=>this.toSellSwaps(c,b,s))),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,a);return this.mlr.set(g,p),p}async toSellSwaps(t,e,n){let r=[];for(let a=0;a<e.length;a++){let s=e[a],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;a>0?l=r[a-1].amountOut:l=typeof t=="string"?h.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(i,o.assetOut),{amountOut:m,calculatedOut:d,feePct:p,errors:g}=i.validateAndSell(o,l,c),b=this.getPoolFeeRange(c),y=i.spotPriceOutGivenIn(o),P=Math.pow(10,o.decimalsIn),f=l*y/BigInt(P),S=O.calculateDiffToRef(d,f);r.push({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:m,calculatedOut:d,spotPrice:y,tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===s.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===s.assetIn},toHuman(){return{...s,amountIn:h.toDecimal(l,o.decimalsIn),amountOut:h.toDecimal(m,o.decimalsOut),calculatedOut:h.toDecimal(d,o.decimalsOut),spotPrice:h.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),a=this.mlr.get(r);return a||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:r,poolsMap:a}=n,s=this.buildRouteKey(t,e,r),i=this.mlr.get(s);i||(i=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",i,a),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}})}findBestBuyRoute(t){let e=t.sort((n,r)=>{let a=n[0].amountIn,s=r[0].amountIn;return a>s?1:-1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(i=>i.assetInDecimals).reduce((i,o)=>i+o),r=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),a=n-e.assetInDecimals,s=Math.pow(10,a);return r/BigInt(s)}async getBuy(t,e,n,r){return this.withCtx(t,e,async({paths:a,poolsMap:s})=>{let i;if(r)i=await this.toBuySwaps(n,r,s);else{let o=a.map(c=>this.toBuySwaps(n,c,s)),l=await Promise.all(o);i=this.findBestBuyRoute(l)}return this.buildBuy(s,i)})}buildBuy(t,e){let n=e[e.length-1],r=e[0],a=this.isDirectTrade(e),s=this.getBuySpot(e),i=r.amountIn,o=a?r.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=i-o,c=this.getRouteFeeRange(e),m=a?r.tradeFeePct:O.calculateBuyFee(o,i),d=Math.pow(10,n.assetOutDecimals),p=n.amountOut*s/BigInt(d),g;return o===0n?g=-100:g=O.calculateDiffToRef(p,o),{type:"Buy",amountOut:n.amountOut,amountIn:r.amountIn,spotPrice:s,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:h.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:h.toDecimal(r.amountIn,r.assetInDecimals),spotPrice:h.toDecimal(s,r.assetInDecimals),tradeFee:h.toDecimal(l,r.assetInDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(b=>b.toHuman())}}}}calculateDelta0X(t,e,n){let r=[];for(let a=e.length-1;a>=0;a--){let s=e[a],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;a==e.length-1?l=t:l=r[0];let c=i.calculateInGivenOut(o,l);r.unshift(c)}return r[0]}async toBuySwaps(t,e,n){let r=[];for(let a=e.length-1;a>=0;a--){let s=e[a],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;a==e.length-1?l=typeof t=="string"?h.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let c=await this.ctx.getPoolFees(i,o.assetOut),{amountIn:m,calculatedIn:d,feePct:p,errors:g}=i.validateAndBuy(o,l,c),b=this.getPoolFeeRange(c),y=i.spotPriceInGivenOut(o),P=Math.pow(10,o.decimalsOut),f=l*y/BigInt(P),S;d===0n?S=-100:S=O.calculateDiffToRef(f,d),r.unshift({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:m,calculatedIn:d,spotPrice:y,tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===s.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===s.assetIn},toHuman(){return{...s,amountOut:h.toDecimal(l,o.decimalsOut),amountIn:h.toDecimal(m,o.decimalsIn),calculatedIn:h.toDecimal(d,o.decimalsIn),spotPrice:h.toDecimal(y,o.decimalsIn),tradeFeePct:p,tradeFeeRange:b,priceImpactPct:S,errors:g}}})}return r}};var Vn=6e3,tn=1000000000000000n,re=6,en=-5,nn=216e5,Ll=3,Wn=6;var rn=require("polkadot-api");var H=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:a})=>r==="Stableswap"?{pool:(0,rn.Enum)("Stableswap",a),asset_in:e,asset_out:n}:{pool:(0,rn.Enum)(r),asset_in:e,asset_out:n})}};var _t=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??tn})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,r,a){let[s,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=i,m=l[0],d=l[l.length-1],{assetInDecimals:p}=m,{assetOutDecimals:g}=d,b=Math.abs(c),y=this.getMinimumTradeCount(o,s),P=this.getOptimalTradeCount(b),f=a?Math.round(r/a):P,S=Math.ceil(r/y),v=Math.round(r/P),L=Math.round(r/f),N=o/BigInt(f),M=await this.router.getBestSell(t,e,N),U=o<s,V=[];U&&V.push("OrderTooSmall");let tt=M.amountOut*BigInt(f),Ft=this.toBlockPeriod(L),st=M.tradeFee*BigInt(f),xe=H.build(l),Et={assetIn:t,assetOut:e,errors:V,frequencyMin:S,frequencyOpt:v,frequency:L,tradeCount:f,tradeFee:st,tradeImpactPct:M.priceImpactPct,tradePeriod:Ft,tradeRoute:xe,type:"Dca"};return{...Et,amountIn:o,amountOut:tt,tradeAmountIn:M.amountIn,tradeAmountOut:M.amountOut,toHuman(){return{...Et,amountIn:h.toDecimal(o,p),amountOut:h.toDecimal(tt,g),tradeAmountIn:h.toDecimal(M.amountIn,p),tradeAmountOut:h.toDecimal(M.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,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:s,swaps:i,priceImpactPct:o}=a,l=i[0],c=i[i.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),b=s/BigInt(g),y=await this.router.getBestSell(l.assetIn,c.assetOut,b),P=g===1,f=s<r,S=y.priceImpactPct<-5,v=[];f||P?v.push("OrderTooSmall"):S&&v.push("OrderImpactTooBig");let L=y.amountOut*BigInt(g),N=y.tradeFee*BigInt(g),M=H.build(i),U={assetIn:t,assetOut:e,errors:v,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:M,type:"TwapSell"};return{...U,amountIn:s,amountOut:L,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:N,toHuman(){return{...U,amountIn:h.toDecimal(s,m),amountOut:h.toDecimal(L,d),tradeAmountIn:h.toDecimal(y.amountIn,m),tradeAmountOut:h.toDecimal(y.amountOut,d),tradeFee:h.toDecimal(N,d)}}}}async getTwapBuyOrder(t,e,n){let[r,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:s,swaps:i,priceImpactPct:o}=a,l=i[0],c=i[i.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),b=s/BigInt(g),y=await this.router.getBestBuy(l.assetIn,c.assetOut,b),P=y.amountIn*BigInt(g),f=g===1,S=P<r,v=y.priceImpactPct<-5,L=[];S||f?L.push("OrderTooSmall"):v&&L.push("OrderImpactTooBig");let N=y.tradeFee*BigInt(g),M=H.build(i),U={assetIn:t,assetOut:e,errors:L,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:6,tradeRoute:M,type:"TwapBuy"};return{...U,amountIn:P,amountOut:s,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:N,toHuman(){return{...U,amountIn:h.toDecimal(P,m),amountOut:h.toDecimal(s,d),tradeAmountIn:h.toDecimal(y.amountIn,m),tradeAmountOut:h.toDecimal(y.amountOut,d),tradeFee:h.toDecimal(N,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 sn={};x(sn,{BIG_10:()=>Kn,BIG_BILL:()=>zn,StakingApi:()=>ae,StakingClient:()=>ie});var Yn=require("@polkadot/util-crypto"),Xn=require("@polkadot/util"),yt=require("@galacticcouncil/math-staking"),gt=ot(require("big.js")),Kn=(0,gt.default)(10),zn=(0,gt.default)(Kn.pow(12));function Er(u){return(0,Yn.encodeAddress)((0,Xn.stringToU8a)(("modl"+u).padEnd(32,"\0")),63)}var ae=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=Er(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)]),r=e?.created_at,a=await n.reduce(async(s,[i,o])=>{let l=await s,c=i,m=o.amount,d=o.conviction.toString(),p=await this.client.getReferendumInfo(c);return p&&(p.type==="Approved"||p.type==="Rejected")&&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:a}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,r]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),a=r.find(s=>s)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:a,stakePosition:a?await this.getStakingPosition(a):void 0}}async getRewards(t,e){let n=await this.getStake(t),{potReservedBalance:r,accumulatedRewardPerStake:a,totalStake:s,stakePosition:i}=n;if(!i)return;let[o,l,c,m]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=(0,gt.default)(o.toString()).minus(r.toString()),p=a.toString(),g=(0,gt.default)(e).plus(1).toString();d.gt(0)&&s>0&&(p=(0,yt.calculate_accumulated_rps)(a.toString(),d.toString(),s.toString()));let b=(0,yt.calculate_period_number)(l.toString(),e,m??g),y=(0,yt.calculate_period_number)(l.toString(),i.createdAt?.toString()??"",m??g),P=(0,yt.calculate_rewards)(p,i.rewardPerStake?.toString()??"",i.stake?.toString()??""),f=(0,gt.default)(P).plus(i.accumulatedUnpaidRewards?.toString()||"0").plus(i.accumulatedLockedRewards?.toString()||"0");if(!(0,gt.default)(b).minus(y).lte(c.toString()))return f.div(zn).toString()}};var ie=class extends C{async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:s})=>{let[i,o,l]=s;return{address:i,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var ln={};x(ln,{TxBuilderFactory:()=>Rt});var on=require("polkadot-api");function jn(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var Bt=class extends C{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new z(t),this.aaveUtils=new ct(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:Ae})}async dryRun(t,e){let n=(0,on.Enum)("Signed",t),r=(0,on.Enum)("system",n),s=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,e.decodedCall),i=s.success&&!s.value.execution_result.success?s.value.execution_result.value.error:null;if(i){let o=jn(i.value);throw new Error("Dry run execution error!",{cause:o})}return s}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var be=class extends Bt{_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],a=await this.balanceClient.getBalance(this.beneficiary,r);return t>=a.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],a=n[n.length-1],s=O.getFraction(t,this.slippagePct),i=r.assetIn,o=a.assetOut,l=t+s,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:i,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:i,asset_out:o,amount_out:e,max_amount_in:l,route:H.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],a=n[n.length-1],s=O.getFraction(e,this.slippagePct),i=r.assetIn,o=a.assetOut,l=e-s,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:i,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:i,asset_out:o,amount_in:t,min_amount_out:l,route:H.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],a=O.getFraction(t,this.slippagePct),s=n.assetIn,i=r.assetOut,o=t-a,l=this.api.tx.Router.sell_all({asset_in:s,asset_out:i,min_amount_out:o,route:H.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var he=require("polkadot-api");var Pe=class extends Bt{_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:a,tradeRoute:s}=this.order,i=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,he.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:0n,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",i)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:a,tradePeriod:s,tradeRoute:i}=this.order,o=O.getFraction(a,this.slippagePct),l=a-o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,he.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:l,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:a,tradePeriod:s,tradeRoute:i}=this.order,o=O.getFraction(r,this.slippagePct),l=r+o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,he.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:a,max_amount_in:l,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var Rt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new be(this.client,this.evmClient).setTrade(t)}order(t){return new Pe(this.client,this.evmClient).setOrder(t)}};var Qn=require("polkadot-api"),mn=require("@galacticcouncil/math-liquidity-mining"),D=ot(require("big.js"));var it=ot(require("big.js")),X=require("@galacticcouncil/math-liquidity-mining");var Cr="1000000000000000000",fe=class{constructor(t,e,n){this.get_account=t;this.multiCurrency=e;this.getAsset=n}async sync_global_farm(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),a=e-t.updated_at,s=this.get_account(t.id),i=r?.existential_deposit;if(!i)throw new Error("Missing reward currency asset list");let o=this.multiCurrency.free_balance(t.reward_currency,s),l=(0,it.default)(i.toString()),c=(0,it.default)(o.toString()).minus(l.lt(o.toString())?i.toString():o.toString()),m=(0,it.default)((0,X.calculate_global_farm_rewards)(t.total_shares_z.toString(),n.toString(),(0,it.default)(t.yield_per_period.toString()).mul(cn).round(0,it.default.roundDown).toFixed(),t.max_reward_per_period.toString(),a.toFixed()));if(c.lt(m)&&(m=c),m.eq(0))return t;let d=this.get_account(0);return this.multiCurrency.transfer(t.reward_currency,s,d,BigInt(m.toFixed())),{...t,accumulated_rpz:BigInt((0,X.calculate_accumulated_rps)(t.accumulated_rpz.toString(),t.total_shares_z.toString(),m.toFixed()))}}sync_yield_farm(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,X.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}}get_loyalty_multiplier(t,e){let n=(0,it.default)(1).mul(cn).round(0,it.default.roundDown).toString();if(!e)return n;let{initial_reward_percentage:r,scale_coef:a}=e;return(0,X.calculate_loyalty_multiplier)(t.toFixed(),r.toString(),a.toFixed())}async claim_rewards(t,e,n,r,a){if(e.state.type==="Terminated")return null;let s=Math.floor(r/t.blocks_per_period);if(n.updated_at===s)return null;let i=await this.sync_global_farm(t,s,a);if(!i)return null;let o=this.sync_yield_farm(e,i,s);if(!o)return null;let l=o.total_stopped-n.stopped_at_creation,c=o.updated_at-n.entered_at-l,m=this.get_loyalty_multiplier(c,o.loyalty_curve),d=BigInt((0,X.calculate_user_reward)(n.accumulated_rpvs.toString(),n.valued_shares.toString(),n.accumulated_claimed_rewards.toString(),o.accumulated_rpvs.toString(),m)),p=BigInt((0,X.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:i.reward_currency}}};var kr=(0,D.default)(365.2425).times(24).times(60).times(60),Dr=BigInt((0,D.default)(1).pow(18).toString()),Mr=6,Se=class{client;balanceClient;omnipoolAssetIds=[];constructor(t,e){this.client=t,this.balanceClient=e}async getOraclePrice(t,e){let n=[t,e].sort((a,s)=>a-s);if(t===e)return Dr;let r=await this.client.getOraclePrice(n);if(r){let{n:a,d:s}=r[0].price,i;return t<e?i=(0,mn.fixed_from_rational)(a.toString(),s.toString()):i=(0,mn.fixed_from_rational)(s.toString(),a.toString()),BigInt(i)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),r=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),a=Buffer.from([t]),s=Buffer.concat([n,r,a]),o="0x"+Buffer.concat([s,Buffer.alloc(32-s.length)]).toString("hex");return(0,Qn.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let a=(0,D.default)(r).times(t.toString()).times(e.toString()).div(18);return a.gte(n.toString())?n.toString():a.toString()}getPoolYieldPerPeriod(t,e,n,r){let a=(0,D.default)(t.toString()).times(e),s=(0,D.default)(n.toString()).times(r);return a.div(s.toString()).toString()}farmData(t,e,n){let{yieldFarm:r,globalFarm:a,priceAdjustment:s,balance:i}=t,{multiplier:o,loyalty_curve:l}=r,{blocks_per_period:c,yield_per_period:m,total_shares_z:d,max_reward_per_period:p,pending_rewards:g,accumulated_paid_rewards:b,planned_yielding_periods:y,updated_at:P,incentivized_asset:f,reward_currency:S,price_adjustment:v}=a,L=Lt(s??v,18),N=Lt(o,18),M=Lt(l?.initial_reward_percentage??0,18),U=kr.div((0,D.default)(Mr).times(c)).toString(),V;if(d<0)V=(0,D.default)(N).times(m.toString()).times(U).toString();else{let tr=this.getGlobalRewardPerPeriod(d,m,p,L),er=this.getPoolYieldPerPeriod(tr,N,d,L);V=(0,D.default)(er).times(U).toString()}let tt=g+b,Ft=p*BigInt(y),st=i.transferable+tt,xe=st-tt,Et=(0,D.default)(xe.toString()).div(p.toString()),dn=(0,D.default)(e).div(c.toString()).toString(),$n=(d>=0?Et.plus(P):Et.plus(dn)).toString(),Jn=(0,D.default)(d.toString()).div((0,D.default)(p.toString()).div(m.toString())).div(Math.pow(10,18)).times(100).times(L).toFixed(2),gn=(0,D.default)(tt.toString()).div(st.toString()).gte(.999);V=gn?"0":(0,D.default)(V).div(n?2:1).times(100).toString();let Zn=M?(0,D.default)(V).times(M).toString():void 0;return{apr:V,minApr:Zn,isDistributed:gn,estimatedEndPeriod:$n,maxRewards:Ft,incentivizedAsset:f,rewardCurrency:S,loyaltyCurve:l,currentPeriod:dn,potMaxRewards:st,fullness:Jn}}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:a,value:s})=>{let[,i]=a,o=s,l=await this.client.getOmnipoolGlobalFarm(i),c=await this.client.getOmnipoolYieldFarm(Number(t),i,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(i),g=await this.getOraclePrice(m,d),b=await this.balanceClient.getTokenBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:b}}));return n?r.map(a=>a?this.farmData(a,n):void 0):[]}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:a,value:s})=>{let[,i]=a,o=s,l=await this.client.getIsolatedGlobalFarm(i),c=await this.client.getIsolatedYieldFarm(t,i,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(i,!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(a=>a?this.farmData(a,n,!0):void 0):[]}async getDepositReward(t,e,n,r){let a=e.global_farm_id,s=e.yield_farm_id,i=n?await this.client.getIsolatedYieldFarm(t,a,s):await this.client.getOmnipoolYieldFarm(Number(t),a,s),o=n?await this.client.getIsolatedGlobalFarm(a):await this.client.getOmnipoolGlobalFarm(a);if(!o||!i)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 Lr(this.balanceClient,m)(),p=await this.getOraclePrice(l,c),g=new pn(m,d),y=await new fe(f=>this.getFarmAddress(f),g,f=>this.client.getAsset(f)).claim_rewards(o,i,e,r,p??o.price_adjustment);if(!y)return;let P=await this.client.getAsset(y.assetId);if(P&&!(y.reward<=P.existential_deposit))return y}},cn=(0,D.default)(10).pow(18),un="0",Lr=(u,t)=>async()=>{let[e,n]=await Promise.all([Promise.all(t.filter(([a,s])=>s.toString()!==un).map(([a,s])=>u.getTokenBalance(a,s))),Promise.all(t.filter(([a,s])=>s.toString()===un).map(([a])=>u.getSystemBalance(a)))]),r=[];for(let a=0,s=0;a+s<t.length;){let i=a+s,[,o]=t[i];o.toString()===un?(r.push(n[s]),s+=1):(r.push(e[a]),a+=1)}return r},pn=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,a]=t[n];this.result.set(this.getKey(a,r),e[n].free)}}free_balance(t,e){return this.result.get(this.getKey(t,e))??0n}transfer(t,e,n,r){let a=this.getKey(t,e),s=this.getKey(t,n),i=this.result.get(a)??0n,o=this.result.get(s)??0n;if(i<r)throw new Error("Attempting to transfer more than is present");this.result.set(a,i+r),this.result.set(s,o+r)}};var Te=require("polkadot-api"),we=class extends C{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 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 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)}};async function qr(u){let t=new St(u),e=new Ht(u),[n,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),a=new vt(u,e).withAave().withOmnipool().withStableswap().withXyk(),s=new ct(e),i=new At(a),o=new _t(i,{blockTime:n,minBudgetInNative:r}),l=new z(u),c=new ie(u),m=new ae(c,l),d=new we(u),p=new Se(d,l);return{api:{aave:s,router:i,scheduler:o,staking:m,farm:p},client:{asset:new ft(u),balance:l,evm:e},ctx:{pool:a},tx:new Rt(u,e),destroy:()=>{a.destroy()}}}0&&(module.exports={aave,api,big,client,const:null,createSdkContext,erc20,error,evm,fmt,h160,json,math,pool,sor,staking,tx,xc});