@galacticcouncil/sdk-next 0.6.0 → 0.6.1-pr196-dd3d5d5
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/factory.d.ts +2 -0
- package/build/types/farm/LiquidityMiningApi.d.ts +89 -0
- package/build/types/farm/LiquidityMiningClient.d.ts +130 -0
- package/build/types/farm/index.d.ts +2 -0
- package/build/types/utils/format.d.ts +1 -0
- package/package.json +1 -1
package/build/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var Dn=Object.create;var Zt=Object.defineProperty;var Mn=Object.getOwnPropertyDescriptor;var Ln=Object.getOwnPropertyNames;var qn=Object.getPrototypeOf,Nn=Object.prototype.hasOwnProperty;var Ze=(c,t)=>()=>(c&&(t=c(c=0)),t);var w=(c,t)=>{for(var e in t)Zt(c,e,{get:t[e],enumerable:!0})},Jt=(c,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of Ln(t))!Nn.call(c,a)&&a!==e&&Zt(c,a,{get:()=>t[a],enumerable:!(n=Mn(t,a))||n.enumerable});return c},ut=(c,t,e)=>(Jt(c,t,"default"),e&&Jt(e,t,"default")),te=(c,t,e)=>(e=c!=null?Dn(qn(c)):{},Jt(t||!c||!c.__esModule?Zt(e,"default",{value:c,enumerable:!0}):e,c)),Hn=c=>Jt(Zt({},"__esModule",{value:!0}),c);var It={};var nn=Ze(()=>{ut(It,require("@polkadot-api/ws-provider/node"))});var vt={};var an=Ze(()=>{ut(vt,require("@polkadot-api/ws-provider/web"))});var da={};w(da,{aave:()=>_e,api:()=>ge,big:()=>h,client:()=>Re,const:()=>xe,createSdkContext:()=>ma,erc20:()=>et,error:()=>Ee,evm:()=>Ce,fmt:()=>E,h160:()=>Bt,json:()=>J,math:()=>v,pool:()=>Ge,sor:()=>je,staking:()=>ze,tx:()=>Qe,xc:()=>Ae});module.exports=Hn(da);var ge={};w(ge,{Papi:()=>k,getWs:()=>Gn});var en=require("@galacticcouncil/descriptors");function tn(c){switch(c){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(en.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");tn(n)&&console.log(t,...e)}};var sn=require("polkadot-api"),rn=require("polkadot-api/polkadot-sdk-compat"),Gn=async c=>{let t=typeof c=="string"?c.split(","):c,a=(typeof window>"u"?(await Promise.resolve().then(()=>(nn(),It))).getWsProvider:(await Promise.resolve().then(()=>(an(),vt))).getWsProvider)(t);return(0,sn.createClient)((0,rn.withPolkadotSdkCompat)(a))};var _e={};w(_e,{AAVE_GAS_LIMIT:()=>he,AAVE_LENDING_POOL_ADDRESS:()=>ae,AAVE_POOL_ABI:()=>be,AAVE_POOL_DATA_PROVIDER:()=>ne,AAVE_POOL_DATA_PROVIDER_ABI:()=>ee,AAVE_POOL_PROXY:()=>ye,AAVE_ROUNDING_THRESHOLD:()=>_a,AAVE_UINT_256_MAX:()=>Un,AaveClient:()=>Ot,AaveUtils:()=>nt});var be=[{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 ee=[{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 ye="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",ne="0x112b087b60C1a166130d59266363C45F8aa99db0",ae="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",he=1000000n,_a=5,Un=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Ot=class{client;constructor(t){this.client=t.getWsProvider()}async getReservesData(){return await this.client.readContract({abi:ee,address:ne,args:[ae],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:ee,address:ne,args:[ae,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:be,address:ye,args:[t],functionName:"getUserAccountData"})}};var h={};w(h,{asBigInt:()=>Xn,toBigInt:()=>Wn,toDecimal:()=>Vn});var Q=te(require("big.js"));Q.default.NE=-18;function Vn(c,t,e=6,n){let a=(0,Q.default)(c.toString()),s=(0,Q.default)(10).pow(t);return a.div(s).round(e,n).toString()}function Wn(c,t){let e=(0,Q.default)(10).pow(t),a=(0,Q.default)(c).mul(e).toFixed(0,Q.default.roundDown);return BigInt(a)}function Xn(c){return BigInt(c.round(0,Q.default.roundDown).toFixed(0))}var et={};w(et,{ERC20:()=>Pe});var Pe=class{static fromAssetId(t){let e=Buffer.alloc(20,0);return e[15]=1,e.writeUInt32BE(t,16),"0x"+e.toString("hex")}static toAssetId(t){let e=Buffer.from(t.replace("0x",""),"hex");return e.length!==20||!this.isAssetAddress(t)?null:e.readUInt32BE(16)}static isAssetAddress(t){let e=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(t.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(e.subarray(0,16))}};var E={};w(E,{FeeUtils:()=>we});var xe={};w(xe,{HUB_ASSET_ID:()=>Se,HYDRATION_OMNIPOOL_ADDRESS:()=>Kn,HYDRATION_PARACHAIN_ID:()=>Yn,HYDRATION_SS58_PREFIX:()=>M,PERBILL_DENOMINATOR:()=>fe,PERMILL_DENOMINATOR:()=>At,RUNTIME_DECIMALS:()=>C,SYSTEM_ASSET_DECIMALS:()=>Te,SYSTEM_ASSET_ID:()=>H,TRADEABLE_DEFAULT:()=>ct});var C=18,At=1e6,fe=1e9,H=0,Te=12,Yn=2034,M=63,Kn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Se=1,ct=15;var we=class c{static toPct(t){let[e,n]=t;return c.safeDivide(e*100,n)}static toRaw(t){let[e,n]=t;return c.safeDivide(e,n)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,n=12){let a=10**n;return Math.round(t*a/e)/a}static safeRound(t){return parseFloat(t.toPrecision(15))}};var Bt={};w(Bt,{H160:()=>Oe,isEvmAccount:()=>on,isEvmAddress:()=>ln,isSs58Address:()=>un});var pt=require("polkadot-api"),Ie=require("@polkadot-api/utils"),j=require("buffer");var ve="ETH\0";function on(c){if(!c)return!1;try{let t=(0,pt.AccountId)().enc(c),e=j.Buffer.from(ve);return j.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function ln(c){return!!/^0x[a-fA-F0-9]{40}$/.test(c)}function un(c){try{return(0,pt.AccountId)(63).enc(c),!0}catch{return!1}}var Oe=class c{static toAccount=t=>{let e=j.Buffer.from(t.slice(2),"hex"),n=j.Buffer.from(ve),a=Uint8Array.from(j.Buffer.concat([n,e,j.Buffer.alloc(8)])),s=(0,Ie.toHex)(a);return(0,pt.AccountId)(63).dec(s)};static fromAccount=t=>{let e=(0,pt.AccountId)().enc(t),n=j.Buffer.from(ve),a=e.slice(n.length,-8);return"0x"+j.Buffer.from(a).toString("hex")};static fromSS58=t=>{let n=(0,pt.AccountId)().enc(t).slice(0,20);return(0,Ie.toHex)(n)};static fromAny=t=>{if(ln(t))return t;if(on(t))return c.fromAccount(t);if(un(t))return c.fromSS58(t);throw new Error("Unknown address type")}};var J={};w(J,{findNestedKey:()=>jn,findNestedObj:()=>zn,jsonFormatter:()=>$n});var jn=(c,t)=>{let e=[];return JSON.stringify(c,(n,a)=>(a&&a[t]&&e.push(a),a)),e[0]},zn=(c,t,e)=>{let n;return JSON.stringify(c,(a,s)=>(s&&s[t]===e&&(n=s),s)),n},$n=(c,t)=>typeof t=="bigint"?t.toString():t;var v={};w(v,{calculateBuyFee:()=>ta,calculateDiffToAvg:()=>Qn,calculateDiffToRef:()=>Jn,calculateSellFee:()=>Zn,getFraction:()=>ea});var U=te(require("big.js"));function Qn(c,t){let e=(0,U.default)(c.toString()),n=(0,U.default)(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Jn(c,t){if(t===0n)return 0;let e=(0,U.default)(c.toString()),n=(0,U.default)(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Zn(c,t){let e=(0,U.default)(c.toString()),n=(0,U.default)(t.toString());return(0,U.default)(1).minus(n.div(e)).mul(100).round(2).toNumber()}function ta(c,t){let e=(0,U.default)(c.toString());return(0,U.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function ea(c,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 c*a/BigInt(100*n)}var Ae={};w(Ae,{convertToId:()=>na});var cn=require("buffer");function na(c){let e=cn.Buffer.from(c.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:se}=et,{H160:Be}=Bt,aa=1.01,sa=99999,ra=10n**27n,ia=10n**18n,nt=class{client;constructor(t){this.client=new Ot(t)}async getSummary(t){let e=Be.fromAny(t),[n,a,s]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[i]=n,[r,o]=a,[l,u,p,g,m,b]=s,y=h.toDecimal(b,18),d=[];for(let P of r){let f=P.underlyingAsset.toLowerCase(),T=i.find(({underlyingAsset:de})=>de.toLowerCase()===f);if(!T)throw new Error("Missing pool reserve for "+f);let _=P.scaledATokenBalance,N=T.liquidityIndex,K=T.priceInMarketReferenceCurrency,D=_*N/ra,$t=Number(o===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,Qt=T.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,me=se.toAssetId(f);d.push({aTokenBalance:D,decimals:Number(T.decimals),isCollateral:Qt,priceInRef:K,reserveId:me,reserveAsset:f,reserveLiquidationThreshold:$t})}return{healthFactor:Number(y),totalCollateral:l,totalDebt:u,reserves:d}}async hasBorrowPositions(t){let e=Be.fromAny(t),n=await this.client.getUserAccountData(e),[a,s]=n;return s>0n}async getHealthFactor(t){let e=Be.fromAny(t),n=await this.client.getUserAccountData(e),[a,s,i,r,o,l]=n,u=h.toDecimal(l,18);return Number(u)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:a,totalDebt:s,reserves:i}=await this.getSummary(t),r=se.fromAssetId(e),o=i.find(d=>d.reserveAsset===r);if(!o)throw new Error("Missing reserve ctx for "+r);let{decimals:l,isCollateral:u,priceInRef:p,reserveLiquidationThreshold:g}=o,m=h.toBigInt(n,l),b=u?m*p/10n**BigInt(l):0n,y=a-b;return y<=0n?0:this.calculateHealthFactor(y,g,s)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:a,totalDebt:s,reserves:i}=await this.getSummary(t),r=se.fromAssetId(e),o=i.find(y=>y.reserveAsset===r);if(!o)throw new Error("Missing reserve ctx for "+r);let{decimals:l,priceInRef:u,reserveLiquidationThreshold:p}=o,m=h.toBigInt(n,l)*u/10n**BigInt(l),b=a+m;return b<=0n?0:this.calculateHealthFactor(b,p,s)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:a,reserves:s}=await this.getSummary(t),i=se.fromAssetId(e),r=s.find(o=>o.reserveAsset===i);if(!r)throw new Error("Missing reserve ctx for "+i);return this.calculateWithdrawMax(r,n,a)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:a}=await this.getSummary(t),s={};for(let i of a){let r=this.calculateWithdrawMax(i,e,n);i.reserveId&&(s[i.reserveId]=r)}return s}calculateHealthFactor(t,e,n){if(n===0n)return sa;let a=10n**6n,s=h.toBigInt(e,18),i=t*s*a,r=n*ia,o=i/r;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let a=h.toBigInt(t,18),s=h.toBigInt(e,18);return(a*n+s-1n)/s}calculateWithdrawMax(t,e,n){let{aTokenBalance:a,decimals:s,priceInRef:i,reserveLiquidationThreshold:r}=t,o=this.calculateRequiredCollateral(aa,r,n),l=e-o;if(l<=0n)return{amount:0n,decimals:s};let u=l*10n**BigInt(s)/i;return{amount:a<u?a:u,decimals:s}}};var Re={};w(Re,{AssetClient:()=>mt,BalanceClient:()=>V,ChainParams:()=>dt});var mt=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[s]=n;return[s,a]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:a})=>{let[s]=n;return[s,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[s]=n;return[s,a]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:a})=>{let[s]=n;return[s,a]}))}async mapToken(t,e,n,a){let{name:s,asset_type:i,is_sufficient:r,existential_deposit:o}=e,{symbol:l,decimals:u}=n.get(t)??{};return{id:t,name:s?.asText(),symbol:l,decimals:u,icon:l,type:i.type,isSufficient:r,location:a,existentialDeposit:o}}async mapBond(t,e,n,a){let[s,i]=a,{asset_type:r,is_sufficient:o,existential_deposit:l}=e,{symbol:u,decimals:p}=await this.mapToken(s,e,n),g=Number(i),m=new Intl.DateTimeFormat("en-GB"),b=[u,"Bond",m.format(g)].join(" ");return{id:t,name:b,symbol:u+"b",decimals:p,icon:u,type:r.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:s,maturity:g}}async mapShares(t,e,n,a){let{assets:s}=a,{name:i,symbol:r,asset_type:o,is_sufficient:l,existential_deposit:u}=e,p=await Promise.all(s.map(async b=>{let{symbol:y}=await this.mapToken(b,e,n);return[b,y]})),g=Object.fromEntries(p),m=Object.values(g);return{id:t,name:m.join(", "),symbol:r?.asText()||i?.asText(),decimals:18,icon:m.join("/"),type:o.type,isSufficient:l,existentialDeposit:u,meta:g}}async mapExternal(t,e,n,a){let s=await this.mapToken(t,e,new Map,a),i=n?.find(r=>r.internalId===s.id);return i?{...s,decimals:i.decimals,name:i.name,symbol:i.symbol,icon:i.symbol,isWhiteListed:i.isWhiteListed}:s}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,a,s,i]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),r=this.parseMetadata(n),o=[];for(let[l,u]of Array.from(n)){let p=a.get(l),{asset_type:g}=u,m;switch(g.type){case"Bond":let b=i.get(l);m=await this.mapBond(l,u,r,b);break;case"StableSwap":let y=s.get(l);m=await this.mapShares(l,u,r,y);break;case"External":m=await this.mapExternal(l,u,e,p);break;default:m=await this.mapToken(l,u,r,p)}o.push(m)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};var x=require("rxjs");var V=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,x.combineLatest)([e,n,a]).pipe((0,x.debounceTime)(250),(0,x.map)(s=>s.flat()),(0,x.startWith)([]),(0,x.bufferCount)(2,1),(0,x.map)(([s,i],r)=>{if(r===0)return i;let o=s.reduce((u,p)=>(u.set(p.id,p.balance),u),new Map);return i.filter(u=>!pn(u.balance,o.get(u.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,x.map)(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,x.map)(a=>({id:e,balance:a})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,x.distinctUntilChanged)((n,a)=>!a.deltas),(0,x.map)(({deltas:n})=>{let a=[];return n?.deleted.forEach(s=>{let[i,r]=s.args;a.push({id:r,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(s=>{let[i,r]=s.args;a.push({id:r,balance:this.calculateBalance(s.value)})}),a}))}subscribeErc20Balance(t,e){let n=new x.Subject,a=n.pipe((0,x.shareReplay)(1)),s=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:u}=l;return u.type==="Erc20"}).map(({keyArgs:l})=>{let[u]=l;return u}),i=async()=>{let o=e||await s(),l=async()=>{let g=(await Promise.all(o.map(async m=>{let b=await this.getTokenBalanceData(t,m);return[m,b]}))).map(([m,b])=>({id:m,balance:b}));n.next(g)};await l();let u=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>u.unsubscribe()},r;return i().then(o=>r=o),a.pipe((0,x.finalize)(()=>r?.()),(0,x.pairwise)(),(0,x.map)(([o,l],u)=>{if(u===0)return l;let p=o.reduce((m,b)=>(m.set(b.id,b.balance),m),new Map);return l.filter(m=>!pn(m.balance,p.get(m.id)))}),(0,x.distinctUntilChanged)((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},pn=(c,t)=>c!==void 0&&t!==void 0&&c.transferable===t.transferable&&c.total===t.total;var dt=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 Ee={};w(Ee,{AssetNotFound:()=>Fe,PoolNotFound:()=>_t,RouteNotFound:()=>Rt});var Fe=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},_t=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},Rt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var Ce={};w(Ce,{EvmClient:()=>Ft,createChain:()=>ke});var mn=require("viem"),oa=["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"],ke=()=>(0,mn.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:oa}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});var W=require("viem");var Ft=class{client;chain;constructor(t){this.client=t,this.chain=ke()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return(0,W.createPublicClient)({chain:this.chain,transport:(0,W.http)()})}getWsProvider(){return(0,W.createPublicClient)({transport:(0,W.custom)({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return(0,W.createWalletClient)({account:t,chain:this.chain,transport:(0,W.custom)(window.ethereum)})}};var Ge={};w(Ge,{PoolContextProvider:()=>Pt,PoolError:()=>at,PoolFactory:()=>ht,PoolType:()=>R,aave:()=>He,lbp:()=>Me,omni:()=>Le,stable:()=>qe,xyk:()=>Ne});var Me={};w(Me,{LbpMath:()=>G,LbpPool:()=>Et,LbpPoolClient:()=>Ct});var X=require("@galacticcouncil/math-lbp"),G=class{static getSpotPrice(t,e,n,a,s){return(0,X.get_spot_price)(t,e,n,a,s)}static calculateInGivenOut(t,e,n,a,s){return(0,X.calculate_in_given_out)(t,e,n,a,s)}static calculateOutGivenIn(t,e,n,a,s){return(0,X.calculate_out_given_in)(t,e,n,a,s)}static calculateLinearWeights(t,e,n,a,s){return(0,X.calculate_linear_weights)(t,e,n,a,s)}static calculatePoolTradeFee(t,e,n){return(0,X.calculate_pool_trade_fee)(t,e,n)}};var R=(s=>(s.Aave="Aave",s.LBP="LBP",s.Omni="Omnipool",s.Stable="Stableswap",s.XYK="XYK",s))(R||{}),at=(s=>(s.InsufficientTradingAmount="InsufficientTradingAmount",s.MaxInRatioExceeded="MaxInRatioExceeded",s.MaxOutRatioExceeded="MaxOutRatioExceeded",s.TradeNotAllowed="TradeNotAllowed",s.UnknownError="UnknownError",s))(at||{});var{FeeUtils:dn}=E,Et=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,a,s,i,r){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=s,this.fee=i,this.repayFeeApply=r}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),s=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:s.balance,decimalsIn:a.decimals,decimalsOut:s.decimals,weightIn:a.weight,weightOut:s.weight}}validateAndBuy(t,e,n){let a=this.tokens[0].id,s=[];e<this.minTradingLimit&&s.push("InsufficientTradingAmount");let i=t.balanceOut/this.maxOutRatio;if(e>i&&s.push("MaxOutRatioExceeded"),a===t.assetOut){let r=this.calculateTradeFee(e,n),o=dn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+r,u=this.calculateInGivenOut(t,l),p=t.balanceIn/this.maxInRatio;return u>p&&s.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:e,feePct:o,errors:s}}else{let r=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return r>o&&s.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:s}}}validateAndSell(t,e,n){let a=this.tokens[0].id,s=[];e<this.minTradingLimit&&s.push("InsufficientTradingAmount");let i=t.balanceIn/this.maxInRatio;if(e>i&&s.push("MaxInRatioExceeded"),a===t.assetIn){let r=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return r>o&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:s}}else{let r=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(r,n),l=dn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),u=r-o,p=t.balanceOut/this.maxOutRatio;return u>p&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:u,feePct:l,errors:s}}}calculateInGivenOut(t,e){let n=G.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=G.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=G.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=G.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=G.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};var bn=require("polkadot-api"),st=require("rxjs");var gn=(c,t=new Map)=>e=>{let n;return t.has(e)?t.get(e):(t.set(e,n=c(e)),n)};var I=require("rxjs");var De=[{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 kt=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,a,s]=await Promise.all([this.client.readContract({abi:De,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:De,address:t,functionName:"decimals"}),this.client.getBlock()]),[i,r,o,l]=n,u=s.number-(s.timestamp-l)/BigInt(e),p=Number(u);return{price:r,decimals:a,updatedAt:p<0?0:p}}};var L=class extends V{evm;mmOracle;override=[];mem=0;memPools=gn(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new kt(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(s=>s.type==="Erc20").map(s=>s.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 s=this.override.find(r=>r.id===e),i=!!n||!!s?.decimals;return a>0n&&i})}updatePool=(t,e)=>{let n=t.tokens.map(a=>{let s=e.find(r=>r.id===a.id),i=this.override.find(r=>r.id===a.id);return s?{...a,balance:s.balance.transferable,decimals:a.decimals||i?.decimals}:{...a,decimals:a.decimals||i?.decimals}});return{...t,tokens:n}}};var Ct=class extends L{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),a=e?.relay_parent_number||0,s=t.filter(({value:i})=>e&&this.isActivePool(i,a)).map(async({keyArgs:i,value:r})=>{let[o]=i,l=o.toString(),u=await this.getPoolDelta(l,r,a);return{address:l,type:"LBP",fee:r.fee,...u,...n}});return Promise.all(s)}async getPoolDelta(t,e,n){let{start:a,end:s,assets:i,initial_weight:r,final_weight:o,repay_target:l,fee_collector:u}=e,p=G.calculateLinearWeights(a?a.toString():"0",s?s.toString():"0",r.toString(),o.toString(),n.toString()),[g,m]=i,b=BigInt(p),y=this.MAX_FINAL_WEIGHT-BigInt(b),[d,P,f,T,_]=await Promise.all([this.isRepayFeeApplied(g,l,u.toString()),this.getBalance(t,g),this.api.query.AssetRegistry.Assets.getValue(g),this.getBalance(t,m),this.api.query.AssetRegistry.Assets.getValue(m)]);return{repayFeeApply:d,tokens:[{id:g,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:P.transferable,weight:b,type:f?.asset_type.type},{id:m,decimals:_?.decimals,existentialDeposit:_?.existential_deposit,balance:T.transferable,weight:y,type:_?.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(bn.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,st.switchMap)(a=>a?this.getPoolDelta(t.address,n,a.relay_parent_number):(0,st.of)(t)),(0,st.map)(a=>Object.assign({},t,a))):(0,st.of)(t)}};var Le={};w(Le,{OmniMath:()=>O,OmniPool:()=>Dt,OmniPoolClient:()=>Lt});var S=require("@galacticcouncil/math-omnipool"),rt=te(require("big.js")),O=class{static calculateSpotPrice(t,e,n,a){return(0,S.calculate_spot_price)(t,e,n,a)}static calculateLrnaSpotPrice(t,e){return(0,S.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,a,s,i,r,o,l){return(0,S.calculate_in_given_out)(t,e,n,a,s,i,r,o,l)}static calculateLrnaInGivenOut(t,e,n,a,s){return(0,S.calculate_lrna_in_given_out)(t,e,n,a,s)}static calculateOutGivenIn(t,e,n,a,s,i,r,o,l){return(0,S.calculate_out_given_in)(t,e,n,a,s,i,r,o,l)}static calculateOutGivenLrnaIn(t,e,n,a,s){return(0,S.calculate_out_given_lrna_in)(t,e,n,a,s)}static calculateShares(t,e,n,a){return(0,S.calculate_shares)(t,e,n,a)}static calculateLiquidityOut(t,e,n,a,s,i,r,o){return(0,S.calculate_liquidity_out)(t,e,n,a,s,i,r,o)}static calculateLiquidityLRNAOut(t,e,n,a,s,i,r,o){return(0,S.calculate_liquidity_lrna_out)(t,e,n,a,s,i,r,o)}static calculateCapDifference(t,e,n,a){let s=(0,rt.default)(e),i=(0,rt.default)(t),r=(0,rt.default)(a),o=(0,rt.default)(n),l=(0,rt.default)(10).pow(18),u=o.div(l);if(s.div(r).lt(u)){let g=u.times(r).minus(s).times(i),m=s.times((0,rt.default)(1).minus(u));return g.div(m).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,a){return(0,S.verify_asset_cap)(t,e,n,a)}static calculateLimitHubIn(t,e,n,a){return(0,S.calculate_liquidity_hub_in)(t,e,n,a)}static isSellAllowed(t){return(0,S.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,S.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,S.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,S.is_remove_liquidity_allowed)(t)}};var{FeeUtils:gt}=E,Dt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,a,s,i){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=s,this.hubAssetId=i}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),s=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:a.hubReserves,hubReservesOut:s.hubReserves,sharesIn:a.shares,sharesOut:s.shares,decimalsIn:a.decimals,decimalsOut:s.decimals,balanceIn:a.balance,balanceOut:s.balance,tradeableIn:a.tradeable,tradeableOut:s.tradeable,assetInEd:a.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),s=this.calculateInGivenOut(t,e,n),i=a===0n?0:v.calculateDiffToRef(s,a),r=[],o=O.isSellAllowed(t.tradeableIn),l=O.isBuyAllowed(t.tradeableOut);(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&r.push("InsufficientTradingAmount");let u=t.balanceOut/this.maxOutRatio;e>u&&r.push("MaxOutRatioExceeded");let p=t.balanceIn/this.maxInRatio;return s>p&&r.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:a,amountOut:e,feePct:i,errors:r}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),s=this.calculateOutGivenIn(t,e,n),i=v.calculateDiffToRef(a,s),r=[],o=O.isSellAllowed(t.tradeableIn),l=O.isBuyAllowed(t.tradeableOut);(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&r.push("InsufficientTradingAmount");let u=t.balanceIn/this.maxInRatio;e>u&&r.push("MaxInRatioExceeded");let p=t.balanceOut/this.maxOutRatio;return s>p&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:s,feePct:i,errors:r}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let a=O.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?gt.toRaw(n.assetFee).toString():"0",n?gt.toRaw(n.protocolFee).toString():"0"),s=BigInt(a);return s<0n?0n:s}calculateLrnaInGivenOut(t,e,n){let a=O.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?gt.toRaw(n.assetFee).toString():"0"),s=BigInt(a);return s<0n?0n:s}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let a=O.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?gt.toRaw(n.assetFee).toString():"0",n?gt.toRaw(n.protocolFee).toString():"0"),s=BigInt(a);return s<0n?0n:s}calculateOutGivenLrnaIn(t,e,n){let a=O.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?gt.toRaw(n.assetFee).toString():"0"),s=BigInt(a);return s<0n?0n:s}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=O.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=O.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=O.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=O.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var re=require("polkadot-api"),yn=require("@polkadot-api/utils"),Mt=require("rxjs");var{FeeUtils:Z}=E,Lt=class extends L{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,a,s,i,r]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:u,value:p})=>{let[g]=u,{hub_reserve:m,shares:b,tradable:y,cap:d,protocol_shares:P}=p,[f,T]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(g),this.getBalance(e,g)]);return{id:g,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:T.transferable,cap:d,hubReserves:m,protocolShares:P,shares:b,tradeable:y,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:i.transferable,tradeable:a,type:s?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...r}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=(0,yn.toHex)(e);return(0,re.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,s]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),i=n.min_fee+a.min_fee,r=n.max_fee+a.max_fee;if(s){let{asset_fee:o,protocol_fee:l}=s;return{assetFee:Z.fromPermill(o),protocolFee:Z.fromPermill(l),min:Z.fromPermill(i),max:Z.fromPermill(r)}}else return{assetFee:Z.fromPermill(n.min_fee),protocolFee:Z.fromPermill(a.min_fee),min:Z.fromPermill(i),max:Z.fromPermill(r)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(re.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,Mt.distinctUntilChanged)((n,a)=>!a.deltas),(0,Mt.map)(({entries:n})=>n.map(a=>{let[s]=a.args,{hub_reserve:i,shares:r,tradable:o,cap:l,protocol_shares:u}=a.value,p=t.tokens.findIndex(m=>m.id===s);return{...t.tokens[p],cap:l,hubReserves:i,protocolShares:u,shares:r,tradeable:o}})),(0,Mt.map)(n=>{let a=t.tokens.find(s=>s.id===1);return{...t,tokens:[...n,a]}}))}};var qe={};w(qe,{StableMath:()=>F,StableSwap:()=>qt,StableSwapClient:()=>Nt});var A=require("@galacticcouncil/math-stableswap"),F=class{static getPoolAddress(t){return(0,A.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,s){return(0,A.calculate_amplification)(t,e,n,a,s)}static calculateInGivenOut(t,e,n,a,s,i,r){return(0,A.calculate_in_given_out)(t,e,n,a,s,i,r)}static calculateAddOneAsset(t,e,n,a,s,i,r){return(0,A.calculate_add_one_asset)(t,e,n,a,s,i,r)}static calculateSharesForAmount(t,e,n,a,s,i,r){return(0,A.calculate_shares_for_amount)(t,e,n,a,s,i,r)}static calculateOutGivenIn(t,e,n,a,s,i,r){return(0,A.calculate_out_given_in)(t,e,n,a,s,i,r)}static calculateLiquidityOutOneAsset(t,e,n,a,s,i,r){return(0,A.calculate_liquidity_out_one_asset)(t,e,n,a,s,i,r)}static calculateShares(t,e,n,a,s,i){return(0,A.calculate_shares)(t,e,n,a,s,i)}static calculateSpotPriceWithFee(t,e,n,a,s,i,r,o){return(0,A.calculate_spot_price_with_fee)(t,e,n,a,s,i,r,o)}static recalculatePegs(t,e,n,a,s){let i=(0,A.recalculate_peg)(t,e,n,a,s);return JSON.parse(i)}};var{FeeUtils:tt}=E,qt=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.id,t.fee,t.totalIssuance)}constructor(t,e,n,a,s,i,r,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=s,this.amplification=i,this.id=r,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),s=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:s.balance,decimalsIn:a.decimals,decimalsOut:s.decimals,tradeableIn:this.id===t?15:a.tradeable,tradeableOut:this.id===e?15:s.tradeable,assetInEd:a.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),s=this.calculateInGivenOut(t,e,n),i=tt.toPct(n.fee),r=[],o=O.isSellAllowed(t.tradeableIn),l=O.isBuyAllowed(t.tradeableOut);return(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&r.push("InsufficientTradingAmount"),{amountIn:s,calculatedIn:a,amountOut:e,feePct:i,errors:r}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),s=this.calculateOutGivenIn(t,e,n),i=tt.toPct(n.fee),r=[],o=O.isSellAllowed(t.tradeableIn),l=O.isBuyAllowed(t.tradeableOut);return(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&r.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:a,amountOut:s,feePct:i,errors:r}}calculateIn(t,e,n){let a=F.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?tt.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(a);return s<0n?0n:s}calculateAddOneAsset(t,e,n){let a=F.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?tt.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(a);return s<0n?0n:s}calculateSharesForAmount(t,e,n){let a=F.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?tt.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(a);return s<0n?0n:s}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=F.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let 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=F.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?tt.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(a);return s<0n?0n:s}calculateWithdrawOneAsset(t,e,n){let a=F.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?tt.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(a);return s<0n?0n:s}calculateShares(t,e,n){let a=F.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?tt.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(a);return s<0n?0n:s}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=F.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let 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=F.defaultPegs(this.tokens.length-1);return JSON.stringify(t)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:a})=>({asset_id:e,amount:n,decimals:a}));return JSON.stringify(t,J.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],J.jsonFormatter)}};var ie=require("polkadot-api"),hn=require("@polkadot-api/utils"),Pn=require("@noble/hashes/blake2b"),bt=require("rxjs");var{FeeUtils:it}=E,Nt=class extends L{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=F.getPoolAddress(t),n=(0,Pn.blake2b)(e,{dkLen:32}),a=(0,hn.toHex)(n);return(0,ie.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:s,initial_block:i,final_block:r}=e,o=F.calculateAmplification(a.toString(),s.toString(),i.toString(),r.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),a=e.assets.map(async s=>{let[i,r,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,s),this.api.query.AssetRegistry.Assets.getValue(s),this.getBalance(n,s)]);return{id:s,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:o.transferable,tradeable:i,type:r?.asset_type.type}});return Promise.all(a)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(ie.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:s,value:i})=>{let[r]=s,o=this.getPoolAddress(r),[l,u,p]=await Promise.all([this.getPoolDelta(r,i,e),this.getPoolTokens(r,i),this.getPoolPegs(r,i,e)]);return u.push({id:r,tradeable:15,balance:l.totalIssuance,decimals:18}),this.poolsData.set(o,i),{address:o,id:r,type:"Stableswap",fee:it.fromPermill(i.fee),tokens:u,...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 s=await this.getLatestPegs(e,a,n),i=this.getRecentPegs(a),r=it.fromPermill(a.max_peg_update),o=it.fromPermill(e.fee),[l,u]=F.recalculatePegs(JSON.stringify(i),JSON.stringify(s),n.toString(),it.toRaw(r).toString(),it.toRaw(o).toString()),p=Number(l)*1e6;return{pegsFee:it.fromPermill(p),pegs:u}}getDefaultPegs(t){let e=t.fee,n=F.defaultPegs(t.assets.length);return{pegsFee:it.fromPermill(e),pegs:n}}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,a])=>a.map(s=>s.toString()))}async getLatestPegs(t,e,n){let{source:a}=e,s=Array.from(t.assets.entries()).map(([r,o])=>o),i=a.map(async(r,o)=>{if(r.type==="Oracle"){let[l,u,p]=r.value,g=[p,s[o]].sort((f,T)=>f-T),m=await this.api.query.EmaOracle.Oracles.getValue(l,g,u);if(!m)return;let[{price:b,updated_at:y}]=m,d=b.n.toString(),P=b.d.toString();return p.toString()===g[0].toString()?[[d,P],y.toString()]:[[P,d],y.toString()]}else if(r.type==="MMOracle"){let l=r.value.asHex(),{price:u,decimals:p,updatedAt:g}=await this.mmOracle.getData(l),m=10**p;return[[u.toString(),m.toString()],g.toString()]}else return[r.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,bt.of)(t):e.watchValue("best").pipe((0,bt.switchMap)(a=>Promise.all([this.getPoolDelta(t.id,n,a),this.getPoolPegs(t.id,n,a)])),(0,bt.map)(([a,s])=>{let i=t.tokens.map(r=>r.id===t.id?{...r,balance:a.totalIssuance}:r);return Object.assign(t,{tokens:i},a,s)}))}};var Ne={};w(Ne,{XykMath:()=>z,XykPool:()=>Ht,XykPoolClient:()=>Gt});var B=require("@galacticcouncil/math-xyk"),z=class{static getSpotPrice(t,e,n){return(0,B.get_spot_price)(t,e,n)}static calculateInGivenOut(t,e,n){return(0,B.calculate_in_given_out)(t,e,n)}static calculateOutGivenIn(t,e,n){return(0,B.calculate_out_given_in)(t,e,n)}static calculatePoolTradeFee(t,e,n){return(0,B.calculate_pool_trade_fee)(t,e,n)}static calculateLiquidityIn(t,e,n){return(0,B.calculate_liquidity_in)(t,e,n)}static calculateSpotPrice(t,e){return(0,B.calculate_spot_price)(t,e)}static calculateSpotPriceWithFee(t,e,n,a){return(0,B.calculate_spot_price_with_fee)(t,e,n,a)}static calculateShares(t,e,n){return(0,B.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,a){return(0,B.calculate_liquidity_out_asset_a)(t,e,n,a)}static calculateLiquidityOutAssetB(t,e,n,a){return(0,B.calculate_liquidity_out_asset_b)(t,e,n,a)}};var{FeeUtils:fn}=E,Ht=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,a,s){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),s=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:a.decimals,decimalsOut:s.decimals,balanceIn:a.balance,balanceOut:s.balance,assetInEd:a.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),s=this.calculateTradeFee(a,n),i=fn.toPct(n.exchangeFee),r=a+s,o=[];(e<this.minTradingLimit||a<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let u=t.balanceIn/this.maxInRatio;return r>u&&o.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:a,amountOut:e,feePct:i,errors:o}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),s=this.calculateTradeFee(a,n),i=fn.toPct(n.exchangeFee),r=a-s,o=[];(e<this.minTradingLimit||a<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let u=t.balanceOut/this.maxOutRatio;return r>u&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:r,feePct:i,errors:o}}calculateInGivenOut(t,e){let n=z.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}calculateOutGivenIn(t,e){let n=z.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}spotPriceInGivenOut(t){let e=z.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=z.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=z.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};var Tn=require("polkadot-api"),Sn=require("rxjs");var Gt=class extends L{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),a=e.map(async({keyArgs:s,value:i})=>{let[r]=s,[o,l]=i,[u,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:u.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(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(Tn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,Sn.of)(t)}};var He={};w(He,{AavePool:()=>Ut,AavePoolClient:()=>Vt});var Ut=class c{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new c(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,a,s){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),s=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:s.balance,decimalsIn:a.decimals,decimalsOut:s.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),s=[];return e>t.balanceOut&&s.push("TradeNotAllowed"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:s}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),s=[];return a>t.balanceOut&&s.push("TradeNotAllowed"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:s}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};var wn=require("polkadot-api"),In=require("@polkadot-api/utils"),yt=require("rxjs"),vn=require("viem");var xn=[{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:la}=et,ua=["Supply","Withdraw","Repay","Borrow"],Vt=class extends L{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:a,liqudity_in:s,liqudity_out:i})=>{let[r,o,l,u]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(a),this.api.query.AssetRegistry.AssetLocations.getValue(a)]);return{address:this.getPoolId(n,a),type:"Aave",tokens:[{id:n,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:s,location:o,type:r?.asset_type.type},{id:a,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:i,location:u,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:a,liqudity_out:s}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(i=>{let r=i.id===e.id?a:s;return{...i,balance:r}})}getPoolId(t,e){let n=t+"/"+e,a=new TextEncoder().encode(n.padEnd(32,"\0")),s=(0,In.toHex)(a);return(0,wn.AccountId)(63).dec(s)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(t,e){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(t){let[e,n]=t.tokens,a=this.getReserveH160Id(e),s=this.api.event.Router.Executed.watch(({asset_in:r,asset_out:o})=>r===n.id||o===n.id),i=this.api.event.EVM.Log.watch(({log:r})=>{let{topics:o,data:l}=r,u=o.map(b=>b.asHex()),p=l.asHex(),{eventName:g,args:m}=(0,vn.decodeEventLog)({abi:xn,topics:u,data:p});return ua.includes(g)&&m.reserve.toLowerCase()===a.toLowerCase()});return(0,yt.merge)([s,i]).pipe((0,yt.switchMap)(()=>this.getPoolDelta(t)),(0,yt.map)(r=>({...t,tokens:[...r]})))}getReserveH160Id(t){return t.type==="Erc20"?J.findNestedKey(t.location,"AccountKey20").AccountKey20.key:la.fromAssetId(t.id)}};var ht=class{static get(t){switch(t.type){case"Aave":return Ut.fromPool(t);case"XYK":return Ht.fromPool(t);case"Omnipool":return Dt.fromPool(t);case"LBP":return Et.fromPool(t);case"Stableswap":return qt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var Y=require("rxjs");var Pt=class extends k{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=Y.Subscription.EMPTY;omniSub=Y.Subscription.EMPTY;stableSub=Y.Subscription.EMPTY;xykSub=Y.Subscription.EMPTY;aaveSub=Y.Subscription.EMPTY;isReady=!1;isDestroyed=new Y.Subject;constructor(t,e){super(t),this.evm=e,this.lbpClient=new Ct(t,e),this.omniClient=new Lt(t,e),this.stableClient=new Nt(t,e),this.xykClient=new Gt(t,e),this.aaveClient=new Vt(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe((0,Y.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),s=new Set(n),i=async r=>{let o=r.getPoolType();return a.size>0?a.has(o):s.size>0?!s.has(o):r.isSupported()};return this.getFilteredPools(i)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((s,i)=>e[i]);return(await Promise.all(n.map(s=>s.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 _t(t.type)}};var je={};w(je,{DEFAULT_BLOCK_TIME:()=>An,DEFAULT_MIN_BUDGET:()=>We,ORDER_MIN_BLOCK_PERIOD:()=>Bn,Router:()=>ft,TWAP_BLOCK_PERIOD:()=>Kt,TWAP_MAX_DURATION:()=>Ye,TWAP_MAX_PRICE_IMPACT:()=>Xe,TWAP_TX_MULTIPLIER:()=>pl,TradeOrderError:()=>Ve,TradeOrderType:()=>le,TradeRouteBuilder:()=>q,TradeRouter:()=>Tt,TradeScheduler:()=>St,TradeType:()=>oe});var Wt=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 ca=8,Xt=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=[],s=new Wt,i=[];for(i.push([e,""]),s.enqueue(i);s.size()>0;){let r=s.dequeue();if(!r||r.length>ca)continue;let o=r[r.length-1];(n===null||o[0]===n)&&a.push(r),t.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,r)){let p=[...r];p.push(u),s.enqueue(p)}})}return a}findShortestPaths(t,e,n){let a=[],s=new Wt,i=[];i.push([e,""]),s.enqueue(i);let r=1/0;for(;s.size()>0;){let o=s.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<r?(r=o.length,a.length=0,a.push(o)):o.length===r&&a.push(o);continue}let u=t.get(l[0]);for(let p of u??[])this.isNotVisited(p,o)&&s.enqueue([...o,p])}return a}buildAndPopulateGraph(t,e){let n=new Map;for(let a of t)n.set(parseInt(a),[]);for(let[a,s,i]of e)n.get(s)?.push([i,a]);return n}};function Ue(c){let t={};for(let e of c){let n=e.tokens.length;for(let a=0;a<n;a++){t[e.tokens[a].id]||(t[e.tokens[a].id]=[]);for(let s=0;s<n;s++){if(a==s)continue;let i=[e.address,e.tokens[a].id,e.tokens[s].id];t[e.tokens[a].id].push(i)}}}return t}var Yt=class{getProposals(t,e,n){let a=n.filter(d=>d.type==="XYK"),s=n.filter(d=>d.type!=="XYK"),i=new Set(s.map(d=>d.tokens).flat().map(d=>d.id)),r=i.has(t),o=i.has(e),l=new Xt,u=d=>{let P=Ue(d),f=Object.keys(P),T=f.flatMap(_=>P[_]);return l.buildAndPopulateGraph(f,T)};if(!r&&!o){let d=a.filter(T=>T.tokens.find(_=>_.id===t)||T.tokens.find(_=>_.id===e)),P=u(d),f=l.findPaths(P,t,e);return this.parsePaths(f)}if(r&&o){let d=u(s),P=l.findPaths(d,t,e);return this.parsePaths(P)}let p=r?e:t,g=a.filter(d=>d.tokens.some(P=>P.id===p));if(g.length===0)return[];let m=[...s,...g],b=u(m),y=l.findPaths(b,t,e);return this.parsePaths(y)}parsePaths(t){let e=[];for(let n of t){let a=[];for(let s=0;s<n.length;s++){let i=n[s],r=n[s+1];if(r==null)break;a.push(this.toEdge(i,r))}e.push(a)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var ft=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new Yt,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 s=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(a,s),s}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,ht.get(e)]))}toHops(t,e){return t.map(([n,a,s])=>{let i=e.get(n);return{poolAddress:n,poolId:i?.id,pool:i?.type,assetIn:a,assetOut:s}})}};var oe=(e=>(e.Buy="Buy",e.Sell="Sell",e))(oe||{}),le=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(le||{}),Ve=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Ve||{});var{FeeUtils:On}=E,Tt=class extends ft{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),s=super.getPaths(t,e,n);if(!s.length)throw new Rt(t,e);return{paths:s,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 s=n[n.length-1].amountOut,i=a[a.length-1].amountOut;return s>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(s=>s.tradeFeeRange?.[0]??s.tradeFeePct).reduce((s,i)=>s+i),a=t.map(s=>s.tradeFeeRange?.[1]??s.tradeFeePct).reduce((s,i)=>s+i);return[n,a]}}getPoolFeeRange(t){let e=t.min?On.toPct(t.min):void 0,n=t.max?On.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(r=>r.assetOutDecimals).reduce((r,o)=>r+o),a=t.map(r=>r.spotPrice).reduce((r,o)=>r*o),s=n-e.assetOutDecimals,i=Math.pow(10,s);return a/BigInt(i)}async getSell(t,e,n,a){return this.withCtx(t,e,async({paths:s,poolsMap:i})=>{let r;if(a)r=await this.toSellSwaps(n,a,i);else{let o=s.map(u=>this.toSellSwaps(n,u,i)),l=await Promise.all(o);r=this.findBestSellRoute(l)}return this.buildSell(i,r)})}buildSell(t,e){let n=e[0],a=e[e.length-1],s=this.isDirectTrade(e),i=this.getSellSpot(e),r=a.amountOut,o=s?a.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-r,u=this.getRouteFeeRange(e),p=s?a.tradeFeePct:v.calculateSellFee(o,r),g=Math.pow(10,n.assetInDecimals),m=n.amountIn*i/BigInt(g),b=v.calculateDiffToRef(o,m);return{type:"Sell",amountIn:n.amountIn,amountOut:a.amountOut,spotPrice:i,tradeFee:l,tradeFeePct:p,tradeFeeRange:u,priceImpactPct:b,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:u,priceImpactPct:b,swaps:e.map(y=>y.toHuman())}}}}calculateDelta0Y(t,e,n){let a=[];for(let s=0;s<e.length;s++){let i=e[s],r=n.get(i.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(i.assetIn,i.assetOut),l;s>0?l=a[s-1]:l=t;let u=r.calculateOutGivenIn(o,l);a.push(u)}return a[a.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:a,pools:s,poolsMap:i}=n,l=s.filter(y=>y.tokens.some(d=>d.id===t)).map(y=>y.type==="Aave"?y.tokens:y.tokens.filter(d=>d.id===t)).map(y=>y.map(d=>d.balance).reduce((d,P)=>d+P)).sort((y,d)=>d<y?-1:1)[0],u=v.getFraction(l,.1),p=await Promise.all(a.map(y=>this.toSellSwaps(u,y,i))),m=this.findBestSellRoute(p).map(y=>({poolAddress:y.poolAddress,poolId:y?.poolId,pool:y.pool,assetIn:y.assetIn,assetOut:y.assetOut})),b=this.buildRouteKey(t,e,s);return this.mlr.set(b,m),m}async toSellSwaps(t,e,n){let a=[];for(let s=0;s<e.length;s++){let i=e[s],r=n.get(i.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(i.assetIn,i.assetOut),l;s>0?l=a[s-1].amountOut:l=typeof t=="string"?h.toBigInt(t,o.decimalsIn):t;let u=await this.ctx.getPoolFees(r,o.assetOut),{amountOut:p,calculatedOut:g,feePct:m,errors:b}=r.validateAndSell(o,l,u),y=this.getPoolFeeRange(u),d=r.spotPriceOutGivenIn(o),P=Math.pow(10,o.decimalsIn),f=l*d/BigInt(P),T=v.calculateDiffToRef(g,f);a.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:p,calculatedOut:g,spotPrice:d,tradeFeePct:m,tradeFeeRange:y,priceImpactPct:T,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:h.toDecimal(l,o.decimalsIn),amountOut:h.toDecimal(p,o.decimalsOut),calculatedOut:h.toDecimal(g,o.decimalsOut),spotPrice:h.toDecimal(d,o.decimalsOut),tradeFeePct:m,tradeFeeRange:y,priceImpactPct:T,errors:b}}})}return a}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let a=this.buildRouteKey(t,e,n.pools),s=this.mlr.get(a);return s||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:a,poolsMap:s}=n,i=this.buildRouteKey(t,e,a),r=this.mlr.get(i);r||(r=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",r,s),l=this.getSellSpot(o),u=o[o.length-1].assetOutDecimals;return{amount:l,decimals:u}})}findBestBuyRoute(t){let e=t.sort((n,a)=>{let s=n[0].amountIn,i=a[0].amountIn;return s>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(r=>r.assetInDecimals).reduce((r,o)=>r+o),a=t.map(r=>r.spotPrice).reduce((r,o)=>r*o),s=n-e.assetInDecimals,i=Math.pow(10,s);return a/BigInt(i)}async getBuy(t,e,n,a){return this.withCtx(t,e,async({paths:s,poolsMap:i})=>{let r;if(a)r=await this.toBuySwaps(n,a,i);else{let o=s.map(u=>this.toBuySwaps(n,u,i)),l=await Promise.all(o);r=this.findBestBuyRoute(l)}return this.buildBuy(i,r)})}buildBuy(t,e){let n=e[e.length-1],a=e[0],s=this.isDirectTrade(e),i=this.getBuySpot(e),r=a.amountIn,o=s?a.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=r-o,u=this.getRouteFeeRange(e),p=s?a.tradeFeePct:v.calculateBuyFee(o,r),g=Math.pow(10,n.assetOutDecimals),m=n.amountOut*i/BigInt(g),b;return o===0n?b=-100:b=v.calculateDiffToRef(m,o),{type:"Buy",amountOut:n.amountOut,amountIn:a.amountIn,spotPrice:i,tradeFee:l,tradeFeePct:p,tradeFeeRange:u,priceImpactPct:b,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:u,priceImpactPct:b,swaps:e.map(y=>y.toHuman())}}}}calculateDelta0X(t,e,n){let a=[];for(let s=e.length-1;s>=0;s--){let i=e[s],r=n.get(i.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(i.assetIn,i.assetOut),l;s==e.length-1?l=t:l=a[0];let u=r.calculateInGivenOut(o,l);a.unshift(u)}return a[0]}async toBuySwaps(t,e,n){let a=[];for(let s=e.length-1;s>=0;s--){let i=e[s],r=n.get(i.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(i.assetIn,i.assetOut),l;s==e.length-1?l=typeof t=="string"?h.toBigInt(t,o.decimalsOut):t:l=a[0].amountIn;let u=await this.ctx.getPoolFees(r,o.assetOut),{amountIn:p,calculatedIn:g,feePct:m,errors:b}=r.validateAndBuy(o,l,u),y=this.getPoolFeeRange(u),d=r.spotPriceInGivenOut(o),P=Math.pow(10,o.decimalsOut),f=l*d/BigInt(P),T;g===0n?T=-100:T=v.calculateDiffToRef(f,g),a.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:p,calculatedIn:g,spotPrice:d,tradeFeePct:m,tradeFeeRange:y,priceImpactPct:T,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:h.toDecimal(l,o.decimalsOut),amountIn:h.toDecimal(p,o.decimalsIn),calculatedIn:h.toDecimal(g,o.decimalsIn),spotPrice:h.toDecimal(d,o.decimalsIn),tradeFeePct:m,tradeFeeRange:y,priceImpactPct:T,errors:b}}})}return a}};var An=6e3,We=1000000000000000n,Kt=6,Xe=-5,Ye=216e5,pl=3,Bn=6;var Ke=require("polkadot-api");var q=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:a,poolId:s})=>a==="Stableswap"?{pool:(0,Ke.Enum)("Stableswap",s),asset_in:e,asset_out:n}:{pool:(0,Ke.Enum)(a),asset_in:e,asset_out:n})}};var St=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??We})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,a,s){let[i,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:u}=r,p=l[0],g=l[l.length-1],{assetInDecimals:m}=p,{assetOutDecimals:b}=g,y=Math.abs(u),d=this.getMinimumTradeCount(o,i),P=this.getOptimalTradeCount(y),f=s?Math.round(a/s):P,T=Math.ceil(a/d),_=Math.round(a/P),N=Math.round(a/f),K=o/BigInt(f),D=await this.router.getBestSell(t,e,K),$=o<i,$t=[];$&&$t.push("OrderTooSmall");let Qt=D.amountOut*BigInt(f),me=this.toBlockPeriod(N),de=D.tradeFee*BigInt(f),Cn=q.build(l),Je={assetIn:t,assetOut:e,errors:$t,frequencyMin:T,frequencyOpt:_,frequency:N,tradeCount:f,tradeFee:de,tradeImpactPct:D.priceImpactPct,tradePeriod:me,tradeRoute:Cn,type:"Dca"};return{...Je,amountIn:o,amountOut:Qt,tradeAmountIn:D.amountIn,tradeAmountOut:D.amountOut,toHuman(){return{...Je,amountIn:h.toDecimal(o,m),amountOut:h.toDecimal(Qt,b),tradeAmountIn:h.toDecimal(D.amountIn,m),tradeAmountOut:h.toDecimal(D.amountOut,b)}}}}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,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:i,swaps:r,priceImpactPct:o}=s,l=r[0],u=r[r.length-1],{assetInDecimals:p}=l,{assetOutDecimals:g}=u,m=Math.abs(o),b=this.getTwapTradeCount(m),y=i/BigInt(b),d=await this.router.getBestSell(l.assetIn,u.assetOut,y),P=b===1,f=i<a,T=d.priceImpactPct<-5,_=[];f||P?_.push("OrderTooSmall"):T&&_.push("OrderImpactTooBig");let N=d.amountOut*BigInt(b),K=d.tradeFee*BigInt(b),D=q.build(r),$={assetIn:t,assetOut:e,errors:_,tradeCount:b,tradeImpactPct:d.priceImpactPct,tradePeriod:6,tradeRoute:D,type:"TwapSell"};return{...$,amountIn:i,amountOut:N,tradeAmountIn:d.amountIn,tradeAmountOut:d.amountOut,tradeFee:K,toHuman(){return{...$,amountIn:h.toDecimal(i,p),amountOut:h.toDecimal(N,g),tradeAmountIn:h.toDecimal(d.amountIn,p),tradeAmountOut:h.toDecimal(d.amountOut,g),tradeFee:h.toDecimal(K,g)}}}}async getTwapBuyOrder(t,e,n){let[a,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:i,swaps:r,priceImpactPct:o}=s,l=r[0],u=r[r.length-1],{assetInDecimals:p}=l,{assetOutDecimals:g}=u,m=Math.abs(o),b=this.getTwapTradeCount(m),y=i/BigInt(b),d=await this.router.getBestBuy(l.assetIn,u.assetOut,y),P=d.amountIn*BigInt(b),f=b===1,T=P<a,_=d.priceImpactPct<-5,N=[];T||f?N.push("OrderTooSmall"):_&&N.push("OrderImpactTooBig");let K=d.tradeFee*BigInt(b),D=q.build(r),$={assetIn:t,assetOut:e,errors:N,tradeCount:b,tradeImpactPct:d.priceImpactPct,tradePeriod:6,tradeRoute:D,type:"TwapBuy"};return{...$,amountIn:P,amountOut:i,tradeAmountIn:d.amountIn,tradeAmountOut:d.amountOut,tradeFee:K,toHuman(){return{...$,amountIn:h.toDecimal(P,p),amountOut:h.toDecimal(i,g),tradeAmountIn:h.toDecimal(d.amountIn,p),tradeAmountOut:h.toDecimal(d.amountOut,g),tradeFee:h.toDecimal(K,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 ze={};w(ze,{BIG_10:()=>Fn,BIG_BILL:()=>En,StakingApi:()=>jt,StakingClient:()=>zt});var _n=require("@polkadot/util-crypto"),Rn=require("@polkadot/util"),lt=require("@galacticcouncil/math-staking"),ot=te(require("big.js")),Fn=(0,ot.default)(10),En=(0,ot.default)(Fn.pow(12));function pa(c){return(0,_n.encodeAddress)((0,Rn.stringToU8a)(("modl"+c).padEnd(32,"\0")),63)}var jt=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=pa(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,s=await n.reduce(async(i,[r,o])=>{let l=await i,u=r,p=o.amount,g=o.conviction.toString(),m=await this.client.getReferendumInfo(u);return m&&(m.type==="Approved"||m.type==="Rejected")&&l.push({id:u,amount:p,conviction:g}),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:s}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,a]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),s=a.find(i=>i)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:s,stakePosition:s?await this.getStakingPosition(s):void 0}}async getRewards(t,e){let n=await this.getStake(t),{potReservedBalance:a,accumulatedRewardPerStake:s,totalStake:i,stakePosition:r}=n;if(!r)return;let[o,l,u,p]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),g=(0,ot.default)(o.toString()).minus(a.toString()),m=s.toString(),b=(0,ot.default)(e).plus(1).toString();g.gt(0)&&i>0&&(m=(0,lt.calculate_accumulated_rps)(s.toString(),g.toString(),i.toString()));let y=(0,lt.calculate_period_number)(l.toString(),e,p??b),d=(0,lt.calculate_period_number)(l.toString(),r.createdAt?.toString()??"",p??b),P=(0,lt.calculate_rewards)(m,r.rewardPerStake?.toString()??"",r.stake?.toString()??""),f=(0,ot.default)(P).plus(r.accumulatedUnpaidRewards?.toString()||"0").plus(r.accumulatedLockedRewards?.toString()||"0");if(!(0,ot.default)(y).minus(d).lte(u.toString()))return f.div(En).toString()}};var zt=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[r,o,l]=i;return{address:r,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var Qe={};w(Qe,{TxBuilderFactory:()=>wt});var $e=require("polkadot-api");function kn(c){let t=[],e=c;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var xt=class extends k{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new V(t),this.aaveUtils=new nt(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:he})}async dryRun(t,e){let n=(0,$e.Enum)("Signed",t),a=(0,$e.Enum)("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(a,e.decodedCall),r=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(r){let o=kn(r.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var ue=class extends xt{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:a}=e[0],s=await this.balanceClient.getBalance(this.beneficiary,a);return t>=s.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,a=n[0],s=n[n.length-1],i=v.getFraction(t,this.slippagePct),r=a.assetIn,o=s.assetOut,l=t+i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.buy({asset_in:r,asset_out:o,amount:e,max_sell_amount:l}):u=this.api.tx.Router.buy({asset_in:r,asset_out:o,amount_out:e,max_amount_in:l,route:q.build(n)}),this.wrapTx("RouterBuy",u)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,a=n[0],s=n[n.length-1],i=v.getFraction(e,this.slippagePct),r=a.assetIn,o=s.assetOut,l=e-i,u;return this.isDirectOmnipoolTrade(n)?u=this.api.tx.Omnipool.sell({asset_in:r,asset_out:o,amount:t,min_buy_amount:l}):u=this.api.tx.Router.sell({asset_in:r,asset_out:o,amount_in:t,min_amount_out:l,route:q.build(n)}),a.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(u=await this.dispatchWithExtraGas(u)),this.wrapTx("RouterSell",u)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],a=e[e.length-1],s=v.getFraction(t,this.slippagePct),i=n.assetIn,r=a.assetOut,o=t-s,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:r,min_amount_out:o,route:q.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var ce=require("polkadot-api");var pe=class extends xt{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:a,tradePeriod:s,tradeRoute:i}=this.order,r=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,ce.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",r)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:a,tradeAmountOut:s,tradePeriod:i,tradeRoute:r}=this.order,o=v.getFraction(s,this.slippagePct),l=s-o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,ce.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:a,min_amount_out:l,route:r})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",u)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:a,tradeAmountOut:s,tradePeriod:i,tradeRoute:r}=this.order,o=v.getFraction(a,this.slippagePct),l=a+o,u=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,ce.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:s,max_amount_in:l,route:r})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",u)}};var wt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new ue(this.client,this.evmClient).setTrade(t)}order(t){return new pe(this.client,this.evmClient).setOrder(t)}};async function ma(c){let t=new dt(c),e=new Ft(c),[n,a]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),s=new Pt(c,e).withAave().withOmnipool().withStableswap().withXyk(),i=new nt(e),r=new Tt(s),o=new St(r,{blockTime:n,minBudgetInNative:a}),l=new V(c),u=new zt(c),p=new jt(u,l);return{api:{aave:i,router:r,scheduler:o,staking:p},client:{asset:new mt(c),balance:l,evm:e},ctx:{pool:s},tx:new wt(c,e),destroy:()=>{s.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 Qn=Object.create;var ie=Object.defineProperty;var Jn=Object.getOwnPropertyDescriptor;var Zn=Object.getOwnPropertyNames;var tr=Object.getPrototypeOf,er=Object.prototype.hasOwnProperty;var un=(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 r of Zn(t))!er.call(u,r)&&r!==e&&ie(u,r,{get:()=>t[r],enumerable:!(n=Jn(t,r))||n.enumerable});return u},dt=(u,t,e)=>(se(u,t,"default"),e&&se(e,t,"default")),gt=(u,t,e)=>(e=u!=null?Qn(tr(u)):{},se(t||!u||!u.__esModule?ie(e,"default",{value:u,enumerable:!0}):e,u)),nr=u=>se(ie({},"__esModule",{value:!0}),u);var Ft={};var dn=un(()=>{dt(Ft,require("@polkadot-api/ws-provider/node"))});var Et={};var gn=un(()=>{dt(Et,require("@polkadot-api/ws-provider/web"))});var Er={};x(Er,{aave:()=>Me,api:()=>Te,big:()=>h,client:()=>Le,const:()=>_e,createSdkContext:()=>Fr,erc20:()=>st,error:()=>Ne,evm:()=>He,fmt:()=>C,h160:()=>Mt,json:()=>tt,math:()=>O,pool:()=>je,sor:()=>en,staking:()=>nn,tx:()=>an,xc:()=>Ce});module.exports=nr(Er);var Te={};x(Te,{Papi:()=>k,getWs:()=>rr});var pn=require("@galacticcouncil/descriptors");function mn(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(pn.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");mn(n)&&console.log(t,...e)}};var bn=require("polkadot-api"),yn=require("polkadot-api/polkadot-sdk-compat"),rr=async u=>{let t=typeof u=="string"?u.split(","):u,r=(typeof window>"u"?(await Promise.resolve().then(()=>(dn(),Ft))).getWsProvider:(await Promise.resolve().then(()=>(gn(),Et))).getWsProvider)(t);return(0,bn.createClient)((0,yn.withPolkadotSdkCompat)(r))};var Me={};x(Me,{AAVE_GAS_LIMIT:()=>Ie,AAVE_LENDING_POOL_ADDRESS:()=>ce,AAVE_POOL_ABI:()=>we,AAVE_POOL_DATA_PROVIDER:()=>le,AAVE_POOL_DATA_PROVIDER_ABI:()=>oe,AAVE_POOL_PROXY:()=>xe,AAVE_ROUNDING_THRESHOLD:()=>jr,AAVE_UINT_256_MAX:()=>ar,AaveClient:()=>kt,AaveUtils:()=>it});var we=[{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 xe="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",le="0x112b087b60C1a166130d59266363C45F8aa99db0",ce="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Ie=1000000n,jr=5,ar=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var kt=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:we,address:xe,args:[t],functionName:"getUserAccountData"})}};var h={};x(h,{asBigInt:()=>or,toBigInt:()=>ir,toDecimal:()=>sr});var Z=gt(require("big.js"));Z.default.NE=-18;function sr(u,t,e=6,n){let r=(0,Z.default)(u.toString()),a=(0,Z.default)(10).pow(t);return r.div(a).round(e,n).toString()}function ir(u,t){let e=(0,Z.default)(10).pow(t),r=(0,Z.default)(u).mul(e).toFixed(0,Z.default.roundDown);return BigInt(r)}function or(u){return BigInt(u.round(0,Z.default.roundDown).toFixed(0))}var st={};x(st,{ERC20:()=>ve});var ve=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:()=>Re,shiftNeg:()=>Dt});var hn=gt(require("big.js"));var _e={};x(_e,{HUB_ASSET_ID:()=>Be,HYDRATION_OMNIPOOL_ADDRESS:()=>cr,HYDRATION_PARACHAIN_ID:()=>lr,HYDRATION_SS58_PREFIX:()=>L,PERBILL_DENOMINATOR:()=>Oe,PERMILL_DENOMINATOR:()=>Ct,RUNTIME_DECIMALS:()=>B,SYSTEM_ASSET_DECIMALS:()=>Ae,SYSTEM_ASSET_ID:()=>W,TRADEABLE_DEFAULT:()=>bt});var B=18,Ct=1e6,Oe=1e9,W=0,Ae=12,lr=2034,L=63,cr="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",Be=1,bt=15;var Re=class u{static toPct(t){let[e,n]=t;return u.safeDivide(e*100,n)}static toRaw(t){let[e,n]=t;return u.safeDivide(e,n)}static fromPermill(t){return[t,1e6]}static fromPerbill(t){return[t,1e9]}static fromRate(t,e){return[t,e]}static safeDivide(t,e,n=12){let r=10**n;return Math.round(t*r/e)/r}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Dt(u,t){let e=(0,hn.default)(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Mt={};x(Mt,{H160:()=>ke,isEvmAccount:()=>Pn,isEvmAddress:()=>fn,isSs58Address:()=>Sn});var yt=require("polkadot-api"),Fe=require("@polkadot-api/utils"),Q=require("buffer");var Ee="ETH\0";function Pn(u){if(!u)return!1;try{let t=(0,yt.AccountId)().enc(u),e=Q.Buffer.from(Ee);return Q.Buffer.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function fn(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function Sn(u){try{return(0,yt.AccountId)(63).enc(u),!0}catch{return!1}}var ke=class u{static toAccount=t=>{let e=Q.Buffer.from(t.slice(2),"hex"),n=Q.Buffer.from(Ee),r=Uint8Array.from(Q.Buffer.concat([n,e,Q.Buffer.alloc(8)])),a=(0,Fe.toHex)(r);return(0,yt.AccountId)(63).dec(a)};static fromAccount=t=>{let e=(0,yt.AccountId)().enc(t),n=Q.Buffer.from(Ee),r=e.slice(n.length,-8);return"0x"+Q.Buffer.from(r).toString("hex")};static fromSS58=t=>{let n=(0,yt.AccountId)().enc(t).slice(0,20);return(0,Fe.toHex)(n)};static fromAny=t=>{if(fn(t))return t;if(Pn(t))return u.fromAccount(t);if(Sn(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var tt={};x(tt,{findNestedKey:()=>ur,findNestedObj:()=>mr,jsonFormatter:()=>pr});var ur=(u,t)=>{let e=[];return JSON.stringify(u,(n,r)=>(r&&r[t]&&e.push(r),r)),e[0]},mr=(u,t,e)=>{let n;return JSON.stringify(u,(r,a)=>(a&&a[t]===e&&(n=a),a)),n},pr=(u,t)=>typeof t=="bigint"?t.toString():t;var O={};x(O,{calculateBuyFee:()=>yr,calculateDiffToAvg:()=>dr,calculateDiffToRef:()=>gr,calculateSellFee:()=>br,getFraction:()=>hr});var X=gt(require("big.js"));function dr(u,t){let e=(0,X.default)(u.toString()),n=(0,X.default)(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function gr(u,t){if(t===0n)return 0;let e=(0,X.default)(u.toString()),n=(0,X.default)(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function br(u,t){let e=(0,X.default)(u.toString()),n=(0,X.default)(t.toString());return(0,X.default)(1).minus(n.div(e)).mul(100).round(2).toNumber()}function yr(u,t){let e=(0,X.default)(u.toString());return(0,X.default)(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function hr(u,t,e=2){(t<.01||t>100)&&new Error("Supported range is from 0.01% - 100%");let n=Math.pow(10,e),r=BigInt(t*n);return u*r/BigInt(100*n)}var Ce={};x(Ce,{convertToId:()=>Pr});var Tn=require("buffer");function Pr(u){let e=Tn.Buffer.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:ue}=st,{H160:De}=Mt,fr=1.01,Sr=99999,Tr=10n**27n,wr=10n**18n,it=class{client;constructor(t){this.client=new kt(t)}async getSummary(t){let e=De.fromAny(t),[n,r,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[i]=n,[s,o]=r,[l,c,m,d,p,g]=a,y=h.toDecimal(g,18),b=[];for(let P of s){let f=P.underlyingAsset.toLowerCase(),S=i.find(({underlyingAsset:_t})=>_t.toLowerCase()===f);if(!S)throw new Error("Missing pool reserve for "+f);let v=P.scaledATokenBalance,q=S.liquidityIndex,N=S.priceInMarketReferenceCurrency,D=v*q/Tr,rt=Number(o===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,V=S.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,at=ue.toAssetId(f);b.push({aTokenBalance:D,decimals:Number(S.decimals),isCollateral:V,priceInRef:N,reserveId:at,reserveAsset:f,reserveLiquidationThreshold:rt})}return{healthFactor:Number(y),totalCollateral:l,totalDebt:c,reserves:b}}async hasBorrowPositions(t){let e=De.fromAny(t),n=await this.client.getUserAccountData(e),[r,a]=n;return a>0n}async getHealthFactor(t){let e=De.fromAny(t),n=await this.client.getUserAccountData(e),[r,a,i,s,o,l]=n,c=h.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:r,totalDebt:a,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:m,reserveLiquidationThreshold:d}=o,p=h.toBigInt(n,l),g=c?p*m/10n**BigInt(l):0n,y=r-g;return y<=0n?0:this.calculateHealthFactor(y,d,a)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:r,totalDebt:a,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:m}=o,p=h.toBigInt(n,l)*c/10n**BigInt(l),g=r+p;return g<=0n?0:this.calculateHealthFactor(g,m,a)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:r,reserves:a}=await this.getSummary(t),i=ue.fromAssetId(e),s=a.find(o=>o.reserveAsset===i);if(!s)throw new Error("Missing reserve ctx for "+i);return this.calculateWithdrawMax(s,n,r)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:r}=await this.getSummary(t),a={};for(let i of r){let s=this.calculateWithdrawMax(i,e,n);i.reserveId&&(a[i.reserveId]=s)}return a}calculateHealthFactor(t,e,n){if(n===0n)return Sr;let r=10n**6n,a=h.toBigInt(e,18),i=t*a*r,s=n*wr,o=i/s;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let r=h.toBigInt(t,18),a=h.toBigInt(e,18);return(r*n+a-1n)/a}calculateWithdrawMax(t,e,n){let{aTokenBalance:r,decimals:a,priceInRef:i,reserveLiquidationThreshold:s}=t,o=this.calculateRequiredCollateral(fr,s,n),l=e-o;if(l<=0n)return{amount:0n,decimals:a};let c=l*10n**BigInt(a)/i;return{amount:r<c?r:c,decimals:a}}};var Le={};x(Le,{AssetClient:()=>ht,BalanceClient:()=>K,ChainParams:()=>Pt});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:r})=>{let[a]=n;return[a,r]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async queryAssets(){let e=await this.api.query.AssetRegistry.Assets.getEntries();return new Map(e.filter(({value:n})=>{let{asset_type:r}=n;return this.SUPPORTED_TYPES.includes(r.type)}).map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:r})=>{let[a]=n;return[a,r]}))}async mapToken(t,e,n,r){let{name:a,asset_type:i,is_sufficient:s,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:a?.asText(),symbol:l,decimals:c,icon:l,type:i.type,isSufficient:s,location:r,existentialDeposit:o}}async mapBond(t,e,n,r){let[a,i]=r,{asset_type:s,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:m}=await this.mapToken(a,e,n),d=Number(i),p=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",p.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:m,icon:c,type:s.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:a,maturity:d}}async mapShares(t,e,n,r){let{assets:a}=r,{name:i,symbol:s,asset_type:o,is_sufficient:l,existential_deposit:c}=e,m=await Promise.all(a.map(async g=>{let{symbol:y}=await this.mapToken(g,e,n);return[g,y]})),d=Object.fromEntries(m),p=Object.values(d);return{id:t,name:p.join(", "),symbol:s?.asText()||i?.asText(),decimals:18,icon:p.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:d}}async mapExternal(t,e,n,r){let a=await this.mapToken(t,e,new Map,r),i=n?.find(s=>s.internalId===a.id);return i?{...a,decimals:i.decimals,name:i.name,symbol:i.symbol,icon:i.symbol,isWhiteListed:i.isWhiteListed}:a}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,r,a,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 m=r.get(l),{asset_type:d}=c,p;switch(d.type){case"Bond":let g=i.get(l);p=await this.mapBond(l,c,s,g);break;case"StableSwap":let y=a.get(l);p=await this.mapShares(l,c,s,y);break;case"External":p=await this.mapExternal(l,c,e,m);break;default:p=await this.mapToken(l,c,s,m)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};var w=require("rxjs");var K=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 r=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(r)}calculateBalance(t){let e=t.free>=t.frozen?t.free-t.frozen:0n,n=t.free+t.reserved;return{free:t.free,reserved:t.reserved,frozen:t.frozen,total:n,transferable:e}}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),r=this.subscribeErc20Balance(t);return(0,w.combineLatest)([e,n,r]).pipe((0,w.debounceTime)(250),(0,w.map)(a=>a.flat()),(0,w.startWith)([]),(0,w.bufferCount)(2,1),(0,w.map)(([a,i],s)=>{if(s===0)return i;let o=a.reduce((c,m)=>(c.set(m.id,m.balance),c),new Map);return i.filter(c=>!wn(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)(r=>({id:e,balance:r})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,w.distinctUntilChanged)((n,r)=>!r.deltas),(0,w.map)(({deltas:n})=>{let r=[];return n?.deleted.forEach(a=>{let[i,s]=a.args;r.push({id:s,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(a=>{let[i,s]=a.args;r.push({id:s,balance:this.calculateBalance(a.value)})}),r}))}subscribeErc20Balance(t,e){let n=new w.Subject,r=n.pipe((0,w.shareReplay)(1)),a=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:c}=l;return c.type==="Erc20"}).map(({keyArgs:l})=>{let[c]=l;return c}),i=async()=>{let o=e||await a(),l=async()=>{let d=(await Promise.all(o.map(async p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,balance:g}));n.next(d)};await l();let c=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>c.unsubscribe()},s;return i().then(o=>s=o),r.pipe((0,w.finalize)(()=>s?.()),(0,w.pairwise)(),(0,w.map)(([o,l],c)=>{if(c===0)return l;let m=o.reduce((p,g)=>(p.set(g.id,g.balance),p),new Map);return l.filter(p=>!wn(p.balance,m.get(p.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)}},wn=(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 Ne={};x(Ne,{AssetNotFound:()=>qe,PoolNotFound:()=>Lt,RouteNotFound:()=>qt});var qe=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},Lt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},qt=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:()=>Nt,createChain:()=>Ge});var xn=require("viem"),xr=["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,xn.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:xr}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});var j=require("viem");var Nt=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:()=>xt,PoolError:()=>ot,PoolFactory:()=>wt,PoolType:()=>F,aave:()=>Ke,lbp:()=>Ve,omni:()=>We,stable:()=>Ye,xyk:()=>Xe});var Ve={};x(Ve,{LbpMath:()=>Y,LbpPool:()=>Gt,LbpPoolClient:()=>Ut});var z=require("@galacticcouncil/math-lbp"),Y=class{static getSpotPrice(t,e,n,r,a){return(0,z.get_spot_price)(t,e,n,r,a)}static calculateInGivenOut(t,e,n,r,a){return(0,z.calculate_in_given_out)(t,e,n,r,a)}static calculateOutGivenIn(t,e,n,r,a){return(0,z.calculate_out_given_in)(t,e,n,r,a)}static calculateLinearWeights(t,e,n,r,a){return(0,z.calculate_linear_weights)(t,e,n,r,a)}static calculatePoolTradeFee(t,e,n){return(0,z.calculate_pool_trade_fee)(t,e,n)}};var F=(a=>(a.Aave="Aave",a.LBP="LBP",a.Omni="Omnipool",a.Stable="Stableswap",a.XYK="XYK",a))(F||{}),ot=(a=>(a.InsufficientTradingAmount="InsufficientTradingAmount",a.MaxInRatioExceeded="MaxInRatioExceeded",a.MaxOutRatioExceeded="MaxOutRatioExceeded",a.TradeNotAllowed="TradeNotAllowed",a.UnknownError="UnknownError",a))(ot||{});var{FeeUtils:In}=C,Gt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.fee,t.repayFeeApply)}constructor(t,e,n,r,a,i,s){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,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])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,weightIn:r.weight,weightOut:a.weight}}validateAndBuy(t,e,n){let r=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let i=t.balanceOut/this.maxOutRatio;if(e>i&&a.push("MaxOutRatioExceeded"),r===t.assetOut){let s=this.calculateTradeFee(e,n),o=In.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+s,c=this.calculateInGivenOut(t,l),m=t.balanceIn/this.maxInRatio;return c>m&&a.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:a}}else{let s=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return s>o&&a.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:s,amountOut:e,feePct:0,errors:a}}}validateAndSell(t,e,n){let r=this.tokens[0].id,a=[];e<this.minTradingLimit&&a.push("InsufficientTradingAmount");let i=t.balanceIn/this.maxInRatio;if(e>i&&a.push("MaxInRatioExceeded"),r===t.assetIn){let s=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return s>o&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:s,feePct:0,errors:a}}else{let s=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(s,n),l=In.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=s-o,m=t.balanceOut/this.maxOutRatio;return c>m&&a.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:c,feePct:l,errors:a}}}calculateInGivenOut(t,e){let n=Y.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=Y.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}spotPriceInGivenOut(t){let e=Y.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=Y.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=Y.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};var On=require("polkadot-api"),lt=require("rxjs");var vn=(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 Ht=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,r,a]=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=a.number-(a.timestamp-l)/BigInt(e),m=Number(c);return{price:s,decimals:r,updatedAt:m<0?0:m}}};var G=class extends K{evm;mmOracle;override=[];mem=0;memPools=vn(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new Ht(e)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=(0,I.from)(this.getPoolsMem()).pipe((0,I.switchMap)(e=>this.subscribe(e)),(0,I.combineLatestAll)());return(0,I.firstValueFrom)(t)}getSubscriber(){return(0,I.from)(this.getPoolsMem()).pipe((0,I.switchMap)(t=>this.subscribe(t)),(0,I.mergeAll)())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>(0,I.combineLatest)([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe((0,I.debounceTime)(250),(0,I.map)(([n,r])=>this.updatePool(n,r))))}subscribePoolBalance(t){if(t.type==="Aave")return(0,I.of)([]);let e=[this.subscribeTokensBalance(t.address)];if(this.hasSystemAsset(t)){let n=this.subscribeSystemBalance(t.address);e.push(n)}if(this.hasErc20Asset(t)){let n=t.tokens.filter(a=>a.type==="Erc20").map(a=>a.id),r=this.subscribeErc20Balance(t.address,n);e.push(r)}return(0,I.combineLatest)(e).pipe((0,I.map)(n=>n.map(r=>Array.isArray(r)?r:[r]).flat()))}hasSystemAsset(t){return t.tokens.some(e=>e.id===0)}hasErc20Asset(t){return t.tokens.some(e=>e.type==="Erc20")}hasValidAssets(t){return t.tokens.every(({id:e,decimals:n,balance:r})=>{let a=this.override.find(s=>s.id===e),i=!!n||!!a?.decimals;return r>0n&&i})}updatePool=(t,e)=>{let n=t.tokens.map(r=>{let a=e.find(s=>s.id===r.id),i=this.override.find(s=>s.id===r.id);return a?{...r,balance:a.balance.transferable,decimals:r.decimals||i?.decimals}:{...r,decimals:r.decimals||i?.decimals}});return{...t,tokens:n}}};var Ut=class extends G{MAX_FINAL_WEIGHT=100000000n;poolsData=new Map([]);async loadPools(){let[t,e,n]=await Promise.all([this.api.query.LBP.PoolData.getEntries(),this.api.query.ParachainSystem.ValidationData.getValue(),this.getPoolLimits()]),r=e?.relay_parent_number||0,a=t.filter(({value:i})=>e&&this.isActivePool(i,r)).map(async({keyArgs:i,value:s})=>{let[o]=i,l=o.toString(),c=await this.getPoolDelta(l,s,r);return{address:l,type:"LBP",fee:s.fee,...c,...n}});return Promise.all(a)}async getPoolDelta(t,e,n){let{start:r,end:a,assets:i,initial_weight:s,final_weight:o,repay_target:l,fee_collector:c}=e,m=Y.calculateLinearWeights(r?r.toString():"0",a?a.toString():"0",s.toString(),o.toString(),n.toString()),[d,p]=i,g=BigInt(m),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,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:b,tokens:[{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:P.transferable,weight:g,type:f?.asset_type.type},{id:p,decimals:v?.decimals,existentialDeposit:v?.existential_deposit,balance:S.transferable,weight:y,type:v?.asset_type.type}]}}isActivePool(t,e){let{start:n,end:r}=t;return n&&r?e>=n&&e<r:!1}async isRepayFeeApplied(t,e,n){if(e===0n)return!1;try{return(await this.getBalance(n,t)).transferable<e}catch{return!0}}async getRepayFee(){return await this.api.constants.LBP.repay_fee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.LBP.MaxInRatio(),this.api.constants.LBP.MaxOutRatio(),this.api.constants.LBP.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t){return{repayFee:await this.getRepayFee(),exchangeFee:t.fee}}getPoolType(){return"LBP"}async isSupported(){let t=this.api.query.LBP.PoolData,e=await this.api.compatibilityToken;return t.isCompatible(On.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)(r=>r?this.getPoolDelta(t.address,n,r.relay_parent_number):(0,lt.of)(t)),(0,lt.map)(r=>Object.assign({},t,r))):(0,lt.of)(t)}};var We={};x(We,{OmniMath:()=>A,OmniPool:()=>Vt,OmniPoolClient:()=>Yt});var T=require("@galacticcouncil/math-omnipool"),ct=gt(require("big.js")),A=class{static calculateSpotPrice(t,e,n,r){return(0,T.calculate_spot_price)(t,e,n,r)}static calculateLrnaSpotPrice(t,e){return(0,T.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,r,a,i,s,o,l){return(0,T.calculate_in_given_out)(t,e,n,r,a,i,s,o,l)}static calculateLrnaInGivenOut(t,e,n,r,a){return(0,T.calculate_lrna_in_given_out)(t,e,n,r,a)}static calculateOutGivenIn(t,e,n,r,a,i,s,o,l){return(0,T.calculate_out_given_in)(t,e,n,r,a,i,s,o,l)}static calculateOutGivenLrnaIn(t,e,n,r,a){return(0,T.calculate_out_given_lrna_in)(t,e,n,r,a)}static calculateShares(t,e,n,r){return(0,T.calculate_shares)(t,e,n,r)}static calculateLiquidityOut(t,e,n,r,a,i,s,o){return(0,T.calculate_liquidity_out)(t,e,n,r,a,i,s,o)}static calculateLiquidityLRNAOut(t,e,n,r,a,i,s,o){return(0,T.calculate_liquidity_lrna_out)(t,e,n,r,a,i,s,o)}static calculateCapDifference(t,e,n,r){let a=(0,ct.default)(e),i=(0,ct.default)(t),s=(0,ct.default)(r),o=(0,ct.default)(n),l=(0,ct.default)(10).pow(18),c=o.div(l);if(a.div(s).lt(c)){let d=c.times(s).minus(a).times(i),p=a.times((0,ct.default)(1).minus(c));return d.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,r){return(0,T.verify_asset_cap)(t,e,n,r)}static calculateLimitHubIn(t,e,n,r){return(0,T.calculate_liquidity_hub_in)(t,e,n,r)}static isSellAllowed(t){return(0,T.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,T.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,T.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,T.is_remove_liquidity_allowed)(t)}};var{FeeUtils:ft}=C,Vt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.hubAssetId)}constructor(t,e,n,r,a,i){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,this.hubAssetId=i}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:r.hubReserves,hubReservesOut:a.hubReserves,sharesIn:r.shares,sharesOut:a.shares,decimalsIn:r.decimals,decimalsOut:a.decimals,balanceIn:r.balance,balanceOut:a.balance,tradeableIn:r.tradeable,tradeableOut:a.tradeable,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),i=r===0n?0:O.calculateDiffToRef(a,r),s=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&s.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&s.push("MaxOutRatioExceeded");let m=t.balanceIn/this.maxInRatio;return a>m&&s.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:i,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),i=O.calculateDiffToRef(r,a),s=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&s.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&s.push("MaxInRatioExceeded");let m=t.balanceOut/this.maxOutRatio;return a>m&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:i,errors:s}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let r=A.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ft.toRaw(n.assetFee).toString():"0",n?ft.toRaw(n.protocolFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateLrnaInGivenOut(t,e,n){let r=A.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ft.toRaw(n.assetFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let r=A.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ft.toRaw(n.assetFee).toString():"0",n?ft.toRaw(n.protocolFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}calculateOutGivenLrnaIn(t,e,n){let r=A.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ft.toRaw(n.assetFee).toString():"0"),a=BigInt(r);return a<0n?0n:a}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=A.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=A.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=A.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=A.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var me=require("polkadot-api"),An=require("@polkadot-api/utils"),Wt=require("rxjs");var{FeeUtils:et}=C,Yt=class extends G{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,r,a,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:m})=>{let[d]=c,{hub_reserve:p,shares:g,tradable:y,cap:b,protocol_shares:P}=m,[f,S]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:S.transferable,cap:b,hubReserves:p,protocolShares:P,shares:g,tradeable:y,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:a?.decimals,existentialDeposit:a?.existential_deposit,balance:i.transferable,tradeable:r,type:a?.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,An.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,r,a]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),i=n.min_fee+r.min_fee,s=n.max_fee+r.max_fee;if(a){let{asset_fee:o,protocol_fee:l}=a;return{assetFee:et.fromPermill(o),protocolFee:et.fromPermill(l),min:et.fromPermill(i),max:et.fromPermill(s)}}else return{assetFee:et.fromPermill(n.min_fee),protocolFee:et.fromPermill(r.min_fee),min:et.fromPermill(i),max:et.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,Wt.distinctUntilChanged)((n,r)=>!r.deltas),(0,Wt.map)(({entries:n})=>n.map(r=>{let[a]=r.args,{hub_reserve:i,shares:s,tradable:o,cap:l,protocol_shares:c}=r.value,m=t.tokens.findIndex(p=>p.id===a);return{...t.tokens[m],cap:l,hubReserves:i,protocolShares:c,shares:s,tradeable:o}})),(0,Wt.map)(n=>{let r=t.tokens.find(a=>a.id===1);return{...t,tokens:[...n,r]}}))}};var Ye={};x(Ye,{StableMath:()=>E,StableSwap:()=>Xt,StableSwapClient:()=>Kt});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,r,a){return(0,_.calculate_amplification)(t,e,n,r,a)}static calculateInGivenOut(t,e,n,r,a,i,s){return(0,_.calculate_in_given_out)(t,e,n,r,a,i,s)}static calculateAddOneAsset(t,e,n,r,a,i,s){return(0,_.calculate_add_one_asset)(t,e,n,r,a,i,s)}static calculateSharesForAmount(t,e,n,r,a,i,s){return(0,_.calculate_shares_for_amount)(t,e,n,r,a,i,s)}static calculateOutGivenIn(t,e,n,r,a,i,s){return(0,_.calculate_out_given_in)(t,e,n,r,a,i,s)}static calculateLiquidityOutOneAsset(t,e,n,r,a,i,s){return(0,_.calculate_liquidity_out_one_asset)(t,e,n,r,a,i,s)}static calculateShares(t,e,n,r,a,i){return(0,_.calculate_shares)(t,e,n,r,a,i)}static calculateSpotPriceWithFee(t,e,n,r,a,i,s,o){return(0,_.calculate_spot_price_with_fee)(t,e,n,r,a,i,s,o)}static recalculatePegs(t,e,n,r,a){let i=(0,_.recalculate_peg)(t,e,n,r,a);return JSON.parse(i)}};var{FeeUtils:nt}=C,Xt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit,t.amplification,t.id,t.fee,t.totalIssuance)}constructor(t,e,n,r,a,i,s,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a,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])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,tradeableIn:this.id===t?15:r.tradeable,tradeableOut:this.id===e?15:a.tradeable,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateInGivenOut(t,e,n),i=nt.toPct(n.fee),s=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetInEd)&&s.push("InsufficientTradingAmount"),{amountIn:a,calculatedIn:r,amountOut:e,feePct:i,errors:s}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateOutGivenIn(t,e,n),i=nt.toPct(n.fee),s=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||r<t.assetOutEd)&&s.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:r,amountOut:a,feePct:i,errors:s}}calculateIn(t,e,n){let r=E.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?nt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateAddOneAsset(t,e,n){let r=E.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?nt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateSharesForAmount(t,e,n){let r=E.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?nt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=E.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let r=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let r=E.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?nt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateWithdrawOneAsset(t,e,n){let r=E.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?nt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateShares(t,e,n){let r=E.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?nt.toRaw(n.fee).toString():"0",this.getPegs()),a=BigInt(r);return a<0n?0n:a}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=E.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let r=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(r)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=E.defaultPegs(this.tokens.length-1);return JSON.stringify(t)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:r})=>({asset_id:e,amount:n,decimals:r}));return JSON.stringify(t,tt.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],tt.jsonFormatter)}};var pe=require("polkadot-api"),Bn=require("@polkadot-api/utils"),_n=require("@noble/hashes/blake2b"),St=require("rxjs");var{FeeUtils:ut}=C,Kt=class extends G{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=E.getPoolAddress(t),n=(0,_n.blake2b)(e,{dkLen:32}),r=(0,Bn.toHex)(n);return(0,pe.AccountId)(63).dec(r)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolDelta(t,e,n){let{initial_amplification:r,final_amplification:a,initial_block:i,final_block:s}=e,o=E.calculateAmplification(r.toString(),a.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),r=e.assets.map(async a=>{let[i,s,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,a),this.api.query.AssetRegistry.Assets.getValue(a),this.getBalance(n,a)]);return{id:a,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:o.transferable,tradeable:i,type:s?.asset_type.type}});return Promise.all(r)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(pe.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),r=t.map(async({keyArgs:a,value:i})=>{let[s]=a,o=this.getPoolAddress(s),[l,c,m]=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,...m,...n}});return Promise.all(r)}async getPoolFees(t){return{fee:t.fee}}async getPoolPegs(t,e,n){let r=await this.api.query.Stableswap.PoolPegs.getValue(t);if(!r)return this.getDefaultPegs(e);let a=await this.getLatestPegs(e,r,n),i=this.getRecentPegs(r),s=ut.fromPermill(r.max_peg_update),o=ut.fromPermill(e.fee),[l,c]=E.recalculatePegs(JSON.stringify(i),JSON.stringify(a),n.toString(),ut.toRaw(s).toString(),ut.toRaw(o).toString()),m=Number(l)*1e6;return{pegsFee:ut.fromPermill(m),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,r])=>r.map(a=>a.toString()))}async getLatestPegs(t,e,n){let{source:r}=e,a=Array.from(t.assets.entries()).map(([s,o])=>o),i=r.map(async(s,o)=>{if(s.type==="Oracle"){let[l,c,m]=s.value,d=[m,a[o]].sort((f,S)=>f-S),p=await this.api.query.EmaOracle.Oracles.getValue(l,d,c);if(!p)return;let[{price:g,updated_at:y}]=p,b=g.n.toString(),P=g.d.toString();return m.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:m,updatedAt:d}=await this.mmOracle.getData(l),p=10**m;return[[c.toString(),p.toString()],d.toString()]}else return[s.value.map(l=>l.toString()),n.toString()]});return Promise.all(i)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?(0,St.of)(t):e.watchValue("best").pipe((0,St.switchMap)(r=>Promise.all([this.getPoolDelta(t.id,n,r),this.getPoolPegs(t.id,n,r)])),(0,St.map)(([r,a])=>{let i=t.tokens.map(s=>s.id===t.id?{...s,balance:r.totalIssuance}:s);return Object.assign(t,{tokens:i},r,a)}))}};var Xe={};x(Xe,{XykMath:()=>J,XykPool:()=>jt,XykPoolClient:()=>zt});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,r){return(0,R.calculate_spot_price_with_fee)(t,e,n,r)}static calculateShares(t,e,n){return(0,R.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,r){return(0,R.calculate_liquidity_out_asset_a)(t,e,n,r)}static calculateLiquidityOutAssetB(t,e,n,r){return(0,R.calculate_liquidity_out_asset_b)(t,e,n,r)}};var{FeeUtils:Rn}=C,jt=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,a){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:r.decimals,decimalsOut:a.decimals,balanceIn:r.balance,balanceOut:a.balance,assetInEd:r.existentialDeposit,assetOutEd:a.existentialDeposit}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=this.calculateTradeFee(r,n),i=Rn.toPct(n.exchangeFee),s=r+a,o=[];(e<this.minTradingLimit||r<t.assetInEd)&&o.push("InsufficientTradingAmount");let l=t.balanceOut/this.maxOutRatio;e>l&&o.push("MaxOutRatioExceeded");let c=t.balanceIn/this.maxInRatio;return s>c&&o.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:r,amountOut:e,feePct:i,errors:o}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=this.calculateTradeFee(r,n),i=Rn.toPct(n.exchangeFee),s=r-a,o=[];(e<this.minTradingLimit||r<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let c=t.balanceOut/this.maxOutRatio;return s>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:s,feePct:i,errors:o}}calculateInGivenOut(t,e){let n=J.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}calculateOutGivenIn(t,e){let n=J.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),r=BigInt(n);return r<0n?0n:r}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 Fn=require("polkadot-api"),En=require("rxjs");var zt=class extends G{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),r=e.map(async({keyArgs:a,value:i})=>{let[s]=a,[o,l]=i,[c,m,d,p]=await Promise.all([this.getBalance(s,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(s,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:s,type:"XYK",tokens:[{id:o,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:c.transferable,type:m?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:d.transferable,type:p?.asset_type.type}],...n}});return Promise.all(r)}async getExchangeFee(){return await this.api.constants.XYK.GetExchangeFee()}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.XYK.MaxInRatio(),this.api.constants.XYK.MaxOutRatio(),this.api.constants.XYK.MinTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(){return{exchangeFee:await this.getExchangeFee()}}getPoolType(){return"XYK"}async isSupported(){let t=this.api.query.XYK.PoolAssets,e=await this.api.compatibilityToken;return t.isCompatible(Fn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,En.of)(t)}};var Ke={};x(Ke,{AavePool:()=>$t,AavePoolClient:()=>Qt});var $t=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(t){return new u(t.address,t.tokens,t.maxInRatio,t.maxOutRatio,t.minTradingLimit)}constructor(t,e,n,r,a){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=r,this.minTradingLimit=a}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),r=n.get(t),a=n.get(e);if(r==null)throw new Error("Pool does not contain tokenIn");if(a==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:r.balance,balanceOut:a.balance,decimalsIn:r.decimals,decimalsOut:a.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let r=this.calculateInGivenOut(t,e),a=[];return e>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:a}}validateAndSell(t,e,n){let r=this.calculateOutGivenIn(t,e),a=[];return r>t.balanceOut&&a.push("TradeNotAllowed"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:a}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};var Cn=require("polkadot-api"),Dn=require("@polkadot-api/utils"),Tt=require("rxjs"),Mn=require("viem");var kn=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:Ir}=st,vr=["Supply","Withdraw","Repay","Borrow"],Qt=class extends G{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:r,liqudity_in:a,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(r),this.api.query.AssetRegistry.AssetLocations.getValue(r)]);return{address:this.getPoolId(n,r),type:"Aave",tokens:[{id:n,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:a,location:o,type:s?.asset_type.type},{id:r,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:r,liqudity_out:a}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(i=>{let s=i.id===e.id?r:a;return{...i,balance:s}})}getPoolId(t,e){let n=t+"/"+e,r=new TextEncoder().encode(n.padEnd(32,"\0")),a=(0,Dn.toHex)(r);return(0,Cn.AccountId)(63).dec(a)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(t,e){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(t){let[e,n]=t.tokens,r=this.getReserveH160Id(e),a=this.api.event.Router.Executed.watch(({asset_in: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()),m=l.asHex(),{eventName:d,args:p}=(0,Mn.decodeEventLog)({abi:kn,topics:c,data:m});return vr.includes(d)&&p.reserve.toLowerCase()===r.toLowerCase()});return(0,Tt.merge)([a,i]).pipe((0,Tt.switchMap)(()=>this.getPoolDelta(t)),(0,Tt.map)(s=>({...t,tokens:[...s]})))}getReserveH160Id(t){return t.type==="Erc20"?tt.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Ir.fromAssetId(t.id)}};var wt=class{static get(t){switch(t.type){case"Aave":return $t.fromPool(t);case"XYK":return jt.fromPool(t);case"Omnipool":return Vt.fromPool(t);case"LBP":return Gt.fromPool(t);case"Stableswap":return Xt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};var $=require("rxjs");var xt=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 Ut(t,e),this.omniClient=new Yt(t,e),this.stableClient=new Kt(t,e),this.xykClient=new zt(t,e),this.aaveClient=new Qt(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe((0,$.takeUntil)(this.isDestroyed)).subscribe(e=>{this.pools.set(e.address,e)})}withOmnipool(){return this.omniSub.unsubscribe(),this.omniSub=this.subscribe(this.omniClient),this.active.add("Omnipool"),this}withStableswap(){return this.stableSub.unsubscribe(),this.stableSub=this.subscribe(this.stableClient),this.active.add("Stableswap"),this}withLbp(){return this.lbpSub.unsubscribe(),this.lbpSub=this.subscribe(this.lbpClient),this.active.add("LBP"),this}withAave(){return this.aaveSub.unsubscribe(),this.aaveSub=this.subscribe(this.aaveClient),this.active.add("Aave"),this}withXyk(t){return this.xykClient.withOverride(t),this.xykSub.unsubscribe(),this.xykSub=this.subscribe(this.xykClient),this.active.add("XYK"),this}destroy(){this.isDestroyed.next(!0),this.isDestroyed.complete(),this.active.clear(),this.pools.clear(),this.isReady=!1}async getPools(t={}){if(this.active.size===0)throw new Error("No pools selected");if(this.isReady)return Array.from(this.pools.values());let{useOnly:e=[],exclude:n=[]}=t,r=new Set(e),a=new Set(n),i=async s=>{let o=s.getPoolType();return r.size>0?r.has(o):a.size>0?!a.has(o):s.isSupported()};return this.getFilteredPools(i)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((a,i)=>e[i]);return(await Promise.all(n.map(a=>a.getPoolsMem()))).flat()}async getPoolFees(t,e){let n=this.clients.find(r=>r.getPoolType()===t.type);if(n)return n.getPoolFees(t,e);throw new Lt(t.type)}};var en={};x(en,{DEFAULT_BLOCK_TIME:()=>qn,DEFAULT_MIN_BUDGET:()=>Qe,ORDER_MIN_BLOCK_PERIOD:()=>Nn,Router:()=>It,TWAP_BLOCK_PERIOD:()=>ee,TWAP_MAX_DURATION:()=>Ze,TWAP_MAX_PRICE_IMPACT:()=>Je,TWAP_TX_MULTIPLIER:()=>Rl,TradeOrderError:()=>$e,TradeOrderType:()=>ge,TradeRouteBuilder:()=>H,TradeRouter:()=>vt,TradeScheduler:()=>Ot,TradeType:()=>de});var Jt=class{constructor(t=1/0){this.capacity=t}storage=[];enqueue(t){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(t)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Or=8,Zt=class{isNotVisited(t,e){let n=!0;return e.forEach(r=>{(r[0]===t[0]||r[1]===t[1])&&(n=!1)}),n}findPaths(t,e,n){let r=[],a=new Jt,i=[];for(i.push([e,""]),a.enqueue(i);a.size()>0;){let s=a.dequeue();if(!s||s.length>Or)continue;let o=s[s.length-1];(n===null||o[0]===n)&&r.push(s),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,s)){let m=[...s];m.push(c),a.enqueue(m)}})}return r}findShortestPaths(t,e,n){let r=[],a=new Jt,i=[];i.push([e,""]),a.enqueue(i);let s=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<s?(s=o.length,r.length=0,r.push(o)):o.length===s&&r.push(o);continue}let c=t.get(l[0]);for(let m of c??[])this.isNotVisited(m,o)&&a.enqueue([...o,m])}return r}buildAndPopulateGraph(t,e){let n=new Map;for(let r of t)n.set(parseInt(r),[]);for(let[r,a,i]of e)n.get(a)?.push([i,r]);return n}};function ze(u){let t={};for(let e of u){let n=e.tokens.length;for(let r=0;r<n;r++){t[e.tokens[r].id]||(t[e.tokens[r].id]=[]);for(let a=0;a<n;a++){if(r==a)continue;let i=[e.address,e.tokens[r].id,e.tokens[a].id];t[e.tokens[r].id].push(i)}}}return t}var te=class{getProposals(t,e,n){let r=n.filter(b=>b.type==="XYK"),a=n.filter(b=>b.type!=="XYK"),i=new Set(a.map(b=>b.tokens).flat().map(b=>b.id)),s=i.has(t),o=i.has(e),l=new Zt,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=r.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(a),P=l.findPaths(b,t,e);return this.parsePaths(P)}let m=s?e:t,d=r.filter(b=>b.tokens.some(P=>P.id===m));if(d.length===0)return[];let p=[...a,...d],g=c(p),y=l.findPaths(g,t,e);return this.parsePaths(y)}parsePaths(t){let e=[];for(let n of t){let r=[];for(let a=0;a<n.length;a++){let i=n[a],s=n[a+1];if(s==null)break;r.push(this.toEdge(i,s))}e.push(r)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var It=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new te,this.routeProposals=new Map,this.routerOptions=Object.freeze(e)}buildRouteKey(t,e,n){return`${t}->${e}::${n.length}`}async getPools(){return this.ctx.getPools(this.routerOptions)}async getRoutes(t,e){let n=await this.getPools();return this.validateInput(t,e,n),this.getPaths(t,e,n)}async getTradeableAssets(){let t=await this.getPools(),e=this.getAssets(t);return Array.from(e)}async getRouteableAssets(t){let e=await this.getTradeableAssets();return(await Promise.all(e.filter(r=>r!==t).map(r=>this.getRoutes(r,t)))).filter(r=>r.length>0).map(([r])=>r[0].assetIn).sort()}validateInput(t,e,n){if(n.length===0)throw new Error("No pools configured");if(t===e)throw new Error("Trading pair can't be identical");let r=this.getAssets(n);if(!r.has(t))throw new Error(t+" is not supported asset");if(!r.has(e))throw new Error(e+" is not supported asset");return this.toPoolsMap(n)}getAssets(t){let e=t.map(n=>n.tokens.map(r=>r.id)).flat().sort((n,r)=>n>r?1:-1);return new Set(e)}getPaths(t,e,n){let r=this.toPoolsMap(n);return this.getProposals(t,e,n).filter(i=>this.validPath(i,r)).map(i=>this.toHops(i,r))}getProposals(t,e,n){let r=this.buildRouteKey(t,e,n);if(this.routeProposals.has(r))return this.routeProposals.get(r);let a=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(r,a),a}validPath(t,e){return t.length>0&&t.map(n=>this.validEdge(n,e)).reduce((n,r)=>n&&r)}validEdge([t,e,n],r){return r.get(t)?.validatePair(e,n)||!1}toPoolsMap(t){return new Map(t.map(e=>[e.address,wt.get(e)]))}toHops(t,e){return t.map(([n,r,a])=>{let i=e.get(n);return{poolAddress:n,poolId:i?.id,pool:i?.type,assetIn:r,assetOut:a}})}};var de=(e=>(e.Buy="Buy",e.Sell="Sell",e))(de||{}),ge=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(ge||{}),$e=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))($e||{});var{FeeUtils:Ln}=C,vt=class extends It{mlr;poolsSnapshot;constructor(t,e={}){super(t,e),this.mlr=new Map}buildCtxSync(t,e){let n=this.poolsSnapshot,r=super.validateInput(t,e,n),a=super.getPaths(t,e,n);if(!a.length)throw new qt(t,e);return{paths:a,pools:n,poolsMap:r}}async withCtx(t,e,n){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let r=this.buildCtxSync(t,e);return n(r)}isDirectTrade(t){return t.length==1}findBestSellRoute(t){let e=t.sort((n,r)=>{let a=n[n.length-1].amountOut,i=r[r.length-1].amountOut;return a>i?-1:1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}getRouteFeeRange(t){if(t.filter(n=>n.tradeFeeRange).length>0){let n=t.map(a=>a.tradeFeeRange?.[0]??a.tradeFeePct).reduce((a,i)=>a+i),r=t.map(a=>a.tradeFeeRange?.[1]??a.tradeFeePct).reduce((a,i)=>a+i);return[n,r]}}getPoolFeeRange(t){let e=t.min?Ln.toPct(t.min):void 0,n=t.max?Ln.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetOutDecimals).reduce((s,o)=>s+o),r=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),a=n-e.assetOutDecimals,i=Math.pow(10,a);return r/BigInt(i)}async getSell(t,e,n,r){return this.withCtx(t,e,async({paths:a,poolsMap:i})=>{let s;if(r)s=await this.toSellSwaps(n,r,i);else{let o=a.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],r=e[e.length-1],a=this.isDirectTrade(e),i=this.getSellSpot(e),s=r.amountOut,o=a?r.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-s,c=this.getRouteFeeRange(e),m=a?r.tradeFeePct:O.calculateSellFee(o,s),d=Math.pow(10,n.assetInDecimals),p=n.amountIn*i/BigInt(d),g=O.calculateDiffToRef(o,p);return{type:"Sell",amountIn:n.amountIn,amountOut:r.amountOut,spotPrice:i,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:h.toDecimal(n.amountIn,n.assetInDecimals),amountOut:h.toDecimal(r.amountOut,r.assetOutDecimals),spotPrice:h.toDecimal(i,r.assetOutDecimals),tradeFee:h.toDecimal(l,r.assetOutDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(y=>y.toHuman())}}}}calculateDelta0Y(t,e,n){let r=[];for(let a=0;a<e.length;a++){let i=e[a],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;a>0?l=r[a-1]:l=t;let c=s.calculateOutGivenIn(o,l);r.push(c)}return r[r.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:r,pools:a,poolsMap:i}=n,l=a.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),m=await Promise.all(r.map(y=>this.toSellSwaps(c,y,i))),p=this.findBestSellRoute(m).map(y=>({poolAddress:y.poolAddress,poolId:y?.poolId,pool:y.pool,assetIn:y.assetIn,assetOut:y.assetOut})),g=this.buildRouteKey(t,e,a);return this.mlr.set(g,p),p}async toSellSwaps(t,e,n){let r=[];for(let a=0;a<e.length;a++){let i=e[a],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;a>0?l=r[a-1].amountOut:l=typeof t=="string"?h.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountOut:m,calculatedOut:d,feePct:p,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);r.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:m,calculatedOut:d,spotPrice:b,tradeFeePct:p,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(m,o.decimalsOut),calculatedOut:h.toDecimal(d,o.decimalsOut),spotPrice:h.toDecimal(b,o.decimalsOut),tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g}}})}return r}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let r=this.buildRouteKey(t,e,n.pools),a=this.mlr.get(r);return a||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:r,poolsMap:a}=n,i=this.buildRouteKey(t,e,r),s=this.mlr.get(i);s||(s=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",s,a),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}})}findBestBuyRoute(t){let e=t.sort((n,r)=>{let a=n[0].amountIn,i=r[0].amountIn;return a>i?1:-1});return e.find(n=>n.every(r=>r.errors.length==0))||e[0]}async getBestBuy(t,e,n){return this.getBuy(t,e,n)}getBuySpot(t){let e=t[0];if(t.length===1)return e.spotPrice;let n=t.map(s=>s.assetInDecimals).reduce((s,o)=>s+o),r=t.map(s=>s.spotPrice).reduce((s,o)=>s*o),a=n-e.assetInDecimals,i=Math.pow(10,a);return r/BigInt(i)}async getBuy(t,e,n,r){return this.withCtx(t,e,async({paths:a,poolsMap:i})=>{let s;if(r)s=await this.toBuySwaps(n,r,i);else{let o=a.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],r=e[0],a=this.isDirectTrade(e),i=this.getBuySpot(e),s=r.amountIn,o=a?r.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=s-o,c=this.getRouteFeeRange(e),m=a?r.tradeFeePct:O.calculateBuyFee(o,s),d=Math.pow(10,n.assetOutDecimals),p=n.amountOut*i/BigInt(d),g;return o===0n?g=-100:g=O.calculateDiffToRef(p,o),{type:"Buy",amountOut:n.amountOut,amountIn:r.amountIn,spotPrice:i,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:h.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:h.toDecimal(r.amountIn,r.assetInDecimals),spotPrice:h.toDecimal(i,r.assetInDecimals),tradeFee:h.toDecimal(l,r.assetInDecimals),tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e.map(y=>y.toHuman())}}}}calculateDelta0X(t,e,n){let r=[];for(let a=e.length-1;a>=0;a--){let i=e[a],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;a==e.length-1?l=t:l=r[0];let c=s.calculateInGivenOut(o,l);r.unshift(c)}return r[0]}async toBuySwaps(t,e,n){let r=[];for(let a=e.length-1;a>=0;a--){let i=e[a],s=n.get(i.poolAddress);if(s==null)throw new Error("Pool does not exit");let o=s.parsePair(i.assetIn,i.assetOut),l;a==e.length-1?l=typeof t=="string"?h.toBigInt(t,o.decimalsOut):t:l=r[0].amountIn;let c=await this.ctx.getPoolFees(s,o.assetOut),{amountIn:m,calculatedIn:d,feePct:p,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),r.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:m,calculatedIn:d,spotPrice:b,tradeFeePct:p,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(m,o.decimalsIn),calculatedIn:h.toDecimal(d,o.decimalsIn),spotPrice:h.toDecimal(b,o.decimalsIn),tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g}}})}return r}};var qn=6e3,Qe=1000000000000000n,ee=6,Je=-5,Ze=216e5,Rl=3,Nn=6;var tn=require("polkadot-api");var H=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:r,poolId:a})=>r==="Stableswap"?{pool:(0,tn.Enum)("Stableswap",a),asset_in:e,asset_out:n}:{pool:(0,tn.Enum)(r),asset_in:e,asset_out:n})}};var Ot=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Qe})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,r,a){let[i,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=s,m=l[0],d=l[l.length-1],{assetInDecimals:p}=m,{assetOutDecimals:g}=d,y=Math.abs(c),b=this.getMinimumTradeCount(o,i),P=this.getOptimalTradeCount(y),f=a?Math.round(r/a):P,S=Math.ceil(r/b),v=Math.round(r/P),q=Math.round(r/f),N=o/BigInt(f),D=await this.router.getBestSell(t,e,N),U=o<i,rt=[];U&&rt.push("OrderTooSmall");let V=D.amountOut*BigInt(f),at=this.toBlockPeriod(q),_t=D.tradeFee*BigInt(f),Rt=H.build(l),ae={assetIn:t,assetOut:e,errors:rt,frequencyMin:S,frequencyOpt:v,frequency:q,tradeCount:f,tradeFee:_t,tradeImpactPct:D.priceImpactPct,tradePeriod:at,tradeRoute:Rt,type:"Dca"};return{...ae,amountIn:o,amountOut:V,tradeAmountIn:D.amountIn,tradeAmountOut:D.amountOut,toHuman(){return{...ae,amountIn:h.toDecimal(o,p),amountOut:h.toDecimal(V,g),tradeAmountIn:h.toDecimal(D.amountIn,p),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 r=t+n/2n;return Number(r/n)}getOptimalTradeCount(t){let e=Math.round(t*10)||1;return Math.max(e,3)}async getTwapSellOrder(t,e,n){let[r,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:i,swaps:s,priceImpactPct:o}=a,l=s[0],c=s[s.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),y=i/BigInt(g),b=await this.router.getBestSell(l.assetIn,c.assetOut,y),P=g===1,f=i<r,S=b.priceImpactPct<-5,v=[];f||P?v.push("OrderTooSmall"):S&&v.push("OrderImpactTooBig");let q=b.amountOut*BigInt(g),N=b.tradeFee*BigInt(g),D=H.build(s),U={assetIn:t,assetOut:e,errors:v,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:D,type:"TwapSell"};return{...U,amountIn:i,amountOut:q,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:N,toHuman(){return{...U,amountIn:h.toDecimal(i,m),amountOut:h.toDecimal(q,d),tradeAmountIn:h.toDecimal(b.amountIn,m),tradeAmountOut:h.toDecimal(b.amountOut,d),tradeFee:h.toDecimal(N,d)}}}}async getTwapBuyOrder(t,e,n){let[r,a]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:i,swaps:s,priceImpactPct:o}=a,l=s[0],c=s[s.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),y=i/BigInt(g),b=await this.router.getBestBuy(l.assetIn,c.assetOut,y),P=b.amountIn*BigInt(g),f=g===1,S=P<r,v=b.priceImpactPct<-5,q=[];S||f?q.push("OrderTooSmall"):v&&q.push("OrderImpactTooBig");let N=b.tradeFee*BigInt(g),D=H.build(s),U={assetIn:t,assetOut:e,errors:q,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:D,type:"TwapBuy"};return{...U,amountIn:P,amountOut:i,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:N,toHuman(){return{...U,amountIn:h.toDecimal(P,m),amountOut:h.toDecimal(i,d),tradeAmountIn:h.toDecimal(b.amountIn,m),tradeAmountOut:h.toDecimal(b.amountOut,d),tradeFee:h.toDecimal(N,m)}}}}getTwapTradeCount(t){let e=this.getOptimalTradeCount(t);if(this.getTwapExecutionTime(e)>216e5){let r=216e5/(this.blockTime*6);return Math.round(r)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,n=Math.round(e);return Math.max(n,6)}};var nn={};x(nn,{BIG_10:()=>Un,BIG_BILL:()=>Vn,StakingApi:()=>ne,StakingClient:()=>re});var Gn=require("@polkadot/util-crypto"),Hn=require("@polkadot/util"),pt=require("@galacticcouncil/math-staking"),mt=gt(require("big.js")),Un=(0,mt.default)(10),Vn=(0,mt.default)(Un.pow(12));function Ar(u){return(0,Gn.encodeAddress)((0,Hn.stringToU8a)(("modl"+u).padEnd(32,"\0")),63)}var ne=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=Ar(t);return(await this.balanceClient.getBalance(e,0)).transferable}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]),r=e?.created_at,a=await n.reduce(async(i,[s,o])=>{let l=await i,c=s,m=o.amount,d=o.conviction.toString(),p=await this.client.getReferendumInfo(c);return p&&(p.type==="Approved"||p.type==="Rejected")&&l.push({id:c,amount:m,conviction:d}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt:r,actionPoints:e?.action_points,accumulatedUnpaidRewards:e?.accumulated_unpaid_rewards,accumulatedSlashPoints:e?.accumulated_slash_points,accumulatedLockedRewards:e?.accumulated_locked_rewards,votes:a}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,r]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),a=r.find(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(t,e){let n=await this.getStake(t),{potReservedBalance:r,accumulatedRewardPerStake:a,totalStake:i,stakePosition:s}=n;if(!s)return;let[o,l,c,m]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=(0,mt.default)(o.toString()).minus(r.toString()),p=a.toString(),g=(0,mt.default)(e).plus(1).toString();d.gt(0)&&i>0&&(p=(0,pt.calculate_accumulated_rps)(a.toString(),d.toString(),i.toString()));let y=(0,pt.calculate_period_number)(l.toString(),e,m??g),b=(0,pt.calculate_period_number)(l.toString(),s.createdAt?.toString()??"",m??g),P=(0,pt.calculate_rewards)(p,s.rewardPerStake?.toString()??"",s.stake?.toString()??""),f=(0,mt.default)(P).plus(s.accumulatedUnpaidRewards?.toString()||"0").plus(s.accumulatedLockedRewards?.toString()||"0");if(!(0,mt.default)(y).minus(b).lte(c.toString()))return f.div(Vn).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 an={};x(an,{TxBuilderFactory:()=>Bt});var rn=require("polkadot-api");function Wn(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var At=class extends k{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new K(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:Ie})}async dryRun(t,e){let n=(0,rn.Enum)("Signed",t),r=(0,rn.Enum)("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(r,e.decodedCall),s=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(s){let o=Wn(s.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var be=class extends At{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:r}=e[0],a=await this.balanceClient.getBalance(this.beneficiary,r);return t>=a.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],a=n[n.length-1],i=O.getFraction(t,this.slippagePct),s=r.assetIn,o=a.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:H.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,r=n[0],a=n[n.length-1],i=O.getFraction(e,this.slippagePct),s=r.assetIn,o=a.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:H.build(n)}),r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=await this.dispatchWithExtraGas(c)),this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],r=e[e.length-1],a=O.getFraction(t,this.slippagePct),i=n.assetIn,s=r.assetOut,o=t-a,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:s,min_amount_out:o,route:H.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var ye=require("polkadot-api");var he=class extends At{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradePeriod:a,tradeRoute:i}=this.order,s=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:a,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,ye.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:0n,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",s)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:a,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,ye.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:r,min_amount_out:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:r,tradeAmountOut:a,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,ye.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:a,max_amount_in:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var Bt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new be(this.client,this.evmClient).setTrade(t)}order(t){return new he(this.client,this.evmClient).setOrder(t)}};var Yn=require("polkadot-api"),sn=require("@galacticcouncil/math-liquidity-mining"),M=gt(require("big.js"));var Br=(0,M.default)(365.2425).times(24).times(60).times(60),_r=BigInt((0,M.default)(1).pow(18).toString()),Rr=6,Pe=class{client;balanceClient;omnipoolAssetIds=[];constructor(t,e){this.client=t,this.balanceClient=e}async getOraclePrice(t,e){let n=[t,e].sort((a,i)=>a-i);if(t===e)return _r;let r=await this.client.getOraclePrice(n);if(r){let{n:a,d:i}=r[0].price,s;return t<e?s=(0,sn.fixed_from_rational)(a.toString(),i.toString()):s=(0,sn.fixed_from_rational)(i.toString(),a.toString()),BigInt(s)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),r=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),a=Buffer.from([t]),i=Buffer.concat([n,r,a]),o="0x"+Buffer.concat([i,Buffer.alloc(32-i.length)]).toString("hex");return(0,Yn.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,r){let a=(0,M.default)(r).times(t.toString()).times(e.toString()).div(18);return a.gte(n.toString())?n.toString():a.toString()}getPoolYieldPerPeriod(t,e,n,r){let a=(0,M.default)(t.toString()).times(e),i=(0,M.default)(n.toString()).times(r);return a.div(i.toString()).toString()}farmData(t,e,n){let{yieldFarm:r,globalFarm:a,priceAdjustment:i,balance:s,id:o}=t,{multiplier:l,loyalty_curve:c}=r,{blocks_per_period:m,yield_per_period:d,total_shares_z:p,max_reward_per_period:g,pending_rewards:y,accumulated_paid_rewards:b,planned_yielding_periods:P,updated_at:f,incentivized_asset:S,reward_currency:v,price_adjustment:q}=a,N=Dt(i??q,18),D=Dt(l,18),U=Dt(c?.initial_reward_percentage??0,18),rt=Br.div((0,M.default)(Rr).times(m)).toString(),V;if(p<=0)V=(0,M.default)(D).times(d.toString()).times(rt).toString();else{let zn=this.getGlobalRewardPerPeriod(p,d,g,N),$n=this.getPoolYieldPerPeriod(zn,D,p,N);V=(0,M.default)($n).times(rt).toString()}let at=y+b,_t=g*BigInt(P),Rt=s.transferable+at,ae=Rt-at,on=(0,M.default)(ae.toString()).div(g.toString()),ln=(0,M.default)(e).div(m.toString()).toString(),Xn=(p>=0?on.plus(f):on.plus(ln)).toString(),Kn=(0,M.default)(p.toString()).div((0,M.default)(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(N).toFixed(2),cn=(0,M.default)(at.toString()).div(Rt.toString()).gte(.999);V=cn?"0":(0,M.default)(V).div(n?2:1).times(100).toString();let jn=U?(0,M.default)(V).times(U).toString():void 0;return{apr:V,minApr:jn,isDistributed:cn,estimatedEndPeriod:Xn,maxRewards:_t,incentivizedAsset:S,rewardCurrency:v,loyaltyCurve:c,currentPeriod:ln,potMaxRewards:Rt,fullness:Kn,yieldFarmId:r.id,globalFarmId:a.id,poolId:o}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((n,r)=>n.includes(r.keyArgs[0].toString())?n:[...n,r.keyArgs[0].toString()],[]);return Promise.all(e.map(async n=>await this.getOmnipoolFarms(n)))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:a,value:i})=>{let[,s]=a,o=i,l=await this.client.getOmnipoolGlobalFarm(s),c=await this.client.getOmnipoolYieldFarm(Number(t),s,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(s),g=await this.getOraclePrice(m,d),y=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:y}}));return n?r.map(a=>a?this.farmData(a,n):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((n,r)=>n.includes(r.keyArgs[0].toString())?n:[...n,r.keyArgs[0].toString()],[]);return Promise.all(e.map(async n=>await this.getIsolatedFarms(n)))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),r=await Promise.all(e.map(async({keyArgs:a,value:i})=>{let[,s]=a,o=i,l=await this.client.getIsolatedGlobalFarm(s),c=await this.client.getIsolatedYieldFarm(t,s,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(s,!0),g=await this.getOraclePrice(m,d),y=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:y,farmAddress:p}}));return n?r.map(a=>a?this.farmData(a,n,!0):void 0):[]}};var Se=require("polkadot-api"),fe=class extends k{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(Se.Binary.fromText("omnipool"),t,(0,Se.Enum)("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getAllOmnipooFarms(){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries()}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,n){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,n)}async getAllIsolatedFarms(){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries()}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,n){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,n)}};async function Fr(u){let t=new Pt(u),e=new Nt(u),[n,r]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),a=new xt(u,e).withAave().withOmnipool().withStableswap().withXyk(),i=new it(e),s=new vt(a),o=new Ot(s,{blockTime:n,minBudgetInNative:r}),l=new K(u),c=new re(u),m=new ne(c,l),d=new fe(u),p=new Pe(d,l);return{api:{aave:i,router:s,scheduler:o,staking:m,farm:p},client:{asset:new ht(u),balance:l,evm:e},ctx:{pool:a},tx:new Bt(u,e),destroy:()=>{a.destroy()}}}0&&(module.exports={aave,api,big,client,const:null,createSdkContext,erc20,error,evm,fmt,h160,json,math,pool,sor,staking,tx,xc});
|
package/build/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var rn=Object.defineProperty;var S=(u,t)=>{for(var e in t)rn(u,e,{get:t[e],enumerable:!0})};var Se={};S(Se,{Papi:()=>B,getWs:()=>un});import{hydration as on}from"@galacticcouncil/descriptors";function Te(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var B=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(on)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Te(n)&&console.log(t,...e)}};import{createClient as ln}from"polkadot-api";import{withPolkadotSdkCompat as cn}from"polkadot-api/polkadot-sdk-compat";var un=async u=>{let t=typeof u=="string"?u.split(","):u,a=(typeof window>"u"?(await import("polkadot-api/ws-provider/node")).getWsProvider:(await import("polkadot-api/ws-provider/web")).getWsProvider)(t);return ln(cn(a))};var Be={};S(Be,{AAVE_GAS_LIMIT:()=>$t,AAVE_LENDING_POOL_ADDRESS:()=>Nt,AAVE_POOL_ABI:()=>jt,AAVE_POOL_DATA_PROVIDER:()=>qt,AAVE_POOL_DATA_PROVIDER_ABI:()=>Lt,AAVE_POOL_PROXY:()=>zt,AAVE_ROUNDING_THRESHOLD:()=>_s,AAVE_UINT_256_MAX:()=>pn,AaveClient:()=>pt,AaveUtils:()=>K});var jt=[{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 Lt=[{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 zt="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",qt="0x112b087b60C1a166130d59266363C45F8aa99db0",Nt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",$t=1000000n,_s=5,pn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var pt=class{client;constructor(t){this.client=t.getWsProvider()}async getReservesData(){return await this.client.readContract({abi:Lt,address:qt,args:[Nt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:Lt,address:qt,args:[Nt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:jt,address:zt,args:[t],functionName:"getUserAccountData"})}};var h={};S(h,{asBigInt:()=>gn,toBigInt:()=>dn,toDecimal:()=>mn});import X from"big.js";X.NE=-18;function mn(u,t,e=6,n){let a=X(u.toString()),s=X(10).pow(t);return a.div(s).round(e,n).toString()}function dn(u,t){let e=X(10).pow(t),a=X(u).mul(e).toFixed(0,X.roundDown);return BigInt(a)}function gn(u){return BigInt(u.round(0,X.roundDown).toFixed(0))}var $={};S($,{ERC20:()=>Qt});var Qt=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 A={};S(A,{FeeUtils:()=>ee});var xe={};S(xe,{HUB_ASSET_ID:()=>te,HYDRATION_OMNIPOOL_ADDRESS:()=>yn,HYDRATION_PARACHAIN_ID:()=>bn,HYDRATION_SS58_PREFIX:()=>F,PERBILL_DENOMINATOR:()=>Jt,PERMILL_DENOMINATOR:()=>mt,RUNTIME_DECIMALS:()=>_,SYSTEM_ASSET_DECIMALS:()=>Zt,SYSTEM_ASSET_ID:()=>D,TRADEABLE_DEFAULT:()=>Q});var _=18,mt=1e6,Jt=1e9,D=0,Zt=12,bn=2034,F=63,yn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",te=1,Q=15;var ee=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))}};var Ht={};S(Ht,{H160:()=>ae,isEvmAccount:()=>Ie,isEvmAddress:()=>ve,isSs58Address:()=>Oe});import{AccountId as dt}from"polkadot-api";import{toHex as we}from"@polkadot-api/utils";import{Buffer as U}from"buffer";var ne="ETH\0";function Ie(u){if(!u)return!1;try{let t=dt().enc(u),e=U.from(ne);return U.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function ve(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function Oe(u){try{return dt(63).enc(u),!0}catch{return!1}}var ae=class u{static toAccount=t=>{let e=U.from(t.slice(2),"hex"),n=U.from(ne),a=Uint8Array.from(U.concat([n,e,U.alloc(8)])),s=we(a);return dt(63).dec(s)};static fromAccount=t=>{let e=dt().enc(t),n=U.from(ne),a=e.slice(n.length,-8);return"0x"+U.from(a).toString("hex")};static fromSS58=t=>{let n=dt().enc(t).slice(0,20);return we(n)};static fromAny=t=>{if(ve(t))return t;if(Ie(t))return u.fromAccount(t);if(Oe(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var Y={};S(Y,{findNestedKey:()=>hn,findNestedObj:()=>Pn,jsonFormatter:()=>fn});var hn=(u,t)=>{let e=[];return JSON.stringify(u,(n,a)=>(a&&a[t]&&e.push(a),a)),e[0]},Pn=(u,t,e)=>{let n;return JSON.stringify(u,(a,s)=>(s&&s[t]===e&&(n=s),s)),n},fn=(u,t)=>typeof t=="bigint"?t.toString():t;var w={};S(w,{calculateBuyFee:()=>wn,calculateDiffToAvg:()=>Tn,calculateDiffToRef:()=>Sn,calculateSellFee:()=>xn,getFraction:()=>In});import N from"big.js";function Tn(u,t){let e=N(u.toString()),n=N(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Sn(u,t){if(t===0n)return 0;let e=N(u.toString()),n=N(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function xn(u,t){let e=N(u.toString()),n=N(t.toString());return N(1).minus(n.div(e)).mul(100).round(2).toNumber()}function wn(u,t){let e=N(u.toString());return N(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function In(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 Ae={};S(Ae,{convertToId:()=>On});import{Buffer as vn}from"buffer";function On(u){let e=vn.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Gt}=$,{H160:se}=Ht,An=1.01,Bn=99999,_n=10n**27n,Rn=10n**18n,K=class{client;constructor(t){this.client=new pt(t)}async getSummary(t){let e=se.fromAny(t),[n,a,s]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[i]=n,[r,o]=a,[l,c,p,g,m,b]=s,y=h.toDecimal(b,18),d=[];for(let P of r){let f=P.underlyingAsset.toLowerCase(),T=i.find(({underlyingAsset:Kt})=>Kt.toLowerCase()===f);if(!T)throw new Error("Missing pool reserve for "+f);let I=P.scaledATokenBalance,C=T.liquidityIndex,q=T.priceInMarketReferenceCurrency,R=I*C/_n,Dt=Number(o===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold)/1e4,Mt=T.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,Yt=Gt.toAssetId(f);d.push({aTokenBalance:R,decimals:Number(T.decimals),isCollateral:Mt,priceInRef:q,reserveId:Yt,reserveAsset:f,reserveLiquidationThreshold:Dt})}return{healthFactor:Number(y),totalCollateral:l,totalDebt:c,reserves:d}}async hasBorrowPositions(t){let e=se.fromAny(t),n=await this.client.getUserAccountData(e),[a,s]=n;return s>0n}async getHealthFactor(t){let e=se.fromAny(t),n=await this.client.getUserAccountData(e),[a,s,i,r,o,l]=n,c=h.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:a,totalDebt:s,reserves:i}=await this.getSummary(t),r=Gt.fromAssetId(e),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=h.toBigInt(n,l),b=c?m*p/10n**BigInt(l):0n,y=a-b;return y<=0n?0:this.calculateHealthFactor(y,g,s)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:a,totalDebt:s,reserves:i}=await this.getSummary(t),r=Gt.fromAssetId(e),o=i.find(y=>y.reserveAsset===r);if(!o)throw new Error("Missing reserve ctx for "+r);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:p}=o,m=h.toBigInt(n,l)*c/10n**BigInt(l),b=a+m;return b<=0n?0:this.calculateHealthFactor(b,p,s)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:a,reserves:s}=await this.getSummary(t),i=Gt.fromAssetId(e),r=s.find(o=>o.reserveAsset===i);if(!r)throw new Error("Missing reserve ctx for "+i);return this.calculateWithdrawMax(r,n,a)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:a}=await this.getSummary(t),s={};for(let i of a){let r=this.calculateWithdrawMax(i,e,n);i.reserveId&&(s[i.reserveId]=r)}return s}calculateHealthFactor(t,e,n){if(n===0n)return Bn;let a=10n**6n,s=h.toBigInt(e,18),i=t*s*a,r=n*Rn,o=i/r;return Number(o)/1e6}calculateRequiredCollateral(t,e,n){let a=h.toBigInt(t,18),s=h.toBigInt(e,18);return(a*n+s-1n)/s}calculateWithdrawMax(t,e,n){let{aTokenBalance:a,decimals:s,priceInRef:i,reserveLiquidationThreshold:r}=t,o=this.calculateRequiredCollateral(An,r,n),l=e-o;if(l<=0n)return{amount:0n,decimals:s};let c=l*10n**BigInt(s)/i;return{amount:a<c?a:c,decimals:s}}};var Fe={};S(Fe,{AssetClient:()=>J,BalanceClient:()=>L,ChainParams:()=>tt});var J=class extends B{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[s]=n;return[s,a]}))}async queryBonds(){let e=await this.api.query.Bonds.Bonds.getEntries();return new Map(e.map(({keyArgs:n,value:a})=>{let[s]=n;return[s,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[s]=n;return[s,a]}))}async queryAssetLocations(){let e=await this.api.query.AssetRegistry.AssetLocations.getEntries();return new Map(e.map(({keyArgs:n,value:a})=>{let[s]=n;return[s,a]}))}async mapToken(t,e,n,a){let{name:s,asset_type:i,is_sufficient:r,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:s?.asText(),symbol:l,decimals:c,icon:l,type:i.type,isSufficient:r,location:a,existentialDeposit:o}}async mapBond(t,e,n,a){let[s,i]=a,{asset_type:r,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:p}=await this.mapToken(s,e,n),g=Number(i),m=new Intl.DateTimeFormat("en-GB"),b=[c,"Bond",m.format(g)].join(" ");return{id:t,name:b,symbol:c+"b",decimals:p,icon:c,type:r.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:s,maturity:g}}async mapShares(t,e,n,a){let{assets:s}=a,{name:i,symbol:r,asset_type:o,is_sufficient:l,existential_deposit:c}=e,p=await Promise.all(s.map(async b=>{let{symbol:y}=await this.mapToken(b,e,n);return[b,y]})),g=Object.fromEntries(p),m=Object.values(g);return{id:t,name:m.join(", "),symbol:r?.asText()||i?.asText(),decimals:18,icon:m.join("/"),type:o.type,isSufficient:l,existentialDeposit:c,meta:g}}async mapExternal(t,e,n,a){let s=await this.mapToken(t,e,new Map,a),i=n?.find(r=>r.internalId===s.id);return i?{...s,decimals:i.decimals,name:i.name,symbol:i.symbol,icon:i.symbol,isWhiteListed:i.isWhiteListed}:s}parseMetadata(t){return new Map(Array.from(t,([e,n])=>[e,{symbol:n.symbol?.asText(),decimals:n.decimals}]))}async getOnChainAssets(t,e){let[n,a,s,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=a.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 y=s.get(l);m=await this.mapShares(l,c,r,y);break;case"External":m=await this.mapExternal(l,c,e,p);break;default:m=await this.mapToken(l,c,r,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)}};import{Subject as Fn,bufferCount as En,combineLatest as kn,debounceTime as Cn,distinctUntilChanged as _e,finalize as Dn,map as Z,pairwise as Mn,shareReplay as Ln,startWith as qn}from"rxjs";var L=class extends B{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 kn([e,n,a]).pipe(Cn(250),Z(s=>s.flat()),qn([]),En(2,1),Z(([s,i],r)=>{if(r===0)return i;let o=s.reduce((c,p)=>(c.set(p.id,p.balance),c),new Map);return i.filter(c=>!Re(c.balance,o.get(c.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe(Z(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(Z(a=>({id:e,balance:a})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(_e((n,a)=>!a.deltas),Z(({deltas:n})=>{let a=[];return n?.deleted.forEach(s=>{let[i,r]=s.args;a.push({id:r,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(s=>{let[i,r]=s.args;a.push({id:r,balance:this.calculateBalance(s.value)})}),a}))}subscribeErc20Balance(t,e){let n=new Fn,a=n.pipe(Ln(1)),s=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 s(),l=async()=>{let g=(await Promise.all(o.map(async m=>{let b=await this.getTokenBalanceData(t,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),a.pipe(Dn(()=>r?.()),Mn(),Z(([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=>!Re(m.balance,p.get(m.id)))}),_e((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},Re=(u,t)=>u!==void 0&&t!==void 0&&u.transferable===t.transferable&&u.total===t.total;var tt=class extends B{_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 Ee={};S(Ee,{AssetNotFound:()=>re,PoolNotFound:()=>gt,RouteNotFound:()=>bt});var re=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},gt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},bt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var De={};S(De,{EvmClient:()=>yt,createChain:()=>ie});import{defineChain as Nn}from"viem";var Hn=["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"],ie=()=>Nn({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Hn}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1});import{createPublicClient as ke,createWalletClient as Gn,custom as Ce,http as Un}from"viem";var yt=class{client;chain;constructor(t){this.client=t,this.chain=ie()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return ke({chain:this.chain,transport:Un()})}getWsProvider(){return ke({transport:Ce({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return Gn({account:t,chain:this.chain,transport:Ce(window.ethereum)})}};var Xe={};S(Xe,{PoolContextProvider:()=>st,PoolError:()=>j,PoolFactory:()=>at,PoolType:()=>v,aave:()=>me,lbp:()=>le,omni:()=>ce,stable:()=>ue,xyk:()=>pe});var le={};S(le,{LbpMath:()=>M,LbpPool:()=>ht,LbpPoolClient:()=>ft});import{calculate_in_given_out as Vn,calculate_out_given_in as Wn,calculate_linear_weights as Xn,calculate_pool_trade_fee as Yn,get_spot_price as Kn}from"@galacticcouncil/math-lbp";var M=class{static getSpotPrice(t,e,n,a,s){return Kn(t,e,n,a,s)}static calculateInGivenOut(t,e,n,a,s){return Vn(t,e,n,a,s)}static calculateOutGivenIn(t,e,n,a,s){return Wn(t,e,n,a,s)}static calculateLinearWeights(t,e,n,a,s){return Xn(t,e,n,a,s)}static calculatePoolTradeFee(t,e,n){return Yn(t,e,n)}};var v=(s=>(s.Aave="Aave",s.LBP="LBP",s.Omni="Omnipool",s.Stable="Stableswap",s.XYK="XYK",s))(v||{}),j=(s=>(s.InsufficientTradingAmount="InsufficientTradingAmount",s.MaxInRatioExceeded="MaxInRatioExceeded",s.MaxOutRatioExceeded="MaxOutRatioExceeded",s.TradeNotAllowed="TradeNotAllowed",s.UnknownError="UnknownError",s))(j||{});var{FeeUtils:Me}=A,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,s,i,r){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=s,this.fee=i,this.repayFeeApply=r}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),s=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:s.balance,decimalsIn:a.decimals,decimalsOut:s.decimals,weightIn:a.weight,weightOut:s.weight}}validateAndBuy(t,e,n){let a=this.tokens[0].id,s=[];e<this.minTradingLimit&&s.push("InsufficientTradingAmount");let i=t.balanceOut/this.maxOutRatio;if(e>i&&s.push("MaxOutRatioExceeded"),a===t.assetOut){let r=this.calculateTradeFee(e,n),o=Me.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+r,c=this.calculateInGivenOut(t,l),p=t.balanceIn/this.maxInRatio;return c>p&&s.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:e,feePct:o,errors:s}}else{let r=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return r>o&&s.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:r,amountOut:e,feePct:0,errors:s}}}validateAndSell(t,e,n){let a=this.tokens[0].id,s=[];e<this.minTradingLimit&&s.push("InsufficientTradingAmount");let i=t.balanceIn/this.maxInRatio;if(e>i&&s.push("MaxInRatioExceeded"),a===t.assetIn){let r=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return r>o&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:r,feePct:0,errors:s}}else{let r=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(r,n),l=Me.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=r-o,p=t.balanceOut/this.maxOutRatio;return c>p&&s.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:r,amountOut:c,feePct:l,errors:s}}}calculateInGivenOut(t,e){let n=M.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=M.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=M.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=M.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=M.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as ta}from"polkadot-api";import{map as ea,of as Ge,switchMap as na}from"rxjs";import{memoize1 as jn}from"@thi.ng/memoize";import{combineLatest as Le,combineLatestAll as zn,debounceTime as $n,firstValueFrom as Qn,from as qe,map as Ne,mergeAll as Jn,of as Zn,switchMap as He}from"rxjs";var oe=[{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 Pt=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,a,s]=await Promise.all([this.client.readContract({abi:oe,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:oe,address:t,functionName:"decimals"}),this.client.getBlock()]),[i,r,o,l]=n,c=s.number-(s.timestamp-l)/BigInt(e),p=Number(c);return{price:r,decimals:a,updatedAt:p<0?0:p}}};var E=class extends L{evm;mmOracle;override=[];mem=0;memPools=jn(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new Pt(e)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=qe(this.getPoolsMem()).pipe(He(e=>this.subscribe(e)),zn());return Qn(t)}getSubscriber(){return qe(this.getPoolsMem()).pipe(He(t=>this.subscribe(t)),Jn())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>Le([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe($n(250),Ne(([n,a])=>this.updatePool(n,a))))}subscribePoolBalance(t){if(t.type==="Aave")return Zn([]);let e=[this.subscribeTokensBalance(t.address)];if(this.hasSystemAsset(t)){let n=this.subscribeSystemBalance(t.address);e.push(n)}if(this.hasErc20Asset(t)){let n=t.tokens.filter(s=>s.type==="Erc20").map(s=>s.id),a=this.subscribeErc20Balance(t.address,n);e.push(a)}return Le(e).pipe(Ne(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 s=this.override.find(r=>r.id===e),i=!!n||!!s?.decimals;return a>0n&&i})}updatePool=(t,e)=>{let n=t.tokens.map(a=>{let s=e.find(r=>r.id===a.id),i=this.override.find(r=>r.id===a.id);return s?{...a,balance:s.balance.transferable,decimals:a.decimals||i?.decimals}:{...a,decimals:a.decimals||i?.decimals}});return{...t,tokens:n}}};var ft=class extends E{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,s=t.filter(({value:i})=>e&&this.isActivePool(i,a)).map(async({keyArgs:i,value:r})=>{let[o]=i,l=o.toString(),c=await this.getPoolDelta(l,r,a);return{address:l,type:"LBP",fee:r.fee,...c,...n}});return Promise.all(s)}async getPoolDelta(t,e,n){let{start:a,end:s,assets:i,initial_weight:r,final_weight:o,repay_target:l,fee_collector:c}=e,p=M.calculateLinearWeights(a?a.toString():"0",s?s.toString():"0",r.toString(),o.toString(),n.toString()),[g,m]=i,b=BigInt(p),y=this.MAX_FINAL_WEIGHT-BigInt(b),[d,P,f,T,I]=await Promise.all([this.isRepayFeeApplied(g,l,c.toString()),this.getBalance(t,g),this.api.query.AssetRegistry.Assets.getValue(g),this.getBalance(t,m),this.api.query.AssetRegistry.Assets.getValue(m)]);return{repayFeeApply:d,tokens:[{id:g,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:P.transferable,weight:b,type:f?.asset_type.type},{id:m,decimals:I?.decimals,existentialDeposit:I?.existential_deposit,balance:T.transferable,weight:y,type:I?.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(ta.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe(na(a=>a?this.getPoolDelta(t.address,n,a.relay_parent_number):Ge(t)),ea(a=>Object.assign({},t,a))):Ge(t)}};var ce={};S(ce,{OmniMath:()=>x,OmniPool:()=>Tt,OmniPoolClient:()=>St});import{calculate_in_given_out as aa,calculate_lrna_in_given_out as sa,calculate_out_given_in as ra,calculate_out_given_lrna_in as ia,calculate_spot_price as oa,calculate_lrna_spot_price as la,calculate_shares as ca,calculate_liquidity_out as ua,calculate_liquidity_lrna_out as pa,verify_asset_cap as ma,calculate_liquidity_hub_in as da,is_sell_allowed as ga,is_buy_allowed as ba,is_add_liquidity_allowed as ya,is_remove_liquidity_allowed as ha}from"@galacticcouncil/math-omnipool";import et from"big.js";var x=class{static calculateSpotPrice(t,e,n,a){return oa(t,e,n,a)}static calculateLrnaSpotPrice(t,e){return la(t,e)}static calculateInGivenOut(t,e,n,a,s,i,r,o,l){return aa(t,e,n,a,s,i,r,o,l)}static calculateLrnaInGivenOut(t,e,n,a,s){return sa(t,e,n,a,s)}static calculateOutGivenIn(t,e,n,a,s,i,r,o,l){return ra(t,e,n,a,s,i,r,o,l)}static calculateOutGivenLrnaIn(t,e,n,a,s){return ia(t,e,n,a,s)}static calculateShares(t,e,n,a){return ca(t,e,n,a)}static calculateLiquidityOut(t,e,n,a,s,i,r,o){return ua(t,e,n,a,s,i,r,o)}static calculateLiquidityLRNAOut(t,e,n,a,s,i,r,o){return pa(t,e,n,a,s,i,r,o)}static calculateCapDifference(t,e,n,a){let s=et(e),i=et(t),r=et(a),o=et(n),l=et(10).pow(18),c=o.div(l);if(s.div(r).lt(c)){let g=c.times(r).minus(s).times(i),m=s.times(et(1).minus(c));return g.div(m).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,a){return ma(t,e,n,a)}static calculateLimitHubIn(t,e,n,a){return da(t,e,n,a)}static isSellAllowed(t){return ga(t)}static isBuyAllowed(t){return ba(t)}static isAddLiquidityAllowed(t){return ya(t)}static isRemoveLiquidityAllowed(t){return ha(t)}};var{FeeUtils:nt}=A,Tt=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,s,i){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=s,this.hubAssetId=i}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),s=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:a.hubReserves,hubReservesOut:s.hubReserves,sharesIn:a.shares,sharesOut:s.shares,decimalsIn:a.decimals,decimalsOut:s.decimals,balanceIn:a.balance,balanceOut:s.balance,tradeableIn:a.tradeable,tradeableOut:s.tradeable,assetInEd:a.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),s=this.calculateInGivenOut(t,e,n),i=a===0n?0:w.calculateDiffToRef(s,a),r=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&r.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&r.push("MaxOutRatioExceeded");let p=t.balanceIn/this.maxInRatio;return s>p&&r.push("MaxInRatioExceeded"),{amountIn:s,calculatedIn:a,amountOut:e,feePct:i,errors:r}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),s=this.calculateOutGivenIn(t,e,n),i=w.calculateDiffToRef(a,s),r=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&r.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&r.push("MaxInRatioExceeded");let p=t.balanceOut/this.maxOutRatio;return s>p&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:s,feePct:i,errors:r}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let a=x.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?nt.toRaw(n.assetFee).toString():"0",n?nt.toRaw(n.protocolFee).toString():"0"),s=BigInt(a);return s<0n?0n:s}calculateLrnaInGivenOut(t,e,n){let a=x.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?nt.toRaw(n.assetFee).toString():"0"),s=BigInt(a);return s<0n?0n:s}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let a=x.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?nt.toRaw(n.assetFee).toString():"0",n?nt.toRaw(n.protocolFee).toString():"0"),s=BigInt(a);return s<0n?0n:s}calculateOutGivenLrnaIn(t,e,n){let a=x.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?nt.toRaw(n.assetFee).toString():"0"),s=BigInt(a);return s<0n?0n:s}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=x.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=x.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=x.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=x.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as Pa,CompatibilityLevel as fa}from"polkadot-api";import{toHex as Ta}from"@polkadot-api/utils";import{distinctUntilChanged as Sa,map as Ue}from"rxjs";var{FeeUtils:V}=A,St=class extends E{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,a,s,i,r]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:c,value:p})=>{let[g]=c,{hub_reserve:m,shares:b,tradable:y,cap:d,protocol_shares:P}=p,[f,T]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(g),this.getBalance(e,g)]);return{id:g,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:T.transferable,cap:d,hubReserves:m,protocolShares:P,shares:b,tradeable:y,type:f?.asset_type.type}}),l=await Promise.all(o);return l.push({id:t,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:i.transferable,tradeable:a,type:s?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...r}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=Ta(e);return Pa(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,s]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),i=n.min_fee+a.min_fee,r=n.max_fee+a.max_fee;if(s){let{asset_fee:o,protocol_fee:l}=s;return{assetFee:V.fromPermill(o),protocolFee:V.fromPermill(l),min:V.fromPermill(i),max:V.fromPermill(r)}}else return{assetFee:V.fromPermill(n.min_fee),protocolFee:V.fromPermill(a.min_fee),min:V.fromPermill(i),max:V.fromPermill(r)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(fa.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(Sa((n,a)=>!a.deltas),Ue(({entries:n})=>n.map(a=>{let[s]=a.args,{hub_reserve:i,shares:r,tradable:o,cap:l,protocol_shares:c}=a.value,p=t.tokens.findIndex(m=>m.id===s);return{...t.tokens[p],cap:l,hubReserves:i,protocolShares:c,shares:r,tradeable:o}})),Ue(n=>{let a=t.tokens.find(s=>s.id===1);return{...t,tokens:[...n,a]}}))}};var ue={};S(ue,{StableMath:()=>O,StableSwap:()=>xt,StableSwapClient:()=>wt});import{calculate_in_given_out as xa,calculate_out_given_in as wa,calculate_amplification as Ia,calculate_add_one_asset as va,calculate_liquidity_out_one_asset as Oa,calculate_shares as Aa,calculate_shares_for_amount as Ba,calculate_spot_price_with_fee as _a,pool_account_name as Ra,recalculate_peg as Fa}from"@galacticcouncil/math-stableswap";var O=class{static getPoolAddress(t){return Ra(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,s){return Ia(t,e,n,a,s)}static calculateInGivenOut(t,e,n,a,s,i,r){return xa(t,e,n,a,s,i,r)}static calculateAddOneAsset(t,e,n,a,s,i,r){return va(t,e,n,a,s,i,r)}static calculateSharesForAmount(t,e,n,a,s,i,r){return Ba(t,e,n,a,s,i,r)}static calculateOutGivenIn(t,e,n,a,s,i,r){return wa(t,e,n,a,s,i,r)}static calculateLiquidityOutOneAsset(t,e,n,a,s,i,r){return Oa(t,e,n,a,s,i,r)}static calculateShares(t,e,n,a,s,i){return Aa(t,e,n,a,s,i)}static calculateSpotPriceWithFee(t,e,n,a,s,i,r,o){return _a(t,e,n,a,s,i,r,o)}static recalculatePegs(t,e,n,a,s){let i=Fa(t,e,n,a,s);return JSON.parse(i)}};var{FeeUtils:W}=A,xt=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,s,i,r,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=s,this.amplification=i,this.id=r,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),s=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:s.balance,decimalsIn:a.decimals,decimalsOut:s.decimals,tradeableIn:this.id===t?15:a.tradeable,tradeableOut:this.id===e?15:s.tradeable,assetInEd:a.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),s=this.calculateInGivenOut(t,e,n),i=W.toPct(n.fee),r=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);return(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&r.push("InsufficientTradingAmount"),{amountIn:s,calculatedIn:a,amountOut:e,feePct:i,errors:r}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),s=this.calculateOutGivenIn(t,e,n),i=W.toPct(n.fee),r=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);return(!o||!l)&&r.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&r.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:a,amountOut:s,feePct:i,errors:r}}calculateIn(t,e,n){let a=O.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?W.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(a);return s<0n?0n:s}calculateAddOneAsset(t,e,n){let a=O.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?W.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(a);return s<0n?0n:s}calculateSharesForAmount(t,e,n){let a=O.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?W.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(a);return s<0n?0n:s}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=O.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=O.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?W.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(a);return s<0n?0n:s}calculateWithdrawOneAsset(t,e,n){let a=O.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?W.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(a);return s<0n?0n:s}calculateShares(t,e,n){let a=O.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?W.toRaw(n.fee).toString():"0",this.getPegs()),s=BigInt(a);return s<0n?0n:s}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=O.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=O.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,Y.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],Y.jsonFormatter)}};import{AccountId as Ea,CompatibilityLevel as ka}from"polkadot-api";import{toHex as Ca}from"@polkadot-api/utils";import{blake2b as Da}from"@noble/hashes/blake2b";import{map as Ma,of as La,switchMap as qa}from"rxjs";var{FeeUtils:z}=A,wt=class extends E{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=O.getPoolAddress(t),n=Da(e,{dkLen:32}),a=Ca(n);return Ea(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:s,initial_block:i,final_block:r}=e,o=O.calculateAmplification(a.toString(),s.toString(),i.toString(),r.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),a=e.assets.map(async s=>{let[i,r,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,s),this.api.query.AssetRegistry.Assets.getValue(s),this.getBalance(n,s)]);return{id:s,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:o.transferable,tradeable:i,type:r?.asset_type.type}});return Promise.all(a)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(ka.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:s,value:i})=>{let[r]=s,o=this.getPoolAddress(r),[l,c,p]=await Promise.all([this.getPoolDelta(r,i,e),this.getPoolTokens(r,i),this.getPoolPegs(r,i,e)]);return c.push({id:r,tradeable:15,balance:l.totalIssuance,decimals:18}),this.poolsData.set(o,i),{address:o,id:r,type:"Stableswap",fee:z.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 s=await this.getLatestPegs(e,a,n),i=this.getRecentPegs(a),r=z.fromPermill(a.max_peg_update),o=z.fromPermill(e.fee),[l,c]=O.recalculatePegs(JSON.stringify(i),JSON.stringify(s),n.toString(),z.toRaw(r).toString(),z.toRaw(o).toString()),p=Number(l)*1e6;return{pegsFee:z.fromPermill(p),pegs:c}}getDefaultPegs(t){let e=t.fee,n=O.defaultPegs(t.assets.length);return{pegsFee:z.fromPermill(e),pegs:n}}getRecentPegs(t){let{current:e}=t;return Array.from(e.entries()).map(([n,a])=>a.map(s=>s.toString()))}async getLatestPegs(t,e,n){let{source:a}=e,s=Array.from(t.assets.entries()).map(([r,o])=>o),i=a.map(async(r,o)=>{if(r.type==="Oracle"){let[l,c,p]=r.value,g=[p,s[o]].sort((f,T)=>f-T),m=await this.api.query.EmaOracle.Oracles.getValue(l,g,c);if(!m)return;let[{price:b,updated_at:y}]=m,d=b.n.toString(),P=b.d.toString();return p.toString()===g[0].toString()?[[d,P],y.toString()]:[[P,d],y.toString()]}else if(r.type==="MMOracle"){let l=r.value.asHex(),{price:c,decimals:p,updatedAt:g}=await this.mmOracle.getData(l),m=10**p;return[[c.toString(),m.toString()],g.toString()]}else return[r.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?La(t):e.watchValue("best").pipe(qa(a=>Promise.all([this.getPoolDelta(t.id,n,a),this.getPoolPegs(t.id,n,a)])),Ma(([a,s])=>{let i=t.tokens.map(r=>r.id===t.id?{...r,balance:a.totalIssuance}:r);return Object.assign(t,{tokens:i},a,s)}))}};var pe={};S(pe,{XykMath:()=>H,XykPool:()=>It,XykPoolClient:()=>vt});import{calculate_in_given_out as Na,calculate_out_given_in as Ha,calculate_pool_trade_fee as Ga,get_spot_price as Ua,calculate_liquidity_in as Va,calculate_shares as Wa,calculate_spot_price as Xa,calculate_spot_price_with_fee as Ya,calculate_liquidity_out_asset_a as Ka,calculate_liquidity_out_asset_b as ja}from"@galacticcouncil/math-xyk";var H=class{static getSpotPrice(t,e,n){return Ua(t,e,n)}static calculateInGivenOut(t,e,n){return Na(t,e,n)}static calculateOutGivenIn(t,e,n){return Ha(t,e,n)}static calculatePoolTradeFee(t,e,n){return Ga(t,e,n)}static calculateLiquidityIn(t,e,n){return Va(t,e,n)}static calculateSpotPrice(t,e){return Xa(t,e)}static calculateSpotPriceWithFee(t,e,n,a){return Ya(t,e,n,a)}static calculateShares(t,e,n){return Wa(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,a){return Ka(t,e,n,a)}static calculateLiquidityOutAssetB(t,e,n,a){return ja(t,e,n,a)}};var{FeeUtils:Ve}=A,It=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,s){this.type="XYK",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),s=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,decimalsIn:a.decimals,decimalsOut:s.decimals,balanceIn:a.balance,balanceOut:s.balance,assetInEd:a.existentialDeposit,assetOutEd:s.existentialDeposit}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),s=this.calculateTradeFee(a,n),i=Ve.toPct(n.exchangeFee),r=a+s,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 r>c&&o.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:a,amountOut:e,feePct:i,errors:o}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),s=this.calculateTradeFee(a,n),i=Ve.toPct(n.exchangeFee),r=a-s,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 r>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:r,feePct:i,errors:o}}calculateInGivenOut(t,e){let n=H.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}calculateOutGivenIn(t,e){let n=H.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}spotPriceInGivenOut(t){let e=H.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=H.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=H.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as za}from"polkadot-api";import{of as $a}from"rxjs";var vt=class extends E{async loadPools(){let t=this.api.query.XYK.PoolAssets,[e,n]=await Promise.all([t.getEntries(),this.getPoolLimits()]),a=e.map(async({keyArgs:s,value:i})=>{let[r]=s,[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(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(za.BackwardsCompatible,e)}subscribePoolChange(t){return $a(t)}};var me={};S(me,{AavePool:()=>Ot,AavePoolClient:()=>At});var Ot=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,s){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=s}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),s=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(s==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:s.balance,decimalsIn:a.decimals,decimalsOut:s.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),s=[];return e>t.balanceOut&&s.push("TradeNotAllowed"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:s}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),s=[];return a>t.balanceOut&&s.push("TradeNotAllowed"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:s}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};import{AccountId as Qa}from"polkadot-api";import{toHex as Ja}from"@polkadot-api/utils";import{map as Za,merge as ts,switchMap as es}from"rxjs";import{decodeEventLog as ns}from"viem";var We=[{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}=$,ss=["Supply","Withdraw","Repay","Borrow"],At=class extends E{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:a,liqudity_in:s,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(a),this.api.query.AssetRegistry.AssetLocations.getValue(a)]);return{address:this.getPoolId(n,a),type:"Aave",tokens:[{id:n,decimals:r?.decimals,existentialDeposit:r?.existential_deposit,balance:s,location:o,type:r?.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:s}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(i=>{let r=i.id===e.id?a:s;return{...i,balance:r}})}getPoolId(t,e){let n=t+"/"+e,a=new TextEncoder().encode(n.padEnd(32,"\0")),s=Ja(a);return Qa(63).dec(s)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(t,e){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(t){let[e,n]=t.tokens,a=this.getReserveH160Id(e),s=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}=ns({abi:We,topics:c,data:p});return ss.includes(g)&&m.reserve.toLowerCase()===a.toLowerCase()});return ts([s,i]).pipe(es(()=>this.getPoolDelta(t)),Za(r=>({...t,tokens:[...r]})))}getReserveH160Id(t){return t.type==="Erc20"?Y.findNestedKey(t.location,"AccountKey20").AccountKey20.key:as.fromAssetId(t.id)}};var at=class{static get(t){switch(t.type){case"Aave":return Ot.fromPool(t);case"XYK":return It.fromPool(t);case"Omnipool":return Tt.fromPool(t);case"LBP":return ht.fromPool(t);case"Stableswap":return xt.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as rs,Subscription as Bt,takeUntil as is}from"rxjs";var st=class extends B{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=Bt.EMPTY;omniSub=Bt.EMPTY;stableSub=Bt.EMPTY;xykSub=Bt.EMPTY;aaveSub=Bt.EMPTY;isReady=!1;isDestroyed=new rs;constructor(t,e){super(t),this.evm=e,this.lbpClient=new ft(t,e),this.omniClient=new St(t,e),this.stableClient=new wt(t,e),this.xykClient=new vt(t,e),this.aaveClient=new At(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe(is(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),s=new Set(n),i=async r=>{let o=r.getPoolType();return a.size>0?a.has(o):s.size>0?!s.has(o):r.isSupported()};return this.getFilteredPools(i)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((s,i)=>e[i]);return(await Promise.all(n.map(s=>s.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 gt(t.type)}};var $e={};S($e,{DEFAULT_BLOCK_TIME:()=>Ke,DEFAULT_MIN_BUDGET:()=>be,ORDER_MIN_BLOCK_PERIOD:()=>je,Router:()=>rt,TWAP_BLOCK_PERIOD:()=>Et,TWAP_MAX_DURATION:()=>he,TWAP_MAX_PRICE_IMPACT:()=>ye,TWAP_TX_MULTIPLIER:()=>Gc,TradeOrderError:()=>ge,TradeOrderType:()=>Vt,TradeRouteBuilder:()=>k,TradeRouter:()=>it,TradeScheduler:()=>ot,TradeType:()=>Ut});var _t=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 os=8,Rt=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=[],s=new _t,i=[];for(i.push([e,""]),s.enqueue(i);s.size()>0;){let r=s.dequeue();if(!r||r.length>os)continue;let o=r[r.length-1];(n===null||o[0]===n)&&a.push(r),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,r)){let p=[...r];p.push(c),s.enqueue(p)}})}return a}findShortestPaths(t,e,n){let a=[],s=new _t,i=[];i.push([e,""]),s.enqueue(i);let r=1/0;for(;s.size()>0;){let o=s.dequeue();if(!o)continue;let l=o[o.length-1];if(l[0]===n){o.length<r?(r=o.length,a.length=0,a.push(o)):o.length===r&&a.push(o);continue}let c=t.get(l[0]);for(let p of c??[])this.isNotVisited(p,o)&&s.enqueue([...o,p])}return a}buildAndPopulateGraph(t,e){let n=new Map;for(let a of t)n.set(parseInt(a),[]);for(let[a,s,i]of e)n.get(s)?.push([i,a]);return n}};function de(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 s=0;s<n;s++){if(a==s)continue;let i=[e.address,e.tokens[a].id,e.tokens[s].id];t[e.tokens[a].id].push(i)}}}return t}var Ft=class{getProposals(t,e,n){let a=n.filter(d=>d.type==="XYK"),s=n.filter(d=>d.type!=="XYK"),i=new Set(s.map(d=>d.tokens).flat().map(d=>d.id)),r=i.has(t),o=i.has(e),l=new Rt,c=d=>{let P=de(d),f=Object.keys(P),T=f.flatMap(I=>P[I]);return l.buildAndPopulateGraph(f,T)};if(!r&&!o){let d=a.filter(T=>T.tokens.find(I=>I.id===t)||T.tokens.find(I=>I.id===e)),P=c(d),f=l.findPaths(P,t,e);return this.parsePaths(f)}if(r&&o){let d=c(s),P=l.findPaths(d,t,e);return this.parsePaths(P)}let p=r?e:t,g=a.filter(d=>d.tokens.some(P=>P.id===p));if(g.length===0)return[];let m=[...s,...g],b=c(m),y=l.findPaths(b,t,e);return this.parsePaths(y)}parsePaths(t){let e=[];for(let n of t){let a=[];for(let s=0;s<n.length;s++){let i=n[s],r=n[s+1];if(r==null)break;a.push(this.toEdge(i,r))}e.push(a)}return e}toEdge(t,e){return[e[1],t[0],e[0]]}};var rt=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new Ft,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 s=this.routeSuggester.getProposals(t,e,n);return this.routeProposals.set(a,s),s}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,at.get(e)]))}toHops(t,e){return t.map(([n,a,s])=>{let i=e.get(n);return{poolAddress:n,poolId:i?.id,pool:i?.type,assetIn:a,assetOut:s}})}};var Ut=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Ut||{}),Vt=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(Vt||{}),ge=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(ge||{});var{FeeUtils:Ye}=A,it=class extends rt{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),s=super.getPaths(t,e,n);if(!s.length)throw new bt(t,e);return{paths:s,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 s=n[n.length-1].amountOut,i=a[a.length-1].amountOut;return s>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(s=>s.tradeFeeRange?.[0]??s.tradeFeePct).reduce((s,i)=>s+i),a=t.map(s=>s.tradeFeeRange?.[1]??s.tradeFeePct).reduce((s,i)=>s+i);return[n,a]}}getPoolFeeRange(t){let e=t.min?Ye.toPct(t.min):void 0,n=t.max?Ye.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(r=>r.assetOutDecimals).reduce((r,o)=>r+o),a=t.map(r=>r.spotPrice).reduce((r,o)=>r*o),s=n-e.assetOutDecimals,i=Math.pow(10,s);return a/BigInt(i)}async getSell(t,e,n,a){return this.withCtx(t,e,async({paths:s,poolsMap:i})=>{let r;if(a)r=await this.toSellSwaps(n,a,i);else{let o=s.map(c=>this.toSellSwaps(n,c,i)),l=await Promise.all(o);r=this.findBestSellRoute(l)}return this.buildSell(i,r)})}buildSell(t,e){let n=e[0],a=e[e.length-1],s=this.isDirectTrade(e),i=this.getSellSpot(e),r=a.amountOut,o=s?a.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-r,c=this.getRouteFeeRange(e),p=s?a.tradeFeePct:w.calculateSellFee(o,r),g=Math.pow(10,n.assetInDecimals),m=n.amountIn*i/BigInt(g),b=w.calculateDiffToRef(o,m);return{type:"Sell",amountIn:n.amountIn,amountOut:a.amountOut,spotPrice:i,tradeFee:l,tradeFeePct:p,tradeFeeRange:c,priceImpactPct:b,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:b,swaps:e.map(y=>y.toHuman())}}}}calculateDelta0Y(t,e,n){let a=[];for(let s=0;s<e.length;s++){let i=e[s],r=n.get(i.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(i.assetIn,i.assetOut),l;s>0?l=a[s-1]:l=t;let c=r.calculateOutGivenIn(o,l);a.push(c)}return a[a.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:a,pools:s,poolsMap:i}=n,l=s.filter(y=>y.tokens.some(d=>d.id===t)).map(y=>y.type==="Aave"?y.tokens:y.tokens.filter(d=>d.id===t)).map(y=>y.map(d=>d.balance).reduce((d,P)=>d+P)).sort((y,d)=>d<y?-1:1)[0],c=w.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})),b=this.buildRouteKey(t,e,s);return this.mlr.set(b,m),m}async toSellSwaps(t,e,n){let a=[];for(let s=0;s<e.length;s++){let i=e[s],r=n.get(i.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(i.assetIn,i.assetOut),l;s>0?l=a[s-1].amountOut:l=typeof t=="string"?h.toBigInt(t,o.decimalsIn):t;let c=await this.ctx.getPoolFees(r,o.assetOut),{amountOut:p,calculatedOut:g,feePct:m,errors:b}=r.validateAndSell(o,l,c),y=this.getPoolFeeRange(c),d=r.spotPriceOutGivenIn(o),P=Math.pow(10,o.decimalsIn),f=l*d/BigInt(P),T=w.calculateDiffToRef(g,f);a.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:p,calculatedOut:g,spotPrice:d,tradeFeePct:m,tradeFeeRange:y,priceImpactPct:T,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:h.toDecimal(l,o.decimalsIn),amountOut:h.toDecimal(p,o.decimalsOut),calculatedOut:h.toDecimal(g,o.decimalsOut),spotPrice:h.toDecimal(d,o.decimalsOut),tradeFeePct:m,tradeFeeRange:y,priceImpactPct:T,errors:b}}})}return a}async getMostLiquidRoute(t,e){return this.withCtx(t,e,async n=>{let a=this.buildRouteKey(t,e,n.pools),s=this.mlr.get(a);return s||this.calculateMostLiquidRoute(t,e,n)})}async getSpotPrice(t,e){return this.withCtx(t,e,async n=>{let{pools:a,poolsMap:s}=n,i=this.buildRouteKey(t,e,a),r=this.mlr.get(i);r||(r=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",r,s),l=this.getSellSpot(o),c=o[o.length-1].assetOutDecimals;return{amount:l,decimals:c}})}findBestBuyRoute(t){let e=t.sort((n,a)=>{let s=n[0].amountIn,i=a[0].amountIn;return s>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(r=>r.assetInDecimals).reduce((r,o)=>r+o),a=t.map(r=>r.spotPrice).reduce((r,o)=>r*o),s=n-e.assetInDecimals,i=Math.pow(10,s);return a/BigInt(i)}async getBuy(t,e,n,a){return this.withCtx(t,e,async({paths:s,poolsMap:i})=>{let r;if(a)r=await this.toBuySwaps(n,a,i);else{let o=s.map(c=>this.toBuySwaps(n,c,i)),l=await Promise.all(o);r=this.findBestBuyRoute(l)}return this.buildBuy(i,r)})}buildBuy(t,e){let n=e[e.length-1],a=e[0],s=this.isDirectTrade(e),i=this.getBuySpot(e),r=a.amountIn,o=s?a.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=r-o,c=this.getRouteFeeRange(e),p=s?a.tradeFeePct:w.calculateBuyFee(o,r),g=Math.pow(10,n.assetOutDecimals),m=n.amountOut*i/BigInt(g),b;return o===0n?b=-100:b=w.calculateDiffToRef(m,o),{type:"Buy",amountOut:n.amountOut,amountIn:a.amountIn,spotPrice:i,tradeFee:l,tradeFeePct:p,tradeFeeRange:c,priceImpactPct:b,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:b,swaps:e.map(y=>y.toHuman())}}}}calculateDelta0X(t,e,n){let a=[];for(let s=e.length-1;s>=0;s--){let i=e[s],r=n.get(i.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(i.assetIn,i.assetOut),l;s==e.length-1?l=t:l=a[0];let c=r.calculateInGivenOut(o,l);a.unshift(c)}return a[0]}async toBuySwaps(t,e,n){let a=[];for(let s=e.length-1;s>=0;s--){let i=e[s],r=n.get(i.poolAddress);if(r==null)throw new Error("Pool does not exit");let o=r.parsePair(i.assetIn,i.assetOut),l;s==e.length-1?l=typeof t=="string"?h.toBigInt(t,o.decimalsOut):t:l=a[0].amountIn;let c=await this.ctx.getPoolFees(r,o.assetOut),{amountIn:p,calculatedIn:g,feePct:m,errors:b}=r.validateAndBuy(o,l,c),y=this.getPoolFeeRange(c),d=r.spotPriceInGivenOut(o),P=Math.pow(10,o.decimalsOut),f=l*d/BigInt(P),T;g===0n?T=-100:T=w.calculateDiffToRef(f,g),a.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:p,calculatedIn:g,spotPrice:d,tradeFeePct:m,tradeFeeRange:y,priceImpactPct:T,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:h.toDecimal(l,o.decimalsOut),amountIn:h.toDecimal(p,o.decimalsIn),calculatedIn:h.toDecimal(g,o.decimalsIn),spotPrice:h.toDecimal(d,o.decimalsIn),tradeFeePct:m,tradeFeeRange:y,priceImpactPct:T,errors:b}}})}return a}};var Ke=6e3,be=1000000000000000n,Et=6,ye=-5,he=216e5,Gc=3,je=6;import{Enum as ze}from"polkadot-api";var k=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:a,poolId:s})=>a==="Stableswap"?{pool:ze("Stableswap",s),asset_in:e,asset_out:n}:{pool:ze(a),asset_in:e,asset_out:n})}};var ot=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??be})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(t,e,n,a,s){let[i,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=r,p=l[0],g=l[l.length-1],{assetInDecimals:m}=p,{assetOutDecimals:b}=g,y=Math.abs(c),d=this.getMinimumTradeCount(o,i),P=this.getOptimalTradeCount(y),f=s?Math.round(a/s):P,T=Math.ceil(a/d),I=Math.round(a/P),C=Math.round(a/f),q=o/BigInt(f),R=await this.router.getBestSell(t,e,q),G=o<i,Dt=[];G&&Dt.push("OrderTooSmall");let Mt=R.amountOut*BigInt(f),Yt=this.toBlockPeriod(C),Kt=R.tradeFee*BigInt(f),sn=k.build(l),fe={assetIn:t,assetOut:e,errors:Dt,frequencyMin:T,frequencyOpt:I,frequency:C,tradeCount:f,tradeFee:Kt,tradeImpactPct:R.priceImpactPct,tradePeriod:Yt,tradeRoute:sn,type:"Dca"};return{...fe,amountIn:o,amountOut:Mt,tradeAmountIn:R.amountIn,tradeAmountOut:R.amountOut,toHuman(){return{...fe,amountIn:h.toDecimal(o,m),amountOut:h.toDecimal(Mt,b),tradeAmountIn:h.toDecimal(R.amountIn,m),tradeAmountOut:h.toDecimal(R.amountOut,b)}}}}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,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:i,swaps:r,priceImpactPct:o}=s,l=r[0],c=r[r.length-1],{assetInDecimals:p}=l,{assetOutDecimals:g}=c,m=Math.abs(o),b=this.getTwapTradeCount(m),y=i/BigInt(b),d=await this.router.getBestSell(l.assetIn,c.assetOut,y),P=b===1,f=i<a,T=d.priceImpactPct<-5,I=[];f||P?I.push("OrderTooSmall"):T&&I.push("OrderImpactTooBig");let C=d.amountOut*BigInt(b),q=d.tradeFee*BigInt(b),R=k.build(r),G={assetIn:t,assetOut:e,errors:I,tradeCount:b,tradeImpactPct:d.priceImpactPct,tradePeriod:6,tradeRoute:R,type:"TwapSell"};return{...G,amountIn:i,amountOut:C,tradeAmountIn:d.amountIn,tradeAmountOut:d.amountOut,tradeFee:q,toHuman(){return{...G,amountIn:h.toDecimal(i,p),amountOut:h.toDecimal(C,g),tradeAmountIn:h.toDecimal(d.amountIn,p),tradeAmountOut:h.toDecimal(d.amountOut,g),tradeFee:h.toDecimal(q,g)}}}}async getTwapBuyOrder(t,e,n){let[a,s]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:i,swaps:r,priceImpactPct:o}=s,l=r[0],c=r[r.length-1],{assetInDecimals:p}=l,{assetOutDecimals:g}=c,m=Math.abs(o),b=this.getTwapTradeCount(m),y=i/BigInt(b),d=await this.router.getBestBuy(l.assetIn,c.assetOut,y),P=d.amountIn*BigInt(b),f=b===1,T=P<a,I=d.priceImpactPct<-5,C=[];T||f?C.push("OrderTooSmall"):I&&C.push("OrderImpactTooBig");let q=d.tradeFee*BigInt(b),R=k.build(r),G={assetIn:t,assetOut:e,errors:C,tradeCount:b,tradeImpactPct:d.priceImpactPct,tradePeriod:6,tradeRoute:R,type:"TwapBuy"};return{...G,amountIn:P,amountOut:i,tradeAmountIn:d.amountIn,tradeAmountOut:d.amountOut,tradeFee:q,toHuman(){return{...G,amountIn:h.toDecimal(P,p),amountOut:h.toDecimal(i,g),tradeAmountIn:h.toDecimal(d.amountIn,p),tradeAmountOut:h.toDecimal(d.amountOut,g),tradeFee:h.toDecimal(q,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 tn={};S(tn,{BIG_10:()=>Je,BIG_BILL:()=>Ze,StakingApi:()=>kt,StakingClient:()=>Ct});import{encodeAddress as ls}from"@polkadot/util-crypto";import{stringToU8a as cs}from"@polkadot/util";import{calculate_accumulated_rps as us,calculate_period_number as Qe,calculate_rewards as ps}from"@galacticcouncil/math-staking";import lt from"big.js";var Je=lt(10),Ze=lt(Je.pow(12));function ms(u){return ls(cs(("modl"+u).padEnd(32,"\0")),63)}var kt=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=ms(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,s=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: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:s}}async getStake(t){let e=await this.client.getNFTCollectionId(),[n,a]=await Promise.all([this.client.getStaking(),this.client.getUniques(t,e)]),s=a.find(i=>i)?.itemId;return{totalStake:n?.total_stake,accumulatedRewardPerStake:n?.accumulated_reward_per_stake,potReservedBalance:n?.pot_reserved_balance,positionId:s,stakePosition:s?await this.getStakingPosition(s):void 0}}async getRewards(t,e){let n=await this.getStake(t),{potReservedBalance:a,accumulatedRewardPerStake:s,totalStake:i,stakePosition:r}=n;if(!r)return;let[o,l,c,p]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),g=lt(o.toString()).minus(a.toString()),m=s.toString(),b=lt(e).plus(1).toString();g.gt(0)&&i>0&&(m=us(s.toString(),g.toString(),i.toString()));let y=Qe(l.toString(),e,p??b),d=Qe(l.toString(),r.createdAt?.toString()??"",p??b),P=ps(m,r.rewardPerStake?.toString()??"",r.stake?.toString()??""),f=lt(P).plus(r.accumulatedUnpaidRewards?.toString()||"0").plus(r.accumulatedLockedRewards?.toString()||"0");if(!lt(y).minus(d).lte(c.toString()))return f.div(Ze).toString()}};var Ct=class extends B{async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:i})=>{let[r,o,l]=i;return{address:r,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var an={};S(an,{TxBuilderFactory:()=>ut});import{Enum as nn}from"polkadot-api";function en(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var ct=class extends B{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new L(t),this.aaveUtils=new K(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:$t})}async dryRun(t,e){let n=nn("Signed",t),a=nn("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(a,e.decodedCall),r=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(r){let o=en(r.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var Wt=class extends ct{_trade;_beneficiary;_slippagePct=1;setTrade(t){return this._trade=t,this}withBeneficiary(t){return this._beneficiary=t,this}withSlippage(t){return this._slippagePct=t,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:t,swaps:e,type:n}=this.trade;if(n==="Buy")return this.buildBuyTx();let{assetIn:a}=e[0],s=await this.balanceClient.getBalance(this.beneficiary,a);return t>=s.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,a=n[0],s=n[n.length-1],i=w.getFraction(t,this.slippagePct),r=a.assetIn,o=s.assetOut,l=t+i,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:r,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:r,asset_out:o,amount_out:e,max_amount_in:l,route:k.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,a=n[0],s=n[n.length-1],i=w.getFraction(e,this.slippagePct),r=a.assetIn,o=s.assetOut,l=e-i,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:r,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:r,asset_out:o,amount_in:t,min_amount_out:l,route:k.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],s=w.getFraction(t,this.slippagePct),i=n.assetIn,r=a.assetOut,o=t-s,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:r,min_amount_out:o,route:k.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as Pe}from"polkadot-api";var Xt=class extends ct{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(t){return this._order=t,this}withBeneficiary(t){return this._beneficiary=t,this}withMaxRetries(t){return this._maxRetries=t,this}withSlippage(t){return this._slippagePct=t,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:t}=this.order;switch(t){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${t}`)}}buildDcaTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:a,tradePeriod:s,tradeRoute:i}=this.order,r=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:Pe("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",r)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:a,tradeAmountOut:s,tradePeriod:i,tradeRoute:r}=this.order,o=w.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:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:Pe("Sell",{asset_in:e,asset_out:n,amount_in:a,min_amount_out:l,route:r})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:a,tradeAmountOut:s,tradePeriod:i,tradeRoute:r}=this.order,o=w.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:Pe("Buy",{asset_in:e,asset_out:n,amount_out:s,max_amount_in:l,route:r})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var ut=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new Wt(this.client,this.evmClient).setTrade(t)}order(t){return new Xt(this.client,this.evmClient).setOrder(t)}};async function zu(u){let t=new tt(u),e=new yt(u),[n,a]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),s=new st(u,e).withAave().withOmnipool().withStableswap().withXyk(),i=new K(e),r=new it(s),o=new ot(r,{blockTime:n,minBudgetInNative:a}),l=new L(u),c=new Ct(u),p=new kt(c,l);return{api:{aave:i,router:r,scheduler:o,staking:p},client:{asset:new J(u),balance:l,evm:e},ctx:{pool:s},tx:new ut(u,e),destroy:()=>{s.destroy()}}}export{Be as aave,Se as api,h as big,Fe as client,xe as const,zu as createSdkContext,$ as erc20,Ee as error,De as evm,A as fmt,Ht as h160,Y as json,w as math,Xe as pool,$e as sor,tn as staking,an as tx,Ae as xc};
|
|
1
|
+
var fn=Object.defineProperty;var T=(u,t)=>{for(var e in t)fn(u,e,{get:t[e],enumerable:!0})};var _e={};T(_e,{Papi:()=>B,getWs:()=>xn});import{hydration as Sn}from"@galacticcouncil/descriptors";function Be(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var B=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(Sn)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Be(n)&&console.log(t,...e)}};import{createClient as Tn}from"polkadot-api";import{withPolkadotSdkCompat as wn}from"polkadot-api/polkadot-sdk-compat";var xn=async u=>{let t=typeof u=="string"?u.split(","):u,a=(typeof window>"u"?(await import("polkadot-api/ws-provider/node")).getWsProvider:(await import("polkadot-api/ws-provider/web")).getWsProvider)(t);return Tn(wn(a))};var Me={};T(Me,{AAVE_GAS_LIMIT:()=>ne,AAVE_LENDING_POOL_ADDRESS:()=>Yt,AAVE_POOL_ABI:()=>te,AAVE_POOL_DATA_PROVIDER:()=>Wt,AAVE_POOL_DATA_PROVIDER_ABI:()=>Vt,AAVE_POOL_PROXY:()=>ee,AAVE_ROUNDING_THRESHOLD:()=>zr,AAVE_UINT_256_MAX:()=>In,AaveClient:()=>ht,AaveUtils:()=>Q});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 Vt=[{inputs:[{internalType:"contract IEACAggregatorProxy",name:"_networkBaseTokenPriceInUsdProxyAggregator",type:"address"},{internalType:"contract IEACAggregatorProxy",name:"_marketReferenceCurrencyPriceInUsdProxyAggregator",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"ETH_CURRENCY_UNIT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MKR_ADDRESS",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_bytes32",type:"bytes32"}],name:"bytes32ToString",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"decimals",type:"uint256"},{internalType:"uint256",name:"baseLTVasCollateral",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationBonus",type:"uint256"},{internalType:"uint256",name:"reserveFactor",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabled",type:"bool"},{internalType:"bool",name:"borrowingEnabled",type:"bool"},{internalType:"bool",name:"stableBorrowRateEnabled",type:"bool"},{internalType:"bool",name:"isActive",type:"bool"},{internalType:"bool",name:"isFrozen",type:"bool"},{internalType:"uint128",name:"liquidityIndex",type:"uint128"},{internalType:"uint128",name:"variableBorrowIndex",type:"uint128"},{internalType:"uint128",name:"liquidityRate",type:"uint128"},{internalType:"uint128",name:"variableBorrowRate",type:"uint128"},{internalType:"uint128",name:"stableBorrowRate",type:"uint128"},{internalType:"uint40",name:"lastUpdateTimestamp",type:"uint40"},{internalType:"address",name:"aTokenAddress",type:"address"},{internalType:"address",name:"stableDebtTokenAddress",type:"address"},{internalType:"address",name:"variableDebtTokenAddress",type:"address"},{internalType:"address",name:"interestRateStrategyAddress",type:"address"},{internalType:"uint256",name:"availableLiquidity",type:"uint256"},{internalType:"uint256",name:"totalPrincipalStableDebt",type:"uint256"},{internalType:"uint256",name:"averageStableRate",type:"uint256"},{internalType:"uint256",name:"stableDebtLastUpdateTimestamp",type:"uint256"},{internalType:"uint256",name:"totalScaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"priceInMarketReferenceCurrency",type:"uint256"},{internalType:"address",name:"priceOracle",type:"address"},{internalType:"uint256",name:"variableRateSlope1",type:"uint256"},{internalType:"uint256",name:"variableRateSlope2",type:"uint256"},{internalType:"uint256",name:"stableRateSlope1",type:"uint256"},{internalType:"uint256",name:"stableRateSlope2",type:"uint256"},{internalType:"uint256",name:"baseStableBorrowRate",type:"uint256"},{internalType:"uint256",name:"baseVariableBorrowRate",type:"uint256"},{internalType:"uint256",name:"optimalUsageRatio",type:"uint256"},{internalType:"bool",name:"isPaused",type:"bool"},{internalType:"bool",name:"isSiloedBorrowing",type:"bool"},{internalType:"uint128",name:"accruedToTreasury",type:"uint128"},{internalType:"uint128",name:"unbacked",type:"uint128"},{internalType:"uint128",name:"isolationModeTotalDebt",type:"uint128"},{internalType:"bool",name:"flashLoanEnabled",type:"bool"},{internalType:"uint256",name:"debtCeiling",type:"uint256"},{internalType:"uint256",name:"debtCeilingDecimals",type:"uint256"},{internalType:"uint8",name:"eModeCategoryId",type:"uint8"},{internalType:"uint256",name:"borrowCap",type:"uint256"},{internalType:"uint256",name:"supplyCap",type:"uint256"},{internalType:"uint16",name:"eModeLtv",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationThreshold",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationBonus",type:"uint16"},{internalType:"address",name:"eModePriceSource",type:"address"},{internalType:"string",name:"eModeLabel",type:"string"},{internalType:"bool",name:"borrowableInIsolation",type:"bool"}],internalType:"struct IUiPoolDataProviderV3.AggregatedReserveData[]",name:"",type:"tuple[]"},{components:[{internalType:"uint256",name:"marketReferenceCurrencyUnit",type:"uint256"},{internalType:"int256",name:"marketReferenceCurrencyPriceInUsd",type:"int256"},{internalType:"int256",name:"networkBaseTokenPriceInUsd",type:"int256"},{internalType:"uint8",name:"networkBaseTokenPriceDecimals",type:"uint8"}],internalType:"struct IUiPoolDataProviderV3.BaseCurrencyInfo",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"},{internalType:"address",name:"user",type:"address"}],name:"getUserReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"uint256",name:"scaledATokenBalance",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabledOnUser",type:"bool"},{internalType:"uint256",name:"stableBorrowRate",type:"uint256"},{internalType:"uint256",name:"scaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"principalStableDebt",type:"uint256"},{internalType:"uint256",name:"stableBorrowLastUpdateTimestamp",type:"uint256"}],internalType:"struct IUiPoolDataProviderV3.UserReserveData[]",name:"",type:"tuple[]"},{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"marketReferenceCurrencyPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"networkBaseTokenPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"}];var ee="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",Wt="0x112b087b60C1a166130d59266363C45F8aa99db0",Yt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",ne=1000000n,zr=5,In=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var ht=class{client;constructor(t){this.client=t.getWsProvider()}async getReservesData(){return await this.client.readContract({abi:Vt,address:Wt,args:[Yt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:Vt,address:Wt,args:[Yt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:te,address:ee,args:[t],functionName:"getUserAccountData"})}};var h={};T(h,{asBigInt:()=>An,toBigInt:()=>On,toDecimal:()=>vn});import z from"big.js";z.NE=-18;function vn(u,t,e=6,n){let a=z(u.toString()),r=z(10).pow(t);return a.div(r).round(e,n).toString()}function On(u,t){let e=z(10).pow(t),a=z(u).mul(e).toFixed(0,z.roundDown);return BigInt(a)}function An(u){return BigInt(u.round(0,z.roundDown).toFixed(0))}var tt={};T(tt,{ERC20:()=>ae});var ae=class{static fromAssetId(t){let e=Buffer.alloc(20,0);return e[15]=1,e.writeUInt32BE(t,16),"0x"+e.toString("hex")}static toAssetId(t){let e=Buffer.from(t.replace("0x",""),"hex");return e.length!==20||!this.isAssetAddress(t)?null:e.readUInt32BE(16)}static isAssetAddress(t){let e=Buffer.from("0000000000000000000000000000000100000000","hex"),n=Buffer.from(t.replace("0x",""),"hex");return n.length!==20?!1:n.subarray(0,16).equals(e.subarray(0,16))}};var R={};T(R,{FeeUtils:()=>oe,shiftNeg:()=>ft});import Rn from"big.js";var Re={};T(Re,{HUB_ASSET_ID:()=>ie,HYDRATION_OMNIPOOL_ADDRESS:()=>_n,HYDRATION_PARACHAIN_ID:()=>Bn,HYDRATION_SS58_PREFIX:()=>E,PERBILL_DENOMINATOR:()=>re,PERMILL_DENOMINATOR:()=>Pt,RUNTIME_DECIMALS:()=>I,SYSTEM_ASSET_DECIMALS:()=>se,SYSTEM_ASSET_ID:()=>N,TRADEABLE_DEFAULT:()=>et});var I=18,Pt=1e6,re=1e9,N=0,se=12,Bn=2034,E=63,_n="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",ie=1,et=15;var oe=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 ft(u,t){let e=Rn(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Xt={};T(Xt,{H160:()=>ce,isEvmAccount:()=>Ee,isEvmAddress:()=>ke,isSs58Address:()=>Ce});import{AccountId as St}from"polkadot-api";import{toHex as Fe}from"@polkadot-api/utils";import{Buffer as W}from"buffer";var le="ETH\0";function Ee(u){if(!u)return!1;try{let t=St().enc(u),e=W.from(le);return W.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function ke(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function Ce(u){try{return St(63).enc(u),!0}catch{return!1}}var ce=class u{static toAccount=t=>{let e=W.from(t.slice(2),"hex"),n=W.from(le),a=Uint8Array.from(W.concat([n,e,W.alloc(8)])),r=Fe(a);return St(63).dec(r)};static fromAccount=t=>{let e=St().enc(t),n=W.from(le),a=e.slice(n.length,-8);return"0x"+W.from(a).toString("hex")};static fromSS58=t=>{let n=St().enc(t).slice(0,20);return Fe(n)};static fromAny=t=>{if(ke(t))return t;if(Ee(t))return u.fromAccount(t);if(Ce(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var $={};T($,{findNestedKey:()=>Fn,findNestedObj:()=>En,jsonFormatter:()=>kn});var Fn=(u,t)=>{let e=[];return JSON.stringify(u,(n,a)=>(a&&a[t]&&e.push(a),a)),e[0]},En=(u,t,e)=>{let n;return JSON.stringify(u,(a,r)=>(r&&r[t]===e&&(n=r),r)),n},kn=(u,t)=>typeof t=="bigint"?t.toString():t;var v={};T(v,{calculateBuyFee:()=>Ln,calculateDiffToAvg:()=>Cn,calculateDiffToRef:()=>Dn,calculateSellFee:()=>Mn,getFraction:()=>qn});import U from"big.js";function Cn(u,t){let e=U(u.toString()),n=U(t.toString());return e.minus(n).abs().div(e.plus(n).div(2)).mul(100).round(2).toNumber()}function Dn(u,t){if(t===0n)return 0;let e=U(u.toString()),n=U(t.toString());return e.minus(n).div(n).mul(100).round(2).toNumber()}function Mn(u,t){let e=U(u.toString()),n=U(t.toString());return U(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Ln(u,t){let e=U(u.toString());return U(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function qn(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 De={};T(De,{convertToId:()=>Gn});import{Buffer as Nn}from"buffer";function Gn(u){let e=Nn.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Kt}=tt,{H160:ue}=Xt,Hn=1.01,Un=99999,Vn=10n**27n,Wn=10n**18n,Q=class{client;constructor(t){this.client=new ht(t)}async getSummary(t){let e=ue.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,m,d,p,g]=r,y=h.toDecimal(g,18),b=[];for(let P of s){let f=P.underlyingAsset.toLowerCase(),S=i.find(({underlyingAsset:bt})=>bt.toLowerCase()===f);if(!S)throw new Error("Missing pool reserve for "+f);let w=P.scaledATokenBalance,k=S.liquidityIndex,C=S.priceInMarketReferenceCurrency,_=w*k/Vn,K=Number(o===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,q=S.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,j=Kt.toAssetId(f);b.push({aTokenBalance:_,decimals:Number(S.decimals),isCollateral:q,priceInRef:C,reserveId:j,reserveAsset:f,reserveLiquidationThreshold:K})}return{healthFactor:Number(y),totalCollateral:l,totalDebt:c,reserves:b}}async hasBorrowPositions(t){let e=ue.fromAny(t),n=await this.client.getUserAccountData(e),[a,r]=n;return r>0n}async getHealthFactor(t){let e=ue.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=Kt.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:m,reserveLiquidationThreshold:d}=o,p=h.toBigInt(n,l),g=c?p*m/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=Kt.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:m}=o,p=h.toBigInt(n,l)*c/10n**BigInt(l),g=a+p;return g<=0n?0:this.calculateHealthFactor(g,m,r)}async getMaxWithdraw(t,e){let{totalCollateral:n,totalDebt:a,reserves:r}=await this.getSummary(t),i=Kt.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 Un;let a=10n**6n,r=h.toBigInt(e,18),i=t*r*a,s=n*Wn,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(Hn,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 Ne={};T(Ne,{AssetClient:()=>nt,BalanceClient:()=>H,ChainParams:()=>rt});var nt=class extends B{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:m}=await this.mapToken(r,e,n),d=Number(i),p=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",p.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:m,icon:c,type:s.type,isSufficient:o,existentialDeposit:l,underlyingAssetId: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,m=await Promise.all(r.map(async g=>{let{symbol:y}=await this.mapToken(g,e,n);return[g,y]})),d=Object.fromEntries(m),p=Object.values(d);return{id:t,name:p.join(", "),symbol:s?.asText()||i?.asText(),decimals:18,icon:p.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 m=a.get(l),{asset_type:d}=c,p;switch(d.type){case"Bond":let g=i.get(l);p=await this.mapBond(l,c,s,g);break;case"StableSwap":let y=r.get(l);p=await this.mapShares(l,c,s,y);break;case"External":p=await this.mapExternal(l,c,e,m);break;default:p=await this.mapToken(l,c,s,m)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};import{Subject as Yn,bufferCount as Xn,combineLatest as Kn,debounceTime as jn,distinctUntilChanged as Le,finalize as zn,map as at,pairwise as $n,shareReplay as Qn,startWith as Jn}from"rxjs";var H=class extends B{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 Kn([e,n,a]).pipe(jn(250),at(r=>r.flat()),Jn([]),Xn(2,1),at(([r,i],s)=>{if(s===0)return i;let o=r.reduce((c,m)=>(c.set(m.id,m.balance),c),new Map);return i.filter(c=>!qe(c.balance,o.get(c.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe(at(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe(at(a=>({id:e,balance:a})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe(Le((n,a)=>!a.deltas),at(({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 Yn,a=n.pipe(Qn(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 p=>{let g=await this.getTokenBalanceData(t,p);return[p,g]}))).map(([p,g])=>({id:p,balance:g}));n.next(d)};await l();let c=this.api.query.System.Number.watchValue("best").subscribe(l);return()=>c.unsubscribe()},s;return i().then(o=>s=o),a.pipe(zn(()=>s?.()),$n(),at(([o,l],c)=>{if(c===0)return l;let m=o.reduce((p,g)=>(p.set(g.id,g.balance),p),new Map);return l.filter(p=>!qe(p.balance,m.get(p.id)))}),Le((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},qe=(u,t)=>u!==void 0&&t!==void 0&&u.transferable===t.transferable&&u.total===t.total;var rt=class extends B{_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 Ge={};T(Ge,{AssetNotFound:()=>me,PoolNotFound:()=>Tt,RouteNotFound:()=>wt});var me=class extends Error{constructor(t){super(),this.message=`${t} not found`,this.name="AssetNotFound"}},Tt=class extends Error{constructor(t){super(),this.message=`${t} pool invalid`,this.name="PoolNotFound"}},wt=class extends Error{constructor(t,e){super(),this.message=`Route from ${t} to ${e} not found in current configuration`,this.name="RouteNotFound"}};var Ve={};T(Ve,{EvmClient:()=>xt,createChain:()=>pe});import{defineChain as Zn}from"viem";var ta=["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"],pe=()=>Zn({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:ta}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});import{createPublicClient as He,createWalletClient as ea,custom as Ue,http as na}from"viem";var xt=class{client;chain;constructor(t){this.client=t,this.chain=pe()}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return He({chain:this.chain,transport:na()})}getWsProvider(){return He({transport:Ue({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return ea({account:t,chain:this.chain,transport:Ue(window.ethereum)})}};var Ze={};T(Ze,{PoolContextProvider:()=>lt,PoolError:()=>J,PoolFactory:()=>ot,PoolType:()=>O,aave:()=>Pe,lbp:()=>ge,omni:()=>be,stable:()=>ye,xyk:()=>he});var ge={};T(ge,{LbpMath:()=>G,LbpPool:()=>It,LbpPoolClient:()=>Ot});import{calculate_in_given_out as aa,calculate_out_given_in as ra,calculate_linear_weights as sa,calculate_pool_trade_fee as ia,get_spot_price as oa}from"@galacticcouncil/math-lbp";var G=class{static getSpotPrice(t,e,n,a,r){return oa(t,e,n,a,r)}static calculateInGivenOut(t,e,n,a,r){return aa(t,e,n,a,r)}static calculateOutGivenIn(t,e,n,a,r){return ra(t,e,n,a,r)}static calculateLinearWeights(t,e,n,a,r){return sa(t,e,n,a,r)}static calculatePoolTradeFee(t,e,n){return ia(t,e,n)}};var O=(r=>(r.Aave="Aave",r.LBP="LBP",r.Omni="Omnipool",r.Stable="Stableswap",r.XYK="XYK",r))(O||{}),J=(r=>(r.InsufficientTradingAmount="InsufficientTradingAmount",r.MaxInRatioExceeded="MaxInRatioExceeded",r.MaxOutRatioExceeded="MaxOutRatioExceeded",r.TradeNotAllowed="TradeNotAllowed",r.UnknownError="UnknownError",r))(J||{});var{FeeUtils:We}=R,It=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=We.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+s,c=this.calculateInGivenOut(t,l),m=t.balanceIn/this.maxInRatio;return c>m&&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=We.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=s-o,m=t.balanceOut/this.maxOutRatio;return c>m&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:s,amountOut:c,feePct:l,errors:r}}}calculateInGivenOut(t,e){let n=G.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=G.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=G.getSpotPrice(t.balanceOut.toString(),t.balanceIn.toString(),t.weightOut.toString(),t.weightIn.toString(),this.maxOutRatio.toString());return BigInt(e)}spotPriceOutGivenIn(t){let e=G.getSpotPrice(t.balanceIn.toString(),t.balanceOut.toString(),t.weightIn.toString(),t.weightOut.toString(),this.maxInRatio.toString());return BigInt(e)}calculateTradeFee(t,e){let n=G.calculatePoolTradeFee(t.toString(),this.repayFeeApply?e.repayFee[0]:e.exchangeFee[0],this.repayFeeApply?e.repayFee[1]:e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as ga}from"polkadot-api";import{map as ba,of as ze,switchMap as ya}from"rxjs";import{memoize1 as la}from"@thi.ng/memoize";import{combineLatest as Ye,combineLatestAll as ca,debounceTime as ua,firstValueFrom as ma,from as Xe,map as Ke,mergeAll as pa,of as da,switchMap as je}from"rxjs";var de=[{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"description",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"version",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint80",name:"_roundId",type:"uint80"}],name:"getRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"},{inputs:[],name:"latestRoundData",outputs:[{internalType:"uint80",name:"roundId",type:"uint80"},{internalType:"int256",name:"answer",type:"int256"},{internalType:"uint256",name:"startedAt",type:"uint256"},{internalType:"uint256",name:"updatedAt",type:"uint256"},{internalType:"uint80",name:"answeredInRound",type:"uint80"}],stateMutability:"view",type:"function"}];var vt=class{client;constructor(t){this.client=t.getWsProvider()}async getData(t,e=6){let[n,a,r]=await Promise.all([this.client.readContract({abi:de,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:de,address:t,functionName:"decimals"}),this.client.getBlock()]),[i,s,o,l]=n,c=r.number-(r.timestamp-l)/BigInt(e),m=Number(c);return{price:s,decimals:a,updatedAt:m<0?0:m}}};var D=class extends H{evm;mmOracle;override=[];mem=0;memPools=la(t=>(this.log(this.getPoolType(),"mem pools",t,"\u2705"),this.loadPools()));constructor(t,e){super(t),this.evm=e,this.mmOracle=new vt(e)}async withOverride(t){this.override=t||[]}async getPoolsMem(){return this.memPools(this.mem)}async getPools(){let t=Xe(this.getPoolsMem()).pipe(je(e=>this.subscribe(e)),ca());return ma(t)}getSubscriber(){return Xe(this.getPoolsMem()).pipe(je(t=>this.subscribe(t)),pa())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>Ye([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe(ua(250),Ke(([n,a])=>this.updatePool(n,a))))}subscribePoolBalance(t){if(t.type==="Aave")return da([]);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 Ye(e).pipe(Ke(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 Ot=class extends D{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,m=G.calculateLinearWeights(a?a.toString():"0",r?r.toString():"0",s.toString(),o.toString(),n.toString()),[d,p]=i,g=BigInt(m),y=this.MAX_FINAL_WEIGHT-BigInt(g),[b,P,f,S,w]=await Promise.all([this.isRepayFeeApplied(d,l,c.toString()),this.getBalance(t,d),this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(t,p),this.api.query.AssetRegistry.Assets.getValue(p)]);return{repayFeeApply:b,tokens:[{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:P.transferable,weight:g,type:f?.asset_type.type},{id:p,decimals:w?.decimals,existentialDeposit:w?.existential_deposit,balance:S.transferable,weight:y,type:w?.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(ga.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe(ya(a=>a?this.getPoolDelta(t.address,n,a.relay_parent_number):ze(t)),ba(a=>Object.assign({},t,a))):ze(t)}};var be={};T(be,{OmniMath:()=>x,OmniPool:()=>At,OmniPoolClient:()=>Bt});import{calculate_in_given_out as ha,calculate_lrna_in_given_out as Pa,calculate_out_given_in as fa,calculate_out_given_lrna_in as Sa,calculate_spot_price as Ta,calculate_lrna_spot_price as wa,calculate_shares as xa,calculate_liquidity_out as Ia,calculate_liquidity_lrna_out as va,verify_asset_cap as Oa,calculate_liquidity_hub_in as Aa,is_sell_allowed as Ba,is_buy_allowed as _a,is_add_liquidity_allowed as Ra,is_remove_liquidity_allowed as Fa}from"@galacticcouncil/math-omnipool";import st from"big.js";var x=class{static calculateSpotPrice(t,e,n,a){return Ta(t,e,n,a)}static calculateLrnaSpotPrice(t,e){return wa(t,e)}static calculateInGivenOut(t,e,n,a,r,i,s,o,l){return ha(t,e,n,a,r,i,s,o,l)}static calculateLrnaInGivenOut(t,e,n,a,r){return Pa(t,e,n,a,r)}static calculateOutGivenIn(t,e,n,a,r,i,s,o,l){return fa(t,e,n,a,r,i,s,o,l)}static calculateOutGivenLrnaIn(t,e,n,a,r){return Sa(t,e,n,a,r)}static calculateShares(t,e,n,a){return xa(t,e,n,a)}static calculateLiquidityOut(t,e,n,a,r,i,s,o){return Ia(t,e,n,a,r,i,s,o)}static calculateLiquidityLRNAOut(t,e,n,a,r,i,s,o){return va(t,e,n,a,r,i,s,o)}static calculateCapDifference(t,e,n,a){let r=st(e),i=st(t),s=st(a),o=st(n),l=st(10).pow(18),c=o.div(l);if(r.div(s).lt(c)){let d=c.times(s).minus(r).times(i),p=r.times(st(1).minus(c));return d.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,a){return Oa(t,e,n,a)}static calculateLimitHubIn(t,e,n,a){return Aa(t,e,n,a)}static isSellAllowed(t){return Ba(t)}static isBuyAllowed(t){return _a(t)}static isAddLiquidityAllowed(t){return Ra(t)}static isRemoveLiquidityAllowed(t){return Fa(t)}};var{FeeUtils:it}=R,At=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:v.calculateDiffToRef(r,a),s=[],o=x.isSellAllowed(t.tradeableIn),l=x.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 m=t.balanceIn/this.maxInRatio;return r>m&&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=v.calculateDiffToRef(a,r),s=[],o=x.isSellAllowed(t.tradeableIn),l=x.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 m=t.balanceOut/this.maxOutRatio;return r>m&&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=x.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?it.toRaw(n.assetFee).toString():"0",n?it.toRaw(n.protocolFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}calculateLrnaInGivenOut(t,e,n){let a=x.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?it.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=x.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?it.toRaw(n.assetFee).toString():"0",n?it.toRaw(n.protocolFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}calculateOutGivenLrnaIn(t,e,n){let a=x.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?it.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=x.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=x.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=x.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=x.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};import{AccountId as Ea,CompatibilityLevel as ka}from"polkadot-api";import{toHex as Ca}from"@polkadot-api/utils";import{distinctUntilChanged as Da,map as $e}from"rxjs";var{FeeUtils:Y}=R,Bt=class extends D{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:m})=>{let[d]=c,{hub_reserve:p,shares:g,tradable:y,cap:b,protocol_shares:P}=m,[f,S]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(d),this.getBalance(e,d)]);return{id:d,decimals:f?.decimals,existentialDeposit:f?.existential_deposit,balance:S.transferable,cap:b,hubReserves:p,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=Ca(e);return Ea(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:Y.fromPermill(o),protocolFee:Y.fromPermill(l),min:Y.fromPermill(i),max:Y.fromPermill(s)}}else return{assetFee:Y.fromPermill(n.min_fee),protocolFee:Y.fromPermill(a.min_fee),min:Y.fromPermill(i),max:Y.fromPermill(s)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(ka.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(Da((n,a)=>!a.deltas),$e(({entries:n})=>n.map(a=>{let[r]=a.args,{hub_reserve:i,shares:s,tradable:o,cap:l,protocol_shares:c}=a.value,m=t.tokens.findIndex(p=>p.id===r);return{...t.tokens[m],cap:l,hubReserves:i,protocolShares:c,shares:s,tradeable:o}})),$e(n=>{let a=t.tokens.find(r=>r.id===1);return{...t,tokens:[...n,a]}}))}};var ye={};T(ye,{StableMath:()=>A,StableSwap:()=>_t,StableSwapClient:()=>Rt});import{calculate_in_given_out as Ma,calculate_out_given_in as La,calculate_amplification as qa,calculate_add_one_asset as Na,calculate_liquidity_out_one_asset as Ga,calculate_shares as Ha,calculate_shares_for_amount as Ua,calculate_spot_price_with_fee as Va,pool_account_name as Wa,recalculate_peg as Ya}from"@galacticcouncil/math-stableswap";var A=class{static getPoolAddress(t){return Wa(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 qa(t,e,n,a,r)}static calculateInGivenOut(t,e,n,a,r,i,s){return Ma(t,e,n,a,r,i,s)}static calculateAddOneAsset(t,e,n,a,r,i,s){return Na(t,e,n,a,r,i,s)}static calculateSharesForAmount(t,e,n,a,r,i,s){return Ua(t,e,n,a,r,i,s)}static calculateOutGivenIn(t,e,n,a,r,i,s){return La(t,e,n,a,r,i,s)}static calculateLiquidityOutOneAsset(t,e,n,a,r,i,s){return Ga(t,e,n,a,r,i,s)}static calculateShares(t,e,n,a,r,i){return Ha(t,e,n,a,r,i)}static calculateSpotPriceWithFee(t,e,n,a,r,i,s,o){return Va(t,e,n,a,r,i,s,o)}static recalculatePegs(t,e,n,a,r){let i=Ya(t,e,n,a,r);return JSON.parse(i)}};var{FeeUtils:X}=R,_t=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=X.toPct(n.fee),s=[],o=x.isSellAllowed(t.tradeableIn),l=x.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=X.toPct(n.fee),s=[],o=x.isSellAllowed(t.tradeableIn),l=x.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=A.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?X.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateAddOneAsset(t,e,n){let a=A.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?X.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateSharesForAmount(t,e,n){let a=A.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?X.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=A.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=A.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?X.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateWithdrawOneAsset(t,e,n){let a=A.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?X.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateShares(t,e,n){let a=A.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?X.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=A.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=A.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,$.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],$.jsonFormatter)}};import{AccountId as Xa,CompatibilityLevel as Ka}from"polkadot-api";import{toHex as ja}from"@polkadot-api/utils";import{blake2b as za}from"@noble/hashes/blake2b";import{map as $a,of as Qa,switchMap as Ja}from"rxjs";var{FeeUtils:Z}=R,Rt=class extends D{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=A.getPoolAddress(t),n=za(e,{dkLen:32}),a=ja(n);return Xa(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=A.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(Ka.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,m]=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:Z.fromPermill(i.fee),tokens:c,...l,...m,...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=Z.fromPermill(a.max_peg_update),o=Z.fromPermill(e.fee),[l,c]=A.recalculatePegs(JSON.stringify(i),JSON.stringify(r),n.toString(),Z.toRaw(s).toString(),Z.toRaw(o).toString()),m=Number(l)*1e6;return{pegsFee:Z.fromPermill(m),pegs:c}}getDefaultPegs(t){let e=t.fee,n=A.defaultPegs(t.assets.length);return{pegsFee:Z.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,m]=s.value,d=[m,r[o]].sort((f,S)=>f-S),p=await this.api.query.EmaOracle.Oracles.getValue(l,d,c);if(!p)return;let[{price:g,updated_at:y}]=p,b=g.n.toString(),P=g.d.toString();return m.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:m,updatedAt:d}=await this.mmOracle.getData(l),p=10**m;return[[c.toString(),p.toString()],d.toString()]}else return[s.value.map(l=>l.toString()),n.toString()]});return Promise.all(i)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?Qa(t):e.watchValue("best").pipe(Ja(a=>Promise.all([this.getPoolDelta(t.id,n,a),this.getPoolPegs(t.id,n,a)])),$a(([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 he={};T(he,{XykMath:()=>V,XykPool:()=>Ft,XykPoolClient:()=>Et});import{calculate_in_given_out as Za,calculate_out_given_in as tr,calculate_pool_trade_fee as er,get_spot_price as nr,calculate_liquidity_in as ar,calculate_shares as rr,calculate_spot_price as sr,calculate_spot_price_with_fee as ir,calculate_liquidity_out_asset_a as or,calculate_liquidity_out_asset_b as lr}from"@galacticcouncil/math-xyk";var V=class{static getSpotPrice(t,e,n){return nr(t,e,n)}static calculateInGivenOut(t,e,n){return Za(t,e,n)}static calculateOutGivenIn(t,e,n){return tr(t,e,n)}static calculatePoolTradeFee(t,e,n){return er(t,e,n)}static calculateLiquidityIn(t,e,n){return ar(t,e,n)}static calculateSpotPrice(t,e){return sr(t,e)}static calculateSpotPriceWithFee(t,e,n,a){return ir(t,e,n,a)}static calculateShares(t,e,n){return rr(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,a){return or(t,e,n,a)}static calculateLiquidityOutAssetB(t,e,n,a){return lr(t,e,n,a)}};var{FeeUtils:Qe}=R,Ft=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=Qe.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=Qe.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=V.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}calculateOutGivenIn(t,e){let n=V.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}spotPriceInGivenOut(t){let e=V.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=V.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=V.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};import{CompatibilityLevel as cr}from"polkadot-api";import{of as ur}from"rxjs";var Et=class extends D{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,m,d,p]=await Promise.all([this.getBalance(s,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(s,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:s,type:"XYK",tokens:[{id:o,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:c.transferable,type:m?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:d.transferable,type:p?.asset_type.type}],...n}});return Promise.all(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(cr.BackwardsCompatible,e)}subscribePoolChange(t){return ur(t)}};var Pe={};T(Pe,{AavePool:()=>kt,AavePoolClient:()=>Ct});var kt=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}};import{AccountId as mr}from"polkadot-api";import{toHex as pr}from"@polkadot-api/utils";import{map as dr,merge as gr,switchMap as br}from"rxjs";import{decodeEventLog as yr}from"viem";var Je=[{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:hr}=tt,Pr=["Supply","Withdraw","Repay","Borrow"],Ct=class extends D{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=pr(a);return mr(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()),m=l.asHex(),{eventName:d,args:p}=yr({abi:Je,topics:c,data:m});return Pr.includes(d)&&p.reserve.toLowerCase()===a.toLowerCase()});return gr([r,i]).pipe(br(()=>this.getPoolDelta(t)),dr(s=>({...t,tokens:[...s]})))}getReserveH160Id(t){return t.type==="Erc20"?$.findNestedKey(t.location,"AccountKey20").AccountKey20.key:hr.fromAssetId(t.id)}};var ot=class{static get(t){switch(t.type){case"Aave":return kt.fromPool(t);case"XYK":return Ft.fromPool(t);case"Omnipool":return At.fromPool(t);case"LBP":return It.fromPool(t);case"Stableswap":return _t.fromPool(t);default:throw new Error("Pool type "+t.type+" is not supported yet")}}};import{Subject as fr,Subscription as Dt,takeUntil as Sr}from"rxjs";var lt=class extends B{evm;lbpClient;omniClient;stableClient;xykClient;aaveClient;active=new Set([]);clients=[];pools=new Map([]);lbpSub=Dt.EMPTY;omniSub=Dt.EMPTY;stableSub=Dt.EMPTY;xykSub=Dt.EMPTY;aaveSub=Dt.EMPTY;isReady=!1;isDestroyed=new fr;constructor(t,e){super(t),this.evm=e,this.lbpClient=new Ot(t,e),this.omniClient=new Bt(t,e),this.stableClient=new Rt(t,e),this.xykClient=new Et(t,e),this.aaveClient=new Ct(t,e),this.clients=[this.lbpClient,this.omniClient,this.stableClient,this.xykClient,this.aaveClient]}subscribe(t){return t.getSubscriber().pipe(Sr(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 Tt(t.type)}};var rn={};T(rn,{DEFAULT_BLOCK_TIME:()=>en,DEFAULT_MIN_BUDGET:()=>Te,ORDER_MIN_BLOCK_PERIOD:()=>nn,Router:()=>ct,TWAP_BLOCK_PERIOD:()=>Nt,TWAP_MAX_DURATION:()=>xe,TWAP_MAX_PRICE_IMPACT:()=>we,TWAP_TX_MULTIPLIER:()=>lu,TradeOrderError:()=>Se,TradeOrderType:()=>zt,TradeRouteBuilder:()=>M,TradeRouter:()=>ut,TradeScheduler:()=>mt,TradeType:()=>jt});var Mt=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 Tr=8,Lt=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 Mt,i=[];for(i.push([e,""]),r.enqueue(i);r.size()>0;){let s=r.dequeue();if(!s||s.length>Tr)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 m=[...s];m.push(c),r.enqueue(m)}})}return a}findShortestPaths(t,e,n){let a=[],r=new Mt,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 m of c??[])this.isNotVisited(m,o)&&r.enqueue([...o,m])}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 fe(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 qt=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 Lt,c=b=>{let P=fe(b),f=Object.keys(P),S=f.flatMap(w=>P[w]);return l.buildAndPopulateGraph(f,S)};if(!s&&!o){let b=a.filter(S=>S.tokens.find(w=>w.id===t)||S.tokens.find(w=>w.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 m=s?e:t,d=a.filter(b=>b.tokens.some(P=>P.id===m));if(d.length===0)return[];let p=[...r,...d],g=c(p),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 ct=class{routeSuggester;routeProposals;routerOptions;ctx;constructor(t,e={}){this.ctx=t,this.routeSuggester=new qt,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,ot.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 jt=(e=>(e.Buy="Buy",e.Sell="Sell",e))(jt||{}),zt=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(zt||{}),Se=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Se||{});var{FeeUtils:tn}=R,ut=class extends ct{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 wt(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?tn.toPct(t.min):void 0,n=t.max?tn.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),m=r?a.tradeFeePct:v.calculateSellFee(o,s),d=Math.pow(10,n.assetInDecimals),p=n.amountIn*i/BigInt(d),g=v.calculateDiffToRef(o,p);return{type:"Sell",amountIn:n.amountIn,amountOut:a.amountOut,spotPrice:i,tradeFee:l,tradeFeePct:m,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:m,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=v.getFraction(l,.1),m=await Promise.all(a.map(y=>this.toSellSwaps(c,y,i))),p=this.findBestSellRoute(m).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,p),p}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:m,calculatedOut:d,feePct:p,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=v.calculateDiffToRef(d,f);a.push({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:m,calculatedOut:d,spotPrice:b,tradeFeePct:p,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(m,o.decimalsOut),calculatedOut:h.toDecimal(d,o.decimalsOut),spotPrice:h.toDecimal(b,o.decimalsOut),tradeFeePct:p,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),m=r?a.tradeFeePct:v.calculateBuyFee(o,s),d=Math.pow(10,n.assetOutDecimals),p=n.amountOut*i/BigInt(d),g;return o===0n?g=-100:g=v.calculateDiffToRef(p,o),{type:"Buy",amountOut:n.amountOut,amountIn:a.amountIn,spotPrice:i,tradeFee:l,tradeFeePct:m,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:m,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:m,calculatedIn:d,feePct:p,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=v.calculateDiffToRef(f,d),a.unshift({...i,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:m,calculatedIn:d,spotPrice:b,tradeFeePct:p,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(m,o.decimalsIn),calculatedIn:h.toDecimal(d,o.decimalsIn),spotPrice:h.toDecimal(b,o.decimalsIn),tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g}}})}return a}};var en=6e3,Te=1000000000000000n,Nt=6,we=-5,xe=216e5,lu=3,nn=6;import{Enum as an}from"polkadot-api";var M=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:a,poolId:r})=>a==="Stableswap"?{pool:an("Stableswap",r),asset_in:e,asset_out:n}:{pool:an(a),asset_in:e,asset_out:n})}};var mt=class{schedulerOptions;router;constructor(t,e={}){this.router=t,this.schedulerOptions=Object.freeze({blockTime:e.blockTime??6e3,minBudgetInNative:e.minBudgetInNative??Te})}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,m=l[0],d=l[l.length-1],{assetInDecimals:p}=m,{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),w=Math.round(a/P),k=Math.round(a/f),C=o/BigInt(f),_=await this.router.getBestSell(t,e,C),L=o<i,K=[];L&&K.push("OrderTooSmall");let q=_.amountOut*BigInt(f),j=this.toBlockPeriod(k),bt=_.tradeFee*BigInt(f),yt=M.build(l),Ut={assetIn:t,assetOut:e,errors:K,frequencyMin:S,frequencyOpt:w,frequency:k,tradeCount:f,tradeFee:bt,tradeImpactPct:_.priceImpactPct,tradePeriod:j,tradeRoute:yt,type:"Dca"};return{...Ut,amountIn:o,amountOut:q,tradeAmountIn:_.amountIn,tradeAmountOut:_.amountOut,toHuman(){return{...Ut,amountIn:h.toDecimal(o,p),amountOut:h.toDecimal(q,g),tradeAmountIn:h.toDecimal(_.amountIn,p),tradeAmountOut:h.toDecimal(_.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:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),y=i/BigInt(g),b=await this.router.getBestSell(l.assetIn,c.assetOut,y),P=g===1,f=i<a,S=b.priceImpactPct<-5,w=[];f||P?w.push("OrderTooSmall"):S&&w.push("OrderImpactTooBig");let k=b.amountOut*BigInt(g),C=b.tradeFee*BigInt(g),_=M.build(s),L={assetIn:t,assetOut:e,errors:w,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:_,type:"TwapSell"};return{...L,amountIn:i,amountOut:k,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:C,toHuman(){return{...L,amountIn:h.toDecimal(i,m),amountOut:h.toDecimal(k,d),tradeAmountIn:h.toDecimal(b.amountIn,m),tradeAmountOut:h.toDecimal(b.amountOut,d),tradeFee:h.toDecimal(C,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:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),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,w=b.priceImpactPct<-5,k=[];S||f?k.push("OrderTooSmall"):w&&k.push("OrderImpactTooBig");let C=b.tradeFee*BigInt(g),_=M.build(s),L={assetIn:t,assetOut:e,errors:k,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:_,type:"TwapBuy"};return{...L,amountIn:P,amountOut:i,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:C,toHuman(){return{...L,amountIn:h.toDecimal(P,m),amountOut:h.toDecimal(i,d),tradeAmountIn:h.toDecimal(b.amountIn,m),tradeAmountOut:h.toDecimal(b.amountOut,d),tradeFee:h.toDecimal(C,m)}}}}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 cn={};T(cn,{BIG_10:()=>on,BIG_BILL:()=>ln,StakingApi:()=>Gt,StakingClient:()=>Ht});import{encodeAddress as wr}from"@polkadot/util-crypto";import{stringToU8a as xr}from"@polkadot/util";import{calculate_accumulated_rps as Ir,calculate_period_number as sn,calculate_rewards as vr}from"@galacticcouncil/math-staking";import pt from"big.js";var on=pt(10),ln=pt(on.pow(12));function Or(u){return wr(xr(("modl"+u).padEnd(32,"\0")),63)}var Gt=class{client;balanceClient;constructor(t,e){this.client=t,this.balanceClient=e}async getFreePotBalance(){let t=await this.client.getPalletId(),e=Or(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,m=o.amount,d=o.conviction.toString(),p=await this.client.getReferendumInfo(c);return p&&(p.type==="Approved"||p.type==="Rejected")&&l.push({id:c,amount:m,conviction:d}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt: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,m]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=pt(o.toString()).minus(a.toString()),p=r.toString(),g=pt(e).plus(1).toString();d.gt(0)&&i>0&&(p=Ir(r.toString(),d.toString(),i.toString()));let y=sn(l.toString(),e,m??g),b=sn(l.toString(),s.createdAt?.toString()??"",m??g),P=vr(p,s.rewardPerStake?.toString()??"",s.stake?.toString()??""),f=pt(P).plus(s.accumulatedUnpaidRewards?.toString()||"0").plus(s.accumulatedLockedRewards?.toString()||"0");if(!pt(y).minus(b).lte(c.toString()))return f.div(ln).toString()}};var Ht=class extends B{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 pn={};T(pn,{TxBuilderFactory:()=>gt});import{Enum as mn}from"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 dt=class extends B{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new H(t),this.aaveUtils=new Q(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:ne})}async dryRun(t,e){let n=mn("Signed",t),a=mn("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 $t=class extends dt{_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=v.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:M.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=v.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:M.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=v.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:M.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};import{Enum as Ie}from"polkadot-api";var Qt=class extends dt{_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:Ie("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=v.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:Ie("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=v.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:Ie("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 gt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new $t(this.client,this.evmClient).setTrade(t)}order(t){return new Qt(this.client,this.evmClient).setOrder(t)}};import{AccountId as Ar}from"polkadot-api";import{fixed_from_rational as dn}from"@galacticcouncil/math-liquidity-mining";import F from"big.js";var Br=F(365.2425).times(24).times(60).times(60),_r=BigInt(F(1).pow(18).toString()),Rr=6,Jt=class{client;balanceClient;omnipoolAssetIds=[];constructor(t,e){this.client=t,this.balanceClient=e}async getOraclePrice(t,e){let n=[t,e].sort((r,i)=>r-i);if(t===e)return _r;let a=await this.client.getOraclePrice(n);if(a){let{n:r,d:i}=a[0].price,s;return t<e?s=dn(r.toString(),i.toString()):s=dn(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 Ar(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,a){let r=F(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=F(t.toString()).times(e),i=F(n.toString()).times(a);return r.div(i.toString()).toString()}farmData(t,e,n){let{yieldFarm:a,globalFarm:r,priceAdjustment:i,balance:s,id:o}=t,{multiplier:l,loyalty_curve:c}=a,{blocks_per_period:m,yield_per_period:d,total_shares_z:p,max_reward_per_period:g,pending_rewards:y,accumulated_paid_rewards:b,planned_yielding_periods:P,updated_at:f,incentivized_asset:S,reward_currency:w,price_adjustment:k}=r,C=ft(i??k,18),_=ft(l,18),L=ft(c?.initial_reward_percentage??0,18),K=Br.div(F(Rr).times(m)).toString(),q;if(p<=0)q=F(_).times(d.toString()).times(K).toString();else{let hn=this.getGlobalRewardPerPeriod(p,d,g,C),Pn=this.getPoolYieldPerPeriod(hn,_,p,C);q=F(Pn).times(K).toString()}let j=y+b,bt=g*BigInt(P),yt=s.transferable+j,Ut=yt-j,ve=F(Ut.toString()).div(g.toString()),Oe=F(e).div(m.toString()).toString(),gn=(p>=0?ve.plus(f):ve.plus(Oe)).toString(),bn=F(p.toString()).div(F(g.toString()).div(d.toString())).div(Math.pow(10,18)).times(100).times(C).toFixed(2),Ae=F(j.toString()).div(yt.toString()).gte(.999);q=Ae?"0":F(q).div(n?2:1).times(100).toString();let yn=L?F(q).times(L).toString():void 0;return{apr:q,minApr:yn,isDistributed:Ae,estimatedEndPeriod:gn,maxRewards:bt,incentivizedAsset:S,rewardCurrency:w,loyaltyCurve:c,currentPeriod:Oe,potMaxRewards:yt,fullness:bn,yieldFarmId:a.id,globalFarmId:r.id,poolId:o}}async getAllOmnipoolFarms(){let e=(await this.client.getAllOmnipooFarms()).reduce((n,a)=>n.includes(a.keyArgs[0].toString())?n:[...n,a.keyArgs[0].toString()],[]);return Promise.all(e.map(async n=>await this.getOmnipoolFarms(n)))}async getOmnipoolFarms(t){let e=await this.client.getOmnipooFarms(Number(t)),n=await this.client.getRelayBlockNumber(),a=await Promise.all(e.map(async({keyArgs:r,value:i})=>{let[,s]=r,o=i,l=await this.client.getOmnipoolGlobalFarm(s),c=await this.client.getOmnipoolYieldFarm(Number(t),s,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(s),g=await this.getOraclePrice(m,d),y=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:y}}));return n?a.map(r=>r?this.farmData(r,n):void 0):[]}async getAllIsolatedFarms(){let e=(await this.client.getAllIsolatedFarms()).reduce((n,a)=>n.includes(a.keyArgs[0].toString())?n:[...n,a.keyArgs[0].toString()],[]);return Promise.all(e.map(async n=>await this.getIsolatedFarms(n)))}async getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),a=await Promise.all(e.map(async({keyArgs:r,value:i})=>{let[,s]=r,o=i,l=await this.client.getIsolatedGlobalFarm(s),c=await this.client.getIsolatedYieldFarm(t,s,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(s,!0),g=await this.getOraclePrice(m,d),y=await this.balanceClient.getBalance(p,m);return{id:t,globalFarm:l,yieldFarm:c,priceAdjustment:g,balance:y,farmAddress:p}}));return n?a.map(r=>r?this.farmData(r,n,!0):void 0):[]}};import{Binary as Fr,Enum as Er}from"polkadot-api";var Zt=class extends B{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(Fr.fromText("omnipool"),t,Er("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getAllOmnipooFarms(){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries()}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,n){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,n)}async getAllIsolatedFarms(){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries()}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,n){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,n)}};async function Rm(u){let t=new rt(u),e=new xt(u),[n,a]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),r=new lt(u,e).withAave().withOmnipool().withStableswap().withXyk(),i=new Q(e),s=new ut(r),o=new mt(s,{blockTime:n,minBudgetInNative:a}),l=new H(u),c=new Ht(u),m=new Gt(c,l),d=new Zt(u),p=new Jt(d,l);return{api:{aave:i,router:s,scheduler:o,staking:m,farm:p},client:{asset:new nt(u),balance:l,evm:e},ctx:{pool:r},tx:new gt(u,e),destroy:()=>{r.destroy()}}}export{Me as aave,_e as api,h as big,Ne as client,Re as const,Rm as createSdkContext,tt as erc20,Ge as error,Ve as evm,R as fmt,Xt as h160,$ as json,v as math,Ze as pool,rn as sor,cn as staking,pn as tx,De as xc};
|
package/build/types/factory.d.ts
CHANGED
|
@@ -6,12 +6,14 @@ import { PoolContextProvider } from './pool';
|
|
|
6
6
|
import { TradeRouter, TradeScheduler } from './sor';
|
|
7
7
|
import { TxBuilderFactory } from './tx';
|
|
8
8
|
import { StakingApi } from './staking';
|
|
9
|
+
import { LiquidityMiningApi } from './farm';
|
|
9
10
|
export type SdkCtx = {
|
|
10
11
|
api: {
|
|
11
12
|
aave: AaveUtils;
|
|
12
13
|
router: TradeRouter;
|
|
13
14
|
scheduler: TradeScheduler;
|
|
14
15
|
staking: StakingApi;
|
|
16
|
+
farm: LiquidityMiningApi;
|
|
15
17
|
};
|
|
16
18
|
client: {
|
|
17
19
|
asset: AssetClient;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { BalanceClient } from '../client/BalanceClient';
|
|
2
|
+
import { LiquidityMiningClient } from './LiquidityMiningClient';
|
|
3
|
+
export declare class LiquidityMiningApi {
|
|
4
|
+
private readonly client;
|
|
5
|
+
private readonly balanceClient;
|
|
6
|
+
protected omnipoolAssetIds: string[];
|
|
7
|
+
constructor(client: LiquidityMiningClient, balanceClient: BalanceClient);
|
|
8
|
+
getOraclePrice(rewardCurrency: number, incentivizedAsset: number): Promise<bigint | undefined>;
|
|
9
|
+
private getFarmAddress;
|
|
10
|
+
private getGlobalRewardPerPeriod;
|
|
11
|
+
private getPoolYieldPerPeriod;
|
|
12
|
+
private farmData;
|
|
13
|
+
getAllOmnipoolFarms(): Promise<({
|
|
14
|
+
apr: string;
|
|
15
|
+
minApr: string | undefined;
|
|
16
|
+
isDistributed: boolean;
|
|
17
|
+
estimatedEndPeriod: string;
|
|
18
|
+
maxRewards: bigint;
|
|
19
|
+
incentivizedAsset: number;
|
|
20
|
+
rewardCurrency: number;
|
|
21
|
+
loyaltyCurve: {
|
|
22
|
+
initial_reward_percentage: bigint;
|
|
23
|
+
scale_coef: number;
|
|
24
|
+
} | undefined;
|
|
25
|
+
currentPeriod: string;
|
|
26
|
+
potMaxRewards: bigint;
|
|
27
|
+
fullness: string;
|
|
28
|
+
yieldFarmId: number;
|
|
29
|
+
globalFarmId: number;
|
|
30
|
+
poolId: string;
|
|
31
|
+
} | undefined)[][]>;
|
|
32
|
+
getOmnipoolFarms(id: string): Promise<({
|
|
33
|
+
apr: string;
|
|
34
|
+
minApr: string | undefined;
|
|
35
|
+
isDistributed: boolean;
|
|
36
|
+
estimatedEndPeriod: string;
|
|
37
|
+
maxRewards: bigint;
|
|
38
|
+
incentivizedAsset: number;
|
|
39
|
+
rewardCurrency: number;
|
|
40
|
+
loyaltyCurve: {
|
|
41
|
+
initial_reward_percentage: bigint;
|
|
42
|
+
scale_coef: number;
|
|
43
|
+
} | undefined;
|
|
44
|
+
currentPeriod: string;
|
|
45
|
+
potMaxRewards: bigint;
|
|
46
|
+
fullness: string;
|
|
47
|
+
yieldFarmId: number;
|
|
48
|
+
globalFarmId: number;
|
|
49
|
+
poolId: string;
|
|
50
|
+
} | undefined)[]>;
|
|
51
|
+
getAllIsolatedFarms(): Promise<({
|
|
52
|
+
apr: string;
|
|
53
|
+
minApr: string | undefined;
|
|
54
|
+
isDistributed: boolean;
|
|
55
|
+
estimatedEndPeriod: string;
|
|
56
|
+
maxRewards: bigint;
|
|
57
|
+
incentivizedAsset: number;
|
|
58
|
+
rewardCurrency: number;
|
|
59
|
+
loyaltyCurve: {
|
|
60
|
+
initial_reward_percentage: bigint;
|
|
61
|
+
scale_coef: number;
|
|
62
|
+
} | undefined;
|
|
63
|
+
currentPeriod: string;
|
|
64
|
+
potMaxRewards: bigint;
|
|
65
|
+
fullness: string;
|
|
66
|
+
yieldFarmId: number;
|
|
67
|
+
globalFarmId: number;
|
|
68
|
+
poolId: string;
|
|
69
|
+
} | undefined)[][]>;
|
|
70
|
+
getIsolatedFarms(id: string): Promise<({
|
|
71
|
+
apr: string;
|
|
72
|
+
minApr: string | undefined;
|
|
73
|
+
isDistributed: boolean;
|
|
74
|
+
estimatedEndPeriod: string;
|
|
75
|
+
maxRewards: bigint;
|
|
76
|
+
incentivizedAsset: number;
|
|
77
|
+
rewardCurrency: number;
|
|
78
|
+
loyaltyCurve: {
|
|
79
|
+
initial_reward_percentage: bigint;
|
|
80
|
+
scale_coef: number;
|
|
81
|
+
} | undefined;
|
|
82
|
+
currentPeriod: string;
|
|
83
|
+
potMaxRewards: bigint;
|
|
84
|
+
fullness: string;
|
|
85
|
+
yieldFarmId: number;
|
|
86
|
+
globalFarmId: number;
|
|
87
|
+
poolId: string;
|
|
88
|
+
} | undefined)[]>;
|
|
89
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { Papi } from '../api';
|
|
2
|
+
import { Enum } from 'polkadot-api';
|
|
3
|
+
export declare class LiquidityMiningClient extends Papi {
|
|
4
|
+
protected omnipoolAssetIds: string[];
|
|
5
|
+
getOraclePrice(orderedAssets: [number, number]): Promise<[{
|
|
6
|
+
price: {
|
|
7
|
+
n: bigint;
|
|
8
|
+
d: bigint;
|
|
9
|
+
};
|
|
10
|
+
volume: {
|
|
11
|
+
a_in: bigint;
|
|
12
|
+
b_out: bigint;
|
|
13
|
+
a_out: bigint;
|
|
14
|
+
b_in: bigint;
|
|
15
|
+
};
|
|
16
|
+
liquidity: {
|
|
17
|
+
a: bigint;
|
|
18
|
+
b: bigint;
|
|
19
|
+
};
|
|
20
|
+
shares_issuance: bigint | undefined;
|
|
21
|
+
updated_at: number;
|
|
22
|
+
}, number] | undefined>;
|
|
23
|
+
getRelayBlockNumber(): Promise<number | undefined>;
|
|
24
|
+
getAllOmnipooFarms(): Promise<{
|
|
25
|
+
keyArgs: [number, number];
|
|
26
|
+
value: number;
|
|
27
|
+
}[]>;
|
|
28
|
+
getOmnipooFarms(id: number): Promise<{
|
|
29
|
+
keyArgs: [number, number];
|
|
30
|
+
value: number;
|
|
31
|
+
}[]>;
|
|
32
|
+
getOmnipoolGlobalFarm(id: number): Promise<{
|
|
33
|
+
id: number;
|
|
34
|
+
owner: import("polkadot-api").SS58String;
|
|
35
|
+
updated_at: number;
|
|
36
|
+
total_shares_z: bigint;
|
|
37
|
+
accumulated_rpz: bigint;
|
|
38
|
+
reward_currency: number;
|
|
39
|
+
pending_rewards: bigint;
|
|
40
|
+
accumulated_paid_rewards: bigint;
|
|
41
|
+
yield_per_period: bigint;
|
|
42
|
+
planned_yielding_periods: number;
|
|
43
|
+
blocks_per_period: number;
|
|
44
|
+
incentivized_asset: number;
|
|
45
|
+
max_reward_per_period: bigint;
|
|
46
|
+
min_deposit: bigint;
|
|
47
|
+
live_yield_farms_count: number;
|
|
48
|
+
total_yield_farms_count: number;
|
|
49
|
+
price_adjustment: bigint;
|
|
50
|
+
state: Enum<{
|
|
51
|
+
Active: undefined;
|
|
52
|
+
Stopped: undefined;
|
|
53
|
+
Terminated: undefined;
|
|
54
|
+
}>;
|
|
55
|
+
} | undefined>;
|
|
56
|
+
getOmnipoolYieldFarm(id: number, globalFarmId: number, yieldFarmId: number): Promise<{
|
|
57
|
+
id: number;
|
|
58
|
+
updated_at: number;
|
|
59
|
+
accumulated_rpz: bigint;
|
|
60
|
+
state: Enum<{
|
|
61
|
+
Active: undefined;
|
|
62
|
+
Stopped: undefined;
|
|
63
|
+
Terminated: undefined;
|
|
64
|
+
}>;
|
|
65
|
+
total_shares: bigint;
|
|
66
|
+
total_valued_shares: bigint;
|
|
67
|
+
accumulated_rpvs: bigint;
|
|
68
|
+
loyalty_curve: {
|
|
69
|
+
initial_reward_percentage: bigint;
|
|
70
|
+
scale_coef: number;
|
|
71
|
+
} | undefined;
|
|
72
|
+
multiplier: bigint;
|
|
73
|
+
entries_count: bigint;
|
|
74
|
+
left_to_distribute: bigint;
|
|
75
|
+
total_stopped: number;
|
|
76
|
+
} | undefined>;
|
|
77
|
+
getAllIsolatedFarms(): Promise<{
|
|
78
|
+
keyArgs: [import("polkadot-api").SS58String, number];
|
|
79
|
+
value: number;
|
|
80
|
+
}[]>;
|
|
81
|
+
getIsolatedFarms(id: string): Promise<{
|
|
82
|
+
keyArgs: [import("polkadot-api").SS58String, number];
|
|
83
|
+
value: number;
|
|
84
|
+
}[]>;
|
|
85
|
+
getIsolatedGlobalFarm(id: number): Promise<{
|
|
86
|
+
id: number;
|
|
87
|
+
owner: import("polkadot-api").SS58String;
|
|
88
|
+
updated_at: number;
|
|
89
|
+
total_shares_z: bigint;
|
|
90
|
+
accumulated_rpz: bigint;
|
|
91
|
+
reward_currency: number;
|
|
92
|
+
pending_rewards: bigint;
|
|
93
|
+
accumulated_paid_rewards: bigint;
|
|
94
|
+
yield_per_period: bigint;
|
|
95
|
+
planned_yielding_periods: number;
|
|
96
|
+
blocks_per_period: number;
|
|
97
|
+
incentivized_asset: number;
|
|
98
|
+
max_reward_per_period: bigint;
|
|
99
|
+
min_deposit: bigint;
|
|
100
|
+
live_yield_farms_count: number;
|
|
101
|
+
total_yield_farms_count: number;
|
|
102
|
+
price_adjustment: bigint;
|
|
103
|
+
state: Enum<{
|
|
104
|
+
Active: undefined;
|
|
105
|
+
Stopped: undefined;
|
|
106
|
+
Terminated: undefined;
|
|
107
|
+
}>;
|
|
108
|
+
} | undefined>;
|
|
109
|
+
getIsolatedYieldFarm(id: string, globalFarmId: number, yieldFarmId: number): Promise<{
|
|
110
|
+
id: number;
|
|
111
|
+
updated_at: number;
|
|
112
|
+
accumulated_rpz: bigint;
|
|
113
|
+
state: Enum<{
|
|
114
|
+
Active: undefined;
|
|
115
|
+
Stopped: undefined;
|
|
116
|
+
Terminated: undefined;
|
|
117
|
+
}>;
|
|
118
|
+
total_shares: bigint;
|
|
119
|
+
total_valued_shares: bigint;
|
|
120
|
+
accumulated_rpvs: bigint;
|
|
121
|
+
loyalty_curve: {
|
|
122
|
+
initial_reward_percentage: bigint;
|
|
123
|
+
scale_coef: number;
|
|
124
|
+
} | undefined;
|
|
125
|
+
multiplier: bigint;
|
|
126
|
+
entries_count: bigint;
|
|
127
|
+
left_to_distribute: bigint;
|
|
128
|
+
total_stopped: number;
|
|
129
|
+
} | undefined>;
|
|
130
|
+
}
|