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