@galacticcouncil/sdk-next 0.5.0-pr169-c8f4f7a → 0.5.0-pr188-e2622c3

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 An=Object.create;var zt=Object.defineProperty;var Bn=Object.getOwnPropertyDescriptor;var _n=Object.getOwnPropertyNames;var Rn=Object.getPrototypeOf,Fn=Object.prototype.hasOwnProperty;var Ve=(c,t)=>()=>(c&&(t=c(c=0)),t);var O=(c,t)=>{for(var e in t)zt(c,e,{get:t[e],enumerable:!0})},jt=(c,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of _n(t))!Fn.call(c,r)&&r!==e&&zt(c,r,{get:()=>t[r],enumerable:!(n=Bn(t,r))||n.enumerable});return c},ut=(c,t,e)=>(jt(c,t,"default"),e&&jt(e,t,"default")),At=(c,t,e)=>(e=c!=null?An(Rn(c)):{},jt(t||!c||!c.__esModule?zt(e,"default",{value:c,enumerable:!0}):e,c)),En=c=>jt(zt({},"__esModule",{value:!0}),c);var Bt={};var je=Ve(()=>{ut(Bt,require("@polkadot-api/ws-provider/node"))});var _t={};var ze=Ve(()=>{ut(_t,require("@polkadot-api/ws-provider/web"))});var mr={};O(mr,{aave:()=>ve,api:()=>ce,big:()=>y,client:()=>Ae,const:()=>fe,createSdkContext:()=>cr,erc20:()=>st,error:()=>_e,evm:()=>be,fmt:()=>h,h160:()=>Et,json:()=>nt,math:()=>B,pool:()=>ke,sor:()=>Ne,tx:()=>He,xc:()=>we});module.exports=En(mr);var ce={};O(ce,{Papi:()=>q,getWs:()=>Dn});var Xe=require("@galacticcouncil/descriptors");function Ye(c){switch(c){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var q=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(Xe.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Ye(n)&&console.log(t,...e)}};var Ke=require("polkadot-api"),Qe=require("polkadot-api/polkadot-sdk-compat"),Dn=async c=>{let t=typeof c=="string"?c.split(","):c,r=(typeof window>"u"?(await Promise.resolve().then(()=>(je(),Bt))).getWsProvider:(await Promise.resolve().then(()=>(ze(),_t))).getWsProvider)(t);return(0,Ke.createClient)((0,Qe.withPolkadotSdkCompat)(r))};var ve={};O(ve,{AAVE_GAS_LIMIT:()=>de,AAVE_LENDING_POOL_ADDRESS:()=>$t,AAVE_POOL_ABI:()=>me,AAVE_POOL_DATA_PROVIDER:()=>Qt,AAVE_POOL_DATA_PROVIDER_ABI:()=>Kt,AAVE_POOL_PROXY:()=>pe,AAVE_ROUNDING_THRESHOLD:()=>Ar,AAVE_UINT_256_MAX:()=>Cn,AaveClient:()=>Rt,AaveUtils:()=>it});var me=[{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 Kt=[{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 pe="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Qt="0x112b087b60C1a166130d59266363C45F8aa99db0",$t="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",de=1000000n,Ar=5,Cn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var be={};O(be,{EvmClient:()=>N,evmMainnet:()=>ge});var Ze=require("viem"),$e=["https://hydration-rpc.n.dwellir.com","https://hydration.dotters.network","https://rpc.helikon.io/hydradx","https://hydration.ibp.network","https://rpc.cay.hydration.cloud","https://rpc.parm.hydration.cloud","https://rpc.roach.hydration.cloud","https://rpc.zipp.hydration.cloud","https://rpc.sin.hydration.cloud","https://rpc.coke.hydration.cloud"],Je=["wss://hydration-rpc.n.dwellir.com","wss://hydration.dotters.network","wss://rpc.helikon.io/hydradx","wss://hydration.ibp.network","wss://rpc.cay.hydration.cloud","wss://rpc.parm.hydration.cloud","wss://rpc.roach.hydration.cloud","wss://rpc.zipp.hydration.cloud","wss://rpc.sin.hydration.cloud","wss://rpc.coke.hydration.cloud"],ge=(0,Ze.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{public:{http:$e,webSocket:Je},default:{http:$e,webSocket:Je}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});var X=require("viem");var N=class{chain;constructor(t){this.chain=t||ge}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}async getGasPrice(){return this.getProvider().getGasPrice()}getProvider(){return(0,X.createPublicClient)({chain:this.chain,transport:(0,X.http)()})}getWsProvider(){return(0,X.createPublicClient)({chain:this.chain,transport:(0,X.webSocket)()})}getSigner(t){return(0,X.createWalletClient)({account:t,chain:this.chain,transport:(0,X.custom)(window.ethereum)})}};var Rt=class{evmClient;constructor(t){this.evmClient=t??new N}async getReservesData(){return await this.evmClient.getProvider().readContract({abi:Kt,address:Qt,args:[$t],functionName:"getReservesData"})}async getUserReservesData(t){return await this.evmClient.getProvider().readContract({abi:Kt,address:Qt,args:[$t,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.evmClient.getProvider().readContract({abi:me,address:pe,args:[t],functionName:"getUserAccountData"})}};var y={};O(y,{asBigInt:()=>Ln,toBigInt:()=>Mn,toDecimal:()=>kn});var et=At(require("big.js"));et.default.NE=-18;function kn(c,t,e=6,n){let r=(0,et.default)(c.toString()),s=(0,et.default)(10).pow(t);return r.div(s).round(e,n).toString()}function Mn(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 Ln(c){return BigInt(c.round(0,et.default.roundDown).toFixed(0))}var st={};O(st,{ERC20:()=>ye});var ye=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 h={};O(h,{fromPermill:()=>Gn,shiftNeg:()=>Ft,toDecimals:()=>Nn,toPct:()=>qn});var en=At(require("big.js")),tn=1e3;function qn(c){let[t,e]=c;return t/e*100}function Nn(c){let[t,e]=c;return t/e}function Gn(c){return[c/tn,tn]}function Ft(c,t){let e=(0,en.default)(typeof c=="bigint"?c.toString():c);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Et={};O(Et,{H160:()=>Se,isEvmAccount:()=>nn,isEvmAddress:()=>rn,isSs58Address:()=>sn});var mt=require("polkadot-api"),Te=require("@polkadot-api/utils"),J=require("buffer");var fe={};O(fe,{HUB_ASSET_ID:()=>Pe,HYDRATION_OMNIPOOL_ADDRESS:()=>Un,HYDRATION_PARACHAIN_ID:()=>Hn,HYDRATION_SS58_PREFIX:()=>G,RUNTIME_DECIMALS:()=>E,SYSTEM_ASSET_DECIMALS:()=>he,SYSTEM_ASSET_ID:()=>$,TRADEABLE_DEFAULT:()=>ct});var E=18,$=0,he=12,Hn=2034,G=63,Un="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Pe=1,ct=15;var xe="ETH\0";function nn(c){if(!c)return!1;try{let t=(0,mt.AccountId)().enc(c),e=J.Buffer.from(xe);return J.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function rn(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function sn(c){try{return(0,mt.AccountId)(63).enc(c),!0}catch{return!1}}var Se=class c{static toAccount=t=>{let e=J.Buffer.from(t.slice(2),"hex"),n=J.Buffer.from(xe),r=Uint8Array.from(J.Buffer.concat([n,e,J.Buffer.alloc(8)])),s=(0,Te.toHex)(r);return(0,mt.AccountId)(63).dec(s)};static fromAccount=t=>{let e=(0,mt.AccountId)().enc(t),n=J.Buffer.from(xe),r=e.slice(n.length,-8);return"0x"+J.Buffer.from(r).toString("hex")};static fromSS58=t=>{let n=(0,mt.AccountId)().enc(t).slice(0,20);return(0,Te.toHex)(n)};static fromAny=t=>{if(rn(t))return t;if(nn(t))return c.fromAccount(t);if(sn(t))return c.fromSS58(t);throw new Error("Unknown address type")}};var nt={};O(nt,{findNestedKey:()=>Wn,findNestedObj:()=>Vn,jsonFormatter:()=>Yn});var Wn=(c,t)=>{let e=[];return JSON.stringify(c,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},Vn=(c,t,e)=>{let n;return JSON.stringify(c,(r,s)=>(s&&s[t]===e&&(n=s),s)),n},Yn=(c,t)=>typeof t=="bigint"?t.toString():t;var B={};O(B,{calculateBuyFee:()=>Kn,calculateDiffToAvg:()=>Xn,calculateDiffToRef:()=>jn,calculateSellFee:()=>zn,getFraction:()=>Qn});var z=At(require("big.js"));function Xn(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 jn(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 zn(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 Kn(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 Qn(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 we={};O(we,{convertToId:()=>$n});var an=require("buffer");function $n(c){let e=an.Buffer.from(c.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Jt}=st,{H160:Ie}=Et,Jn=1.01,Zn=99999,tr=10n**27n,er=10n**18n,it=class{client;constructor(t){let e=t??new N;this.client=new Rt(e)}async getSummary(t){let e=Ie.fromAny(t),[n,r,s]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[i]=n,[a,o]=r,[l,u,d,m,p,g]=s,P=y.toDecimal(g,18),b=[];for(let S of a){let f=S.underlyingAsset.toLowerCase(),T=i.find(({underlyingAsset:rt})=>rt.toLowerCase()===f);if(!T)throw new Error("Missing pool reserve for "+f);let I=S.scaledATokenBalance,v=T.liquidityIndex,C=T.priceInMarketReferenceCurrency,k=I*v/tr,Y=Number(o===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,tt=T.usageAsCollateralEnabled&&S.usageAsCollateralEnabledOnUser&&S.scaledATokenBalance>0n,vt=Jt.toAssetId(f);b.push({aTokenBalance:k,decimals:Number(T.decimals),isCollateral:tt,priceInRef:C,reserveId:vt,reserveAsset:f,reserveLiquidationThreshold:Y})}return{healthFactor:Number(P),totalCollateral:l,totalDebt:u,reserves:b}}async hasBorrowPositions(t){let e=Ie.fromAny(t),n=await this.client.getUserAccountData(e),[r,s]=n;return s>0n}async getHealthFactor(t){let e=Ie.fromAny(t),n=await this.client.getUserAccountData(e),[r,s,i,a,o,l]=n,u=y.toDecimal(l,18);return Number(u)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:r,totalDebt:s,reserves:i}=await this.getSummary(t),a=Jt.fromAssetId(e),o=i.find(b=>b.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,isCollateral:u,priceInRef:d,reserveLiquidationThreshold:m}=o,p=y.toBigInt(n,l),g=u?p*d/10n**BigInt(l):0n,P=r-g;return P<=0n?0:this.calculateHealthFactor(P,m,s)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:s,reserves:i}=await this.getSummary(t),a=Jt.fromAssetId(e),o=i.find(P=>P.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,priceInRef:u,reserveLiquidationThreshold:d}=o,p=y.toBigInt(n,l)*u/10n**BigInt(l),g=r+p;return g<=0n?0:this.calculateHealthFactor(g,d,s)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:r,reserves:s}=await this.getSummary(t),i=Jt.fromAssetId(e),a=s.find(o=>o.reserveAsset===i);if(!a)throw new Error("Missing reserve ctx for "+i);return this.calculateWithdrawMax(a,n,r)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:r}=await this.getSummary(t),s={};for(let i of r){let a=this.calculateWithdrawMax(i,e,n);i.reserveId&&(s[i.reserveId]=a)}return s}calculateHealthFactor(t,e,n){if(n===0n)return Zn;let r=10n**6n,s=y.toBigInt(e,18),i=t*s*r,a=n*er,o=i/a;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let r=y.toBigInt(t,18),s=y.toBigInt(e,18);return(r*n+s-1n)/s}calculateWithdrawMax(t,e,n){let{aTokenBalance:r,decimals:s,priceInRef:i,reserveLiquidationThreshold:a}=t,o=this.calculateRequiredCollateral(Jn,a,n),l=e-o;if(l<=0n)return{amount:0n,decimals:s};let u=l*10n**BigInt(s)/i;return{amount:r<u?r:u,decimals:s}}};var Ae={};O(Ae,{AssetClient:()=>pt,BalanceClient:()=>H,ChainParams:()=>dt,LiquidityMining:()=>Zt});var pt=class extends q{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(t){super(t)}async queryShares(){let e=await this.api.query.Stableswap.Pools.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[s]=n;return[s,r]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[s]=n;return[s,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[s]=n;return[s,r]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[s]=n;return[s,r]}))}async mapToken(t,e,n,r){let{name:s,asset_type:i,is_sufficient:a,existential_deposit:o}=e,{symbol:l,decimals:u}=n.get(t)??{};return{id:t,name:s?.asText(),symbol:l,decimals:u,icon:l,type:i.type,isSufficient:a,location:r,existentialDeposit:o}}async mapBond(t,e,n,r){let[s,i]=r,{asset_type:a,is_sufficient:o,existential_deposit:l}=e,{symbol:u,decimals:d}=await this.mapToken(s,e,n),m=Number(i),p=new Intl.DateTimeFormat("en-GB"),g=[u,"Bond",p.format(m)].join(" ");return{id:t,name:g,symbol:u+"b",decimals:d,icon:u,type:a.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:s,maturity:m}}async mapShares(t,e,n,r){let{assets:s}=r,{name:i,symbol:a,asset_type:o,is_sufficient:l,existential_deposit:u}=e,d=await Promise.all(s.map(async g=>{let{symbol:P}=await this.mapToken(g,e,n);return[g,P]})),m=Object.fromEntries(d),p=Object.values(m);return{id:t,name:p.join(", "),symbol:a?.asText()||i?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:m}}async mapExternal(t,e,n,r){let s=await this.mapToken(t,e,new Map,r),i=n?.find(a=>a.internalId===s.id);return i?{...s,decimals:i.decimals,name:i.name,symbol:i.symbol,icon:i.symbol,isWhiteListed:i.isWhiteListed}:s}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,s,i]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),a=this.parseMetadata(n),o=[];for(let[l,u]of Array.from(n)){let d=r.get(l),{asset_type:m}=u,p;switch(m.type){case"Bond":let g=i.get(l);p=await this.mapBond(l,u,a,g);break;case"StableSwap":let P=s.get(l);p=await this.mapShares(l,u,a,P);break;case"External":p=await this.mapExternal(l,u,e,d);break;default:p=await this.mapToken(l,u,a,d)}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 w=require("rxjs");var H=class extends q{constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getTokenBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:{free:n,frozen:r}}=await e.getValue(t);return n-r}async getTokenBalance(t,e){let n=this.api.query.Tokens.Accounts,{free:r,frozen:s}=await n.getValue(t,e);return r-s}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)(s=>s.flat()),(0,w.startWith)([]),(0,w.bufferCount)(2,1),(0,w.map)(([s,i],a)=>{if(a===0)return i;let o=s.reduce((u,d)=>(u.set(d.id,d.amount),u),new Map);return i.filter(u=>u.amount!==o.get(u.id))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,w.map)(n=>{let{free:r,frozen:s}=n.data;return{id:0,amount:r-s}}))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,w.map)(r=>{let{free:s,frozen:i}=r;return{id:e,amount:s-i}}))}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(s=>{let[i,a]=s.args;r.push({id:a,amount:0n})}),n?.upserted.forEach(s=>{let[i,a]=s.args,{free:o,frozen:l}=s.value;r.push({id:a,amount:o-l})}),r}))}subscribeErc20Balance(t,e){let n=new w.Subject,r=n.pipe((0,w.shareReplay)(1)),s=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}),i=async()=>{let o=e||await s(),l=async()=>{let m=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,amount:g}));n.next(m)};await l();let u=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>u.unsubscribe()},a;return i().then(o=>a=o),r.pipe((0,w.finalize)(()=>a?.()),(0,w.pairwise)(),(0,w.map)(([o,l],u)=>{if(u===0)return l;let d=o.reduce((p,g)=>(p.set(g.id,g.amount),p),new Map);return l.filter(p=>p.amount!==d.get(p.id))}),(0,w.distinctUntilChanged)((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let{free:n,frozen:r}=await this.api.apis.CurrenciesApi.account(e,t);return n-r}};var dt=class extends q{_minOrderBudget;_blockTime;constructor(t){super(t)}async getBlockTime(){if(this._blockTime===void 0){let t=await this.api.constants.Aura.SlotDuration();this._blockTime=Number(t)}return this._blockTime}async getMinOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=await this.api.constants.DCA.MinBudgetInNativeCurrency()),this._minOrderBudget}};var gt=require("polkadot-api"),Oe=require("@galacticcouncil/math-liquidity-mining"),M=At(require("big.js"));var nr=BigInt((0,M.default)(1).pow(18).toString()),rr=6,Zt=class extends q{balanceClient;omnipoolAssetIds=[];secondsInYear=(0,M.default)(365.2425).times(24).times(60).times(60);constructor(t){super(t),this.balanceClient=new H(t)}async getOraclePrice(t,e){let n=[t,e].sort((s,i)=>s-i);if(t===e)return nr;let r=await this.api.query.EmaOracle.Oracles.getValue(gt.Binary.fromText("omnipool"),n,(0,gt.Enum)("TenMinutes"));if(r){let{n:s,d:i}=r[0].price,a;return t<e?a=(0,Oe.fixed_from_rational)(s.toString(),i.toString()):a=(0,Oe.fixed_from_rational)(i.toString(),s.toString()),BigInt(a)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),r=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),s=Buffer.from([t]),i=Buffer.concat([n,r,s]),o="0x"+Buffer.concat([i,Buffer.alloc(32-i.length)]).toString("hex");return(0,gt.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let s=(0,M.default)(r).times(t.toString()).times(e.toString()).div(18);return s.gte(n.toString())?n.toString():s.toString()}getPoolYieldPerPeriod(t,e,n,r){let s=(0,M.default)(t.toString()).times(e),i=(0,M.default)(n.toString()).times(r);return s.div(i.toString()).toString()}farmData(t,e,n){let{yieldFarm:r,globalFarm:s,priceAdjustment:i,balance:a}=t,{multiplier:o,loyalty_curve:l}=r,{blocks_per_period:u,yield_per_period:d,total_shares_z:m,max_reward_per_period:p,pending_rewards:g,accumulated_paid_rewards:P,planned_yielding_periods:b,updated_at:S,incentivized_asset:f,reward_currency:T,price_adjustment:I}=s,v=Ft(i??I,18),C=Ft(o,18),k=Ft(l?.initial_reward_percentage??0,18),V=this.secondsInYear.div((0,M.default)(rr).times(u)).toString(),Y;if(m<0)Y=(0,M.default)(C).times(d.toString()).times(V).toString();else{let vn=this.getGlobalRewardPerPeriod(m,d,p,v),On=this.getPoolYieldPerPeriod(vn,C,m,v);Y=(0,M.default)(On).times(V).toString()}let tt=g+P,vt=p*BigInt(b),rt=a+tt,ue=rt-tt,Ot=(0,M.default)(ue.toString()).div(p.toString()),Ue=(0,M.default)(e).div(u.toString()).toString(),Sn=(m>=0?Ot.plus(S):Ot.plus(Ue)).toString(),wn=(0,M.default)(m.toString()).div((0,M.default)(p.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(v).toFixed(2),We=(0,M.default)(tt.toString()).div(rt.toString()).gte(.999);Y=We?"0":(0,M.default)(Y).div(n?2:1).times(100).toString();let In=k?(0,M.default)(Y).times(k).toString():void 0;return{apr:Y,minApr:In,isDistributed:We,estimatedEndPeriod:Sn,maxRewards:vt,incentivizedAsset:f,rewardCurrency:T,loyaltyCurve:l,currentPeriod:Ue,potMaxRewards:rt,fullness:wn}}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,s=await Promise.all(e.map(async({keyArgs:i,value:a})=>{let[,o]=i,l=a,u=await this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(o),d=await this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(Number(t),o,l);if(!u||!d)return;let m=u.reward_currency,p=u.incentivized_asset,g=this.getFarmAddress(o),P=await this.getOraclePrice(m,p),b=await this.balanceClient.getTokenBalance(g,m);return{id:t,globalFarm:u,yieldFarm:d,priceAdjustment:P,balance:b}}));return r?s.map(i=>i?this.farmData(i,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,s=await Promise.all(e.map(async({keyArgs:i,value:a})=>{let[,o]=i,l=a,u=await this.api.query.XYKWarehouseLM.GlobalFarm.getValue(o),d=await this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,o,l);if(!u||!d)return;let m=u.reward_currency,p=u.incentivized_asset,g=this.getFarmAddress(o,!0),P=await this.getOraclePrice(m,p),b=await this.balanceClient.getBalance(g,m);return{id:t,globalFarm:u,yieldFarm:d,priceAdjustment:P,balance:b,farmAddress:g}}));return r?s.map(i=>i?this.farmData(i,r,!0):void 0):[]}};var _e={};O(_e,{AssetNotFound:()=>Be,PoolNotFound:()=>Dt,RouteNotFound:()=>bt});var Be=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},Dt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},bt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var ke={};O(ke,{PoolContextProvider:()=>ft,PoolError:()=>at,PoolFactory:()=>Pt,PoolType:()=>D,aave:()=>Ce,lbp:()=>Re,omni:()=>Fe,stable:()=>Ee,xyk:()=>De});var Re={};O(Re,{LbpMath:()=>j,LbpPool:()=>Ct,LbpPoolClient:()=>kt});var K=require("@galacticcouncil/math-lbp"),j=class{static getSpotPrice(t,e,n,r,s){return(0,K.get_spot_price)(t,e,n,r,s)}static calculateInGivenOut(t,e,n,r,s){return(0,K.calculate_in_given_out)(t,e,n,r,s)}static calculateOutGivenIn(t,e,n,r,s){return(0,K.calculate_out_given_in)(t,e,n,r,s)}static calculateLinearWeights(t,e,n,r,s){return(0,K.calculate_linear_weights)(t,e,n,r,s)}static calculatePoolTradeFee(t,e,n){return(0,K.calculate_pool_trade_fee)(t,e,n)}};var D=(s=>(s.Aave="Aave",s.LBP="LBP",s.Omni="Omnipool",s.Stable="Stableswap",s.XYK="XYK",s))(D||{}),at=(s=>(s.InsufficientTradingAmount="InsufficientTradingAmount",s.MaxInRatioExceeded="MaxInRatioExceeded",s.MaxOutRatioExceeded="MaxOutRatioExceeded",s.TradeNotAllowed="TradeNotAllowed",s.UnknownError="UnknownError",s))(at||{});var Ct=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,s,i,a){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s,this.fee=i,this.repayFeeApply=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:s.balance,decimalsIn:r.decimals,decimalsOut:s.decimals,weightIn:r.weight,weightOut:s.weight}}validateAndBuy(t,e,n){let r=this.tokens[0].id,s=[];e<this.minTradingLimit&&s.push("InsufficientTradingAmount");let i=t.balanceOut/this.maxOutRatio;if(e>i&&s.push("MaxOutRatioExceeded"),r===t.assetOut){let a=this.calculateTradeFee(e,n),o=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+a,u=this.calculateInGivenOut(t,l),d=t.balanceIn/this.maxInRatio;return u>d&&s.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:s}}else{let a=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return a>o&&s.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:s}}}validateAndSell(t,e,n){let r=this.tokens[0].id,s=[];e<this.minTradingLimit&&s.push("InsufficientTradingAmount");let i=t.balanceIn/this.maxInRatio;if(e>i&&s.push("MaxInRatioExceeded"),r===t.assetIn){let a=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return a>o&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:s}}else{let a=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(a,n),l=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),u=a-o,d=t.balanceOut/this.maxOutRatio;return u>d&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:u,feePct:l,errors:s}}}calculateInGivenOut(t,e){let n=j.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=j.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=j.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=j.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=j.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};var ln=require("polkadot-api"),ot=require("rxjs");var on=(c,t=new Map)=>e=>{let n;return t.has(e)?t.get(e):(t.set(e,n=c(e)),n)};var A=require("rxjs");var U=class extends H{override=[];mem=0;memPools=on(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t){super(t)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=(0,A.from)(this.getPoolsMem()).pipe((0,A.switchMap)(e=>this.subscribe(e)),(0,A.combineLatestAll)());return(0,A.firstValueFrom)(t)}getSubscriber(){return(0,A.from)(this.getPoolsMem()).pipe((0,A.switchMap)(t=>this.subscribe(t)),(0,A.mergeAll)())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>(0,A.combineLatest)([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe((0,A.debounceTime)(250),(0,A.map)(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return(0,A.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(s=>s.type==="Erc20").map(s=>s.id),r=this.subscribeErc20Balance(t.address,n);e.push(r)}return(0,A.combineLatest)(e).pipe((0,A.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 s=this.override.find(a=>a.id===e),i=!!n||!!s?.decimals;return r>0n&&i})}updatePool=(t,e)=>{let n=t.tokens.map(r=>{let s=e.find(a=>a.id===r.id),i=this.override.find(a=>a.id===r.id);return s?{...r,balance:s.amount,decimals:r.decimals||i?.decimals}:{...r,decimals:r.decimals||i?.decimals}});return{...t,tokens:n}}};var kt=class extends U{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,s=t.filter(({value:i})=>e&&this.isActivePool(i,r)).map(async({keyArgs:i,value:a})=>{let[o]=i,l=o.toString(),u=await this.getPoolDelta(l,a,r);return{address:l,type:"LBP",fee:a.fee,...u,...n}});return Promise.all(s)}async getPoolDelta(t,e,n){let{start:r,end:s,assets:i,initial_weight:a,final_weight:o,repay_target:l,fee_collector:u}=e,d=j.calculateLinearWeights(r?r.toString():"0",s?s.toString():"0",a.toString(),o.toString(),n.toString()),[m,p]=i,g=BigInt(d),P=this.MAX_FINAL_WEIGHT-BigInt(g),[b,S,f,T,I]=await Promise.all([this.isRepayFeeApplied(m,l,u.toString()),this.getBalance(t,m),this.api.query.AssetRegistry.Assets.getValue(m),this.getBalance(t,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:b,tokens:[{id:m,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:S,weight:g,type:f?.asset_type.type},{id:p,decimals:I?.decimals,existentialDeposit:I?.existential_deposit,balance:T,weight:P,type:I?.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)<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(ln.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,ot.switchMap)(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):(0,ot.of)(t)),(0,ot.map)(r=>Object.assign({},t,r))):(0,ot.of)(t)}};var Fe={};O(Fe,{OmniMath:()=>_,OmniPool:()=>Mt,OmniPoolClient:()=>qt});var x=require("@galacticcouncil/math-omnipool"),lt=At(require("big.js")),_=class{static calculateSpotPrice(t,e,n,r){return(0,x.calculate_spot_price)(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return(0,x.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,r,s,i,a,o,l){return(0,x.calculate_in_given_out)(t,e,n,r,s,i,a,o,l)}static calculateLrnaInGivenOut(t,e,n,r,s){return(0,x.calculate_lrna_in_given_out)(t,e,n,r,s)}static calculateOutGivenIn(t,e,n,r,s,i,a,o,l){return(0,x.calculate_out_given_in)(t,e,n,r,s,i,a,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,s){return(0,x.calculate_out_given_lrna_in)(t,e,n,r,s)}static calculateShares(t,e,n,r){return(0,x.calculate_shares)(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,s,i,a,o){return(0,x.calculate_liquidity_out)(t,e,n,r,s,i,a,o)}static calculateLiquidityLRNAOut(t,e,n,r,s,i,a,o){return(0,x.calculate_liquidity_lrna_out)(t,e,n,r,s,i,a,o)}static calculateCapDifference(t,e,n,r){let s=(0,lt.default)(e),i=(0,lt.default)(t),a=(0,lt.default)(r),o=(0,lt.default)(n),l=(0,lt.default)(10).pow(18),u=o.div(l);if(s.div(a).lt(u)){let m=u.times(a).minus(s).times(i),p=s.times((0,lt.default)(1).minus(u));return m.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return(0,x.verify_asset_cap)(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return(0,x.calculate_liquidity_hub_in)(t,e,n,r)}static isSellAllowed(t){return(0,x.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,x.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,x.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,x.is_remove_liquidity_allowed)(t)}};var Mt=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,s,i){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s,this.hubAssetId=i}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:r.hubReserves,hubReservesOut:s.hubReserves,sharesIn:r.shares,sharesOut:s.shares,decimalsIn:r.decimals,decimalsOut:s.decimals,balanceIn:r.balance,balanceOut:s.balance,tradeableIn:r.tradeable,tradeableOut:s.tradeable,assetInEd:r.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),s=this.calculateInGivenOut(t,e,n),i=r===0n?0:B.calculateDiffToRef(s,r),a=[],o=_.isSellAllowed(t.tradeableIn),l=_.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&a.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&a.push("MaxOutRatioExceeded");let d=t.balanceIn/this.maxInRatio;return s>d&&a.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:r,amountOut:e,feePct:i,errors:a}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),s=this.calculateOutGivenIn(t,e,n),i=B.calculateDiffToRef(r,s),a=[],o=_.isSellAllowed(t.tradeableIn),l=_.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&a.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&a.push("MaxInRatioExceeded");let d=t.balanceOut/this.maxOutRatio;return s>d&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:s,feePct:i,errors:a}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let r=_.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0",n?h.toDecimals(n.protocolFee).toString():"0"),s=BigInt(r);return s<0n?0n:s}calculateLrnaInGivenOut(t,e,n){let r=_.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0"),s=BigInt(r);return s<0n?0n:s}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let r=_.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0",n?h.toDecimals(n.protocolFee).toString():"0"),s=BigInt(r);return s<0n?0n:s}calculateOutGivenLrnaIn(t,e,n){let r=_.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0"),s=BigInt(r);return s<0n?0n:s}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=_.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=_.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=_.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=_.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var te=require("polkadot-api"),un=require("@polkadot-api/utils"),Lt=require("rxjs");var qt=class extends U{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,r,s,i,a]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:u,value:d})=>{let[m]=u,{hub_reserve:p,shares:g,tradable:P,cap:b,protocol_shares:S}=d,[f,T]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(m),this.getBalance(e,m)]);return{id:m,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:T,cap:b,hubReserves:p,protocolShares:S,shares:g,tradeable:P,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:i,tradeable:r,type:s?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...a}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=(0,un.toHex)(e);return(0,te.AccountId)(63).dec(n)}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t,e){let[n,r,s]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),i=n.min_fee+r.min_fee,a=n.max_fee+r.max_fee;if(s){let{asset_fee:o,protocol_fee:l}=s;return{assetFee:h.fromPermill(o),protocolFee:h.fromPermill(l),min:h.fromPermill(i),max:h.fromPermill(a)}}else return{assetFee:h.fromPermill(n.min_fee),protocolFee:h.fromPermill(r.min_fee),min:h.fromPermill(i),max:h.fromPermill(a)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(te.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,Lt.distinctUntilChanged)((n,r)=>!r.deltas),(0,Lt.map)(({entries:n})=>n.map(r=>{let[s]=r.args,{hub_reserve:i,shares:a,tradable:o,cap:l,protocol_shares:u}=r.value,d=t.tokens.findIndex(p=>p.id===s);return{...t.tokens[d],cap:l,hubReserves:i,protocolShares:u,shares:a,tradeable:o}})),(0,Lt.map)(n=>{let r=t.tokens.find(s=>s.id===1);return{...t,tokens:[...n,r]}}))}};var Ee={};O(Ee,{StableMath:()=>L,StableSwap:()=>Nt,StableSwapClient:()=>Gt});var R=require("@galacticcouncil/math-stableswap"),L=class{static getPoolAddress(t){return(0,R.pool_account_name)(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,r,s){return(0,R.calculate_amplification)(t,e,n,r,s)}static calculateInGivenOut(t,e,n,r,s,i,a){return(0,R.calculate_in_given_out)(t,e,n,r,s,i,a)}static calculateAddOneAsset(t,e,n,r,s,i,a){return(0,R.calculate_add_one_asset)(t,e,n,r,s,i,a)}static calculateSharesForAmount(t,e,n,r,s,i,a){return(0,R.calculate_shares_for_amount)(t,e,n,r,s,i,a)}static calculateOutGivenIn(t,e,n,r,s,i,a){return(0,R.calculate_out_given_in)(t,e,n,r,s,i,a)}static calculateLiquidityOutOneAsset(t,e,n,r,s,i,a){return(0,R.calculate_liquidity_out_one_asset)(t,e,n,r,s,i,a)}static calculateShares(t,e,n,r,s,i){return(0,R.calculate_shares)(t,e,n,r,s,i)}static calculateSpotPriceWithFee(t,e,n,r,s,i,a,o){return(0,R.calculate_spot_price_with_fee)(t,e,n,r,s,i,a,o)}static recalculatePegs(t,e,n,r,s){return(0,R.recalculate_peg)(t,e,n,r,s)}};var Nt=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,s,i,a,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s,this.amplification=i,this.id=a,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:s.balance,decimalsIn:r.decimals,decimalsOut:s.decimals,tradeableIn:this.id===t?15:r.tradeable,tradeableOut:this.id===e?15:s.tradeable,assetInEd:r.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),s=this.calculateInGivenOut(t,e,n),i=h.toPct(n.fee),a=[],o=_.isSellAllowed(t.tradeableIn),l=_.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&a.push("InsufficientTradingAmount"),{amountIn:s,calculatedIn:r,amountOut:e,feePct:i,errors:a}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),s=this.calculateOutGivenIn(t,e,n),i=h.toPct(n.fee),a=[],o=_.isSellAllowed(t.tradeableIn),l=_.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&a.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:r,amountOut:s,feePct:i,errors:a}}calculateIn(t,e,n){let r=L.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateAddOneAsset(t,e,n){let r=L.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateSharesForAmount(t,e,n){let r=L.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}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=L.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=L.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateWithdrawOneAsset(t,e,n){let r=L.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateShares(t,e,n){let r=L.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}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=L.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=L.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 ee=require("polkadot-api"),cn=require("@polkadot-api/utils"),mn=require("@noble/hashes/blake2b"),yt=require("rxjs");var sr=340282366920938463463374607431768211455n,Gt=class extends U{poolsData=new Map([]);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:s,value:i})=>{let[a]=s,o=this.getPoolAddress(a),[l,u]=await Promise.all([this.getPoolDelta(a,i,e),this.getPoolTokens(a,i)]);return this.poolsData.set(o,i),{address:o,id:a,type:"Stableswap",fee:h.fromPermill(i.fee),tokens:u,...l,...n}});return Promise.all(r)}async getPoolDelta(t,e,n){let{initial_amplification:r,final_amplification:s,initial_block:i,final_block:a}=e,o=L.calculateAmplification(r.toString(),s.toString(),i.toString(),a.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[o,l,u]=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:l?.decimals,existentialDeposit:l?.existential_deposit,balance:u,tradeable:o,type:l?.asset_type.type}}),s=await Promise.all(r),i=await this.api.query.AssetRegistry.Assets.getValue(t);return s.push({id:t,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:sr,tradeable:15,type:i?.asset_type.type}),s}getPoolAddress(t){let e=L.getPoolAddress(t),n=(0,mn.blake2b)(e,{dkLen:32}),r=(0,cn.toHex)(n);return(0,ee.AccountId)(63).dec(r)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolFees(t){return{fee:t.fee}}getPoolType(){return"Stableswap"}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(ee.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?(0,yt.of)(t):e.watchValue("best").pipe((0,yt.switchMap)(r=>this.getPoolDelta(t.id,n,r)),(0,yt.map)(r=>Object.assign({},t,r)))}};var De={};O(De,{XykMath:()=>Z,XykPool:()=>Ht,XykPoolClient:()=>Ut});var F=require("@galacticcouncil/math-xyk"),Z=class{static getSpotPrice(t,e,n){return(0,F.get_spot_price)(t,e,n)}static calculateInGivenOut(t,e,n){return(0,F.calculate_in_given_out)(t,e,n)}static calculateOutGivenIn(t,e,n){return(0,F.calculate_out_given_in)(t,e,n)}static calculatePoolTradeFee(t,e,n){return(0,F.calculate_pool_trade_fee)(t,e,n)}static calculateLiquidityIn(t,e,n){return(0,F.calculate_liquidity_in)(t,e,n)}static calculateSpotPrice(t,e){return(0,F.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return(0,F.calculate_spot_price_with_fee)(t,e,n,r)}static calculateShares(t,e,n){return(0,F.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return(0,F.calculate_liquidity_out_asset_a)(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return(0,F.calculate_liquidity_out_asset_b)(t,e,n,r)}};var Ht=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,s){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:r.decimals,decimalsOut:s.decimals,balanceIn:r.balance,balanceOut:s.balance,assetInEd:r.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),s=this.calculateTradeFee(r,n),i=h.toPct(n.exchangeFee),a=r+s,o=[];(e<this.minTradingLimit||r<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return a>u&&o.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:i,errors:o}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),s=this.calculateTradeFee(r,n),i=h.toPct(n.exchangeFee),a=r-s,o=[];(e<this.minTradingLimit||r<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return a>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:i,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 pn=require("polkadot-api"),dn=require("rxjs");var Ut=class extends U{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),r=e.map(async({keyArgs:s,value:i})=>{let[a]=s,[o,l]=i,[u,d,m,p]=await Promise.all([this.getBalance(a,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(a,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:a,type:"XYK",tokens:[{id:o,decimals:d?.decimals,existentialDeposit:d?.existential_deposit,balance:u,type:d?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:m,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(pn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,dn.of)(t)}};var Ce={};O(Ce,{AavePool:()=>Wt,AavePoolClient:()=>Vt});var Wt=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,s){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:s.balance,decimalsIn:r.decimals,decimalsOut:s.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),s=[];return e>t.balanceOut&&s.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),s=[];return r>t.balanceOut&&s.push("TradeNotAllowed"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:s}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};var bn=require("polkadot-api"),yn=require("@polkadot-api/utils"),ht=require("rxjs"),hn=require("viem");var gn=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:ir}=st,ar=["Supply","Withdraw","Repay","Borrow"],Vt=class extends U{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:r,liqudity_in:s,liqudity_out:i})=>{let[a,o,l,u]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(r),this.api.query.AssetRegistry.AssetLocations.getValue(r)]);return{address:this.getPoolId(n,r),type:"Aave",tokens:[{id:n,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:s,location:o,type:a?.asset_type.type},{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:i,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:s}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(i=>{let a=i.id===e.id?r:s;return{...i,balance:a}})}getPoolId(t,e){let n=t+"/"+e,r=new TextEncoder().encode(n.padEnd(32,"\0")),s=(0,yn.toHex)(r);return(0,bn.AccountId)(63).dec(s)}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),s=this.api.event.Router.Executed.watch(({asset_in:a,asset_out:o})=>a===n.id||o===n.id),i=this.api.event.EVM.Log.watch(({log:a})=>{let{topics:o,data:l}=a,u=o.map(g=>g.asHex()),d=l.asHex(),{eventName:m,args:p}=(0,hn.decodeEventLog)({abi:gn,topics:u,data:d});return ar.includes(m)&&p.reserve.toLowerCase()===r.toLowerCase()});return(0,ht.merge)([s,i]).pipe((0,ht.switchMap)(()=>this.getPoolDelta(t)),(0,ht.map)(a=>({...t,tokens:[...a]})))}getReserveH160Id(t){return t.type==="Erc20"?nt.findNestedKey(t.location,"AccountKey20").AccountKey20.key:ir.fromAssetId(t.id)}};var Pt=class{static get(t){switch(t.type){case"Aave":return Wt.fromPool(t);case"XYK":return Ht.fromPool(t);case"Omnipool":return Mt.fromPool(t);case"LBP":return Ct.fromPool(t);case"Stableswap":return Nt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var Q=require("rxjs");var ft=class extends q{lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=Q.Subscription.EMPTY;omniSub=Q.Subscription.EMPTY;stableSub=Q.Subscription.EMPTY;xykSub=Q.Subscription.EMPTY;aaveSub=Q.Subscription.EMPTY;isReady=!1;isDestroyed=new Q.Subject;constructor(t){super(t),this.lbpClient=new kt(t),this.omniClient=new qt(t),this.stableClient=new Gt(t),this.xykClient=new Ut(t),this.aaveClient=new Vt(t),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe((0,Q.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(){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let t=await Promise.all(this.clients.filter(e=>this.active.has(e.getPoolType())).map(e=>e.getPools()));return this.isReady=!0,t.flat()}async getPoolFees(t,e){let n=this.clients.find(r=>r.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new Dt(t.type)}};var Ne={};O(Ne,{Router:()=>Tt,TradeOrderError:()=>Le,TradeOrderType:()=>se,TradeRouteBuilder:()=>W,TradeRouter:()=>xt,TradeScheduler:()=>St,TradeType:()=>re});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 or=5,Yt=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=[],s=new ne,i=[];for(i.push([e,""]),s.enqueue(i);s.size()>0;){let a=s.dequeue();if(a==null||a.length>or)return r;let o=a[a.length-1];(n===null||o[0]===n)&&r.push(a),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,a)){let d=[...a];d.push(u),s.enqueue(d)}})}return r}buildAndPopulateGraph(t,e){let n=new Map;for(let r of t)n.set(parseInt(r),[]);for(let[r,s,i]of e)n.get(s)?.push([i,r]);return n}};function Me(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 s=0;s<n;s++){if(r==s)continue;let i=[e.address,e.tokens[r].id,e.tokens[s].id];t[e.tokens[r].id].push(i)}}}return t}var Xt=class{getProposals(t,e,n){let r=Me(n),s=Object.keys(r),i=s.map(u=>r[u]).flat(),a=new Yt,o=a.buildAndPopulateGraph(s,i),l=a.findPaths(o,t,e);return this.parsePaths(l)}parsePaths(t){let e=[];for(let n of t){let r=[];for(let s=0;s<n.length;s++){let i=n[s],a=n[s+1];if(a==null)break;r.push(this.toEdge(i,a))}e.push(r)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var Tt=class{routeSuggester;routerOptions;ctx;defaultRouterOptions={useOnly:[]};constructor(t,e){this.ctx=t,this.routeSuggester=new Xt,this.routerOptions={...this.defaultRouterOptions,...e}}async getPools(){let t=await this.ctx.getPools(),e=this.routerOptions.useOnly;return e.length===0?t:t.filter(n=>e.includes(n.type))}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)}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.routeSuggester.getProposals(t,e,n).filter(i=>this.validPath(i,r)).map(i=>this.toHops(i,r))}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,r)=>n&&r)}validEdge([t,e,n],r){return r.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,Pt.get(e)]))}toHops(t,e){return t.map(([n,r,s])=>{let i=e.get(n);return{poolAddress:n,poolId:i?.id,pool:i?.type,assetIn:r,assetOut:s}})}};var re=(e=>(e.Buy="Buy",e.Sell="Sell",e))(re||{}),se=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(se||{}),Le=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Le||{});var xt=class extends Tt{isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,r)=>{let s=n[n.length-1].amountOut,i=r[r.length-1].amountOut;return s>i?-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(s=>s.tradeFeeRange?.[0]??s.tradeFeePct).reduce((s,i)=>s+i),r=t.map(s=>s.tradeFeeRange?.[1]??s.tradeFeePct).reduce((s,i)=>s+i);return[n,r]}}getPoolFeeRange(t){let e=t.min?h.toPct(t.min):void 0,n=t.max?h.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}async getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetOutDecimals).reduce((a,o)=>a+o),r=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),s=n-e.assetOutDecimals,i=Math.pow(10,s);return r/BigInt(i)}async getSell(t,e,n,r){let s=await super.getPools(),i=super.validateInput(t,e,s),a=super.getPaths(t,e,s);if(a.length===0)throw new bt(t,e);let o;if(r)o=await this.toSellSwaps(n,r,i);else{let v=await Promise.all(a.map(C=>this.toSellSwaps(n,C,i)));o=this.findBestSellRoute(v)}let l=o[0],u=o[o.length-1],d=this.isDirectTrade(o),m=await this.getSellSpot(o),p=u.amountOut,g=d?u.calculatedOut:this.calculateDelta0Y(l.amountIn,o,i),P=g-p,b=this.getRouteFeeRange(o),S=d?u.tradeFeePct:B.calculateSellFee(g,p),f=Math.pow(10,l.assetInDecimals),T=l.amountIn*m/BigInt(f),I=B.calculateDiffToRef(g,T);return{type:"Sell",amountIn:l.amountIn,amountOut:u.amountOut,spotPrice:m,tradeFee:P,tradeFeePct:S,tradeFeeRange:b,priceImpactPct:I,swaps:o,toHuman(){return{type:"Sell",amountIn:y.toDecimal(l.amountIn,l.assetInDecimals),amountOut:y.toDecimal(u.amountOut,u.assetOutDecimals),spotPrice:y.toDecimal(m,u.assetOutDecimals),tradeFee:y.toDecimal(P,u.assetOutDecimals),tradeFeePct:S,tradeFeeRange:b,priceImpactPct:I,swaps:o.map(v=>v.toHuman())}}}}calculateDelta0Y(t,e,n){let r=[];for(let s=0;s<e.length;s++){let i=e[s],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;s>0?l=r[s-1]:l=t;let u=a.calculateOutGivenIn(o,l);r.push(u)}return r[r.length-1]}async toSellSwaps(t,e,n){let r=[];for(let s=0;s<e.length;s++){let i=e[s],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;s>0?l=r[s-1].amountOut:l=typeof t=="string"?y.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(a,o.assetOut),{amountOut:d,calculatedOut:m,feePct:p,errors:g}=a.validateAndSell(o,l,u),P=this.getPoolFeeRange(u),b=a.spotPriceOutGivenIn(o),S=Math.pow(10,o.decimalsIn),f=l*b/BigInt(S),T=B.calculateDiffToRef(m,f);r.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:d,calculatedOut:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===i.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===i.assetIn},toHuman(){return{...i,amountIn:y.toDecimal(l,o.decimalsIn),amountOut:y.toDecimal(d,o.decimalsOut),calculatedOut:y.toDecimal(m,o.decimalsOut),spotPrice:y.toDecimal(b,o.decimalsOut),tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g}}})}return r}async getMostLiquidRoute(t,e){let n=await super.getPools(),r=super.validateInput(t,e,n),s=super.getPaths(t,e,n),o=n.filter(m=>m.tokens.some(p=>p.id===t&&p.id!==m.id)).map(m=>m.type==="Aave"?m.tokens:m.tokens.filter(p=>p.id===t)).map(m=>m.map(p=>p.balance).reduce((p,g)=>p+g)).sort((m,p)=>p<m?-1:1)[0],l=B.getFraction(o,.1),u=await Promise.all(s.map(m=>this.toSellSwaps(l,m,r)));return this.findBestSellRoute(u).map(m=>({poolAddress:m.poolAddress,poolId:m?.poolId,pool:m.pool,assetIn:m.assetIn,assetOut:m.assetOut}))}async getSpotPrice(t,e){let n=await super.getPools(),r=super.validateInput(t,e,n),s=await this.getMostLiquidRoute(t,e),i=await this.toSellSwaps("1",s,r),a=await this.getSellSpot(i),o=i[i.length-1].assetOutDecimals;return{amount:a,decimals:o}}findBestBuyRoute(t){let e=t.sort((n,r)=>{let s=n[0].amountIn,i=r[0].amountIn;return s>i?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)}async getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetInDecimals).reduce((a,o)=>a+o),r=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),s=n-e.assetInDecimals,i=Math.pow(10,s);return r/BigInt(i)}async getBuy(t,e,n,r){let s=await super.getPools(),i=super.validateInput(t,e,s),a=super.getPaths(t,e,s);if(a.length===0)throw new bt(t,e);let o;if(r)o=await this.toBuySwaps(n,r,i);else{let v=await Promise.all(a.map(C=>this.toBuySwaps(n,C,i)));o=this.findBestBuyRoute(v)}let l=o[o.length-1],u=o[0],d=this.isDirectTrade(o),m=await this.getBuySpot(o),p=u.amountIn,g=d?u.calculatedIn:this.calculateDelta0X(l.amountOut,o,i),P=p-g,b=this.getRouteFeeRange(o),S=d?u.tradeFeePct:B.calculateBuyFee(g,p),f=Math.pow(10,l.assetOutDecimals),T=l.amountOut*m/BigInt(f),I;return g===0n?I=-100:I=B.calculateDiffToRef(T,g),{type:"Buy",amountOut:l.amountOut,amountIn:u.amountIn,spotPrice:m,tradeFee:P,tradeFeePct:S,tradeFeeRange:b,priceImpactPct:I,swaps:o,toHuman(){return{type:"Buy",amountOut:y.toDecimal(l.amountOut,l.assetOutDecimals),amountIn:y.toDecimal(u.amountIn,u.assetInDecimals),spotPrice:y.toDecimal(m,u.assetInDecimals),tradeFee:y.toDecimal(P,u.assetInDecimals),tradeFeePct:S,tradeFeeRange:b,priceImpactPct:I,swaps:o.map(v=>v.toHuman())}}}}calculateDelta0X(t,e,n){let r=[];for(let s=e.length-1;s>=0;s--){let i=e[s],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;s==e.length-1?l=t:l=r[0];let u=a.calculateInGivenOut(o,l);r.unshift(u)}return r[0]}async toBuySwaps(t,e,n){let r=[];for(let s=e.length-1;s>=0;s--){let i=e[s],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;s==e.length-1?l=typeof t=="string"?y.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let u=await this.ctx.getPoolFees(a,o.assetOut),{amountIn:d,calculatedIn:m,feePct:p,errors:g}=a.validateAndBuy(o,l,u),P=this.getPoolFeeRange(u),b=a.spotPriceInGivenOut(o),S=Math.pow(10,o.decimalsOut),f=l*b/BigInt(S),T;m===0n?T=-100:T=B.calculateDiffToRef(f,m),r.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:d,calculatedIn:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===i.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===i.assetIn},toHuman(){return{...i,amountOut:y.toDecimal(l,o.decimalsOut),amountIn:y.toDecimal(d,o.decimalsIn),calculatedIn:y.toDecimal(m,o.decimalsIn),spotPrice:y.toDecimal(b,o.decimalsIn),tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g}}})}return r}};var Pn=1000000000000000n;var qe=require("polkadot-api");var W=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:s})=>r==="Stableswap"?{pool:(0,qe.Enum)("Stableswap",s),asset_in:e,asset_out:n}:{pool:(0,qe.Enum)(r),asset_in:e,asset_out:n})}};var St=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Pn})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,r,s){let[i,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:u}=a,d=l[0],m=l[l.length-1],{assetInDecimals:p}=d,{assetOutDecimals:g}=m,P=Math.abs(u),b=this.getMinimumTradeCount(o,i),S=this.getOptimalTradeCount(P),f=s?Math.round(r/s):S,T=Math.ceil(r/b),I=Math.round(r/S),v=Math.round(r/f),C=o/BigInt(f),k=await this.router.getBestSell(t,e,C),V=o<i,Y=[];V&&Y.push("OrderTooSmall");let tt=k.amountOut*BigInt(f),vt=this.toBlockPeriod(v),rt=k.tradeFee*BigInt(f),ue=W.build(l),Ot={assetIn:t,assetOut:e,errors:Y,frequencyMin:T,frequencyOpt:I,frequency:v,tradeCount:f,tradeFee:rt,tradeImpactPct:k.priceImpactPct,tradePeriod:vt,tradeRoute:ue,type:"Dca"};return{...Ot,amountIn:o,amountOut:tt,tradeAmountIn:k.amountIn,tradeAmountOut:k.amountOut,toHuman(){return{...Ot,amountIn:y.toDecimal(o,p),amountOut:y.toDecimal(tt,g),tradeAmountIn:y.toDecimal(k.amountIn,p),tradeAmountOut:y.toDecimal(k.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),n=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let r=t+n/2n;return Number(r/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[r,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:i,swaps:a,priceImpactPct:o}=s,l=a[0],u=a[a.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),P=i/BigInt(g),b=await this.router.getBestSell(l.assetIn,u.assetOut,P),S=g===1,f=i<r,T=b.priceImpactPct<-5,I=[];f||S?I.push("OrderTooSmall"):T&&I.push("OrderImpactTooBig");let v=b.amountOut*BigInt(g),C=b.tradeFee*BigInt(g),k=W.build(a),V={assetIn:t,assetOut:e,errors:I,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:k,type:"TwapSell"};return{...V,amountIn:i,amountOut:v,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:C,toHuman(){return{...V,amountIn:y.toDecimal(i,d),amountOut:y.toDecimal(v,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(C,m)}}}}async getTwapBuyOrder(t,e,n){let[r,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:i,swaps:a,priceImpactPct:o}=s,l=a[0],u=a[a.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),P=i/BigInt(g),b=await this.router.getBestBuy(l.assetIn,u.assetOut,P),S=b.amountIn*BigInt(g),f=g===1,T=S<r,I=b.priceImpactPct<-5,v=[];T||f?v.push("OrderTooSmall"):I&&v.push("OrderImpactTooBig");let C=b.tradeFee*BigInt(g),k=W.build(a),V={assetIn:t,assetOut:e,errors:v,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:k,type:"TwapBuy"};return{...V,amountIn:S,amountOut:i,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:C,toHuman(){return{...V,amountIn:y.toDecimal(S,d),amountOut:y.toDecimal(i,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(C,d)}}}}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 He={};O(He,{TxBuilderFactory:()=>It});var Ge=require("polkadot-api");function xn(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var wt=class extends q{evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evmClient=e??new N,this.balanceClient=new H(t),this.aaveUtils=new it(this.evmClient)}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:de})}async dryRun(t,e){let n=(0,Ge.Enum)("Signed",t),r=(0,Ge.Enum)("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,e.decodedCall),a=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(a){let o=xn(a.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var ae=class extends wt{_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],s=await this.balanceClient.getBalance(this.beneficiary,r);return t>=s-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],s=n[n.length-1],i=B.getFraction(t,this.slippagePct),a=r.assetIn,o=s.assetOut,l=t+i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.buy({asset_in:a,asset_out:o,amount:e,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:a,asset_out:o,amount_out:e,max_amount_in:l,route:W.build(n)}),this.wrapTx("RouterBuy",u)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],s=n[n.length-1],i=B.getFraction(e,this.slippagePct),a=r.assetIn,o=s.assetOut,l=e-i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.sell({asset_in:a,asset_out:o,amount:t,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:a,asset_out:o,amount_in:t,min_amount_out:l,route:W.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],s=B.getFraction(t,this.slippagePct),i=n.assetIn,a=r.assetOut,o=t-s,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:a,min_amount_out:o,route:W.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var oe=require("polkadot-api");var le=class extends wt{_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:s,tradeRoute:i}=this.order,a=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,order:(0,oe.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:0n,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",a)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:s,tradePeriod:i,tradeRoute:a}=this.order,o=B.getFraction(s,this.slippagePct),l=s-o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,order:(0,oe.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",u)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:s,tradePeriod:i,tradeRoute:a}=this.order,o=B.getFraction(r,this.slippagePct),l=r+o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,order:(0,oe.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:s,max_amount_in:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",u)}};var It=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e??new N}trade(t){return new ae(this.client,this.evmClient).setTrade(t)}order(t){return new le(this.client,this.evmClient).setOrder(t)}};async function cr(c,t){let e=new dt(c),[n,r]=await Promise.all([e.getBlockTime(),e.getMinOrderBudget()]),s=t??new N,i=new ft(c).withAave().withOmnipool().withStableswap().withXyk(),a=new it(s),o=new xt(i),l=new St(o,{blockTime:n,minBudgetInNative:r});return{api:{aave:a,router:o,scheduler:l},client:{asset:new pt(c),balance:new H(c),evm:s},ctx:{pool:i},tx:new It(c,s),destroy:()=>{i.destroy()}}}0&&(module.exports={aave,api,big,client,const:null,createSdkContext,erc20,error,evm,fmt,h160,json,math,pool,sor,tx,xc});
1
+ "use strict";var wn=Object.create;var Xt=Object.defineProperty;var In=Object.getOwnPropertyDescriptor;var vn=Object.getOwnPropertyNames;var On=Object.getPrototypeOf,An=Object.prototype.hasOwnProperty;var Ue=(c,t)=>()=>(c&&(t=c(c=0)),t);var v=(c,t)=>{for(var e in t)Xt(c,e,{get:t[e],enumerable:!0})},Wt=(c,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of vn(t))!An.call(c,s)&&s!==e&&Xt(c,s,{get:()=>t[s],enumerable:!(n=In(t,s))||n.enumerable});return c},ot=(c,t,e)=>(Wt(c,t,"default"),e&&Wt(e,t,"default")),Yt=(c,t,e)=>(e=c!=null?wn(On(c)):{},Wt(t||!c||!c.__esModule?Xt(e,"default",{value:c,enumerable:!0}):e,c)),Bn=c=>Wt(Xt({},"__esModule",{value:!0}),c);var wt={};var Xe=Ue(()=>{ot(wt,require("@polkadot-api/ws-provider/node"))});var It={};var Ye=Ue(()=>{ot(It,require("@polkadot-api/ws-provider/web"))});var rs={};v(rs,{aave:()=>Se,api:()=>oe,big:()=>y,client:()=>we,const:()=>ye,createSdkContext:()=>as,erc20:()=>tt,error:()=>ve,evm:()=>pe,fmt:()=>h,h160:()=>Ot,json:()=>Z,math:()=>A,pool:()=>ke,sor:()=>qe,tx:()=>He,xc:()=>Te});module.exports=Bn(rs);var oe={};v(oe,{Papi:()=>M,getWs:()=>_n});var We=require("@galacticcouncil/descriptors");function Ve(c){switch(c){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var M=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(We.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Ve(n)&&console.log(t,...e)}};var je=require("polkadot-api"),Ke=require("polkadot-api/polkadot-sdk-compat"),_n=async c=>{let t=typeof c=="string"?c.split(","):c,s=(typeof window>"u"?(await Promise.resolve().then(()=>(Xe(),wt))).getWsProvider:(await Promise.resolve().then(()=>(Ye(),It))).getWsProvider)(t);return(0,je.createClient)((0,Ke.withPolkadotSdkCompat)(s))};var Se={};v(Se,{AAVE_GAS_LIMIT:()=>ce,AAVE_LENDING_POOL_ADDRESS:()=>zt,AAVE_POOL_ABI:()=>le,AAVE_POOL_DATA_PROVIDER:()=>Kt,AAVE_POOL_DATA_PROVIDER_ABI:()=>jt,AAVE_POOL_PROXY:()=>ue,AAVE_ROUNDING_THRESHOLD:()=>xs,AAVE_UINT_256_MAX:()=>Rn,AaveClient:()=>vt,AaveUtils:()=>et});var le=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"to",type:"address"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"interestRateMode",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"address",name:"onBehalfOf",type:"address"}],name:"borrow",outputs:[],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getUserAccountData",outputs:[{internalType:"uint256",name:"totalCollateralBase",type:"uint256"},{internalType:"uint256",name:"totalDebtBase",type:"uint256"},{internalType:"uint256",name:"availableBorrowsBase",type:"uint256"},{internalType:"uint256",name:"currentLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"ltv",type:"uint256"},{internalType:"uint256",name:"healthFactor",type:"uint256"}],stateMutability:"view",type:"function"}];var jt=[{inputs:[{internalType:"contract IEACAggregatorProxy",name:"_networkBaseTokenPriceInUsdProxyAggregator",type:"address"},{internalType:"contract IEACAggregatorProxy",name:"_marketReferenceCurrencyPriceInUsdProxyAggregator",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"ETH_CURRENCY_UNIT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MKR_ADDRESS",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_bytes32",type:"bytes32"}],name:"bytes32ToString",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"decimals",type:"uint256"},{internalType:"uint256",name:"baseLTVasCollateral",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationBonus",type:"uint256"},{internalType:"uint256",name:"reserveFactor",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabled",type:"bool"},{internalType:"bool",name:"borrowingEnabled",type:"bool"},{internalType:"bool",name:"stableBorrowRateEnabled",type:"bool"},{internalType:"bool",name:"isActive",type:"bool"},{internalType:"bool",name:"isFrozen",type:"bool"},{internalType:"uint128",name:"liquidityIndex",type:"uint128"},{internalType:"uint128",name:"variableBorrowIndex",type:"uint128"},{internalType:"uint128",name:"liquidityRate",type:"uint128"},{internalType:"uint128",name:"variableBorrowRate",type:"uint128"},{internalType:"uint128",name:"stableBorrowRate",type:"uint128"},{internalType:"uint40",name:"lastUpdateTimestamp",type:"uint40"},{internalType:"address",name:"aTokenAddress",type:"address"},{internalType:"address",name:"stableDebtTokenAddress",type:"address"},{internalType:"address",name:"variableDebtTokenAddress",type:"address"},{internalType:"address",name:"interestRateStrategyAddress",type:"address"},{internalType:"uint256",name:"availableLiquidity",type:"uint256"},{internalType:"uint256",name:"totalPrincipalStableDebt",type:"uint256"},{internalType:"uint256",name:"averageStableRate",type:"uint256"},{internalType:"uint256",name:"stableDebtLastUpdateTimestamp",type:"uint256"},{internalType:"uint256",name:"totalScaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"priceInMarketReferenceCurrency",type:"uint256"},{internalType:"address",name:"priceOracle",type:"address"},{internalType:"uint256",name:"variableRateSlope1",type:"uint256"},{internalType:"uint256",name:"variableRateSlope2",type:"uint256"},{internalType:"uint256",name:"stableRateSlope1",type:"uint256"},{internalType:"uint256",name:"stableRateSlope2",type:"uint256"},{internalType:"uint256",name:"baseStableBorrowRate",type:"uint256"},{internalType:"uint256",name:"baseVariableBorrowRate",type:"uint256"},{internalType:"uint256",name:"optimalUsageRatio",type:"uint256"},{internalType:"bool",name:"isPaused",type:"bool"},{internalType:"bool",name:"isSiloedBorrowing",type:"bool"},{internalType:"uint128",name:"accruedToTreasury",type:"uint128"},{internalType:"uint128",name:"unbacked",type:"uint128"},{internalType:"uint128",name:"isolationModeTotalDebt",type:"uint128"},{internalType:"bool",name:"flashLoanEnabled",type:"bool"},{internalType:"uint256",name:"debtCeiling",type:"uint256"},{internalType:"uint256",name:"debtCeilingDecimals",type:"uint256"},{internalType:"uint8",name:"eModeCategoryId",type:"uint8"},{internalType:"uint256",name:"borrowCap",type:"uint256"},{internalType:"uint256",name:"supplyCap",type:"uint256"},{internalType:"uint16",name:"eModeLtv",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationThreshold",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationBonus",type:"uint16"},{internalType:"address",name:"eModePriceSource",type:"address"},{internalType:"string",name:"eModeLabel",type:"string"},{internalType:"bool",name:"borrowableInIsolation",type:"bool"}],internalType:"struct IUiPoolDataProviderV3.AggregatedReserveData[]",name:"",type:"tuple[]"},{components:[{internalType:"uint256",name:"marketReferenceCurrencyUnit",type:"uint256"},{internalType:"int256",name:"marketReferenceCurrencyPriceInUsd",type:"int256"},{internalType:"int256",name:"networkBaseTokenPriceInUsd",type:"int256"},{internalType:"uint8",name:"networkBaseTokenPriceDecimals",type:"uint8"}],internalType:"struct IUiPoolDataProviderV3.BaseCurrencyInfo",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"},{internalType:"address",name:"user",type:"address"}],name:"getUserReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"uint256",name:"scaledATokenBalance",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabledOnUser",type:"bool"},{internalType:"uint256",name:"stableBorrowRate",type:"uint256"},{internalType:"uint256",name:"scaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"principalStableDebt",type:"uint256"},{internalType:"uint256",name:"stableBorrowLastUpdateTimestamp",type:"uint256"}],internalType:"struct IUiPoolDataProviderV3.UserReserveData[]",name:"",type:"tuple[]"},{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"marketReferenceCurrencyPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"networkBaseTokenPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"}];var ue="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Kt="0x112b087b60C1a166130d59266363C45F8aa99db0",zt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",ce=1000000n,xs=5,Rn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var pe={};v(pe,{EvmClient:()=>L,evmMainnet:()=>me});var Qe=require("viem"),ze=["https://hydration-rpc.n.dwellir.com","https://hydration.dotters.network","https://rpc.helikon.io/hydradx","https://hydration.ibp.network","https://rpc.cay.hydration.cloud","https://rpc.parm.hydration.cloud","https://rpc.roach.hydration.cloud","https://rpc.zipp.hydration.cloud","https://rpc.sin.hydration.cloud","https://rpc.coke.hydration.cloud"],$e=["wss://hydration-rpc.n.dwellir.com","wss://hydration.dotters.network","wss://rpc.helikon.io/hydradx","wss://hydration.ibp.network","wss://rpc.cay.hydration.cloud","wss://rpc.parm.hydration.cloud","wss://rpc.roach.hydration.cloud","wss://rpc.zipp.hydration.cloud","wss://rpc.sin.hydration.cloud","wss://rpc.coke.hydration.cloud"],me=(0,Qe.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{public:{http:ze,webSocket:$e},default:{http:ze,webSocket:$e}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});var G=require("viem");var L=class{chain;constructor(t){this.chain=t||me}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}async getGasPrice(){return this.getProvider().getGasPrice()}getProvider(){return(0,G.createPublicClient)({chain:this.chain,transport:(0,G.http)()})}getWsProvider(){return(0,G.createPublicClient)({chain:this.chain,transport:(0,G.webSocket)()})}getSigner(t){return(0,G.createWalletClient)({account:t,chain:this.chain,transport:(0,G.custom)(window.ethereum)})}};var vt=class{evmClient;constructor(t){this.evmClient=t??new L}async getReservesData(){return await this.evmClient.getProvider().readContract({abi:jt,address:Kt,args:[zt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.evmClient.getProvider().readContract({abi:jt,address:Kt,args:[zt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.evmClient.getProvider().readContract({abi:le,address:ue,args:[t],functionName:"getUserAccountData"})}};var y={};v(y,{asBigInt:()=>En,toBigInt:()=>Fn,toDecimal:()=>kn});var J=Yt(require("big.js"));J.default.NE=-18;function kn(c,t,e=6,n){let s=(0,J.default)(c.toString()),a=(0,J.default)(10).pow(t);return s.div(a).round(e,n).toString()}function Fn(c,t){let e=(0,J.default)(10).pow(t),s=(0,J.default)(c).mul(e).toFixed(0,J.default.roundDown);return BigInt(s)}function En(c){return BigInt(c.round(0,J.default.roundDown).toFixed(0))}var tt={};v(tt,{ERC20:()=>de});var de=class{static fromAssetId(t){let e=Buffer.alloc(20,0);return e[15]=1,e.writeUInt32BE(t,16),"0x"+e.toString("hex")}static toAssetId(t){let e=Buffer.from(t.replace("0x",""),"hex");return e.length!==20||!this.isAssetAddress(t)?null:e.readUInt32BE(16)}static isAssetAddress(t){let e=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(t.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(e.subarray(0,16))}};var h={};v(h,{fromPermill:()=>Mn,toDecimals:()=>Cn,toPct:()=>Dn});var Je=1e3;function Dn(c){let[t,e]=c;return t/e*100}function Cn(c){let[t,e]=c;return t/e}function Mn(c){return[c/Je,Je]}var Ot={};v(Ot,{H160:()=>fe,isEvmAccount:()=>Ze,isEvmAddress:()=>tn,isSs58Address:()=>en});var ut=require("polkadot-api"),he=require("@polkadot-api/utils"),z=require("buffer");var ye={};v(ye,{HUB_ASSET_ID:()=>be,HYDRATION_OMNIPOOL_ADDRESS:()=>qn,HYDRATION_PARACHAIN_ID:()=>Ln,HYDRATION_SS58_PREFIX:()=>V,RUNTIME_DECIMALS:()=>q,SYSTEM_ASSET_DECIMALS:()=>ge,SYSTEM_ASSET_ID:()=>K,TRADEABLE_DEFAULT:()=>lt});var q=18,K=0,ge=12,Ln=2034,V=63,qn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",be=1,lt=15;var Pe="ETH\0";function Ze(c){if(!c)return!1;try{let t=(0,ut.AccountId)().enc(c),e=z.Buffer.from(Pe);return z.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function tn(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function en(c){try{return(0,ut.AccountId)(63).enc(c),!0}catch{return!1}}var fe=class c{static toAccount=t=>{let e=z.Buffer.from(t.slice(2),"hex"),n=z.Buffer.from(Pe),s=Uint8Array.from(z.Buffer.concat([n,e,z.Buffer.alloc(8)])),a=(0,he.toHex)(s);return(0,ut.AccountId)(63).dec(a)};static fromAccount=t=>{let e=(0,ut.AccountId)().enc(t),n=z.Buffer.from(Pe),s=e.slice(n.length,-8);return"0x"+z.Buffer.from(s).toString("hex")};static fromSS58=t=>{let n=(0,ut.AccountId)().enc(t).slice(0,20);return(0,he.toHex)(n)};static fromAny=t=>{if(tn(t))return t;if(Ze(t))return c.fromAccount(t);if(en(t))return c.fromSS58(t);throw new Error("Unknown address type")}};var Z={};v(Z,{findNestedKey:()=>Nn,findNestedObj:()=>Hn,jsonFormatter:()=>Gn});var Nn=(c,t)=>{let e=[];return JSON.stringify(c,(n,s)=>(s&&s[t]&&e.push(s),s)),e[0]},Hn=(c,t,e)=>{let n;return JSON.stringify(c,(s,a)=>(a&&a[t]===e&&(n=a),a)),n},Gn=(c,t)=>typeof t=="bigint"?t.toString():t;var A={};v(A,{calculateBuyFee:()=>Xn,calculateDiffToAvg:()=>Un,calculateDiffToRef:()=>Vn,calculateSellFee:()=>Wn,getFraction:()=>Yn});var W=Yt(require("big.js"));function Un(c,t){let e=(0,W.default)(c.toString()),n=(0,W.default)(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Vn(c,t){if(t===0n)return 0;let e=(0,W.default)(c.toString()),n=(0,W.default)(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Wn(c,t){let e=(0,W.default)(c.toString()),n=(0,W.default)(t.toString());return(0,W.default)(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Xn(c,t){let e=(0,W.default)(c.toString());return(0,W.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Yn(c,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),s=BigInt(t*n);return c*s/BigInt(100*n)}var Te={};v(Te,{convertToId:()=>jn});var nn=require("buffer");function jn(c){let e=nn.Buffer.from(c.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:$t}=tt,{H160:xe}=Ot,Kn=1.01,zn=99999,$n=10n**27n,Qn=10n**18n,et=class{client;constructor(t){let e=t??new L;this.client=new vt(e)}async getSummary(t){let e=xe.fromAny(t),[n,s,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[r]=n,[i,o]=s,[l,u,d,m,p,g]=a,P=y.toDecimal(g,18),b=[];for(let S of i){let f=S.underlyingAsset.toLowerCase(),T=r.find(({underlyingAsset:ie})=>ie.toLowerCase()===f);if(!T)throw new Error("Missing pool reserve for "+f);let I=S.scaledATokenBalance,k=T.liquidityIndex,D=T.priceInMarketReferenceCurrency,C=I*k/$n,Ut=Number(o===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,Vt=T.usageAsCollateralEnabled&&S.usageAsCollateralEnabledOnUser&&S.scaledATokenBalance>0n,re=$t.toAssetId(f);b.push({aTokenBalance:C,decimals:Number(T.decimals),isCollateral:Vt,priceInRef:D,reserveId:re,reserveAsset:f,reserveLiquidationThreshold:Ut})}return{healthFactor:Number(P),totalCollateral:l,totalDebt:u,reserves:b}}async hasBorrowPositions(t){let e=xe.fromAny(t),n=await this.client.getUserAccountData(e),[s,a]=n;return a>0n}async getHealthFactor(t){let e=xe.fromAny(t),n=await this.client.getUserAccountData(e),[s,a,r,i,o,l]=n,u=y.toDecimal(l,18);return Number(u)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:s,totalDebt:a,reserves:r}=await this.getSummary(t),i=$t.fromAssetId(e),o=r.find(b=>b.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,isCollateral:u,priceInRef:d,reserveLiquidationThreshold:m}=o,p=y.toBigInt(n,l),g=u?p*d/10n**BigInt(l):0n,P=s-g;return P<=0n?0:this.calculateHealthFactor(P,m,a)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:s,totalDebt:a,reserves:r}=await this.getSummary(t),i=$t.fromAssetId(e),o=r.find(P=>P.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,priceInRef:u,reserveLiquidationThreshold:d}=o,p=y.toBigInt(n,l)*u/10n**BigInt(l),g=s+p;return g<=0n?0:this.calculateHealthFactor(g,d,a)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:s,reserves:a}=await this.getSummary(t),r=$t.fromAssetId(e),i=a.find(o=>o.reserveAsset===r);if(!i)throw new Error("Missing reserve ctx for "+r);return this.calculateWithdrawMax(i,n,s)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:s}=await this.getSummary(t),a={};for(let r of s){let i=this.calculateWithdrawMax(r,e,n);r.reserveId&&(a[r.reserveId]=i)}return a}calculateHealthFactor(t,e,n){if(n===0n)return zn;let s=10n**6n,a=y.toBigInt(e,18),r=t*a*s,i=n*Qn,o=r/i;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let s=y.toBigInt(t,18),a=y.toBigInt(e,18);return(s*n+a-1n)/a}calculateWithdrawMax(t,e,n){let{aTokenBalance:s,decimals:a,priceInRef:r,reserveLiquidationThreshold:i}=t,o=this.calculateRequiredCollateral(Kn,i,n),l=e-o;if(l<=0n)return{amount:0n,decimals:a};let u=l*10n**BigInt(a)/r;return{amount:s<u?s:u,decimals:a}}};var we={};v(we,{AssetClient:()=>ct,BalanceClient:()=>X,ChainParams:()=>mt,StakingClient:()=>pt});var ct=class extends M{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:s})=>{let[a]=n;return[a,s]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[a]=n;return[a,s]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:s}=n;return this.SUPPORTED_TYPES.includes(s.type)}).map(({keyArgs:n,value:s})=>{let[a]=n;return[a,s]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[a]=n;return[a,s]}))}async mapToken(t,e,n,s){let{name:a,asset_type:r,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:r.type,isSufficient:i,location:s,existentialDeposit:o}}async mapBond(t,e,n,s){let[a,r]=s,{asset_type:i,is_sufficient:o,existential_deposit:l}=e,{symbol:u,decimals:d}=await this.mapToken(a,e,n),m=Number(r),p=new Intl.DateTimeFormat("en-GB"),g=[u,"Bond",p.format(m)].join(" ");return{id:t,name:g,symbol:u+"b",decimals:d,icon:u,type:i.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:a,maturity:m}}async mapShares(t,e,n,s){let{assets:a}=s,{name:r,symbol:i,asset_type:o,is_sufficient:l,existential_deposit:u}=e,d=await Promise.all(a.map(async g=>{let{symbol:P}=await this.mapToken(g,e,n);return[g,P]})),m=Object.fromEntries(d),p=Object.values(m);return{id:t,name:p.join(", "),symbol:i?.asText()||r?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:m}}async mapExternal(t,e,n,s){let a=await this.mapToken(t,e,new Map,s),r=n?.find(i=>i.internalId===a.id);return r?{...a,decimals:r.decimals,name:r.name,symbol:r.symbol,icon:r.symbol,isWhiteListed:r.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,s,a,r]=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 d=s.get(l),{asset_type:m}=u,p;switch(m.type){case"Bond":let g=r.get(l);p=await this.mapBond(l,u,i,g);break;case"StableSwap":let P=a.get(l);p=await this.mapShares(l,u,i,P);break;case"External":p=await this.mapExternal(l,u,e,d);break;default:p=await this.mapToken(l,u,i,d)}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 w=require("rxjs");var X=class extends M{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:{free:n,frozen:s}}=await e.getValue(t);return n-s}async getTokenBalance(t,e){let n=this.api.query.Tokens.Accounts,{free:s,frozen:a}=await n.getValue(t,e);return s-a}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),s=this.subscribeErc20Balance(t);return(0,w.combineLatest)([e,n,s]).pipe((0,w.debounceTime)(250),(0,w.map)(a=>a.flat()),(0,w.startWith)([]),(0,w.bufferCount)(2,1),(0,w.map)(([a,r],i)=>{if(i===0)return r;let o=a.reduce((u,d)=>(u.set(d.id,d.amount),u),new Map);return r.filter(u=>u.amount!==o.get(u.id))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,w.map)(n=>{let{free:s,frozen:a}=n.data;return{id:0,amount:s-a}}))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,w.map)(s=>{let{free:a,frozen:r}=s;return{id:e,amount:a-r}}))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,w.distinctUntilChanged)((n,s)=>!s.deltas),(0,w.map)(({deltas:n})=>{let s=[];return n?.deleted.forEach(a=>{let[r,i]=a.args;s.push({id:i,amount:0n})}),n?.upserted.forEach(a=>{let[r,i]=a.args,{free:o,frozen:l}=a.value;s.push({id:i,amount:o-l})}),s}))}subscribeErc20Balance(t,e){let n=new w.Subject,s=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}),r=async()=>{let o=e||await a(),l=async()=>{let m=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,amount:g}));n.next(m)};await l();let u=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>u.unsubscribe()},i;return r().then(o=>i=o),s.pipe((0,w.finalize)(()=>i?.()),(0,w.pairwise)(),(0,w.map)(([o,l],u)=>{if(u===0)return l;let d=o.reduce((p,g)=>(p.set(g.id,g.amount),p),new Map);return l.filter(p=>p.amount!==d.get(p.id))}),(0,w.distinctUntilChanged)((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let{free:n,frozen:s}=await this.api.apis.CurrenciesApi.account(e,t);return n-s}};var mt=class extends M{_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 sn=require("api"),an=require("consts"),rn=require("@polkadot/util-crypto"),on=require("@polkadot/util"),st=require("@galacticcouncil/math-staking"),nt=Yt(require("big.js")),Jn=(0,nt.default)(10),Zn=(0,nt.default)(Jn.pow(12)),pt=class extends sn.Papi{#t="";getHydraAccountAddress(t){return(0,rn.encodeAddress)((0,on.stringToU8a)(("modl"+t).padEnd(32,"\0")),an.HYDRATION_SS58_PREFIX)}async getFreePotBalance(t){return this.#t||(this.#t=this.getHydraAccountAddress(t)),console.log(this.#t),(await this.api.query.System.Account.getValue(this.#t)).data.free}async getBlockNumber(){return await this.api.query.System.Number.getValue({at:"best"})}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:r})=>{let[i,o,l]=r;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 getStakingPosition(t){let[e,n]=await Promise.all([this.getStakingPositionsValue(t),this.getStakingVotes(t)]),s=e?.created_at,a=await n.reduce(async(r,[i,o])=>{let l=await r,u=i,d=o.amount,m=o.conviction.toString(),p=await this.getReferendumInfo(u);return p&&(p.type==="Approved"||p.type==="Rejected")&&l.push({id:u,amount:d,conviction:m}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt:s,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.getNFTCollectionId(),[n,s]=await Promise.all([this.getStaking(),this.getUniques(t,e)]),a=s.find(r=>r)?.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 getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}async getRewards(t){let e=await this.getStake(t),{potReservedBalance:n,accumulatedRewardPerStake:s,totalStake:a,stakePosition:r}=e;if(console.log(!!r),!r)return;let i=await this.getPalletId(),[o,l,u,d,m]=await Promise.all([this.getBlockNumber(),this.getFreePotBalance(i),this.getPeriodLength(),this.getUnclaimablePeriods(),this.getSixBlockSince()]);console.log(l.toString());let p=(0,nt.default)(l.toString()).minus(n.toString()),g=s.toString(),P=o.toString(),b=(0,nt.default)(P).plus(1).toString();p.gt(0)&&a>0&&(g=(0,st.calculate_accumulated_rps)(s.toString(),p.toString(),a.toString()));let S=(0,st.calculate_period_number)(u.toString(),P,m??b),f=(0,st.calculate_period_number)(u.toString(),r.createdAt?.toString()??"",m??b),T=(0,st.calculate_rewards)(g,r.rewardPerStake?.toString()??"",r.stake?.toString()??""),I=(0,nt.default)(T).plus(r.accumulatedUnpaidRewards?.toString()||"0").plus(r.accumulatedLockedRewards?.toString()||"0");if(!(0,nt.default)(S).minus(f).lte(d.toString()))return I.div(Zn).toString()}};var ve={};v(ve,{AssetNotFound:()=>Ie,PoolNotFound:()=>At,RouteNotFound:()=>dt});var Ie=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},At=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},dt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var ke={};v(ke,{PoolContextProvider:()=>ht,PoolError:()=>at,PoolFactory:()=>yt,PoolType:()=>F,aave:()=>Re,lbp:()=>Oe,omni:()=>Ae,stable:()=>Be,xyk:()=>_e});var Oe={};v(Oe,{LbpMath:()=>U,LbpPool:()=>Bt,LbpPoolClient:()=>_t});var Y=require("@galacticcouncil/math-lbp"),U=class{static getSpotPrice(t,e,n,s,a){return(0,Y.get_spot_price)(t,e,n,s,a)}static calculateInGivenOut(t,e,n,s,a){return(0,Y.calculate_in_given_out)(t,e,n,s,a)}static calculateOutGivenIn(t,e,n,s,a){return(0,Y.calculate_out_given_in)(t,e,n,s,a)}static calculateLinearWeights(t,e,n,s,a){return(0,Y.calculate_linear_weights)(t,e,n,s,a)}static calculatePoolTradeFee(t,e,n){return(0,Y.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||{}),at=(a=>(a.InsufficientTradingAmount="InsufficientTradingAmount",a.MaxInRatioExceeded="MaxInRatioExceeded",a.MaxOutRatioExceeded="MaxOutRatioExceeded",a.TradeNotAllowed="TradeNotAllowed",a.UnknownError="UnknownError",a))(at||{});var Bt=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,s,a,r,i){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a,this.fee=r,this.repayFeeApply=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==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:s.balance,balanceOut:a.balance,decimalsIn:s.decimals,decimalsOut:a.decimals,weightIn:s.weight,weightOut:a.weight}}validateAndBuy(t,e,n){let s=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let r=t.balanceOut/this.maxOutRatio;if(e>r&&a.push("MaxOutRatioExceeded"),s===t.assetOut){let i=this.calculateTradeFee(e,n),o=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+i,u=this.calculateInGivenOut(t,l),d=t.balanceIn/this.maxInRatio;return u>d&&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 s=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let r=t.balanceIn/this.maxInRatio;if(e>r&&a.push("MaxInRatioExceeded"),s===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=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),u=i-o,d=t.balanceOut/this.maxOutRatio;return u>d&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:u,feePct:l,errors:a}}}calculateInGivenOut(t,e){let n=U.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}calculateOutGivenIn(t,e){let n=U.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}spotPriceInGivenOut(t){let e=U.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=U.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=U.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};var un=require("polkadot-api"),rt=require("rxjs");var ln=(c,t=new Map)=>e=>{let n;return t.has(e)?t.get(e):(t.set(e,n=c(e)),n)};var O=require("rxjs");var N=class extends X{override=[];mem=0;memPools=ln(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t){super(t)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=(0,O.from)(this.getPoolsMem()).pipe((0,O.switchMap)(e=>this.subscribe(e)),(0,O.combineLatestAll)());return(0,O.firstValueFrom)(t)}getSubscriber(){return(0,O.from)(this.getPoolsMem()).pipe((0,O.switchMap)(t=>this.subscribe(t)),(0,O.mergeAll)())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>(0,O.combineLatest)([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe((0,O.debounceTime)(250),(0,O.map)(([n,s])=>this.updatePool(n,s))))}subscribePoolBalance(t){if(t.type==="Aave")return(0,O.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),s=this.subscribeErc20Balance(t.address,n);e.push(s)}return(0,O.combineLatest)(e).pipe((0,O.map)(n=>n.map(s=>Array.isArray(s)?s:[s]).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:s})=>{let a=this.override.find(i=>i.id===e),r=!!n||!!a?.decimals;return s>0n&&r})}updatePool=(t,e)=>{let n=t.tokens.map(s=>{let a=e.find(i=>i.id===s.id),r=this.override.find(i=>i.id===s.id);return a?{...s,balance:a.amount,decimals:s.decimals||r?.decimals}:{...s,decimals:s.decimals||r?.decimals}});return{...t,tokens:n}}};var _t=class extends N{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),s=e?.relay_parent_number||0,a=t.filter(({value:r})=>e&&this.isActivePool(r,s)).map(async({keyArgs:r,value:i})=>{let[o]=r,l=o.toString(),u=await this.getPoolDelta(l,i,s);return{address:l,type:"LBP",fee:i.fee,...u,...n}});return Promise.all(a)}async getPoolDelta(t,e,n){let{start:s,end:a,assets:r,initial_weight:i,final_weight:o,repay_target:l,fee_collector:u}=e,d=U.calculateLinearWeights(s?s.toString():"0",a?a.toString():"0",i.toString(),o.toString(),n.toString()),[m,p]=r,g=BigInt(d),P=this.MAX_FINAL_WEIGHT-BigInt(g),[b,S,f,T,I]=await Promise.all([this.isRepayFeeApplied(m,l,u.toString()),this.getBalance(t,m),this.api.query.AssetRegistry.Assets.getValue(m),this.getBalance(t,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:b,tokens:[{id:m,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:S,weight:g,type:f?.asset_type.type},{id:p,decimals:I?.decimals,existentialDeposit:I?.existential_deposit,balance:T,weight:P,type:I?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:s}=t;return n&&s?e>=n&&e<s:!1}async isRepayFeeApplied(t,e,n){if(e===0n)return!1;try{return await this.getBalance(n,t)<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t){return{repayFee:await this.getRepayFee(),exchangeFee:t.fee}}getPoolType(){return"LBP"}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(un.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe((0,rt.switchMap)(s=>s?this.getPoolDelta(t.address,n,s.relay_parent_number):(0,rt.of)(t)),(0,rt.map)(s=>Object.assign({},t,s))):(0,rt.of)(t)}};var Ae={};v(Ae,{OmniMath:()=>B,OmniPool:()=>Rt,OmniPoolClient:()=>Ft});var x=require("@galacticcouncil/math-omnipool"),it=Yt(require("big.js")),B=class{static calculateSpotPrice(t,e,n,s){return(0,x.calculate_spot_price)(t,e,n,s)}static calculateLrnaSpotPrice(t,e){return(0,x.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,s,a,r,i,o,l){return(0,x.calculate_in_given_out)(t,e,n,s,a,r,i,o,l)}static calculateLrnaInGivenOut(t,e,n,s,a){return(0,x.calculate_lrna_in_given_out)(t,e,n,s,a)}static calculateOutGivenIn(t,e,n,s,a,r,i,o,l){return(0,x.calculate_out_given_in)(t,e,n,s,a,r,i,o,l)}static calculateOutGivenLrnaIn(t,e,n,s,a){return(0,x.calculate_out_given_lrna_in)(t,e,n,s,a)}static calculateShares(t,e,n,s){return(0,x.calculate_shares)(t,e,n,s)}static calculateLiquidityOut(t,e,n,s,a,r,i,o){return(0,x.calculate_liquidity_out)(t,e,n,s,a,r,i,o)}static calculateLiquidityLRNAOut(t,e,n,s,a,r,i,o){return(0,x.calculate_liquidity_lrna_out)(t,e,n,s,a,r,i,o)}static calculateCapDifference(t,e,n,s){let a=(0,it.default)(e),r=(0,it.default)(t),i=(0,it.default)(s),o=(0,it.default)(n),l=(0,it.default)(10).pow(18),u=o.div(l);if(a.div(i).lt(u)){let m=u.times(i).minus(a).times(r),p=a.times((0,it.default)(1).minus(u));return m.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,s){return(0,x.verify_asset_cap)(t,e,n,s)}static calculateLimitHubIn(t,e,n,s){return(0,x.calculate_liquidity_hub_in)(t,e,n,s)}static isSellAllowed(t){return(0,x.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,x.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,x.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,x.is_remove_liquidity_allowed)(t)}};var Rt=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,s,a,r){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a,this.hubAssetId=r}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==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:s.hubReserves,hubReservesOut:a.hubReserves,sharesIn:s.shares,sharesOut:a.shares,decimalsIn:s.decimals,decimalsOut:a.decimals,balanceIn:s.balance,balanceOut:a.balance,tradeableIn:s.tradeable,tradeableOut:a.tradeable,assetInEd:s.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),r=s===0n?0:A.calculateDiffToRef(a,s),i=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&i.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&i.push("MaxOutRatioExceeded");let d=t.balanceIn/this.maxInRatio;return a>d&&i.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:s,amountOut:e,feePct:r,errors:i}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),r=A.calculateDiffToRef(s,a),i=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&i.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&i.push("MaxInRatioExceeded");let d=t.balanceOut/this.maxOutRatio;return a>d&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:a,feePct:r,errors:i}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let s=B.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0",n?h.toDecimals(n.protocolFee).toString():"0"),a=BigInt(s);return a<0n?0n:a}calculateLrnaInGivenOut(t,e,n){let s=B.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0"),a=BigInt(s);return a<0n?0n:a}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let s=B.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0",n?h.toDecimals(n.protocolFee).toString():"0"),a=BigInt(s);return a<0n?0n:a}calculateOutGivenLrnaIn(t,e,n){let s=B.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0"),a=BigInt(s);return a<0n?0n:a}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=B.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=B.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=B.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=B.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var Qt=require("polkadot-api"),cn=require("@polkadot-api/utils"),kt=require("rxjs");var Ft=class extends N{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,s,a,r,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:d})=>{let[m]=u,{hub_reserve:p,shares:g,tradable:P,cap:b,protocol_shares:S}=d,[f,T]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(m),this.getBalance(e,m)]);return{id:m,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:T,cap:b,hubReserves:p,protocolShares:S,shares:g,tradeable:P,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:r,tradeable:s,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,cn.toHex)(e);return(0,Qt.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,s,a]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),r=n.min_fee+s.min_fee,i=n.max_fee+s.max_fee;if(a){let{asset_fee:o,protocol_fee:l}=a;return{assetFee:h.fromPermill(o),protocolFee:h.fromPermill(l),min:h.fromPermill(r),max:h.fromPermill(i)}}else return{assetFee:h.fromPermill(n.min_fee),protocolFee:h.fromPermill(s.min_fee),min:h.fromPermill(r),max:h.fromPermill(i)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(Qt.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,kt.distinctUntilChanged)((n,s)=>!s.deltas),(0,kt.map)(({entries:n})=>n.map(s=>{let[a]=s.args,{hub_reserve:r,shares:i,tradable:o,cap:l,protocol_shares:u}=s.value,d=t.tokens.findIndex(p=>p.id===a);return{...t.tokens[d],cap:l,hubReserves:r,protocolShares:u,shares:i,tradeable:o}})),(0,kt.map)(n=>{let s=t.tokens.find(a=>a.id===1);return{...t,tokens:[...n,s]}}))}};var Be={};v(Be,{StableMath:()=>E,StableSwap:()=>Et,StableSwapClient:()=>Dt});var _=require("@galacticcouncil/math-stableswap"),E=class{static getPoolAddress(t){return(0,_.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,s,a){return(0,_.calculate_amplification)(t,e,n,s,a)}static calculateInGivenOut(t,e,n,s,a,r,i){return(0,_.calculate_in_given_out)(t,e,n,s,a,r,i)}static calculateAddOneAsset(t,e,n,s,a,r,i){return(0,_.calculate_add_one_asset)(t,e,n,s,a,r,i)}static calculateSharesForAmount(t,e,n,s,a,r,i){return(0,_.calculate_shares_for_amount)(t,e,n,s,a,r,i)}static calculateOutGivenIn(t,e,n,s,a,r,i){return(0,_.calculate_out_given_in)(t,e,n,s,a,r,i)}static calculateLiquidityOutOneAsset(t,e,n,s,a,r,i){return(0,_.calculate_liquidity_out_one_asset)(t,e,n,s,a,r,i)}static calculateShares(t,e,n,s,a,r){return(0,_.calculate_shares)(t,e,n,s,a,r)}static calculateSpotPriceWithFee(t,e,n,s,a,r,i,o){return(0,_.calculate_spot_price_with_fee)(t,e,n,s,a,r,i,o)}static recalculatePegs(t,e,n,s,a){return(0,_.recalculate_peg)(t,e,n,s,a)}};var Et=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,s,a,r,i,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a,this.amplification=r,this.id=i,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==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:s.balance,balanceOut:a.balance,decimalsIn:s.decimals,decimalsOut:a.decimals,tradeableIn:this.id===t?15:s.tradeable,tradeableOut:this.id===e?15:a.tradeable,assetInEd:s.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),r=h.toPct(n.fee),i=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&i.push("InsufficientTradingAmount"),{amountIn:a,calculatedIn:s,amountOut:e,feePct:r,errors:i}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),r=h.toPct(n.fee),i=[],o=B.isSellAllowed(t.tradeableIn),l=B.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&i.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:s,amountOut:a,feePct:r,errors:i}}calculateIn(t,e,n){let s=E.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateAddOneAsset(t,e,n){let s=E.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateSharesForAmount(t,e,n){let s=E.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);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 s=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(s)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let s=E.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateWithdrawOneAsset(t,e,n){let s=E.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateShares(t,e,n){let s=E.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);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 s=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(s)}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:s})=>({asset_id:e,amount:n,decimals:s}));return JSON.stringify(t,Z.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],Z.jsonFormatter)}};var Jt=require("polkadot-api"),mn=require("@polkadot-api/utils"),pn=require("@noble/hashes/blake2b"),gt=require("rxjs");var ts=340282366920938463463374607431768211455n,Dt=class extends N{poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),s=t.map(async({keyArgs:a,value:r})=>{let[i]=a,o=this.getPoolAddress(i),[l,u]=await Promise.all([this.getPoolDelta(i,r,e),this.getPoolTokens(i,r)]);return this.poolsData.set(o,r),{address:o,id:i,type:"Stableswap",fee:h.fromPermill(r.fee),tokens:u,...l,...n}});return Promise.all(s)}async getPoolDelta(t,e,n){let{initial_amplification:s,final_amplification:a,initial_block:r,final_block:i}=e,o=E.calculateAmplification(s.toString(),a.toString(),r.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),s=e.assets.map(async i=>{let[o,l,u]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,i),this.api.query.AssetRegistry.Assets.getValue(i),this.getBalance(n,i)]);return{id:i,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:u,tradeable:o,type:l?.asset_type.type}}),a=await Promise.all(s),r=await this.api.query.AssetRegistry.Assets.getValue(t);return a.push({id:t,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:ts,tradeable:15,type:r?.asset_type.type}),a}getPoolAddress(t){let e=E.getPoolAddress(t),n=(0,pn.blake2b)(e,{dkLen:32}),s=(0,mn.toHex)(n);return(0,Jt.AccountId)(63).dec(s)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolFees(t){return{fee:t.fee}}getPoolType(){return"Stableswap"}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(Jt.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?(0,gt.of)(t):e.watchValue("best").pipe((0,gt.switchMap)(s=>this.getPoolDelta(t.id,n,s)),(0,gt.map)(s=>Object.assign({},t,s)))}};var _e={};v(_e,{XykMath:()=>$,XykPool:()=>Ct,XykPoolClient:()=>Mt});var R=require("@galacticcouncil/math-xyk"),$=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,s){return(0,R.calculate_spot_price_with_fee)(t,e,n,s)}static calculateShares(t,e,n){return(0,R.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,s){return(0,R.calculate_liquidity_out_asset_a)(t,e,n,s)}static calculateLiquidityOutAssetB(t,e,n,s){return(0,R.calculate_liquidity_out_asset_b)(t,e,n,s)}};var Ct=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,s,a){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==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:s.decimals,decimalsOut:a.decimals,balanceIn:s.balance,balanceOut:a.balance,assetInEd:s.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=this.calculateTradeFee(s,n),r=h.toPct(n.exchangeFee),i=s+a,o=[];(e<this.minTradingLimit||s<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:s,amountOut:e,feePct:r,errors:o}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=this.calculateTradeFee(s,n),r=h.toPct(n.exchangeFee),i=s-a,o=[];(e<this.minTradingLimit||s<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:s,amountOut:i,feePct:r,errors:o}}calculateInGivenOut(t,e){let n=$.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}calculateOutGivenIn(t,e){let n=$.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}spotPriceInGivenOut(t){let e=$.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=$.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=$.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};var dn=require("polkadot-api"),gn=require("rxjs");var Mt=class extends N{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),s=e.map(async({keyArgs:a,value:r})=>{let[i]=a,[o,l]=r,[u,d,m,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:d?.decimals,existentialDeposit:d?.existential_deposit,balance:u,type:d?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:m,type:p?.asset_type.type}],...n}});return Promise.all(s)}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,gn.of)(t)}};var Re={};v(Re,{AavePool:()=>Lt,AavePoolClient:()=>qt});var Lt=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,s,a){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(r=>[r.id,r])),s=n.get(t),a=n.get(e);if(s==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:s.balance,balanceOut:a.balance,decimalsIn:s.decimals,decimalsOut:a.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=[];return e>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:a}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=[];return s>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:e,calculatedOut:s,amountOut:s,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 yn=require("polkadot-api"),hn=require("@polkadot-api/utils"),bt=require("rxjs"),Pn=require("viem");var bn=[{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:es}=tt,ns=["Supply","Withdraw","Repay","Borrow"],qt=class extends N{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:s,liqudity_in:a,liqudity_out:r})=>{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(s),this.api.query.AssetRegistry.AssetLocations.getValue(s)]);return{address:this.getPoolId(n,s),type:"Aave",tokens:[{id:n,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:a,location:o,type:i?.asset_type.type},{id:s,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:r,location:u,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:s,liqudity_out:a}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(r=>{let i=r.id===e.id?s:a;return{...r,balance:i}})}getPoolId(t,e){let n=t+"/"+e,s=new TextEncoder().encode(n.padEnd(32,"\0")),a=(0,hn.toHex)(s);return(0,yn.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,s=this.getReserveH160Id(e),a=this.api.event.Router.Executed.watch(({asset_in:i,asset_out:o})=>i===n.id||o===n.id),r=this.api.event.EVM.Log.watch(({log:i})=>{let{topics:o,data:l}=i,u=o.map(g=>g.asHex()),d=l.asHex(),{eventName:m,args:p}=(0,Pn.decodeEventLog)({abi:bn,topics:u,data:d});return ns.includes(m)&&p.reserve.toLowerCase()===s.toLowerCase()});return(0,bt.merge)([a,r]).pipe((0,bt.switchMap)(()=>this.getPoolDelta(t)),(0,bt.map)(i=>({...t,tokens:[...i]})))}getReserveH160Id(t){return t.type==="Erc20"?Z.findNestedKey(t.location,"AccountKey20").AccountKey20.key:es.fromAssetId(t.id)}};var yt=class{static get(t){switch(t.type){case"Aave":return Lt.fromPool(t);case"XYK":return Ct.fromPool(t);case"Omnipool":return Rt.fromPool(t);case"LBP":return Bt.fromPool(t);case"Stableswap":return Et.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var j=require("rxjs");var ht=class extends M{lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=j.Subscription.EMPTY;omniSub=j.Subscription.EMPTY;stableSub=j.Subscription.EMPTY;xykSub=j.Subscription.EMPTY;aaveSub=j.Subscription.EMPTY;isReady=!1;isDestroyed=new j.Subject;constructor(t){super(t),this.lbpClient=new _t(t),this.omniClient=new Ft(t),this.stableClient=new Dt(t),this.xykClient=new Mt(t),this.aaveClient=new qt(t),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe((0,j.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(){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let t=await Promise.all(this.clients.filter(e=>this.active.has(e.getPoolType())).map(e=>e.getPools()));return this.isReady=!0,t.flat()}async getPoolFees(t,e){let n=this.clients.find(s=>s.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new At(t.type)}};var qe={};v(qe,{DEFAULT_BLOCK_TIME:()=>fn,DEFAULT_MIN_BUDGET:()=>De,ORDER_MIN_BLOCK_PERIOD:()=>Tn,Router:()=>Pt,TWAP_BLOCK_PERIOD:()=>Gt,TWAP_MAX_DURATION:()=>Me,TWAP_MAX_PRICE_IMPACT:()=>Ce,TWAP_TX_MULTIPLIER:()=>Vo,TradeOrderError:()=>Ee,TradeOrderType:()=>ee,TradeRouteBuilder:()=>H,TradeRouter:()=>ft,TradeScheduler:()=>Tt,TradeType:()=>te});var Zt=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 ss=5,Nt=class{isNotVisited(t,e){let n=!0;return e.forEach(s=>{(s[0]===t[0]||s[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let s=[],a=new Zt,r=[];for(r.push([e,""]),a.enqueue(r);a.size()>0;){let i=a.dequeue();if(i==null||i.length>ss)return s;let o=i[i.length-1];(n===null||o[0]===n)&&s.push(i),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,i)){let d=[...i];d.push(u),a.enqueue(d)}})}return s}buildAndPopulateGraph(t,e){let n=new Map;for(let s of t)n.set(parseInt(s),[]);for(let[s,a,r]of e)n.get(a)?.push([r,s]);return n}};function Fe(c){let t={};for(let e of c){let n=e.tokens.length;for(let s=0;s<n;s++){t[e.tokens[s].id]||(t[e.tokens[s].id]=[]);for(let a=0;a<n;a++){if(s==a)continue;let r=[e.address,e.tokens[s].id,e.tokens[a].id];t[e.tokens[s].id].push(r)}}}return t}var Ht=class{getProposals(t,e,n){let s=Fe(n),a=Object.keys(s),r=a.map(u=>s[u]).flat(),i=new Nt,o=i.buildAndPopulateGraph(a,r),l=i.findPaths(o,t,e);return this.parsePaths(l)}parsePaths(t){let e=[];for(let n of t){let s=[];for(let a=0;a<n.length;a++){let r=n[a],i=n[a+1];if(i==null)break;s.push(this.toEdge(r,i))}e.push(s)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var Pt=class{routeSuggester;routerOptions;ctx;defaultRouterOptions={useOnly:[]};constructor(t,e){this.ctx=t,this.routeSuggester=new Ht,this.routerOptions={...this.defaultRouterOptions,...e}}async getPools(){let t=await this.ctx.getPools(),e=this.routerOptions.useOnly;return e.length===0?t:t.filter(n=>e.includes(n.type))}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)}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 s=this.getAssets(n);if(!s.has(t))throw new Error(t+" is not supported asset");if(!s.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(s=>s.id)).flat().sort((n,s)=>n>s?1:-1);return new Set(e)}getPaths(t,e,n){let s=this.toPoolsMap(n);return this.routeSuggester.getProposals(t,e,n).filter(r=>this.validPath(r,s)).map(r=>this.toHops(r,s))}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,s)=>n&&s)}validEdge([t,e,n],s){return s.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,yt.get(e)]))}toHops(t,e){return t.map(([n,s,a])=>{let r=e.get(n);return{poolAddress:n,poolId:r?.id,pool:r?.type,assetIn:s,assetOut:a}})}};var te=(e=>(e.Buy="Buy",e.Sell="Sell",e))(te||{}),ee=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(ee||{}),Ee=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Ee||{});var ft=class extends Pt{isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,s)=>{let a=n[n.length-1].amountOut,r=s[s.length-1].amountOut;return a>r?-1:1});return e.find(n=>n.every(s=>s.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,r)=>a+r),s=t.map(a=>a.tradeFeeRange?.[1]??a.tradeFeePct).reduce((a,r)=>a+r);return[n,s]}}getPoolFeeRange(t){let e=t.min?h.toPct(t.min):void 0,n=t.max?h.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}async 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),s=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),a=n-e.assetOutDecimals,r=Math.pow(10,a);return s/BigInt(r)}async getSell(t,e,n,s){let a=await super.getPools(),r=super.validateInput(t,e,a),i=super.getPaths(t,e,a);if(i.length===0)throw new dt(t,e);let o;if(s)o=await this.toSellSwaps(n,s,r);else{let k=await Promise.all(i.map(D=>this.toSellSwaps(n,D,r)));o=this.findBestSellRoute(k)}let l=o[0],u=o[o.length-1],d=this.isDirectTrade(o),m=await this.getSellSpot(o),p=u.amountOut,g=d?u.calculatedOut:this.calculateDelta0Y(l.amountIn,o,r),P=g-p,b=this.getRouteFeeRange(o),S=d?u.tradeFeePct:A.calculateSellFee(g,p),f=Math.pow(10,l.assetInDecimals),T=l.amountIn*m/BigInt(f),I=A.calculateDiffToRef(g,T);return{type:"Sell",amountIn:l.amountIn,amountOut:u.amountOut,spotPrice:m,tradeFee:P,tradeFeePct:S,tradeFeeRange:b,priceImpactPct:I,swaps:o,toHuman(){return{type:"Sell",amountIn:y.toDecimal(l.amountIn,l.assetInDecimals),amountOut:y.toDecimal(u.amountOut,u.assetOutDecimals),spotPrice:y.toDecimal(m,u.assetOutDecimals),tradeFee:y.toDecimal(P,u.assetOutDecimals),tradeFeePct:S,tradeFeeRange:b,priceImpactPct:I,swaps:o.map(k=>k.toHuman())}}}}calculateDelta0Y(t,e,n){let s=[];for(let a=0;a<e.length;a++){let r=e[a],i=n.get(r.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(r.assetIn,r.assetOut),l;a>0?l=s[a-1]:l=t;let u=i.calculateOutGivenIn(o,l);s.push(u)}return s[s.length-1]}async toSellSwaps(t,e,n){let s=[];for(let a=0;a<e.length;a++){let r=e[a],i=n.get(r.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(r.assetIn,r.assetOut),l;a>0?l=s[a-1].amountOut:l=typeof t=="string"?y.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(i,o.assetOut),{amountOut:d,calculatedOut:m,feePct:p,errors:g}=i.validateAndSell(o,l,u),P=this.getPoolFeeRange(u),b=i.spotPriceOutGivenIn(o),S=Math.pow(10,o.decimalsIn),f=l*b/BigInt(S),T=A.calculateDiffToRef(m,f);s.push({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:d,calculatedOut:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===r.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===r.assetIn},toHuman(){return{...r,amountIn:y.toDecimal(l,o.decimalsIn),amountOut:y.toDecimal(d,o.decimalsOut),calculatedOut:y.toDecimal(m,o.decimalsOut),spotPrice:y.toDecimal(b,o.decimalsOut),tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g}}})}return s}async getMostLiquidRoute(t,e){let n=await super.getPools(),s=super.validateInput(t,e,n),a=super.getPaths(t,e,n),o=n.filter(m=>m.tokens.some(p=>p.id===t&&p.id!==m.id)).map(m=>m.type==="Aave"?m.tokens:m.tokens.filter(p=>p.id===t)).map(m=>m.map(p=>p.balance).reduce((p,g)=>p+g)).sort((m,p)=>p<m?-1:1)[0],l=A.getFraction(o,.1),u=await Promise.all(a.map(m=>this.toSellSwaps(l,m,s)));return this.findBestSellRoute(u).map(m=>({poolAddress:m.poolAddress,poolId:m?.poolId,pool:m.pool,assetIn:m.assetIn,assetOut:m.assetOut}))}async getSpotPrice(t,e){let n=await super.getPools(),s=super.validateInput(t,e,n),a=await this.getMostLiquidRoute(t,e),r=await this.toSellSwaps("1",a,s),i=await this.getSellSpot(r),o=r[r.length-1].assetOutDecimals;return{amount:i,decimals:o}}findBestBuyRoute(t){let e=t.sort((n,s)=>{let a=n[0].amountIn,r=s[0].amountIn;return a>r?1:-1});return e.find(n=>n.every(s=>s.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}async 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),s=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),a=n-e.assetInDecimals,r=Math.pow(10,a);return s/BigInt(r)}async getBuy(t,e,n,s){let a=await super.getPools(),r=super.validateInput(t,e,a),i=super.getPaths(t,e,a);if(i.length===0)throw new dt(t,e);let o;if(s)o=await this.toBuySwaps(n,s,r);else{let k=await Promise.all(i.map(D=>this.toBuySwaps(n,D,r)));o=this.findBestBuyRoute(k)}let l=o[o.length-1],u=o[0],d=this.isDirectTrade(o),m=await this.getBuySpot(o),p=u.amountIn,g=d?u.calculatedIn:this.calculateDelta0X(l.amountOut,o,r),P=p-g,b=this.getRouteFeeRange(o),S=d?u.tradeFeePct:A.calculateBuyFee(g,p),f=Math.pow(10,l.assetOutDecimals),T=l.amountOut*m/BigInt(f),I;return g===0n?I=-100:I=A.calculateDiffToRef(T,g),{type:"Buy",amountOut:l.amountOut,amountIn:u.amountIn,spotPrice:m,tradeFee:P,tradeFeePct:S,tradeFeeRange:b,priceImpactPct:I,swaps:o,toHuman(){return{type:"Buy",amountOut:y.toDecimal(l.amountOut,l.assetOutDecimals),amountIn:y.toDecimal(u.amountIn,u.assetInDecimals),spotPrice:y.toDecimal(m,u.assetInDecimals),tradeFee:y.toDecimal(P,u.assetInDecimals),tradeFeePct:S,tradeFeeRange:b,priceImpactPct:I,swaps:o.map(k=>k.toHuman())}}}}calculateDelta0X(t,e,n){let s=[];for(let a=e.length-1;a>=0;a--){let r=e[a],i=n.get(r.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(r.assetIn,r.assetOut),l;a==e.length-1?l=t:l=s[0];let u=i.calculateInGivenOut(o,l);s.unshift(u)}return s[0]}async toBuySwaps(t,e,n){let s=[];for(let a=e.length-1;a>=0;a--){let r=e[a],i=n.get(r.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(r.assetIn,r.assetOut),l;a==e.length-1?l=typeof t=="string"?y.toBigInt(t,o.decimalsOut):t:l=s[0].amountIn;let u=await this.ctx.getPoolFees(i,o.assetOut),{amountIn:d,calculatedIn:m,feePct:p,errors:g}=i.validateAndBuy(o,l,u),P=this.getPoolFeeRange(u),b=i.spotPriceInGivenOut(o),S=Math.pow(10,o.decimalsOut),f=l*b/BigInt(S),T;m===0n?T=-100:T=A.calculateDiffToRef(f,m),s.unshift({...r,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:d,calculatedIn:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===r.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===r.assetIn},toHuman(){return{...r,amountOut:y.toDecimal(l,o.decimalsOut),amountIn:y.toDecimal(d,o.decimalsIn),calculatedIn:y.toDecimal(m,o.decimalsIn),spotPrice:y.toDecimal(b,o.decimalsIn),tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g}}})}return s}};var fn=6e3,De=1000000000000000n,Gt=6,Ce=-5,Me=216e5,Vo=3,Tn=6;var Le=require("polkadot-api");var H=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:s,poolId:a})=>s==="Stableswap"?{pool:(0,Le.Enum)("Stableswap",a),asset_in:e,asset_out:n}:{pool:(0,Le.Enum)(s),asset_in:e,asset_out:n})}};var Tt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??De})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,s,a){let[r,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:u}=i,d=l[0],m=l[l.length-1],{assetInDecimals:p}=d,{assetOutDecimals:g}=m,P=Math.abs(u),b=this.getMinimumTradeCount(o,r),S=this.getOptimalTradeCount(P),f=a?Math.round(s/a):S,T=Math.ceil(s/b),I=Math.round(s/S),k=Math.round(s/f),D=o/BigInt(f),C=await this.router.getBestSell(t,e,D),Q=o<r,Ut=[];Q&&Ut.push("OrderTooSmall");let Vt=C.amountOut*BigInt(f),re=this.toBlockPeriod(k),ie=C.tradeFee*BigInt(f),Sn=H.build(l),Ge={assetIn:t,assetOut:e,errors:Ut,frequencyMin:T,frequencyOpt:I,frequency:k,tradeCount:f,tradeFee:ie,tradeImpactPct:C.priceImpactPct,tradePeriod:re,tradeRoute:Sn,type:"Dca"};return{...Ge,amountIn:o,amountOut:Vt,tradeAmountIn:C.amountIn,tradeAmountOut:C.amountOut,toHuman(){return{...Ge,amountIn:y.toDecimal(o,p),amountOut:y.toDecimal(Vt,g),tradeAmountIn:y.toDecimal(C.amountIn,p),tradeAmountOut:y.toDecimal(C.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 s=t+n/2n;return Number(s/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[s,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:r,swaps:i,priceImpactPct:o}=a,l=i[0],u=i[i.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),P=r/BigInt(g),b=await this.router.getBestSell(l.assetIn,u.assetOut,P),S=g===1,f=r<s,T=b.priceImpactPct<-5,I=[];f||S?I.push("OrderTooSmall"):T&&I.push("OrderImpactTooBig");let k=b.amountOut*BigInt(g),D=b.tradeFee*BigInt(g),C=H.build(i),Q={assetIn:t,assetOut:e,errors:I,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:C,type:"TwapSell"};return{...Q,amountIn:r,amountOut:k,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:D,toHuman(){return{...Q,amountIn:y.toDecimal(r,d),amountOut:y.toDecimal(k,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(D,m)}}}}async getTwapBuyOrder(t,e,n){let[s,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:r,swaps:i,priceImpactPct:o}=a,l=i[0],u=i[i.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),P=r/BigInt(g),b=await this.router.getBestBuy(l.assetIn,u.assetOut,P),S=b.amountIn*BigInt(g),f=g===1,T=S<s,I=b.priceImpactPct<-5,k=[];T||f?k.push("OrderTooSmall"):I&&k.push("OrderImpactTooBig");let D=b.tradeFee*BigInt(g),C=H.build(i),Q={assetIn:t,assetOut:e,errors:k,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:C,type:"TwapBuy"};return{...Q,amountIn:S,amountOut:r,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:D,toHuman(){return{...Q,amountIn:y.toDecimal(S,d),amountOut:y.toDecimal(r,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(D,d)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let s=216e5/(this.blockTime*6);return Math.round(s)}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 He={};v(He,{TxBuilderFactory:()=>St});var Ne=require("polkadot-api");function xn(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var xt=class extends M{evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evmClient=e??new L,this.balanceClient=new X(t),this.aaveUtils=new et(this.evmClient)}wrapTx(t,e){return{name:t,get:()=>e,dryRun:n=>this.dryRun(n,e)}}async dispatchWithExtraGas(t){return this.api.tx.Dispatcher.dispatch_with_extra_gas({call:t.decodedCall,extra_gas:ce})}async dryRun(t,e){let n=(0,Ne.Enum)("Signed",t),s=(0,Ne.Enum)("system",n),r=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(s,e.decodedCall),i=r.success&&!r.value.execution_result.success?r.value.execution_result.value.error:null;if(i){let o=xn(i.value);throw new Error("Dry run execution error!",{cause:o})}return r}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var ne=class extends xt{_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:s}=e[0],a=await this.balanceClient.getBalance(this.beneficiary,s);return t>=a-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],a=n[n.length-1],r=A.getFraction(t,this.slippagePct),i=s.assetIn,o=a.assetOut,l=t+r,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,s=n[0],a=n[n.length-1],r=A.getFraction(e,this.slippagePct),i=s.assetIn,o=a.assetOut,l=e-r,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)}),s.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],s=e[e.length-1],a=A.getFraction(t,this.slippagePct),r=n.assetIn,i=s.assetOut,o=t-a,l=this.api.tx.Router.sell_all({asset_in:r,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 ae=class extends xt{_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:s,tradePeriod:a,tradeRoute:r}=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,order:(0,se.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:0n,route:r})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",i)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:a,tradePeriod:r,tradeRoute:i}=this.order,o=A.getFraction(a,this.slippagePct),l=a-o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:r,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,order:(0,se.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:s,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:s,tradeAmountOut:a,tradePeriod:r,tradeRoute:i}=this.order,o=A.getFraction(s,this.slippagePct),l=s+o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:r,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,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 St=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e??new L}trade(t){return new ne(this.client,this.evmClient).setTrade(t)}order(t){return new ae(this.client,this.evmClient).setOrder(t)}};async function as(c,t){let e=new mt(c),[n,s]=await Promise.all([e.getBlockTime(),e.getMinOrderBudget()]),a=t??new L,r=new ht(c).withAave().withOmnipool().withStableswap().withXyk(),i=new et(a),o=new ft(r),l=new Tt(o,{blockTime:n,minBudgetInNative:s});return{api:{aave:i,router:o,scheduler:l},client:{asset:new ct(c),balance:new X(c),evm:a,staking:new pt(c)},ctx:{pool:r},tx:new St(c,a),destroy:()=>{r.destroy()}}}0&&(module.exports={aave,api,big,client,const:null,createSdkContext,erc20,error,evm,fmt,h160,json,math,pool,sor,tx,xc});
package/build/index.mjs CHANGED
@@ -1 +1 @@
1
- var Qe=Object.defineProperty;var I=(c,t)=>{for(var e in t)Qe(c,e,{get:t[e],enumerable:!0})};var pe={};I(pe,{Papi:()=>E,getWs:()=>tn});import{hydration as $e}from"@galacticcouncil/descriptors";function me(c){switch(c){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var E=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi($e)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");me(n)&&console.log(t,...e)}};import{createClient as Je}from"polkadot-api";import{withPolkadotSdkCompat as Ze}from"polkadot-api/polkadot-sdk-compat";var tn=async c=>{let t=typeof c=="string"?c.split(","):c,r=(typeof window>"u"?(await import("polkadot-api/ws-provider/node")).getWsProvider:(await import("polkadot-api/ws-provider/web")).getWsProvider)(t);return Je(Ze(r))};var Ie={};I(Ie,{AAVE_GAS_LIMIT:()=>Xt,AAVE_LENDING_POOL_ADDRESS:()=>Dt,AAVE_POOL_ABI:()=>Vt,AAVE_POOL_DATA_PROVIDER:()=>Et,AAVE_POOL_DATA_PROVIDER_ABI:()=>Ft,AAVE_POOL_PROXY:()=>Yt,AAVE_ROUNDING_THRESHOLD:()=>Bs,AAVE_UINT_256_MAX:()=>en,AaveClient:()=>gt,AaveUtils:()=>Q});var Vt=[{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 Ft=[{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 Yt="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Et="0x112b087b60C1a166130d59266363C45F8aa99db0",Dt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Xt=1000000n,Bs=5,en=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var ye={};I(ye,{EvmClient:()=>C,evmMainnet:()=>jt});import{defineChain as nn}from"viem";var de=["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"],ge=["wss://hydration-rpc.n.dwellir.com","wss://hydration.dotters.network","wss://rpc.helikon.io/hydradx","wss://hydration.ibp.network","wss://rpc.cay.hydration.cloud","wss://rpc.parm.hydration.cloud","wss://rpc.roach.hydration.cloud","wss://rpc.zipp.hydration.cloud","wss://rpc.sin.hydration.cloud","wss://rpc.coke.hydration.cloud"],jt=nn({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{public:{http:de,webSocket:ge},default:{http:de,webSocket:ge}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});import{createPublicClient as be,createWalletClient as rn,custom as sn,http as an,webSocket as on}from"viem";var C=class{chain;constructor(t){this.chain=t||jt}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}async getGasPrice(){return this.getProvider().getGasPrice()}getProvider(){return be({chain:this.chain,transport:an()})}getWsProvider(){return be({chain:this.chain,transport:on()})}getSigner(t){return rn({account:t,chain:this.chain,transport:sn(window.ethereum)})}};var gt=class{evmClient;constructor(t){this.evmClient=t??new C}async getReservesData(){return await this.evmClient.getProvider().readContract({abi:Ft,address:Et,args:[Dt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.evmClient.getProvider().readContract({abi:Ft,address:Et,args:[Dt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.evmClient.getProvider().readContract({abi:Vt,address:Yt,args:[t],functionName:"getUserAccountData"})}};var y={};I(y,{asBigInt:()=>cn,toBigInt:()=>un,toDecimal:()=>ln});import K from"big.js";K.NE=-18;function ln(c,t,e=6,n){let r=K(c.toString()),s=K(10).pow(t);return r.div(s).round(e,n).toString()}function un(c,t){let e=K(10).pow(t),r=K(c).mul(e).toFixed(0,K.roundDown);return BigInt(r)}function cn(c){return BigInt(c.round(0,K.roundDown).toFixed(0))}var J={};I(J,{ERC20:()=>Kt});var Kt=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 P={};I(P,{fromPermill:()=>gn,shiftNeg:()=>bt,toDecimals:()=>dn,toPct:()=>pn});import mn from"big.js";var he=1e3;function pn(c){let[t,e]=c;return t/e*100}function dn(c){let[t,e]=c;return t/e}function gn(c){return[c/he,he]}function bt(c,t){let e=mn(typeof c=="bigint"?c.toString():c);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Ct={};I(Ct,{H160:()=>Jt,isEvmAccount:()=>Te,isEvmAddress:()=>xe,isSs58Address:()=>Se});import{AccountId as yt}from"polkadot-api";import{toHex as fe}from"@polkadot-api/utils";import{Buffer as X}from"buffer";var Pe={};I(Pe,{HUB_ASSET_ID:()=>Qt,HYDRATION_OMNIPOOL_ADDRESS:()=>yn,HYDRATION_PARACHAIN_ID:()=>bn,HYDRATION_SS58_PREFIX:()=>k,RUNTIME_DECIMALS:()=>A,SYSTEM_ASSET_DECIMALS:()=>zt,SYSTEM_ASSET_ID:()=>U,TRADEABLE_DEFAULT:()=>Z});var A=18,U=0,zt=12,bn=2034,k=63,yn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Qt=1,Z=15;var $t="ETH\0";function Te(c){if(!c)return!1;try{let t=yt().enc(c),e=X.from($t);return X.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function xe(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function Se(c){try{return yt(63).enc(c),!0}catch{return!1}}var Jt=class c{static toAccount=t=>{let e=X.from(t.slice(2),"hex"),n=X.from($t),r=Uint8Array.from(X.concat([n,e,X.alloc(8)])),s=fe(r);return yt(63).dec(s)};static fromAccount=t=>{let e=yt().enc(t),n=X.from($t),r=e.slice(n.length,-8);return"0x"+X.from(r).toString("hex")};static fromSS58=t=>{let n=yt().enc(t).slice(0,20);return fe(n)};static fromAny=t=>{if(xe(t))return t;if(Te(t))return c.fromAccount(t);if(Se(t))return c.fromSS58(t);throw new Error("Unknown address type")}};var z={};I(z,{findNestedKey:()=>hn,findNestedObj:()=>Pn,jsonFormatter:()=>fn});var hn=(c,t)=>{let e=[];return JSON.stringify(c,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},Pn=(c,t,e)=>{let n;return JSON.stringify(c,(r,s)=>(s&&s[t]===e&&(n=s),s)),n},fn=(c,t)=>typeof t=="bigint"?t.toString():t;var O={};I(O,{calculateBuyFee:()=>wn,calculateDiffToAvg:()=>Tn,calculateDiffToRef:()=>xn,calculateSellFee:()=>Sn,getFraction:()=>In});import W from"big.js";function Tn(c,t){let e=W(c.toString()),n=W(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function xn(c,t){if(t===0n)return 0;let e=W(c.toString()),n=W(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Sn(c,t){let e=W(c.toString()),n=W(t.toString());return W(1).minus(n.div(e)).mul(100).round(2).toNumber()}function wn(c,t){let e=W(c.toString());return W(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function In(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 we={};I(we,{convertToId:()=>On});import{Buffer as vn}from"buffer";function On(c){let e=vn.from(c.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:kt}=J,{H160:Zt}=Ct,An=1.01,Bn=99999,_n=10n**27n,Rn=10n**18n,Q=class{client;constructor(t){let e=t??new C;this.client=new gt(e)}async getSummary(t){let e=Zt.fromAny(t),[n,r,s]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[i]=n,[a,o]=r,[l,u,d,m,p,g]=s,h=y.toDecimal(g,18),b=[];for(let x of a){let f=x.underlyingAsset.toLowerCase(),T=i.find(({underlyingAsset:j})=>j.toLowerCase()===f);if(!T)throw new Error("Missing pool reserve for "+f);let S=x.scaledATokenBalance,w=T.liquidityIndex,_=T.priceInMarketReferenceCurrency,R=S*w/_n,G=Number(o===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,Y=T.usageAsCollateralEnabled&&x.usageAsCollateralEnabledOnUser&&x.scaledATokenBalance>0n,pt=kt.toAssetId(f);b.push({aTokenBalance:R,decimals:Number(T.decimals),isCollateral:Y,priceInRef:_,reserveId:pt,reserveAsset:f,reserveLiquidationThreshold:G})}return{healthFactor:Number(h),totalCollateral:l,totalDebt:u,reserves:b}}async hasBorrowPositions(t){let e=Zt.fromAny(t),n=await this.client.getUserAccountData(e),[r,s]=n;return s>0n}async getHealthFactor(t){let e=Zt.fromAny(t),n=await this.client.getUserAccountData(e),[r,s,i,a,o,l]=n,u=y.toDecimal(l,18);return Number(u)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:r,totalDebt:s,reserves:i}=await this.getSummary(t),a=kt.fromAssetId(e),o=i.find(b=>b.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,isCollateral:u,priceInRef:d,reserveLiquidationThreshold:m}=o,p=y.toBigInt(n,l),g=u?p*d/10n**BigInt(l):0n,h=r-g;return h<=0n?0:this.calculateHealthFactor(h,m,s)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:s,reserves:i}=await this.getSummary(t),a=kt.fromAssetId(e),o=i.find(h=>h.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:l,priceInRef:u,reserveLiquidationThreshold:d}=o,p=y.toBigInt(n,l)*u/10n**BigInt(l),g=r+p;return g<=0n?0:this.calculateHealthFactor(g,d,s)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:r,reserves:s}=await this.getSummary(t),i=kt.fromAssetId(e),a=s.find(o=>o.reserveAsset===i);if(!a)throw new Error("Missing reserve ctx for "+i);return this.calculateWithdrawMax(a,n,r)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:r}=await this.getSummary(t),s={};for(let i of r){let a=this.calculateWithdrawMax(i,e,n);i.reserveId&&(s[i.reserveId]=a)}return s}calculateHealthFactor(t,e,n){if(n===0n)return Bn;let r=10n**6n,s=y.toBigInt(e,18),i=t*s*r,a=n*Rn,o=i/a;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let r=y.toBigInt(t,18),s=y.toBigInt(e,18);return(r*n+s-1n)/s}calculateWithdrawMax(t,e,n){let{aTokenBalance:r,decimals:s,priceInRef:i,reserveLiquidationThreshold:a}=t,o=this.calculateRequiredCollateral(An,a,n),l=e-o;if(l<=0n)return{amount:0n,decimals:s};let u=l*10n**BigInt(s)/i;return{amount:r<u?r:u,decimals:s}}};var Ae={};I(Ae,{AssetClient:()=>tt,BalanceClient:()=>M,ChainParams:()=>nt,LiquidityMining:()=>Mt});var tt=class extends E{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[s]=n;return[s,r]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[s]=n;return[s,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[s]=n;return[s,r]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[s]=n;return[s,r]}))}async mapToken(t,e,n,r){let{name:s,asset_type:i,is_sufficient:a,existential_deposit:o}=e,{symbol:l,decimals:u}=n.get(t)??{};return{id:t,name:s?.asText(),symbol:l,decimals:u,icon:l,type:i.type,isSufficient:a,location:r,existentialDeposit:o}}async mapBond(t,e,n,r){let[s,i]=r,{asset_type:a,is_sufficient:o,existential_deposit:l}=e,{symbol:u,decimals:d}=await this.mapToken(s,e,n),m=Number(i),p=new Intl.DateTimeFormat("en-GB"),g=[u,"Bond",p.format(m)].join(" ");return{id:t,name:g,symbol:u+"b",decimals:d,icon:u,type:a.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:s,maturity:m}}async mapShares(t,e,n,r){let{assets:s}=r,{name:i,symbol:a,asset_type:o,is_sufficient:l,existential_deposit:u}=e,d=await Promise.all(s.map(async g=>{let{symbol:h}=await this.mapToken(g,e,n);return[g,h]})),m=Object.fromEntries(d),p=Object.values(m);return{id:t,name:p.join(", "),symbol:a?.asText()||i?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:m}}async mapExternal(t,e,n,r){let s=await this.mapToken(t,e,new Map,r),i=n?.find(a=>a.internalId===s.id);return i?{...s,decimals:i.decimals,name:i.name,symbol:i.symbol,icon:i.symbol,isWhiteListed:i.isWhiteListed}:s}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,s,i]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),a=this.parseMetadata(n),o=[];for(let[l,u]of Array.from(n)){let d=r.get(l),{asset_type:m}=u,p;switch(m.type){case"Bond":let g=i.get(l);p=await this.mapBond(l,u,a,g);break;case"StableSwap":let h=s.get(l);p=await this.mapShares(l,u,a,h);break;case"External":p=await this.mapExternal(l,u,e,d);break;default:p=await this.mapToken(l,u,a,d)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};import{Subject as Fn,bufferCount as En,combineLatest as Dn,debounceTime as Cn,distinctUntilChanged as ve,finalize as kn,map as et,pairwise as Mn,shareReplay as Ln,startWith as qn}from"rxjs";var M=class extends E{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:{free:n,frozen:r}}=await e.getValue(t);return n-r}async getTokenBalance(t,e){let n=this.api.query.Tokens.Accounts,{free:r,frozen:s}=await n.getValue(t,e);return r-s}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 Dn([e,n,r]).pipe(Cn(250),et(s=>s.flat()),qn([]),En(2,1),et(([s,i],a)=>{if(a===0)return i;let o=s.reduce((u,d)=>(u.set(d.id,d.amount),u),new Map);return i.filter(u=>u.amount!==o.get(u.id))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe(et(n=>{let{free:r,frozen:s}=n.data;return{id:0,amount:r-s}}))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(et(r=>{let{free:s,frozen:i}=r;return{id:e,amount:s-i}}))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(ve((n,r)=>!r.deltas),et(({deltas:n})=>{let r=[];return n?.deleted.forEach(s=>{let[i,a]=s.args;r.push({id:a,amount:0n})}),n?.upserted.forEach(s=>{let[i,a]=s.args,{free:o,frozen:l}=s.value;r.push({id:a,amount:o-l})}),r}))}subscribeErc20Balance(t,e){let n=new Fn,r=n.pipe(Ln(1)),s=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}),i=async()=>{let o=e||await s(),l=async()=>{let m=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,amount:g}));n.next(m)};await l();let u=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>u.unsubscribe()},a;return i().then(o=>a=o),r.pipe(kn(()=>a?.()),Mn(),et(([o,l],u)=>{if(u===0)return l;let d=o.reduce((p,g)=>(p.set(g.id,g.amount),p),new Map);return l.filter(p=>p.amount!==d.get(p.id))}),ve((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let{free:n,frozen:r}=await this.api.apis.CurrenciesApi.account(e,t);return n-r}};var nt=class extends E{_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}};import{AccountId as Nn,Binary as Gn,Enum as Hn}from"polkadot-api";import{fixed_from_rational as Oe}from"@galacticcouncil/math-liquidity-mining";import D from"big.js";var Un=BigInt(D(1).pow(18).toString()),Wn=6,Mt=class extends E{balanceClient;omnipoolAssetIds=[];secondsInYear=D(365.2425).times(24).times(60).times(60);constructor(t){super(t),this.balanceClient=new M(t)}async getOraclePrice(t,e){let n=[t,e].sort((s,i)=>s-i);if(t===e)return Un;let r=await this.api.query.EmaOracle.Oracles.getValue(Gn.fromText("omnipool"),n,Hn("TenMinutes"));if(r){let{n:s,d:i}=r[0].price,a;return t<e?a=Oe(s.toString(),i.toString()):a=Oe(i.toString(),s.toString()),BigInt(a)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),r=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),s=Buffer.from([t]),i=Buffer.concat([n,r,s]),o="0x"+Buffer.concat([i,Buffer.alloc(32-i.length)]).toString("hex");return Nn(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let s=D(r).times(t.toString()).times(e.toString()).div(18);return s.gte(n.toString())?n.toString():s.toString()}getPoolYieldPerPeriod(t,e,n,r){let s=D(t.toString()).times(e),i=D(n.toString()).times(r);return s.div(i.toString()).toString()}farmData(t,e,n){let{yieldFarm:r,globalFarm:s,priceAdjustment:i,balance:a}=t,{multiplier:o,loyalty_curve:l}=r,{blocks_per_period:u,yield_per_period:d,total_shares_z:m,max_reward_per_period:p,pending_rewards:g,accumulated_paid_rewards:h,planned_yielding_periods:b,updated_at:x,incentivized_asset:f,reward_currency:T,price_adjustment:S}=s,w=bt(i??S,18),_=bt(o,18),R=bt(l?.initial_reward_percentage??0,18),N=this.secondsInYear.div(D(Wn).times(u)).toString(),G;if(m<0)G=D(_).times(d.toString()).times(N).toString();else{let Ke=this.getGlobalRewardPerPeriod(m,d,p,w),ze=this.getPoolYieldPerPeriod(Ke,_,m,w);G=D(ze).times(N).toString()}let Y=g+h,pt=p*BigInt(b),j=a+Y,Wt=j-Y,dt=D(Wt.toString()).div(p.toString()),ue=D(e).div(u.toString()).toString(),Ye=(m>=0?dt.plus(x):dt.plus(ue)).toString(),Xe=D(m.toString()).div(D(p.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(w).toFixed(2),ce=D(Y.toString()).div(j.toString()).gte(.999);G=ce?"0":D(G).div(n?2:1).times(100).toString();let je=R?D(G).times(R).toString():void 0;return{apr:G,minApr:je,isDistributed:ce,estimatedEndPeriod:Ye,maxRewards:pt,incentivizedAsset:f,rewardCurrency:T,loyaltyCurve:l,currentPeriod:ue,potMaxRewards:j,fullness:Xe}}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,s=await Promise.all(e.map(async({keyArgs:i,value:a})=>{let[,o]=i,l=a,u=await this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(o),d=await this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(Number(t),o,l);if(!u||!d)return;let m=u.reward_currency,p=u.incentivized_asset,g=this.getFarmAddress(o),h=await this.getOraclePrice(m,p),b=await this.balanceClient.getTokenBalance(g,m);return{id:t,globalFarm:u,yieldFarm:d,priceAdjustment:h,balance:b}}));return r?s.map(i=>i?this.farmData(i,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,s=await Promise.all(e.map(async({keyArgs:i,value:a})=>{let[,o]=i,l=a,u=await this.api.query.XYKWarehouseLM.GlobalFarm.getValue(o),d=await this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,o,l);if(!u||!d)return;let m=u.reward_currency,p=u.incentivized_asset,g=this.getFarmAddress(o,!0),h=await this.getOraclePrice(m,p),b=await this.balanceClient.getBalance(g,m);return{id:t,globalFarm:u,yieldFarm:d,priceAdjustment:h,balance:b,farmAddress:g}}));return r?s.map(i=>i?this.farmData(i,r,!0):void 0):[]}};var Be={};I(Be,{AssetNotFound:()=>te,PoolNotFound:()=>ht,RouteNotFound:()=>rt});var te=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},ht=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},rt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var Me={};I(Me,{PoolContextProvider:()=>at,PoolError:()=>$,PoolFactory:()=>it,PoolType:()=>B,aave:()=>ie,lbp:()=>ee,omni:()=>ne,stable:()=>re,xyk:()=>se});var ee={};I(ee,{LbpMath:()=>H,LbpPool:()=>Pt,LbpPoolClient:()=>ft});import{calculate_in_given_out as Vn,calculate_out_given_in as Yn,calculate_linear_weights as Xn,calculate_pool_trade_fee as jn,get_spot_price as Kn}from"@galacticcouncil/math-lbp";var H=class{static getSpotPrice(t,e,n,r,s){return Kn(t,e,n,r,s)}static calculateInGivenOut(t,e,n,r,s){return Vn(t,e,n,r,s)}static calculateOutGivenIn(t,e,n,r,s){return Yn(t,e,n,r,s)}static calculateLinearWeights(t,e,n,r,s){return Xn(t,e,n,r,s)}static calculatePoolTradeFee(t,e,n){return jn(t,e,n)}};var B=(s=>(s.Aave="Aave",s.LBP="LBP",s.Omni="Omnipool",s.Stable="Stableswap",s.XYK="XYK",s))(B||{}),$=(s=>(s.InsufficientTradingAmount="InsufficientTradingAmount",s.MaxInRatioExceeded="MaxInRatioExceeded",s.MaxOutRatioExceeded="MaxOutRatioExceeded",s.TradeNotAllowed="TradeNotAllowed",s.UnknownError="UnknownError",s))($||{});var Pt=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,s,i,a){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s,this.fee=i,this.repayFeeApply=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:s.balance,decimalsIn:r.decimals,decimalsOut:s.decimals,weightIn:r.weight,weightOut:s.weight}}validateAndBuy(t,e,n){let r=this.tokens[0].id,s=[];e<this.minTradingLimit&&s.push("InsufficientTradingAmount");let i=t.balanceOut/this.maxOutRatio;if(e>i&&s.push("MaxOutRatioExceeded"),r===t.assetOut){let a=this.calculateTradeFee(e,n),o=P.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+a,u=this.calculateInGivenOut(t,l),d=t.balanceIn/this.maxInRatio;return u>d&&s.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:s}}else{let a=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return a>o&&s.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:s}}}validateAndSell(t,e,n){let r=this.tokens[0].id,s=[];e<this.minTradingLimit&&s.push("InsufficientTradingAmount");let i=t.balanceIn/this.maxInRatio;if(e>i&&s.push("MaxInRatioExceeded"),r===t.assetIn){let a=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return a>o&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:s}}else{let a=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(a,n),l=P.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),u=a-o,d=t.balanceOut/this.maxOutRatio;return u>d&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:u,feePct:l,errors:s}}}calculateInGivenOut(t,e){let n=H.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=H.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=H.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=H.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=H.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as er}from"polkadot-api";import{map as nr,of as De,switchMap as rr}from"rxjs";import{memoize1 as zn}from"@thi.ng/memoize";import{combineLatest as _e,combineLatestAll as Qn,debounceTime as $n,firstValueFrom as Jn,from as Re,map as Fe,mergeAll as Zn,of as tr,switchMap as Ee}from"rxjs";var L=class extends M{override=[];mem=0;memPools=zn(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t){super(t)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=Re(this.getPoolsMem()).pipe(Ee(e=>this.subscribe(e)),Qn());return Jn(t)}getSubscriber(){return Re(this.getPoolsMem()).pipe(Ee(t=>this.subscribe(t)),Zn())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>_e([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe($n(250),Fe(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return tr([]);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(s=>s.type==="Erc20").map(s=>s.id),r=this.subscribeErc20Balance(t.address,n);e.push(r)}return _e(e).pipe(Fe(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 s=this.override.find(a=>a.id===e),i=!!n||!!s?.decimals;return r>0n&&i})}updatePool=(t,e)=>{let n=t.tokens.map(r=>{let s=e.find(a=>a.id===r.id),i=this.override.find(a=>a.id===r.id);return s?{...r,balance:s.amount,decimals:r.decimals||i?.decimals}:{...r,decimals:r.decimals||i?.decimals}});return{...t,tokens:n}}};var ft=class extends L{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,s=t.filter(({value:i})=>e&&this.isActivePool(i,r)).map(async({keyArgs:i,value:a})=>{let[o]=i,l=o.toString(),u=await this.getPoolDelta(l,a,r);return{address:l,type:"LBP",fee:a.fee,...u,...n}});return Promise.all(s)}async getPoolDelta(t,e,n){let{start:r,end:s,assets:i,initial_weight:a,final_weight:o,repay_target:l,fee_collector:u}=e,d=H.calculateLinearWeights(r?r.toString():"0",s?s.toString():"0",a.toString(),o.toString(),n.toString()),[m,p]=i,g=BigInt(d),h=this.MAX_FINAL_WEIGHT-BigInt(g),[b,x,f,T,S]=await Promise.all([this.isRepayFeeApplied(m,l,u.toString()),this.getBalance(t,m),this.api.query.AssetRegistry.Assets.getValue(m),this.getBalance(t,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:b,tokens:[{id:m,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:x,weight:g,type:f?.asset_type.type},{id:p,decimals:S?.decimals,existentialDeposit:S?.existential_deposit,balance:T,weight:h,type:S?.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)<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t){return{repayFee:await this.getRepayFee(),exchangeFee:t.fee}}getPoolType(){return"LBP"}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(er.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe(rr(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):De(t)),nr(r=>Object.assign({},t,r))):De(t)}};var ne={};I(ne,{OmniMath:()=>v,OmniPool:()=>Tt,OmniPoolClient:()=>xt});import{calculate_in_given_out as sr,calculate_lrna_in_given_out as ir,calculate_out_given_in as ar,calculate_out_given_lrna_in as or,calculate_spot_price as lr,calculate_lrna_spot_price as ur,calculate_shares as cr,calculate_liquidity_out as mr,calculate_liquidity_lrna_out as pr,verify_asset_cap as dr,calculate_liquidity_hub_in as gr,is_sell_allowed as br,is_buy_allowed as yr,is_add_liquidity_allowed as hr,is_remove_liquidity_allowed as Pr}from"@galacticcouncil/math-omnipool";import st from"big.js";var v=class{static calculateSpotPrice(t,e,n,r){return lr(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return ur(t,e)}static calculateInGivenOut(t,e,n,r,s,i,a,o,l){return sr(t,e,n,r,s,i,a,o,l)}static calculateLrnaInGivenOut(t,e,n,r,s){return ir(t,e,n,r,s)}static calculateOutGivenIn(t,e,n,r,s,i,a,o,l){return ar(t,e,n,r,s,i,a,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,s){return or(t,e,n,r,s)}static calculateShares(t,e,n,r){return cr(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,s,i,a,o){return mr(t,e,n,r,s,i,a,o)}static calculateLiquidityLRNAOut(t,e,n,r,s,i,a,o){return pr(t,e,n,r,s,i,a,o)}static calculateCapDifference(t,e,n,r){let s=st(e),i=st(t),a=st(r),o=st(n),l=st(10).pow(18),u=o.div(l);if(s.div(a).lt(u)){let m=u.times(a).minus(s).times(i),p=s.times(st(1).minus(u));return m.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return dr(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return gr(t,e,n,r)}static isSellAllowed(t){return br(t)}static isBuyAllowed(t){return yr(t)}static isAddLiquidityAllowed(t){return hr(t)}static isRemoveLiquidityAllowed(t){return Pr(t)}};var Tt=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,s,i){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s,this.hubAssetId=i}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:r.hubReserves,hubReservesOut:s.hubReserves,sharesIn:r.shares,sharesOut:s.shares,decimalsIn:r.decimals,decimalsOut:s.decimals,balanceIn:r.balance,balanceOut:s.balance,tradeableIn:r.tradeable,tradeableOut:s.tradeable,assetInEd:r.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),s=this.calculateInGivenOut(t,e,n),i=r===0n?0:O.calculateDiffToRef(s,r),a=[],o=v.isSellAllowed(t.tradeableIn),l=v.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&a.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&a.push("MaxOutRatioExceeded");let d=t.balanceIn/this.maxInRatio;return s>d&&a.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:r,amountOut:e,feePct:i,errors:a}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),s=this.calculateOutGivenIn(t,e,n),i=O.calculateDiffToRef(r,s),a=[],o=v.isSellAllowed(t.tradeableIn),l=v.isBuyAllowed(t.tradeableOut);(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&a.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&a.push("MaxInRatioExceeded");let d=t.balanceOut/this.maxOutRatio;return s>d&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:s,feePct:i,errors:a}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let r=v.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?P.toDecimals(n.assetFee).toString():"0",n?P.toDecimals(n.protocolFee).toString():"0"),s=BigInt(r);return s<0n?0n:s}calculateLrnaInGivenOut(t,e,n){let r=v.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?P.toDecimals(n.assetFee).toString():"0"),s=BigInt(r);return s<0n?0n:s}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let r=v.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?P.toDecimals(n.assetFee).toString():"0",n?P.toDecimals(n.protocolFee).toString():"0"),s=BigInt(r);return s<0n?0n:s}calculateOutGivenLrnaIn(t,e,n){let r=v.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?P.toDecimals(n.assetFee).toString():"0"),s=BigInt(r);return s<0n?0n:s}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=v.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=v.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=v.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=v.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as fr,CompatibilityLevel as Tr}from"polkadot-api";import{toHex as xr}from"@polkadot-api/utils";import{distinctUntilChanged as Sr,map as Ce}from"rxjs";var xt=class extends L{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,r,s,i,a]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:u,value:d})=>{let[m]=u,{hub_reserve:p,shares:g,tradable:h,cap:b,protocol_shares:x}=d,[f,T]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(m),this.getBalance(e,m)]);return{id:m,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:T,cap:b,hubReserves:p,protocolShares:x,shares:g,tradeable:h,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:i,tradeable:r,type:s?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...a}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=xr(e);return fr(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,s]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),i=n.min_fee+r.min_fee,a=n.max_fee+r.max_fee;if(s){let{asset_fee:o,protocol_fee:l}=s;return{assetFee:P.fromPermill(o),protocolFee:P.fromPermill(l),min:P.fromPermill(i),max:P.fromPermill(a)}}else return{assetFee:P.fromPermill(n.min_fee),protocolFee:P.fromPermill(r.min_fee),min:P.fromPermill(i),max:P.fromPermill(a)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(Tr.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(Sr((n,r)=>!r.deltas),Ce(({entries:n})=>n.map(r=>{let[s]=r.args,{hub_reserve:i,shares:a,tradable:o,cap:l,protocol_shares:u}=r.value,d=t.tokens.findIndex(p=>p.id===s);return{...t.tokens[d],cap:l,hubReserves:i,protocolShares:u,shares:a,tradeable:o}})),Ce(n=>{let r=t.tokens.find(s=>s.id===1);return{...t,tokens:[...n,r]}}))}};var re={};I(re,{StableMath:()=>F,StableSwap:()=>St,StableSwapClient:()=>wt});import{calculate_in_given_out as wr,calculate_out_given_in as Ir,calculate_amplification as vr,calculate_add_one_asset as Or,calculate_liquidity_out_one_asset as Ar,calculate_shares as Br,calculate_shares_for_amount as _r,calculate_spot_price_with_fee as Rr,pool_account_name as Fr,recalculate_peg as Er}from"@galacticcouncil/math-stableswap";var F=class{static getPoolAddress(t){return Fr(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,s){return vr(t,e,n,r,s)}static calculateInGivenOut(t,e,n,r,s,i,a){return wr(t,e,n,r,s,i,a)}static calculateAddOneAsset(t,e,n,r,s,i,a){return Or(t,e,n,r,s,i,a)}static calculateSharesForAmount(t,e,n,r,s,i,a){return _r(t,e,n,r,s,i,a)}static calculateOutGivenIn(t,e,n,r,s,i,a){return Ir(t,e,n,r,s,i,a)}static calculateLiquidityOutOneAsset(t,e,n,r,s,i,a){return Ar(t,e,n,r,s,i,a)}static calculateShares(t,e,n,r,s,i){return Br(t,e,n,r,s,i)}static calculateSpotPriceWithFee(t,e,n,r,s,i,a,o){return Rr(t,e,n,r,s,i,a,o)}static recalculatePegs(t,e,n,r,s){return Er(t,e,n,r,s)}};var St=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,s,i,a,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s,this.amplification=i,this.id=a,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:s.balance,decimalsIn:r.decimals,decimalsOut:s.decimals,tradeableIn:this.id===t?15:r.tradeable,tradeableOut:this.id===e?15:s.tradeable,assetInEd:r.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),s=this.calculateInGivenOut(t,e,n),i=P.toPct(n.fee),a=[],o=v.isSellAllowed(t.tradeableIn),l=v.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&a.push("InsufficientTradingAmount"),{amountIn:s,calculatedIn:r,amountOut:e,feePct:i,errors:a}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),s=this.calculateOutGivenIn(t,e,n),i=P.toPct(n.fee),a=[],o=v.isSellAllowed(t.tradeableIn),l=v.isBuyAllowed(t.tradeableOut);return(!o||!l)&&a.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&a.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:r,amountOut:s,feePct:i,errors:a}}calculateIn(t,e,n){let r=F.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateAddOneAsset(t,e,n){let r=F.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateSharesForAmount(t,e,n){let r=F.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}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=F.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=F.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateWithdrawOneAsset(t,e,n){let r=F.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}calculateShares(t,e,n){let r=F.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?P.toDecimals(n.fee).toString():"0",this.getPegs()),s=BigInt(r);return s<0n?0n:s}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=F.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=F.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,z.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],z.jsonFormatter)}};import{AccountId as Dr,CompatibilityLevel as Cr}from"polkadot-api";import{toHex as kr}from"@polkadot-api/utils";import{blake2b as Mr}from"@noble/hashes/blake2b";import{map as Lr,of as qr,switchMap as Nr}from"rxjs";var Gr=340282366920938463463374607431768211455n,wt=class extends L{poolsData=new Map([]);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:s,value:i})=>{let[a]=s,o=this.getPoolAddress(a),[l,u]=await Promise.all([this.getPoolDelta(a,i,e),this.getPoolTokens(a,i)]);return this.poolsData.set(o,i),{address:o,id:a,type:"Stableswap",fee:P.fromPermill(i.fee),tokens:u,...l,...n}});return Promise.all(r)}async getPoolDelta(t,e,n){let{initial_amplification:r,final_amplification:s,initial_block:i,final_block:a}=e,o=F.calculateAmplification(r.toString(),s.toString(),i.toString(),a.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[o,l,u]=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:l?.decimals,existentialDeposit:l?.existential_deposit,balance:u,tradeable:o,type:l?.asset_type.type}}),s=await Promise.all(r),i=await this.api.query.AssetRegistry.Assets.getValue(t);return s.push({id:t,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:Gr,tradeable:15,type:i?.asset_type.type}),s}getPoolAddress(t){let e=F.getPoolAddress(t),n=Mr(e,{dkLen:32}),r=kr(n);return Dr(63).dec(r)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolFees(t){return{fee:t.fee}}getPoolType(){return"Stableswap"}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(Cr.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?qr(t):e.watchValue("best").pipe(Nr(r=>this.getPoolDelta(t.id,n,r)),Lr(r=>Object.assign({},t,r)))}};var se={};I(se,{XykMath:()=>V,XykPool:()=>It,XykPoolClient:()=>vt});import{calculate_in_given_out as Hr,calculate_out_given_in as Ur,calculate_pool_trade_fee as Wr,get_spot_price as Vr,calculate_liquidity_in as Yr,calculate_shares as Xr,calculate_spot_price as jr,calculate_spot_price_with_fee as Kr,calculate_liquidity_out_asset_a as zr,calculate_liquidity_out_asset_b as Qr}from"@galacticcouncil/math-xyk";var V=class{static getSpotPrice(t,e,n){return Vr(t,e,n)}static calculateInGivenOut(t,e,n){return Hr(t,e,n)}static calculateOutGivenIn(t,e,n){return Ur(t,e,n)}static calculatePoolTradeFee(t,e,n){return Wr(t,e,n)}static calculateLiquidityIn(t,e,n){return Yr(t,e,n)}static calculateSpotPrice(t,e){return jr(t,e)}static calculateSpotPriceWithFee(t,e,n,r){return Kr(t,e,n,r)}static calculateShares(t,e,n){return Xr(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return zr(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return Qr(t,e,n,r)}};var It=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,s){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:r.decimals,decimalsOut:s.decimals,balanceIn:r.balance,balanceOut:s.balance,assetInEd:r.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),s=this.calculateTradeFee(r,n),i=P.toPct(n.exchangeFee),a=r+s,o=[];(e<this.minTradingLimit||r<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return a>u&&o.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:i,errors:o}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),s=this.calculateTradeFee(r,n),i=P.toPct(n.exchangeFee),a=r-s,o=[];(e<this.minTradingLimit||r<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return a>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:i,errors:o}}calculateInGivenOut(t,e){let n=V.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=V.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=V.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=V.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=V.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as $r}from"polkadot-api";import{of as Jr}from"rxjs";var vt=class extends L{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),r=e.map(async({keyArgs:s,value:i})=>{let[a]=s,[o,l]=i,[u,d,m,p]=await Promise.all([this.getBalance(a,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(a,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:a,type:"XYK",tokens:[{id:o,decimals:d?.decimals,existentialDeposit:d?.existential_deposit,balance:u,type:d?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:m,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($r.BackwardsCompatible,e)}subscribePoolChange(t){return Jr(t)}};var ie={};I(ie,{AavePool:()=>Ot,AavePoolClient:()=>At});var Ot=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,s){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),s=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:s.balance,decimalsIn:r.decimals,decimalsOut:s.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),s=[];return e>t.balanceOut&&s.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),s=[];return r>t.balanceOut&&s.push("TradeNotAllowed"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:s}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};import{AccountId as Zr}from"polkadot-api";import{toHex as ts}from"@polkadot-api/utils";import{map as es,merge as ns,switchMap as rs}from"rxjs";import{decodeEventLog as ss}from"viem";var ke=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:is}=J,as=["Supply","Withdraw","Repay","Borrow"],At=class extends L{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:r,liqudity_in:s,liqudity_out:i})=>{let[a,o,l,u]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(r),this.api.query.AssetRegistry.AssetLocations.getValue(r)]);return{address:this.getPoolId(n,r),type:"Aave",tokens:[{id:n,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:s,location:o,type:a?.asset_type.type},{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:i,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:s}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(i=>{let a=i.id===e.id?r:s;return{...i,balance:a}})}getPoolId(t,e){let n=t+"/"+e,r=new TextEncoder().encode(n.padEnd(32,"\0")),s=ts(r);return Zr(63).dec(s)}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),s=this.api.event.Router.Executed.watch(({asset_in:a,asset_out:o})=>a===n.id||o===n.id),i=this.api.event.EVM.Log.watch(({log:a})=>{let{topics:o,data:l}=a,u=o.map(g=>g.asHex()),d=l.asHex(),{eventName:m,args:p}=ss({abi:ke,topics:u,data:d});return as.includes(m)&&p.reserve.toLowerCase()===r.toLowerCase()});return ns([s,i]).pipe(rs(()=>this.getPoolDelta(t)),es(a=>({...t,tokens:[...a]})))}getReserveH160Id(t){return t.type==="Erc20"?z.findNestedKey(t.location,"AccountKey20").AccountKey20.key:is.fromAssetId(t.id)}};var it=class{static get(t){switch(t.type){case"Aave":return Ot.fromPool(t);case"XYK":return It.fromPool(t);case"Omnipool":return Tt.fromPool(t);case"LBP":return Pt.fromPool(t);case"Stableswap":return St.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as os,Subscription as Bt,takeUntil as ls}from"rxjs";var at=class extends E{lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=Bt.EMPTY;omniSub=Bt.EMPTY;stableSub=Bt.EMPTY;xykSub=Bt.EMPTY;aaveSub=Bt.EMPTY;isReady=!1;isDestroyed=new os;constructor(t){super(t),this.lbpClient=new ft(t),this.omniClient=new xt(t),this.stableClient=new wt(t),this.xykClient=new vt(t),this.aaveClient=new At(t),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe(ls(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(){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let t=await Promise.all(this.clients.filter(e=>this.active.has(e.getPoolType())).map(e=>e.getPools()));return this.isReady=!0,t.flat()}async getPoolFees(t,e){let n=this.clients.find(r=>r.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new ht(t.type)}};var He={};I(He,{Router:()=>ot,TradeOrderError:()=>oe,TradeOrderType:()=>Nt,TradeRouteBuilder:()=>q,TradeRouter:()=>lt,TradeScheduler:()=>ut,TradeType:()=>qt});var Lt=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 us=5,_t=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=[],s=new Lt,i=[];for(i.push([e,""]),s.enqueue(i);s.size()>0;){let a=s.dequeue();if(a==null||a.length>us)return r;let o=a[a.length-1];(n===null||o[0]===n)&&r.push(a),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,a)){let d=[...a];d.push(u),s.enqueue(d)}})}return r}buildAndPopulateGraph(t,e){let n=new Map;for(let r of t)n.set(parseInt(r),[]);for(let[r,s,i]of e)n.get(s)?.push([i,r]);return n}};function ae(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 s=0;s<n;s++){if(r==s)continue;let i=[e.address,e.tokens[r].id,e.tokens[s].id];t[e.tokens[r].id].push(i)}}}return t}var Rt=class{getProposals(t,e,n){let r=ae(n),s=Object.keys(r),i=s.map(u=>r[u]).flat(),a=new _t,o=a.buildAndPopulateGraph(s,i),l=a.findPaths(o,t,e);return this.parsePaths(l)}parsePaths(t){let e=[];for(let n of t){let r=[];for(let s=0;s<n.length;s++){let i=n[s],a=n[s+1];if(a==null)break;r.push(this.toEdge(i,a))}e.push(r)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var ot=class{routeSuggester;routerOptions;ctx;defaultRouterOptions={useOnly:[]};constructor(t,e){this.ctx=t,this.routeSuggester=new Rt,this.routerOptions={...this.defaultRouterOptions,...e}}async getPools(){let t=await this.ctx.getPools(),e=this.routerOptions.useOnly;return e.length===0?t:t.filter(n=>e.includes(n.type))}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)}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.routeSuggester.getProposals(t,e,n).filter(i=>this.validPath(i,r)).map(i=>this.toHops(i,r))}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,s])=>{let i=e.get(n);return{poolAddress:n,poolId:i?.id,pool:i?.type,assetIn:r,assetOut:s}})}};var qt=(e=>(e.Buy="Buy",e.Sell="Sell",e))(qt||{}),Nt=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(Nt||{}),oe=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(oe||{});var lt=class extends ot{isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,r)=>{let s=n[n.length-1].amountOut,i=r[r.length-1].amountOut;return s>i?-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(s=>s.tradeFeeRange?.[0]??s.tradeFeePct).reduce((s,i)=>s+i),r=t.map(s=>s.tradeFeeRange?.[1]??s.tradeFeePct).reduce((s,i)=>s+i);return[n,r]}}getPoolFeeRange(t){let e=t.min?P.toPct(t.min):void 0,n=t.max?P.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}async getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetOutDecimals).reduce((a,o)=>a+o),r=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),s=n-e.assetOutDecimals,i=Math.pow(10,s);return r/BigInt(i)}async getSell(t,e,n,r){let s=await super.getPools(),i=super.validateInput(t,e,s),a=super.getPaths(t,e,s);if(a.length===0)throw new rt(t,e);let o;if(r)o=await this.toSellSwaps(n,r,i);else{let w=await Promise.all(a.map(_=>this.toSellSwaps(n,_,i)));o=this.findBestSellRoute(w)}let l=o[0],u=o[o.length-1],d=this.isDirectTrade(o),m=await this.getSellSpot(o),p=u.amountOut,g=d?u.calculatedOut:this.calculateDelta0Y(l.amountIn,o,i),h=g-p,b=this.getRouteFeeRange(o),x=d?u.tradeFeePct:O.calculateSellFee(g,p),f=Math.pow(10,l.assetInDecimals),T=l.amountIn*m/BigInt(f),S=O.calculateDiffToRef(g,T);return{type:"Sell",amountIn:l.amountIn,amountOut:u.amountOut,spotPrice:m,tradeFee:h,tradeFeePct:x,tradeFeeRange:b,priceImpactPct:S,swaps:o,toHuman(){return{type:"Sell",amountIn:y.toDecimal(l.amountIn,l.assetInDecimals),amountOut:y.toDecimal(u.amountOut,u.assetOutDecimals),spotPrice:y.toDecimal(m,u.assetOutDecimals),tradeFee:y.toDecimal(h,u.assetOutDecimals),tradeFeePct:x,tradeFeeRange:b,priceImpactPct:S,swaps:o.map(w=>w.toHuman())}}}}calculateDelta0Y(t,e,n){let r=[];for(let s=0;s<e.length;s++){let i=e[s],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;s>0?l=r[s-1]:l=t;let u=a.calculateOutGivenIn(o,l);r.push(u)}return r[r.length-1]}async toSellSwaps(t,e,n){let r=[];for(let s=0;s<e.length;s++){let i=e[s],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;s>0?l=r[s-1].amountOut:l=typeof t=="string"?y.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(a,o.assetOut),{amountOut:d,calculatedOut:m,feePct:p,errors:g}=a.validateAndSell(o,l,u),h=this.getPoolFeeRange(u),b=a.spotPriceOutGivenIn(o),x=Math.pow(10,o.decimalsIn),f=l*b/BigInt(x),T=O.calculateDiffToRef(m,f);r.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:d,calculatedOut:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:h,priceImpactPct:T,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===i.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===i.assetIn},toHuman(){return{...i,amountIn:y.toDecimal(l,o.decimalsIn),amountOut:y.toDecimal(d,o.decimalsOut),calculatedOut:y.toDecimal(m,o.decimalsOut),spotPrice:y.toDecimal(b,o.decimalsOut),tradeFeePct:p,tradeFeeRange:h,priceImpactPct:T,errors:g}}})}return r}async getMostLiquidRoute(t,e){let n=await super.getPools(),r=super.validateInput(t,e,n),s=super.getPaths(t,e,n),o=n.filter(m=>m.tokens.some(p=>p.id===t&&p.id!==m.id)).map(m=>m.type==="Aave"?m.tokens:m.tokens.filter(p=>p.id===t)).map(m=>m.map(p=>p.balance).reduce((p,g)=>p+g)).sort((m,p)=>p<m?-1:1)[0],l=O.getFraction(o,.1),u=await Promise.all(s.map(m=>this.toSellSwaps(l,m,r)));return this.findBestSellRoute(u).map(m=>({poolAddress:m.poolAddress,poolId:m?.poolId,pool:m.pool,assetIn:m.assetIn,assetOut:m.assetOut}))}async getSpotPrice(t,e){let n=await super.getPools(),r=super.validateInput(t,e,n),s=await this.getMostLiquidRoute(t,e),i=await this.toSellSwaps("1",s,r),a=await this.getSellSpot(i),o=i[i.length-1].assetOutDecimals;return{amount:a,decimals:o}}findBestBuyRoute(t){let e=t.sort((n,r)=>{let s=n[0].amountIn,i=r[0].amountIn;return s>i?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)}async getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(a=>a.assetInDecimals).reduce((a,o)=>a+o),r=t.map(a=>a.spotPrice).reduce((a,o)=>a*o),s=n-e.assetInDecimals,i=Math.pow(10,s);return r/BigInt(i)}async getBuy(t,e,n,r){let s=await super.getPools(),i=super.validateInput(t,e,s),a=super.getPaths(t,e,s);if(a.length===0)throw new rt(t,e);let o;if(r)o=await this.toBuySwaps(n,r,i);else{let w=await Promise.all(a.map(_=>this.toBuySwaps(n,_,i)));o=this.findBestBuyRoute(w)}let l=o[o.length-1],u=o[0],d=this.isDirectTrade(o),m=await this.getBuySpot(o),p=u.amountIn,g=d?u.calculatedIn:this.calculateDelta0X(l.amountOut,o,i),h=p-g,b=this.getRouteFeeRange(o),x=d?u.tradeFeePct:O.calculateBuyFee(g,p),f=Math.pow(10,l.assetOutDecimals),T=l.amountOut*m/BigInt(f),S;return g===0n?S=-100:S=O.calculateDiffToRef(T,g),{type:"Buy",amountOut:l.amountOut,amountIn:u.amountIn,spotPrice:m,tradeFee:h,tradeFeePct:x,tradeFeeRange:b,priceImpactPct:S,swaps:o,toHuman(){return{type:"Buy",amountOut:y.toDecimal(l.amountOut,l.assetOutDecimals),amountIn:y.toDecimal(u.amountIn,u.assetInDecimals),spotPrice:y.toDecimal(m,u.assetInDecimals),tradeFee:y.toDecimal(h,u.assetInDecimals),tradeFeePct:x,tradeFeeRange:b,priceImpactPct:S,swaps:o.map(w=>w.toHuman())}}}}calculateDelta0X(t,e,n){let r=[];for(let s=e.length-1;s>=0;s--){let i=e[s],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;s==e.length-1?l=t:l=r[0];let u=a.calculateInGivenOut(o,l);r.unshift(u)}return r[0]}async toBuySwaps(t,e,n){let r=[];for(let s=e.length-1;s>=0;s--){let i=e[s],a=n.get(i.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(i.assetIn,i.assetOut),l;s==e.length-1?l=typeof t=="string"?y.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let u=await this.ctx.getPoolFees(a,o.assetOut),{amountIn:d,calculatedIn:m,feePct:p,errors:g}=a.validateAndBuy(o,l,u),h=this.getPoolFeeRange(u),b=a.spotPriceInGivenOut(o),x=Math.pow(10,o.decimalsOut),f=l*b/BigInt(x),T;m===0n?T=-100:T=O.calculateDiffToRef(f,m),r.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:d,calculatedIn:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:h,priceImpactPct:T,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===i.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===i.assetIn},toHuman(){return{...i,amountOut:y.toDecimal(l,o.decimalsOut),amountIn:y.toDecimal(d,o.decimalsIn),calculatedIn:y.toDecimal(m,o.decimalsIn),spotPrice:y.toDecimal(b,o.decimalsIn),tradeFeePct:p,tradeFeeRange:h,priceImpactPct:T,errors:g}}})}return r}};var Le=1000000000000000n;import{Enum as qe}from"polkadot-api";var q=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:s})=>r==="Stableswap"?{pool:qe("Stableswap",s),asset_in:e,asset_out:n}:{pool:qe(r),asset_in:e,asset_out:n})}};var ut=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Le})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,r,s){let[i,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:u}=a,d=l[0],m=l[l.length-1],{assetInDecimals:p}=d,{assetOutDecimals:g}=m,h=Math.abs(u),b=this.getMinimumTradeCount(o,i),x=this.getOptimalTradeCount(h),f=s?Math.round(r/s):x,T=Math.ceil(r/b),S=Math.round(r/x),w=Math.round(r/f),_=o/BigInt(f),R=await this.router.getBestSell(t,e,_),N=o<i,G=[];N&&G.push("OrderTooSmall");let Y=R.amountOut*BigInt(f),pt=this.toBlockPeriod(w),j=R.tradeFee*BigInt(f),Wt=q.build(l),dt={assetIn:t,assetOut:e,errors:G,frequencyMin:T,frequencyOpt:S,frequency:w,tradeCount:f,tradeFee:j,tradeImpactPct:R.priceImpactPct,tradePeriod:pt,tradeRoute:Wt,type:"Dca"};return{...dt,amountIn:o,amountOut:Y,tradeAmountIn:R.amountIn,tradeAmountOut:R.amountOut,toHuman(){return{...dt,amountIn:y.toDecimal(o,p),amountOut:y.toDecimal(Y,g),tradeAmountIn:y.toDecimal(R.amountIn,p),tradeAmountOut:y.toDecimal(R.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,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:i,swaps:a,priceImpactPct:o}=s,l=a[0],u=a[a.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),h=i/BigInt(g),b=await this.router.getBestSell(l.assetIn,u.assetOut,h),x=g===1,f=i<r,T=b.priceImpactPct<-5,S=[];f||x?S.push("OrderTooSmall"):T&&S.push("OrderImpactTooBig");let w=b.amountOut*BigInt(g),_=b.tradeFee*BigInt(g),R=q.build(a),N={assetIn:t,assetOut:e,errors:S,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:R,type:"TwapSell"};return{...N,amountIn:i,amountOut:w,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:_,toHuman(){return{...N,amountIn:y.toDecimal(i,d),amountOut:y.toDecimal(w,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(_,m)}}}}async getTwapBuyOrder(t,e,n){let[r,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:i,swaps:a,priceImpactPct:o}=s,l=a[0],u=a[a.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),h=i/BigInt(g),b=await this.router.getBestBuy(l.assetIn,u.assetOut,h),x=b.amountIn*BigInt(g),f=g===1,T=x<r,S=b.priceImpactPct<-5,w=[];T||f?w.push("OrderTooSmall"):S&&w.push("OrderImpactTooBig");let _=b.tradeFee*BigInt(g),R=q.build(a),N={assetIn:t,assetOut:e,errors:w,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:R,type:"TwapBuy"};return{...N,amountIn:x,amountOut:i,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:_,toHuman(){return{...N,amountIn:y.toDecimal(x,d),amountOut:y.toDecimal(i,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(_,d)}}}}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 Ve={};I(Ve,{TxBuilderFactory:()=>mt});import{Enum as We}from"polkadot-api";function Ue(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var ct=class extends E{evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evmClient=e??new C,this.balanceClient=new M(t),this.aaveUtils=new Q(this.evmClient)}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:Xt})}async dryRun(t,e){let n=We("Signed",t),r=We("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,e.decodedCall),a=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(a){let o=Ue(a.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var Ht=class extends ct{_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],s=await this.balanceClient.getBalance(this.beneficiary,r);return t>=s-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],s=n[n.length-1],i=O.getFraction(t,this.slippagePct),a=r.assetIn,o=s.assetOut,l=t+i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.buy({asset_in:a,asset_out:o,amount:e,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:a,asset_out:o,amount_out:e,max_amount_in:l,route:q.build(n)}),this.wrapTx("RouterBuy",u)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],s=n[n.length-1],i=O.getFraction(e,this.slippagePct),a=r.assetIn,o=s.assetOut,l=e-i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.sell({asset_in:a,asset_out:o,amount:t,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:a,asset_out:o,amount_in:t,min_amount_out:l,route:q.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],s=O.getFraction(t,this.slippagePct),i=n.assetIn,a=r.assetOut,o=t-s,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:a,min_amount_out:o,route:q.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as le}from"polkadot-api";var Ut=class extends ct{_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:s,tradeRoute:i}=this.order,a=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,order:le("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:0n,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",a)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:s,tradePeriod:i,tradeRoute:a}=this.order,o=O.getFraction(s,this.slippagePct),l=s-o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,order:le("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",u)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:s,tradePeriod:i,tradeRoute:a}=this.order,o=O.getFraction(r,this.slippagePct),l=r+o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,order:le("Buy",{asset_in:e,asset_out:n,amount_out:s,max_amount_in:l,route:a})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",u)}};var mt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e??new C}trade(t){return new Ht(this.client,this.evmClient).setTrade(t)}order(t){return new Ut(this.client,this.evmClient).setOrder(t)}};async function Dc(c,t){let e=new nt(c),[n,r]=await Promise.all([e.getBlockTime(),e.getMinOrderBudget()]),s=t??new C,i=new at(c).withAave().withOmnipool().withStableswap().withXyk(),a=new Q(s),o=new lt(i),l=new ut(o,{blockTime:n,minBudgetInNative:r});return{api:{aave:a,router:o,scheduler:l},client:{asset:new tt(c),balance:new M(c),evm:s},ctx:{pool:i},tx:new mt(c,s),destroy:()=>{i.destroy()}}}export{Ie as aave,pe as api,y as big,Ae as client,Pe as const,Dc as createSdkContext,J as erc20,Be as error,ye as evm,P as fmt,Ct as h160,z as json,O as math,Me as pool,He as sor,Ve as tx,we as xc};
1
+ var We=Object.defineProperty;var w=(c,t)=>{for(var e in t)We(c,e,{get:t[e],enumerable:!0})};var me={};w(me,{Papi:()=>_,getWs:()=>Ke});import{hydration as Xe}from"@galacticcouncil/descriptors";function ce(c){switch(c){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var _=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(Xe)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");ce(n)&&console.log(t,...e)}};import{createClient as Ye}from"polkadot-api";import{withPolkadotSdkCompat as je}from"polkadot-api/polkadot-sdk-compat";var Ke=async c=>{let t=typeof c=="string"?c.split(","):c,s=(typeof window>"u"?(await import("polkadot-api/ws-provider/node")).getWsProvider:(await import("polkadot-api/ws-provider/web")).getWsProvider)(t);return Ye(je(s))};var we={};w(we,{AAVE_GAS_LIMIT:()=>Vt,AAVE_LENDING_POOL_ADDRESS:()=>kt,AAVE_POOL_ABI:()=>Gt,AAVE_POOL_DATA_PROVIDER:()=>Rt,AAVE_POOL_DATA_PROVIDER_ABI:()=>_t,AAVE_POOL_PROXY:()=>Ut,AAVE_ROUNDING_THRESHOLD:()=>Ta,AAVE_UINT_256_MAX:()=>ze,AaveClient:()=>ct,AaveUtils:()=>Y});var Gt=[{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 _t=[{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 Ut="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Rt="0x112b087b60C1a166130d59266363C45F8aa99db0",kt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Vt=1000000n,Ta=5,ze=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var be={};w(be,{EvmClient:()=>F,evmMainnet:()=>Wt});import{defineChain as $e}from"viem";var pe=["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"],de=["wss://hydration-rpc.n.dwellir.com","wss://hydration.dotters.network","wss://rpc.helikon.io/hydradx","wss://hydration.ibp.network","wss://rpc.cay.hydration.cloud","wss://rpc.parm.hydration.cloud","wss://rpc.roach.hydration.cloud","wss://rpc.zipp.hydration.cloud","wss://rpc.sin.hydration.cloud","wss://rpc.coke.hydration.cloud"],Wt=$e({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{public:{http:pe,webSocket:de},default:{http:pe,webSocket:de}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});import{createPublicClient as ge,createWalletClient as Qe,custom as Je,http as Ze,webSocket as tn}from"viem";var F=class{chain;constructor(t){this.chain=t||Wt}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}async getGasPrice(){return this.getProvider().getGasPrice()}getProvider(){return ge({chain:this.chain,transport:Ze()})}getWsProvider(){return ge({chain:this.chain,transport:tn()})}getSigner(t){return Qe({account:t,chain:this.chain,transport:Je(window.ethereum)})}};var ct=class{evmClient;constructor(t){this.evmClient=t??new F}async getReservesData(){return await this.evmClient.getProvider().readContract({abi:_t,address:Rt,args:[kt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.evmClient.getProvider().readContract({abi:_t,address:Rt,args:[kt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.evmClient.getProvider().readContract({abi:Gt,address:Ut,args:[t],functionName:"getUserAccountData"})}};var y={};w(y,{asBigInt:()=>sn,toBigInt:()=>nn,toDecimal:()=>en});import W from"big.js";W.NE=-18;function en(c,t,e=6,n){let s=W(c.toString()),a=W(10).pow(t);return s.div(a).round(e,n).toString()}function nn(c,t){let e=W(10).pow(t),s=W(c).mul(e).toFixed(0,W.roundDown);return BigInt(s)}function sn(c){return BigInt(c.round(0,W.roundDown).toFixed(0))}var K={};w(K,{ERC20:()=>Xt});var Xt=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 h={};w(h,{fromPermill:()=>on,toDecimals:()=>rn,toPct:()=>an});var ye=1e3;function an(c){let[t,e]=c;return t/e*100}function rn(c){let[t,e]=c;return t/e}function on(c){return[c/ye,ye]}var Ft={};w(Ft,{H160:()=>zt,isEvmAccount:()=>fe,isEvmAddress:()=>Te,isSs58Address:()=>xe});import{AccountId as mt}from"polkadot-api";import{toHex as Pe}from"@polkadot-api/utils";import{Buffer as V}from"buffer";var he={};w(he,{HUB_ASSET_ID:()=>jt,HYDRATION_OMNIPOOL_ADDRESS:()=>un,HYDRATION_PARACHAIN_ID:()=>ln,HYDRATION_SS58_PREFIX:()=>D,RUNTIME_DECIMALS:()=>E,SYSTEM_ASSET_DECIMALS:()=>Yt,SYSTEM_ASSET_ID:()=>N,TRADEABLE_DEFAULT:()=>z});var E=18,N=0,Yt=12,ln=2034,D=63,un="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",jt=1,z=15;var Kt="ETH\0";function fe(c){if(!c)return!1;try{let t=mt().enc(c),e=V.from(Kt);return V.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Te(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function xe(c){try{return mt(63).enc(c),!0}catch{return!1}}var zt=class c{static toAccount=t=>{let e=V.from(t.slice(2),"hex"),n=V.from(Kt),s=Uint8Array.from(V.concat([n,e,V.alloc(8)])),a=Pe(s);return mt(63).dec(a)};static fromAccount=t=>{let e=mt().enc(t),n=V.from(Kt),s=e.slice(n.length,-8);return"0x"+V.from(s).toString("hex")};static fromSS58=t=>{let n=mt().enc(t).slice(0,20);return Pe(n)};static fromAny=t=>{if(Te(t))return t;if(fe(t))return c.fromAccount(t);if(xe(t))return c.fromSS58(t);throw new Error("Unknown address type")}};var X={};w(X,{findNestedKey:()=>cn,findNestedObj:()=>mn,jsonFormatter:()=>pn});var cn=(c,t)=>{let e=[];return JSON.stringify(c,(n,s)=>(s&&s[t]&&e.push(s),s)),e[0]},mn=(c,t,e)=>{let n;return JSON.stringify(c,(s,a)=>(a&&a[t]===e&&(n=a),a)),n},pn=(c,t)=>typeof t=="bigint"?t.toString():t;var v={};w(v,{calculateBuyFee:()=>yn,calculateDiffToAvg:()=>dn,calculateDiffToRef:()=>gn,calculateSellFee:()=>bn,getFraction:()=>hn});import H from"big.js";function dn(c,t){let e=H(c.toString()),n=H(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function gn(c,t){if(t===0n)return 0;let e=H(c.toString()),n=H(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function bn(c,t){let e=H(c.toString()),n=H(t.toString());return H(1).minus(n.div(e)).mul(100).round(2).toNumber()}function yn(c,t){let e=H(c.toString());return H(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function hn(c,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),s=BigInt(t*n);return c*s/BigInt(100*n)}var Se={};w(Se,{convertToId:()=>fn});import{Buffer as Pn}from"buffer";function fn(c){let e=Pn.from(c.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Et}=K,{H160:$t}=Ft,Tn=1.01,xn=99999,Sn=10n**27n,wn=10n**18n,Y=class{client;constructor(t){let e=t??new F;this.client=new ct(e)}async getSummary(t){let e=$t.fromAny(t),[n,s,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[i]=n,[r,o]=s,[l,u,d,m,p,g]=a,P=y.toDecimal(g,18),b=[];for(let x of r){let f=x.underlyingAsset.toLowerCase(),T=i.find(({underlyingAsset:Ht})=>Ht.toLowerCase()===f);if(!T)throw new Error("Missing pool reserve for "+f);let S=x.scaledATokenBalance,O=T.liquidityIndex,R=T.priceInMarketReferenceCurrency,k=S*O/Sn,At=Number(o===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,Bt=T.usageAsCollateralEnabled&&x.usageAsCollateralEnabledOnUser&&x.scaledATokenBalance>0n,Nt=Et.toAssetId(f);b.push({aTokenBalance:k,decimals:Number(T.decimals),isCollateral:Bt,priceInRef:R,reserveId:Nt,reserveAsset:f,reserveLiquidationThreshold:At})}return{healthFactor:Number(P),totalCollateral:l,totalDebt:u,reserves:b}}async hasBorrowPositions(t){let e=$t.fromAny(t),n=await this.client.getUserAccountData(e),[s,a]=n;return a>0n}async getHealthFactor(t){let e=$t.fromAny(t),n=await this.client.getUserAccountData(e),[s,a,i,r,o,l]=n,u=y.toDecimal(l,18);return Number(u)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:s,totalDebt:a,reserves:i}=await this.getSummary(t),r=Et.fromAssetId(e),o=i.find(b=>b.reserveAsset===r);if(!o)throw new Error("Missing reserve ctx for "+r);let{decimals:l,isCollateral:u,priceInRef:d,reserveLiquidationThreshold:m}=o,p=y.toBigInt(n,l),g=u?p*d/10n**BigInt(l):0n,P=s-g;return P<=0n?0:this.calculateHealthFactor(P,m,a)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:s,totalDebt:a,reserves:i}=await this.getSummary(t),r=Et.fromAssetId(e),o=i.find(P=>P.reserveAsset===r);if(!o)throw new Error("Missing reserve ctx for "+r);let{decimals:l,priceInRef:u,reserveLiquidationThreshold:d}=o,p=y.toBigInt(n,l)*u/10n**BigInt(l),g=s+p;return g<=0n?0:this.calculateHealthFactor(g,d,a)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:s,reserves:a}=await this.getSummary(t),i=Et.fromAssetId(e),r=a.find(o=>o.reserveAsset===i);if(!r)throw new Error("Missing reserve ctx for "+i);return this.calculateWithdrawMax(r,n,s)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:s}=await this.getSummary(t),a={};for(let i of s){let r=this.calculateWithdrawMax(i,e,n);i.reserveId&&(a[i.reserveId]=r)}return a}calculateHealthFactor(t,e,n){if(n===0n)return xn;let s=10n**6n,a=y.toBigInt(e,18),i=t*a*s,r=n*wn,o=i/r;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let s=y.toBigInt(t,18),a=y.toBigInt(e,18);return(s*n+a-1n)/a}calculateWithdrawMax(t,e,n){let{aTokenBalance:s,decimals:a,priceInRef:i,reserveLiquidationThreshold:r}=t,o=this.calculateRequiredCollateral(Tn,r,n),l=e-o;if(l<=0n)return{amount:0n,decimals:a};let u=l*10n**BigInt(a)/i;return{amount:s<u?s:u,decimals:a}}};var Oe={};w(Oe,{AssetClient:()=>$,BalanceClient:()=>q,ChainParams:()=>J,StakingClient:()=>tt});var $=class extends _{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:s})=>{let[a]=n;return[a,s]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[a]=n;return[a,s]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:s}=n;return this.SUPPORTED_TYPES.includes(s.type)}).map(({keyArgs:n,value:s})=>{let[a]=n;return[a,s]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:s})=>{let[a]=n;return[a,s]}))}async mapToken(t,e,n,s){let{name:a,asset_type:i,is_sufficient:r,existential_deposit:o}=e,{symbol:l,decimals:u}=n.get(t)??{};return{id:t,name:a?.asText(),symbol:l,decimals:u,icon:l,type:i.type,isSufficient:r,location:s,existentialDeposit:o}}async mapBond(t,e,n,s){let[a,i]=s,{asset_type:r,is_sufficient:o,existential_deposit:l}=e,{symbol:u,decimals:d}=await this.mapToken(a,e,n),m=Number(i),p=new Intl.DateTimeFormat("en-GB"),g=[u,"Bond",p.format(m)].join(" ");return{id:t,name:g,symbol:u+"b",decimals:d,icon:u,type:r.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:a,maturity:m}}async mapShares(t,e,n,s){let{assets:a}=s,{name:i,symbol:r,asset_type:o,is_sufficient:l,existential_deposit:u}=e,d=await Promise.all(a.map(async g=>{let{symbol:P}=await this.mapToken(g,e,n);return[g,P]})),m=Object.fromEntries(d),p=Object.values(m);return{id:t,name:p.join(", "),symbol:r?.asText()||i?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:m}}async mapExternal(t,e,n,s){let a=await this.mapToken(t,e,new Map,s),i=n?.find(r=>r.internalId===a.id);return i?{...a,decimals:i.decimals,name:i.name,symbol:i.symbol,icon:i.symbol,isWhiteListed:i.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,s,a,i]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),r=this.parseMetadata(n),o=[];for(let[l,u]of Array.from(n)){let d=s.get(l),{asset_type:m}=u,p;switch(m.type){case"Bond":let g=i.get(l);p=await this.mapBond(l,u,r,g);break;case"StableSwap":let P=a.get(l);p=await this.mapShares(l,u,r,P);break;case"External":p=await this.mapExternal(l,u,e,d);break;default:p=await this.mapToken(l,u,r,d)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};import{Subject as In,bufferCount as vn,combineLatest as On,debounceTime as An,distinctUntilChanged as Ie,finalize as Bn,map as Q,pairwise as _n,shareReplay as Rn,startWith as kn}from"rxjs";var q=class extends _{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:{free:n,frozen:s}}=await e.getValue(t);return n-s}async getTokenBalance(t,e){let n=this.api.query.Tokens.Accounts,{free:s,frozen:a}=await n.getValue(t,e);return s-a}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),s=this.subscribeErc20Balance(t);return On([e,n,s]).pipe(An(250),Q(a=>a.flat()),kn([]),vn(2,1),Q(([a,i],r)=>{if(r===0)return i;let o=a.reduce((u,d)=>(u.set(d.id,d.amount),u),new Map);return i.filter(u=>u.amount!==o.get(u.id))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe(Q(n=>{let{free:s,frozen:a}=n.data;return{id:0,amount:s-a}}))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(Q(s=>{let{free:a,frozen:i}=s;return{id:e,amount:a-i}}))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(Ie((n,s)=>!s.deltas),Q(({deltas:n})=>{let s=[];return n?.deleted.forEach(a=>{let[i,r]=a.args;s.push({id:r,amount:0n})}),n?.upserted.forEach(a=>{let[i,r]=a.args,{free:o,frozen:l}=a.value;s.push({id:r,amount:o-l})}),s}))}subscribeErc20Balance(t,e){let n=new In,s=n.pipe(Rn(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}),i=async()=>{let o=e||await a(),l=async()=>{let m=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,amount:g}));n.next(m)};await l();let u=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>u.unsubscribe()},r;return i().then(o=>r=o),s.pipe(Bn(()=>r?.()),_n(),Q(([o,l],u)=>{if(u===0)return l;let d=o.reduce((p,g)=>(p.set(g.id,g.amount),p),new Map);return l.filter(p=>p.amount!==d.get(p.id))}),Ie((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let{free:n,frozen:s}=await this.api.apis.CurrenciesApi.account(e,t);return n-s}};var J=class extends _{_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}};import{encodeAddress as Fn}from"@polkadot/util-crypto";import{stringToU8a as En}from"@polkadot/util";import{calculate_accumulated_rps as Dn,calculate_period_number as ve,calculate_rewards as Cn}from"@galacticcouncil/math-staking";import Z from"big.js";var Mn=Z(10),Ln=Z(Mn.pow(12)),tt=class extends _{#t="";getHydraAccountAddress(t){return Fn(En(("modl"+t).padEnd(32,"\0")),63)}async getFreePotBalance(t){return this.#t||(this.#t=this.getHydraAccountAddress(t)),console.log(this.#t),(await this.api.query.System.Account.getValue(this.#t)).data.free}async getBlockNumber(){return await this.api.query.System.Number.getValue({at:"best"})}async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:i})=>{let[r,o,l]=i;return{address:r,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 getStakingPosition(t){let[e,n]=await Promise.all([this.getStakingPositionsValue(t),this.getStakingVotes(t)]),s=e?.created_at,a=await n.reduce(async(i,[r,o])=>{let l=await i,u=r,d=o.amount,m=o.conviction.toString(),p=await this.getReferendumInfo(u);return p&&(p.type==="Approved"||p.type==="Rejected")&&l.push({id:u,amount:d,conviction:m}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt:s,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.getNFTCollectionId(),[n,s]=await Promise.all([this.getStaking(),this.getUniques(t,e)]),a=s.find(i=>i)?.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 getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}async getRewards(t){let e=await this.getStake(t),{potReservedBalance:n,accumulatedRewardPerStake:s,totalStake:a,stakePosition:i}=e;if(console.log(!!i),!i)return;let r=await this.getPalletId(),[o,l,u,d,m]=await Promise.all([this.getBlockNumber(),this.getFreePotBalance(r),this.getPeriodLength(),this.getUnclaimablePeriods(),this.getSixBlockSince()]);console.log(l.toString());let p=Z(l.toString()).minus(n.toString()),g=s.toString(),P=o.toString(),b=Z(P).plus(1).toString();p.gt(0)&&a>0&&(g=Dn(s.toString(),p.toString(),a.toString()));let x=ve(u.toString(),P,m??b),f=ve(u.toString(),i.createdAt?.toString()??"",m??b),T=Cn(g,i.rewardPerStake?.toString()??"",i.stake?.toString()??""),S=Z(T).plus(i.accumulatedUnpaidRewards?.toString()||"0").plus(i.accumulatedLockedRewards?.toString()||"0");if(!Z(x).minus(f).lte(d.toString()))return S.div(Ln).toString()}};var Ae={};w(Ae,{AssetNotFound:()=>Qt,PoolNotFound:()=>pt,RouteNotFound:()=>et});var Qt=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},pt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},et=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var Ce={};w(Ce,{PoolContextProvider:()=>at,PoolError:()=>j,PoolFactory:()=>st,PoolType:()=>A,aave:()=>ne,lbp:()=>Jt,omni:()=>Zt,stable:()=>te,xyk:()=>ee});var Jt={};w(Jt,{LbpMath:()=>L,LbpPool:()=>dt,LbpPoolClient:()=>gt});import{calculate_in_given_out as qn,calculate_out_given_in as Nn,calculate_linear_weights as Hn,calculate_pool_trade_fee as Gn,get_spot_price as Un}from"@galacticcouncil/math-lbp";var L=class{static getSpotPrice(t,e,n,s,a){return Un(t,e,n,s,a)}static calculateInGivenOut(t,e,n,s,a){return qn(t,e,n,s,a)}static calculateOutGivenIn(t,e,n,s,a){return Nn(t,e,n,s,a)}static calculateLinearWeights(t,e,n,s,a){return Hn(t,e,n,s,a)}static calculatePoolTradeFee(t,e,n){return Gn(t,e,n)}};var A=(a=>(a.Aave="Aave",a.LBP="LBP",a.Omni="Omnipool",a.Stable="Stableswap",a.XYK="XYK",a))(A||{}),j=(a=>(a.InsufficientTradingAmount="InsufficientTradingAmount",a.MaxInRatioExceeded="MaxInRatioExceeded",a.MaxOutRatioExceeded="MaxOutRatioExceeded",a.TradeNotAllowed="TradeNotAllowed",a.UnknownError="UnknownError",a))(j||{});var dt=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,s,a,i,r){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a,this.fee=i,this.repayFeeApply=r}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),a=n.get(e);if(s==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:s.balance,balanceOut:a.balance,decimalsIn:s.decimals,decimalsOut:a.decimals,weightIn:s.weight,weightOut:a.weight}}validateAndBuy(t,e,n){let s=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let i=t.balanceOut/this.maxOutRatio;if(e>i&&a.push("MaxOutRatioExceeded"),s===t.assetOut){let r=this.calculateTradeFee(e,n),o=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+r,u=this.calculateInGivenOut(t,l),d=t.balanceIn/this.maxInRatio;return u>d&&a.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:a}}else{let r=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return r>o&&a.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:a}}}validateAndSell(t,e,n){let s=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let i=t.balanceIn/this.maxInRatio;if(e>i&&a.push("MaxInRatioExceeded"),s===t.assetIn){let r=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return r>o&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:a}}else{let r=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(r,n),l=h.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),u=r-o,d=t.balanceOut/this.maxOutRatio;return u>d&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:u,feePct:l,errors:a}}}calculateInGivenOut(t,e){let n=L.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}calculateOutGivenIn(t,e){let n=L.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}spotPriceInGivenOut(t){let e=L.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=L.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=L.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as zn}from"polkadot-api";import{map as $n,of as Fe,switchMap as Qn}from"rxjs";import{memoize1 as Vn}from"@thi.ng/memoize";import{combineLatest as Be,combineLatestAll as Wn,debounceTime as Xn,firstValueFrom as Yn,from as _e,map as Re,mergeAll as jn,of as Kn,switchMap as ke}from"rxjs";var C=class extends q{override=[];mem=0;memPools=Vn(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t){super(t)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=_e(this.getPoolsMem()).pipe(ke(e=>this.subscribe(e)),Wn());return Yn(t)}getSubscriber(){return _e(this.getPoolsMem()).pipe(ke(t=>this.subscribe(t)),jn())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>Be([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe(Xn(250),Re(([n,s])=>this.updatePool(n,s))))}subscribePoolBalance(t){if(t.type==="Aave")return Kn([]);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),s=this.subscribeErc20Balance(t.address,n);e.push(s)}return Be(e).pipe(Re(n=>n.map(s=>Array.isArray(s)?s:[s]).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:s})=>{let a=this.override.find(r=>r.id===e),i=!!n||!!a?.decimals;return s>0n&&i})}updatePool=(t,e)=>{let n=t.tokens.map(s=>{let a=e.find(r=>r.id===s.id),i=this.override.find(r=>r.id===s.id);return a?{...s,balance:a.amount,decimals:s.decimals||i?.decimals}:{...s,decimals:s.decimals||i?.decimals}});return{...t,tokens:n}}};var gt=class extends C{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()]),s=e?.relay_parent_number||0,a=t.filter(({value:i})=>e&&this.isActivePool(i,s)).map(async({keyArgs:i,value:r})=>{let[o]=i,l=o.toString(),u=await this.getPoolDelta(l,r,s);return{address:l,type:"LBP",fee:r.fee,...u,...n}});return Promise.all(a)}async getPoolDelta(t,e,n){let{start:s,end:a,assets:i,initial_weight:r,final_weight:o,repay_target:l,fee_collector:u}=e,d=L.calculateLinearWeights(s?s.toString():"0",a?a.toString():"0",r.toString(),o.toString(),n.toString()),[m,p]=i,g=BigInt(d),P=this.MAX_FINAL_WEIGHT-BigInt(g),[b,x,f,T,S]=await Promise.all([this.isRepayFeeApplied(m,l,u.toString()),this.getBalance(t,m),this.api.query.AssetRegistry.Assets.getValue(m),this.getBalance(t,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:b,tokens:[{id:m,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:x,weight:g,type:f?.asset_type.type},{id:p,decimals:S?.decimals,existentialDeposit:S?.existential_deposit,balance:T,weight:P,type:S?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:s}=t;return n&&s?e>=n&&e<s:!1}async isRepayFeeApplied(t,e,n){if(e===0n)return!1;try{return await this.getBalance(n,t)<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(zn.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe(Qn(s=>s?this.getPoolDelta(t.address,n,s.relay_parent_number):Fe(t)),$n(s=>Object.assign({},t,s))):Fe(t)}};var Zt={};w(Zt,{OmniMath:()=>I,OmniPool:()=>bt,OmniPoolClient:()=>yt});import{calculate_in_given_out as Jn,calculate_lrna_in_given_out as Zn,calculate_out_given_in as ts,calculate_out_given_lrna_in as es,calculate_spot_price as ns,calculate_lrna_spot_price as ss,calculate_shares as as,calculate_liquidity_out as is,calculate_liquidity_lrna_out as rs,verify_asset_cap as os,calculate_liquidity_hub_in as ls,is_sell_allowed as us,is_buy_allowed as cs,is_add_liquidity_allowed as ms,is_remove_liquidity_allowed as ps}from"@galacticcouncil/math-omnipool";import nt from"big.js";var I=class{static calculateSpotPrice(t,e,n,s){return ns(t,e,n,s)}static calculateLrnaSpotPrice(t,e){return ss(t,e)}static calculateInGivenOut(t,e,n,s,a,i,r,o,l){return Jn(t,e,n,s,a,i,r,o,l)}static calculateLrnaInGivenOut(t,e,n,s,a){return Zn(t,e,n,s,a)}static calculateOutGivenIn(t,e,n,s,a,i,r,o,l){return ts(t,e,n,s,a,i,r,o,l)}static calculateOutGivenLrnaIn(t,e,n,s,a){return es(t,e,n,s,a)}static calculateShares(t,e,n,s){return as(t,e,n,s)}static calculateLiquidityOut(t,e,n,s,a,i,r,o){return is(t,e,n,s,a,i,r,o)}static calculateLiquidityLRNAOut(t,e,n,s,a,i,r,o){return rs(t,e,n,s,a,i,r,o)}static calculateCapDifference(t,e,n,s){let a=nt(e),i=nt(t),r=nt(s),o=nt(n),l=nt(10).pow(18),u=o.div(l);if(a.div(r).lt(u)){let m=u.times(r).minus(a).times(i),p=a.times(nt(1).minus(u));return m.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,s){return os(t,e,n,s)}static calculateLimitHubIn(t,e,n,s){return ls(t,e,n,s)}static isSellAllowed(t){return us(t)}static isBuyAllowed(t){return cs(t)}static isAddLiquidityAllowed(t){return ms(t)}static isRemoveLiquidityAllowed(t){return ps(t)}};var bt=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,s,a,i){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a,this.hubAssetId=i}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),a=n.get(e);if(s==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:s.hubReserves,hubReservesOut:a.hubReserves,sharesIn:s.shares,sharesOut:a.shares,decimalsIn:s.decimals,decimalsOut:a.decimals,balanceIn:s.balance,balanceOut:a.balance,tradeableIn:s.tradeable,tradeableOut:a.tradeable,assetInEd:s.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),i=s===0n?0:v.calculateDiffToRef(a,s),r=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&r.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&r.push("MaxOutRatioExceeded");let d=t.balanceIn/this.maxInRatio;return a>d&&r.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:s,amountOut:e,feePct:i,errors:r}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),i=v.calculateDiffToRef(s,a),r=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&r.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&r.push("MaxInRatioExceeded");let d=t.balanceOut/this.maxOutRatio;return a>d&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:a,feePct:i,errors:r}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let s=I.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0",n?h.toDecimals(n.protocolFee).toString():"0"),a=BigInt(s);return a<0n?0n:a}calculateLrnaInGivenOut(t,e,n){let s=I.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0"),a=BigInt(s);return a<0n?0n:a}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let s=I.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0",n?h.toDecimals(n.protocolFee).toString():"0"),a=BigInt(s);return a<0n?0n:a}calculateOutGivenLrnaIn(t,e,n){let s=I.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?h.toDecimals(n.assetFee).toString():"0"),a=BigInt(s);return a<0n?0n:a}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=I.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=I.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=I.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=I.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as ds,CompatibilityLevel as gs}from"polkadot-api";import{toHex as bs}from"@polkadot-api/utils";import{distinctUntilChanged as ys,map as Ee}from"rxjs";var yt=class extends C{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,s,a,i,r]=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:d})=>{let[m]=u,{hub_reserve:p,shares:g,tradable:P,cap:b,protocol_shares:x}=d,[f,T]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(m),this.getBalance(e,m)]);return{id:m,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:T,cap:b,hubReserves:p,protocolShares:x,shares:g,tradeable:P,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:i,tradeable:s,type:a?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...r}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=bs(e);return ds(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,s,a]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),i=n.min_fee+s.min_fee,r=n.max_fee+s.max_fee;if(a){let{asset_fee:o,protocol_fee:l}=a;return{assetFee:h.fromPermill(o),protocolFee:h.fromPermill(l),min:h.fromPermill(i),max:h.fromPermill(r)}}else return{assetFee:h.fromPermill(n.min_fee),protocolFee:h.fromPermill(s.min_fee),min:h.fromPermill(i),max:h.fromPermill(r)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(gs.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(ys((n,s)=>!s.deltas),Ee(({entries:n})=>n.map(s=>{let[a]=s.args,{hub_reserve:i,shares:r,tradable:o,cap:l,protocol_shares:u}=s.value,d=t.tokens.findIndex(p=>p.id===a);return{...t.tokens[d],cap:l,hubReserves:i,protocolShares:u,shares:r,tradeable:o}})),Ee(n=>{let s=t.tokens.find(a=>a.id===1);return{...t,tokens:[...n,s]}}))}};var te={};w(te,{StableMath:()=>B,StableSwap:()=>ht,StableSwapClient:()=>Pt});import{calculate_in_given_out as hs,calculate_out_given_in as Ps,calculate_amplification as fs,calculate_add_one_asset as Ts,calculate_liquidity_out_one_asset as xs,calculate_shares as Ss,calculate_shares_for_amount as ws,calculate_spot_price_with_fee as Is,pool_account_name as vs,recalculate_peg as Os}from"@galacticcouncil/math-stableswap";var B=class{static getPoolAddress(t){return vs(t)}static defaultPegs(t){let e=[];for(let n=0;n<t;n++)e.push(["1","1"]);return e}static calculateAmplification(t,e,n,s,a){return fs(t,e,n,s,a)}static calculateInGivenOut(t,e,n,s,a,i,r){return hs(t,e,n,s,a,i,r)}static calculateAddOneAsset(t,e,n,s,a,i,r){return Ts(t,e,n,s,a,i,r)}static calculateSharesForAmount(t,e,n,s,a,i,r){return ws(t,e,n,s,a,i,r)}static calculateOutGivenIn(t,e,n,s,a,i,r){return Ps(t,e,n,s,a,i,r)}static calculateLiquidityOutOneAsset(t,e,n,s,a,i,r){return xs(t,e,n,s,a,i,r)}static calculateShares(t,e,n,s,a,i){return Ss(t,e,n,s,a,i)}static calculateSpotPriceWithFee(t,e,n,s,a,i,r,o){return Is(t,e,n,s,a,i,r,o)}static recalculatePegs(t,e,n,s,a){return Os(t,e,n,s,a)}};var ht=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,s,a,i,r,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a,this.amplification=i,this.id=r,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),a=n.get(e);if(s==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:s.balance,balanceOut:a.balance,decimalsIn:s.decimals,decimalsOut:a.decimals,tradeableIn:this.id===t?15:s.tradeable,tradeableOut:this.id===e?15:a.tradeable,assetInEd:s.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),i=h.toPct(n.fee),r=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);return(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetInEd)&&r.push("InsufficientTradingAmount"),{amountIn:a,calculatedIn:s,amountOut:e,feePct:i,errors:r}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),i=h.toPct(n.fee),r=[],o=I.isSellAllowed(t.tradeableIn),l=I.isBuyAllowed(t.tradeableOut);return(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||s<t.assetOutEd)&&r.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:s,amountOut:a,feePct:i,errors:r}}calculateIn(t,e,n){let s=B.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateAddOneAsset(t,e,n){let s=B.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateSharesForAmount(t,e,n){let s=B.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);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=B.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 s=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(s)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let s=B.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateWithdrawOneAsset(t,e,n){let s=B.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);return a<0n?0n:a}calculateShares(t,e,n){let s=B.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?h.toDecimals(n.fee).toString():"0",this.getPegs()),a=BigInt(s);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=B.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 s=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(s)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=B.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:s})=>({asset_id:e,amount:n,decimals:s}));return JSON.stringify(t,X.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],X.jsonFormatter)}};import{AccountId as As,CompatibilityLevel as Bs}from"polkadot-api";import{toHex as _s}from"@polkadot-api/utils";import{blake2b as Rs}from"@noble/hashes/blake2b";import{map as ks,of as Fs,switchMap as Es}from"rxjs";var Ds=340282366920938463463374607431768211455n,Pt=class extends C{poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),s=t.map(async({keyArgs:a,value:i})=>{let[r]=a,o=this.getPoolAddress(r),[l,u]=await Promise.all([this.getPoolDelta(r,i,e),this.getPoolTokens(r,i)]);return this.poolsData.set(o,i),{address:o,id:r,type:"Stableswap",fee:h.fromPermill(i.fee),tokens:u,...l,...n}});return Promise.all(s)}async getPoolDelta(t,e,n){let{initial_amplification:s,final_amplification:a,initial_block:i,final_block:r}=e,o=B.calculateAmplification(s.toString(),a.toString(),i.toString(),r.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),s=e.assets.map(async r=>{let[o,l,u]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,r),this.api.query.AssetRegistry.Assets.getValue(r),this.getBalance(n,r)]);return{id:r,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:u,tradeable:o,type:l?.asset_type.type}}),a=await Promise.all(s),i=await this.api.query.AssetRegistry.Assets.getValue(t);return a.push({id:t,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:Ds,tradeable:15,type:i?.asset_type.type}),a}getPoolAddress(t){let e=B.getPoolAddress(t),n=Rs(e,{dkLen:32}),s=_s(n);return As(63).dec(s)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolFees(t){return{fee:t.fee}}getPoolType(){return"Stableswap"}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(Bs.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?Fs(t):e.watchValue("best").pipe(Es(s=>this.getPoolDelta(t.id,n,s)),ks(s=>Object.assign({},t,s)))}};var ee={};w(ee,{XykMath:()=>G,XykPool:()=>ft,XykPoolClient:()=>Tt});import{calculate_in_given_out as Cs,calculate_out_given_in as Ms,calculate_pool_trade_fee as Ls,get_spot_price as qs,calculate_liquidity_in as Ns,calculate_shares as Hs,calculate_spot_price as Gs,calculate_spot_price_with_fee as Us,calculate_liquidity_out_asset_a as Vs,calculate_liquidity_out_asset_b as Ws}from"@galacticcouncil/math-xyk";var G=class{static getSpotPrice(t,e,n){return qs(t,e,n)}static calculateInGivenOut(t,e,n){return Cs(t,e,n)}static calculateOutGivenIn(t,e,n){return Ms(t,e,n)}static calculatePoolTradeFee(t,e,n){return Ls(t,e,n)}static calculateLiquidityIn(t,e,n){return Ns(t,e,n)}static calculateSpotPrice(t,e){return Gs(t,e)}static calculateSpotPriceWithFee(t,e,n,s){return Us(t,e,n,s)}static calculateShares(t,e,n){return Hs(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,s){return Vs(t,e,n,s)}static calculateLiquidityOutAssetB(t,e,n,s){return Ws(t,e,n,s)}};var ft=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,s,a){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),a=n.get(e);if(s==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:s.decimals,decimalsOut:a.decimals,balanceIn:s.balance,balanceOut:a.balance,assetInEd:s.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=this.calculateTradeFee(s,n),i=h.toPct(n.exchangeFee),r=s+a,o=[];(e<this.minTradingLimit||s<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return r>u&&o.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:s,amountOut:e,feePct:i,errors:o}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=this.calculateTradeFee(s,n),i=h.toPct(n.exchangeFee),r=s-a,o=[];(e<this.minTradingLimit||s<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return r>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:r,feePct:i,errors:o}}calculateInGivenOut(t,e){let n=G.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}calculateOutGivenIn(t,e){let n=G.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),s=BigInt(n);return s<0n?0n:s}spotPriceInGivenOut(t){let e=G.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=G.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=G.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as Xs}from"polkadot-api";import{of as Ys}from"rxjs";var Tt=class extends C{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),s=e.map(async({keyArgs:a,value:i})=>{let[r]=a,[o,l]=i,[u,d,m,p]=await Promise.all([this.getBalance(r,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(r,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:r,type:"XYK",tokens:[{id:o,decimals:d?.decimals,existentialDeposit:d?.existential_deposit,balance:u,type:d?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:m,type:p?.asset_type.type}],...n}});return Promise.all(s)}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(Xs.BackwardsCompatible,e)}subscribePoolChange(t){return Ys(t)}};var ne={};w(ne,{AavePool:()=>xt,AavePoolClient:()=>St});var xt=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,s,a){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=s,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),s=n.get(t),a=n.get(e);if(s==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:s.balance,balanceOut:a.balance,decimalsIn:s.decimals,decimalsOut:a.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let s=this.calculateInGivenOut(t,e),a=[];return e>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:a}}validateAndSell(t,e,n){let s=this.calculateOutGivenIn(t,e),a=[];return s>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:e,calculatedOut:s,amountOut:s,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}};import{AccountId as js}from"polkadot-api";import{toHex as Ks}from"@polkadot-api/utils";import{map as zs,merge as $s,switchMap as Qs}from"rxjs";import{decodeEventLog as Js}from"viem";var De=[{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:Zs}=K,ta=["Supply","Withdraw","Repay","Borrow"],St=class extends C{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:s,liqudity_in:a,liqudity_out:i})=>{let[r,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(s),this.api.query.AssetRegistry.AssetLocations.getValue(s)]);return{address:this.getPoolId(n,s),type:"Aave",tokens:[{id:n,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:a,location:o,type:r?.asset_type.type},{id:s,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:i,location:u,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:s,liqudity_out:a}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(i=>{let r=i.id===e.id?s:a;return{...i,balance:r}})}getPoolId(t,e){let n=t+"/"+e,s=new TextEncoder().encode(n.padEnd(32,"\0")),a=Ks(s);return js(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,s=this.getReserveH160Id(e),a=this.api.event.Router.Executed.watch(({asset_in:r,asset_out:o})=>r===n.id||o===n.id),i=this.api.event.EVM.Log.watch(({log:r})=>{let{topics:o,data:l}=r,u=o.map(g=>g.asHex()),d=l.asHex(),{eventName:m,args:p}=Js({abi:De,topics:u,data:d});return ta.includes(m)&&p.reserve.toLowerCase()===s.toLowerCase()});return $s([a,i]).pipe(Qs(()=>this.getPoolDelta(t)),zs(r=>({...t,tokens:[...r]})))}getReserveH160Id(t){return t.type==="Erc20"?X.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Zs.fromAssetId(t.id)}};var st=class{static get(t){switch(t.type){case"Aave":return xt.fromPool(t);case"XYK":return ft.fromPool(t);case"Omnipool":return bt.fromPool(t);case"LBP":return dt.fromPool(t);case"Stableswap":return ht.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as ea,Subscription as wt,takeUntil as na}from"rxjs";var at=class extends _{lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=wt.EMPTY;omniSub=wt.EMPTY;stableSub=wt.EMPTY;xykSub=wt.EMPTY;aaveSub=wt.EMPTY;isReady=!1;isDestroyed=new ea;constructor(t){super(t),this.lbpClient=new gt(t),this.omniClient=new yt(t),this.stableClient=new Pt(t),this.xykClient=new Tt(t),this.aaveClient=new St(t),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe(na(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(){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let t=await Promise.all(this.clients.filter(e=>this.active.has(e.getPoolType())).map(e=>e.getPools()));return this.isReady=!0,t.flat()}async getPoolFees(t,e){let n=this.clients.find(s=>s.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new pt(t.type)}};var Ne={};w(Ne,{DEFAULT_BLOCK_TIME:()=>Me,DEFAULT_MIN_BUDGET:()=>ie,ORDER_MIN_BLOCK_PERIOD:()=>Le,Router:()=>it,TWAP_BLOCK_PERIOD:()=>Ot,TWAP_MAX_DURATION:()=>oe,TWAP_MAX_PRICE_IMPACT:()=>re,TWAP_TX_MULTIPLIER:()=>Iu,TradeOrderError:()=>ae,TradeOrderType:()=>Mt,TradeRouteBuilder:()=>M,TradeRouter:()=>rt,TradeScheduler:()=>ot,TradeType:()=>Ct});var Dt=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 sa=5,It=class{isNotVisited(t,e){let n=!0;return e.forEach(s=>{(s[0]===t[0]||s[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let s=[],a=new Dt,i=[];for(i.push([e,""]),a.enqueue(i);a.size()>0;){let r=a.dequeue();if(r==null||r.length>sa)return s;let o=r[r.length-1];(n===null||o[0]===n)&&s.push(r),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,r)){let d=[...r];d.push(u),a.enqueue(d)}})}return s}buildAndPopulateGraph(t,e){let n=new Map;for(let s of t)n.set(parseInt(s),[]);for(let[s,a,i]of e)n.get(a)?.push([i,s]);return n}};function se(c){let t={};for(let e of c){let n=e.tokens.length;for(let s=0;s<n;s++){t[e.tokens[s].id]||(t[e.tokens[s].id]=[]);for(let a=0;a<n;a++){if(s==a)continue;let i=[e.address,e.tokens[s].id,e.tokens[a].id];t[e.tokens[s].id].push(i)}}}return t}var vt=class{getProposals(t,e,n){let s=se(n),a=Object.keys(s),i=a.map(u=>s[u]).flat(),r=new It,o=r.buildAndPopulateGraph(a,i),l=r.findPaths(o,t,e);return this.parsePaths(l)}parsePaths(t){let e=[];for(let n of t){let s=[];for(let a=0;a<n.length;a++){let i=n[a],r=n[a+1];if(r==null)break;s.push(this.toEdge(i,r))}e.push(s)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var it=class{routeSuggester;routerOptions;ctx;defaultRouterOptions={useOnly:[]};constructor(t,e){this.ctx=t,this.routeSuggester=new vt,this.routerOptions={...this.defaultRouterOptions,...e}}async getPools(){let t=await this.ctx.getPools(),e=this.routerOptions.useOnly;return e.length===0?t:t.filter(n=>e.includes(n.type))}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)}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 s=this.getAssets(n);if(!s.has(t))throw new Error(t+" is not supported asset");if(!s.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(s=>s.id)).flat().sort((n,s)=>n>s?1:-1);return new Set(e)}getPaths(t,e,n){let s=this.toPoolsMap(n);return this.routeSuggester.getProposals(t,e,n).filter(i=>this.validPath(i,s)).map(i=>this.toHops(i,s))}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,s)=>n&&s)}validEdge([t,e,n],s){return s.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,st.get(e)]))}toHops(t,e){return t.map(([n,s,a])=>{let i=e.get(n);return{poolAddress:n,poolId:i?.id,pool:i?.type,assetIn:s,assetOut:a}})}};var Ct=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Ct||{}),Mt=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(Mt||{}),ae=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(ae||{});var rt=class extends it{isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,s)=>{let a=n[n.length-1].amountOut,i=s[s.length-1].amountOut;return a>i?-1:1});return e.find(n=>n.every(s=>s.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,i)=>a+i),s=t.map(a=>a.tradeFeeRange?.[1]??a.tradeFeePct).reduce((a,i)=>a+i);return[n,s]}}getPoolFeeRange(t){let e=t.min?h.toPct(t.min):void 0,n=t.max?h.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}async getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(r=>r.assetOutDecimals).reduce((r,o)=>r+o),s=t.map(r=>r.spotPrice).reduce((r,o)=>r*o),a=n-e.assetOutDecimals,i=Math.pow(10,a);return s/BigInt(i)}async getSell(t,e,n,s){let a=await super.getPools(),i=super.validateInput(t,e,a),r=super.getPaths(t,e,a);if(r.length===0)throw new et(t,e);let o;if(s)o=await this.toSellSwaps(n,s,i);else{let O=await Promise.all(r.map(R=>this.toSellSwaps(n,R,i)));o=this.findBestSellRoute(O)}let l=o[0],u=o[o.length-1],d=this.isDirectTrade(o),m=await this.getSellSpot(o),p=u.amountOut,g=d?u.calculatedOut:this.calculateDelta0Y(l.amountIn,o,i),P=g-p,b=this.getRouteFeeRange(o),x=d?u.tradeFeePct:v.calculateSellFee(g,p),f=Math.pow(10,l.assetInDecimals),T=l.amountIn*m/BigInt(f),S=v.calculateDiffToRef(g,T);return{type:"Sell",amountIn:l.amountIn,amountOut:u.amountOut,spotPrice:m,tradeFee:P,tradeFeePct:x,tradeFeeRange:b,priceImpactPct:S,swaps:o,toHuman(){return{type:"Sell",amountIn:y.toDecimal(l.amountIn,l.assetInDecimals),amountOut:y.toDecimal(u.amountOut,u.assetOutDecimals),spotPrice:y.toDecimal(m,u.assetOutDecimals),tradeFee:y.toDecimal(P,u.assetOutDecimals),tradeFeePct:x,tradeFeeRange:b,priceImpactPct:S,swaps:o.map(O=>O.toHuman())}}}}calculateDelta0Y(t,e,n){let s=[];for(let a=0;a<e.length;a++){let i=e[a],r=n.get(i.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(i.assetIn,i.assetOut),l;a>0?l=s[a-1]:l=t;let u=r.calculateOutGivenIn(o,l);s.push(u)}return s[s.length-1]}async toSellSwaps(t,e,n){let s=[];for(let a=0;a<e.length;a++){let i=e[a],r=n.get(i.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(i.assetIn,i.assetOut),l;a>0?l=s[a-1].amountOut:l=typeof t=="string"?y.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(r,o.assetOut),{amountOut:d,calculatedOut:m,feePct:p,errors:g}=r.validateAndSell(o,l,u),P=this.getPoolFeeRange(u),b=r.spotPriceOutGivenIn(o),x=Math.pow(10,o.decimalsIn),f=l*b/BigInt(x),T=v.calculateDiffToRef(m,f);s.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:d,calculatedOut:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return r.type==="Aave"&&r.tokens[0].id===i.assetIn},isWithdraw(){return r.type==="Aave"&&r.tokens[1].id===i.assetIn},toHuman(){return{...i,amountIn:y.toDecimal(l,o.decimalsIn),amountOut:y.toDecimal(d,o.decimalsOut),calculatedOut:y.toDecimal(m,o.decimalsOut),spotPrice:y.toDecimal(b,o.decimalsOut),tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g}}})}return s}async getMostLiquidRoute(t,e){let n=await super.getPools(),s=super.validateInput(t,e,n),a=super.getPaths(t,e,n),o=n.filter(m=>m.tokens.some(p=>p.id===t&&p.id!==m.id)).map(m=>m.type==="Aave"?m.tokens:m.tokens.filter(p=>p.id===t)).map(m=>m.map(p=>p.balance).reduce((p,g)=>p+g)).sort((m,p)=>p<m?-1:1)[0],l=v.getFraction(o,.1),u=await Promise.all(a.map(m=>this.toSellSwaps(l,m,s)));return this.findBestSellRoute(u).map(m=>({poolAddress:m.poolAddress,poolId:m?.poolId,pool:m.pool,assetIn:m.assetIn,assetOut:m.assetOut}))}async getSpotPrice(t,e){let n=await super.getPools(),s=super.validateInput(t,e,n),a=await this.getMostLiquidRoute(t,e),i=await this.toSellSwaps("1",a,s),r=await this.getSellSpot(i),o=i[i.length-1].assetOutDecimals;return{amount:r,decimals:o}}findBestBuyRoute(t){let e=t.sort((n,s)=>{let a=n[0].amountIn,i=s[0].amountIn;return a>i?1:-1});return e.find(n=>n.every(s=>s.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}async getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(r=>r.assetInDecimals).reduce((r,o)=>r+o),s=t.map(r=>r.spotPrice).reduce((r,o)=>r*o),a=n-e.assetInDecimals,i=Math.pow(10,a);return s/BigInt(i)}async getBuy(t,e,n,s){let a=await super.getPools(),i=super.validateInput(t,e,a),r=super.getPaths(t,e,a);if(r.length===0)throw new et(t,e);let o;if(s)o=await this.toBuySwaps(n,s,i);else{let O=await Promise.all(r.map(R=>this.toBuySwaps(n,R,i)));o=this.findBestBuyRoute(O)}let l=o[o.length-1],u=o[0],d=this.isDirectTrade(o),m=await this.getBuySpot(o),p=u.amountIn,g=d?u.calculatedIn:this.calculateDelta0X(l.amountOut,o,i),P=p-g,b=this.getRouteFeeRange(o),x=d?u.tradeFeePct:v.calculateBuyFee(g,p),f=Math.pow(10,l.assetOutDecimals),T=l.amountOut*m/BigInt(f),S;return g===0n?S=-100:S=v.calculateDiffToRef(T,g),{type:"Buy",amountOut:l.amountOut,amountIn:u.amountIn,spotPrice:m,tradeFee:P,tradeFeePct:x,tradeFeeRange:b,priceImpactPct:S,swaps:o,toHuman(){return{type:"Buy",amountOut:y.toDecimal(l.amountOut,l.assetOutDecimals),amountIn:y.toDecimal(u.amountIn,u.assetInDecimals),spotPrice:y.toDecimal(m,u.assetInDecimals),tradeFee:y.toDecimal(P,u.assetInDecimals),tradeFeePct:x,tradeFeeRange:b,priceImpactPct:S,swaps:o.map(O=>O.toHuman())}}}}calculateDelta0X(t,e,n){let s=[];for(let a=e.length-1;a>=0;a--){let i=e[a],r=n.get(i.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(i.assetIn,i.assetOut),l;a==e.length-1?l=t:l=s[0];let u=r.calculateInGivenOut(o,l);s.unshift(u)}return s[0]}async toBuySwaps(t,e,n){let s=[];for(let a=e.length-1;a>=0;a--){let i=e[a],r=n.get(i.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(i.assetIn,i.assetOut),l;a==e.length-1?l=typeof t=="string"?y.toBigInt(t,o.decimalsOut):t:l=s[0].amountIn;let u=await this.ctx.getPoolFees(r,o.assetOut),{amountIn:d,calculatedIn:m,feePct:p,errors:g}=r.validateAndBuy(o,l,u),P=this.getPoolFeeRange(u),b=r.spotPriceInGivenOut(o),x=Math.pow(10,o.decimalsOut),f=l*b/BigInt(x),T;m===0n?T=-100:T=v.calculateDiffToRef(f,m),s.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:d,calculatedIn:m,spotPrice:b,tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g,isSupply(){return r.type==="Aave"&&r.tokens[0].id===i.assetIn},isWithdraw(){return r.type==="Aave"&&r.tokens[1].id===i.assetIn},toHuman(){return{...i,amountOut:y.toDecimal(l,o.decimalsOut),amountIn:y.toDecimal(d,o.decimalsIn),calculatedIn:y.toDecimal(m,o.decimalsIn),spotPrice:y.toDecimal(b,o.decimalsIn),tradeFeePct:p,tradeFeeRange:P,priceImpactPct:T,errors:g}}})}return s}};var Me=6e3,ie=1000000000000000n,Ot=6,re=-5,oe=216e5,Iu=3,Le=6;import{Enum as qe}from"polkadot-api";var M=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:s,poolId:a})=>s==="Stableswap"?{pool:qe("Stableswap",a),asset_in:e,asset_out:n}:{pool:qe(s),asset_in:e,asset_out:n})}};var ot=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??ie})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,s,a){let[i,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:u}=r,d=l[0],m=l[l.length-1],{assetInDecimals:p}=d,{assetOutDecimals:g}=m,P=Math.abs(u),b=this.getMinimumTradeCount(o,i),x=this.getOptimalTradeCount(P),f=a?Math.round(s/a):x,T=Math.ceil(s/b),S=Math.round(s/x),O=Math.round(s/f),R=o/BigInt(f),k=await this.router.getBestSell(t,e,R),U=o<i,At=[];U&&At.push("OrderTooSmall");let Bt=k.amountOut*BigInt(f),Nt=this.toBlockPeriod(O),Ht=k.tradeFee*BigInt(f),Ve=M.build(l),ue={assetIn:t,assetOut:e,errors:At,frequencyMin:T,frequencyOpt:S,frequency:O,tradeCount:f,tradeFee:Ht,tradeImpactPct:k.priceImpactPct,tradePeriod:Nt,tradeRoute:Ve,type:"Dca"};return{...ue,amountIn:o,amountOut:Bt,tradeAmountIn:k.amountIn,tradeAmountOut:k.amountOut,toHuman(){return{...ue,amountIn:y.toDecimal(o,p),amountOut:y.toDecimal(Bt,g),tradeAmountIn:y.toDecimal(k.amountIn,p),tradeAmountOut:y.toDecimal(k.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),n=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let s=t+n/2n;return Number(s/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[s,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:i,swaps:r,priceImpactPct:o}=a,l=r[0],u=r[r.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),P=i/BigInt(g),b=await this.router.getBestSell(l.assetIn,u.assetOut,P),x=g===1,f=i<s,T=b.priceImpactPct<-5,S=[];f||x?S.push("OrderTooSmall"):T&&S.push("OrderImpactTooBig");let O=b.amountOut*BigInt(g),R=b.tradeFee*BigInt(g),k=M.build(r),U={assetIn:t,assetOut:e,errors:S,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:k,type:"TwapSell"};return{...U,amountIn:i,amountOut:O,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:R,toHuman(){return{...U,amountIn:y.toDecimal(i,d),amountOut:y.toDecimal(O,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(R,m)}}}}async getTwapBuyOrder(t,e,n){let[s,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:i,swaps:r,priceImpactPct:o}=a,l=r[0],u=r[r.length-1],{assetInDecimals:d}=l,{assetOutDecimals:m}=u,p=Math.abs(o),g=this.getTwapTradeCount(p),P=i/BigInt(g),b=await this.router.getBestBuy(l.assetIn,u.assetOut,P),x=b.amountIn*BigInt(g),f=g===1,T=x<s,S=b.priceImpactPct<-5,O=[];T||f?O.push("OrderTooSmall"):S&&O.push("OrderImpactTooBig");let R=b.tradeFee*BigInt(g),k=M.build(r),U={assetIn:t,assetOut:e,errors:O,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:k,type:"TwapBuy"};return{...U,amountIn:x,amountOut:i,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:R,toHuman(){return{...U,amountIn:y.toDecimal(x,d),amountOut:y.toDecimal(i,m),tradeAmountIn:y.toDecimal(b.amountIn,d),tradeAmountOut:y.toDecimal(b.amountOut,m),tradeFee:y.toDecimal(R,d)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let s=216e5/(this.blockTime*6);return Math.round(s)}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 Ue={};w(Ue,{TxBuilderFactory:()=>ut});import{Enum as Ge}from"polkadot-api";function He(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var lt=class extends _{evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evmClient=e??new F,this.balanceClient=new q(t),this.aaveUtils=new Y(this.evmClient)}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:Vt})}async dryRun(t,e){let n=Ge("Signed",t),s=Ge("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(s,e.decodedCall),r=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(r){let o=He(r.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var Lt=class extends lt{_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:s}=e[0],a=await this.balanceClient.getBalance(this.beneficiary,s);return t>=a-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],a=n[n.length-1],i=v.getFraction(t,this.slippagePct),r=s.assetIn,o=a.assetOut,l=t+i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.buy({asset_in:r,asset_out:o,amount:e,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:r,asset_out:o,amount_out:e,max_amount_in:l,route:M.build(n)}),this.wrapTx("RouterBuy",u)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,s=n[0],a=n[n.length-1],i=v.getFraction(e,this.slippagePct),r=s.assetIn,o=a.assetOut,l=e-i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.sell({asset_in:r,asset_out:o,amount:t,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:r,asset_out:o,amount_in:t,min_amount_out:l,route:M.build(n)}),s.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],s=e[e.length-1],a=v.getFraction(t,this.slippagePct),i=n.assetIn,r=s.assetOut,o=t-a,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:r,min_amount_out:o,route:M.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as le}from"polkadot-api";var qt=class extends lt{_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:s,tradePeriod:a,tradeRoute:i}=this.order,r=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:a,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,order:le("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:0n,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",r)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:a,tradePeriod:i,tradeRoute:r}=this.order,o=v.getFraction(a,this.slippagePct),l=a-o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,order:le("Sell",{asset_in:e,asset_out:n,amount_in:s,min_amount_out:l,route:r})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",u)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:s,tradeAmountOut:a,tradePeriod:i,tradeRoute:r}=this.order,o=v.getFraction(s,this.slippagePct),l=s+o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,order:le("Buy",{asset_in:e,asset_out:n,amount_out:a,max_amount_in:l,route:r})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",u)}};var ut=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e??new F}trade(t){return new Lt(this.client,this.evmClient).setTrade(t)}order(t){return new qt(this.client,this.evmClient).setOrder(t)}};async function wc(c,t){let e=new J(c),[n,s]=await Promise.all([e.getBlockTime(),e.getMinOrderBudget()]),a=t??new F,i=new at(c).withAave().withOmnipool().withStableswap().withXyk(),r=new Y(a),o=new rt(i),l=new ot(o,{blockTime:n,minBudgetInNative:s});return{api:{aave:r,router:o,scheduler:l},client:{asset:new $(c),balance:new q(c),evm:a,staking:new tt(c)},ctx:{pool:i},tx:new ut(c,a),destroy:()=>{i.destroy()}}}export{we as aave,me as api,y as big,Oe as client,he as const,wc as createSdkContext,K as erc20,Ae as error,be as evm,h as fmt,Ft as h160,X as json,v as math,Ce as pool,Ne as sor,Ue as tx,Se as xc};
File without changes
@@ -0,0 +1,162 @@
1
+ import { Papi } from 'api';
2
+ import Big from 'big.js';
3
+ export declare const BIG_10: Big.Big;
4
+ export declare const BIG_BILL: Big.Big;
5
+ export declare class StakingClient extends Papi {
6
+ #private;
7
+ getHydraAccountAddress(seed: string): string;
8
+ getFreePotBalance(palletId: string): Promise<bigint>;
9
+ getBlockNumber(): Promise<number>;
10
+ getPalletId(): Promise<string>;
11
+ getPeriodLength(): Promise<number>;
12
+ getUnclaimablePeriods(): Promise<bigint>;
13
+ getNFTCollectionId(): Promise<bigint>;
14
+ getStaking(): Promise<{
15
+ total_stake: bigint;
16
+ accumulated_reward_per_stake: bigint;
17
+ pot_reserved_balance: bigint;
18
+ }>;
19
+ getUniques(address: string, collectionId: bigint): Promise<{
20
+ address: import("polkadot-api").SS58String;
21
+ collectionId: bigint;
22
+ itemId: bigint;
23
+ }[]>;
24
+ getStakingPositionsValue(id: bigint): Promise<{
25
+ stake: bigint;
26
+ action_points: bigint;
27
+ reward_per_stake: bigint;
28
+ created_at: number;
29
+ accumulated_slash_points: bigint;
30
+ accumulated_unpaid_rewards: bigint;
31
+ accumulated_locked_rewards: bigint;
32
+ } | undefined>;
33
+ getStakingVotes(id: bigint): Promise<[number, {
34
+ amount: bigint;
35
+ conviction: import("@galacticcouncil/descriptors").VotingConviction;
36
+ }][]>;
37
+ getReferendumInfo(key: number): Promise<import("polkadot-api").Enum<{
38
+ Ongoing: {
39
+ "track": number;
40
+ "origin": import("polkadot-api").Enum<{
41
+ system: import("@galacticcouncil/descriptors").DispatchRawOrigin;
42
+ Council: import("polkadot-api").Enum<{
43
+ "Members": import("polkadot-api").FixedSizeArray<2, number>;
44
+ "Member": import("polkadot-api").SS58String;
45
+ "_Phantom": undefined;
46
+ }>;
47
+ TechnicalCommittee: import("polkadot-api").Enum<{
48
+ "Members": import("polkadot-api").FixedSizeArray<2, number>;
49
+ "Member": import("polkadot-api").SS58String;
50
+ "_Phantom": undefined;
51
+ }>;
52
+ Origins: import("polkadot-api").Enum<{
53
+ "WhitelistedCaller": undefined;
54
+ "ReferendumCanceller": undefined;
55
+ "ReferendumKiller": undefined;
56
+ "GeneralAdmin": undefined;
57
+ "OmnipoolAdmin": undefined;
58
+ "Treasurer": undefined;
59
+ "Spender": undefined;
60
+ "Tipper": undefined;
61
+ "EconomicParameters": undefined;
62
+ }>;
63
+ Ethereum: import("polkadot-api").Enum<{
64
+ "EthereumTransaction": import("polkadot-api").FixedSizeBinary<20>;
65
+ }>;
66
+ PolkadotXcm: import("@galacticcouncil/descriptors").XcmPalletOrigin;
67
+ CumulusXcm: import("polkadot-api").Enum<{
68
+ "Relay": undefined;
69
+ "SiblingParachain": number;
70
+ }>;
71
+ Void: undefined;
72
+ }>;
73
+ "proposal": import("@galacticcouncil/descriptors").PreimagesBounded;
74
+ "enactment": import("@galacticcouncil/descriptors").TraitsScheduleDispatchTime;
75
+ "submitted": number;
76
+ "submission_deposit": {
77
+ amount: bigint;
78
+ who: import("polkadot-api").SS58String;
79
+ };
80
+ "decision_deposit"?: {
81
+ amount: bigint;
82
+ who: import("polkadot-api").SS58String;
83
+ } | undefined;
84
+ "deciding"?: ({
85
+ "since": number;
86
+ "confirming"?: number | undefined;
87
+ }) | undefined;
88
+ "tally": {
89
+ ayes: bigint;
90
+ nays: bigint;
91
+ support: bigint;
92
+ };
93
+ "in_queue": boolean;
94
+ "alarm"?: ([number, import("polkadot-api").FixedSizeArray<2, number>]) | undefined;
95
+ };
96
+ Approved: [number, {
97
+ amount: bigint;
98
+ who: import("polkadot-api").SS58String;
99
+ } | undefined, {
100
+ amount: bigint;
101
+ who: import("polkadot-api").SS58String;
102
+ } | undefined];
103
+ Rejected: [number, {
104
+ amount: bigint;
105
+ who: import("polkadot-api").SS58String;
106
+ } | undefined, {
107
+ amount: bigint;
108
+ who: import("polkadot-api").SS58String;
109
+ } | undefined];
110
+ Cancelled: [number, {
111
+ amount: bigint;
112
+ who: import("polkadot-api").SS58String;
113
+ } | undefined, {
114
+ amount: bigint;
115
+ who: import("polkadot-api").SS58String;
116
+ } | undefined];
117
+ TimedOut: [number, {
118
+ amount: bigint;
119
+ who: import("polkadot-api").SS58String;
120
+ } | undefined, {
121
+ amount: bigint;
122
+ who: import("polkadot-api").SS58String;
123
+ } | undefined];
124
+ Killed: number;
125
+ }> | undefined>;
126
+ getStakingPosition(id: bigint): Promise<{
127
+ stake: bigint | undefined;
128
+ rewardPerStake: bigint | undefined;
129
+ createdAt: number | undefined;
130
+ actionPoints: bigint | undefined;
131
+ accumulatedUnpaidRewards: bigint | undefined;
132
+ accumulatedSlashPoints: bigint | undefined;
133
+ accumulatedLockedRewards: bigint | undefined;
134
+ votes: {
135
+ id: number;
136
+ amount: bigint;
137
+ conviction: string;
138
+ }[];
139
+ }>;
140
+ getStake(address: string): Promise<{
141
+ totalStake: bigint;
142
+ accumulatedRewardPerStake: bigint;
143
+ potReservedBalance: bigint;
144
+ positionId: bigint | undefined;
145
+ stakePosition: {
146
+ stake: bigint | undefined;
147
+ rewardPerStake: bigint | undefined;
148
+ createdAt: number | undefined;
149
+ actionPoints: bigint | undefined;
150
+ accumulatedUnpaidRewards: bigint | undefined;
151
+ accumulatedSlashPoints: bigint | undefined;
152
+ accumulatedLockedRewards: bigint | undefined;
153
+ votes: {
154
+ id: number;
155
+ amount: bigint;
156
+ conviction: string;
157
+ }[];
158
+ } | undefined;
159
+ }>;
160
+ getSixBlockSince(): Promise<string>;
161
+ getRewards(account: string): Promise<string | undefined>;
162
+ }
@@ -1,4 +1,4 @@
1
1
  export { AssetClient } from './AssetClient';
2
2
  export { BalanceClient } from './BalanceClient';
3
3
  export { ChainParams } from './ChainParams';
4
- export { LiquidityMining } from './LiquidityMiningClient';
4
+ export { StakingClient } from './StakingClient';
@@ -1,6 +1,6 @@
1
1
  import { PolkadotClient } from 'polkadot-api';
2
2
  import { AaveUtils } from './aave';
3
- import { AssetClient, BalanceClient } from './client';
3
+ import { AssetClient, BalanceClient, StakingClient } from './client';
4
4
  import { EvmClient } from './evm';
5
5
  import { PoolContextProvider } from './pool';
6
6
  import { TradeRouter, TradeScheduler } from './sor';
@@ -15,6 +15,7 @@ export type SdkCtx = {
15
15
  asset: AssetClient;
16
16
  balance: BalanceClient;
17
17
  evm: EvmClient;
18
+ staking: StakingClient;
18
19
  };
19
20
  ctx: {
20
21
  pool: PoolContextProvider;
@@ -2,4 +2,5 @@ export { Router } from './Router';
2
2
  export { TradeRouter } from './TradeRouter';
3
3
  export { TradeScheduler } from './TradeScheduler';
4
4
  export { TradeRouteBuilder } from './TradeRouteBuilder';
5
+ export * from './const';
5
6
  export * from './types';
@@ -2,4 +2,3 @@ import { PoolFee } from '../pool';
2
2
  export declare function toPct(fee: PoolFee): number;
3
3
  export declare function toDecimals(fee: PoolFee): number;
4
4
  export declare function fromPermill(permill: number): PoolFee;
5
- export declare function shiftNeg(amount: string | number | bigint, decimals: number): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@galacticcouncil/sdk-next",
3
- "version": "0.5.0-pr169-c8f4f7a",
3
+ "version": "0.5.0-pr188-e2622c3",
4
4
  "description": "Galactic next gen sdk (papi)",
5
5
  "author": "GalacticCouncil",
6
6
  "repository": {
@@ -35,7 +35,7 @@
35
35
  "@types/big.js": "^6.2.2"
36
36
  },
37
37
  "dependencies": {
38
- "@galacticcouncil/descriptors": "1.3.0-pr169-c8f4f7a",
38
+ "@galacticcouncil/descriptors": "^1.2.0",
39
39
  "@galacticcouncil/math-lbp": "^1.2.0",
40
40
  "@galacticcouncil/math-liquidity-mining": "^1.2.0",
41
41
  "@galacticcouncil/math-omnipool": "^1.3.0",
@@ -1,46 +0,0 @@
1
- import { PolkadotClient } from 'polkadot-api';
2
- import { Papi } from '../api';
3
- import { BalanceClient } from './BalanceClient';
4
- export declare class LiquidityMining extends Papi {
5
- protected readonly balanceClient: BalanceClient;
6
- protected omnipoolAssetIds: string[];
7
- private secondsInYear;
8
- constructor(client: PolkadotClient);
9
- getOraclePrice(rewardCurrency: number, incentivizedAsset: number): Promise<bigint | undefined>;
10
- private getFarmAddress;
11
- private getGlobalRewardPerPeriod;
12
- private getPoolYieldPerPeriod;
13
- private farmData;
14
- getOmnipoolFarms(id: string): Promise<({
15
- apr: string;
16
- minApr: string | undefined;
17
- isDistributed: boolean;
18
- estimatedEndPeriod: string;
19
- maxRewards: bigint;
20
- incentivizedAsset: number;
21
- rewardCurrency: number;
22
- loyaltyCurve: {
23
- initial_reward_percentage: bigint;
24
- scale_coef: number;
25
- } | undefined;
26
- currentPeriod: string;
27
- potMaxRewards: bigint;
28
- fullness: string;
29
- } | undefined)[]>;
30
- getIsolatedFarms(id: string): Promise<({
31
- apr: string;
32
- minApr: string | undefined;
33
- isDistributed: boolean;
34
- estimatedEndPeriod: string;
35
- maxRewards: bigint;
36
- incentivizedAsset: number;
37
- rewardCurrency: number;
38
- loyaltyCurve: {
39
- initial_reward_percentage: bigint;
40
- scale_coef: number;
41
- } | undefined;
42
- currentPeriod: string;
43
- potMaxRewards: bigint;
44
- fullness: string;
45
- } | undefined)[]>;
46
- }