@galacticcouncil/sdk-next 0.7.0-pr169-91a593c → 0.7.0-pr169-1b93133
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var Qn=Object.create;var ie=Object.defineProperty;var Jn=Object.getOwnPropertyDescriptor;var Zn=Object.getOwnPropertyNames;var ta=Object.getPrototypeOf,ea=Object.prototype.hasOwnProperty;var cn=(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})},re=(u,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of Zn(t))!ea.call(u,a)&&a!==e&&ie(u,a,{get:()=>t[a],enumerable:!(n=Jn(t,a))||n.enumerable});return u},dt=(u,t,e)=>(re(u,t,"default"),e&&re(e,t,"default")),gt=(u,t,e)=>(e=u!=null?Qn(ta(u)):{},re(t||!u||!u.__esModule?ie(e,"default",{value:u,enumerable:!0}):e,u)),na=u=>re(ie({},"__esModule",{value:!0}),u);var Ft={};var pn=cn(()=>{dt(Ft,require("@polkadot-api/ws-provider/node"))});var Et={};var dn=cn(()=>{dt(Et,require("@polkadot-api/ws-provider/web"))});var Ea={};x(Ea,{aave:()=>Me,api:()=>Te,big:()=>h,client:()=>Le,const:()=>_e,createSdkContext:()=>Fa,erc20:()=>it,error:()=>Ne,evm:()=>He,fmt:()=>k,h160:()=>Mt,json:()=>et,math:()=>O,pool:()=>je,sor:()=>en,staking:()=>nn,tx:()=>rn,xc:()=>Ce});module.exports=na(Ea);var Te={};x(Te,{Papi:()=>L,getWs:()=>aa});var mn=require("@galacticcouncil/descriptors");function un(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var L=class{client;api;constructor(t){this.client=t,this.api=this.client.getTypedApi(mn.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");un(n)&&console.log(t,...e)}};var gn=require("polkadot-api"),bn=require("polkadot-api/polkadot-sdk-compat"),aa=async u=>{let t=typeof u=="string"?u.split(","):u,a=(typeof window>"u"?(await Promise.resolve().then(()=>(pn(),Ft))).getWsProvider:(await Promise.resolve().then(()=>(dn(),Et))).getWsProvider)(t);return(0,gn.createClient)((0,bn.withPolkadotSdkCompat)(a))};var Me={};x(Me,{AAVE_GAS_LIMIT:()=>Ie,AAVE_LENDING_POOL_ADDRESS:()=>le,AAVE_POOL_ABI:()=>we,AAVE_POOL_DATA_PROVIDER:()=>oe,AAVE_POOL_DATA_PROVIDER_ABI:()=>se,AAVE_POOL_PROXY:()=>xe,AAVE_ROUNDING_THRESHOLD:()=>ja,AAVE_UINT_256_MAX:()=>ra,AaveClient:()=>kt,AaveUtils:()=>st});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 se=[{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",oe="0x112b087b60C1a166130d59266363C45F8aa99db0",le="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Ie=1000000n,ja=5,ra=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var kt=class{client;constructor(t){this.client=t.getWsProvider()}async getReservesData(){return await this.client.readContract({abi:se,address:oe,args:[le],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:se,address:oe,args:[le,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:we,address:xe,args:[t],functionName:"getUserAccountData"})}};var h={};x(h,{asBigInt:()=>oa,toBigInt:()=>sa,toDecimal:()=>ia});var tt=gt(require("big.js"));tt.default.NE=-18;function ia(u,t,e=6,n){let a=(0,tt.default)(u.toString()),r=(0,tt.default)(10).pow(t);return a.div(r).round(e,n).toString()}function sa(u,t){let e=(0,tt.default)(10).pow(t),a=(0,tt.default)(u).mul(e).toFixed(0,tt.default.roundDown);return BigInt(a)}function oa(u){return BigInt(u.round(0,tt.default.roundDown).toFixed(0))}var it={};x(it,{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 k={};x(k,{FeeUtils:()=>Re,shiftNeg:()=>Dt});var yn=gt(require("big.js"));var _e={};x(_e,{HUB_ASSET_ID:()=>Be,HYDRATION_OMNIPOOL_ADDRESS:()=>ca,HYDRATION_PARACHAIN_ID:()=>la,HYDRATION_SS58_PREFIX:()=>q,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,la=2034,q=63,ca="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 a=10**n;return Math.round(t*a/e)/a}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Dt(u,t){let e=(0,yn.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:()=>hn,isEvmAddress:()=>Pn,isSs58Address:()=>fn});var yt=require("polkadot-api"),Fe=require("@polkadot-api/utils"),Q=require("buffer");var Ee="ETH\0";function hn(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 Pn(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function fn(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),a=Uint8Array.from(Q.Buffer.concat([n,e,Q.Buffer.alloc(8)])),r=(0,Fe.toHex)(a);return(0,yt.AccountId)(63).dec(r)};static fromAccount=t=>{let e=(0,yt.AccountId)().enc(t),n=Q.Buffer.from(Ee),a=e.slice(n.length,-8);return"0x"+Q.Buffer.from(a).toString("hex")};static fromSS58=t=>{let n=(0,yt.AccountId)().enc(t).slice(0,20);return(0,Fe.toHex)(n)};static fromAny=t=>{if(Pn(t))return t;if(hn(t))return u.fromAccount(t);if(fn(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var et={};x(et,{findNestedKey:()=>ua,findNestedObj:()=>ma,jsonFormatter:()=>pa});var ua=(u,t)=>{let e=[];return JSON.stringify(u,(n,a)=>(a&&a[t]&&e.push(a),a)),e[0]},ma=(u,t,e)=>{let n;return JSON.stringify(u,(a,r)=>(r&&r[t]===e&&(n=r),r)),n},pa=(u,t)=>typeof t=="bigint"?t.toString():t;var O={};x(O,{calculateBuyFee:()=>ya,calculateDiffToAvg:()=>da,calculateDiffToRef:()=>ga,calculateSellFee:()=>ba,getFraction:()=>ha});var X=gt(require("big.js"));function da(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 ga(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 ba(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 ya(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 ha(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 Ce={};x(Ce,{convertToId:()=>Pa});var Sn=require("buffer");function Pa(u){let e=Sn.Buffer.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:ce}=it,{H160:De}=Mt,fa=1.01,Sa=99999,Ta=10n**27n,wa=10n**18n,st=class{client;constructor(t){this.client=new kt(t)}async getSummary(t){let e=De.fromAny(t),[n,a,r]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(e),this.client.getUserAccountData(e)]),[s]=n,[i,o]=a,[l,c,m,d,p,g]=r,y=h.toDecimal(g,18),b=[];for(let P of i){let f=P.underlyingAsset.toLowerCase(),S=s.find(({underlyingAsset:rt})=>rt.toLowerCase()===f);if(!S)throw new Error("Missing pool reserve for "+f);let v=P.scaledATokenBalance,M=S.liquidityIndex,N=S.priceInMarketReferenceCurrency,C=v*M/Ta,V=Number(o===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,Z=S.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,_t=ce.toAssetId(f);b.push({aTokenBalance:C,decimals:Number(S.decimals),isCollateral:Z,priceInRef:N,reserveId:_t,reserveAsset:f,reserveLiquidationThreshold:V})}return{healthFactor:Number(y),totalCollateral:l,totalDebt:c,reserves:b}}async hasBorrowPositions(t){let e=De.fromAny(t),n=await this.client.getUserAccountData(e),[a,r]=n;return r>0n}async getHealthFactor(t){let e=De.fromAny(t),n=await this.client.getUserAccountData(e),[a,r,s,i,o,l]=n,c=h.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:a,totalDebt:r,reserves:s}=await this.getSummary(t),i=ce.fromAssetId(e),o=s.find(b=>b.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,isCollateral:c,priceInRef:m,reserveLiquidationThreshold:d}=o,p=h.toBigInt(n,l),g=c?p*m/10n**BigInt(l):0n,y=a-g;return y<=0n?0:this.calculateHealthFactor(y,d,r)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:a,totalDebt:r,reserves:s}=await this.getSummary(t),i=ce.fromAssetId(e),o=s.find(y=>y.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:m}=o,p=h.toBigInt(n,l)*c/10n**BigInt(l),g=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),s=ce.fromAssetId(e),i=r.find(o=>o.reserveAsset===s);if(!i)throw new Error("Missing reserve ctx for "+s);return this.calculateWithdrawMax(i,n,a)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:a}=await this.getSummary(t),r={};for(let s of a){let i=this.calculateWithdrawMax(s,e,n);s.reserveId&&(r[s.reserveId]=i)}return r}calculateHealthFactor(t,e,n){if(n===0n)return Sa;let a=10n**6n,r=h.toBigInt(e,18),s=t*r*a,i=n*wa,o=s/i;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:s,reserveLiquidationThreshold:i}=t,o=this.calculateRequiredCollateral(fa,i,n),l=e-o;if(l<=0n)return{amount:0n,decimals:r};let c=l*10n**BigInt(r)/s;return{amount:a<c?a:c,decimals:r}}};var Le={};x(Le,{AssetClient:()=>ht,BalanceClient:()=>K,ChainParams:()=>Pt});var ht=class extends L{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:s,is_sufficient:i,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:r?.asText(),symbol:l,decimals:c,icon:l,type:s.type,isSufficient:i,location:a,existentialDeposit:o}}async mapBond(t,e,n,a){let[r,s]=a,{asset_type:i,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:m}=await this.mapToken(r,e,n),d=Number(s),p=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",p.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:m,icon:c,type:i.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:r,maturity:d}}async mapShares(t,e,n,a){let{assets:r}=a,{name:s,symbol:i,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:i?.asText()||s?.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),s=n?.find(i=>i.internalId===r.id);return s?{...r,decimals:s.decimals,name:s.name,symbol:s.symbol,icon:s.symbol,isWhiteListed:s.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,s]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),i=this.parseMetadata(n),o=[];for(let[l,c]of Array.from(n)){let m=a.get(l),{asset_type:d}=c,p;switch(d.type){case"Bond":let g=s.get(l);p=await this.mapBond(l,c,i,g);break;case"StableSwap":let y=r.get(l);p=await this.mapShares(l,c,i,y);break;case"External":p=await this.mapExternal(l,c,e,m);break;default:p=await this.mapToken(l,c,i,m)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};var w=require("rxjs");var K=class extends L{constructor(t){super(t)}async getBalance(t,e){return e===0?this.getSystemBalance(t):this.getTokenBalanceData(t,e)}async getSystemBalance(t){let e=this.api.query.System.Account,{data:n}=await e.getValue(t);return this.calculateBalance(n)}async getTokenBalance(t,e){let a=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(a)}calculateBalance(t){let e=t.free>=t.frozen?t.free-t.frozen:0n,n=t.free+t.reserved;return{free:t.free,reserved:t.reserved,frozen:t.frozen,total:n,transferable:e}}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),a=this.subscribeErc20Balance(t);return(0,w.combineLatest)([e,n,a]).pipe((0,w.debounceTime)(250),(0,w.map)(r=>r.flat()),(0,w.startWith)([]),(0,w.bufferCount)(2,1),(0,w.map)(([r,s],i)=>{if(i===0)return s;let o=r.reduce((c,m)=>(c.set(m.id,m.balance),c),new Map);return s.filter(c=>!Tn(c.balance,o.get(c.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,w.map)(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,w.map)(a=>({id:e,balance:a})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,w.distinctUntilChanged)((n,a)=>!a.deltas),(0,w.map)(({deltas:n})=>{let a=[];return n?.deleted.forEach(r=>{let[s,i]=r.args;a.push({id:i,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(r=>{let[s,i]=r.args;a.push({id:i,balance:this.calculateBalance(r.value)})}),a}))}subscribeErc20Balance(t,e){let n=new w.Subject,a=n.pipe((0,w.shareReplay)(1)),r=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:c}=l;return c.type==="Erc20"}).map(({keyArgs:l})=>{let[c]=l;return c}),s=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()},i;return s().then(o=>i=o),a.pipe((0,w.finalize)(()=>i?.()),(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=>!Tn(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)}},Tn=(u,t)=>u!==void 0&&t!==void 0&&u.transferable===t.transferable&&u.total===t.total;var Pt=class extends L{_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 wn=require("viem"),xa=["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,wn.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:xa}},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,a,r){return(0,z.get_spot_price)(t,e,n,a,r)}static calculateInGivenOut(t,e,n,a,r){return(0,z.calculate_in_given_out)(t,e,n,a,r)}static calculateOutGivenIn(t,e,n,a,r){return(0,z.calculate_out_given_in)(t,e,n,a,r)}static calculateLinearWeights(t,e,n,a,r){return(0,z.calculate_linear_weights)(t,e,n,a,r)}static calculatePoolTradeFee(t,e,n){return(0,z.calculate_pool_trade_fee)(t,e,n)}};var F=(r=>(r.Aave="Aave",r.LBP="LBP",r.Omni="Omnipool",r.Stable="Stableswap",r.XYK="XYK",r))(F||{}),ot=(r=>(r.InsufficientTradingAmount="InsufficientTradingAmount",r.MaxInRatioExceeded="MaxInRatioExceeded",r.MaxOutRatioExceeded="MaxOutRatioExceeded",r.TradeNotAllowed="TradeNotAllowed",r.UnknownError="UnknownError",r))(ot||{});var{FeeUtils:xn}=k,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,a,r,s,i){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r,this.fee=s,this.repayFeeApply=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),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 s=t.balanceOut/this.maxOutRatio;if(e>s&&r.push("MaxOutRatioExceeded"),a===t.assetOut){let i=this.calculateTradeFee(e,n),o=xn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+i,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 i=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return i>o&&r.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:i,amountOut:e,feePct:0,errors:r}}}validateAndSell(t,e,n){let a=this.tokens[0].id,r=[];e<this.minTradingLimit&&r.push("InsufficientTradingAmount");let s=t.balanceIn/this.maxInRatio;if(e>s&&r.push("MaxInRatioExceeded"),a===t.assetIn){let i=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return i>o&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:i,feePct:0,errors:r}}else{let i=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(i,n),l=xn.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=i-o,m=t.balanceOut/this.maxOutRatio;return c>m&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:c,feePct:l,errors:r}}}calculateInGivenOut(t,e){let n=Y.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=Y.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=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 vn=require("polkadot-api"),lt=require("rxjs");var In=(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,a,r]=await Promise.all([this.client.readContract({abi:Ue,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:Ue,address:t,functionName:"decimals"}),this.client.getBlock()]),[s,i,o,l]=n,c=r.number-(r.timestamp-l)/BigInt(e),m=Number(c);return{price:i,decimals:a,updatedAt:m<0?0:m}}};var G=class extends K{evm;mmOracle;override=[];mem=0;memPools=In(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,a])=>this.updatePool(n,a))))}subscribePoolBalance(t){if(t.type==="Aave")return(0,I.of)([]);let e=[this.subscribeTokensBalance(t.address)];if(this.hasSystemAsset(t)){let n=this.subscribeSystemBalance(t.address);e.push(n)}if(this.hasErc20Asset(t)){let n=t.tokens.filter(r=>r.type==="Erc20").map(r=>r.id),a=this.subscribeErc20Balance(t.address,n);e.push(a)}return(0,I.combineLatest)(e).pipe((0,I.map)(n=>n.map(a=>Array.isArray(a)?a:[a]).flat()))}hasSystemAsset(t){return t.tokens.some(e=>e.id===0)}hasErc20Asset(t){return t.tokens.some(e=>e.type==="Erc20")}hasValidAssets(t){return t.tokens.every(({id:e,decimals:n,balance:a})=>{let r=this.override.find(i=>i.id===e),s=!!n||!!r?.decimals;return a>0n&&s})}updatePool=(t,e)=>{let n=t.tokens.map(a=>{let r=e.find(i=>i.id===a.id),s=this.override.find(i=>i.id===a.id);return r?{...a,balance:r.balance.transferable,decimals:a.decimals||s?.decimals}:{...a,decimals:a.decimals||s?.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()]),a=e?.relay_parent_number||0,r=t.filter(({value:s})=>e&&this.isActivePool(s,a)).map(async({keyArgs:s,value:i})=>{let[o]=s,l=o.toString(),c=await this.getPoolDelta(l,i,a);return{address:l,type:"LBP",fee:i.fee,...c,...n}});return Promise.all(r)}async getPoolDelta(t,e,n){let{start:a,end:r,assets:s,initial_weight:i,final_weight:o,repay_target:l,fee_collector:c}=e,m=Y.calculateLinearWeights(a?a.toString():"0",r?r.toString():"0",i.toString(),o.toString(),n.toString()),[d,p]=s,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: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(vn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe((0,lt.switchMap)(a=>a?this.getPoolDelta(t.address,n,a.relay_parent_number):(0,lt.of)(t)),(0,lt.map)(a=>Object.assign({},t,a))):(0,lt.of)(t)}};var We={};x(We,{OmniMath:()=>A,OmniPool:()=>Vt,OmniPoolClient:()=>Yt});var T=require("@galacticcouncil/math-omnipool"),ct=gt(require("big.js")),A=class{static calculateSpotPrice(t,e,n,a){return(0,T.calculate_spot_price)(t,e,n,a)}static calculateLrnaSpotPrice(t,e){return(0,T.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,a,r,s,i,o,l){return(0,T.calculate_in_given_out)(t,e,n,a,r,s,i,o,l)}static calculateLrnaInGivenOut(t,e,n,a,r){return(0,T.calculate_lrna_in_given_out)(t,e,n,a,r)}static calculateOutGivenIn(t,e,n,a,r,s,i,o,l){return(0,T.calculate_out_given_in)(t,e,n,a,r,s,i,o,l)}static calculateOutGivenLrnaIn(t,e,n,a,r){return(0,T.calculate_out_given_lrna_in)(t,e,n,a,r)}static calculateShares(t,e,n,a){return(0,T.calculate_shares)(t,e,n,a)}static calculateLiquidityOut(t,e,n,a,r,s,i,o){return(0,T.calculate_liquidity_out)(t,e,n,a,r,s,i,o)}static calculateLiquidityLRNAOut(t,e,n,a,r,s,i,o){return(0,T.calculate_liquidity_lrna_out)(t,e,n,a,r,s,i,o)}static calculateCapDifference(t,e,n,a){let r=(0,ct.default)(e),s=(0,ct.default)(t),i=(0,ct.default)(a),o=(0,ct.default)(n),l=(0,ct.default)(10).pow(18),c=o.div(l);if(r.div(i).lt(c)){let d=c.times(i).minus(r).times(s),p=r.times((0,ct.default)(1).minus(c));return d.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,a){return(0,T.verify_asset_cap)(t,e,n,a)}static calculateLimitHubIn(t,e,n,a){return(0,T.calculate_liquidity_hub_in)(t,e,n,a)}static isSellAllowed(t){return(0,T.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,T.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,T.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,T.is_remove_liquidity_allowed)(t)}};var{FeeUtils:ft}=k,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,a,r,s){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r,this.hubAssetId=s}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),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),s=a===0n?0:O.calculateDiffToRef(r,a),i=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&i.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&i.push("MaxOutRatioExceeded");let m=t.balanceIn/this.maxInRatio;return r>m&&i.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:a,amountOut:e,feePct:s,errors:i}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,n),s=O.calculateDiffToRef(a,r),i=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&i.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&i.push("MaxInRatioExceeded");let m=t.balanceOut/this.maxOutRatio;return r>m&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:r,feePct:s,errors:i}}calculateInGivenOut(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(t,e,n);let a=A.calculateInGivenOut(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ft.toRaw(n.assetFee).toString():"0",n?ft.toRaw(n.protocolFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}calculateLrnaInGivenOut(t,e,n){let a=A.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ft.toRaw(n.assetFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let a=A.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ft.toRaw(n.assetFee).toString():"0",n?ft.toRaw(n.protocolFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}calculateOutGivenLrnaIn(t,e,n){let a=A.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ft.toRaw(n.assetFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=A.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=A.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=A.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=A.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var ue=require("polkadot-api"),On=require("@polkadot-api/utils"),Wt=require("rxjs");var{FeeUtils:nt}=k,Yt=class extends G{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,a,r,s,i]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:c,value:m})=>{let[d]=c,{hub_reserve:p,shares:g,tradable: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:s.transferable,tradeable:a,type:r?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...i}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=(0,On.toHex)(e);return(0,ue.AccountId)(63).dec(n)}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t,e){let[n,a,r]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),s=n.min_fee+a.min_fee,i=n.max_fee+a.max_fee;if(r){let{asset_fee:o,protocol_fee:l}=r;return{assetFee:nt.fromPermill(o),protocolFee:nt.fromPermill(l),min:nt.fromPermill(s),max:nt.fromPermill(i)}}else return{assetFee:nt.fromPermill(n.min_fee),protocolFee:nt.fromPermill(a.min_fee),min:nt.fromPermill(s),max:nt.fromPermill(i)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(ue.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,Wt.distinctUntilChanged)((n,a)=>!a.deltas),(0,Wt.map)(({entries:n})=>n.map(a=>{let[r]=a.args,{hub_reserve:s,shares:i,tradable:o,cap:l,protocol_shares:c}=a.value,m=t.tokens.findIndex(p=>p.id===r);return{...t.tokens[m],cap:l,hubReserves:s,protocolShares:c,shares:i,tradeable:o}})),(0,Wt.map)(n=>{let a=t.tokens.find(r=>r.id===1);return{...t,tokens:[...n,a]}}))}};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,a,r){return(0,_.calculate_amplification)(t,e,n,a,r)}static calculateInGivenOut(t,e,n,a,r,s,i){return(0,_.calculate_in_given_out)(t,e,n,a,r,s,i)}static calculateAddOneAsset(t,e,n,a,r,s,i){return(0,_.calculate_add_one_asset)(t,e,n,a,r,s,i)}static calculateSharesForAmount(t,e,n,a,r,s,i){return(0,_.calculate_shares_for_amount)(t,e,n,a,r,s,i)}static calculateOutGivenIn(t,e,n,a,r,s,i){return(0,_.calculate_out_given_in)(t,e,n,a,r,s,i)}static calculateLiquidityOutOneAsset(t,e,n,a,r,s,i){return(0,_.calculate_liquidity_out_one_asset)(t,e,n,a,r,s,i)}static calculateShares(t,e,n,a,r,s){return(0,_.calculate_shares)(t,e,n,a,r,s)}static calculateSpotPriceWithFee(t,e,n,a,r,s,i,o){return(0,_.calculate_spot_price_with_fee)(t,e,n,a,r,s,i,o)}static recalculatePegs(t,e,n,a,r){let s=(0,_.recalculate_peg)(t,e,n,a,r);return JSON.parse(s)}};var{FeeUtils:at}=k,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,r,s,i,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r,this.amplification=s,this.id=i,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),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),s=at.toPct(n.fee),i=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&i.push("InsufficientTradingAmount"),{amountIn:r,calculatedIn:a,amountOut:e,feePct:s,errors:i}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,n),s=at.toPct(n.fee),i=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&i.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:a,amountOut:r,feePct:s,errors:i}}calculateIn(t,e,n){let a=E.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateAddOneAsset(t,e,n){let a=E.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateSharesForAmount(t,e,n){let a=E.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=E.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let a=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(a)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let a=E.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateWithdrawOneAsset(t,e,n){let a=E.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateShares(t,e,n){let a=E.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=E.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let a=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(a)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=E.defaultPegs(this.tokens.length-1);return JSON.stringify(t)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:a})=>({asset_id:e,amount:n,decimals:a}));return JSON.stringify(t,et.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],et.jsonFormatter)}};var me=require("polkadot-api"),An=require("@polkadot-api/utils"),Bn=require("@noble/hashes/blake2b"),St=require("rxjs");var{FeeUtils:ut}=k,Kt=class extends G{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=E.getPoolAddress(t),n=(0,Bn.blake2b)(e,{dkLen:32}),a=(0,An.toHex)(n);return(0,me.AccountId)(63).dec(a)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolDelta(t,e,n){let{initial_amplification:a,final_amplification:r,initial_block:s,final_block:i}=e,o=E.calculateAmplification(a.toString(),r.toString(),s.toString(),i.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),a=e.assets.map(async r=>{let[s,i,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:i?.decimals,existentialDeposit:i?.existential_deposit,balance:o.transferable,tradeable:s,type:i?.asset_type.type}});return Promise.all(a)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(me.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),a=t.map(async({keyArgs:r,value:s})=>{let[i]=r,o=this.getPoolAddress(i),[l,c,m]=await Promise.all([this.getPoolDelta(i,s,e),this.getPoolTokens(i,s),this.getPoolPegs(i,s,e)]);return c.push({id:i,tradeable:15,balance:l.totalIssuance,decimals:18}),this.poolsData.set(o,s),{address:o,id:i,type:"Stableswap",fee:ut.fromPermill(s.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),s=this.getRecentPegs(a),i=ut.fromPermill(a.max_peg_update),o=ut.fromPermill(e.fee),[l,c]=E.recalculatePegs(JSON.stringify(s),JSON.stringify(r),n.toString(),ut.toRaw(i).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,a])=>a.map(r=>r.toString()))}async getLatestPegs(t,e,n){let{source:a}=e,r=Array.from(t.assets.entries()).map(([i,o])=>o),s=a.map(async(i,o)=>{if(i.type==="Oracle"){let[l,c,m]=i.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(i.type==="MMOracle"){let l=i.value.asHex(),{price:c,decimals:m,updatedAt:d}=await this.mmOracle.getData(l),p=10**m;return[[c.toString(),p.toString()],d.toString()]}else return[i.value.map(l=>l.toString()),n.toString()]});return Promise.all(s)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?(0,St.of)(t):e.watchValue("best").pipe((0,St.switchMap)(a=>Promise.all([this.getPoolDelta(t.id,n,a),this.getPoolPegs(t.id,n,a)])),(0,St.map)(([a,r])=>{let s=t.tokens.map(i=>i.id===t.id?{...i,balance:a.totalIssuance}:i);return Object.assign(t,{tokens:s},a,r)}))}};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,a){return(0,R.calculate_spot_price_with_fee)(t,e,n,a)}static calculateShares(t,e,n){return(0,R.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,a){return(0,R.calculate_liquidity_out_asset_a)(t,e,n,a)}static calculateLiquidityOutAssetB(t,e,n,a){return(0,R.calculate_liquidity_out_asset_b)(t,e,n,a)}};var{FeeUtils:_n}=k,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,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(s=>[s.id,s])),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),s=_n.toPct(n.exchangeFee),i=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 i>c&&o.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:a,amountOut:e,feePct:s,errors:o}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=this.calculateTradeFee(a,n),s=_n.toPct(n.exchangeFee),i=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 i>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:i,feePct:s,errors:o}}calculateInGivenOut(t,e){let n=J.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}calculateOutGivenIn(t,e){let n=J.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}spotPriceInGivenOut(t){let e=J.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=J.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=J.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};var Rn=require("polkadot-api"),Fn=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()]),a=e.map(async({keyArgs:r,value:s})=>{let[i]=r,[o,l]=s,[c,m,d,p]=await Promise.all([this.getBalance(i,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(i,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:i,type:"XYK",tokens:[{id:o,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:c.transferable,type:m?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:d.transferable,type:p?.asset_type.type}],...n}});return Promise.all(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(Rn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,Fn.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,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(s=>[s.id,s])),a=n.get(t),r=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:r.balance,decimalsIn:a.decimals,decimalsOut:r.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),r=[];return e>t.balanceOut&&r.push("TradeNotAllowed"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:r}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=[];return a>t.balanceOut&&r.push("TradeNotAllowed"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:r}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};var kn=require("polkadot-api"),Cn=require("@polkadot-api/utils"),Tt=require("rxjs"),Dn=require("viem");var En=[{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:Ia}=it,va=["Supply","Withdraw","Repay","Borrow"],Qt=class extends G{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:a,liqudity_in:r,liqudity_out:s})=>{let[i,o,l,c]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(a),this.api.query.AssetRegistry.AssetLocations.getValue(a)]);return{address:this.getPoolId(n,a),type:"Aave",tokens:[{id:n,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:r,location:o,type:i?.asset_type.type},{id:a,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:s,location:c,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:a,liqudity_out:r}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(s=>{let i=s.id===e.id?a:r;return{...s,balance:i}})}getPoolId(t,e){let n=t+"/"+e,a=new TextEncoder().encode(n.padEnd(32,"\0")),r=(0,Cn.toHex)(a);return(0,kn.AccountId)(63).dec(r)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(t,e){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(t){let[e,n]=t.tokens,a=this.getReserveH160Id(e),r=this.api.event.Router.Executed.watch(({asset_in:i,asset_out:o})=>i===n.id||o===n.id),s=this.api.event.EVM.Log.watch(({log:i})=>{let{topics:o,data:l}=i,c=o.map(g=>g.asHex()),m=l.asHex(),{eventName:d,args:p}=(0,Dn.decodeEventLog)({abi:En,topics:c,data:m});return va.includes(d)&&p.reserve.toLowerCase()===a.toLowerCase()});return(0,Tt.merge)([r,s]).pipe((0,Tt.switchMap)(()=>this.getPoolDelta(t)),(0,Tt.map)(i=>({...t,tokens:[...i]})))}getReserveH160Id(t){return t.type==="Erc20"?et.findNestedKey(t.location,"AccountKey20").AccountKey20.key:Ia.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 L{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,a=new Set(e),r=new Set(n),s=async i=>{let o=i.getPoolType();return a.size>0?a.has(o):r.size>0?!r.has(o):i.isSupported()};return this.getFilteredPools(s)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((r,s)=>e[s]);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 Lt(t.type)}};var en={};x(en,{DEFAULT_BLOCK_TIME:()=>Ln,DEFAULT_MIN_BUDGET:()=>Qe,ORDER_MIN_BLOCK_PERIOD:()=>qn,Router:()=>It,TWAP_BLOCK_PERIOD:()=>ee,TWAP_MAX_DURATION:()=>Ze,TWAP_MAX_PRICE_IMPACT:()=>Je,TWAP_TX_MULTIPLIER:()=>Rl,TradeOrderError:()=>$e,TradeOrderType:()=>de,TradeRouteBuilder:()=>H,TradeRouter:()=>vt,TradeScheduler:()=>Ot,TradeType:()=>pe});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 Oa=8,Zt=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 Jt,s=[];for(s.push([e,""]),r.enqueue(s);r.size()>0;){let i=r.dequeue();if(!i||i.length>Oa)continue;let o=i[i.length-1];(n===null||o[0]===n)&&a.push(i),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,i)){let m=[...i];m.push(c),r.enqueue(m)}})}return a}findShortestPaths(t,e,n){let a=[],r=new Jt,s=[];s.push([e,""]),r.enqueue(s);let i=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<i?(i=o.length,a.length=0,a.push(o)):o.length===i&&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,s]of e)n.get(r)?.push([s,a]);return n}};function ze(u){let t={};for(let e of u){let n=e.tokens.length;for(let a=0;a<n;a++){t[e.tokens[a].id]||(t[e.tokens[a].id]=[]);for(let r=0;r<n;r++){if(a==r)continue;let s=[e.address,e.tokens[a].id,e.tokens[r].id];t[e.tokens[a].id].push(s)}}}return t}var te=class{getProposals(t,e,n){let a=n.filter(b=>b.type==="XYK"),r=n.filter(b=>b.type!=="XYK"),s=new Set(r.map(b=>b.tokens).flat().map(b=>b.id)),i=s.has(t),o=s.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(!i&&!o){let b=a.filter(S=>S.tokens.find(v=>v.id===t)||S.tokens.find(v=>v.id===e)),P=c(b),f=l.findPaths(P,t,e);return this.parsePaths(f)}if(i&&o){let b=c(r),P=l.findPaths(b,t,e);return this.parsePaths(P)}let m=i?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 s=n[r],i=n[r+1];if(i==null)break;a.push(this.toEdge(s,i))}e.push(a)}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(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(s=>this.validPath(s,a)).map(s=>this.toHops(s,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,wt.get(e)]))}toHops(t,e){return t.map(([n,a,r])=>{let s=e.get(n);return{poolAddress:n,poolId:s?.id,pool:s?.type,assetIn:a,assetOut:r}})}};var pe=(e=>(e.Buy="Buy",e.Sell="Sell",e))(pe||{}),de=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(de||{}),$e=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))($e||{});var{FeeUtils:Mn}=k,vt=class extends It{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 qt(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,s=a[a.length-1].amountOut;return r>s?-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,s)=>r+s),a=t.map(r=>r.tradeFeeRange?.[1]??r.tradeFeePct).reduce((r,s)=>r+s);return[n,a]}}getPoolFeeRange(t){let e=t.min?Mn.toPct(t.min):void 0,n=t.max?Mn.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(i=>i.assetOutDecimals).reduce((i,o)=>i+o),a=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),r=n-e.assetOutDecimals,s=Math.pow(10,r);return a/BigInt(s)}async getSell(t,e,n,a){return this.withCtx(t,e,async({paths:r,poolsMap:s})=>{let i;if(a)i=await this.toSellSwaps(n,a,s);else{let o=r.map(c=>this.toSellSwaps(n,c,s)),l=await Promise.all(o);i=this.findBestSellRoute(l)}return this.buildSell(s,i)})}buildSell(t,e){let n=e[0],a=e[e.length-1],r=this.isDirectTrade(e),s=this.getSellSpot(e),i=a.amountOut,o=r?a.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-i,c=this.getRouteFeeRange(e),m=r?a.tradeFeePct:O.calculateSellFee(o,i),d=Math.pow(10,n.assetInDecimals),p=n.amountIn*s/BigInt(d),g=O.calculateDiffToRef(o,p);return{type:"Sell",amountIn:n.amountIn,amountOut:a.amountOut,spotPrice:s,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:h.toDecimal(n.amountIn,n.assetInDecimals),amountOut:h.toDecimal(a.amountOut,a.assetOutDecimals),spotPrice:h.toDecimal(s,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 s=e[r],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;r>0?l=a[r-1]:l=t;let c=i.calculateOutGivenIn(o,l);a.push(c)}return a[a.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:a,pools:r,poolsMap:s}=n,l=r.filter(y=>y.tokens.some(b=>b.id===t)).map(y=>y.type==="Aave"?y.tokens:y.tokens.filter(b=>b.id===t)).map(y=>y.map(b=>b.balance).reduce((b,P)=>b+P)).sort((y,b)=>b<y?-1:1)[0],c=O.getFraction(l,.1),m=await Promise.all(a.map(y=>this.toSellSwaps(c,y,s))),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 s=e[r],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.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(i,o.assetOut),{amountOut:m,calculatedOut:d,feePct:p,errors:g}=i.validateAndSell(o,l,c),y=this.getPoolFeeRange(c),b=i.spotPriceOutGivenIn(o),P=Math.pow(10,o.decimalsIn),f=l*b/BigInt(P),S=O.calculateDiffToRef(d,f);a.push({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:m,calculatedOut:d,spotPrice:b,tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===s.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===s.assetIn},toHuman(){return{...s,amountIn:h.toDecimal(l,o.decimalsIn),amountOut:h.toDecimal(m,o.decimalsOut),calculatedOut:h.toDecimal(d,o.decimalsOut),spotPrice:h.toDecimal(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,s=this.buildRouteKey(t,e,a),i=this.mlr.get(s);i||(i=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",i,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,s=a[0].amountIn;return r>s?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(i=>i.assetInDecimals).reduce((i,o)=>i+o),a=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),r=n-e.assetInDecimals,s=Math.pow(10,r);return a/BigInt(s)}async getBuy(t,e,n,a){return this.withCtx(t,e,async({paths:r,poolsMap:s})=>{let i;if(a)i=await this.toBuySwaps(n,a,s);else{let o=r.map(c=>this.toBuySwaps(n,c,s)),l=await Promise.all(o);i=this.findBestBuyRoute(l)}return this.buildBuy(s,i)})}buildBuy(t,e){let n=e[e.length-1],a=e[0],r=this.isDirectTrade(e),s=this.getBuySpot(e),i=a.amountIn,o=r?a.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=i-o,c=this.getRouteFeeRange(e),m=r?a.tradeFeePct:O.calculateBuyFee(o,i),d=Math.pow(10,n.assetOutDecimals),p=n.amountOut*s/BigInt(d),g;return o===0n?g=-100:g=O.calculateDiffToRef(p,o),{type:"Buy",amountOut:n.amountOut,amountIn:a.amountIn,spotPrice:s,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:h.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:h.toDecimal(a.amountIn,a.assetInDecimals),spotPrice:h.toDecimal(s,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 s=e[r],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;r==e.length-1?l=t:l=a[0];let c=i.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 s=e[r],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.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(i,o.assetOut),{amountIn:m,calculatedIn:d,feePct:p,errors:g}=i.validateAndBuy(o,l,c),y=this.getPoolFeeRange(c),b=i.spotPriceInGivenOut(o),P=Math.pow(10,o.decimalsOut),f=l*b/BigInt(P),S;d===0n?S=-100:S=O.calculateDiffToRef(f,d),a.unshift({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:m,calculatedIn:d,spotPrice:b,tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===s.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===s.assetIn},toHuman(){return{...s,amountOut:h.toDecimal(l,o.decimalsOut),amountIn:h.toDecimal(m,o.decimalsIn),calculatedIn:h.toDecimal(d,o.decimalsIn),spotPrice:h.toDecimal(b,o.decimalsIn),tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g}}})}return a}};var Ln=6e3,Qe=1000000000000000n,ee=6,Je=-5,Ze=216e5,Rl=3,qn=6;var tn=require("polkadot-api");var H=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:a,poolId:r})=>a==="Stableswap"?{pool:(0,tn.Enum)("Stableswap",r),asset_in:e,asset_out:n}:{pool:(0,tn.Enum)(a),asset_in:e,asset_out:n})}};var 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,a,r){let[s,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=i,m=l[0],d=l[l.length-1],{assetInDecimals:p}=m,{assetOutDecimals:g}=d,y=Math.abs(c),b=this.getMinimumTradeCount(o,s),P=this.getOptimalTradeCount(y),f=r?Math.round(a/r):P,S=Math.ceil(a/b),v=Math.round(a/P),M=Math.round(a/f),N=o/BigInt(f),C=await this.router.getBestSell(t,e,N),U=o<s,V=[];U&&V.push("OrderTooSmall");let Z=C.amountOut*BigInt(f),_t=this.toBlockPeriod(M),rt=C.tradeFee*BigInt(f),Se=H.build(l),Rt={assetIn:t,assetOut:e,errors:V,frequencyMin:S,frequencyOpt:v,frequency:M,tradeCount:f,tradeFee:rt,tradeImpactPct:C.priceImpactPct,tradePeriod:_t,tradeRoute:Se,type:"Dca"};return{...Rt,amountIn:o,amountOut:Z,tradeAmountIn:C.amountIn,tradeAmountOut:C.amountOut,toHuman(){return{...Rt,amountIn:h.toDecimal(o,p),amountOut:h.toDecimal(Z,g),tradeAmountIn:h.toDecimal(C.amountIn,p),tradeAmountOut:h.toDecimal(C.amountOut,g)}}}}async getMinimumOrderBudget(t){if(0===t)return this.minOrderBudget;let e=await this.router.getSpotPrice(0,t),n=10n**BigInt(12);if(e)return this.minOrderBudget*e.amount/n;throw new Error("Unable to calculate order budget")}getMinimumTradeCount(t,e){let n=e*2n/10n;if(n===0n)return 0;let 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:s,swaps:i,priceImpactPct:o}=r,l=i[0],c=i[i.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),y=s/BigInt(g),b=await this.router.getBestSell(l.assetIn,c.assetOut,y),P=g===1,f=s<a,S=b.priceImpactPct<-5,v=[];f||P?v.push("OrderTooSmall"):S&&v.push("OrderImpactTooBig");let M=b.amountOut*BigInt(g),N=b.tradeFee*BigInt(g),C=H.build(i),U={assetIn:t,assetOut:e,errors:v,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:C,type:"TwapSell"};return{...U,amountIn:s,amountOut:M,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:N,toHuman(){return{...U,amountIn:h.toDecimal(s,m),amountOut:h.toDecimal(M,d),tradeAmountIn:h.toDecimal(b.amountIn,m),tradeAmountOut:h.toDecimal(b.amountOut,d),tradeFee:h.toDecimal(N,d)}}}}async getTwapBuyOrder(t,e,n){let[a,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:s,swaps:i,priceImpactPct:o}=r,l=i[0],c=i[i.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),y=s/BigInt(g),b=await this.router.getBestBuy(l.assetIn,c.assetOut,y),P=b.amountIn*BigInt(g),f=g===1,S=P<a,v=b.priceImpactPct<-5,M=[];S||f?M.push("OrderTooSmall"):v&&M.push("OrderImpactTooBig");let N=b.tradeFee*BigInt(g),C=H.build(i),U={assetIn:t,assetOut:e,errors:M,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:C,type:"TwapBuy"};return{...U,amountIn:P,amountOut:s,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:N,toHuman(){return{...U,amountIn:h.toDecimal(P,m),amountOut:h.toDecimal(s,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 a=216e5/(this.blockTime*6);return Math.round(a)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,n=Math.round(e);return Math.max(n,6)}};var nn={};x(nn,{BIG_10:()=>Hn,BIG_BILL:()=>Un,StakingApi:()=>ne,StakingClient:()=>ae});var Nn=require("@polkadot/util-crypto"),Gn=require("@polkadot/util"),pt=require("@galacticcouncil/math-staking"),mt=gt(require("big.js")),Hn=(0,mt.default)(10),Un=(0,mt.default)(Hn.pow(12));function Aa(u){return(0,Nn.encodeAddress)((0,Gn.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=Aa(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(s,[i,o])=>{let l=await s,c=i,m=o.amount,d=o.conviction.toString(),p=await this.client.getReferendumInfo(c);return p&&(p.type==="Approved"||p.type==="Rejected")&&l.push({id:c,amount:m,conviction:d}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt: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(s=>s)?.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:s,stakePosition:i}=n;if(!i)return;let[o,l,c,m]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=(0,mt.default)(o.toString()).minus(a.toString()),p=r.toString(),g=(0,mt.default)(e).plus(1).toString();d.gt(0)&&s>0&&(p=(0,pt.calculate_accumulated_rps)(r.toString(),d.toString(),s.toString()));let y=(0,pt.calculate_period_number)(l.toString(),e,m??g),b=(0,pt.calculate_period_number)(l.toString(),i.createdAt?.toString()??"",m??g),P=(0,pt.calculate_rewards)(p,i.rewardPerStake?.toString()??"",i.stake?.toString()??""),f=(0,mt.default)(P).plus(i.accumulatedUnpaidRewards?.toString()||"0").plus(i.accumulatedLockedRewards?.toString()||"0");if(!(0,mt.default)(y).minus(b).lte(c.toString()))return f.div(Un).toString()}};var ae=class extends L{async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:s})=>{let[i,o,l]=s;return{address:i,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var rn={};x(rn,{TxBuilderFactory:()=>Bt});var an=require("polkadot-api");function Vn(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var At=class extends L{evm;evmClient;balanceClient;aaveUtils;constructor(t,e){super(t),this.evm=e,this.evmClient=e.getWsProvider(),this.balanceClient=new K(t),this.aaveUtils=new st(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,an.Enum)("Signed",t),a=(0,an.Enum)("system",n),s=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(a,e.decodedCall),i=s.success&&!s.value.execution_result.success?s.value.execution_result.value.error:null;if(i){let o=Vn(i.value);throw new Error("Dry run execution error!",{cause:o})}return s}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var ge=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: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],s=O.getFraction(t,this.slippagePct),i=a.assetIn,o=r.assetOut,l=t+s,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:i,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:i,asset_out:o,amount_out:e,max_amount_in:l,route:H.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,a=n[0],r=n[n.length-1],s=O.getFraction(e,this.slippagePct),i=a.assetIn,o=r.assetOut,l=e-s,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:i,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:i,asset_out:o,amount_in:t,min_amount_out:l,route:H.build(n)}),a.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=await this.dispatchWithExtraGas(c)),this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],a=e[e.length-1],r=O.getFraction(t,this.slippagePct),s=n.assetIn,i=a.assetOut,o=t-r,l=this.api.tx.Router.sell_all({asset_in:s,asset_out:i,min_amount_out:o,route:H.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var be=require("polkadot-api");var ye=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:a,tradePeriod:r,tradeRoute:s}=this.order,i=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:r,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,be.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:a,min_amount_out:0n,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",i)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:a,tradeAmountOut:r,tradePeriod:s,tradeRoute:i}=this.order,o=O.getFraction(r,this.slippagePct),l=r-o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,be.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:a,min_amount_out:l,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:a,tradeAmountOut:r,tradePeriod:s,tradeRoute:i}=this.order,o=O.getFraction(a,this.slippagePct),l=a+o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,be.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:r,max_amount_in:l,route:i})},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 ge(this.client,this.evmClient).setTrade(t)}order(t){return new ye(this.client,this.evmClient).setOrder(t)}};var Wn=require("polkadot-api"),sn=require("@galacticcouncil/math-liquidity-mining"),D=gt(require("big.js"));var Ba=(0,D.default)(365.2425).times(24).times(60).times(60),_a=BigInt((0,D.default)(1).pow(18).toString()),Ra=6,he=class{client;balanceClient;omnipoolAssetIds=[];constructor(t,e){this.client=t,this.balanceClient=e}async getOraclePrice(t,e){let n=[t,e].sort((r,s)=>r-s);if(t===e)return _a;let a=await this.client.getOraclePrice(n);if(a){let{n:r,d:s}=a[0].price,i;return t<e?i=(0,sn.fixed_from_rational)(r.toString(),s.toString()):i=(0,sn.fixed_from_rational)(s.toString(),r.toString()),BigInt(i)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),a=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),r=Buffer.from([t]),s=Buffer.concat([n,a,r]),o="0x"+Buffer.concat([s,Buffer.alloc(32-s.length)]).toString("hex");return(0,Wn.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,a){let r=(0,D.default)(a).times(t.toString()).times(e.toString()).div(18);return r.gte(n.toString())?n.toString():r.toString()}getPoolYieldPerPeriod(t,e,n,a){let r=(0,D.default)(t.toString()).times(e),s=(0,D.default)(n.toString()).times(a);return r.div(s.toString()).toString()}farmData(t,e,n){let{yieldFarm:a,globalFarm:r,priceAdjustment:s,balance:i}=t,{multiplier:o,loyalty_curve:l}=a,{blocks_per_period:c,yield_per_period:m,total_shares_z:d,max_reward_per_period:p,pending_rewards:g,accumulated_paid_rewards:y,planned_yielding_periods:b,updated_at:P,incentivized_asset:f,reward_currency:S,price_adjustment:v}=r,M=Dt(s??v,18),N=Dt(o,18),C=Dt(l?.initial_reward_percentage??0,18),U=Ba.div((0,D.default)(Ra).times(c)).toString(),V;if(d<0)V=(0,D.default)(N).times(m.toString()).times(U).toString();else{let zn=this.getGlobalRewardPerPeriod(d,m,p,M),$n=this.getPoolYieldPerPeriod(zn,N,d,M);V=(0,D.default)($n).times(U).toString()}let Z=g+y,_t=p*BigInt(b),rt=i.transferable+Z,Se=rt-Z,Rt=(0,D.default)(Se.toString()).div(p.toString()),on=(0,D.default)(e).div(c.toString()).toString(),Xn=(d>=0?Rt.plus(P):Rt.plus(on)).toString(),Kn=(0,D.default)(d.toString()).div((0,D.default)(p.toString()).div(m.toString())).div(Math.pow(10,18)).times(100).times(M).toFixed(2),ln=(0,D.default)(Z.toString()).div(rt.toString()).gte(.999);V=ln?"0":(0,D.default)(V).div(n?2:1).times(100).toString();let jn=C?(0,D.default)(V).times(C).toString():void 0;return{apr:V,minApr:jn,isDistributed:ln,estimatedEndPeriod:Xn,maxRewards:_t,incentivizedAsset:f,rewardCurrency:S,loyaltyCurve:l,currentPeriod:on,potMaxRewards:rt,fullness:Kn}}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:s})=>{let[,i]=r,o=s,l=await this.client.getOmnipoolGlobalFarm(i),c=await this.client.getOmnipoolYieldFarm(Number(t),i,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(i),g=await this.getOraclePrice(m,d),y=await this.balanceClient.getTokenBalance(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 getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),a=await Promise.all(e.map(async({keyArgs:r,value:s})=>{let[,i]=r,o=s,l=await this.client.getIsolatedGlobalFarm(i),c=await this.client.getIsolatedYieldFarm(t,i,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(i,!0),g=await this.getOraclePrice(m,d),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):[]}};var Yn=require("api"),fe=require("polkadot-api"),Pe=class extends Yn.Papi{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(fe.Binary.fromText("omnipool"),t,(0,fe.Enum)("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,n){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,n)}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,n){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,n)}};async function Fa(u){let t=new Pt(u),e=new Nt(u),[n,a]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),r=new xt(u,e).withAave().withOmnipool().withStableswap().withXyk(),s=new st(e),i=new vt(r),o=new Ot(i,{blockTime:n,minBudgetInNative:a}),l=new K(u),c=new ae(u),m=new ne(c,l),d=new Pe(u),p=new he(d,l);return{api:{aave:s,router:i,scheduler:o,staking:m,farm:p},client:{asset:new ht(u),balance:l,evm:e},ctx:{pool:r},tx:new Bt(u,e),destroy:()=>{r.destroy()}}}0&&(module.exports={aave,api,big,client,const:null,createSdkContext,erc20,error,evm,fmt,h160,json,math,pool,sor,staking,tx,xc});
|
|
1
|
+
"use strict";var $n=Object.create;var se=Object.defineProperty;var Qn=Object.getOwnPropertyDescriptor;var Jn=Object.getOwnPropertyNames;var Zn=Object.getPrototypeOf,ta=Object.prototype.hasOwnProperty;var cn=(u,t)=>()=>(u&&(t=u(u=0)),t);var x=(u,t)=>{for(var e in t)se(u,e,{get:t[e],enumerable:!0})},re=(u,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of Jn(t))!ta.call(u,a)&&a!==e&&se(u,a,{get:()=>t[a],enumerable:!(n=Qn(t,a))||n.enumerable});return u},dt=(u,t,e)=>(re(u,t,"default"),e&&re(e,t,"default")),gt=(u,t,e)=>(e=u!=null?$n(Zn(u)):{},re(t||!u||!u.__esModule?se(e,"default",{value:u,enumerable:!0}):e,u)),ea=u=>re(se({},"__esModule",{value:!0}),u);var Ft={};var pn=cn(()=>{dt(Ft,require("@polkadot-api/ws-provider/node"))});var Et={};var dn=cn(()=>{dt(Et,require("@polkadot-api/ws-provider/web"))});var Fa={};x(Fa,{aave:()=>Me,api:()=>Te,big:()=>h,client:()=>Le,const:()=>_e,createSdkContext:()=>Ra,erc20:()=>st,error:()=>Ne,evm:()=>He,fmt:()=>C,h160:()=>Mt,json:()=>et,math:()=>O,pool:()=>je,sor:()=>en,staking:()=>nn,tx:()=>rn,xc:()=>Ce});module.exports=ea(Fa);var Te={};x(Te,{Papi:()=>k,getWs:()=>na});var mn=require("@galacticcouncil/descriptors");function un(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(mn.hydration)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");un(n)&&console.log(t,...e)}};var gn=require("polkadot-api"),bn=require("polkadot-api/polkadot-sdk-compat"),na=async u=>{let t=typeof u=="string"?u.split(","):u,a=(typeof window>"u"?(await Promise.resolve().then(()=>(pn(),Ft))).getWsProvider:(await Promise.resolve().then(()=>(dn(),Et))).getWsProvider)(t);return(0,gn.createClient)((0,bn.withPolkadotSdkCompat)(a))};var Me={};x(Me,{AAVE_GAS_LIMIT:()=>Ie,AAVE_LENDING_POOL_ADDRESS:()=>le,AAVE_POOL_ABI:()=>we,AAVE_POOL_DATA_PROVIDER:()=>oe,AAVE_POOL_DATA_PROVIDER_ABI:()=>ie,AAVE_POOL_PROXY:()=>xe,AAVE_ROUNDING_THRESHOLD:()=>Ka,AAVE_UINT_256_MAX:()=>aa,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 ie=[{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",oe="0x112b087b60C1a166130d59266363C45F8aa99db0",le="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Ie=1000000n,Ka=5,aa=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var kt=class{client;constructor(t){this.client=t.getWsProvider()}async getReservesData(){return await this.client.readContract({abi:ie,address:oe,args:[le],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:ie,address:oe,args:[le,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:we,address:xe,args:[t],functionName:"getUserAccountData"})}};var h={};x(h,{asBigInt:()=>ia,toBigInt:()=>sa,toDecimal:()=>ra});var tt=gt(require("big.js"));tt.default.NE=-18;function ra(u,t,e=6,n){let a=(0,tt.default)(u.toString()),r=(0,tt.default)(10).pow(t);return a.div(r).round(e,n).toString()}function sa(u,t){let e=(0,tt.default)(10).pow(t),a=(0,tt.default)(u).mul(e).toFixed(0,tt.default.roundDown);return BigInt(a)}function ia(u){return BigInt(u.round(0,tt.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 yn=gt(require("big.js"));var _e={};x(_e,{HUB_ASSET_ID:()=>Be,HYDRATION_OMNIPOOL_ADDRESS:()=>la,HYDRATION_PARACHAIN_ID:()=>oa,HYDRATION_SS58_PREFIX:()=>q,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,oa=2034,q=63,la="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 a=10**n;return Math.round(t*a/e)/a}static safeRound(t){return parseFloat(t.toPrecision(15))}};function Dt(u,t){let e=(0,yn.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:()=>hn,isEvmAddress:()=>Pn,isSs58Address:()=>fn});var yt=require("polkadot-api"),Fe=require("@polkadot-api/utils"),Q=require("buffer");var Ee="ETH\0";function hn(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 Pn(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function fn(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),a=Uint8Array.from(Q.Buffer.concat([n,e,Q.Buffer.alloc(8)])),r=(0,Fe.toHex)(a);return(0,yt.AccountId)(63).dec(r)};static fromAccount=t=>{let e=(0,yt.AccountId)().enc(t),n=Q.Buffer.from(Ee),a=e.slice(n.length,-8);return"0x"+Q.Buffer.from(a).toString("hex")};static fromSS58=t=>{let n=(0,yt.AccountId)().enc(t).slice(0,20);return(0,Fe.toHex)(n)};static fromAny=t=>{if(Pn(t))return t;if(hn(t))return u.fromAccount(t);if(fn(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var et={};x(et,{findNestedKey:()=>ca,findNestedObj:()=>ua,jsonFormatter:()=>ma});var ca=(u,t)=>{let e=[];return JSON.stringify(u,(n,a)=>(a&&a[t]&&e.push(a),a)),e[0]},ua=(u,t,e)=>{let n;return JSON.stringify(u,(a,r)=>(r&&r[t]===e&&(n=r),r)),n},ma=(u,t)=>typeof t=="bigint"?t.toString():t;var O={};x(O,{calculateBuyFee:()=>ba,calculateDiffToAvg:()=>pa,calculateDiffToRef:()=>da,calculateSellFee:()=>ga,getFraction:()=>ya});var X=gt(require("big.js"));function pa(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 da(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 ga(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 ba(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 ya(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 Ce={};x(Ce,{convertToId:()=>ha});var Sn=require("buffer");function ha(u){let e=Sn.Buffer.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:ce}=st,{H160:De}=Mt,Pa=1.01,fa=99999,Sa=10n**27n,Ta=10n**18n,it=class{client;constructor(t){this.client=new kt(t)}async getSummary(t){let e=De.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:rt})=>rt.toLowerCase()===f);if(!S)throw new Error("Missing pool reserve for "+f);let v=P.scaledATokenBalance,L=S.liquidityIndex,N=S.priceInMarketReferenceCurrency,D=v*L/Sa,V=Number(o===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,Z=S.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,_t=ce.toAssetId(f);b.push({aTokenBalance:D,decimals:Number(S.decimals),isCollateral:Z,priceInRef:N,reserveId:_t,reserveAsset:f,reserveLiquidationThreshold:V})}return{healthFactor:Number(y),totalCollateral:l,totalDebt:c,reserves:b}}async hasBorrowPositions(t){let e=De.fromAny(t),n=await this.client.getUserAccountData(e),[a,r]=n;return r>0n}async getHealthFactor(t){let e=De.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=ce.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=ce.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=ce.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 fa;let a=10n**6n,r=h.toBigInt(e,18),i=t*r*a,s=n*Ta,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(Pa,s,n),l=e-o;if(l<=0n)return{amount:0n,decimals:r};let c=l*10n**BigInt(r)/i;return{amount:a<c?a:c,decimals:r}}};var Le={};x(Le,{AssetClient:()=>ht,BalanceClient:()=>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: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)}};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 a=await this.api.query.Tokens.Accounts.getValue(t,e);return this.calculateBalance(a)}calculateBalance(t){let e=t.free>=t.frozen?t.free-t.frozen:0n,n=t.free+t.reserved;return{free:t.free,reserved:t.reserved,frozen:t.frozen,total:n,transferable:e}}async getErc20Balance(t,e){return this.getTokenBalanceData(t,e)}subscribeBalance(t){let e=this.subscribeSystemBalance(t),n=this.subscribeTokensBalance(t),a=this.subscribeErc20Balance(t);return(0,w.combineLatest)([e,n,a]).pipe((0,w.debounceTime)(250),(0,w.map)(r=>r.flat()),(0,w.startWith)([]),(0,w.bufferCount)(2,1),(0,w.map)(([r,i],s)=>{if(s===0)return i;let o=r.reduce((c,m)=>(c.set(m.id,m.balance),c),new Map);return i.filter(c=>!Tn(c.balance,o.get(c.id)))}))}subscribeSystemBalance(t){return this.api.query.System.Account.watchValue(t,"best").pipe((0,w.map)(n=>({id:0,balance:this.calculateBalance(n.data)})))}subscribeTokenBalance(t,e){return this.api.query.Tokens.Accounts.watchValue(t,e,"best").pipe((0,w.map)(a=>({id:e,balance:a})))}subscribeTokensBalance(t){return this.api.query.Tokens.Accounts.watchEntries(t,{at:"best"}).pipe((0,w.distinctUntilChanged)((n,a)=>!a.deltas),(0,w.map)(({deltas:n})=>{let a=[];return n?.deleted.forEach(r=>{let[i,s]=r.args;a.push({id:s,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(r=>{let[i,s]=r.args;a.push({id:s,balance:this.calculateBalance(r.value)})}),a}))}subscribeErc20Balance(t,e){let n=new w.Subject,a=n.pipe((0,w.shareReplay)(1)),r=async()=>(await this.api.query.AssetRegistry.Assets.getEntries()).filter(({value:l})=>{let{asset_type:c}=l;return c.type==="Erc20"}).map(({keyArgs:l})=>{let[c]=l;return c}),i=async()=>{let o=e||await r(),l=async()=>{let d=(await Promise.all(o.map(async 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((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=>!Tn(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)}},Tn=(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 wn=require("viem"),wa=["https://hydration-rpc.n.dwellir.com","https://hydration.dotters.network","https://rpc.helikon.io/hydradx","https://hydration.ibp.network","https://rpc.cay.hydration.cloud","https://rpc.parm.hydration.cloud","https://rpc.roach.hydration.cloud","https://rpc.zipp.hydration.cloud","https://rpc.sin.hydration.cloud","https://rpc.coke.hydration.cloud"],Ge=()=>(0,wn.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:wa}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://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,a,r){return(0,z.get_spot_price)(t,e,n,a,r)}static calculateInGivenOut(t,e,n,a,r){return(0,z.calculate_in_given_out)(t,e,n,a,r)}static calculateOutGivenIn(t,e,n,a,r){return(0,z.calculate_out_given_in)(t,e,n,a,r)}static calculateLinearWeights(t,e,n,a,r){return(0,z.calculate_linear_weights)(t,e,n,a,r)}static calculatePoolTradeFee(t,e,n){return(0,z.calculate_pool_trade_fee)(t,e,n)}};var F=(r=>(r.Aave="Aave",r.LBP="LBP",r.Omni="Omnipool",r.Stable="Stableswap",r.XYK="XYK",r))(F||{}),ot=(r=>(r.InsufficientTradingAmount="InsufficientTradingAmount",r.MaxInRatioExceeded="MaxInRatioExceeded",r.MaxOutRatioExceeded="MaxOutRatioExceeded",r.TradeNotAllowed="TradeNotAllowed",r.UnknownError="UnknownError",r))(ot||{});var{FeeUtils:xn}=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,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=xn.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=xn.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=Y.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=Y.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=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 vn=require("polkadot-api"),lt=require("rxjs");var In=(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,a,r]=await Promise.all([this.client.readContract({abi:Ue,address:t,functionName:"latestRoundData"}),this.client.readContract({abi:Ue,address:t,functionName:"decimals"}),this.client.getBlock()]),[i,s,o,l]=n,c=r.number-(r.timestamp-l)/BigInt(e),m=Number(c);return{price:s,decimals:a,updatedAt:m<0?0:m}}};var G=class extends K{evm;mmOracle;override=[];mem=0;memPools=In(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,a])=>this.updatePool(n,a))))}subscribePoolBalance(t){if(t.type==="Aave")return(0,I.of)([]);let e=[this.subscribeTokensBalance(t.address)];if(this.hasSystemAsset(t)){let n=this.subscribeSystemBalance(t.address);e.push(n)}if(this.hasErc20Asset(t)){let n=t.tokens.filter(r=>r.type==="Erc20").map(r=>r.id),a=this.subscribeErc20Balance(t.address,n);e.push(a)}return(0,I.combineLatest)(e).pipe((0,I.map)(n=>n.map(a=>Array.isArray(a)?a:[a]).flat()))}hasSystemAsset(t){return t.tokens.some(e=>e.id===0)}hasErc20Asset(t){return t.tokens.some(e=>e.type==="Erc20")}hasValidAssets(t){return t.tokens.every(({id:e,decimals:n,balance:a})=>{let r=this.override.find(s=>s.id===e),i=!!n||!!r?.decimals;return a>0n&&i})}updatePool=(t,e)=>{let n=t.tokens.map(a=>{let r=e.find(s=>s.id===a.id),i=this.override.find(s=>s.id===a.id);return r?{...a,balance:r.balance.transferable,decimals:a.decimals||i?.decimals}:{...a,decimals:a.decimals||i?.decimals}});return{...t,tokens:n}}};var 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()]),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=Y.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,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: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(vn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe((0,lt.switchMap)(a=>a?this.getPoolDelta(t.address,n,a.relay_parent_number):(0,lt.of)(t)),(0,lt.map)(a=>Object.assign({},t,a))):(0,lt.of)(t)}};var We={};x(We,{OmniMath:()=>A,OmniPool:()=>Vt,OmniPoolClient:()=>Yt});var T=require("@galacticcouncil/math-omnipool"),ct=gt(require("big.js")),A=class{static calculateSpotPrice(t,e,n,a){return(0,T.calculate_spot_price)(t,e,n,a)}static calculateLrnaSpotPrice(t,e){return(0,T.calculate_lrna_spot_price)(t,e)}static calculateInGivenOut(t,e,n,a,r,i,s,o,l){return(0,T.calculate_in_given_out)(t,e,n,a,r,i,s,o,l)}static calculateLrnaInGivenOut(t,e,n,a,r){return(0,T.calculate_lrna_in_given_out)(t,e,n,a,r)}static calculateOutGivenIn(t,e,n,a,r,i,s,o,l){return(0,T.calculate_out_given_in)(t,e,n,a,r,i,s,o,l)}static calculateOutGivenLrnaIn(t,e,n,a,r){return(0,T.calculate_out_given_lrna_in)(t,e,n,a,r)}static calculateShares(t,e,n,a){return(0,T.calculate_shares)(t,e,n,a)}static calculateLiquidityOut(t,e,n,a,r,i,s,o){return(0,T.calculate_liquidity_out)(t,e,n,a,r,i,s,o)}static calculateLiquidityLRNAOut(t,e,n,a,r,i,s,o){return(0,T.calculate_liquidity_lrna_out)(t,e,n,a,r,i,s,o)}static calculateCapDifference(t,e,n,a){let r=(0,ct.default)(e),i=(0,ct.default)(t),s=(0,ct.default)(a),o=(0,ct.default)(n),l=(0,ct.default)(10).pow(18),c=o.div(l);if(r.div(s).lt(c)){let d=c.times(s).minus(r).times(i),p=r.times((0,ct.default)(1).minus(c));return d.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,a){return(0,T.verify_asset_cap)(t,e,n,a)}static calculateLimitHubIn(t,e,n,a){return(0,T.calculate_liquidity_hub_in)(t,e,n,a)}static isSellAllowed(t){return(0,T.is_sell_allowed)(t)}static isBuyAllowed(t){return(0,T.is_buy_allowed)(t)}static isAddLiquidityAllowed(t){return(0,T.is_add_liquidity_allowed)(t)}static isRemoveLiquidityAllowed(t){return(0,T.is_remove_liquidity_allowed)(t)}};var{FeeUtils: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,a,r,i){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r,this.hubAssetId=i}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),r=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,hubReservesIn:a.hubReserves,hubReservesOut:r.hubReserves,sharesIn:a.shares,sharesOut:r.shares,decimalsIn:a.decimals,decimalsOut:r.decimals,balanceIn:a.balance,balanceOut:r.balance,tradeableIn:a.tradeable,tradeableOut:r.tradeable,assetInEd:a.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),r=this.calculateInGivenOut(t,e,n),i=a===0n?0:O.calculateDiffToRef(r,a),s=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&s.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&s.push("MaxOutRatioExceeded");let 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=O.calculateDiffToRef(a,r),s=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&s.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&s.push("MaxInRatioExceeded");let 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=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"),r=BigInt(a);return r<0n?0n:r}calculateLrnaInGivenOut(t,e,n){let a=A.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ft.toRaw(n.assetFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let a=A.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ft.toRaw(n.assetFee).toString():"0",n?ft.toRaw(n.protocolFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}calculateOutGivenLrnaIn(t,e,n){let a=A.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?ft.toRaw(n.assetFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=A.calculateSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString(),t.balanceIn.toString(),t.hubReservesIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceLrnaInGivenOut(t){let e=A.calculateLrnaSpotPrice(t.hubReservesOut.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){if(t.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(t);let e=A.calculateSpotPrice(t.balanceIn.toString(),t.hubReservesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}spotPriceOutGivenLrnaIn(t){let e=A.calculateLrnaSpotPrice(t.balanceOut.toString(),t.hubReservesOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}};var ue=require("polkadot-api"),On=require("@polkadot-api/utils"),Wt=require("rxjs");var{FeeUtils:nt}=C,Yt=class extends G{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=(0,On.toHex)(e);return(0,ue.AccountId)(63).dec(n)}async getPoolLimits(){let[t,e,n]=await Promise.all([this.api.constants.Omnipool.MaxInRatio(),this.api.constants.Omnipool.MaxOutRatio(),this.api.constants.Omnipool.MinimumTradingLimit()]);return{maxInRatio:t,maxOutRatio:e,minTradingLimit:n}}async getPoolFees(t,e){let[n,a,r]=await Promise.all([this.api.constants.DynamicFees.AssetFeeParameters(),this.api.constants.DynamicFees.ProtocolFeeParameters(),this.api.query.DynamicFees.AssetFee.getValue(e)]),i=n.min_fee+a.min_fee,s=n.max_fee+a.max_fee;if(r){let{asset_fee:o,protocol_fee:l}=r;return{assetFee:nt.fromPermill(o),protocolFee:nt.fromPermill(l),min:nt.fromPermill(i),max:nt.fromPermill(s)}}else return{assetFee:nt.fromPermill(n.min_fee),protocolFee:nt.fromPermill(a.min_fee),min:nt.fromPermill(i),max:nt.fromPermill(s)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(ue.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe((0,Wt.distinctUntilChanged)((n,a)=>!a.deltas),(0,Wt.map)(({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}})),(0,Wt.map)(n=>{let a=t.tokens.find(r=>r.id===1);return{...t,tokens:[...n,a]}}))}};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,a,r){return(0,_.calculate_amplification)(t,e,n,a,r)}static calculateInGivenOut(t,e,n,a,r,i,s){return(0,_.calculate_in_given_out)(t,e,n,a,r,i,s)}static calculateAddOneAsset(t,e,n,a,r,i,s){return(0,_.calculate_add_one_asset)(t,e,n,a,r,i,s)}static calculateSharesForAmount(t,e,n,a,r,i,s){return(0,_.calculate_shares_for_amount)(t,e,n,a,r,i,s)}static calculateOutGivenIn(t,e,n,a,r,i,s){return(0,_.calculate_out_given_in)(t,e,n,a,r,i,s)}static calculateLiquidityOutOneAsset(t,e,n,a,r,i,s){return(0,_.calculate_liquidity_out_one_asset)(t,e,n,a,r,i,s)}static calculateShares(t,e,n,a,r,i){return(0,_.calculate_shares)(t,e,n,a,r,i)}static calculateSpotPriceWithFee(t,e,n,a,r,i,s,o){return(0,_.calculate_spot_price_with_fee)(t,e,n,a,r,i,s,o)}static recalculatePegs(t,e,n,a,r){let i=(0,_.recalculate_peg)(t,e,n,a,r);return JSON.parse(i)}};var{FeeUtils:at}=C,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,r,i,s,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r,this.amplification=i,this.id=s,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),r=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:r.balance,decimalsIn:a.decimals,decimalsOut:r.decimals,tradeableIn:this.id===t?15:a.tradeable,tradeableOut:this.id===e?15:r.tradeable,assetInEd:a.existentialDeposit,assetOutEd:r.existentialDeposit}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),r=this.calculateInGivenOut(t,e,n),i=at.toPct(n.fee),s=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&s.push("InsufficientTradingAmount"),{amountIn:r,calculatedIn:a,amountOut:e,feePct:i,errors:s}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,n),i=at.toPct(n.fee),s=[],o=A.isSellAllowed(t.tradeableIn),l=A.isBuyAllowed(t.tradeableOut);return(!o||!l)&&s.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&s.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:a,amountOut:r,feePct:i,errors:s}}calculateIn(t,e,n){let a=E.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateAddOneAsset(t,e,n){let a=E.calculateAddOneAsset(this.getReserves(),e.toString(),Number(t.assetIn),this.amplification.toString(),this.totalIssuance.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateSharesForAmount(t,e,n){let a=E.calculateSharesForAmount(this.getReserves(),Number(t.assetOut),e.toString(),this.amplification.toString(),this.totalIssuance.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateInGivenOut(t,e,n){return t.assetOut==this.id?this.calculateAddOneAsset(t,e,n):t.assetIn==this.id?this.calculateSharesForAmount(t,e,n):this.calculateIn(t,e,n)}spotPriceInGivenOut(t){let e=E.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetOut.toString(),t.assetIn.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetOut==this.id)return BigInt(e);if(t.assetIn==this.id){let a=Math.pow(10,t.decimalsIn-t.decimalsOut);return BigInt(e)/BigInt(a)}let n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateOut(t,e,n){let a=E.calculateOutGivenIn(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateWithdrawOneAsset(t,e,n){let a=E.calculateLiquidityOutOneAsset(this.getReserves(),e.toString(),Number(t.assetOut),this.amplification.toString(),this.totalIssuance.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateShares(t,e,n){let a=E.calculateShares(this.getReserves(),this.getAssets(t.assetIn,e),this.amplification.toString(),this.totalIssuance.toString(),n?at.toRaw(n.fee).toString():"0",this.getPegs()),r=BigInt(a);return r<0n?0n:r}calculateOutGivenIn(t,e,n){return t.assetIn==this.id?this.calculateWithdrawOneAsset(t,e,n):t.assetOut==this.id?this.calculateShares(t,e,n):this.calculateOut(t,e,n)}spotPriceOutGivenIn(t){let e=E.calculateSpotPriceWithFee(this.id.toString(),this.getReserves(),this.amplification.toString(),t.assetIn.toString(),t.assetOut.toString(),this.totalIssuance.toString(),"0",this.getPegs());if(t.assetIn==this.id)return BigInt(e);if(t.assetOut==this.id){let a=Math.pow(10,t.decimalsOut-t.decimalsIn);return BigInt(e)/BigInt(a)}let n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}getPegs(){let t=E.defaultPegs(this.tokens.length-1);return JSON.stringify(t)}getReserves(){let t=this.tokens.filter(e=>e.id!=this.id).map(({id:e,balance:n,decimals:a})=>({asset_id:e,amount:n,decimals:a}));return JSON.stringify(t,et.jsonFormatter)}getAssets(t,e){let n={asset_id:Number(t),amount:e.toString()};return JSON.stringify([n],et.jsonFormatter)}};var me=require("polkadot-api"),An=require("@polkadot-api/utils"),Bn=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,Bn.blake2b)(e,{dkLen:32}),a=(0,An.toHex)(n);return(0,me.AccountId)(63).dec(a)}async getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:await this.api.constants.Stableswap.MinTradingLimit()}}async getPoolDelta(t,e,n){let{initial_amplification:a,final_amplification:r,initial_block:i,final_block:s}=e,o=E.calculateAmplification(a.toString(),r.toString(),i.toString(),s.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),a=e.assets.map(async r=>{let[i,s,o]=await Promise.all([this.api.query.Stableswap.AssetTradability.getValue(t,r),this.api.query.AssetRegistry.Assets.getValue(r),this.getBalance(n,r)]);return{id:r,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:o.transferable,tradeable:i,type:s?.asset_type.type}});return Promise.all(a)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(me.CompatibilityLevel.BackwardsCompatible,e)}async loadPools(){let[t,e,n]=await Promise.all([this.api.query.Stableswap.Pools.getEntries(),this.api.query.System.Number.getValue(),this.getPoolLimits()]),a=t.map(async({keyArgs:r,value:i})=>{let[s]=r,o=this.getPoolAddress(s),[l,c,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(a)}async getPoolFees(t){return{fee:t.fee}}async getPoolPegs(t,e,n){let a=await this.api.query.Stableswap.PoolPegs.getValue(t);if(!a)return this.getDefaultPegs(e);let r=await this.getLatestPegs(e,a,n),i=this.getRecentPegs(a),s=ut.fromPermill(a.max_peg_update),o=ut.fromPermill(e.fee),[l,c]=E.recalculatePegs(JSON.stringify(i),JSON.stringify(r),n.toString(),ut.toRaw(s).toString(),ut.toRaw(o).toString()),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,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?(0,St.of)(t):e.watchValue("best").pipe((0,St.switchMap)(a=>Promise.all([this.getPoolDelta(t.id,n,a),this.getPoolPegs(t.id,n,a)])),(0,St.map)(([a,r])=>{let i=t.tokens.map(s=>s.id===t.id?{...s,balance:a.totalIssuance}:s);return Object.assign(t,{tokens:i},a,r)}))}};var Xe={};x(Xe,{XykMath:()=>J,XykPool:()=>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,a){return(0,R.calculate_spot_price_with_fee)(t,e,n,a)}static calculateShares(t,e,n){return(0,R.calculate_shares)(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,a){return(0,R.calculate_liquidity_out_asset_a)(t,e,n,a)}static calculateLiquidityOutAssetB(t,e,n,a){return(0,R.calculate_liquidity_out_asset_b)(t,e,n,a)}};var{FeeUtils:_n}=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,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=_n.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=_n.toPct(n.exchangeFee),s=a-r,o=[];(e<this.minTradingLimit||a<t.assetOutEd)&&o.push("InsufficientTradingAmount");let l=t.balanceIn/this.maxInRatio;e>l&&o.push("MaxInRatioExceeded");let c=t.balanceOut/this.maxOutRatio;return s>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:s,feePct:i,errors:o}}calculateInGivenOut(t,e){let n=J.calculateInGivenOut(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}calculateOutGivenIn(t,e){let n=J.calculateOutGivenIn(t.balanceIn.toString(),t.balanceOut.toString(),e.toString()),a=BigInt(n);return a<0n?0n:a}spotPriceInGivenOut(t){let e=J.calculateSpotPrice(t.balanceOut.toString(),t.balanceIn.toString()),n=Math.pow(10,18-t.decimalsOut);return BigInt(e)/BigInt(n)}spotPriceOutGivenIn(t){let e=J.calculateSpotPrice(t.balanceIn.toString(),t.balanceOut.toString()),n=Math.pow(10,18-t.decimalsIn);return BigInt(e)/BigInt(n)}calculateTradeFee(t,e){let n=J.calculatePoolTradeFee(t.toString(),e.exchangeFee[0],e.exchangeFee[1]);return BigInt(n)}};var Rn=require("polkadot-api"),Fn=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()]),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(Rn.CompatibilityLevel.BackwardsCompatible,e)}subscribePoolChange(t){return(0,Fn.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,a,r){this.type="Aave",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(i=>[i.id,i])),a=n.get(t),r=n.get(e);if(a==null)throw new Error("Pool does not contain tokenIn");if(r==null)throw new Error("Pool does not contain tokenOut");return{assetIn:t,assetOut:e,balanceIn:a.balance,balanceOut:r.balance,decimalsIn:a.decimals,decimalsOut:r.decimals,assetInEd:0n,assetOutEd:0n}}validateAndBuy(t,e,n){let a=this.calculateInGivenOut(t,e),r=[];return e>t.balanceOut&&r.push("TradeNotAllowed"),{amountIn:a,calculatedIn:a,amountOut:e,feePct:0,errors:r}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=[];return a>t.balanceOut&&r.push("TradeNotAllowed"),{amountIn:e,calculatedOut:a,amountOut:a,feePct:0,errors:r}}calculateInGivenOut(t,e){return e}calculateOutGivenIn(t,e){return e}spotPriceInGivenOut(t){let e=Math.pow(10,t.decimalsOut);return BigInt(e)}spotPriceOutGivenIn(t){let e=Math.pow(10,t.decimalsIn);return BigInt(e)}calculateTradeFee(t,e){return 0n}};var kn=require("polkadot-api"),Cn=require("@polkadot-api/utils"),Tt=require("rxjs"),Dn=require("viem");var En=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"}];var{ERC20:xa}=st,Ia=["Supply","Withdraw","Repay","Borrow"],Qt=class extends G{async loadPools(){let e=(await this.api.apis.AaveTradeExecutor.pools()).map(async({reserve:n,atoken:a,liqudity_in:r,liqudity_out:i})=>{let[s,o,l,c]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(a),this.api.query.AssetRegistry.AssetLocations.getValue(a)]);return{address:this.getPoolId(n,a),type:"Aave",tokens:[{id:n,decimals:s?.decimals,existentialDeposit:s?.existential_deposit,balance:r,location:o,type:s?.asset_type.type},{id:a,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:i,location:c,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:a,liqudity_out:r}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(i=>{let s=i.id===e.id?a:r;return{...i,balance:s}})}getPoolId(t,e){let n=t+"/"+e,a=new TextEncoder().encode(n.padEnd(32,"\0")),r=(0,Cn.toHex)(a);return(0,kn.AccountId)(63).dec(r)}getPoolLimits(){return{maxInRatio:0n,maxOutRatio:0n,minTradingLimit:0n}}async getPoolFees(t,e){return{}}getPoolType(){return"Aave"}async isSupported(){return!0}subscribePoolChange(t){let[e,n]=t.tokens,a=this.getReserveH160Id(e),r=this.api.event.Router.Executed.watch(({asset_in:s,asset_out:o})=>s===n.id||o===n.id),i=this.api.event.EVM.Log.watch(({log:s})=>{let{topics:o,data:l}=s,c=o.map(g=>g.asHex()),m=l.asHex(),{eventName:d,args:p}=(0,Dn.decodeEventLog)({abi:En,topics:c,data:m});return Ia.includes(d)&&p.reserve.toLowerCase()===a.toLowerCase()});return(0,Tt.merge)([r,i]).pipe((0,Tt.switchMap)(()=>this.getPoolDelta(t)),(0,Tt.map)(s=>({...t,tokens:[...s]})))}getReserveH160Id(t){return t.type==="Erc20"?et.findNestedKey(t.location,"AccountKey20").AccountKey20.key:xa.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,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 Lt(t.type)}};var en={};x(en,{DEFAULT_BLOCK_TIME:()=>Ln,DEFAULT_MIN_BUDGET:()=>Qe,ORDER_MIN_BLOCK_PERIOD:()=>qn,Router:()=>It,TWAP_BLOCK_PERIOD:()=>ee,TWAP_MAX_DURATION:()=>Ze,TWAP_MAX_PRICE_IMPACT:()=>Je,TWAP_TX_MULTIPLIER:()=>_l,TradeOrderError:()=>$e,TradeOrderType:()=>de,TradeRouteBuilder:()=>H,TradeRouter:()=>vt,TradeScheduler:()=>Ot,TradeType:()=>pe});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 va=8,Zt=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 Jt,i=[];for(i.push([e,""]),r.enqueue(i);r.size()>0;){let s=r.dequeue();if(!s||s.length>va)continue;let o=s[s.length-1];(n===null||o[0]===n)&&a.push(s),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,s)){let m=[...s];m.push(c),r.enqueue(m)}})}return a}findShortestPaths(t,e,n){let a=[],r=new Jt,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 ze(u){let t={};for(let e of u){let n=e.tokens.length;for(let a=0;a<n;a++){t[e.tokens[a].id]||(t[e.tokens[a].id]=[]);for(let r=0;r<n;r++){if(a==r)continue;let i=[e.address,e.tokens[a].id,e.tokens[r].id];t[e.tokens[a].id].push(i)}}}return t}var te=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 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=a.filter(S=>S.tokens.find(v=>v.id===t)||S.tokens.find(v=>v.id===e)),P=c(b),f=l.findPaths(P,t,e);return this.parsePaths(f)}if(s&&o){let b=c(r),P=l.findPaths(b,t,e);return this.parsePaths(P)}let 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 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(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,wt.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 pe=(e=>(e.Buy="Buy",e.Sell="Sell",e))(pe||{}),de=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(de||{}),$e=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))($e||{});var{FeeUtils:Mn}=C,vt=class extends It{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 qt(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?Mn.toPct(t.min):void 0,n=t.max?Mn.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: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: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=O.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=O.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: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: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=O.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 Ln=6e3,Qe=1000000000000000n,ee=6,Je=-5,Ze=216e5,_l=3,qn=6;var tn=require("polkadot-api");var H=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:a,poolId:r})=>a==="Stableswap"?{pool:(0,tn.Enum)("Stableswap",r),asset_in:e,asset_out:n}:{pool:(0,tn.Enum)(a),asset_in:e,asset_out:n})}};var 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,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),v=Math.round(a/P),L=Math.round(a/f),N=o/BigInt(f),D=await this.router.getBestSell(t,e,N),U=o<i,V=[];U&&V.push("OrderTooSmall");let Z=D.amountOut*BigInt(f),_t=this.toBlockPeriod(L),rt=D.tradeFee*BigInt(f),Se=H.build(l),Rt={assetIn:t,assetOut:e,errors:V,frequencyMin:S,frequencyOpt:v,frequency:L,tradeCount:f,tradeFee:rt,tradeImpactPct:D.priceImpactPct,tradePeriod:_t,tradeRoute:Se,type:"Dca"};return{...Rt,amountIn:o,amountOut:Z,tradeAmountIn:D.amountIn,tradeAmountOut:D.amountOut,toHuman(){return{...Rt,amountIn:h.toDecimal(o,p),amountOut:h.toDecimal(Z,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 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,v=[];f||P?v.push("OrderTooSmall"):S&&v.push("OrderImpactTooBig");let L=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:L,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:N,toHuman(){return{...U,amountIn:h.toDecimal(i,m),amountOut:h.toDecimal(L,d),tradeAmountIn:h.toDecimal(b.amountIn,m),tradeAmountOut:h.toDecimal(b.amountOut,d),tradeFee:h.toDecimal(N,d)}}}}async getTwapBuyOrder(t,e,n){let[a,r]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestBuy(t,e,n)]),{amountOut:i,swaps:s,priceImpactPct:o}=r,l=s[0],c=s[s.length-1],{assetInDecimals: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,v=b.priceImpactPct<-5,L=[];S||f?L.push("OrderTooSmall"):v&&L.push("OrderImpactTooBig");let N=b.tradeFee*BigInt(g),D=H.build(s),U={assetIn:t,assetOut:e,errors:L,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 a=216e5/(this.blockTime*6);return Math.round(a)}return e}getTwapExecutionTime(t){return t*6*this.blockTime}toBlockPeriod(t){let e=t/this.blockTime,n=Math.round(e);return Math.max(n,6)}};var nn={};x(nn,{BIG_10:()=>Hn,BIG_BILL:()=>Un,StakingApi:()=>ne,StakingClient:()=>ae});var Nn=require("@polkadot/util-crypto"),Gn=require("@polkadot/util"),pt=require("@galacticcouncil/math-staking"),mt=gt(require("big.js")),Hn=(0,mt.default)(10),Un=(0,mt.default)(Hn.pow(12));function Oa(u){return(0,Nn.encodeAddress)((0,Gn.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=Oa(t);return(await this.balanceClient.getBalance(e,0)).transferable}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]),a=e?.created_at,r=await n.reduce(async(i,[s,o])=>{let l=await i,c=s,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=(0,mt.default)(o.toString()).minus(a.toString()),p=r.toString(),g=(0,mt.default)(e).plus(1).toString();d.gt(0)&&i>0&&(p=(0,pt.calculate_accumulated_rps)(r.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(Un).toString()}};var ae=class extends k{async getPalletId(){let t=this.api.constants.Staking.PalletId;return(await t()).asText()}async getPeriodLength(){let t=this.api.constants.Staking.PeriodLength;return await t()}async getUnclaimablePeriods(){let t=this.api.constants.Staking.UnclaimablePeriods;return await t()}async getNFTCollectionId(){let t=this.api.constants.Staking.NFTCollectionId;return await t()}async getStaking(){return await this.api.query.Staking.Staking.getValue()}async getUniques(t,e){return(await this.api.query.Uniques.Account.getEntries(t,e)).map(({keyArgs:i})=>{let[s,o,l]=i;return{address:s,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var rn={};x(rn,{TxBuilderFactory:()=>Bt});var an=require("polkadot-api");function Vn(u){let t=[],e=u;for(;e&&typeof e=="object"&&"type"in e;)t.push(e.type),e=e.value;return t.join(".")}var 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,an.Enum)("Signed",t),a=(0,an.Enum)("system",n),i=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(a,e.decodedCall),s=i.success&&!i.value.execution_result.success?i.value.execution_result.value.error:null;if(s){let o=Vn(s.value);throw new Error("Dry run execution error!",{cause:o})}return i}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var ge=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:a}=e[0],r=await this.balanceClient.getBalance(this.beneficiary,a);return t>=r.transferable-5n?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,a=n[0],r=n[n.length-1],i=O.getFraction(t,this.slippagePct),s=a.assetIn,o=r.assetOut,l=t+i,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:s,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:s,asset_out:o,amount_out:e,max_amount_in:l,route:H.build(n)}),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:t,amountOut:e,swaps:n}=this.trade,a=n[0],r=n[n.length-1],i=O.getFraction(e,this.slippagePct),s=a.assetIn,o=r.assetOut,l=e-i,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:s,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:s,asset_out:o,amount_in:t,min_amount_out:l,route:H.build(n)}),a.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=await this.dispatchWithExtraGas(c)),this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:t,swaps:e}=this.trade,n=e[0],a=e[e.length-1],r=O.getFraction(t,this.slippagePct),i=n.assetIn,s=a.assetOut,o=t-r,l=this.api.tx.Router.sell_all({asset_in:i,asset_out:s,min_amount_out:o,route:H.build(e)});return n.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=await this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}};var be=require("polkadot-api");var ye=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:a,tradePeriod:r,tradeRoute:i}=this.order,s=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:r,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,be.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:a,min_amount_out:0n,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",s)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:a,tradeAmountOut:r,tradePeriod:i,tradeRoute:s}=this.order,o=O.getFraction(r,this.slippagePct),l=r-o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,be.Enum)("Sell",{asset_in:e,asset_out:n,amount_in:a,min_amount_out:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:a,tradeAmountOut:r,tradePeriod:i,tradeRoute:s}=this.order,o=O.getFraction(a,this.slippagePct),l=a+o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:i,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:(0,be.Enum)("Buy",{asset_in:e,asset_out:n,amount_out:r,max_amount_in:l,route:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapBuy",c)}};var Bt=class{client;evmClient;constructor(t,e){this.client=t,this.evmClient=e}trade(t){return new ge(this.client,this.evmClient).setTrade(t)}order(t){return new ye(this.client,this.evmClient).setOrder(t)}};var Wn=require("polkadot-api"),sn=require("@galacticcouncil/math-liquidity-mining"),M=gt(require("big.js"));var Aa=(0,M.default)(365.2425).times(24).times(60).times(60),Ba=BigInt((0,M.default)(1).pow(18).toString()),_a=6,he=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 Ba;let a=await this.client.getOraclePrice(n);if(a){let{n:r,d:i}=a[0].price,s;return t<e?s=(0,sn.fixed_from_rational)(r.toString(),i.toString()):s=(0,sn.fixed_from_rational)(i.toString(),r.toString()),BigInt(s)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),a=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),r=Buffer.from([t]),i=Buffer.concat([n,a,r]),o="0x"+Buffer.concat([i,Buffer.alloc(32-i.length)]).toString("hex");return(0,Wn.AccountId)(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,a){let r=(0,M.default)(a).times(t.toString()).times(e.toString()).div(18);return r.gte(n.toString())?n.toString():r.toString()}getPoolYieldPerPeriod(t,e,n,a){let r=(0,M.default)(t.toString()).times(e),i=(0,M.default)(n.toString()).times(a);return r.div(i.toString()).toString()}farmData(t,e,n){let{yieldFarm:a,globalFarm:r,priceAdjustment:i,balance:s}=t,{multiplier:o,loyalty_curve:l}=a,{blocks_per_period:c,yield_per_period:m,total_shares_z:d,max_reward_per_period:p,pending_rewards:g,accumulated_paid_rewards:y,planned_yielding_periods:b,updated_at:P,incentivized_asset:f,reward_currency:S,price_adjustment:v}=r,L=Dt(i??v,18),N=Dt(o,18),D=Dt(l?.initial_reward_percentage??0,18),U=Aa.div((0,M.default)(_a).times(c)).toString(),V;if(d<0)V=(0,M.default)(N).times(m.toString()).times(U).toString();else{let jn=this.getGlobalRewardPerPeriod(d,m,p,L),zn=this.getPoolYieldPerPeriod(jn,N,d,L);V=(0,M.default)(zn).times(U).toString()}let Z=g+y,_t=p*BigInt(b),rt=s.transferable+Z,Se=rt-Z,Rt=(0,M.default)(Se.toString()).div(p.toString()),on=(0,M.default)(e).div(c.toString()).toString(),Yn=(d>=0?Rt.plus(P):Rt.plus(on)).toString(),Xn=(0,M.default)(d.toString()).div((0,M.default)(p.toString()).div(m.toString())).div(Math.pow(10,18)).times(100).times(L).toFixed(2),ln=(0,M.default)(Z.toString()).div(rt.toString()).gte(.999);V=ln?"0":(0,M.default)(V).div(n?2:1).times(100).toString();let Kn=D?(0,M.default)(V).times(D).toString():void 0;return{apr:V,minApr:Kn,isDistributed:ln,estimatedEndPeriod:Yn,maxRewards:_t,incentivizedAsset:f,rewardCurrency:S,loyaltyCurve:l,currentPeriod:on,potMaxRewards:rt,fullness:Xn}}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.getTokenBalance(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 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):[]}};var fe=require("polkadot-api"),Pe=class extends k{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(fe.Binary.fromText("omnipool"),t,(0,fe.Enum)("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,n){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,n)}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,n){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,n)}};async function Ra(u){let t=new Pt(u),e=new Nt(u),[n,a]=await Promise.all([t.getBlockTime(),t.getMinOrderBudget()]),r=new xt(u,e).withAave().withOmnipool().withStableswap().withXyk(),i=new it(e),s=new vt(r),o=new Ot(s,{blockTime:n,minBudgetInNative:a}),l=new K(u),c=new ae(u),m=new ne(c,l),d=new Pe(u),p=new he(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:r},tx:new Bt(u,e),destroy:()=>{r.destroy()}}}0&&(module.exports={aave,api,big,client,const:null,createSdkContext,erc20,error,evm,fmt,h160,json,math,pool,sor,staking,tx,xc});
|
package/build/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var Pn=Object.defineProperty;var T=(u,t)=>{for(var e in t)Pn(u,e,{get:t[e],enumerable:!0})};var Be={};T(Be,{Papi:()=>B,getWs:()=>wn});import{hydration as fn}from"@galacticcouncil/descriptors";function Ae(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(fn)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Ae(n)&&console.log(t,...e)}};import{createClient as Sn}from"polkadot-api";import{withPolkadotSdkCompat as Tn}from"polkadot-api/polkadot-sdk-compat";var wn=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 Sn(Tn(a))};var De={};T(De,{AAVE_GAS_LIMIT:()=>ne,AAVE_LENDING_POOL_ADDRESS:()=>Wt,AAVE_POOL_ABI:()=>te,AAVE_POOL_DATA_PROVIDER:()=>Vt,AAVE_POOL_DATA_PROVIDER_ABI:()=>Ut,AAVE_POOL_PROXY:()=>ee,AAVE_ROUNDING_THRESHOLD:()=>jr,AAVE_UINT_256_MAX:()=>xn,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 Ut=[{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",Vt="0x112b087b60C1a166130d59266363C45F8aa99db0",Wt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",ne=1000000n,jr=5,xn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var ht=class{client;constructor(t){this.client=t.getWsProvider()}async getReservesData(){return await this.client.readContract({abi:Ut,address:Vt,args:[Wt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:Ut,address:Vt,args:[Wt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:te,address:ee,args:[t],functionName:"getUserAccountData"})}};var h={};T(h,{asBigInt:()=>On,toBigInt:()=>vn,toDecimal:()=>In});import z from"big.js";z.NE=-18;function In(u,t,e=6,n){let a=z(u.toString()),r=z(10).pow(t);return a.div(r).round(e,n).toString()}function vn(u,t){let e=z(10).pow(t),a=z(u).mul(e).toFixed(0,z.roundDown);return BigInt(a)}function On(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 _n from"big.js";var _e={};T(_e,{HUB_ASSET_ID:()=>se,HYDRATION_OMNIPOOL_ADDRESS:()=>Bn,HYDRATION_PARACHAIN_ID:()=>An,HYDRATION_SS58_PREFIX:()=>k,PERBILL_DENOMINATOR:()=>re,PERMILL_DENOMINATOR:()=>Pt,RUNTIME_DECIMALS:()=>I,SYSTEM_ASSET_DECIMALS:()=>ie,SYSTEM_ASSET_ID:()=>N,TRADEABLE_DEFAULT:()=>et});var I=18,Pt=1e6,re=1e9,N=0,ie=12,An=2034,k=63,Bn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",se=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=_n(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Yt={};T(Yt,{H160:()=>ce,isEvmAccount:()=>Fe,isEvmAddress:()=>Ee,isSs58Address:()=>ke});import{AccountId as St}from"polkadot-api";import{toHex as Re}from"@polkadot-api/utils";import{Buffer as Y}from"buffer";var le="ETH\0";function Fe(u){if(!u)return!1;try{let t=St().enc(u),e=Y.from(le);return Y.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Ee(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function ke(u){try{return St(63).enc(u),!0}catch{return!1}}var ce=class u{static toAccount=t=>{let e=Y.from(t.slice(2),"hex"),n=Y.from(le),a=Uint8Array.from(Y.concat([n,e,Y.alloc(8)])),r=Re(a);return St(63).dec(r)};static fromAccount=t=>{let e=St().enc(t),n=Y.from(le),a=e.slice(n.length,-8);return"0x"+Y.from(a).toString("hex")};static fromSS58=t=>{let n=St().enc(t).slice(0,20);return Re(n)};static fromAny=t=>{if(Ee(t))return t;if(Fe(t))return u.fromAccount(t);if(ke(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var $={};T($,{findNestedKey:()=>Rn,findNestedObj:()=>Fn,jsonFormatter:()=>En});var Rn=(u,t)=>{let e=[];return JSON.stringify(u,(n,a)=>(a&&a[t]&&e.push(a),a)),e[0]},Fn=(u,t,e)=>{let n;return JSON.stringify(u,(a,r)=>(r&&r[t]===e&&(n=r),r)),n},En=(u,t)=>typeof t=="bigint"?t.toString():t;var v={};T(v,{calculateBuyFee:()=>Mn,calculateDiffToAvg:()=>kn,calculateDiffToRef:()=>Cn,calculateSellFee:()=>Dn,getFraction:()=>Ln});import U from"big.js";function kn(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 Cn(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 Dn(u,t){let e=U(u.toString()),n=U(t.toString());return U(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Mn(u,t){let e=U(u.toString());return U(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Ln(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 Ce={};T(Ce,{convertToId:()=>Nn});import{Buffer as qn}from"buffer";function Nn(u){let e=qn.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Xt}=tt,{H160:ue}=Yt,Gn=1.01,Hn=99999,Un=10n**27n,Vn=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)]),[s]=n,[i,o]=a,[l,c,m,d,p,g]=r,y=h.toDecimal(g,18),b=[];for(let P of i){let f=P.underlyingAsset.toLowerCase(),S=s.find(({underlyingAsset:j})=>j.toLowerCase()===f);if(!S)throw new Error("Missing pool reserve for "+f);let w=P.scaledATokenBalance,F=S.liquidityIndex,C=S.priceInMarketReferenceCurrency,_=w*F/Un,q=Number(o===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,W=S.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,bt=Xt.toAssetId(f);b.push({aTokenBalance:_,decimals:Number(S.decimals),isCollateral:W,priceInRef:C,reserveId:bt,reserveAsset:f,reserveLiquidationThreshold:q})}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,s,i,o,l]=n,c=h.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:a,totalDebt:r,reserves:s}=await this.getSummary(t),i=Xt.fromAssetId(e),o=s.find(b=>b.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,isCollateral:c,priceInRef:m,reserveLiquidationThreshold:d}=o,p=h.toBigInt(n,l),g=c?p*m/10n**BigInt(l):0n,y=a-g;return y<=0n?0:this.calculateHealthFactor(y,d,r)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:a,totalDebt:r,reserves:s}=await this.getSummary(t),i=Xt.fromAssetId(e),o=s.find(y=>y.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:m}=o,p=h.toBigInt(n,l)*c/10n**BigInt(l),g=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),s=Xt.fromAssetId(e),i=r.find(o=>o.reserveAsset===s);if(!i)throw new Error("Missing reserve ctx for "+s);return this.calculateWithdrawMax(i,n,a)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:a}=await this.getSummary(t),r={};for(let s of a){let i=this.calculateWithdrawMax(s,e,n);s.reserveId&&(r[s.reserveId]=i)}return r}calculateHealthFactor(t,e,n){if(n===0n)return Hn;let a=10n**6n,r=h.toBigInt(e,18),s=t*r*a,i=n*Vn,o=s/i;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:s,reserveLiquidationThreshold:i}=t,o=this.calculateRequiredCollateral(Gn,i,n),l=e-o;if(l<=0n)return{amount:0n,decimals:r};let c=l*10n**BigInt(r)/s;return{amount:a<c?a:c,decimals:r}}};var qe={};T(qe,{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:s,is_sufficient:i,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:r?.asText(),symbol:l,decimals:c,icon:l,type:s.type,isSufficient:i,location:a,existentialDeposit:o}}async mapBond(t,e,n,a){let[r,s]=a,{asset_type:i,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:m}=await this.mapToken(r,e,n),d=Number(s),p=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",p.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:m,icon:c,type:i.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:r,maturity:d}}async mapShares(t,e,n,a){let{assets:r}=a,{name:s,symbol:i,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:i?.asText()||s?.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),s=n?.find(i=>i.internalId===r.id);return s?{...r,decimals:s.decimals,name:s.name,symbol:s.symbol,icon:s.symbol,isWhiteListed:s.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,s]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),i=this.parseMetadata(n),o=[];for(let[l,c]of Array.from(n)){let m=a.get(l),{asset_type:d}=c,p;switch(d.type){case"Bond":let g=s.get(l);p=await this.mapBond(l,c,i,g);break;case"StableSwap":let y=r.get(l);p=await this.mapShares(l,c,i,y);break;case"External":p=await this.mapExternal(l,c,e,m);break;default:p=await this.mapToken(l,c,i,m)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};import{Subject as Wn,bufferCount as Yn,combineLatest as Xn,debounceTime as Kn,distinctUntilChanged as Me,finalize as jn,map as at,pairwise as zn,shareReplay as $n,startWith as Qn}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 Xn([e,n,a]).pipe(Kn(250),at(r=>r.flat()),Qn([]),Yn(2,1),at(([r,s],i)=>{if(i===0)return s;let o=r.reduce((c,m)=>(c.set(m.id,m.balance),c),new Map);return s.filter(c=>!Le(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(Me((n,a)=>!a.deltas),at(({deltas:n})=>{let a=[];return n?.deleted.forEach(r=>{let[s,i]=r.args;a.push({id:i,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(r=>{let[s,i]=r.args;a.push({id:i,balance:this.calculateBalance(r.value)})}),a}))}subscribeErc20Balance(t,e){let n=new Wn,a=n.pipe($n(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}),s=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()},i;return s().then(o=>i=o),a.pipe(jn(()=>i?.()),zn(),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=>!Le(p.balance,m.get(p.id)))}),Me((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},Le=(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 Ne={};T(Ne,{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 Ue={};T(Ue,{EvmClient:()=>xt,createChain:()=>pe});import{defineChain as Jn}from"viem";var Zn=["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=()=>Jn({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Zn}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});import{createPublicClient as Ge,createWalletClient as ta,custom as He,http as ea}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 Ge({chain:this.chain,transport:ea()})}getWsProvider(){return Ge({transport:He({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return ta({account:t,chain:this.chain,transport:He(window.ethereum)})}};var Je={};T(Je,{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 na,calculate_out_given_in as aa,calculate_linear_weights as ra,calculate_pool_trade_fee as ia,get_spot_price as sa}from"@galacticcouncil/math-lbp";var G=class{static getSpotPrice(t,e,n,a,r){return sa(t,e,n,a,r)}static calculateInGivenOut(t,e,n,a,r){return na(t,e,n,a,r)}static calculateOutGivenIn(t,e,n,a,r){return aa(t,e,n,a,r)}static calculateLinearWeights(t,e,n,a,r){return ra(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:Ve}=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,s,i){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r,this.fee=s,this.repayFeeApply=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),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 s=t.balanceOut/this.maxOutRatio;if(e>s&&r.push("MaxOutRatioExceeded"),a===t.assetOut){let i=this.calculateTradeFee(e,n),o=Ve.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+i,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 i=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return i>o&&r.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:i,amountOut:e,feePct:0,errors:r}}}validateAndSell(t,e,n){let a=this.tokens[0].id,r=[];e<this.minTradingLimit&&r.push("InsufficientTradingAmount");let s=t.balanceIn/this.maxInRatio;if(e>s&&r.push("MaxInRatioExceeded"),a===t.assetIn){let i=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return i>o&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:i,feePct:0,errors:r}}else{let i=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(i,n),l=Ve.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=i-o,m=t.balanceOut/this.maxOutRatio;return c>m&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,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 da}from"polkadot-api";import{map as ga,of as je,switchMap as ba}from"rxjs";import{memoize1 as oa}from"@thi.ng/memoize";import{combineLatest as We,combineLatestAll as la,debounceTime as ca,firstValueFrom as ua,from as Ye,map as Xe,mergeAll as ma,of as pa,switchMap as Ke}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()]),[s,i,o,l]=n,c=r.number-(r.timestamp-l)/BigInt(e),m=Number(c);return{price:i,decimals:a,updatedAt:m<0?0:m}}};var D=class extends H{evm;mmOracle;override=[];mem=0;memPools=oa(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=Ye(this.getPoolsMem()).pipe(Ke(e=>this.subscribe(e)),la());return ua(t)}getSubscriber(){return Ye(this.getPoolsMem()).pipe(Ke(t=>this.subscribe(t)),ma())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>We([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe(ca(250),Xe(([n,a])=>this.updatePool(n,a))))}subscribePoolBalance(t){if(t.type==="Aave")return pa([]);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 We(e).pipe(Xe(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(i=>i.id===e),s=!!n||!!r?.decimals;return a>0n&&s})}updatePool=(t,e)=>{let n=t.tokens.map(a=>{let r=e.find(i=>i.id===a.id),s=this.override.find(i=>i.id===a.id);return r?{...a,balance:r.balance.transferable,decimals:a.decimals||s?.decimals}:{...a,decimals:a.decimals||s?.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:s})=>e&&this.isActivePool(s,a)).map(async({keyArgs:s,value:i})=>{let[o]=s,l=o.toString(),c=await this.getPoolDelta(l,i,a);return{address:l,type:"LBP",fee:i.fee,...c,...n}});return Promise.all(r)}async getPoolDelta(t,e,n){let{start:a,end:r,assets:s,initial_weight:i,final_weight:o,repay_target:l,fee_collector:c}=e,m=G.calculateLinearWeights(a?a.toString():"0",r?r.toString():"0",i.toString(),o.toString(),n.toString()),[d,p]=s,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(da.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe(ba(a=>a?this.getPoolDelta(t.address,n,a.relay_parent_number):je(t)),ga(a=>Object.assign({},t,a))):je(t)}};var be={};T(be,{OmniMath:()=>x,OmniPool:()=>At,OmniPoolClient:()=>Bt});import{calculate_in_given_out as ya,calculate_lrna_in_given_out as ha,calculate_out_given_in as Pa,calculate_out_given_lrna_in as fa,calculate_spot_price as Sa,calculate_lrna_spot_price as Ta,calculate_shares as wa,calculate_liquidity_out as xa,calculate_liquidity_lrna_out as Ia,verify_asset_cap as va,calculate_liquidity_hub_in as Oa,is_sell_allowed as Aa,is_buy_allowed as Ba,is_add_liquidity_allowed as _a,is_remove_liquidity_allowed as Ra}from"@galacticcouncil/math-omnipool";import it from"big.js";var x=class{static calculateSpotPrice(t,e,n,a){return Sa(t,e,n,a)}static calculateLrnaSpotPrice(t,e){return Ta(t,e)}static calculateInGivenOut(t,e,n,a,r,s,i,o,l){return ya(t,e,n,a,r,s,i,o,l)}static calculateLrnaInGivenOut(t,e,n,a,r){return ha(t,e,n,a,r)}static calculateOutGivenIn(t,e,n,a,r,s,i,o,l){return Pa(t,e,n,a,r,s,i,o,l)}static calculateOutGivenLrnaIn(t,e,n,a,r){return fa(t,e,n,a,r)}static calculateShares(t,e,n,a){return wa(t,e,n,a)}static calculateLiquidityOut(t,e,n,a,r,s,i,o){return xa(t,e,n,a,r,s,i,o)}static calculateLiquidityLRNAOut(t,e,n,a,r,s,i,o){return Ia(t,e,n,a,r,s,i,o)}static calculateCapDifference(t,e,n,a){let r=it(e),s=it(t),i=it(a),o=it(n),l=it(10).pow(18),c=o.div(l);if(r.div(i).lt(c)){let d=c.times(i).minus(r).times(s),p=r.times(it(1).minus(c));return d.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,a){return va(t,e,n,a)}static calculateLimitHubIn(t,e,n,a){return Oa(t,e,n,a)}static isSellAllowed(t){return Aa(t)}static isBuyAllowed(t){return Ba(t)}static isAddLiquidityAllowed(t){return _a(t)}static isRemoveLiquidityAllowed(t){return Ra(t)}};var{FeeUtils:st}=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,s){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r,this.hubAssetId=s}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),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),s=a===0n?0:v.calculateDiffToRef(r,a),i=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&i.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&i.push("MaxOutRatioExceeded");let m=t.balanceIn/this.maxInRatio;return r>m&&i.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:a,amountOut:e,feePct:s,errors:i}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,n),s=v.calculateDiffToRef(a,r),i=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&i.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&i.push("MaxInRatioExceeded");let m=t.balanceOut/this.maxOutRatio;return r>m&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:r,feePct:s,errors:i}}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?st.toRaw(n.assetFee).toString():"0",n?st.toRaw(n.protocolFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}calculateLrnaInGivenOut(t,e,n){let a=x.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?st.toRaw(n.assetFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let a=x.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?st.toRaw(n.assetFee).toString():"0",n?st.toRaw(n.protocolFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}calculateOutGivenLrnaIn(t,e,n){let a=x.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?st.toRaw(n.assetFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=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 Fa,CompatibilityLevel as Ea}from"polkadot-api";import{toHex as ka}from"@polkadot-api/utils";import{distinctUntilChanged as Ca,map as ze}from"rxjs";var{FeeUtils:X}=R,Bt=class extends D{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,a,r,s,i]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:c,value:m})=>{let[d]=c,{hub_reserve:p,shares:g,tradable: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:s.transferable,tradeable:a,type:r?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...i}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=ka(e);return Fa(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)]),s=n.min_fee+a.min_fee,i=n.max_fee+a.max_fee;if(r){let{asset_fee:o,protocol_fee:l}=r;return{assetFee:X.fromPermill(o),protocolFee:X.fromPermill(l),min:X.fromPermill(s),max:X.fromPermill(i)}}else return{assetFee:X.fromPermill(n.min_fee),protocolFee:X.fromPermill(a.min_fee),min:X.fromPermill(s),max:X.fromPermill(i)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(Ea.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(Ca((n,a)=>!a.deltas),ze(({entries:n})=>n.map(a=>{let[r]=a.args,{hub_reserve:s,shares:i,tradable:o,cap:l,protocol_shares:c}=a.value,m=t.tokens.findIndex(p=>p.id===r);return{...t.tokens[m],cap:l,hubReserves:s,protocolShares:c,shares:i,tradeable:o}})),ze(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 Da,calculate_out_given_in as Ma,calculate_amplification as La,calculate_add_one_asset as qa,calculate_liquidity_out_one_asset as Na,calculate_shares as Ga,calculate_shares_for_amount as Ha,calculate_spot_price_with_fee as Ua,pool_account_name as Va,recalculate_peg as Wa}from"@galacticcouncil/math-stableswap";var A=class{static getPoolAddress(t){return Va(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 La(t,e,n,a,r)}static calculateInGivenOut(t,e,n,a,r,s,i){return Da(t,e,n,a,r,s,i)}static calculateAddOneAsset(t,e,n,a,r,s,i){return qa(t,e,n,a,r,s,i)}static calculateSharesForAmount(t,e,n,a,r,s,i){return Ha(t,e,n,a,r,s,i)}static calculateOutGivenIn(t,e,n,a,r,s,i){return Ma(t,e,n,a,r,s,i)}static calculateLiquidityOutOneAsset(t,e,n,a,r,s,i){return Na(t,e,n,a,r,s,i)}static calculateShares(t,e,n,a,r,s){return Ga(t,e,n,a,r,s)}static calculateSpotPriceWithFee(t,e,n,a,r,s,i,o){return Ua(t,e,n,a,r,s,i,o)}static recalculatePegs(t,e,n,a,r){let s=Wa(t,e,n,a,r);return JSON.parse(s)}};var{FeeUtils:K}=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,s,i,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r,this.amplification=s,this.id=i,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),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),s=K.toPct(n.fee),i=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&i.push("InsufficientTradingAmount"),{amountIn:r,calculatedIn:a,amountOut:e,feePct:s,errors:i}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,n),s=K.toPct(n.fee),i=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&i.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:a,amountOut:r,feePct:s,errors:i}}calculateIn(t,e,n){let a=A.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?K.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?K.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?K.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?K.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?K.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?K.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 Ya,CompatibilityLevel as Xa}from"polkadot-api";import{toHex as Ka}from"@polkadot-api/utils";import{blake2b as ja}from"@noble/hashes/blake2b";import{map as za,of as $a,switchMap as Qa}from"rxjs";var{FeeUtils:Z}=R,Rt=class extends D{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=A.getPoolAddress(t),n=ja(e,{dkLen:32}),a=Ka(n);return Ya(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:s,final_block:i}=e,o=A.calculateAmplification(a.toString(),r.toString(),s.toString(),i.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),a=e.assets.map(async r=>{let[s,i,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:i?.decimals,existentialDeposit:i?.existential_deposit,balance:o.transferable,tradeable:s,type:i?.asset_type.type}});return Promise.all(a)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(Xa.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:s})=>{let[i]=r,o=this.getPoolAddress(i),[l,c,m]=await Promise.all([this.getPoolDelta(i,s,e),this.getPoolTokens(i,s),this.getPoolPegs(i,s,e)]);return c.push({id:i,tradeable:15,balance:l.totalIssuance,decimals:18}),this.poolsData.set(o,s),{address:o,id:i,type:"Stableswap",fee:Z.fromPermill(s.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),s=this.getRecentPegs(a),i=Z.fromPermill(a.max_peg_update),o=Z.fromPermill(e.fee),[l,c]=A.recalculatePegs(JSON.stringify(s),JSON.stringify(r),n.toString(),Z.toRaw(i).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(([i,o])=>o),s=a.map(async(i,o)=>{if(i.type==="Oracle"){let[l,c,m]=i.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(i.type==="MMOracle"){let l=i.value.asHex(),{price:c,decimals:m,updatedAt:d}=await this.mmOracle.getData(l),p=10**m;return[[c.toString(),p.toString()],d.toString()]}else return[i.value.map(l=>l.toString()),n.toString()]});return Promise.all(s)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?$a(t):e.watchValue("best").pipe(Qa(a=>Promise.all([this.getPoolDelta(t.id,n,a),this.getPoolPegs(t.id,n,a)])),za(([a,r])=>{let s=t.tokens.map(i=>i.id===t.id?{...i,balance:a.totalIssuance}:i);return Object.assign(t,{tokens:s},a,r)}))}};var he={};T(he,{XykMath:()=>V,XykPool:()=>Ft,XykPoolClient:()=>Et});import{calculate_in_given_out as Ja,calculate_out_given_in as Za,calculate_pool_trade_fee as tr,get_spot_price as er,calculate_liquidity_in as nr,calculate_shares as ar,calculate_spot_price as rr,calculate_spot_price_with_fee as ir,calculate_liquidity_out_asset_a as sr,calculate_liquidity_out_asset_b as or}from"@galacticcouncil/math-xyk";var V=class{static getSpotPrice(t,e,n){return er(t,e,n)}static calculateInGivenOut(t,e,n){return Ja(t,e,n)}static calculateOutGivenIn(t,e,n){return Za(t,e,n)}static calculatePoolTradeFee(t,e,n){return tr(t,e,n)}static calculateLiquidityIn(t,e,n){return nr(t,e,n)}static calculateSpotPrice(t,e){return rr(t,e)}static calculateSpotPriceWithFee(t,e,n,a){return ir(t,e,n,a)}static calculateShares(t,e,n){return ar(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,a){return sr(t,e,n,a)}static calculateLiquidityOutAssetB(t,e,n,a){return or(t,e,n,a)}};var{FeeUtils:$e}=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(s=>[s.id,s])),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),s=$e.toPct(n.exchangeFee),i=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 i>c&&o.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:a,amountOut:e,feePct:s,errors:o}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=this.calculateTradeFee(a,n),s=$e.toPct(n.exchangeFee),i=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 i>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:i,feePct:s,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 lr}from"polkadot-api";import{of as cr}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:s})=>{let[i]=r,[o,l]=s,[c,m,d,p]=await Promise.all([this.getBalance(i,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(i,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:i,type:"XYK",tokens:[{id:o,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:c.transferable,type:m?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:d.transferable,type:p?.asset_type.type}],...n}});return Promise.all(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(lr.BackwardsCompatible,e)}subscribePoolChange(t){return cr(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(s=>[s.id,s])),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 ur}from"polkadot-api";import{toHex as mr}from"@polkadot-api/utils";import{map as pr,merge as dr,switchMap as gr}from"rxjs";import{decodeEventLog as br}from"viem";var Qe=[{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:yr}=tt,hr=["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:s})=>{let[i,o,l,c]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(a),this.api.query.AssetRegistry.AssetLocations.getValue(a)]);return{address:this.getPoolId(n,a),type:"Aave",tokens:[{id:n,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:r,location:o,type:i?.asset_type.type},{id:a,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:s,location:c,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:a,liqudity_out:r}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(s=>{let i=s.id===e.id?a:r;return{...s,balance:i}})}getPoolId(t,e){let n=t+"/"+e,a=new TextEncoder().encode(n.padEnd(32,"\0")),r=mr(a);return ur(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:i,asset_out:o})=>i===n.id||o===n.id),s=this.api.event.EVM.Log.watch(({log:i})=>{let{topics:o,data:l}=i,c=o.map(g=>g.asHex()),m=l.asHex(),{eventName:d,args:p}=br({abi:Qe,topics:c,data:m});return hr.includes(d)&&p.reserve.toLowerCase()===a.toLowerCase()});return dr([r,s]).pipe(gr(()=>this.getPoolDelta(t)),pr(i=>({...t,tokens:[...i]})))}getReserveH160Id(t){return t.type==="Erc20"?$.findNestedKey(t.location,"AccountKey20").AccountKey20.key:yr.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 Pr,Subscription as Dt,takeUntil as fr}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 Pr;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(fr(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),s=async i=>{let o=i.getPoolType();return a.size>0?a.has(o):r.size>0?!r.has(o):i.isSupported()};return this.getFilteredPools(s)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((r,s)=>e[s]);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 an={};T(an,{DEFAULT_BLOCK_TIME:()=>tn,DEFAULT_MIN_BUDGET:()=>Te,ORDER_MIN_BLOCK_PERIOD:()=>en,Router:()=>ct,TWAP_BLOCK_PERIOD:()=>Nt,TWAP_MAX_DURATION:()=>xe,TWAP_MAX_PRICE_IMPACT:()=>we,TWAP_TX_MULTIPLIER:()=>ou,TradeOrderError:()=>Se,TradeOrderType:()=>jt,TradeRouteBuilder:()=>M,TradeRouter:()=>ut,TradeScheduler:()=>mt,TradeType:()=>Kt});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 Sr=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,s=[];for(s.push([e,""]),r.enqueue(s);r.size()>0;){let i=r.dequeue();if(!i||i.length>Sr)continue;let o=i[i.length-1];(n===null||o[0]===n)&&a.push(i),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,i)){let m=[...i];m.push(c),r.enqueue(m)}})}return a}findShortestPaths(t,e,n){let a=[],r=new Mt,s=[];s.push([e,""]),r.enqueue(s);let i=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<i?(i=o.length,a.length=0,a.push(o)):o.length===i&&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,s]of e)n.get(r)?.push([s,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 s=[e.address,e.tokens[a].id,e.tokens[r].id];t[e.tokens[a].id].push(s)}}}return t}var qt=class{getProposals(t,e,n){let a=n.filter(b=>b.type==="XYK"),r=n.filter(b=>b.type!=="XYK"),s=new Set(r.map(b=>b.tokens).flat().map(b=>b.id)),i=s.has(t),o=s.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(!i&&!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(i&&o){let b=c(r),P=l.findPaths(b,t,e);return this.parsePaths(P)}let m=i?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 s=n[r],i=n[r+1];if(i==null)break;a.push(this.toEdge(s,i))}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(s=>this.validPath(s,a)).map(s=>this.toHops(s,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 s=e.get(n);return{poolAddress:n,poolId:s?.id,pool:s?.type,assetIn:a,assetOut:r}})}};var Kt=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Kt||{}),jt=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(jt||{}),Se=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Se||{});var{FeeUtils:Ze}=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,s=a[a.length-1].amountOut;return r>s?-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,s)=>r+s),a=t.map(r=>r.tradeFeeRange?.[1]??r.tradeFeePct).reduce((r,s)=>r+s);return[n,a]}}getPoolFeeRange(t){let e=t.min?Ze.toPct(t.min):void 0,n=t.max?Ze.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(i=>i.assetOutDecimals).reduce((i,o)=>i+o),a=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),r=n-e.assetOutDecimals,s=Math.pow(10,r);return a/BigInt(s)}async getSell(t,e,n,a){return this.withCtx(t,e,async({paths:r,poolsMap:s})=>{let i;if(a)i=await this.toSellSwaps(n,a,s);else{let o=r.map(c=>this.toSellSwaps(n,c,s)),l=await Promise.all(o);i=this.findBestSellRoute(l)}return this.buildSell(s,i)})}buildSell(t,e){let n=e[0],a=e[e.length-1],r=this.isDirectTrade(e),s=this.getSellSpot(e),i=a.amountOut,o=r?a.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-i,c=this.getRouteFeeRange(e),m=r?a.tradeFeePct:v.calculateSellFee(o,i),d=Math.pow(10,n.assetInDecimals),p=n.amountIn*s/BigInt(d),g=v.calculateDiffToRef(o,p);return{type:"Sell",amountIn:n.amountIn,amountOut:a.amountOut,spotPrice:s,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:h.toDecimal(n.amountIn,n.assetInDecimals),amountOut:h.toDecimal(a.amountOut,a.assetOutDecimals),spotPrice:h.toDecimal(s,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 s=e[r],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;r>0?l=a[r-1]:l=t;let c=i.calculateOutGivenIn(o,l);a.push(c)}return a[a.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:a,pools:r,poolsMap:s}=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,s))),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 s=e[r],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.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(i,o.assetOut),{amountOut:m,calculatedOut:d,feePct:p,errors:g}=i.validateAndSell(o,l,c),y=this.getPoolFeeRange(c),b=i.spotPriceOutGivenIn(o),P=Math.pow(10,o.decimalsIn),f=l*b/BigInt(P),S=v.calculateDiffToRef(d,f);a.push({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:m,calculatedOut:d,spotPrice:b,tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===s.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===s.assetIn},toHuman(){return{...s,amountIn:h.toDecimal(l,o.decimalsIn),amountOut:h.toDecimal(m,o.decimalsOut),calculatedOut:h.toDecimal(d,o.decimalsOut),spotPrice:h.toDecimal(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,s=this.buildRouteKey(t,e,a),i=this.mlr.get(s);i||(i=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",i,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,s=a[0].amountIn;return r>s?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(i=>i.assetInDecimals).reduce((i,o)=>i+o),a=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),r=n-e.assetInDecimals,s=Math.pow(10,r);return a/BigInt(s)}async getBuy(t,e,n,a){return this.withCtx(t,e,async({paths:r,poolsMap:s})=>{let i;if(a)i=await this.toBuySwaps(n,a,s);else{let o=r.map(c=>this.toBuySwaps(n,c,s)),l=await Promise.all(o);i=this.findBestBuyRoute(l)}return this.buildBuy(s,i)})}buildBuy(t,e){let n=e[e.length-1],a=e[0],r=this.isDirectTrade(e),s=this.getBuySpot(e),i=a.amountIn,o=r?a.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=i-o,c=this.getRouteFeeRange(e),m=r?a.tradeFeePct:v.calculateBuyFee(o,i),d=Math.pow(10,n.assetOutDecimals),p=n.amountOut*s/BigInt(d),g;return o===0n?g=-100:g=v.calculateDiffToRef(p,o),{type:"Buy",amountOut:n.amountOut,amountIn:a.amountIn,spotPrice:s,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:h.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:h.toDecimal(a.amountIn,a.assetInDecimals),spotPrice:h.toDecimal(s,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 s=e[r],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;r==e.length-1?l=t:l=a[0];let c=i.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 s=e[r],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.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(i,o.assetOut),{amountIn:m,calculatedIn:d,feePct:p,errors:g}=i.validateAndBuy(o,l,c),y=this.getPoolFeeRange(c),b=i.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({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:m,calculatedIn:d,spotPrice:b,tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===s.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===s.assetIn},toHuman(){return{...s,amountOut:h.toDecimal(l,o.decimalsOut),amountIn:h.toDecimal(m,o.decimalsIn),calculatedIn:h.toDecimal(d,o.decimalsIn),spotPrice:h.toDecimal(b,o.decimalsIn),tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g}}})}return a}};var tn=6e3,Te=1000000000000000n,Nt=6,we=-5,xe=216e5,ou=3,en=6;import{Enum as nn}from"polkadot-api";var M=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:a,poolId:r})=>a==="Stableswap"?{pool:nn("Stableswap",r),asset_in:e,asset_out:n}:{pool:nn(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[s,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=i,m=l[0],d=l[l.length-1],{assetInDecimals:p}=m,{assetOutDecimals:g}=d,y=Math.abs(c),b=this.getMinimumTradeCount(o,s),P=this.getOptimalTradeCount(y),f=r?Math.round(a/r):P,S=Math.ceil(a/b),w=Math.round(a/P),F=Math.round(a/f),C=o/BigInt(f),_=await this.router.getBestSell(t,e,C),L=o<s,q=[];L&&q.push("OrderTooSmall");let W=_.amountOut*BigInt(f),bt=this.toBlockPeriod(F),j=_.tradeFee*BigInt(f),Zt=M.build(l),yt={assetIn:t,assetOut:e,errors:q,frequencyMin:S,frequencyOpt:w,frequency:F,tradeCount:f,tradeFee:j,tradeImpactPct:_.priceImpactPct,tradePeriod:bt,tradeRoute:Zt,type:"Dca"};return{...yt,amountIn:o,amountOut:W,tradeAmountIn:_.amountIn,tradeAmountOut:_.amountOut,toHuman(){return{...yt,amountIn:h.toDecimal(o,p),amountOut:h.toDecimal(W,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:s,swaps:i,priceImpactPct:o}=r,l=i[0],c=i[i.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),y=s/BigInt(g),b=await this.router.getBestSell(l.assetIn,c.assetOut,y),P=g===1,f=s<a,S=b.priceImpactPct<-5,w=[];f||P?w.push("OrderTooSmall"):S&&w.push("OrderImpactTooBig");let F=b.amountOut*BigInt(g),C=b.tradeFee*BigInt(g),_=M.build(i),L={assetIn:t,assetOut:e,errors:w,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:_,type:"TwapSell"};return{...L,amountIn:s,amountOut:F,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:C,toHuman(){return{...L,amountIn:h.toDecimal(s,m),amountOut:h.toDecimal(F,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:s,swaps:i,priceImpactPct:o}=r,l=i[0],c=i[i.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),y=s/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,F=[];S||f?F.push("OrderTooSmall"):w&&F.push("OrderImpactTooBig");let C=b.tradeFee*BigInt(g),_=M.build(i),L={assetIn:t,assetOut:e,errors:F,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:_,type:"TwapBuy"};return{...L,amountIn:P,amountOut:s,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:C,toHuman(){return{...L,amountIn:h.toDecimal(P,m),amountOut:h.toDecimal(s,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 ln={};T(ln,{BIG_10:()=>sn,BIG_BILL:()=>on,StakingApi:()=>Gt,StakingClient:()=>Ht});import{encodeAddress as Tr}from"@polkadot/util-crypto";import{stringToU8a as wr}from"@polkadot/util";import{calculate_accumulated_rps as xr,calculate_period_number as rn,calculate_rewards as Ir}from"@galacticcouncil/math-staking";import pt from"big.js";var sn=pt(10),on=pt(sn.pow(12));function vr(u){return Tr(wr(("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=vr(t);return(await this.balanceClient.getBalance(e,0)).transferable}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]),a=e?.created_at,r=await n.reduce(async(s,[i,o])=>{let l=await s,c=i,m=o.amount,d=o.conviction.toString(),p=await this.client.getReferendumInfo(c);return p&&(p.type==="Approved"||p.type==="Rejected")&&l.push({id:c,amount:m,conviction:d}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt: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(s=>s)?.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:s,stakePosition:i}=n;if(!i)return;let[o,l,c,m]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=pt(o.toString()).minus(a.toString()),p=r.toString(),g=pt(e).plus(1).toString();d.gt(0)&&s>0&&(p=xr(r.toString(),d.toString(),s.toString()));let y=rn(l.toString(),e,m??g),b=rn(l.toString(),i.createdAt?.toString()??"",m??g),P=Ir(p,i.rewardPerStake?.toString()??"",i.stake?.toString()??""),f=pt(P).plus(i.accumulatedUnpaidRewards?.toString()||"0").plus(i.accumulatedLockedRewards?.toString()||"0");if(!pt(y).minus(b).lte(c.toString()))return f.div(on).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:s})=>{let[i,o,l]=s;return{address:i,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var mn={};T(mn,{TxBuilderFactory:()=>gt});import{Enum as un}from"polkadot-api";function cn(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=un("Signed",t),a=un("system",n),s=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(a,e.decodedCall),i=s.success&&!s.value.execution_result.success?s.value.execution_result.value.error:null;if(i){let o=cn(i.value);throw new Error("Dry run execution error!",{cause:o})}return s}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var zt=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],s=v.getFraction(t,this.slippagePct),i=a.assetIn,o=r.assetOut,l=t+s,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:i,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:i,asset_out:o,amount_out:e,max_amount_in:l,route: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],s=v.getFraction(e,this.slippagePct),i=a.assetIn,o=r.assetOut,l=e-s,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:i,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:i,asset_out:o,amount_in:t,min_amount_out:l,route: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),s=n.assetIn,i=a.assetOut,o=t-r,l=this.api.tx.Router.sell_all({asset_in:s,asset_out:i,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 $t=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:s}=this.order,i=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:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",i)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:a,tradeAmountOut:r,tradePeriod:s,tradeRoute:i}=this.order,o=v.getFraction(r,this.slippagePct),l=r-o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:Ie("Sell",{asset_in:e,asset_out:n,amount_in:a,min_amount_out:l,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:a,tradeAmountOut:r,tradePeriod:s,tradeRoute:i}=this.order,o=v.getFraction(a,this.slippagePct),l=a+o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:Ie("Buy",{asset_in:e,asset_out:n,amount_out:r,max_amount_in:l,route:i})},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 zt(this.client,this.evmClient).setTrade(t)}order(t){return new $t(this.client,this.evmClient).setOrder(t)}};import{AccountId as Or}from"polkadot-api";import{fixed_from_rational as pn}from"@galacticcouncil/math-liquidity-mining";import E from"big.js";var Ar=E(365.2425).times(24).times(60).times(60),Br=BigInt(E(1).pow(18).toString()),_r=6,Qt=class{client;balanceClient;omnipoolAssetIds=[];constructor(t,e){this.client=t,this.balanceClient=e}async getOraclePrice(t,e){let n=[t,e].sort((r,s)=>r-s);if(t===e)return Br;let a=await this.client.getOraclePrice(n);if(a){let{n:r,d:s}=a[0].price,i;return t<e?i=pn(r.toString(),s.toString()):i=pn(s.toString(),r.toString()),BigInt(i)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),a=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),r=Buffer.from([t]),s=Buffer.concat([n,a,r]),o="0x"+Buffer.concat([s,Buffer.alloc(32-s.length)]).toString("hex");return Or(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,a){let r=E(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=E(t.toString()).times(e),s=E(n.toString()).times(a);return r.div(s.toString()).toString()}farmData(t,e,n){let{yieldFarm:a,globalFarm:r,priceAdjustment:s,balance:i}=t,{multiplier:o,loyalty_curve:l}=a,{blocks_per_period:c,yield_per_period:m,total_shares_z:d,max_reward_per_period:p,pending_rewards:g,accumulated_paid_rewards:y,planned_yielding_periods:b,updated_at:P,incentivized_asset:f,reward_currency:S,price_adjustment:w}=r,F=ft(s??w,18),C=ft(o,18),_=ft(l?.initial_reward_percentage??0,18),L=Ar.div(E(_r).times(c)).toString(),q;if(d<0)q=E(C).times(m.toString()).times(L).toString();else{let yn=this.getGlobalRewardPerPeriod(d,m,p,F),hn=this.getPoolYieldPerPeriod(yn,C,d,F);q=E(hn).times(L).toString()}let W=g+y,bt=p*BigInt(b),j=i.transferable+W,Zt=j-W,yt=E(Zt.toString()).div(p.toString()),ve=E(e).div(c.toString()).toString(),dn=(d>=0?yt.plus(P):yt.plus(ve)).toString(),gn=E(d.toString()).div(E(p.toString()).div(m.toString())).div(Math.pow(10,18)).times(100).times(F).toFixed(2),Oe=E(W.toString()).div(j.toString()).gte(.999);q=Oe?"0":E(q).div(n?2:1).times(100).toString();let bn=_?E(q).times(_).toString():void 0;return{apr:q,minApr:bn,isDistributed:Oe,estimatedEndPeriod:dn,maxRewards:bt,incentivizedAsset:f,rewardCurrency:S,loyaltyCurve:l,currentPeriod:ve,potMaxRewards:j,fullness:gn}}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:s})=>{let[,i]=r,o=s,l=await this.client.getOmnipoolGlobalFarm(i),c=await this.client.getOmnipoolYieldFarm(Number(t),i,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(i),g=await this.getOraclePrice(m,d),y=await this.balanceClient.getTokenBalance(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 getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),a=await Promise.all(e.map(async({keyArgs:r,value:s})=>{let[,i]=r,o=s,l=await this.client.getIsolatedGlobalFarm(i),c=await this.client.getIsolatedYieldFarm(t,i,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(i,!0),g=await this.getOraclePrice(m,d),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 Rr,Enum as Fr}from"polkadot-api";var Jt=class extends B{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(Rr.fromText("omnipool"),t,Fr("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,n){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,n)}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,n){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,n)}};async function Em(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(),s=new Q(e),i=new ut(r),o=new mt(i,{blockTime:n,minBudgetInNative:a}),l=new H(u),c=new Ht(u),m=new Gt(c,l),d=new Jt(u),p=new Qt(d,l);return{api:{aave:s,router:i,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{De as aave,Be as api,h as big,qe as client,_e as const,Em as createSdkContext,tt as erc20,Ne as error,Ue as evm,R as fmt,Yt as h160,$ as json,v as math,Je as pool,an as sor,ln as staking,mn as tx,Ce as xc};
|
|
1
|
+
var Pn=Object.defineProperty;var T=(u,t)=>{for(var e in t)Pn(u,e,{get:t[e],enumerable:!0})};var Be={};T(Be,{Papi:()=>B,getWs:()=>wn});import{hydration as fn}from"@galacticcouncil/descriptors";function Ae(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(fn)}log(t,...e){let n=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Ae(n)&&console.log(t,...e)}};import{createClient as Sn}from"polkadot-api";import{withPolkadotSdkCompat as Tn}from"polkadot-api/polkadot-sdk-compat";var wn=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 Sn(Tn(a))};var De={};T(De,{AAVE_GAS_LIMIT:()=>ne,AAVE_LENDING_POOL_ADDRESS:()=>Wt,AAVE_POOL_ABI:()=>te,AAVE_POOL_DATA_PROVIDER:()=>Vt,AAVE_POOL_DATA_PROVIDER_ABI:()=>Ut,AAVE_POOL_PROXY:()=>ee,AAVE_ROUNDING_THRESHOLD:()=>jr,AAVE_UINT_256_MAX:()=>xn,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 Ut=[{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",Vt="0x112b087b60C1a166130d59266363C45F8aa99db0",Wt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",ne=1000000n,jr=5,xn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var ht=class{client;constructor(t){this.client=t.getWsProvider()}async getReservesData(){return await this.client.readContract({abi:Ut,address:Vt,args:[Wt],functionName:"getReservesData"})}async getUserReservesData(t){return await this.client.readContract({abi:Ut,address:Vt,args:[Wt,t],functionName:"getUserReservesData"})}async getUserAccountData(t){return await this.client.readContract({abi:te,address:ee,args:[t],functionName:"getUserAccountData"})}};var h={};T(h,{asBigInt:()=>On,toBigInt:()=>vn,toDecimal:()=>In});import z from"big.js";z.NE=-18;function In(u,t,e=6,n){let a=z(u.toString()),r=z(10).pow(t);return a.div(r).round(e,n).toString()}function vn(u,t){let e=z(10).pow(t),a=z(u).mul(e).toFixed(0,z.roundDown);return BigInt(a)}function On(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 _n from"big.js";var _e={};T(_e,{HUB_ASSET_ID:()=>se,HYDRATION_OMNIPOOL_ADDRESS:()=>Bn,HYDRATION_PARACHAIN_ID:()=>An,HYDRATION_SS58_PREFIX:()=>k,PERBILL_DENOMINATOR:()=>re,PERMILL_DENOMINATOR:()=>Pt,RUNTIME_DECIMALS:()=>I,SYSTEM_ASSET_DECIMALS:()=>ie,SYSTEM_ASSET_ID:()=>N,TRADEABLE_DEFAULT:()=>et});var I=18,Pt=1e6,re=1e9,N=0,ie=12,An=2034,k=63,Bn="7L53bUTBbfuj14UpdCNPwmgzzHSsrsTWBHX5pys32mVWM3C1",se=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=_n(typeof u=="bigint"?u.toString():u);return t===0?e.toString():e.div(Math.pow(10,t)).toString()}var Yt={};T(Yt,{H160:()=>ce,isEvmAccount:()=>Fe,isEvmAddress:()=>Ee,isSs58Address:()=>ke});import{AccountId as St}from"polkadot-api";import{toHex as Re}from"@polkadot-api/utils";import{Buffer as Y}from"buffer";var le="ETH\0";function Fe(u){if(!u)return!1;try{let t=St().enc(u),e=Y.from(le);return Y.from(t.subarray(0,e.length)).equals(e)}catch{return!1}}function Ee(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function ke(u){try{return St(63).enc(u),!0}catch{return!1}}var ce=class u{static toAccount=t=>{let e=Y.from(t.slice(2),"hex"),n=Y.from(le),a=Uint8Array.from(Y.concat([n,e,Y.alloc(8)])),r=Re(a);return St(63).dec(r)};static fromAccount=t=>{let e=St().enc(t),n=Y.from(le),a=e.slice(n.length,-8);return"0x"+Y.from(a).toString("hex")};static fromSS58=t=>{let n=St().enc(t).slice(0,20);return Re(n)};static fromAny=t=>{if(Ee(t))return t;if(Fe(t))return u.fromAccount(t);if(ke(t))return u.fromSS58(t);throw new Error("Unknown address type")}};var $={};T($,{findNestedKey:()=>Rn,findNestedObj:()=>Fn,jsonFormatter:()=>En});var Rn=(u,t)=>{let e=[];return JSON.stringify(u,(n,a)=>(a&&a[t]&&e.push(a),a)),e[0]},Fn=(u,t,e)=>{let n;return JSON.stringify(u,(a,r)=>(r&&r[t]===e&&(n=r),r)),n},En=(u,t)=>typeof t=="bigint"?t.toString():t;var v={};T(v,{calculateBuyFee:()=>Mn,calculateDiffToAvg:()=>kn,calculateDiffToRef:()=>Cn,calculateSellFee:()=>Dn,getFraction:()=>Ln});import U from"big.js";function kn(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 Cn(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 Dn(u,t){let e=U(u.toString()),n=U(t.toString());return U(1).minus(n.div(e)).mul(100).round(2).toNumber()}function Mn(u,t){let e=U(u.toString());return U(t.toString()).div(e).minus(1).mul(100).round(2).toNumber()}function Ln(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 Ce={};T(Ce,{convertToId:()=>Nn});import{Buffer as qn}from"buffer";function Nn(u){let e=qn.from(u.replace("0x",""),"hex").subarray(16);return e.readUIntBE(0,e.length)}var{ERC20:Xt}=tt,{H160:ue}=Yt,Gn=1.01,Hn=99999,Un=10n**27n,Vn=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)]),[s]=n,[i,o]=a,[l,c,m,d,p,g]=r,y=h.toDecimal(g,18),b=[];for(let P of i){let f=P.underlyingAsset.toLowerCase(),S=s.find(({underlyingAsset:j})=>j.toLowerCase()===f);if(!S)throw new Error("Missing pool reserve for "+f);let w=P.scaledATokenBalance,F=S.liquidityIndex,C=S.priceInMarketReferenceCurrency,_=w*F/Un,q=Number(o===S.eModeCategoryId?S.eModeLiquidationThreshold:S.reserveLiquidationThreshold)/1e4,W=S.usageAsCollateralEnabled&&P.usageAsCollateralEnabledOnUser&&P.scaledATokenBalance>0n,bt=Xt.toAssetId(f);b.push({aTokenBalance:_,decimals:Number(S.decimals),isCollateral:W,priceInRef:C,reserveId:bt,reserveAsset:f,reserveLiquidationThreshold:q})}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,s,i,o,l]=n,c=h.toDecimal(l,18);return Number(c)}async getHealthFactorAfterWithdraw(t,e,n){let{totalCollateral:a,totalDebt:r,reserves:s}=await this.getSummary(t),i=Xt.fromAssetId(e),o=s.find(b=>b.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,isCollateral:c,priceInRef:m,reserveLiquidationThreshold:d}=o,p=h.toBigInt(n,l),g=c?p*m/10n**BigInt(l):0n,y=a-g;return y<=0n?0:this.calculateHealthFactor(y,d,r)}async getHealthFactorAfterSupply(t,e,n){let{totalCollateral:a,totalDebt:r,reserves:s}=await this.getSummary(t),i=Xt.fromAssetId(e),o=s.find(y=>y.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:m}=o,p=h.toBigInt(n,l)*c/10n**BigInt(l),g=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),s=Xt.fromAssetId(e),i=r.find(o=>o.reserveAsset===s);if(!i)throw new Error("Missing reserve ctx for "+s);return this.calculateWithdrawMax(i,n,a)}async getMaxWithdrawAll(t){let{totalCollateral:e,totalDebt:n,reserves:a}=await this.getSummary(t),r={};for(let s of a){let i=this.calculateWithdrawMax(s,e,n);s.reserveId&&(r[s.reserveId]=i)}return r}calculateHealthFactor(t,e,n){if(n===0n)return Hn;let a=10n**6n,r=h.toBigInt(e,18),s=t*r*a,i=n*Vn,o=s/i;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:s,reserveLiquidationThreshold:i}=t,o=this.calculateRequiredCollateral(Gn,i,n),l=e-o;if(l<=0n)return{amount:0n,decimals:r};let c=l*10n**BigInt(r)/s;return{amount:a<c?a:c,decimals:r}}};var qe={};T(qe,{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:s,is_sufficient:i,existential_deposit:o}=e,{symbol:l,decimals:c}=n.get(t)??{};return{id:t,name:r?.asText(),symbol:l,decimals:c,icon:l,type:s.type,isSufficient:i,location:a,existentialDeposit:o}}async mapBond(t,e,n,a){let[r,s]=a,{asset_type:i,is_sufficient:o,existential_deposit:l}=e,{symbol:c,decimals:m}=await this.mapToken(r,e,n),d=Number(s),p=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",p.format(d)].join(" ");return{id:t,name:g,symbol:c+"b",decimals:m,icon:c,type:i.type,isSufficient:o,existentialDeposit:l,underlyingAssetId:r,maturity:d}}async mapShares(t,e,n,a){let{assets:r}=a,{name:s,symbol:i,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:i?.asText()||s?.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),s=n?.find(i=>i.internalId===r.id);return s?{...r,decimals:s.decimals,name:s.name,symbol:s.symbol,icon:s.symbol,isWhiteListed:s.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,s]=await Promise.all([this.queryAssets(),this.queryAssetLocations(),this.queryShares(),this.queryBonds()]),i=this.parseMetadata(n),o=[];for(let[l,c]of Array.from(n)){let m=a.get(l),{asset_type:d}=c,p;switch(d.type){case"Bond":let g=s.get(l);p=await this.mapBond(l,c,i,g);break;case"StableSwap":let y=r.get(l);p=await this.mapShares(l,c,i,y);break;case"External":p=await this.mapExternal(l,c,e,m);break;default:p=await this.mapToken(l,c,i,m)}o.push(p)}return t?o:o.filter(l=>this.isValidAsset(l))}isValidAsset(t){let e=Math.sign(t.decimals);return!!t.symbol&&(e===0||e===1)}};import{Subject as Wn,bufferCount as Yn,combineLatest as Xn,debounceTime as Kn,distinctUntilChanged as Me,finalize as jn,map as at,pairwise as zn,shareReplay as $n,startWith as Qn}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 Xn([e,n,a]).pipe(Kn(250),at(r=>r.flat()),Qn([]),Yn(2,1),at(([r,s],i)=>{if(i===0)return s;let o=r.reduce((c,m)=>(c.set(m.id,m.balance),c),new Map);return s.filter(c=>!Le(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(Me((n,a)=>!a.deltas),at(({deltas:n})=>{let a=[];return n?.deleted.forEach(r=>{let[s,i]=r.args;a.push({id:i,balance:this.calculateBalance({free:0n,reserved:0n,frozen:0n})})}),n?.upserted.forEach(r=>{let[s,i]=r.args;a.push({id:i,balance:this.calculateBalance(r.value)})}),a}))}subscribeErc20Balance(t,e){let n=new Wn,a=n.pipe($n(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}),s=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()},i;return s().then(o=>i=o),a.pipe(jn(()=>i?.()),zn(),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=>!Le(p.balance,m.get(p.id)))}),Me((o,l)=>l.length===0))}async getTokenBalanceData(t,e){let n=await this.api.apis.CurrenciesApi.account(e,t);return this.calculateBalance(n)}},Le=(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 Ne={};T(Ne,{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 Ue={};T(Ue,{EvmClient:()=>xt,createChain:()=>pe});import{defineChain as Jn}from"viem";var Zn=["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=()=>Jn({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:Zn}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1});import{createPublicClient as Ge,createWalletClient as ta,custom as He,http as ea}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 Ge({chain:this.chain,transport:ea()})}getWsProvider(){return Ge({transport:He({request:({method:t,params:e})=>this.client._request(t,e||[])})})}getSigner(t){return ta({account:t,chain:this.chain,transport:He(window.ethereum)})}};var Je={};T(Je,{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 na,calculate_out_given_in as aa,calculate_linear_weights as ra,calculate_pool_trade_fee as ia,get_spot_price as sa}from"@galacticcouncil/math-lbp";var G=class{static getSpotPrice(t,e,n,a,r){return sa(t,e,n,a,r)}static calculateInGivenOut(t,e,n,a,r){return na(t,e,n,a,r)}static calculateOutGivenIn(t,e,n,a,r){return aa(t,e,n,a,r)}static calculateLinearWeights(t,e,n,a,r){return ra(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:Ve}=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,s,i){this.type="LBP",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r,this.fee=s,this.repayFeeApply=i}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),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 s=t.balanceOut/this.maxOutRatio;if(e>s&&r.push("MaxOutRatioExceeded"),a===t.assetOut){let i=this.calculateTradeFee(e,n),o=Ve.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),l=e+i,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 i=this.calculateInGivenOut(t,e),o=t.balanceIn/this.maxInRatio;return i>o&&r.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:i,amountOut:e,feePct:0,errors:r}}}validateAndSell(t,e,n){let a=this.tokens[0].id,r=[];e<this.minTradingLimit&&r.push("InsufficientTradingAmount");let s=t.balanceIn/this.maxInRatio;if(e>s&&r.push("MaxInRatioExceeded"),a===t.assetIn){let i=this.calculateOutGivenIn(t,e),o=t.balanceOut/this.maxOutRatio;return i>o&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,amountOut:i,feePct:0,errors:r}}else{let i=this.calculateOutGivenIn(t,e),o=this.calculateTradeFee(i,n),l=Ve.toPct(this.repayFeeApply?n.repayFee:n.exchangeFee),c=i-o,m=t.balanceOut/this.maxOutRatio;return c>m&&r.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:i,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 da}from"polkadot-api";import{map as ga,of as je,switchMap as ba}from"rxjs";import{memoize1 as oa}from"@thi.ng/memoize";import{combineLatest as We,combineLatestAll as la,debounceTime as ca,firstValueFrom as ua,from as Ye,map as Xe,mergeAll as ma,of as pa,switchMap as Ke}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()]),[s,i,o,l]=n,c=r.number-(r.timestamp-l)/BigInt(e),m=Number(c);return{price:i,decimals:a,updatedAt:m<0?0:m}}};var D=class extends H{evm;mmOracle;override=[];mem=0;memPools=oa(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=Ye(this.getPoolsMem()).pipe(Ke(e=>this.subscribe(e)),la());return ua(t)}getSubscriber(){return Ye(this.getPoolsMem()).pipe(Ke(t=>this.subscribe(t)),ma())}subscribe(t){return t.filter(e=>this.hasValidAssets(e)).map(e=>We([this.subscribePoolChange(e),this.subscribePoolBalance(e)]).pipe(ca(250),Xe(([n,a])=>this.updatePool(n,a))))}subscribePoolBalance(t){if(t.type==="Aave")return pa([]);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 We(e).pipe(Xe(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(i=>i.id===e),s=!!n||!!r?.decimals;return a>0n&&s})}updatePool=(t,e)=>{let n=t.tokens.map(a=>{let r=e.find(i=>i.id===a.id),s=this.override.find(i=>i.id===a.id);return r?{...a,balance:r.balance.transferable,decimals:a.decimals||s?.decimals}:{...a,decimals:a.decimals||s?.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:s})=>e&&this.isActivePool(s,a)).map(async({keyArgs:s,value:i})=>{let[o]=s,l=o.toString(),c=await this.getPoolDelta(l,i,a);return{address:l,type:"LBP",fee:i.fee,...c,...n}});return Promise.all(r)}async getPoolDelta(t,e,n){let{start:a,end:r,assets:s,initial_weight:i,final_weight:o,repay_target:l,fee_collector:c}=e,m=G.calculateLinearWeights(a?a.toString():"0",r?r.toString():"0",i.toString(),o.toString(),n.toString()),[d,p]=s,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(da.BackwardsCompatible,e)}subscribePoolChange(t){let e=this.api.query.ParachainSystem.ValidationData,n=this.poolsData.get(t.address);return n?e.watchValue("best").pipe(ba(a=>a?this.getPoolDelta(t.address,n,a.relay_parent_number):je(t)),ga(a=>Object.assign({},t,a))):je(t)}};var be={};T(be,{OmniMath:()=>x,OmniPool:()=>At,OmniPoolClient:()=>Bt});import{calculate_in_given_out as ya,calculate_lrna_in_given_out as ha,calculate_out_given_in as Pa,calculate_out_given_lrna_in as fa,calculate_spot_price as Sa,calculate_lrna_spot_price as Ta,calculate_shares as wa,calculate_liquidity_out as xa,calculate_liquidity_lrna_out as Ia,verify_asset_cap as va,calculate_liquidity_hub_in as Oa,is_sell_allowed as Aa,is_buy_allowed as Ba,is_add_liquidity_allowed as _a,is_remove_liquidity_allowed as Ra}from"@galacticcouncil/math-omnipool";import it from"big.js";var x=class{static calculateSpotPrice(t,e,n,a){return Sa(t,e,n,a)}static calculateLrnaSpotPrice(t,e){return Ta(t,e)}static calculateInGivenOut(t,e,n,a,r,s,i,o,l){return ya(t,e,n,a,r,s,i,o,l)}static calculateLrnaInGivenOut(t,e,n,a,r){return ha(t,e,n,a,r)}static calculateOutGivenIn(t,e,n,a,r,s,i,o,l){return Pa(t,e,n,a,r,s,i,o,l)}static calculateOutGivenLrnaIn(t,e,n,a,r){return fa(t,e,n,a,r)}static calculateShares(t,e,n,a){return wa(t,e,n,a)}static calculateLiquidityOut(t,e,n,a,r,s,i,o){return xa(t,e,n,a,r,s,i,o)}static calculateLiquidityLRNAOut(t,e,n,a,r,s,i,o){return Ia(t,e,n,a,r,s,i,o)}static calculateCapDifference(t,e,n,a){let r=it(e),s=it(t),i=it(a),o=it(n),l=it(10).pow(18),c=o.div(l);if(r.div(i).lt(c)){let d=c.times(i).minus(r).times(s),p=r.times(it(1).minus(c));return d.div(p).toFixed(0)}else return"0"}static verifyAssetCap(t,e,n,a){return va(t,e,n,a)}static calculateLimitHubIn(t,e,n,a){return Oa(t,e,n,a)}static isSellAllowed(t){return Aa(t)}static isBuyAllowed(t){return Ba(t)}static isAddLiquidityAllowed(t){return _a(t)}static isRemoveLiquidityAllowed(t){return Ra(t)}};var{FeeUtils:st}=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,s){this.type="Omnipool",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r,this.hubAssetId=s}validatePair(t,e){return this.hubAssetId!=e}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),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),s=a===0n?0:v.calculateDiffToRef(r,a),i=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&i.push("InsufficientTradingAmount");let c=t.balanceOut/this.maxOutRatio;e>c&&i.push("MaxOutRatioExceeded");let m=t.balanceIn/this.maxInRatio;return r>m&&i.push("MaxInRatioExceeded"),{amountIn:r,calculatedIn:a,amountOut:e,feePct:s,errors:i}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,n),s=v.calculateDiffToRef(a,r),i=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&i.push("InsufficientTradingAmount");let c=t.balanceIn/this.maxInRatio;e>c&&i.push("MaxInRatioExceeded");let m=t.balanceOut/this.maxOutRatio;return r>m&&i.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:r,feePct:s,errors:i}}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?st.toRaw(n.assetFee).toString():"0",n?st.toRaw(n.protocolFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}calculateLrnaInGivenOut(t,e,n){let a=x.calculateLrnaInGivenOut(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?st.toRaw(n.assetFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}calculateOutGivenIn(t,e,n){if(t.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(t,e,n);let a=x.calculateOutGivenIn(t.balanceIn.toString(),t.hubReservesIn.toString(),t.sharesIn.toString(),t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?st.toRaw(n.assetFee).toString():"0",n?st.toRaw(n.protocolFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}calculateOutGivenLrnaIn(t,e,n){let a=x.calculateOutGivenLrnaIn(t.balanceOut.toString(),t.hubReservesOut.toString(),t.sharesOut.toString(),e.toString(),n?st.toRaw(n.assetFee).toString():"0"),r=BigInt(a);return r<0n?0n:r}spotPriceInGivenOut(t){if(t.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(t);let e=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 Fa,CompatibilityLevel as Ea}from"polkadot-api";import{toHex as ka}from"@polkadot-api/utils";import{distinctUntilChanged as Ca,map as ze}from"rxjs";var{FeeUtils:X}=R,Bt=class extends D{async loadPools(){let t=await this.api.constants.Omnipool.HubAssetId(),e=this.getPoolAddress(),[n,a,r,s,i]=await Promise.all([this.api.query.Omnipool.Assets.getEntries(),this.api.query.Omnipool.HubAssetTradability.getValue(),this.api.query.AssetRegistry.Assets.getValue(t),this.getBalance(e,t),this.getPoolLimits()]),o=n.map(async({keyArgs:c,value:m})=>{let[d]=c,{hub_reserve:p,shares:g,tradable: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:s.transferable,tradeable:a,type:r?.asset_type.type}),[{address:e,type:"Omnipool",hubAssetId:t,tokens:l,...i}]}getPoolAddress(){let t="modlomnipool".padEnd(32,"\0"),e=new TextEncoder().encode(t),n=ka(e);return Fa(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)]),s=n.min_fee+a.min_fee,i=n.max_fee+a.max_fee;if(r){let{asset_fee:o,protocol_fee:l}=r;return{assetFee:X.fromPermill(o),protocolFee:X.fromPermill(l),min:X.fromPermill(s),max:X.fromPermill(i)}}else return{assetFee:X.fromPermill(n.min_fee),protocolFee:X.fromPermill(a.min_fee),min:X.fromPermill(s),max:X.fromPermill(i)}}getPoolType(){return"Omnipool"}async isSupported(){let t=this.api.query.Omnipool.Assets,e=await this.api.compatibilityToken;return t.isCompatible(Ea.BackwardsCompatible,e)}subscribePoolChange(t){return this.api.query.Omnipool.Assets.watchEntries({at:"best"}).pipe(Ca((n,a)=>!a.deltas),ze(({entries:n})=>n.map(a=>{let[r]=a.args,{hub_reserve:s,shares:i,tradable:o,cap:l,protocol_shares:c}=a.value,m=t.tokens.findIndex(p=>p.id===r);return{...t.tokens[m],cap:l,hubReserves:s,protocolShares:c,shares:i,tradeable:o}})),ze(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 Da,calculate_out_given_in as Ma,calculate_amplification as La,calculate_add_one_asset as qa,calculate_liquidity_out_one_asset as Na,calculate_shares as Ga,calculate_shares_for_amount as Ha,calculate_spot_price_with_fee as Ua,pool_account_name as Va,recalculate_peg as Wa}from"@galacticcouncil/math-stableswap";var A=class{static getPoolAddress(t){return Va(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 La(t,e,n,a,r)}static calculateInGivenOut(t,e,n,a,r,s,i){return Da(t,e,n,a,r,s,i)}static calculateAddOneAsset(t,e,n,a,r,s,i){return qa(t,e,n,a,r,s,i)}static calculateSharesForAmount(t,e,n,a,r,s,i){return Ha(t,e,n,a,r,s,i)}static calculateOutGivenIn(t,e,n,a,r,s,i){return Ma(t,e,n,a,r,s,i)}static calculateLiquidityOutOneAsset(t,e,n,a,r,s,i){return Na(t,e,n,a,r,s,i)}static calculateShares(t,e,n,a,r,s){return Ga(t,e,n,a,r,s)}static calculateSpotPriceWithFee(t,e,n,a,r,s,i,o){return Ua(t,e,n,a,r,s,i,o)}static recalculatePegs(t,e,n,a,r){let s=Wa(t,e,n,a,r);return JSON.parse(s)}};var{FeeUtils:K}=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,s,i,o,l){this.type="Stableswap",this.address=t,this.tokens=e,this.maxInRatio=n,this.maxOutRatio=a,this.minTradingLimit=r,this.amplification=s,this.id=i,this.fee=o,this.totalIssuance=l}validatePair(t,e){return!0}parsePair(t,e){let n=new Map(this.tokens.map(s=>[s.id,s])),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),s=K.toPct(n.fee),i=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetInEd)&&i.push("InsufficientTradingAmount"),{amountIn:r,calculatedIn:a,amountOut:e,feePct:s,errors:i}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=this.calculateOutGivenIn(t,e,n),s=K.toPct(n.fee),i=[],o=x.isSellAllowed(t.tradeableIn),l=x.isBuyAllowed(t.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(e<this.minTradingLimit||a<t.assetOutEd)&&i.push("InsufficientTradingAmount"),{amountIn:e,calculatedOut:a,amountOut:r,feePct:s,errors:i}}calculateIn(t,e,n){let a=A.calculateInGivenOut(this.getReserves(),Number(t.assetIn),Number(t.assetOut),e.toString(),this.amplification.toString(),n?K.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?K.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?K.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?K.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?K.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?K.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 Ya,CompatibilityLevel as Xa}from"polkadot-api";import{toHex as Ka}from"@polkadot-api/utils";import{blake2b as ja}from"@noble/hashes/blake2b";import{map as za,of as $a,switchMap as Qa}from"rxjs";var{FeeUtils:Z}=R,Rt=class extends D{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(t){let e=A.getPoolAddress(t),n=ja(e,{dkLen:32}),a=Ka(n);return Ya(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:s,final_block:i}=e,o=A.calculateAmplification(a.toString(),r.toString(),s.toString(),i.toString(),n.toString()),l=await this.api.query.Tokens.TotalIssuance.getValue(t);return{amplification:BigInt(o),totalIssuance:l}}async getPoolTokens(t,e){let n=this.getPoolAddress(t),a=e.assets.map(async r=>{let[s,i,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:i?.decimals,existentialDeposit:i?.existential_deposit,balance:o.transferable,tradeable:s,type:i?.asset_type.type}});return Promise.all(a)}async isSupported(){let t=this.api.query.Stableswap.Pools,e=await this.api.compatibilityToken;return t.isCompatible(Xa.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:s})=>{let[i]=r,o=this.getPoolAddress(i),[l,c,m]=await Promise.all([this.getPoolDelta(i,s,e),this.getPoolTokens(i,s),this.getPoolPegs(i,s,e)]);return c.push({id:i,tradeable:15,balance:l.totalIssuance,decimals:18}),this.poolsData.set(o,s),{address:o,id:i,type:"Stableswap",fee:Z.fromPermill(s.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),s=this.getRecentPegs(a),i=Z.fromPermill(a.max_peg_update),o=Z.fromPermill(e.fee),[l,c]=A.recalculatePegs(JSON.stringify(s),JSON.stringify(r),n.toString(),Z.toRaw(i).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(([i,o])=>o),s=a.map(async(i,o)=>{if(i.type==="Oracle"){let[l,c,m]=i.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(i.type==="MMOracle"){let l=i.value.asHex(),{price:c,decimals:m,updatedAt:d}=await this.mmOracle.getData(l),p=10**m;return[[c.toString(),p.toString()],d.toString()]}else return[i.value.map(l=>l.toString()),n.toString()]});return Promise.all(s)}subscribePoolChange(t){let e=this.api.query.System.Number,n=this.poolsData.get(t.address);return!n||!t.id?$a(t):e.watchValue("best").pipe(Qa(a=>Promise.all([this.getPoolDelta(t.id,n,a),this.getPoolPegs(t.id,n,a)])),za(([a,r])=>{let s=t.tokens.map(i=>i.id===t.id?{...i,balance:a.totalIssuance}:i);return Object.assign(t,{tokens:s},a,r)}))}};var he={};T(he,{XykMath:()=>V,XykPool:()=>Ft,XykPoolClient:()=>Et});import{calculate_in_given_out as Ja,calculate_out_given_in as Za,calculate_pool_trade_fee as tr,get_spot_price as er,calculate_liquidity_in as nr,calculate_shares as ar,calculate_spot_price as rr,calculate_spot_price_with_fee as ir,calculate_liquidity_out_asset_a as sr,calculate_liquidity_out_asset_b as or}from"@galacticcouncil/math-xyk";var V=class{static getSpotPrice(t,e,n){return er(t,e,n)}static calculateInGivenOut(t,e,n){return Ja(t,e,n)}static calculateOutGivenIn(t,e,n){return Za(t,e,n)}static calculatePoolTradeFee(t,e,n){return tr(t,e,n)}static calculateLiquidityIn(t,e,n){return nr(t,e,n)}static calculateSpotPrice(t,e){return rr(t,e)}static calculateSpotPriceWithFee(t,e,n,a){return ir(t,e,n,a)}static calculateShares(t,e,n){return ar(t,e,n)}static calculateLiquidityOutAssetA(t,e,n,a){return sr(t,e,n,a)}static calculateLiquidityOutAssetB(t,e,n,a){return or(t,e,n,a)}};var{FeeUtils:$e}=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(s=>[s.id,s])),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),s=$e.toPct(n.exchangeFee),i=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 i>c&&o.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:a,amountOut:e,feePct:s,errors:o}}validateAndSell(t,e,n){let a=this.calculateOutGivenIn(t,e),r=this.calculateTradeFee(a,n),s=$e.toPct(n.exchangeFee),i=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 i>c&&o.push("MaxOutRatioExceeded"),{amountIn:e,calculatedOut:a,amountOut:i,feePct:s,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 lr}from"polkadot-api";import{of as cr}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:s})=>{let[i]=r,[o,l]=s,[c,m,d,p]=await Promise.all([this.getBalance(i,o),this.api.query.AssetRegistry.Assets.getValue(o),this.getBalance(i,l),this.api.query.AssetRegistry.Assets.getValue(l)]);return{address:i,type:"XYK",tokens:[{id:o,decimals:m?.decimals,existentialDeposit:m?.existential_deposit,balance:c.transferable,type:m?.asset_type.type},{id:l,decimals:p?.decimals,existentialDeposit:p?.existential_deposit,balance:d.transferable,type:p?.asset_type.type}],...n}});return Promise.all(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(lr.BackwardsCompatible,e)}subscribePoolChange(t){return cr(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(s=>[s.id,s])),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 ur}from"polkadot-api";import{toHex as mr}from"@polkadot-api/utils";import{map as pr,merge as dr,switchMap as gr}from"rxjs";import{decodeEventLog as br}from"viem";var Qe=[{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:yr}=tt,hr=["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:s})=>{let[i,o,l,c]=await Promise.all([this.api.query.AssetRegistry.Assets.getValue(n),this.api.query.AssetRegistry.AssetLocations.getValue(n),this.api.query.AssetRegistry.Assets.getValue(a),this.api.query.AssetRegistry.AssetLocations.getValue(a)]);return{address:this.getPoolId(n,a),type:"Aave",tokens:[{id:n,decimals:i?.decimals,existentialDeposit:i?.existential_deposit,balance:r,location:o,type:i?.asset_type.type},{id:a,decimals:l?.decimals,existentialDeposit:l?.existential_deposit,balance:s,location:c,type:l?.asset_type.type}],...this.getPoolLimits()}});return Promise.all(e)}async getPoolDelta(t){let[e,n]=t.tokens,{liqudity_in:a,liqudity_out:r}=await this.api.apis.AaveTradeExecutor.pool(e.id,n.id);return t.tokens.map(s=>{let i=s.id===e.id?a:r;return{...s,balance:i}})}getPoolId(t,e){let n=t+"/"+e,a=new TextEncoder().encode(n.padEnd(32,"\0")),r=mr(a);return ur(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:i,asset_out:o})=>i===n.id||o===n.id),s=this.api.event.EVM.Log.watch(({log:i})=>{let{topics:o,data:l}=i,c=o.map(g=>g.asHex()),m=l.asHex(),{eventName:d,args:p}=br({abi:Qe,topics:c,data:m});return hr.includes(d)&&p.reserve.toLowerCase()===a.toLowerCase()});return dr([r,s]).pipe(gr(()=>this.getPoolDelta(t)),pr(i=>({...t,tokens:[...i]})))}getReserveH160Id(t){return t.type==="Erc20"?$.findNestedKey(t.location,"AccountKey20").AccountKey20.key:yr.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 Pr,Subscription as Dt,takeUntil as fr}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 Pr;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(fr(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),s=async i=>{let o=i.getPoolType();return a.size>0?a.has(o):r.size>0?!r.has(o):i.isSupported()};return this.getFilteredPools(s)}async getFilteredPools(t){let e=await Promise.all(this.clients.map(t)),n=this.clients.filter((r,s)=>e[s]);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 an={};T(an,{DEFAULT_BLOCK_TIME:()=>tn,DEFAULT_MIN_BUDGET:()=>Te,ORDER_MIN_BLOCK_PERIOD:()=>en,Router:()=>ct,TWAP_BLOCK_PERIOD:()=>Nt,TWAP_MAX_DURATION:()=>xe,TWAP_MAX_PRICE_IMPACT:()=>we,TWAP_TX_MULTIPLIER:()=>ou,TradeOrderError:()=>Se,TradeOrderType:()=>jt,TradeRouteBuilder:()=>M,TradeRouter:()=>ut,TradeScheduler:()=>mt,TradeType:()=>Kt});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 Sr=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,s=[];for(s.push([e,""]),r.enqueue(s);r.size()>0;){let i=r.dequeue();if(!i||i.length>Sr)continue;let o=i[i.length-1];(n===null||o[0]===n)&&a.push(i),t.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,i)){let m=[...i];m.push(c),r.enqueue(m)}})}return a}findShortestPaths(t,e,n){let a=[],r=new Mt,s=[];s.push([e,""]),r.enqueue(s);let i=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<i?(i=o.length,a.length=0,a.push(o)):o.length===i&&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,s]of e)n.get(r)?.push([s,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 s=[e.address,e.tokens[a].id,e.tokens[r].id];t[e.tokens[a].id].push(s)}}}return t}var qt=class{getProposals(t,e,n){let a=n.filter(b=>b.type==="XYK"),r=n.filter(b=>b.type!=="XYK"),s=new Set(r.map(b=>b.tokens).flat().map(b=>b.id)),i=s.has(t),o=s.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(!i&&!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(i&&o){let b=c(r),P=l.findPaths(b,t,e);return this.parsePaths(P)}let m=i?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 s=n[r],i=n[r+1];if(i==null)break;a.push(this.toEdge(s,i))}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(s=>this.validPath(s,a)).map(s=>this.toHops(s,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 s=e.get(n);return{poolAddress:n,poolId:s?.id,pool:s?.type,assetIn:a,assetOut:r}})}};var Kt=(e=>(e.Buy="Buy",e.Sell="Sell",e))(Kt||{}),jt=(n=>(n.Dca="Dca",n.TwapSell="TwapSell",n.TwapBuy="TwapBuy",n))(jt||{}),Se=(n=>(n.OrderTooSmall="OrderTooSmall",n.OrderTooBig="OrderTooBig",n.OrderImpactTooBig="OrderImpactTooBig",n))(Se||{});var{FeeUtils:Ze}=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,s=a[a.length-1].amountOut;return r>s?-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,s)=>r+s),a=t.map(r=>r.tradeFeeRange?.[1]??r.tradeFeePct).reduce((r,s)=>r+s);return[n,a]}}getPoolFeeRange(t){let e=t.min?Ze.toPct(t.min):void 0,n=t.max?Ze.toPct(t.max):void 0;if(e&&n)return[e,n]}async getBestSell(t,e,n){return this.getSell(t,e,n)}getSellSpot(t){let e=t[t.length-1];if(t.length===1)return e.spotPrice;let n=t.map(i=>i.assetOutDecimals).reduce((i,o)=>i+o),a=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),r=n-e.assetOutDecimals,s=Math.pow(10,r);return a/BigInt(s)}async getSell(t,e,n,a){return this.withCtx(t,e,async({paths:r,poolsMap:s})=>{let i;if(a)i=await this.toSellSwaps(n,a,s);else{let o=r.map(c=>this.toSellSwaps(n,c,s)),l=await Promise.all(o);i=this.findBestSellRoute(l)}return this.buildSell(s,i)})}buildSell(t,e){let n=e[0],a=e[e.length-1],r=this.isDirectTrade(e),s=this.getSellSpot(e),i=a.amountOut,o=r?a.calculatedOut:this.calculateDelta0Y(n.amountIn,e,t),l=o-i,c=this.getRouteFeeRange(e),m=r?a.tradeFeePct:v.calculateSellFee(o,i),d=Math.pow(10,n.assetInDecimals),p=n.amountIn*s/BigInt(d),g=v.calculateDiffToRef(o,p);return{type:"Sell",amountIn:n.amountIn,amountOut:a.amountOut,spotPrice:s,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Sell",amountIn:h.toDecimal(n.amountIn,n.assetInDecimals),amountOut:h.toDecimal(a.amountOut,a.assetOutDecimals),spotPrice:h.toDecimal(s,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 s=e[r],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;r>0?l=a[r-1]:l=t;let c=i.calculateOutGivenIn(o,l);a.push(c)}return a[a.length-1]}async calculateMostLiquidRoute(t,e,n){let{paths:a,pools:r,poolsMap:s}=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,s))),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 s=e[r],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.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(i,o.assetOut),{amountOut:m,calculatedOut:d,feePct:p,errors:g}=i.validateAndSell(o,l,c),y=this.getPoolFeeRange(c),b=i.spotPriceOutGivenIn(o),P=Math.pow(10,o.decimalsIn),f=l*b/BigInt(P),S=v.calculateDiffToRef(d,f);a.push({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:m,calculatedOut:d,spotPrice:b,tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===s.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===s.assetIn},toHuman(){return{...s,amountIn:h.toDecimal(l,o.decimalsIn),amountOut:h.toDecimal(m,o.decimalsOut),calculatedOut:h.toDecimal(d,o.decimalsOut),spotPrice:h.toDecimal(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,s=this.buildRouteKey(t,e,a),i=this.mlr.get(s);i||(i=await this.calculateMostLiquidRoute(t,e,n));let o=await this.toSellSwaps("1",i,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,s=a[0].amountIn;return r>s?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(i=>i.assetInDecimals).reduce((i,o)=>i+o),a=t.map(i=>i.spotPrice).reduce((i,o)=>i*o),r=n-e.assetInDecimals,s=Math.pow(10,r);return a/BigInt(s)}async getBuy(t,e,n,a){return this.withCtx(t,e,async({paths:r,poolsMap:s})=>{let i;if(a)i=await this.toBuySwaps(n,a,s);else{let o=r.map(c=>this.toBuySwaps(n,c,s)),l=await Promise.all(o);i=this.findBestBuyRoute(l)}return this.buildBuy(s,i)})}buildBuy(t,e){let n=e[e.length-1],a=e[0],r=this.isDirectTrade(e),s=this.getBuySpot(e),i=a.amountIn,o=r?a.calculatedIn:this.calculateDelta0X(n.amountOut,e,t),l=i-o,c=this.getRouteFeeRange(e),m=r?a.tradeFeePct:v.calculateBuyFee(o,i),d=Math.pow(10,n.assetOutDecimals),p=n.amountOut*s/BigInt(d),g;return o===0n?g=-100:g=v.calculateDiffToRef(p,o),{type:"Buy",amountOut:n.amountOut,amountIn:a.amountIn,spotPrice:s,tradeFee:l,tradeFeePct:m,tradeFeeRange:c,priceImpactPct:g,swaps:e,toHuman(){return{type:"Buy",amountOut:h.toDecimal(n.amountOut,n.assetOutDecimals),amountIn:h.toDecimal(a.amountIn,a.assetInDecimals),spotPrice:h.toDecimal(s,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 s=e[r],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.assetOut),l;r==e.length-1?l=t:l=a[0];let c=i.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 s=e[r],i=n.get(s.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(s.assetIn,s.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(i,o.assetOut),{amountIn:m,calculatedIn:d,feePct:p,errors:g}=i.validateAndBuy(o,l,c),y=this.getPoolFeeRange(c),b=i.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({...s,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountOut:l,amountIn:m,calculatedIn:d,spotPrice:b,tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===s.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===s.assetIn},toHuman(){return{...s,amountOut:h.toDecimal(l,o.decimalsOut),amountIn:h.toDecimal(m,o.decimalsIn),calculatedIn:h.toDecimal(d,o.decimalsIn),spotPrice:h.toDecimal(b,o.decimalsIn),tradeFeePct:p,tradeFeeRange:y,priceImpactPct:S,errors:g}}})}return a}};var tn=6e3,Te=1000000000000000n,Nt=6,we=-5,xe=216e5,ou=3,en=6;import{Enum as nn}from"polkadot-api";var M=class{static build(t){return t.map(({assetIn:e,assetOut:n,pool:a,poolId:r})=>a==="Stableswap"?{pool:nn("Stableswap",r),asset_in:e,asset_out:n}:{pool:nn(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[s,i]=await Promise.all([this.getMinimumOrderBudget(t),this.router.getBestSell(t,e,n)]),{amountIn:o,swaps:l,priceImpactPct:c}=i,m=l[0],d=l[l.length-1],{assetInDecimals:p}=m,{assetOutDecimals:g}=d,y=Math.abs(c),b=this.getMinimumTradeCount(o,s),P=this.getOptimalTradeCount(y),f=r?Math.round(a/r):P,S=Math.ceil(a/b),w=Math.round(a/P),F=Math.round(a/f),C=o/BigInt(f),_=await this.router.getBestSell(t,e,C),L=o<s,q=[];L&&q.push("OrderTooSmall");let W=_.amountOut*BigInt(f),bt=this.toBlockPeriod(F),j=_.tradeFee*BigInt(f),Zt=M.build(l),yt={assetIn:t,assetOut:e,errors:q,frequencyMin:S,frequencyOpt:w,frequency:F,tradeCount:f,tradeFee:j,tradeImpactPct:_.priceImpactPct,tradePeriod:bt,tradeRoute:Zt,type:"Dca"};return{...yt,amountIn:o,amountOut:W,tradeAmountIn:_.amountIn,tradeAmountOut:_.amountOut,toHuman(){return{...yt,amountIn:h.toDecimal(o,p),amountOut:h.toDecimal(W,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:s,swaps:i,priceImpactPct:o}=r,l=i[0],c=i[i.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),y=s/BigInt(g),b=await this.router.getBestSell(l.assetIn,c.assetOut,y),P=g===1,f=s<a,S=b.priceImpactPct<-5,w=[];f||P?w.push("OrderTooSmall"):S&&w.push("OrderImpactTooBig");let F=b.amountOut*BigInt(g),C=b.tradeFee*BigInt(g),_=M.build(i),L={assetIn:t,assetOut:e,errors:w,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:_,type:"TwapSell"};return{...L,amountIn:s,amountOut:F,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:C,toHuman(){return{...L,amountIn:h.toDecimal(s,m),amountOut:h.toDecimal(F,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:s,swaps:i,priceImpactPct:o}=r,l=i[0],c=i[i.length-1],{assetInDecimals:m}=l,{assetOutDecimals:d}=c,p=Math.abs(o),g=this.getTwapTradeCount(p),y=s/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,F=[];S||f?F.push("OrderTooSmall"):w&&F.push("OrderImpactTooBig");let C=b.tradeFee*BigInt(g),_=M.build(i),L={assetIn:t,assetOut:e,errors:F,tradeCount:g,tradeImpactPct:b.priceImpactPct,tradePeriod:6,tradeRoute:_,type:"TwapBuy"};return{...L,amountIn:P,amountOut:s,tradeAmountIn:b.amountIn,tradeAmountOut:b.amountOut,tradeFee:C,toHuman(){return{...L,amountIn:h.toDecimal(P,m),amountOut:h.toDecimal(s,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 ln={};T(ln,{BIG_10:()=>sn,BIG_BILL:()=>on,StakingApi:()=>Gt,StakingClient:()=>Ht});import{encodeAddress as Tr}from"@polkadot/util-crypto";import{stringToU8a as wr}from"@polkadot/util";import{calculate_accumulated_rps as xr,calculate_period_number as rn,calculate_rewards as Ir}from"@galacticcouncil/math-staking";import pt from"big.js";var sn=pt(10),on=pt(sn.pow(12));function vr(u){return Tr(wr(("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=vr(t);return(await this.balanceClient.getBalance(e,0)).transferable}async getStakingPosition(t){let[e,n]=await Promise.all([this.client.getStakingPositionsValue(t),this.client.getStakingVotes(t)]),a=e?.created_at,r=await n.reduce(async(s,[i,o])=>{let l=await s,c=i,m=o.amount,d=o.conviction.toString(),p=await this.client.getReferendumInfo(c);return p&&(p.type==="Approved"||p.type==="Rejected")&&l.push({id:c,amount:m,conviction:d}),l},Promise.resolve([]));return{stake:e?.stake,rewardPerStake:e?.reward_per_stake,createdAt: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(s=>s)?.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:s,stakePosition:i}=n;if(!i)return;let[o,l,c,m]=await Promise.all([this.getFreePotBalance(),this.client.getPeriodLength(),this.client.getUnclaimablePeriods(),this.client.getSixBlockSince()]),d=pt(o.toString()).minus(a.toString()),p=r.toString(),g=pt(e).plus(1).toString();d.gt(0)&&s>0&&(p=xr(r.toString(),d.toString(),s.toString()));let y=rn(l.toString(),e,m??g),b=rn(l.toString(),i.createdAt?.toString()??"",m??g),P=Ir(p,i.rewardPerStake?.toString()??"",i.stake?.toString()??""),f=pt(P).plus(i.accumulatedUnpaidRewards?.toString()||"0").plus(i.accumulatedLockedRewards?.toString()||"0");if(!pt(y).minus(b).lte(c.toString()))return f.div(on).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:s})=>{let[i,o,l]=s;return{address:i,collectionId:o,itemId:l}})}async getStakingPositionsValue(t){return await this.api.query.Staking.Positions.getValue(t)}async getStakingVotes(t){return await this.api.query.Staking.Votes.getValue(t)}async getReferendumInfo(t){return await this.api.query.Referenda.ReferendumInfoFor.getValue(t)}async getSixBlockSince(){return(await this.api.query.Staking.SixSecBlocksSince.getValue()).toString()}};var mn={};T(mn,{TxBuilderFactory:()=>gt});import{Enum as un}from"polkadot-api";function cn(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=un("Signed",t),a=un("system",n),s=await this.client.getUnsafeApi().apis.DryRunApi.dry_run_call(a,e.decodedCall),i=s.success&&!s.value.execution_result.success?s.value.execution_result.value.error:null;if(i){let o=cn(i.value);throw new Error("Dry run execution error!",{cause:o})}return s}isDirectOmnipoolTrade(t){return t.length===1&&t[0].pool==="Omnipool"}};var zt=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],s=v.getFraction(t,this.slippagePct),i=a.assetIn,o=r.assetOut,l=t+s,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.buy({asset_in:i,asset_out:o,amount:e,max_sell_amount:l}):c=this.api.tx.Router.buy({asset_in:i,asset_out:o,amount_out:e,max_amount_in:l,route: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],s=v.getFraction(e,this.slippagePct),i=a.assetIn,o=r.assetOut,l=e-s,c;return this.isDirectOmnipoolTrade(n)?c=this.api.tx.Omnipool.sell({asset_in:i,asset_out:o,amount:t,min_buy_amount:l}):c=this.api.tx.Router.sell({asset_in:i,asset_out:o,amount_in:t,min_amount_out:l,route: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),s=n.assetIn,i=a.assetOut,o=t-r,l=this.api.tx.Router.sell_all({asset_in:s,asset_out:i,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 $t=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:s}=this.order,i=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:s})},start_execution_block:void 0});return this.wrapTx("DcaSchedule",i)}buildTwapSellTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:a,tradeAmountOut:r,tradePeriod:s,tradeRoute:i}=this.order,o=v.getFraction(r,this.slippagePct),l=r-o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:Ie("Sell",{asset_in:e,asset_out:n,amount_in:a,min_amount_out:l,route:i})},start_execution_block:void 0});return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:t,assetIn:e,assetOut:n,tradeAmountIn:a,tradeAmountOut:r,tradePeriod:s,tradeRoute:i}=this.order,o=v.getFraction(a,this.slippagePct),l=a+o,c=this.api.tx.DCA.schedule({schedule:{owner:this.beneficiary,period:s,max_retries:this.maxRetries,total_amount:t,slippage:this.slippagePct*1e4,stability_threshold:void 0,order:Ie("Buy",{asset_in:e,asset_out:n,amount_out:r,max_amount_in:l,route:i})},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 zt(this.client,this.evmClient).setTrade(t)}order(t){return new $t(this.client,this.evmClient).setOrder(t)}};import{AccountId as Or}from"polkadot-api";import{fixed_from_rational as pn}from"@galacticcouncil/math-liquidity-mining";import E from"big.js";var Ar=E(365.2425).times(24).times(60).times(60),Br=BigInt(E(1).pow(18).toString()),_r=6,Qt=class{client;balanceClient;omnipoolAssetIds=[];constructor(t,e){this.client=t,this.balanceClient=e}async getOraclePrice(t,e){let n=[t,e].sort((r,s)=>r-s);if(t===e)return Br;let a=await this.client.getOraclePrice(n);if(a){let{n:r,d:s}=a[0].price,i;return t<e?i=pn(r.toString(),s.toString()):i=pn(s.toString(),r.toString()),BigInt(i)}}getFarmAddress=(t,e)=>{let n=Buffer.from("modl","utf-8"),a=Buffer.from(e?"78796b4c4d704944":"4f6d6e6957684c4d","hex"),r=Buffer.from([t]),s=Buffer.concat([n,a,r]),o="0x"+Buffer.concat([s,Buffer.alloc(32-s.length)]).toString("hex");return Or(63).dec(o)};getGlobalRewardPerPeriod(t,e,n,a){let r=E(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=E(t.toString()).times(e),s=E(n.toString()).times(a);return r.div(s.toString()).toString()}farmData(t,e,n){let{yieldFarm:a,globalFarm:r,priceAdjustment:s,balance:i}=t,{multiplier:o,loyalty_curve:l}=a,{blocks_per_period:c,yield_per_period:m,total_shares_z:d,max_reward_per_period:p,pending_rewards:g,accumulated_paid_rewards:y,planned_yielding_periods:b,updated_at:P,incentivized_asset:f,reward_currency:S,price_adjustment:w}=r,F=ft(s??w,18),C=ft(o,18),_=ft(l?.initial_reward_percentage??0,18),L=Ar.div(E(_r).times(c)).toString(),q;if(d<0)q=E(C).times(m.toString()).times(L).toString();else{let yn=this.getGlobalRewardPerPeriod(d,m,p,F),hn=this.getPoolYieldPerPeriod(yn,C,d,F);q=E(hn).times(L).toString()}let W=g+y,bt=p*BigInt(b),j=i.transferable+W,Zt=j-W,yt=E(Zt.toString()).div(p.toString()),ve=E(e).div(c.toString()).toString(),dn=(d>=0?yt.plus(P):yt.plus(ve)).toString(),gn=E(d.toString()).div(E(p.toString()).div(m.toString())).div(Math.pow(10,18)).times(100).times(F).toFixed(2),Oe=E(W.toString()).div(j.toString()).gte(.999);q=Oe?"0":E(q).div(n?2:1).times(100).toString();let bn=_?E(q).times(_).toString():void 0;return{apr:q,minApr:bn,isDistributed:Oe,estimatedEndPeriod:dn,maxRewards:bt,incentivizedAsset:f,rewardCurrency:S,loyaltyCurve:l,currentPeriod:ve,potMaxRewards:j,fullness:gn}}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:s})=>{let[,i]=r,o=s,l=await this.client.getOmnipoolGlobalFarm(i),c=await this.client.getOmnipoolYieldFarm(Number(t),i,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(i),g=await this.getOraclePrice(m,d),y=await this.balanceClient.getTokenBalance(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 getIsolatedFarms(t){let e=await this.client.getIsolatedFarms(t),n=await this.client.getRelayBlockNumber(),a=await Promise.all(e.map(async({keyArgs:r,value:s})=>{let[,i]=r,o=s,l=await this.client.getIsolatedGlobalFarm(i),c=await this.client.getIsolatedYieldFarm(t,i,o);if(!l||!c)return;let m=l.reward_currency,d=l.incentivized_asset,p=this.getFarmAddress(i,!0),g=await this.getOraclePrice(m,d),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 Rr,Enum as Fr}from"polkadot-api";var Jt=class extends B{omnipoolAssetIds=[];async getOraclePrice(t){return await this.api.query.EmaOracle.Oracles.getValue(Rr.fromText("omnipool"),t,Fr("TenMinutes"))}async getRelayBlockNumber(){return(await this.api.query.ParachainSystem.ValidationData.getValue())?.relay_parent_number}async getOmnipooFarms(t){return this.api.query.OmnipoolWarehouseLM.ActiveYieldFarm.getEntries(t)}async getOmnipoolGlobalFarm(t){return this.api.query.OmnipoolWarehouseLM.GlobalFarm.getValue(t)}async getOmnipoolYieldFarm(t,e,n){return this.api.query.OmnipoolWarehouseLM.YieldFarm.getValue(t,e,n)}async getIsolatedFarms(t){return this.api.query.XYKWarehouseLM.ActiveYieldFarm.getEntries(t)}async getIsolatedGlobalFarm(t){return this.api.query.XYKWarehouseLM.GlobalFarm.getValue(t)}async getIsolatedYieldFarm(t,e,n){return this.api.query.XYKWarehouseLM.YieldFarm.getValue(t,e,n)}};async function _m(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(),s=new Q(e),i=new ut(r),o=new mt(i,{blockTime:n,minBudgetInNative:a}),l=new H(u),c=new Ht(u),m=new Gt(c,l),d=new Jt(u),p=new Qt(d,l);return{api:{aave:s,router:i,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{De as aave,Be as api,h as big,qe as client,_e as const,_m as createSdkContext,tt as erc20,Ne as error,Ue as evm,R as fmt,Yt as h160,$ as json,v as math,Je as pool,an as sor,ln as staking,mn as tx,Ce as xc};
|