@galacticcouncil/sdk 9.0.1 → 9.2.0
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 +2 -2
- package/build/index.mjs +2 -2
- package/build/types/aave/const.d.ts +1 -1
- package/build/types/pool/PoolClient.d.ts +1 -1
- package/build/types/sor/TradeScheduler.d.ts +1 -1
- package/build/types/tx/TradeTxBuilder.d.ts +0 -1
- package/build/types/tx/TxBuilder.d.ts +1 -1
- package/build/types/tx/types.d.ts +1 -0
- package/package.json +1 -1
- /package/build/types/{mm → oracle}/MmOracleClient.d.ts +0 -0
- /package/build/types/{mm → oracle}/abi.d.ts +0 -0
- /package/build/types/{mm → oracle}/index.d.ts +0 -0
- /package/build/types/{mm → oracle}/types.d.ts +0 -0
package/build/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var ut=Object.defineProperty;var pr=Object.getOwnPropertyDescriptor;var dr=Object.getOwnPropertyNames;var gr=Object.prototype.hasOwnProperty;var hr=(u,e)=>{for(var t in e)ut(u,t,{get:e[t],enumerable:!0})},fr=(u,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of dr(e))!gr.call(u,s)&&s!==t&&ut(u,s,{get:()=>e[s],enumerable:!(r=pr(e,s))||r.enumerable});return u};var Pr=u=>fr(ut({},"__esModule",{value:!0}),u);var Cr={};hr(Cr,{AMOUNT_MAX:()=>sr,AaveClient:()=>ie,AavePool:()=>Te,AavePoolClient:()=>Be,AaveUtils:()=>Z,AssetClient:()=>Q,AssetNotFound:()=>bt,BASILISK_PARACHAIN_ID:()=>$r,BalanceClient:()=>U,BigNumber:()=>v.BigNumber,CachingPoolService:()=>ce,ChainParams:()=>oe,DECIMAL_PLACES:()=>qt,DENOMINATOR:()=>dt,ERC20:()=>q,EvmClient:()=>we,FarmClient:()=>ze,H160:()=>$,HUB_ASSET_ID:()=>ye,HYDRADX_PARACHAIN_ID:()=>Vr,HYDRADX_SS58_PREFIX:()=>K,INFINITY:()=>yr,LbpMath:()=>H,LbpPool:()=>Ie,LbpPoolClient:()=>Ae,ONE:()=>D,OmniMath:()=>N,OmniPool:()=>_e,OmniPoolClient:()=>Ne,PolkadotApiClient:()=>L,PoolConfigNotFound:()=>yt,PoolError:()=>re,PoolFactory:()=>me,PoolNotFound:()=>xe,PoolService:()=>ue,PoolType:()=>k,ProviderConfigNotFound:()=>wt,RUNTIME_DECIMALS:()=>be,RouteNotFound:()=>te,Router:()=>pe,SYSTEM_ASSET_DECIMALS:()=>kt,SYSTEM_ASSET_ID:()=>M,StableMath:()=>C,StableSwap:()=>Ee,StableSwapClient:()=>De,StorageConfigNotFound:()=>St,SubscriptionNotSupported:()=>xt,TRADEABLE_DEFAULT:()=>Se,TradeOrderError:()=>Ft,TradeOrderType:()=>st,TradeRouteBuilder:()=>W,TradeRouter:()=>ge,TradeScheduler:()=>he,TradeType:()=>rt,TxBuilderFactory:()=>Pe,XykMath:()=>j,XykPool:()=>Fe,XykPoolClient:()=>Re,ZERO:()=>S,bnFormatter:()=>Nr,bnum:()=>p,calculateBuyFee:()=>Nt,calculateDiffToAvg:()=>Dr,calculateDiffToRef:()=>de,calculateSellFee:()=>_t,createChain:()=>vt,createSdkContext:()=>kr,findNestedKey:()=>Bt,findNestedObj:()=>_r,getFraction:()=>ee,isEvmAccount:()=>Ct,isEvmAddress:()=>Mt,isSs58Address:()=>Lt,scale:()=>_,toBn:()=>br,toDecimals:()=>T});module.exports=Pr(Cr);var se=[{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 ct=[{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 Ge="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",mt="0x112b087b60C1a166130d59266363C45F8aa99db0",pt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",We=1000000n;var Dt=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var ie=class{client;constructor(e){this.client=e.getWsProvider()}async getBlockTimestamp(){let e=await this.client.getBlock();return Number(e.timestamp)}async getReservesData(){return await this.client.readContract({abi:ct,address:mt,args:[pt],functionName:"getReservesData"})}async getUserReservesData(e){return await this.client.readContract({abi:ct,address:mt,args:[pt,e],functionName:"getUserReservesData"})}async getUserAccountData(e){return await this.client.readContract({abi:se,address:Ge,args:[e],functionName:"getUserAccountData"})}};var J=require("@polkadot/util-crypto"),ne=require("@polkadot/util"),Y=require("buffer");var $r=2090,dt=1e3,ye="1",Vr=2034,K=63,be=18,M="0",kt=12,Se=15;var gt="ETH\0";function Ct(u){if(!u)return!1;try{let e=(0,J.decodeAddress)(u,!0),t=Y.Buffer.from(gt);return Y.Buffer.from(e.subarray(0,t.length)).equals(t)}catch{return!1}}function Mt(u){return!!/^0x[a-fA-F0-9]{40}$/.test(u)}function Lt(u){try{let e=(0,ne.isHex)(u)?(0,ne.hexToU8a)(u):(0,J.decodeAddress)(u);return(0,J.encodeAddress)(e),!0}catch{return!1}}var $=class u{static toAccount=e=>{let t=Y.Buffer.from(e.slice(2),"hex"),r=Y.Buffer.from(gt);return(0,J.encodeAddress)(new Uint8Array(Y.Buffer.concat([r,t,Y.Buffer.alloc(8)])),63)};static fromAccount=e=>{let t=(0,J.decodeAddress)(e),r=Y.Buffer.from(gt),s=t.slice(r.length,-8);return"0x"+Y.Buffer.from(s).toString("hex")};static fromSS58=e=>{let r=(0,J.decodeAddress)(e).slice(0,20);return(0,ne.u8aToHex)(r)};static fromAny=e=>{if(Mt(e))return e;if(Ct(e))return u.fromAccount(e);if(Lt(e))return u.fromSS58(e);throw new Error("Unknown address type")}};var q=class{static fromAssetId(e){let t=Number(e),r=Buffer.alloc(20,0);return r[15]=1,r.writeUInt32BE(t,16),"0x"+r.toString("hex")}static toAssetId(e){let t=Buffer.from(e.replace("0x",""),"hex");return t.length!==20||!this.isAssetAddress(e)?null:t.readUInt32BE(16)}static isAssetAddress(e){let t=Buffer.from("0000000000000000000000000000000100000000","hex"),r=Buffer.from(e.replace("0x",""),"hex");return r.length!==20?!1:r.subarray(0,16).equals(t.subarray(0,16))}};var v=require("bignumber.js"),qt=12;v.BigNumber.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:qt});var S=p(0),D=p(1),yr=p("Infinity");function _(u,e){let t=new v.BigNumber(e.toString()),r=new v.BigNumber(10).pow(t);return u.times(r)}function p(u){return new v.BigNumber(u.toString())}function br(u,e){let t=p(u);return _(t,e)}function T(u,e){return u.shiftedBy(-1*e).toString()}var He=p("1e27"),Sr=p("1.01"),xr=p("31536000"),Z=class{client;constructor(e){this.client=new ie(e)}async getSummary(e){let t=$.fromAny(e),[r,s,i,n]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(t),this.client.getUserAccountData(t),this.client.getBlockTimestamp()]),[o]=r,[a,l]=s,[c,m,h,d,g,P]=i,f=p(P).dividedBy(1e18).decimalPlaces(6,v.BigNumber.ROUND_DOWN),x=p(c),b=p(m),I=[];for(let B of a){let w=B.underlyingAsset.toLowerCase(),A=o.find(({underlyingAsset:mr})=>mr.toLowerCase()===w);if(!A)throw new Error("Missing pool reserve for "+w);let E=p(B.scaledATokenBalance),z=p(A.liquidityIndex),Le=p(A.liquidityRate),qe=p(A.priceInMarketReferenceCurrency),ot=n+6,at=this.calculateLinearInterest(Le,A.lastUpdateTimestamp,ot),lt=z.multipliedBy(at).dividedBy(He).decimalPlaces(0,v.BigNumber.ROUND_DOWN),Ue=E.multipliedBy(lt).dividedBy(He).decimalPlaces(0,v.BigNumber.ROUND_DOWN),lr=p(l===A.eModeCategoryId?A.eModeLiquidationThreshold:A.reserveLiquidationThreshold).div(1e4),ur=A.usageAsCollateralEnabled&&B.usageAsCollateralEnabledOnUser&&p(B.scaledATokenBalance).gt(0),cr=q.toAssetId(w);I.push({aTokenBalance:Ue,decimals:Number(A.decimals),isCollateral:ur,priceInRef:qe,reserveId:cr,reserveAsset:w,reserveLiquidationThreshold:lr})}return{healthFactor:f.toNumber(),totalCollateral:x,totalDebt:b,reserves:I}}async hasBorrowPositions(e){let t=$.fromAny(e),r=await this.client.getUserAccountData(t),[s,i]=r;return i>0n}async getHealthFactor(e){let t=$.fromAny(e),r=await this.client.getUserAccountData(t),[s,i,n,o,a,l]=r;return p(l).dividedBy(1e18).decimalPlaces(6,v.BigNumber.ROUND_DOWN).toNumber()}async getHealthFactorAfterWithdraw(e,t,r){let{totalCollateral:s,totalDebt:i,reserves:n}=await this.getSummary(e),o=q.fromAssetId(t),a=n.find(x=>x.reserveAsset===o);if(!a)throw new Error("Missing reserve ctx for "+o);let{decimals:l,isCollateral:c,priceInRef:m,reserveLiquidationThreshold:h}=a,d=_(p(r),l).decimalPlaces(0,1),g=c?d.multipliedBy(m).dividedBy(p(10).pow(l)).decimalPlaces(0,v.BigNumber.ROUND_DOWN):S,P=s.minus(g);return P.lte(0)?0:P.multipliedBy(h).dividedBy(i).decimalPlaces(6,v.BigNumber.ROUND_DOWN).toNumber()}async getHealthFactorAfterSupply(e,t,r){let{totalCollateral:s,totalDebt:i,reserves:n}=await this.getSummary(e),o=q.fromAssetId(t),a=n.find(f=>f.reserveAsset===o);if(!a)throw new Error("Missing reserve ctx for "+o);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:m}=a,d=_(p(r),l).decimalPlaces(0,1).multipliedBy(c).dividedBy(p(10).pow(l)).decimalPlaces(0,v.BigNumber.ROUND_DOWN),g=s.plus(d);return g.lte(0)?0:g.multipliedBy(m).dividedBy(i).decimalPlaces(6,v.BigNumber.ROUND_DOWN).toNumber()}async getMaxWithdraw(e,t){let{totalCollateral:r,totalDebt:s,reserves:i}=await this.getSummary(e),n=q.fromAssetId(t),o=i.find(a=>a.reserveAsset===n);if(!o)throw new Error("Missing reserve ctx for "+n);return this.calculateWithdrawMax(o,r,s)}async getMaxWithdrawAll(e){let{totalCollateral:t,totalDebt:r,reserves:s}=await this.getSummary(e),i={};for(let n of s){let o=this.calculateWithdrawMax(n,t,r);n.reserveId&&(i[n.reserveId]=o)}return i}calculateWithdrawMax(e,t,r){let{aTokenBalance:s,decimals:i,priceInRef:n,reserveLiquidationThreshold:o}=e,a=Sr.multipliedBy(r).div(o).decimalPlaces(0,v.BigNumber.ROUND_UP),l=t.minus(a).decimalPlaces(0,1);if(l.lte(0))return{amount:S,decimals:i};let c=l.multipliedBy(p(10).pow(i)).dividedBy(n).decimalPlaces(0,v.BigNumber.ROUND_DOWN);return{amount:v.BigNumber.minimum(s,c),decimals:i}}calculateLinearInterest(e,t,r){let s=r-t;return s<=0?He:e.multipliedBy(s).dividedBy(xr).plus(He).decimalPlaces(0,v.BigNumber.ROUND_DOWN)}};function Ut(u){switch(u){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var ps=require("@galacticcouncil/api-augment/hydradx"),ds=require("@galacticcouncil/api-augment/basilisk"),L=class{api;constructor(e){this.api=e}get chainDecimals(){return this.api.registry.chainDecimals[0]}get chainToken(){return this.api.registry.chainTokens[0]}log(e,...t){let r=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");Ut(r)&&console.log(e,...t)}};var Q=class extends L{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(e){super(e)}async safeSharesQuery(){try{let e=await this.api.query.stableswap.pools.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}async safeBondsQuery(){try{let e=await this.api.query.bonds.bonds.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}async metadataQuery(){try{let e=await this.api.query.assetRegistry.assetMetadataMap.entries();return new Map(e.map(([{args:[t]},r])=>{let{decimals:s,symbol:i}=r.unwrap();return[t.toString(),{decimals:s.toNumber(),symbol:i.toHuman()}]}))}catch{return new Map([])}}async locationsQuery(){try{let e=await this.api.query.assetRegistry.assetLocations.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}getSystemTokenName(e){switch(e){case"HDX":return"Hydration";case"BSX":return"Basilisk";default:return e}}getToken(e,t,r,s){if(e==M){let m=this.api.consts.balances.existentialDeposit;return{id:M,name:this.getSystemTokenName(this.chainToken),symbol:this.chainToken,decimals:this.chainDecimals,icon:this.chainToken,type:"Token",isSufficient:!0,existentialDeposit:m.toString()}}let{name:i,assetType:n,isSufficient:o,existentialDeposit:a}=t,{symbol:l,decimals:c}=r.get(e)??{};return{id:e,name:i.toHuman(),symbol:l,decimals:c,icon:l,type:n.toHuman(),isSufficient:o?o.toHuman():!0,location:s?.toJSON(),existentialDeposit:a.toString()}}getBond(e,t,r,s){let[i,n]=s,{assetType:o,isSufficient:a,existentialDeposit:l}=t,{symbol:c,decimals:m}=this.getToken(i.toString(),t,r),h=n.toNumber(),d=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",d.format(h)].join(" ");return{id:e,name:g,symbol:c+"b",decimals:m,icon:c,type:o.toString(),isSufficient:a.toHuman(),existentialDeposit:l.toString(),underlyingAssetId:i.toString(),maturity:h}}getShares(e,t,r,s){let{assets:i}=s,{name:n,symbol:o,assetType:a,isSufficient:l,existentialDeposit:c}=t,h=i.map(P=>P.toString()).map(P=>{let{symbol:f}=this.getToken(P,t,r);return[P,f]}),d=Object.fromEntries(h),g=Object.values(d);return{id:e,name:g.join(", "),symbol:o?.isSome?o.toHuman():n.toHuman(),decimals:18,icon:g.join("/"),type:a.toString(),isSufficient:l.toHuman(),existentialDeposit:c.toString(),meta:d}}getExternal(e,t,r,s){let i=this.getToken(e,t,new Map,s),n=r?.find(o=>o.internalId===i.id);return n?{...i,decimals:n.decimals,name:n.name,symbol:n.symbol,icon:n.symbol,isWhiteListed:n.isWhiteListed}:i}normalizeMetadata(e,t){return t.size?t:new Map(e.map(([{args:[r]},s])=>{let{decimals:i,symbol:n}=s.unwrap();return[r.toString(),{decimals:Number(i.toString()),symbol:n.toHuman()}]}))}getSupportedAssets(e){return e.filter(([t,r])=>{if(r.isNone)return!1;let s=r.unwrap();return this.isSupportedAsset(s)})}async getOnChainAssets(e,t){let[r,s,i,n,o]=await Promise.all([this.api.query.assetRegistry.assets.entries(),this.locationsQuery(),this.safeSharesQuery(),this.safeBondsQuery(),this.metadataQuery()]),a=this.getSupportedAssets(r),l=this.normalizeMetadata(a,o),c=a.map(([{args:[m]},h])=>{let d=h.unwrap(),g=s.get(m.toString()),{assetType:P}=d;switch(P.toString()){case"Bond":let f=n.get(m.toString());return this.getBond(m.toString(),d,l,f);case"StableSwap":let x=i.get(m.toString());return this.getShares(m.toString(),d,l,x);case"External":return this.getExternal(m.toString(),d,t,g);default:return this.getToken(m.toString(),d,l,g)}});return e?c:c.filter(m=>this.isValidAsset(m))}isValidAsset(e){let t=Math.sign(e.decimals);return!!e.symbol&&(t===0||t===1)}isSupportedAsset(e){let t=e.assetType.toString();return this.SUPPORTED_TYPES.includes(t)}};var U=class extends L{constructor(e){super(e)}async getBalance(e,t){let r=await this.api.query.assetRegistry.assets(t),{assetType:s}=r.unwrap();return s.toString()==="Erc20"?this.getErc20Balance(e,t):t===M?this.getSystemBalance(e):this.getTokenBalance(e,t)}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateFreeBalance(t)}async getTokenBalance(e,t){let{free:r,reserved:s,frozen:i}=await this.api.query.tokens.accounts(e,t);return this.calculateFreeBalance({free:r,feeFrozen:s,frozen:i})}async getErc20Balance(e,t){let{free:r,reserved:s,frozen:i}=await this.getTokenBalanceData(e,t);return this.calculateFreeBalance({free:r,feeFrozen:0n,frozen:i})}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t(M,this.calculateFreeBalance(r)))}async subscribeTokenBalance(e,t,r){let s=await this.api.query.tokens.accounts.keys(e),i=r?r.map(n=>[e,n]):s.map(({args:[n,o]})=>[n.toString(),o.toString()]);return this.api.query.tokens.accounts.multi(i,n=>{let o=[];n.forEach((a,l)=>{let c=this.calculateFreeBalance(a),m=i[l][1];o.push([m,c])}),t(o)})}async subscribeErc20Balance(e,t,r){let i=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([a,l])=>{let{assetType:c}=l.unwrap();return c.toString()==="Erc20"}).map(([{args:[a]}])=>a.toString()))(),n=async()=>{let o=await Promise.all(i.map(async a=>[a,await this.getErc20Balance(e,a)]));t(o)};return this.api.rpc.chain.subscribeNewHeads(async()=>{n()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateFreeBalance(e){let{free:t,miscFrozen:r,feeFrozen:s,frozen:i}=e,n=new v.BigNumber(t),o=new v.BigNumber(r||i),a=new v.BigNumber(s||0n),l=o.gt(a)?o:a;return n.minus(l)}};var oe=class{api;_minOrderBudget;_blockTime;constructor(e){this.api=e}get blockTime(){return this._blockTime===void 0&&(this._blockTime=this.api.consts.aura.slotDuration.toNumber()),this._blockTime}get minOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=this.api.consts.dca.minBudgetInNativeCurrency.toString()),p(this._minOrderBudget)}};var ht=require("@galacticcouncil/math-liquidity-mining"),Gt=require("@polkadot/types"),ft=require("@polkadot/util"),Pt=require("@polkadot/util-crypto");var ze=class extends L{balanceClient;constructor(e){super(e),this.balanceClient=new U(e)}secondsInYear=new v.BigNumber(365.2425).times(24).times(60).times(60);async getOmnipoolFarms(e){let t=await this.api.query.omnipoolWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,i])=>{let[,n]=s.args,o=i.unwrap().toString(),a=n.toString(),l=(await this.api.query.omnipoolWarehouseLM.globalFarm(a)).unwrap(),c=(await this.api.query.omnipoolWarehouseLM.yieldFarm(e,a,o)).unwrap(),m=await this.getOraclePrice(l)??l.priceAdjustment.toString(),d=this.getAccountResolver(this.api.registry)(Number(a),!1).toString(),g=l.rewardCurrency.toString(),P=await this.balanceClient.getTokenBalanceData(d,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:m,potBalance:P.free.toString()}}))}async getIsolatedPoolFarms(e){let t=await this.api.query.xykWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,i])=>{let[,n]=s.args,o=i.unwrap().toString(),a=n.toString(),l=(await this.api.query.xykWarehouseLM.globalFarm(a)).unwrap(),c=(await this.api.query.xykWarehouseLM.yieldFarm(e,a,o)).unwrap(),m=await this.getOraclePrice(l)??l.priceAdjustment.toString(),d=this.getAccountResolver(this.api.registry)(Number(a),!0).toString(),g=l.rewardCurrency.toString(),P=await this.balanceClient.getTokenBalanceData(d,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:m,potBalance:P.free.toString()}}))}async getOraclePrice(e){let t=e.rewardCurrency.toString(),r=e.incentivizedAsset.toString(),s=[t,r].sort();if(t===r)return new v.BigNumber(1).shiftedBy(18).toString();let i=await this.api.query.emaOracle.oracles("omnipool",s,"TenMinutes");if(i.isNone)return;let[n]=i.unwrap(),o=n.price.n.toString(),a=n.price.d.toString(),l;return Number(t)<Number(r)?l=(0,ht.fixed_from_rational)(o,a):l=(0,ht.fixed_from_rational)(a,o),l}getGlobalRewardPerPeriod(e,t,r,s){let n=e.times(t).shiftedBy(-18).times(s).shiftedBy(-18);return n.gte(r)?r:n}getPoolYieldPerPeriod(e,t,r,s){return e.times(t).div(r.times(s).shiftedBy(-18))}padEndU8a(e,t){return(0,ft.u8aConcat)(e,Array(Math.max(0,t-e.length)).fill(0))}getAccountResolver=e=>(t,r)=>{let s="modl",i=r?"0x78796b4c4d704944":"0x4f6d6e6957684c4d";return new Gt.GenericAccountId32(e,this.padEndU8a((0,ft.u8aConcat)(s,i,typeof t!="number"?t.toU8a():[t]),32))};async getFarmApr(e,t){if(t==="isolatedpool"&&!(0,Pt.isAddress)(e))throw new Error("You must pass an address of isolated pool as id");if(t==="omnipool"&&(0,Pt.isAddress)(e))throw new Error("You must pass an asset id of omnipool");let r=6,s=t==="omnipool"?await this.getOmnipoolFarms(e):await this.getIsolatedPoolFarms(e);return s.length?s.map(({yieldFarm:o,globalFarm:a,priceAdjustment:l,potBalance:c})=>{let m=new v.BigNumber(a.totalSharesZ.toString()),h=a.plannedYieldingPeriods.toString(),d=new v.BigNumber(a.yieldPerPeriod.toString()),g=new v.BigNumber(a.maxRewardPerPeriod.toString()),P=a.blocksPerPeriod.toString(),f=new v.BigNumber(o.multiplier.toString()).shiftedBy(-18),x=this.secondsInYear.div(new v.BigNumber(r).times(P)),b;if(m.isZero())b=d.times(f).times(x);else{let E=this.getGlobalRewardPerPeriod(m,d,g,l);b=this.getPoolYieldPerPeriod(E,f,m,l).times(x)}let I=new v.BigNumber(a.pendingRewards.toString()).plus(a.accumulatedPaidRewards.toString()),B=g.times(h),w=c?I.plus(c):B;return I.div(w).gte(.999)?S:b.div(t==="isolatedpool"?2:1).times(100)}).reduce((o,a)=>o.plus(a),S).toString():void 0}};var xe=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},yt=class extends Error{constructor(e,t){super(),this.message=`${e} pool missing ${t}`,this.name="PoolConfigNotFound"}},te=class extends Error{constructor(e,t){super(),this.message=`Route from ${e} to ${t} not found in pool configuration`,this.name="RouteNotFound"}},bt=class extends Error{constructor(e){super(),this.message=`Asset ${e} not available in current network`,this.name="AssetNotFound"}},St=class extends Error{constructor(e){super(),this.message=`Storage missing ${e}`,this.name="StorageConfigNotFound"}},xt=class extends Error{constructor(e){super(),this.message=`Subscription type "${e}" not supported`,this.name="SubscriptionNotSupported"}},wt=class extends Error{constructor(e){super(),this.message=`${e}`,this.name="ProviderConfigNotFound"}};var Wt=require("viem"),wr=["wss://hydration-rpc.n.dwellir.com","wss://hydration.dotters.network","wss://rpc.helikon.io/hydradx","wss://hydration.ibp.network","wss://rpc.cay.hydration.cloud","wss://rpc.parm.hydration.cloud","wss://rpc.roach.hydration.cloud","wss://rpc.zipp.hydration.cloud","wss://rpc.sin.hydration.cloud","wss://rpc.coke.hydration.cloud"],vt=u=>{let e=u.__internal__endpoints,t=e.some(s=>wr.includes(s)),r=e.map(s=>s.replace("wss://","https://").replace("ws://","http://"));return(0,Wt.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:r}},blockExplorers:{default:{name:"Hydration Explorer",url:t?"https://explorer.evm.hydration.cloud":"https://explorer.nice.hydration.cloud"}},testnet:!t})};var V=require("viem");function Ht(u){let e=async({method:t,params:r})=>{let s=Array.isArray(r)?r:[];return u.send(t,s)};return()=>({request:e,config:{name:"PolkadotWsTransport",type:"webSocket",key:"polkadotWs",request:e}})}var we=class{wsProvider;chain;constructor(e){let{provider:t}=e._options;this.wsProvider=t,this.chain=vt(t)}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return(0,V.createPublicClient)({chain:this.chain,transport:(0,V.http)()})}getWsProvider(){return(0,V.createPublicClient)({chain:this.chain,transport:Ht(this.wsProvider)})}getSigner(e){return(0,V.createWalletClient)({account:e,chain:this.chain,transport:(0,V.custom)(window.ethereum)})}};var ve=(u,e)=>u===e?0:u==null?e==null?0:-1:e==null?u==null?0:1:typeof u.compare=="function"?u.compare(e):typeof e.compare=="function"?-e.compare(u):u<e?-1:u>e?1:0;var Xe=(u,e=t=>t!==void 0?": "+t:"")=>class extends Error{origMessage;constructor(t){super(u(t)+e(t)),this.origMessage=t!==void 0?String(t):""}};var vr=Xe(()=>"illegal argument(s)"),zt=u=>{throw new vr(u)};var Tr=Xe(()=>"index out of bounds"),Tt=u=>{throw new Tr(u)},Ye=(u,e,t)=>(u<e||u>=t)&&Tt(u);var Xt=23283064365386963e-26,$e=class{float(e=1){return this.int()*Xt*e}probability(e){return this.float()<e}norm(e=1){return(this.int()*Xt-.5)*2*e}normMinMax(e,t){let r=this.minmax(e,t);return this.float()<.5?r:-r}minmax(e,t){return this.float()*(t-e)+e}minmaxInt(e,t){e|=0;let r=(t|0)-e;return r?e+this.int()%r:e}minmaxUint(e,t){e>>>=0;let r=(t>>>0)-e;return r?e+this.int()%r:e}};var Ve=class extends $e{constructor(e){super(),this.rnd=e}float(e=1){return this.rnd()*e}norm(e=1){return(this.rnd()-.5)*2*e}int(){return this.rnd()*4294967296>>>0}};var Yt=new Ve(Math.random);var $t=u=>u!=null&&typeof u!="function"&&u.length!==void 0;var Vt=Object.getPrototypeOf({}),je="function",jt="string",ae=(u,e)=>{let t;if(u===e)return!0;if(u!=null){if(typeof u.equiv===je)return u.equiv(e)}else return u==e;if(e!=null){if(typeof e.equiv===je)return e.equiv(u)}else return u==e;return typeof u===jt||typeof e===jt?!1:(t=Object.getPrototypeOf(u),(t==null||t===Vt)&&(t=Object.getPrototypeOf(e),t==null||t===Vt)?Ar(u,e):typeof u!==je&&u.length!==void 0&&typeof e!==je&&e.length!==void 0?Or(u,e):u instanceof Set&&e instanceof Set?Br(u,e):u instanceof Map&&e instanceof Map?Ir(u,e):u instanceof Date&&e instanceof Date?u.getTime()===e.getTime():u instanceof RegExp&&e instanceof RegExp?u.toString()===e.toString():u!==u&&e!==e)},Or=(u,e,t=ae)=>{let r=u.length;if(r===e.length)for(;r-- >0&&t(u[r],e[r]););return r<0},Br=(u,e,t=ae)=>u.size===e.size&&t([...u.keys()].sort(),[...e.keys()].sort()),Ir=(u,e,t=ae)=>u.size===e.size&&t([...u].sort(),[...e].sort()),Ar=(u,e,t=ae)=>{if(Object.keys(u).length!==Object.keys(e).length)return!1;for(let r in u)if(!e.hasOwnProperty(r)||!t(u[r],e[r]))return!1;return!0};var Ot=class{value;constructor(e){this.value=e}deref(){return this.value}};var Kt=u=>u instanceof Ot;var Ke=class u{_head;_length=0;constructor(e){e&&this.into(e)}get length(){return this._length}get head(){return this._head}[Symbol.iterator](){return Jt("next",this._head)}reverseIterator(){return Jt("prev",this.tail)}clear(){this.release()}compare(e,t=ve){let r=this._length;if(r<e._length)return-1;if(r>e._length)return 1;if(r===0)return 0;{let s=this._head,i=e._head,n=0;for(;r-- >0&&n===0;)n=t(s.value,i.value),s=s.next,i=i.next;return n}}concat(...e){let t=this.copy();for(let r of e)t.into(r);return t}equiv(e){if(!(e instanceof u||$t(e))||this._length!==e.length)return!1;if(!this._length||this===e)return!0;let t=e[Symbol.iterator](),r=this._head;for(let s=this._length;s-- >0;){if(!ae(r.value,t.next().value))return!1;r=r.next}return!0}filter(e){let t=this.empty();return this.traverse(r=>(e(r.value)&&t.append(r.value),!0)),t}find(e){return this.traverse(t=>t.value!==e)}findWith(e){return this.traverse(t=>!e(t.value))}first(){return this._head&&this._head.value}insertSorted(e,t){t=t||ve;for(let r=this._head,s=this._length;s-- >0;){if(t(e,r.value)<=0)return this.insertBefore(r,e);r=r.next}return this.append(e)}into(e){for(let t of e)this.append(t);return this}nth(e,t){let r=this.nthCell(e);return r?r.value:t}nthCellUnsafe(e){let t,r;for(e<=this._length>>>1?(t=this._head,r="next"):(t=this.tail,r="prev",e=this._length-e-1);e-- >0&&t;)t=t[r];return t}peek(){return this.tail&&this.tail.value}$reduce(e,t){let r=this._head;for(let s=this._length;s-- >0&&!Kt(t);)t=e(t,r.value),r=r.next;return t}reduce(e,t){return this.$reduce(e,t)}release(){let e=this._head;if(!e)return!0;let t;for(let r=this._length;r-- >0;)t=e.next,delete e.value,delete e.prev,delete e.next,e=t;return this._head=void 0,this._length=0,!0}reverse(){let e=this._head,t=this.tail,r=(this._length>>>1)+(this._length&1);for(;e&&t&&r>0;){let s=e.value;e.value=t.value,t.value=s,e=e.next,t=t.prev,r--}return this}setHead(e){let t=this._head;return t?(t.value=e,t):this.prepend(e)}setNth(e,t){let r=this.nthCell(e);return!r&&Tt(e),r.value=t,r}setTail(e){let t=this.tail;return t?(t.value=e,t):this.append(e)}swap(e,t){if(e!==t){let r=e.value;e.value=t.value,t.value=r}return this}toArray(e=[]){return this.traverse(t=>(e.push(t.value),!0)),e}toJSON(){return this.toArray()}toString(){let e=[];return this.traverse(t=>(e.push(String(t.value)),!0)),e.join(", ")}traverse(e,t=this._head,r){if(!this._head)return;let s=t;do{if(!e(s))break;s=s.next}while(s!==r);return s}_map(e,t){return this.traverse(r=>(e.append(t(r.value)),!0)),e}};function*Jt(u,e){for(;e;)yield e.value,e=e[u]}var Je=class u extends Ke{_tail;constructor(e){super(),e&&this.into(e)}get tail(){return this._tail}append(e){if(this._tail){let t={value:e,prev:this._tail};return this._tail.next=t,this._tail=t,this._length++,t}else return this.prepend(e)}asHead(e){return e===this._head?this:(this.remove(e),this._head.prev=e,e.next=this._head,e.prev=void 0,this._head=e,this._length++,this)}asTail(e){return e===this._tail?this:(this.remove(e),this._tail.next=e,e.prev=this._tail,e.next=void 0,this._tail=e,this._length++,this)}cons(e){return this.prepend(e),this}copy(){return new u(this)}*cycle(){for(;;)yield*this}drop(){let e=this._head;if(e)return this._head=e.next,this._head?this._head.prev=void 0:this._tail=void 0,this._length--,e.value}empty(){return new u}insertAfter(e,t){let r={value:t,next:e.next,prev:e};return e.next?e.next.prev=r:this._tail=r,e.next=r,this._length++,r}insertAfterNth(e,t){return e<0&&(e+=this._length),e>=this._length-1?this.append(t):(Ye(e,0,this._length),this.insertAfter(this.nthCellUnsafe(e),t))}insertBefore(e,t){let r={value:t,next:e,prev:e.prev};return e.prev?e.prev.next=r:this._head=r,e.prev=r,this._length++,r}insertBeforeNth(e,t){return e<0&&(e+=this._length),e<=0?this.prepend(t):(Ye(e,0,this._length),this.insertBefore(this.nthCellUnsafe(e),t))}map(e){return this._map(new u,e)}nth(e,t){let r=this.nthCell(e);return r?r.value:t}nthCell(e){if(e<0&&(e+=this._length),!(e<0||e>=this._length))return this.nthCellUnsafe(e)}pop(){let e=this._tail;if(e)return this._tail=e.prev,this._tail?this._tail.next=void 0:this._head=void 0,this._length--,e.value}prepend(e){let t={value:e,next:this._head};return this._head?this._head.prev=t:this._tail=t,this._head=t,this._length++,t}push(e){return this.append(e),this}release(){return this._tail=void 0,super.release()}remove(e){return e.prev?e.prev.next=e.next:this._head=e.next,e.next?e.next.prev=e.prev:this._tail=e.prev,this._length--,this}rotateLeft(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:return this.push(this.drop())}}rotateRight(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:let e=this.peek();return this.pop(),this.prepend(e),this}}seq(e=0,t=this.length){if(e>=t||e<0)return;let r=this.nthCell(e),s=this.nthCell(t-1),i=n=>({first(){return n.value},next(){return n!==s&&n.next?i(n.next):void 0}});return r?i(r):void 0}shuffle(e,t=Yt){if(this._length<2)return this;for(e=e!==void 0?e:Math.ceil(1.5*Math.log2(this._length));e>0;e--){let r=this._head;for(;r;){let s=r.next;t.probability(.5)?this.asHead(r):this.asTail(r),r=s}}return this}slice(e=0,t=this.length){let r=e<0?e+this._length:e,s=t<0?t+this._length:t;(r<0||s<0)&&zt("invalid indices: ${from} / ${to}");let i=new u,n=this.nthCell(r);for(;n&&++r<=s;)i.push(n.value),n=n.next;return i}sort(e=ve){if(!this._length)return this;let t=1;for(;;){let r=this._head;this._head=void 0,this._tail=void 0;let s=0;for(;r;){s++;let i=r,n=0;for(let a=0;a<t&&(n++,i=i.next,!!i);a++);let o=t;for(;n>0||o>0&&i;){let a;n===0?(a=i,i=i.next,o--):!i||o===0||e(r.value,i.value)<=0?(a=r,r=r.next,n--):(a=i,i=i.next,o--),this._tail?this._tail.next=a:this._head=a,a.prev=this._tail,this._tail=a}r=i}if(this._tail.next=void 0,s<=1)return this;t*=2}}splice(e,t=0,r){let s;typeof e=="number"?(e<0&&(e+=this._length),Ye(e,0,this._length),s=this.nthCellUnsafe(e)):s=e;let i=new u;if(t>0)for(;s&&t-- >0;)this.remove(s),i.push(s.value),s=s.next;else s&&(s=s.next);if(r)if(s)for(let n of r)this.insertBefore(s,n);else for(let n of r)this.push(n);return i}};var le=class u{map;items;opts;_size;constructor(e,t){let r={maxlen:1/0,maxsize:1/0,map:()=>new Map,ksize:()=>0,vsize:()=>0,...t};this.map=r.map(),this.items=new Je,this._size=0,this.opts=r,e&&this.into(e)}get length(){return this.items.length}get size(){return this._size}[Symbol.iterator](){return this.entries()}*entries(){for(let e of this.items)yield[e.k,e]}*keys(){for(let e of this.items)yield e.k}*values(){for(let e of this.items)yield e.v}copy(){let e=this.empty();e.items=this.items.copy();let t=e.items.head;for(;t;)e.map.set(t.value.k,t),t=t.next;return e}empty(){return new u(null,this.opts)}release(){this._size=0,this.map.clear();let e=this.opts.release;if(e){let t;for(;t=this.items.drop();)e(t.k,t.v);return!0}return this.items.release()}has(e){return this.map.has(e)}get(e,t){let r=this.map.get(e);return r?this.resetEntry(r):t}set(e,t){let r=this.opts.ksize(e)+this.opts.vsize(t),s=this.map.get(e),i=Math.max(0,r-(s?s.value.s:0));return this._size+=i,this.ensureSize()?this.doSetEntry(s,e,t,r):this._size-=i,t}into(e){for(let t of e)this.set(t[0],t[1]);return this}async getSet(e,t){let r=this.map.get(e);return r?this.resetEntry(r):this.set(e,await t())}delete(e){let t=this.map.get(e);return t?(this.removeEntry(t),!0):!1}resetEntry(e){return this.items.asTail(e),e.value.v}ensureSize(){let{release:e,maxsize:t,maxlen:r}=this.opts;for(;this._size>t||this.length>=r;){let s=this.items.drop();if(!s)return!1;this.map.delete(s.k),e?.(s.k,s.v),this._size-=s.s}return!0}removeEntry(e){let t=e.value;this.map.delete(t.k),this.items.remove(e),this.opts.release?.(t.k,t.v),this._size-=t.s}doSetEntry(e,t,r,s){e?(this.opts.update?.(t,e.value.v,r),e.value.v=r,e.value.s=s,this.items.asTail(e)):(this.items.push({k:t,v:r,s}),this.map.set(t,this.items.tail))}};var Ze=class u extends le{constructor(e,t){super(e,{ttl:60*60*1e3,autoExtend:!1,...t})}empty(){return new u(null,this.opts)}has(e){return this.get(e)!==void 0}get(e,t){let r=this.map.get(e);if(r){if(r.value.t>=Date.now())return this.resetEntry(r);this.removeEntry(r)}return t}set(e,t,r=this.opts.ttl){let s=this.opts.ksize(e)+this.opts.vsize(t),i=this.map.get(e),n=Math.max(0,s-(i?i.value.s:0));return this._size+=n,this.ensureSize()?this.doSetEntry(i,e,t,s,r):this._size-=n,t}async getSet(e,t,r=this.opts.ttl){let s=this.get(e);return s!==void 0?s:this.set(e,await t(),r)}prune(){let e=Date.now(),t=this.items.head,r=0;for(;t;)t.value.t<e&&(this.removeEntry(t),r++),t=t.next;return r}ensureSize(){let{maxlen:e,maxsize:t}=this.opts,r=Date.now(),s=this.items.head;for(;s&&(this._size>t||this.length>=e);)s.value.t<r&&this.removeEntry(s),s=s.next;return super.ensureSize()}doSetEntry(e,t,r,s,i=this.opts.ttl){let n=Date.now()+i;e?(this.opts.update?.(t,e.value.v,r),e.value.v=r,e.value.s=s,e.value.t=n,this.items.asTail(e)):(this.items.push({k:t,v:r,s,t:n,ttl:i}),this.map.set(t,this.items.tail))}resetEntry(e){return this.opts.autoExtend&&(e.value.t=Date.now()+e.value.ttl),super.resetEntry(e)}};var Qe=(u,e=new Map)=>t=>{let r;return e.has(t)?e.get(t):(e.set(t,r=u(t)),r)};var k=(i=>(i.Aave="Aave",i.LBP="Lbp",i.Omni="Omnipool",i.Stable="Stableswap",i.XYK="Xyk",i))(k||{}),re=(i=>(i.UnknownError="UnknownError",i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i))(re||{});var Te=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new u(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit)}constructor(e,t,r,s,i){this.type="Aave",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=i}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(a=>[a.id,a])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let n=p(s.balance),o=p(i.balance);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:n,balanceOut:o,assetInED:S,assetOutED:S}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=[];return t.isGreaterThan(e.balanceOut)&&i.push("TradeNotAllowed"),{amountIn:s,calculatedIn:s,amountOut:t,feePct:0,errors:i}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=[];return s.isGreaterThan(e.balanceOut)&&i.push("TradeNotAllowed"),{amountIn:t,calculatedOut:s,amountOut:s,feePct:0,errors:i}}calculateInGivenOut(e,t){return t}calculateOutGivenIn(e,t){return t}spotPriceInGivenOut(e){return _(D,e.decimalsOut)}spotPriceOutGivenIn(e){return _(D,e.decimalsIn)}calculateTradeFee(e,t){return S}};var Zt=require("@polkadot/util-crypto"),Qt=require("@polkadot/util"),er=require("viem");function Bt(u,e){let t=[];return JSON.stringify(u,(r,s)=>(s&&s[e]&&t.push(s),s)),t[0]}function _r(u,e,t){let r;return JSON.stringify(u,(s,i)=>(i&&i[e]===t&&(r=i),i)),r}var Nr=(u,e)=>typeof e=="bigint"?e.toString():e;var It=[{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 Oe=class{client;constructor(e){this.client=e.getWsProvider()}async getData(e,t=6){let[r,s,i]=await Promise.all([this.client.readContract({abi:It,address:e,functionName:"latestRoundData"}),this.client.readContract({abi:It,address:e,functionName:"decimals"}),this.client.getBlock()]),[n,o,a,l]=r,c=i.number-(i.timestamp-l)/BigInt(t);return{price:o,decimals:s,updatedAt:Number(c)}}};var G=class extends U{evm;mmOracle;pools=[];subs=[];assets=new Map([]);mem=0;memPoolsCache=new Ze(null,{maxlen:1,ttl:1*60*60*1e3,release:e=>{this.mem>e&&this.log(this.getPoolType(),`mem ${e} released at`,new Date)}});memPools=Qe(e=>(this.log(this.getPoolType(),`mem ${e} sync`),this.getPools()),this.memPoolsCache);constructor(e,t){super(e),this.evm=t,this.mmOracle=new Oe(t)}get augmentedPools(){return this.pools.filter(e=>this.isValidPool(e)).map(e=>this.withMetadata(e))}async withAssets(e){this.assets=new Map(e.map(t=>[t.id,t])),this.mem=this.mem+1}async getPoolsMem(){return await this.memPools(this.mem)}async getPools(){this.unsubscribe(),this.pools=await this.loadPools(),this.subs=this.subscribe();let e=this.getPoolType();return this.log(e,`mem ${this.mem} pools(${this.augmentedPools.length})`),this.log(e,`mem ${this.mem} subs(${this.subs.length})`),this.augmentedPools}subscribe(){return this.augmentedPools.map(t=>{let r=[];try{let i=this.subscribePoolChange(t);r.push(i)}catch{}if(t.type==="Aave")return r;let s=this.subscribeTokensPoolBalance(t);if(r.push(s),this.hasSystemAsset(t)){let i=this.subscribeSystemPoolBalance(t);r.push(i)}if(this.hasErc20Asset(t)){let i=this.subscribeErc20PoolBalance(t);r.push(i)}return this.subscribeLog(t),r}).flat()}hasSystemAsset(e){return e.tokens.some(t=>t.id==="0")}hasErc20Asset(e){return e.tokens.some(t=>t.type==="Erc20")}unsubscribe(){this.subs.forEach(e=>{e.then(t=>t())})}subscribeLog(e){let t=e.address.substring(0,10).concat("...");this.log(`${e.type} mem ${this.mem} [${t}] balance subscribed`)}subscribeSystemPoolBalance(e){return this.subscribeSystemBalance(e.address,this.updateBalanceCallback(e))}subscribeTokensPoolBalance(e){let t=(r,s)=>r.id!==s;return this.subscribeTokenBalance(e.address,this.updateBalancesCallback(e,t))}subscribeErc20PoolBalance(e){let t=e.tokens.filter(r=>r.type==="Erc20").map(r=>r.id);return this.subscribeErc20Balance(e.address,this.updateBalancesCallback(e,()=>!0),t)}isValidPool(e){return e.type==="Xyk"?e.tokens.every(t=>this.assets.get(t.id)):!0}withMetadata(e){return e.tokens=e.tokens.map(t=>{let r=this.assets.get(t.id);return{...t,...r}}),e}updateBalancesCallback(e,t){return function(r){r.forEach(([s,i])=>{let n=e.tokens.findIndex(o=>o.id==s);n>=0&&t(e,s)&&(e.tokens[n].balance=i.toString())})}}updateBalanceCallback(e){return function(t,r){let s=e.tokens.findIndex(i=>i.id==t);s>=0&&(e.tokens[s].balance=r.toString())}}};var Fr=["Supply","Withdraw","Repay","Borrow"],Be=class extends G{isSupported(){return this.api.call.aaveTradeExecutor.pools!==void 0}async loadPools(){return(await this.api.call.aaveTradeExecutor.pools()).map(({reserve:t,atoken:r,liqudityIn:s,liqudityOut:i})=>({address:this.getPoolId(t.toString(),r.toString()),type:"Aave",tokens:[{id:t.toString(),balance:s.toString()},{id:r.toString(),balance:i.toString()}],...this.getPoolLimits()}))}async getPoolFees(e,t){return{}}getPoolType(){return"Aave"}getPoolId(e,t){let r=e+"/"+t;return(0,Zt.encodeAddress)((0,Qt.stringToU8a)(r.padEnd(32,"\0")),63)}subscribePoolChange(e){let[t,r]=e.tokens,s=this.getReserveH160Id(t);return this.api.query.system.events(i=>{i.forEach(n=>{let{event:o}=n,a=`${o.section}:${o.method}`;if(a==="router:Executed"){let{assetIn:l,assetOut:c}=o.data.toHuman(),m=l.replace(/,/g,""),h=c.replace(/,/g,"");(m===r.id||h===r.id)&&(this.log(`Sync AAVE [router:Executed] :: ${m}:${h}`),this.updatePoolState(e))}if(a==="evm:Log"){let{log:l}=o.data.toHuman();try{let{eventName:c,args:m}=(0,er.decodeEventLog)({abi:se,topics:l.topics,data:l.data});Fr.includes(c)&&m.reserve.toLowerCase()===s.toLowerCase()&&(this.log(`Sync AAVE [evm:Log] :: ${c} ${t.symbol}(${t.id})`),this.updatePoolState(e))}catch{}}})})}async updatePoolState(e){let[t,r]=e.tokens,{liqudityIn:s,liqudityOut:i}=await this.api.call.aaveTradeExecutor.pool(t.id,r.id);e.tokens=e.tokens.map(n=>{let o=n.id===t.id?s.toString():i.toString();return{...n,balance:o}})}getReserveH160Id(e){return e.type==="Erc20"?Bt(e.location,"accountKey20").accountKey20.key:q.fromAssetId(e.id)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:0}}};var X=require("@galacticcouncil/math-lbp"),H=class{static getSpotPrice(e,t,r,s,i){return(0,X.get_spot_price)(e,t,r,s,i)}static calculateInGivenOut(e,t,r,s,i){return(0,X.calculate_in_given_out)(e,t,r,s,i)}static calculateOutGivenIn(e,t,r,s,i){return(0,X.calculate_out_given_in)(e,t,r,s,i)}static calculateLinearWeights(e,t,r,s,i){return(0,X.calculate_linear_weights)(e,t,r,s,i)}static calculatePoolTradeFee(e,t,r){return(0,X.calculate_pool_trade_fee)(e,t,r)}};var y=class{static toPct(e){return e[0]/e[1]*100}static toDecimals(e){return e[0]/e[1]}static fromPermill(e){return[e/1e3,1e3]}};var Ie=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(e){return new u(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.fee,e.repayFeeApply)}constructor(e,t,r,s,i,n,o){this.type="Lbp",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=i,this.fee=n,this.repayFeeApply=o}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(a=>[a.id,a])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let n=p(s.balance),o=p(i.balance);return{assetIn:e,assetOut:t,balanceIn:n,balanceOut:o,decimalsIn:s.decimals,decimalsOut:i.decimals,weightIn:s.weight,weightOut:i.weight}}validateAndBuy(e,t,r){let s=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let n=e.balanceOut.div(this.maxOutRatio);if(t.isGreaterThan(n)&&i.push("MaxOutRatioExceeded"),s===e.assetOut){let o=this.calculateTradeFee(t,r),a=y.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),l=t.plus(o),c=this.calculateInGivenOut(e,l),m=e.balanceIn.div(this.maxInRatio);return c.isGreaterThan(m)&&i.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:t,feePct:a,errors:i}}else{let o=this.calculateInGivenOut(e,t),a=e.balanceIn.div(this.maxInRatio);return o.isGreaterThan(a)&&i.push("MaxInRatioExceeded"),{amountIn:o,calculatedIn:o,amountOut:t,feePct:0,errors:i}}}validateAndSell(e,t,r){let s=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let n=e.balanceIn.div(this.maxInRatio);if(t.isGreaterThan(n)&&i.push("MaxInRatioExceeded"),s===e.assetIn){let o=this.calculateOutGivenIn(e,t),a=e.balanceOut.div(this.maxOutRatio);return o.isGreaterThan(a)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:o,amountOut:o,feePct:0,errors:i}}else{let o=this.calculateOutGivenIn(e,t),a=this.calculateTradeFee(o,r),l=y.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),c=o.minus(a),m=e.balanceOut.div(this.maxOutRatio);return c.isGreaterThan(m)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:o,amountOut:c,feePct:l,errors:i}}}calculateInGivenOut(e,t){let r=H.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?S:s}calculateOutGivenIn(e,t){let r=H.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?S:s}spotPriceInGivenOut(e){let t=H.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),_(D,e.decimalsOut).toString());return p(t)}spotPriceOutGivenIn(e){let t=H.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),_(D,e.decimalsIn).toString());return p(t)}calculateTradeFee(e,t){let r=H.calculatePoolTradeFee(e.toString(),this.repayFeeApply?t.repayFee[0]:t.exchangeFee[0],this.repayFeeApply?t.repayFee[1]:t.exchangeFee[1]);return p(r)}};var Ae=class extends G{MAX_FINAL_WEIGHT=_(p(100),6);poolsData=new Map([]);isSupported(){return this.api.query.lbp!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.lbp.poolData.entries(),this.api.query.parachainSystem.validationData()]),{relayParentNumber:r}=t.unwrap(),s=e.filter(([i,n])=>this.isActivePool(n.unwrap(),r)).map(async([{args:[i]},n])=>{let o=n.unwrap(),a=i.toString(),l=await this.getPoolDelta(a,o,r.toString());return this.poolsData.set(i.toString(),o),{address:a,type:"Lbp",fee:o.fee.toJSON(),...l,...this.getPoolLimits()}});return Promise.all(s)}async getPoolFees(e,t){let r=this.pools.find(s=>s.address===t);return{repayFee:this.getRepayFee(),exchangeFee:r.fee}}getPoolType(){return"Lbp"}async subscribePoolChange(e){return this.api.query.parachainSystem.validationData(async t=>{let{relayParentNumber:r}=t.unwrap(),s=this.poolsData.get(e.address);if(this.isActivePool(s,r)){let n=await this.getPoolDelta(e.address,s,r.toString());Object.assign(e,n)}else{let n=this.pools.findIndex(o=>o.address==e.address);this.pools.splice(n,1)}})}async getPoolDelta(e,t,r){let{start:s,end:i,assets:n,initialWeight:o,finalWeight:a,repayTarget:l,feeCollector:c}=t,m=H.calculateLinearWeights(s.toString(),i.toString(),o.toString(),a.toString(),r),[h,d]=n,g=h.toString(),P=p(m),f=d.toString(),x=this.MAX_FINAL_WEIGHT.minus(p(P)),[b,I,B]=await Promise.all([this.isRepayFeeApplied(g,l.toString(),c.toString()),this.getBalance(e,g),this.getBalance(e,f)]);return{repayFeeApply:b,tokens:[{id:g,weight:P,balance:I.toString()},{id:f,weight:x,balance:B.toString()}]}}isActivePool(e,t){if(e.start.isEmpty||e.end.isEmpty)return!1;let r=e.start.unwrap().toNumber(),s=e.end.unwrap().toNumber();return t.toNumber()>=r&&t.toNumber()<s}async isRepayFeeApplied(e,t,r){let s=p(t);if(s.isZero())return!1;try{return(await this.getBalance(e,r)).isLessThan(s)}catch{return!0}}getRepayFee(){return this.api.consts.lbp.repayFee.toJSON()}getPoolLimits(){let e=this.api.consts.lbp.maxInRatio.toJSON(),t=this.api.consts.lbp.maxOutRatio.toJSON(),r=this.api.consts.lbp.minTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};var O=require("@galacticcouncil/math-omnipool");var N=class{static calculateSpotPrice(e,t,r,s){return(0,O.calculate_spot_price)(e,t,r,s)}static calculateLrnaSpotPrice(e,t){return(0,O.calculate_lrna_spot_price)(e,t)}static calculateInGivenOut(e,t,r,s,i,n,o,a,l){return(0,O.calculate_in_given_out)(e,t,r,s,i,n,o,a,l)}static calculateLrnaInGivenOut(e,t,r,s,i){return(0,O.calculate_lrna_in_given_out)(e,t,r,s,i)}static calculateOutGivenIn(e,t,r,s,i,n,o,a,l){return(0,O.calculate_out_given_in)(e,t,r,s,i,n,o,a,l)}static calculateOutGivenLrnaIn(e,t,r,s,i){return(0,O.calculate_out_given_lrna_in)(e,t,r,s,i)}static calculatePoolTradeFee(e,t,r){return(0,O.calculate_pool_trade_fee)(e,t,r)}static calculateShares(e,t,r,s){return(0,O.calculate_shares)(e,t,r,s)}static calculateLiquidityOut(e,t,r,s,i,n,o,a){return(0,O.calculate_liquidity_out)(e,t,r,s,i,n,o,a)}static calculateLiquidityLRNAOut(e,t,r,s,i,n,o,a){return(0,O.calculate_liquidity_lrna_out)(e,t,r,s,i,n,o,a)}static calculateCapDifference(e,t,r,s){let i=(0,v.BigNumber)(t),n=(0,v.BigNumber)(e),o=(0,v.BigNumber)(s),l=(0,v.BigNumber)(r).shiftedBy(-18);if(i.div(o).lt(l)){let m=l.times(o).minus(i).times(n),h=i.times((0,v.BigNumber)(1).minus(l));return m.div(h).toFixed(0)}else return"0"}static calculateLimitHubIn(e,t,r,s){return(0,O.calculate_liquidity_hub_in)(e,t,r,s)}static isSellAllowed(e){return(0,O.is_sell_allowed)(e)}static isBuyAllowed(e){return(0,O.is_buy_allowed)(e)}static isAddLiquidityAllowed(e){return(0,O.is_add_liquidity_allowed)(e)}static isRemoveLiquidityAllowed(e){return(0,O.is_remove_liquidity_allowed)(e)}static recalculateAssetFee(e,t,r,s,i,n,o,a,l,c,m){return(0,O.recalculate_asset_fee)(e,t,r,s,i,n,o,a,l,c,m)}static recalculateProtocolFee(e,t,r,s,i,n,o,a,l,c,m){return(0,O.recalculate_protocol_fee)(e,t,r,s,i,n,o,a,l,c,m)}static verifyAssetCap(e,t,r,s){return(0,O.verify_asset_cap)(e,t,r,s)}};var _e=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(e){return new u(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.hubAssetId)}constructor(e,t,r,s,i,n){this.type="Omnipool",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=i,this.hubAssetId=n}validatePair(e,t){return this.hubAssetId!=t}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let n=p(s.balance),o=p(i.balance),a=p(s.existentialDeposit),l=p(i.existentialDeposit);return{assetIn:e,assetOut:t,hubReservesIn:s.hubReserves,hubReservesOut:i.hubReserves,sharesIn:s.shares,sharesOut:i.shares,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:n,balanceOut:o,tradeableIn:s.tradeable,tradeableOut:i.tradeable,assetInED:a,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),n=i.minus(s),o=s===S?S:n.div(s).multipliedBy(100).decimalPlaces(2),a=[],l=N.isSellAllowed(e.tradeableIn),c=N.isBuyAllowed(e.tradeableOut);(!l||!c)&&a.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&a.push("InsufficientTradingAmount");let m=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(m)&&a.push("MaxOutRatioExceeded");let h=e.balanceIn.div(this.maxInRatio);return i.isGreaterThan(h)&&a.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:o.toNumber(),errors:a}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,r),o=s.minus(i).div(s).multipliedBy(100).decimalPlaces(2),a=[],l=N.isSellAllowed(e.tradeableIn),c=N.isBuyAllowed(e.tradeableOut);(!l||!c)&&a.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&a.push("InsufficientTradingAmount");let m=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(m)&&a.push("MaxInRatioExceeded");let h=e.balanceOut.div(this.maxOutRatio);return i.isGreaterThan(h)&&a.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:o.toNumber(),errors:a}}calculateInGivenOut(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(e,t,r);let s=N.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?y.toDecimals(r.assetFee).toString():S.toString(),r?y.toDecimals(r.protocolFee).toString():S.toString()),i=p(s);return i.isNegative()?S:i}calculateLrnaInGivenOut(e,t,r){let s=N.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?y.toDecimals(r.assetFee).toString():S.toString()),i=p(s);return i.isNegative()?S:i}calculateOutGivenIn(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,r);let s=N.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?y.toDecimals(r.assetFee).toString():S.toString(),r?y.toDecimals(r.protocolFee).toString():S.toString()),i=p(s);return i.isNegative()?S:i}calculateOutGivenLrnaIn(e,t,r){let s=N.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?y.toDecimals(r.assetFee).toString():S.toString()),i=p(s);return i.isNegative()?S:i}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=N.calculateSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString(),e.balanceIn.toString(),e.hubReservesIn.toString());return p(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceLrnaInGivenOut(e){let t=N.calculateLrnaSpotPrice(e.hubReservesOut.toString(),e.balanceOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceOutGivenIn(e){if(e.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(e);let t=N.calculateSpotPrice(e.balanceIn.toString(),e.hubReservesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}spotPriceOutGivenLrnaIn(e){let t=N.calculateLrnaSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}};var tr=require("@polkadot/util-crypto"),rr=require("@polkadot/util");var Ne=class extends G{isSupported(){return this.api.query.omnipool!==void 0}async loadPools(){let e=this.api.consts.omnipool.hubAssetId.toString(),t=this.getPoolId(),[r,s,i]=await Promise.all([this.api.query.omnipool.assets.entries(),this.api.query.omnipool.hubAssetTradability(),this.getBalance(t,e)]),n=r.map(async([{args:[a]},l])=>{let{hubReserve:c,shares:m,tradable:h,cap:d,protocolShares:g}=l.unwrap(),P=await this.getBalance(t,a.toString());return{id:a.toString(),hubReserves:p(c.toString()),shares:p(m.toString()),tradeable:h.bits.toNumber(),balance:P.toString(),cap:p(d.toString()),protocolShares:p(g.toString())}}),o=await Promise.all(n);return o.push({id:e,tradeable:s.bits.toNumber(),balance:i.toString()}),[{address:t,type:"Omnipool",hubAssetId:e,tokens:o,...this.getPoolLimits()}]}async getPoolFees(e,t){let r=e.assetOut,s=e.assetIn,i="omnipool",n="Short",o=B=>B===M?[M,ye]:[ye,B],[a,l,c,m]=await Promise.all([this.api.query.system.number(),this.api.query.dynamicFees.assetFee(r),this.api.query.emaOracle.oracles(i,o(r),n),this.api.query.emaOracle.oracles(i,o(s),n)]),[h,d,g]=this.getAssetFee(e,a.toNumber(),l,c),[P,f,x]=s===ye?[0,0,0]:this.getProtocolFee(e,a.toNumber(),l,m),b=h+P,I=g+x;return{assetFee:y.fromPermill(d),protocolFee:y.fromPermill(f),min:y.fromPermill(b),max:y.fromPermill(I)}}getPoolType(){return"Omnipool"}async subscribePoolChange(e){let t=e.tokens.map(r=>r.id);return this.api.query.omnipool.assets.multi(t,r=>{e.tokens=r.map((s,i)=>{let n=e.tokens[i];if(s.isNone)return n;let o=s.unwrap();return this.updateTokenState(n,o)})})}updateTokenState(e,t){let{hubReserve:r,shares:s,tradable:i,cap:n,protocolShares:o}=t;return{...e,hubReserves:p(r.toString()),shares:p(s.toString()),cap:p(n.toString()),protocolShares:p(o.toString()),tradeable:i.bits.toNumber()}}getAssetFee(e,t,r,s){let{assetOut:i,balanceOut:n}=e,{minFee:o,maxFee:a,decay:l,amplification:c}=this.api.consts.dynamicFees.assetFeeParameters,m=y.fromPermill(o.toNumber()),h=y.fromPermill(a.toNumber());if(r.isNone||s.isNone)return[o.toNumber(),o.toNumber(),a.toNumber()];let[d]=s.unwrap(),{assetFee:g,timestamp:P}=r.unwrap(),f=Math.max(1,t-P.toNumber()),x=d.volume.bIn.toString(),b=d.volume.bOut.toString(),I=d.liquidity.b.toString();i===M&&(x=d.volume.aIn.toString(),b=d.volume.aOut.toString(),I=d.liquidity.a.toString());let B=y.fromPermill(g.toNumber()),w=N.recalculateAssetFee(x,b,I,"9",n.toString(),y.toDecimals(B).toString(),f.toString(),y.toDecimals(m).toString(),y.toDecimals(h).toString(),l.toString(),c.toString());return[o.toNumber(),Number(w)*1e6,a.toNumber()]}getProtocolFee(e,t,r,s){let{assetIn:i,balanceIn:n}=e,{minFee:o,maxFee:a,decay:l,amplification:c}=this.api.consts.dynamicFees.protocolFeeParameters,m=y.fromPermill(o.toNumber()),h=y.fromPermill(a.toNumber());if(r.isNone||s.isNone)return[o.toNumber(),o.toNumber(),a.toNumber()];let[d]=s.unwrap(),{protocolFee:g,timestamp:P}=r.unwrap(),f=Math.max(1,t-P.toNumber()),x=d.volume.bIn.toString(),b=d.volume.bOut.toString(),I=d.liquidity.b.toString();i===M&&(x=d.volume.aIn.toString(),b=d.volume.aOut.toString(),I=d.liquidity.a.toString());let B=y.fromPermill(g.toNumber()),w=N.recalculateProtocolFee(x,b,I,"9",n.toString(),y.toDecimals(B).toString(),f.toString(),y.toDecimals(m).toString(),y.toDecimals(h).toString(),l.toString(),c.toString());return[o.toNumber(),Number(w)*1e6,a.toNumber()]}getPoolId(){return(0,tr.encodeAddress)((0,rr.stringToU8a)("modlomnipool".padEnd(32,"\0")),63)}getPoolLimits(){let e=this.api.consts.omnipool.maxInRatio.toJSON(),t=this.api.consts.omnipool.maxOutRatio.toJSON(),r=this.api.consts.omnipool.minimumTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};var R=require("@galacticcouncil/math-xyk"),j=class{static getSpotPrice(e,t,r){return(0,R.get_spot_price)(e,t,r)}static calculateInGivenOut(e,t,r){return(0,R.calculate_in_given_out)(e,t,r)}static calculateOutGivenIn(e,t,r){return(0,R.calculate_out_given_in)(e,t,r)}static calculatePoolTradeFee(e,t,r){return(0,R.calculate_pool_trade_fee)(e,t,r)}static calculateLiquidityIn(e,t,r){return(0,R.calculate_liquidity_in)(e,t,r)}static calculateSpotPrice(e,t){return(0,R.calculate_spot_price)(e,t)}static calculateSpotPriceWithFee(e,t,r,s){return(0,R.calculate_spot_price_with_fee)(e,t,r,s)}static calculateShares(e,t,r){return(0,R.calculate_shares)(e,t,r)}static calculateLiquidityOutAssetA(e,t,r,s){return(0,R.calculate_liquidity_out_asset_a)(e,t,r,s)}static calculateLiquidityOutAssetB(e,t,r,s){return(0,R.calculate_liquidity_out_asset_b)(e,t,r,s)}};var Fe=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new u(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit)}constructor(e,t,r,s,i){this.type="Xyk",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=i}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let n=p(s.balance),o=p(i.balance),a=p(s.existentialDeposit),l=p(i.existentialDeposit);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:n,balanceOut:o,assetInED:a,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateTradeFee(s,r),n=y.toPct(r.exchangeFee),o=s.plus(i),a=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&a.push("InsufficientTradingAmount");let l=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(l)&&a.push("MaxOutRatioExceeded");let c=e.balanceIn.div(this.maxInRatio);return o.isGreaterThan(c)&&a.push("MaxInRatioExceeded"),{amountIn:o,calculatedIn:s,amountOut:t,feePct:n,errors:a}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateTradeFee(s,r),n=y.toPct(r.exchangeFee),o=s.minus(i),a=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&a.push("InsufficientTradingAmount");let l=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(l)&&a.push("MaxInRatioExceeded");let c=e.balanceOut.div(this.maxOutRatio);return o.isGreaterThan(c)&&a.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:o,feePct:n,errors:a}}calculateInGivenOut(e,t){let r=j.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?S:s}calculateOutGivenIn(e,t){let r=j.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?S:s}spotPriceInGivenOut(e){let t=j.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),r=_(D,18-e.decimalsOut);return p(t).div(r)}spotPriceOutGivenIn(e){let t=j.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),r=_(D,18-e.decimalsIn);return p(t).div(r)}calculateTradeFee(e,t){let r=j.calculatePoolTradeFee(e.toString(),t.exchangeFee[0],t.exchangeFee[1]);return p(r)}};var Re=class extends G{isSupported(){return this.api.query.xyk!==void 0}async loadPools(){let t=(await this.api.query.xyk.poolAssets.entries()).map(async([{args:[r]},s])=>{let i=r.toString(),[n,o]=s.unwrap(),[a,l]=await Promise.all([this.getBalance(i,n.toString()),this.getBalance(i,o.toString())]);return{address:i,type:"Xyk",tokens:[{id:n.toString(),balance:a.toString()},{id:o.toString(),balance:l.toString()}],...this.getPoolLimits()}});return Promise.all(t)}async getPoolFees(e,t){return{exchangeFee:this.getExchangeFee()}}getPoolType(){return"Xyk"}subscribePoolChange(e){throw new Error("Pool change subscription not supported!")}getExchangeFee(){return this.api.consts.xyk.getExchangeFee.toJSON()}getPoolLimits(){let e=this.api.consts.xyk.maxInRatio.toJSON(),t=this.api.consts.xyk.maxOutRatio.toJSON(),r=this.api.consts.xyk.minTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};var F=require("@galacticcouncil/math-stableswap"),C=class{static getPoolAddress(e){return(0,F.pool_account_name)(e)}static defaultPegs(e){let t=[];for(let r=0;r<e;r++)t.push(["1","1"]);return t}static calculateAmplification(e,t,r,s,i){return(0,F.calculate_amplification)(e,t,r,s,i)}static calculateInGivenOut(e,t,r,s,i,n,o){return(0,F.calculate_in_given_out)(e,t,r,s,i,n,o)}static calculateAddOneAsset(e,t,r,s,i,n,o){return(0,F.calculate_add_one_asset)(e,t,r,s,i,n,o)}static calculateSharesForAmount(e,t,r,s,i,n,o){return(0,F.calculate_shares_for_amount)(e,t,r,s,i,n,o)}static calculateOutGivenIn(e,t,r,s,i,n,o){return(0,F.calculate_out_given_in)(e,t,r,s,i,n,o)}static calculateLiquidityOutOneAsset(e,t,r,s,i,n,o){return(0,F.calculate_liquidity_out_one_asset)(e,t,r,s,i,n,o)}static calculateShares(e,t,r,s,i,n){return(0,F.calculate_shares)(e,t,r,s,i,n)}static calculateSpotPriceWithFee(e,t,r,s,i,n,o,a){return(0,F.calculate_spot_price_with_fee)(e,t,r,s,i,n,o,a)}static calculatePoolTradeFee(e,t,r){return(0,F.calculate_pool_trade_fee)(e,t,r)}static recalculatePegs(e,t,r,s,i){let n=(0,F.recalculate_peg)(e,t,r,s,i);return JSON.parse(n)}};var Ee=class u{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;pegs;pegsFee;static fromPool(e){return new u(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.amplification,e.id,e.fee,e.totalIssuance,e.pegs,e.pegsFee)}constructor(e,t,r,s,i,n,o,a,l,c,m){this.type="Stableswap",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=i,this.amplification=n,this.id=o,this.fee=a,this.totalIssuance=l,this.pegs=c,this.pegsFee=m}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let n=p(s.balance),o=p(i.balance),a=p(s.existentialDeposit),l=p(i.existentialDeposit);return{assetIn:e,assetOut:t,balanceIn:n,balanceOut:o,decimalsIn:s.decimals,decimalsOut:i.decimals,tradeableIn:this.id===e?15:s.tradeable,tradeableOut:this.id===t?15:i.tradeable,assetInED:a,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),n=y.toPct(r.fee),o=[],a=N.isSellAllowed(e.tradeableIn),l=N.isBuyAllowed(e.tradeableOut);return(!a||!l)&&o.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&o.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:n,errors:o}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,r),n=y.toPct(r.fee),o=[],a=N.isSellAllowed(e.tradeableIn),l=N.isBuyAllowed(e.tradeableOut);return(!a||!l)&&o.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&o.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:n,errors:o}}calculateIn(e,t,r){let s=C.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),i=p(s);return i.isNegative()?S:i}calculateAddOneAsset(e,t,r){let s=C.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),i=p(s);return i.isNegative()?S:i}calculateSharesForAmount(e,t,r){let s=C.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),i=p(s);return i.isNegative()?S:i}calculateInGivenOut(e,t,r){return e.assetOut==this.id?this.calculateAddOneAsset(e,t,r):e.assetIn==this.id?this.calculateSharesForAmount(e,t,r):this.calculateIn(e,t,r)}spotPriceInGivenOut(e){let t=C.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetOut,e.assetIn,this.totalIssuance,"0",this.getPegs());if(e.assetOut==this.id)return p(t);if(e.assetIn==this.id){let s=_(D,e.decimalsIn-e.decimalsOut);return p(t).div(s)}let r=_(D,18-e.decimalsIn);return p(t).div(r)}calculateOut(e,t,r){let s=C.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),i=p(s);return i.isNegative()?S:i}calculateWithdrawOneAsset(e,t,r){let s=C.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),i=p(s);return i.isNegative()?S:i}calculateShares(e,t,r){let s=C.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),i=p(s);return i.isNegative()?S:i}calculateOutGivenIn(e,t,r){return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t,r):e.assetOut==this.id?this.calculateShares(e,t,r):this.calculateOut(e,t,r)}spotPriceOutGivenIn(e){let t=C.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetIn,e.assetOut,this.totalIssuance,"0",this.getPegs());if(e.assetIn==this.id)return p(t);if(e.assetOut==this.id){let s=_(D,e.decimalsOut-e.decimalsIn);return p(t).div(s)}let r=_(D,18-e.decimalsOut);return p(t).div(r)}calculateTradeFee(e,t){let r=C.calculatePoolTradeFee(e.toString(),t.fee[0],t.fee[1]);return p(r)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let e=this.tokens.filter(t=>t.id!=this.id).map(({id:t,balance:r,decimals:s})=>({asset_id:Number(t),amount:r,decimals:s}));return JSON.stringify(e)}getAssets(e,t){let r={asset_id:Number(e),amount:t.toFixed(0)};return JSON.stringify([r])}};var et=require("@polkadot/util-crypto");var sr=340282366920938463463374607431768211455n,De=class extends G{stablePools=new Map([]);isSupported(){return this.api.query.stableswap!==void 0}isPegSupported(){return this.api.query.stableswap.poolPegs!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.stableswap.pools.entries(),this.api.query.system.number()]),r=t.toNumber(),s=e.map(async([{args:[i]},n])=>{let o=n.unwrap(),a=i.toString(),l=this.getPoolAddress(a),[c,m,h]=await Promise.all([this.getPoolDelta(a,o,r.toString()),this.getPoolTokens(l,a,o),this.getPoolPegs(a,o,r.toString())]);return this.stablePools.set(l,o),{address:l,id:a,type:"Stableswap",fee:y.fromPermill(o.fee.toNumber()),tokens:m,...c,...h,...this.getPoolLimits()}});return Promise.all(s)}async getPoolFees(e,t){return{fee:this.pools.find(s=>s.address===t).pegsFee}}getPoolType(){return"Stableswap"}async subscribePoolChange(e){return this.api.query.system.number(async t=>{let r=t.toString(),s=this.stablePools.get(e.address);if(s){let[i,n]=await Promise.all([this.getPoolDelta(e.id,s,r),this.getPoolPegs(e.id,s,r)]);Object.assign(e,i,n)}})}async getPoolDelta(e,t,r){let{initialAmplification:s,finalAmplification:i,initialBlock:n,finalBlock:o}=t,a=C.calculateAmplification(s.toString(),i.toString(),n.toString(),o.toString(),r),l=await this.api.query.tokens.totalIssuance(e);return{amplification:a,totalIssuance:l.toString()}}async getPoolTokens(e,t,r){let{assets:s}=r,i=s.map(async o=>{let[a,l]=await Promise.all([this.api.query.stableswap.assetTradability(t,o.toString()),this.getBalance(e,o.toString())]);return{id:o.toString(),tradeable:a.bits.toNumber(),balance:l.toString()}}),n=await Promise.all(i);return n.push({id:t,tradeable:15,balance:sr.toString()}),n}getPoolDefaultPegs(e){let t=e.fee,r=C.defaultPegs(e.assets.length);return{pegsFee:y.fromPermill(t.toNumber()),pegs:r}}async getPoolPegs(e,t,r){if(!this.isPegSupported())return this.getPoolDefaultPegs(t);let s=await this.api.query.stableswap.poolPegs(e);if(s.isNone)return this.getPoolDefaultPegs(t);let i=s.unwrap(),n=await this.getLatestPegs(t,i,r),o=this.getRecentPegs(i),a=i.maxPegUpdate.toHuman(),l=t.fee.toHuman(),[c,m]=C.recalculatePegs(JSON.stringify(o),JSON.stringify(n),r,a.replace(/%/g,""),l.replace(/%/g,"")),h=Number(c)*1e4;return{pegsFee:y.fromPermill(h),pegs:m}}getRecentPegs(e){let{current:t}=e;return Array.from(t.entries()).map(([r,s])=>s.map(i=>i.toString()))}async getLatestPegs(e,t,r){let{source:s}=t,i=Array.from(e.assets.entries()).map(([o,a])=>a.toString()),n=s.map(async(o,a)=>{if(o.isOracle){let[l,c,m]=o.asOracle,h=[m.toString(),i[a]].map(b=>Number(b)).sort((b,I)=>b-I),d=await this.api.query.emaOracle.oracles(l,h,c),[{price:g,updatedAt:P}]=d.unwrap(),f=g.n.toString(),x=g.d.toString();return m.toString()===h[0].toString()?[[f,x],P.toString()]:[[x,f],P.toString()]}else if(o.isMmOracle){let l=o.asMmOracle,{price:c,decimals:m,updatedAt:h}=await this.mmOracle.getData(l.toString()),d=10**m;return[[c.toString(),d.toString()],h.toString()]}else return[o.asValue.map(l=>l.toString()),r]});return Promise.all(n)}getPoolAddress(e){let t=Number(e),r=C.getPoolAddress(t);return(0,et.encodeAddress)((0,et.blake2AsHex)(r),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:this.api.consts.stableswap.minTradingLimit.toJSON()}}};var ue=class extends L{api;evm;assetClient;aaveClient;xykClient;omniClient;lbpClient;stableClient;clients=[];onChainAssets=[];memRegistry=Qe(e=>(this.log(`Registry mem ${e} sync`),this.syncRegistry()));constructor(e,t){super(e),this.api=e,this.evm=t,this.assetClient=new Q(this.api),this.aaveClient=new Be(this.api,t),this.xykClient=new Re(this.api,t),this.omniClient=new Ne(this.api,t),this.lbpClient=new Ae(this.api,t),this.stableClient=new De(this.api,t),this.clients=[this.aaveClient,this.xykClient,this.omniClient,this.lbpClient,this.stableClient]}get assets(){return this.onChainAssets}get isRegistrySynced(){return this.onChainAssets.length>0}async syncRegistry(e){let t=await this.assetClient.getOnChainAssets(!1,e);this.clients.forEach(r=>r.withAssets(t)),this.onChainAssets=t}async getPools(e){return this.isRegistrySynced||await this.memRegistry(1),e.length==0?(await Promise.all(this.clients.filter(s=>s.isSupported()).map(s=>s.getPoolsMem()))).flat():(await Promise.all(this.clients.filter(r=>e.some(s=>s===r.getPoolType())).map(r=>r.getPoolsMem()))).flat()}destroy(){this.aaveClient.unsubscribe(),this.xykClient.unsubscribe(),this.omniClient.unsubscribe(),this.lbpClient.unsubscribe(),this.stableClient.unsubscribe()}async getPoolFees(e,t){switch(t.type){case"Aave":return this.aaveClient.getPoolFees(e,t.address);case"Xyk":return this.xykClient.getPoolFees(e,t.address);case"Omnipool":return this.omniClient.getPoolFees(e,t.address);case"Lbp":return this.lbpClient.getPoolFees(e,t.address);case"Stableswap":return this.stableClient.getPoolFees(e,t.address);default:throw new xe(t.type)}}};var ce=class extends ue{feeCache;disconnectSubscribeNewHeads=null;constructor(e,t){super(e,t),this.feeCache=new le(null),this.api.rpc.chain.subscribeNewHeads(async r=>{this.feeCache.release()}).then(r=>{this.disconnectSubscribeNewHeads=r})}async getPoolFees(e,t){let r=[t.address,e.assetIn,e.assetOut].join("-");if(this.feeCache.has(r))return this.feeCache.get(r);{let i=await super.getPoolFees(e,t);return this.feeCache.set(r,i),i}}async destroy(){this.log(`Destroying pool cache!
|
|
2
|
-
Items: [${this.feeCache.length}]`),this.feeCache.release(),this.disconnectSubscribeNewHeads?.()}};var me=class{static get(e){switch(e.type){case"Aave":return Te.fromPool(e);case"Xyk":return Fe.fromPool(e);case"Omnipool":return _e.fromPool(e);case"Lbp":return Ie.fromPool(e);case"Stableswap":return Ee.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};var tt=class{constructor(e=1/0){this.capacity=e}storage=[];enqueue(e){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(e)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Rr=5,ke=class{isNotVisited(e,t){let r=!0;return t.forEach(s=>{(s[0]===e[0]||s[1]===e[1])&&(r=!1)}),r}findPaths(e,t,r){let s=[],i=new tt,n=[];for(n.push([t,""]),i.enqueue(n);i.size()>0;){let o=i.dequeue();if(o==null||o.length>Rr)return s;let a=o[o.length-1];(r===null||a[0]===r)&&s.push(o),e.get(a[0])?.forEach(c=>{if(this.isNotVisited(c,o)){let m=[...o];m.push(c),i.enqueue(m)}})}return s}buildAndPopulateGraph(e,t){let r=new Map;for(let s of e)r.set(parseInt(s),[]);for(let[s,i,n]of t){let o=parseInt(i),a=parseInt(n);r.get(o)?.push([a,s])}return r}};function At(u){let e={};for(let t of u){let r=t.tokens.length;for(let s=0;s<r;s++){e[t.tokens[s].id]||(e[t.tokens[s].id]=[]);for(let i=0;i<r;i++){if(s==i)continue;let n=[t.address,t.tokens[s].id,t.tokens[i].id];e[t.tokens[s].id].push(n)}}}return e}var Ce=class{getProposals(e,t,r){let s=At(r),i=Object.keys(s),n=i.map(c=>s[c]).flat(),o=new ke,a=o.buildAndPopulateGraph(i,n),l=o.findPaths(a,parseInt(e),t?parseInt(t):null);return this.parsePaths(l)}parsePaths(e){let t=[];for(let r of e){let s=[];for(let i=0;i<r.length;i++){let n=r[i],o=r[i+1];if(o==null)break;s.push(this.toEdge(n,o))}t.push(s)}return t}toEdge(e,t){return[t[1],e[0].toString(),t[0].toString()]}};var pe=class{routeSuggester;routerOptions;poolService;constructor(e,t={}){this.poolService=e,this.routeSuggester=new Ce,this.routerOptions=Object.freeze({includeOnly:t.includeOnly??[]})}async getPools(){let e=this.routerOptions.includeOnly;return await this.poolService.getPools(e)}async getAllAssets(){let e=await this.getPools();if(e.length===0)throw new Error("No pools configured");let t=await this.getAssets(e);return[...new Map(t).values()]}async getAssetPairs(e){let t=await this.getPools();if(t.length===0)throw new Error("No pools configured");let{assets:r,poolsMap:s}=await this.validateToken(e,t),n=this.getPaths(e,null,s,t).map(o=>o[o.length-1].assetOut);return this.toAssets([...new Set(n)],r)}async getAllPaths(e,t){let r=await this.getPools();if(r.length===0)throw new Error("No pools configured");let{poolsMap:s}=await this.validateTokenPair(e,t,r);return this.getPaths(e,t,s,r)}async getAssets(e){let t=e.map(r=>r.tokens.map(s=>({id:s.id,name:s.name,symbol:s.symbol,decimals:s.decimals,icon:s.icon,type:s.type,isSufficient:s.isSufficient,existentialDeposit:s.existentialDeposit,meta:s.meta,location:s.location,isWhiteListed:s.isWhiteListed}))).flat();return new Map(t.map(r=>[r.id,r]))}getPaths(e,t,r,s){return this.routeSuggester.getProposals(e,t,s).filter(o=>this.validPath(o,r)).map(o=>this.toHops(o,r))}async validateTokenPair(e,t,r){let s=await this.getAssets(r);if(s.get(e)==null)throw new Error(e+" is not supported token");if(s.get(t)==null)throw new Error(t+" is not supported token");let i=this.getPoolMap(r);return{assets:s,poolsMap:i}}async validateToken(e,t){let r=await this.getAssets(t);if(r.get(e)==null)throw new Error(e+" is not supported token");let s=this.getPoolMap(t);return{assets:r,poolsMap:s}}getPoolMap(e){return new Map(e.map(t=>[t.address,me.get(t)]))}validPath(e,t){return e.length>0&&e.map(r=>this.validEdge(r,t)).reduce((r,s)=>r&&s)}validEdge([e,t,r],s){return s.get(e)?.validatePair(t,r)||!1}toHops(e,t){return e.map(([r,s,i])=>{let n=t.get(r);return{poolAddress:r,poolId:n?.id,pool:n?.type,assetIn:s,assetOut:i}})}toAssets(e,t){return e.map(r=>t.get(r))}};var Er=p("100");function Dr(u,e){return u.minus(e).abs().div(u.plus(e).div(2)).multipliedBy(100).decimalPlaces(2)}function de(u,e){return u.minus(e).div(e).multipliedBy(100).decimalPlaces(2)}function _t(u,e){return D.minus(e.div(u)).multipliedBy(100).decimalPlaces(2)}function Nt(u,e){return e.div(u).minus(D).multipliedBy(100).decimalPlaces(2)}function ee(u,e){return(e<.01||e>100)&&new Error("Supported range is from 0.01% - 100%"),u.div(Er).multipliedBy(e).decimalPlaces(0,1)}var rt=(t=>(t.Buy="Buy",t.Sell="Sell",t))(rt||{}),st=(r=>(r.Dca="Dca",r.TwapSell="TwapSell",r.TwapBuy="TwapBuy",r))(st||{}),Ft=(r=>(r.OrderTooSmall="OrderTooSmall",r.OrderTooBig="OrderTooBig",r.OrderImpactTooBig="OrderImpactTooBig",r))(Ft||{});var ge=class extends pe{isDirectTrade(e){return e.length==1}findBestSellRoute(e){let t=e.sort((r,s)=>{let i=r[r.length-1].amountOut,n=s[s.length-1].amountOut;return i.isGreaterThan(n)?-1:1});return t.find(r=>r.every(s=>s.errors.length==0))||t[0]}getRouteFeeRange(e){if(e.filter(r=>r.tradeFeeRange).length>0){let r=e.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,n)=>i+n),s=e.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,n)=>i+n);return[r,s]}}getPoolFeeRange(e){let t=e.min?y.toPct(e.min):void 0,r=e.max?y.toPct(e.max):void 0;if(t&&r)return[t,r]}async getBestSell(e,t,r){return this.getSell(e,t,r)}async getSell(e,t,r,s){let i=await super.getPools();if(i.length===0)throw new Error("No pools configured");let{poolsMap:n}=await super.validateTokenPair(e,t,i),o=super.getPaths(e,t,n,i);if(o.length===0)throw new te(e,t);let a;if(s)a=await this.toSellSwaps(r,s,n);else{let w=o.map(async E=>await this.toSellSwaps(r,E,n)),A=await Promise.all(w);a=this.findBestSellRoute(A)}let l=a[0],c=a[a.length-1],m=this.isDirectTrade(a),h=a.map(w=>w.spotPrice.shiftedBy(-1*w.assetOutDecimals)).reduce((w,A)=>w.multipliedBy(A)),d=_(h,c.assetOutDecimals),g=m?c.calculatedOut:this.calculateDelta0Y(l.amountIn,a,n),P=c.amountOut,f=m?c.tradeFeePct:_t(g,P).toNumber(),x=g.minus(P),b=this.getRouteFeeRange(a),I=l.amountIn.shiftedBy(-1*l.assetInDecimals).multipliedBy(d),B=de(g,I);return{type:"Sell",amountIn:l.amountIn,amountOut:c.amountOut,spotPrice:d,tradeFee:x,tradeFeePct:f,tradeFeeRange:b,priceImpactPct:B.toNumber(),swaps:a,toHuman(){return{type:"Sell",amountIn:T(l.amountIn,l.assetInDecimals),amountOut:T(c.amountOut,c.assetOutDecimals),spotPrice:T(d,c.assetOutDecimals),tradeFee:T(x,c.assetOutDecimals),tradeFeePct:f,tradeFeeRange:b,priceImpactPct:B.toNumber(),swaps:a.map(w=>w.toHuman())}}}}calculateDelta0Y(e,t,r){let s=[];for(let i=0;i<t.length;i++){let n=t[i],o=r.get(n.poolAddress);if(o==null)throw new Error("Pool does not exit");let a=o.parsePair(n.assetIn,n.assetOut),l;i>0?l=s[i-1]:l=e;let c=o.calculateOutGivenIn(a,l);s.push(c)}return s[s.length-1]}async toSellSwaps(e,t,r){let s=[];for(let i=0;i<t.length;i++){let n=t[i],o=r.get(n.poolAddress);if(o==null)throw new Error("Pool does not exit");let a=o.parsePair(n.assetIn,n.assetOut),l;i>0?l=s[i-1].amountOut:l=_(p(e),a.decimalsIn).decimalPlaces(0,1);let c=await this.poolService.getPoolFees(a,o),{amountOut:m,calculatedOut:h,feePct:d,errors:g}=o.validateAndSell(a,l,c),P=this.getPoolFeeRange(c),f=o.spotPriceOutGivenIn(a),x=l.shiftedBy(-1*a.decimalsIn).multipliedBy(f),b=de(h,x);s.push({...n,assetInDecimals:a.decimalsIn,assetOutDecimals:a.decimalsOut,amountIn:l,amountOut:m,calculatedOut:h,spotPrice:f,tradeFeePct:d,tradeFeeRange:P,priceImpactPct:b.toNumber(),errors:g,isSupply(){return o.type==="Aave"&&o.tokens[0].id===n.assetIn},isWithdraw(){return o.type==="Aave"&&o.tokens[1].id===n.assetIn},toHuman(){return{...n,amountIn:T(l,a.decimalsIn),amountOut:T(m,a.decimalsOut),calculatedOut:T(h,a.decimalsOut),spotPrice:T(f,a.decimalsOut),tradeFeePct:d,tradeFeeRange:P,priceImpactPct:b.toNumber(),errors:g}}})}return s}async getMostLiquidRoute(e,t){let r=await super.getPools(),{poolsMap:s}=await super.validateTokenPair(e,t,r),i=super.getPaths(e,t,s,r);if(i.length===0)throw new te(e,t);let l=r.filter(d=>d.tokens.some(g=>g.id===e&&g.id!==d.id)).map(d=>d.type==="Aave"?d.tokens:d.tokens.filter(g=>g.id===e)).map(d=>d.map(g=>p(g.balance).shiftedBy(-1*g.decimals)).reduce((g,P)=>g.plus(P))).sort((d,g)=>g.isLessThan(d)?-1:1)[0].div(100).multipliedBy(.1),c=i.map(async d=>await this.toSellSwaps(l,d,s)),m=await Promise.all(c);return this.findBestSellRoute(m).map(d=>({poolAddress:d.poolAddress,poolId:d?.poolId,pool:d.pool,assetIn:d.assetIn,assetOut:d.assetOut}))}async getBestSpotPrice(e,t){let r=await super.getPools();if(r.length===0)throw new Error("No pools configured");let{poolsMap:s}=await super.validateTokenPair(e,t,r);if(super.getPaths(e,t,s,r).length===0)return Promise.resolve(void 0);let n=await this.getMostLiquidRoute(e,t),o=await this.toSellSwaps("1",n,s),a=o.map(m=>m.spotPrice.shiftedBy(-1*m.assetOutDecimals)).reduce((m,h)=>m.multipliedBy(h)),l=o[o.length-1].assetOutDecimals;return{amount:_(a,l),decimals:l}}findBestBuyRoute(e){let t=e.sort((r,s)=>{let i=r[0].amountIn,n=s[0].amountIn;return i.isGreaterThan(n)?1:-1});return t.find(r=>r.every(s=>s.errors.length==0))||t[0]}async getBestBuy(e,t,r){return this.getBuy(e,t,r)}async getBuy(e,t,r,s){let i=await super.getPools();if(i.length===0)throw new Error("No pools configured");let{poolsMap:n}=await super.validateTokenPair(e,t,i),o=super.getPaths(e,t,n,i);if(o.length===0)throw new te(e,t);let a;if(s)a=await this.toBuySwaps(r,s,n);else{let w=o.map(async E=>await this.toBuySwaps(r,E,n)),A=await Promise.all(w);a=this.findBestBuyRoute(A)}let l=a[a.length-1],c=a[0],m=this.isDirectTrade(a),h=a.map(w=>w.spotPrice.shiftedBy(-1*w.assetInDecimals)).reduce((w,A)=>w.multipliedBy(A)),d=_(h,c.assetInDecimals),g=m?c.calculatedIn:this.calculateDelta0X(l.amountOut,a,n),P=c.amountIn,f=m?c.tradeFeePct:Nt(g,P).toNumber(),x=P.minus(g),b=this.getRouteFeeRange(a),I=l.amountOut.shiftedBy(-1*l.assetOutDecimals).multipliedBy(d),B;return g.isZero()?B=-100:B=de(I,g).toNumber(),{type:"Buy",amountOut:l.amountOut,amountIn:c.amountIn,spotPrice:d,tradeFee:x,tradeFeePct:f,tradeFeeRange:b,priceImpactPct:B,swaps:a,toHuman(){return{type:"Buy",amountOut:T(l.amountOut,l.assetOutDecimals),amountIn:T(c.amountIn,c.assetInDecimals),spotPrice:T(d,c.assetInDecimals),tradeFee:T(x,c.assetInDecimals),tradeFeePct:f,tradeFeeRange:b,priceImpactPct:B,swaps:a.map(w=>w.toHuman())}}}}calculateDelta0X(e,t,r){let s=[];for(let i=t.length-1;i>=0;i--){let n=t[i],o=r.get(n.poolAddress);if(o==null)throw new Error("Pool does not exit");let a=o.parsePair(n.assetIn,n.assetOut),l;i==t.length-1?l=e:l=s[0];let c=o.calculateInGivenOut(a,l);s.unshift(c)}return s[0]}async toBuySwaps(e,t,r){let s=[];for(let i=t.length-1;i>=0;i--){let n=t[i],o=r.get(n.poolAddress);if(o==null)throw new Error("Pool does not exit");let a=o.parsePair(n.assetIn,n.assetOut),l;i==t.length-1?l=_(p(e),a.decimalsOut).decimalPlaces(0,1):l=s[0].amountIn;let c=await this.poolService.getPoolFees(a,o),{amountIn:m,calculatedIn:h,feePct:d,errors:g}=o.validateAndBuy(a,l,c),P=this.getPoolFeeRange(c),f=o.spotPriceInGivenOut(a),x=l.shiftedBy(-1*a.decimalsOut).multipliedBy(f),b;h.isZero()?b=-100:b=de(x,h).toNumber(),s.unshift({...n,assetInDecimals:a.decimalsIn,assetOutDecimals:a.decimalsOut,amountIn:m,amountOut:l,calculatedIn:h,spotPrice:f,tradeFeePct:d,tradeFeeRange:P,priceImpactPct:b,errors:g,isSupply(){return o.type==="Aave"&&o.tokens[0].id===n.assetIn},isWithdraw(){return o.type==="Aave"&&o.tokens[1].id===n.assetIn},toHuman(){return{...n,amountIn:T(m,a.decimalsIn),amountOut:T(l,a.decimalsOut),calculatedIn:T(h,a.decimalsIn),spotPrice:T(f,a.decimalsIn),tradeFeePct:d,tradeFeeRange:P,priceImpactPct:b,errors:g}}})}return s}};var ir=6e3,nr=p(1e15),Me=6,Rt=-5,Et=6*60*60*1e3;var or=6;var W=class{static build(e){return e.map(({assetIn:t,assetOut:r,pool:s,poolId:i})=>s==="Stableswap"?{pool:{Stableswap:i},assetIn:t,assetOut:r}:{pool:s,assetIn:t,assetOut:r})}};var he=class{schedulerOptions;router;constructor(e,t={}){this.router=e,this.schedulerOptions=Object.freeze({blockTime:t.blockTime??ir,minBudgetInNative:t.minBudgetInNative??nr})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(e,t,r,s,i){let[n,o]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,r)]),{amountIn:a,swaps:l,priceImpactPct:c}=o,m=l[0],h=l[l.length-1],{assetInDecimals:d}=m,{assetOutDecimals:g}=h,P=Math.abs(c),f=this.getMinimumTradeCount(a,n),x=this.getOptimalTradeCount(P),b=i?Math.round(s/i):x,I=Math.ceil(s/f),B=Math.round(s/x),w=Math.round(s/b),A=a.dividedBy(b).decimalPlaces(0,1),E=await this.router.getBestSell(e,t,T(A,d)),z=a.isLessThan(n),Le=[];z&&Le.push("OrderTooSmall");let qe=E.amountOut.multipliedBy(b),ot=this.toBlockPeriod(w),at=E.tradeFee.multipliedBy(b),lt=W.build(l),Ue={assetIn:e,assetOut:t,errors:Le,frequencyMin:I,frequencyOpt:B,frequency:w,tradeCount:b,tradeFee:at,tradeImpactPct:E.priceImpactPct,tradePeriod:ot,tradeRoute:lt,type:"Dca"};return{...Ue,amountIn:a,amountOut:qe,tradeAmountIn:E.amountIn,tradeAmountOut:E.amountOut,toHuman(){return{...Ue,amountIn:T(a,d),amountOut:T(qe,g),tradeAmountIn:T(E.amountIn,d),tradeAmountOut:T(E.amountOut,g)}}}}async getMinimumOrderBudget(e){if(M===e)return this.minOrderBudget;let t=await this.router.getBestSpotPrice(M,e);if(t)return this.minOrderBudget.times(t.amount).div(p(10).pow(12)).decimalPlaces(0,1);throw new Error("Unable to calculate order budget")}getMinimumTradeCount(e,t){let r=t.multipliedBy(.2),s=e.dividedBy(r).toNumber();return Math.round(s)}getOptimalTradeCount(e){let t=Math.round(e*10)||1;return Math.max(t,3)}async getTwapSellOrder(e,t,r){let[s,i]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,r)]),{amountIn:n,swaps:o,priceImpactPct:a}=i,l=o[0],c=o[o.length-1],{assetInDecimals:m}=l,{assetOutDecimals:h}=c,d=Math.abs(a),g=this.getTwapTradeCount(d),P=n.dividedBy(g).decimalPlaces(0,1),f=await this.router.getBestSell(l.assetIn,c.assetOut,T(P,m)),x=g===1,b=n.isLessThan(s),I=f.priceImpactPct<Rt,B=[];b||x?B.push("OrderTooSmall"):I&&B.push("OrderImpactTooBig");let w=f.amountOut.multipliedBy(g),A=f.tradeFee.multipliedBy(g),E=W.build(o),z={assetIn:e,assetOut:t,errors:B,tradeCount:g,tradeImpactPct:f.priceImpactPct,tradePeriod:Me,tradeRoute:E,type:"TwapSell"};return{...z,amountIn:n,amountOut:w,tradeAmountIn:f.amountIn,tradeAmountOut:f.amountOut,tradeFee:A,toHuman(){return{...z,amountIn:T(n,m),amountOut:T(w,h),tradeAmountIn:T(f.amountIn,m),tradeAmountOut:T(f.amountOut,h),tradeFee:T(A,h)}}}}async getTwapBuyOrder(e,t,r){let[s,i]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestBuy(e,t,r)]),{amountOut:n,swaps:o,priceImpactPct:a}=i,l=o[0],c=o[o.length-1],{assetInDecimals:m}=l,{assetOutDecimals:h}=c,d=Math.abs(a),g=this.getTwapTradeCount(d),P=n.dividedBy(g).decimalPlaces(0,1),f=await this.router.getBestBuy(l.assetIn,c.assetOut,T(P,h)),x=f.amountIn.multipliedBy(g),b=g===1,I=x.isLessThan(s),B=f.priceImpactPct<Rt,w=[];I||b?w.push("OrderTooSmall"):B&&w.push("OrderImpactTooBig");let A=f.tradeFee.multipliedBy(g),E=W.build(o),z={assetIn:e,assetOut:t,errors:w,tradeCount:g,tradeImpactPct:f.priceImpactPct,tradePeriod:Me,tradeRoute:E,type:"TwapBuy"};return{...z,amountIn:x,amountOut:n,tradeAmountIn:f.amountIn,tradeAmountOut:f.amountOut,tradeFee:A,toHuman(){return{...z,amountIn:T(x,m),amountOut:T(n,h),tradeAmountIn:T(f.amountIn,m),tradeAmountOut:T(f.amountOut,h),tradeFee:T(A,m)}}}}getTwapTradeCount(e){let t=this.getOptimalTradeCount(e);if(this.getTwapExecutionTime(t)>Et){let s=Et/(this.blockTime*Me);return Math.round(s)}return t}getTwapExecutionTime(e){return e*Me*this.blockTime}toBlockPeriod(e){let t=e/this.blockTime,r=Math.round(t);return Math.max(r,or)}};var ar=require("viem");var fe=class extends L{evm;evmClient;balanceClient;aaveUtils;constructor(e,t){super(e),this.evm=t,this.evmClient=t.getWsProvider(),this.balanceClient=new U(e),this.aaveUtils=new Z(t)}wrapTx(e,t){return{hex:t.toHex(),name:e,get:()=>t,dryRun:r=>this.dryRun(r,t)}}async dryRun(e,t){let r;try{r=await this.api.call.dryRunApi.dryRunCall({System:{Signed:e}},t.inner.toHex())}catch(s){throw console.error(s),new Error("Dry run execution failed!")}if(r.isOk)return r.asOk;throw console.log(r.asErr.toHuman()),new Error("Dry run execution error!")}dispatchWithExtraGas(e){return this.api.tx.dispatcher.dispatchWithExtraGas(e.inner.toHex(),We)}isDirectOmnipoolTrade(e){return e.length===1&&e[0].pool==="Omnipool"}};var it=class extends fe{_trade;_beneficiary;_slippagePct=1;setTrade(e){return this._trade=e,this}withBeneficiary(e){return this._beneficiary=e,this}withSlippage(e){return this._slippagePct=e,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:e,swaps:t,type:r}=this.trade;if(r==="Buy")return this.buildBuyTx();let s=t[0],{assetIn:i,assetOut:n}=s,a=(await this.balanceClient.getBalance(this.beneficiary,i)).minus(5),l=!0;return s.isWithdraw()&&(l=(await this.aaveUtils.getMaxWithdraw(this.beneficiary,n)).amount.isGreaterThanOrEqualTo(a)),l&&e.isGreaterThanOrEqualTo(a)?this.buildSellAllTx():this.buildSellTx()}buildBuyTx(){let{amountIn:e,amountOut:t,swaps:r}=this.trade,s=r[0],i=r[r.length-1],n=ee(e,this.slippagePct),o=s.assetIn,a=i.assetOut,l=e.plus(n),c;return this.isDirectOmnipoolTrade(r)?c=this.api.tx.omnipool.buy(a,o,t.toFixed(),l.toFixed()):c=this.api.tx.router.buy(o,a,t.toFixed(),l.toFixed(),W.build(r)),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:e,amountOut:t,swaps:r}=this.trade,s=r[0],i=r[r.length-1],n=ee(t,this.slippagePct),o=s.assetIn,a=i.assetOut,l=t.minus(n),c;return this.isDirectOmnipoolTrade(r)?c=this.api.tx.omnipool.sell(o,a,e.toFixed(),l.toFixed()):c=this.api.tx.router.sell(o,a,e.toFixed(),l.toFixed(),W.build(r)),s.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=this.dispatchWithExtraGas(c)),this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:e,swaps:t}=this.trade,r=t[0],s=t[t.length-1],i=ee(e,this.slippagePct),n=r.assetIn,o=s.assetOut,a=e.minus(i),l=this.api.tx.router.sellAll(n,o,a.toFixed(),W.build(t));return r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}async buildWithdrawTx(e){let{swaps:t}=this.trade,r=e||this.trade.amountIn,i=t[0].assetOut,n=await this.evmClient.getGasPrice(),o=n*10n/100n,a=$.fromAny(this.beneficiary),l=e?Dt:BigInt(r.toFixed()),c=q.fromAssetId(i),m=(0,ar.encodeFunctionData)({abi:se,functionName:"withdraw",args:[c,l,a]}),h=this.api.tx.evm.call(a,Ge,m,0n,We,n+o,n+o,null,[]);return{hex:h.toHex(),name:"Withdraw",get:()=>h,dryRun:d=>this.dryRun(d,h)}}};var nt=class extends fe{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(e){return this._order=e,this}withBeneficiary(e){return this._beneficiary=e,this}withMaxRetries(e){return this._maxRetries=e,this}withSlippage(e){return this._slippagePct=e,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:e}=this.order;switch(e){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${e}`)}}buildDcaTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradePeriod:i,tradeRoute:n}=this.order,o=this.api.tx.dca.schedule({owner:this.beneficiary,period:i,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Sell:{assetIn:t,assetOut:r,amountIn:s.toFixed(),minAmountOut:"0",route:n}}},null);return this.wrapTx("DcaSchedule",o)}buildTwapSellTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:n,tradeRoute:o}=this.order,a=ee(i,this.slippagePct),l=i.minus(a),c=this.api.tx.dca.schedule({owner:this.beneficiary,period:n,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Sell:{assetIn:t,assetOut:r,amountIn:s.toFixed(),minAmountOut:l.toFixed(),route:o}}},null);return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:n,tradeRoute:o}=this.order,a=ee(s,this.slippagePct),l=s.plus(a),c=this.api.tx.dca.schedule({owner:this.beneficiary,period:n,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Buy:{assetIn:t,assetOut:r,amountOut:i.toFixed(),maxAmountIn:l.toFixed(),route:o}}},null);return this.wrapTx("DcaSchedule.twapBuy",c)}};var Pe=class{api;evm;constructor(e,t){this.api=e,this.evm=t}trade(e){return new it(this.api,this.evm).setTrade(e)}order(e){return new nt(this.api,this.evm).setOrder(e)}};function kr(u){let e=new oe(u),t=new we(u),r=new ce(u,t),s=new Z(t),i=new ge(r),n=new he(i,{blockTime:e.blockTime,minBudgetInNative:e.minOrderBudget});return{api:{aave:s,router:i,scheduler:n},client:{asset:new Q(u),balance:new U(u)},ctx:{pool:r},evm:t,tx:new Pe(u,t),destroy:()=>{r.destroy()}}}0&&(module.exports={AMOUNT_MAX,AaveClient,AavePool,AavePoolClient,AaveUtils,AssetClient,AssetNotFound,BASILISK_PARACHAIN_ID,BalanceClient,BigNumber,CachingPoolService,ChainParams,DECIMAL_PLACES,DENOMINATOR,ERC20,EvmClient,FarmClient,H160,HUB_ASSET_ID,HYDRADX_PARACHAIN_ID,HYDRADX_SS58_PREFIX,INFINITY,LbpMath,LbpPool,LbpPoolClient,ONE,OmniMath,OmniPool,OmniPoolClient,PolkadotApiClient,PoolConfigNotFound,PoolError,PoolFactory,PoolNotFound,PoolService,PoolType,ProviderConfigNotFound,RUNTIME_DECIMALS,RouteNotFound,Router,SYSTEM_ASSET_DECIMALS,SYSTEM_ASSET_ID,StableMath,StableSwap,StableSwapClient,StorageConfigNotFound,SubscriptionNotSupported,TRADEABLE_DEFAULT,TradeOrderError,TradeOrderType,TradeRouteBuilder,TradeRouter,TradeScheduler,TradeType,TxBuilderFactory,XykMath,XykPool,XykPoolClient,ZERO,bnFormatter,bnum,calculateBuyFee,calculateDiffToAvg,calculateDiffToRef,calculateSellFee,createChain,createSdkContext,findNestedKey,findNestedObj,getFraction,isEvmAccount,isEvmAddress,isSs58Address,scale,toBn,toDecimals});
|
|
1
|
+
"use strict";var lt=Object.defineProperty;var cr=Object.getOwnPropertyDescriptor;var mr=Object.getOwnPropertyNames;var pr=Object.prototype.hasOwnProperty;var dr=(l,e)=>{for(var t in e)lt(l,t,{get:e[t],enumerable:!0})},gr=(l,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of mr(e))!pr.call(l,s)&&s!==t&<(l,s,{get:()=>e[s],enumerable:!(r=cr(e,s))||r.enumerable});return l};var hr=l=>gr(lt({},"__esModule",{value:!0}),l);var Dr={};dr(Dr,{AMOUNT_MAX:()=>rr,AaveClient:()=>se,AavePool:()=>Te,AavePoolClient:()=>Be,AaveUtils:()=>J,AssetClient:()=>Z,AssetNotFound:()=>Pt,BASILISK_PARACHAIN_ID:()=>Yr,BalanceClient:()=>q,BigNumber:()=>w.BigNumber,CachingPoolService:()=>ue,ChainParams:()=>ne,DECIMAL_PLACES:()=>Lt,DENOMINATOR:()=>pt,ERC20:()=>z,EvmClient:()=>ve,FarmClient:()=>He,H160:()=>ee,HUB_ASSET_ID:()=>Pe,HYDRADX_PARACHAIN_ID:()=>$r,HYDRADX_SS58_PREFIX:()=>j,INFINITY:()=>fr,LbpMath:()=>W,LbpPool:()=>Ie,LbpPoolClient:()=>Ae,ONE:()=>D,OmniMath:()=>N,OmniPool:()=>_e,OmniPoolClient:()=>Ne,PolkadotApiClient:()=>L,PoolConfigNotFound:()=>yt,PoolError:()=>re,PoolFactory:()=>ce,PoolNotFound:()=>xe,PoolService:()=>le,PoolType:()=>k,ProviderConfigNotFound:()=>xt,RUNTIME_DECIMALS:()=>be,RouteNotFound:()=>te,Router:()=>me,SYSTEM_ASSET_DECIMALS:()=>Dt,SYSTEM_ASSET_ID:()=>M,StableMath:()=>C,StableSwap:()=>Ee,StableSwapClient:()=>De,StorageConfigNotFound:()=>bt,SubscriptionNotSupported:()=>St,TRADEABLE_DEFAULT:()=>Se,TradeOrderError:()=>Nt,TradeOrderType:()=>rt,TradeRouteBuilder:()=>G,TradeRouter:()=>de,TradeScheduler:()=>ge,TradeType:()=>tt,TxBuilderFactory:()=>fe,XykMath:()=>V,XykPool:()=>Fe,XykPoolClient:()=>Re,ZERO:()=>S,bnFormatter:()=>Ar,bnum:()=>p,calculateBuyFee:()=>_t,calculateDiffToAvg:()=>Rr,calculateDiffToRef:()=>pe,calculateSellFee:()=>At,createChain:()=>vt,createSdkContext:()=>Er,findNestedKey:()=>Ot,findNestedObj:()=>Ir,getFraction:()=>Q,isEvmAccount:()=>kt,isEvmAddress:()=>Ct,isSs58Address:()=>Mt,scale:()=>_,toBn:()=>yr,toDecimals:()=>T});module.exports=hr(Dr);var Ge=[{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 Et="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",ct="0x112b087b60C1a166130d59266363C45F8aa99db0",mt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",ye=1000000n;var Gr=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var se=class{client;constructor(e){this.client=e.getWsProvider()}async getBlockTimestamp(){let e=await this.client.getBlock();return Number(e.timestamp)}async getReservesData(){return await this.client.readContract({abi:ut,address:ct,args:[mt],functionName:"getReservesData"})}async getUserReservesData(e){return await this.client.readContract({abi:ut,address:ct,args:[mt,e],functionName:"getUserReservesData"})}async getUserAccountData(e){return await this.client.readContract({abi:Ge,address:Et,args:[e],functionName:"getUserAccountData"})}};var K=require("@polkadot/util-crypto"),ie=require("@polkadot/util"),Y=require("buffer");var Yr=2090,pt=1e3,Pe="1",$r=2034,j=63,be=18,M="0",Dt=12,Se=15;var dt="ETH\0";function kt(l){if(!l)return!1;try{let e=(0,K.decodeAddress)(l,!0),t=Y.Buffer.from(dt);return Y.Buffer.from(e.subarray(0,t.length)).equals(t)}catch{return!1}}function Ct(l){return!!/^0x[a-fA-F0-9]{40}$/.test(l)}function Mt(l){try{let e=(0,ie.isHex)(l)?(0,ie.hexToU8a)(l):(0,K.decodeAddress)(l);return(0,K.encodeAddress)(e),!0}catch{return!1}}var ee=class l{static toAccount=e=>{let t=Y.Buffer.from(e.slice(2),"hex"),r=Y.Buffer.from(dt);return(0,K.encodeAddress)(new Uint8Array(Y.Buffer.concat([r,t,Y.Buffer.alloc(8)])),63)};static fromAccount=e=>{let t=(0,K.decodeAddress)(e),r=Y.Buffer.from(dt),s=t.slice(r.length,-8);return"0x"+Y.Buffer.from(s).toString("hex")};static fromSS58=e=>{let r=(0,K.decodeAddress)(e).slice(0,20);return(0,ie.u8aToHex)(r)};static fromAny=e=>{if(Ct(e))return e;if(kt(e))return l.fromAccount(e);if(Mt(e))return l.fromSS58(e);throw new Error("Unknown address type")}};var z=class{static fromAssetId(e){let t=Number(e),r=Buffer.alloc(20,0);return r[15]=1,r.writeUInt32BE(t,16),"0x"+r.toString("hex")}static toAssetId(e){let t=Buffer.from(e.replace("0x",""),"hex");return t.length!==20||!this.isAssetAddress(e)?null:t.readUInt32BE(16)}static isAssetAddress(e){let t=Buffer.from("0000000000000000000000000000000100000000","hex"),r=Buffer.from(e.replace("0x",""),"hex");return r.length!==20?!1:r.subarray(0,16).equals(t.subarray(0,16))}};var w=require("bignumber.js"),Lt=12;w.BigNumber.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:Lt});var S=p(0),D=p(1),fr=p("Infinity");function _(l,e){let t=new w.BigNumber(e.toString()),r=new w.BigNumber(10).pow(t);return l.times(r)}function p(l){return new w.BigNumber(l.toString())}function yr(l,e){let t=p(l);return _(t,e)}function T(l,e){return l.shiftedBy(-1*e).toString()}var We=p("1e27"),Pr=p("1.01"),br=p("31536000"),J=class{client;constructor(e){this.client=new se(e)}async getSummary(e){let t=ee.fromAny(e),[r,s,i,n]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(t),this.client.getUserAccountData(t),this.client.getBlockTimestamp()]),[o]=r,[a,u]=s,[c,m,h,d,g,y]=i,f=p(y).dividedBy(1e18).decimalPlaces(6,w.BigNumber.ROUND_DOWN),x=p(c),b=p(m),I=[];for(let B of a){let v=B.underlyingAsset.toLowerCase(),A=o.find(({underlyingAsset:ur})=>ur.toLowerCase()===v);if(!A)throw new Error("Missing pool reserve for "+v);let E=p(B.scaledATokenBalance),H=p(A.liquidityIndex),Le=p(A.liquidityRate),qe=p(A.priceInMarketReferenceCurrency),nt=n+6,ot=this.calculateLinearInterest(Le,A.lastUpdateTimestamp,nt),at=H.multipliedBy(ot).dividedBy(We).decimalPlaces(0,w.BigNumber.ROUND_DOWN),Ue=E.multipliedBy(at).dividedBy(We).decimalPlaces(0,w.BigNumber.ROUND_DOWN),or=p(u===A.eModeCategoryId?A.eModeLiquidationThreshold:A.reserveLiquidationThreshold).div(1e4),ar=A.usageAsCollateralEnabled&&B.usageAsCollateralEnabledOnUser&&p(B.scaledATokenBalance).gt(0),lr=z.toAssetId(v);I.push({aTokenBalance:Ue,decimals:Number(A.decimals),isCollateral:ar,priceInRef:qe,reserveId:lr,reserveAsset:v,reserveLiquidationThreshold:or})}return{healthFactor:f.toNumber(),totalCollateral:x,totalDebt:b,reserves:I}}async hasBorrowPositions(e){let t=ee.fromAny(e),r=await this.client.getUserAccountData(t),[s,i]=r;return i>0n}async getHealthFactor(e){let t=ee.fromAny(e),r=await this.client.getUserAccountData(t),[s,i,n,o,a,u]=r;return p(u).dividedBy(1e18).decimalPlaces(6,w.BigNumber.ROUND_DOWN).toNumber()}async getHealthFactorAfterWithdraw(e,t,r){let{totalCollateral:s,totalDebt:i,reserves:n}=await this.getSummary(e),o=z.fromAssetId(t),a=n.find(x=>x.reserveAsset===o);if(!a)throw new Error("Missing reserve ctx for "+o);let{decimals:u,isCollateral:c,priceInRef:m,reserveLiquidationThreshold:h}=a,d=_(p(r),u).decimalPlaces(0,1),g=c?d.multipliedBy(m).dividedBy(p(10).pow(u)).decimalPlaces(0,w.BigNumber.ROUND_DOWN):S,y=s.minus(g);return y.lte(0)?0:y.multipliedBy(h).dividedBy(i).decimalPlaces(6,w.BigNumber.ROUND_DOWN).toNumber()}async getHealthFactorAfterSupply(e,t,r){let{totalCollateral:s,totalDebt:i,reserves:n}=await this.getSummary(e),o=z.fromAssetId(t),a=n.find(f=>f.reserveAsset===o);if(!a)throw new Error("Missing reserve ctx for "+o);let{decimals:u,priceInRef:c,reserveLiquidationThreshold:m}=a,d=_(p(r),u).decimalPlaces(0,1).multipliedBy(c).dividedBy(p(10).pow(u)).decimalPlaces(0,w.BigNumber.ROUND_DOWN),g=s.plus(d);return g.lte(0)?0:g.multipliedBy(m).dividedBy(i).decimalPlaces(6,w.BigNumber.ROUND_DOWN).toNumber()}async getMaxWithdraw(e,t){let{totalCollateral:r,totalDebt:s,reserves:i}=await this.getSummary(e),n=z.fromAssetId(t),o=i.find(a=>a.reserveAsset===n);if(!o)throw new Error("Missing reserve ctx for "+n);return this.calculateWithdrawMax(o,r,s)}async getMaxWithdrawAll(e){let{totalCollateral:t,totalDebt:r,reserves:s}=await this.getSummary(e),i={};for(let n of s){let o=this.calculateWithdrawMax(n,t,r);n.reserveId&&(i[n.reserveId]=o)}return i}calculateWithdrawMax(e,t,r){let{aTokenBalance:s,decimals:i,priceInRef:n,reserveLiquidationThreshold:o}=e,a=Pr.multipliedBy(r).div(o).decimalPlaces(0,w.BigNumber.ROUND_UP),u=t.minus(a).decimalPlaces(0,1);if(u.lte(0))return{amount:S,decimals:i};let c=u.multipliedBy(p(10).pow(i)).dividedBy(n).decimalPlaces(0,w.BigNumber.ROUND_DOWN);return{amount:w.BigNumber.minimum(s,c),decimals:i}}calculateLinearInterest(e,t,r){let s=r-t;return s<=0?We:e.multipliedBy(s).dividedBy(br).plus(We).decimalPlaces(0,w.BigNumber.ROUND_DOWN)}};function qt(l){switch(l){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var ms=require("@galacticcouncil/api-augment/hydradx"),ps=require("@galacticcouncil/api-augment/basilisk"),L=class{api;constructor(e){this.api=e}get chainDecimals(){return this.api.registry.chainDecimals[0]}get chainToken(){return this.api.registry.chainTokens[0]}log(e,...t){let r=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");qt(r)&&console.log(e,...t)}};var Z=class extends L{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(e){super(e)}async safeSharesQuery(){try{let e=await this.api.query.stableswap.pools.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}async safeBondsQuery(){try{let e=await this.api.query.bonds.bonds.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}async metadataQuery(){try{let e=await this.api.query.assetRegistry.assetMetadataMap.entries();return new Map(e.map(([{args:[t]},r])=>{let{decimals:s,symbol:i}=r.unwrap();return[t.toString(),{decimals:s.toNumber(),symbol:i.toHuman()}]}))}catch{return new Map([])}}async locationsQuery(){try{let e=await this.api.query.assetRegistry.assetLocations.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}getSystemTokenName(e){switch(e){case"HDX":return"Hydration";case"BSX":return"Basilisk";default:return e}}getToken(e,t,r,s){if(e==M){let m=this.api.consts.balances.existentialDeposit;return{id:M,name:this.getSystemTokenName(this.chainToken),symbol:this.chainToken,decimals:this.chainDecimals,icon:this.chainToken,type:"Token",isSufficient:!0,existentialDeposit:m.toString()}}let{name:i,assetType:n,isSufficient:o,existentialDeposit:a}=t,{symbol:u,decimals:c}=r.get(e)??{};return{id:e,name:i.toHuman(),symbol:u,decimals:c,icon:u,type:n.toHuman(),isSufficient:o?o.toHuman():!0,location:s?.toJSON(),existentialDeposit:a.toString()}}getBond(e,t,r,s){let[i,n]=s,{assetType:o,isSufficient:a,existentialDeposit:u}=t,{symbol:c,decimals:m}=this.getToken(i.toString(),t,r),h=n.toNumber(),d=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",d.format(h)].join(" ");return{id:e,name:g,symbol:c+"b",decimals:m,icon:c,type:o.toString(),isSufficient:a.toHuman(),existentialDeposit:u.toString(),underlyingAssetId:i.toString(),maturity:h}}getShares(e,t,r,s){let{assets:i}=s,{name:n,symbol:o,assetType:a,isSufficient:u,existentialDeposit:c}=t,h=i.map(y=>y.toString()).map(y=>{let{symbol:f}=this.getToken(y,t,r);return[y,f]}),d=Object.fromEntries(h),g=Object.values(d);return{id:e,name:g.join(", "),symbol:o?.isSome?o.toHuman():n.toHuman(),decimals:18,icon:g.join("/"),type:a.toString(),isSufficient:u.toHuman(),existentialDeposit:c.toString(),meta:d}}getExternal(e,t,r,s){let i=this.getToken(e,t,new Map,s),n=r?.find(o=>o.internalId===i.id);return n?{...i,decimals:n.decimals,name:n.name,symbol:n.symbol,icon:n.symbol,isWhiteListed:n.isWhiteListed}:i}normalizeMetadata(e,t){return t.size?t:new Map(e.map(([{args:[r]},s])=>{let{decimals:i,symbol:n}=s.unwrap();return[r.toString(),{decimals:Number(i.toString()),symbol:n.toHuman()}]}))}getSupportedAssets(e){return e.filter(([t,r])=>{if(r.isNone)return!1;let s=r.unwrap();return this.isSupportedAsset(s)})}async getOnChainAssets(e,t){let[r,s,i,n,o]=await Promise.all([this.api.query.assetRegistry.assets.entries(),this.locationsQuery(),this.safeSharesQuery(),this.safeBondsQuery(),this.metadataQuery()]),a=this.getSupportedAssets(r),u=this.normalizeMetadata(a,o),c=a.map(([{args:[m]},h])=>{let d=h.unwrap(),g=s.get(m.toString()),{assetType:y}=d;switch(y.toString()){case"Bond":let f=n.get(m.toString());return this.getBond(m.toString(),d,u,f);case"StableSwap":let x=i.get(m.toString());return this.getShares(m.toString(),d,u,x);case"External":return this.getExternal(m.toString(),d,t,g);default:return this.getToken(m.toString(),d,u,g)}});return e?c:c.filter(m=>this.isValidAsset(m))}isValidAsset(e){let t=Math.sign(e.decimals);return!!e.symbol&&(t===0||t===1)}isSupportedAsset(e){let t=e.assetType.toString();return this.SUPPORTED_TYPES.includes(t)}};var q=class extends L{constructor(e){super(e)}async getBalance(e,t){let r=await this.api.query.assetRegistry.assets(t),{assetType:s}=r.unwrap();return s.toString()==="Erc20"?this.getErc20Balance(e,t):t===M?this.getSystemBalance(e):this.getTokenBalance(e,t)}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateFreeBalance(t)}async getTokenBalance(e,t){let{free:r,reserved:s,frozen:i}=await this.api.query.tokens.accounts(e,t);return this.calculateFreeBalance({free:r,feeFrozen:s,frozen:i})}async getErc20Balance(e,t){let{free:r,reserved:s,frozen:i}=await this.getTokenBalanceData(e,t);return this.calculateFreeBalance({free:r,feeFrozen:0n,frozen:i})}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t(M,this.calculateFreeBalance(r)))}async subscribeTokenBalance(e,t,r){let s=await this.api.query.tokens.accounts.keys(e),i=r?r.map(n=>[e,n]):s.map(({args:[n,o]})=>[n.toString(),o.toString()]);return this.api.query.tokens.accounts.multi(i,n=>{let o=[];n.forEach((a,u)=>{let c=this.calculateFreeBalance(a),m=i[u][1];o.push([m,c])}),t(o)})}async subscribeErc20Balance(e,t,r){let i=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([a,u])=>{let{assetType:c}=u.unwrap();return c.toString()==="Erc20"}).map(([{args:[a]}])=>a.toString()))(),n=async()=>{let o=await Promise.all(i.map(async a=>[a,await this.getErc20Balance(e,a)]));t(o)};return this.api.rpc.chain.subscribeNewHeads(async()=>{n()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateFreeBalance(e){let{free:t,miscFrozen:r,feeFrozen:s,frozen:i}=e,n=new w.BigNumber(t),o=new w.BigNumber(r||i),a=new w.BigNumber(s||0n),u=o.gt(a)?o:a;return n.minus(u)}};var ne=class{api;_minOrderBudget;_blockTime;constructor(e){this.api=e}get blockTime(){return this._blockTime===void 0&&(this._blockTime=this.api.consts.aura.slotDuration.toNumber()),this._blockTime}get minOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=this.api.consts.dca.minBudgetInNativeCurrency.toString()),p(this._minOrderBudget)}};var gt=require("@galacticcouncil/math-liquidity-mining"),Ut=require("@polkadot/types"),ht=require("@polkadot/util"),ft=require("@polkadot/util-crypto");var He=class extends L{balanceClient;constructor(e){super(e),this.balanceClient=new q(e)}secondsInYear=new w.BigNumber(365.2425).times(24).times(60).times(60);async getOmnipoolFarms(e){let t=await this.api.query.omnipoolWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,i])=>{let[,n]=s.args,o=i.unwrap().toString(),a=n.toString(),u=(await this.api.query.omnipoolWarehouseLM.globalFarm(a)).unwrap(),c=(await this.api.query.omnipoolWarehouseLM.yieldFarm(e,a,o)).unwrap(),m=await this.getOraclePrice(u)??u.priceAdjustment.toString(),d=this.getAccountResolver(this.api.registry)(Number(a),!1).toString(),g=u.rewardCurrency.toString(),y=await this.balanceClient.getTokenBalanceData(d,g);return{assetId:e,globalFarm:u,yieldFarm:c,priceAdjustment:m,potBalance:y.free.toString()}}))}async getIsolatedPoolFarms(e){let t=await this.api.query.xykWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,i])=>{let[,n]=s.args,o=i.unwrap().toString(),a=n.toString(),u=(await this.api.query.xykWarehouseLM.globalFarm(a)).unwrap(),c=(await this.api.query.xykWarehouseLM.yieldFarm(e,a,o)).unwrap(),m=await this.getOraclePrice(u)??u.priceAdjustment.toString(),d=this.getAccountResolver(this.api.registry)(Number(a),!0).toString(),g=u.rewardCurrency.toString(),y=await this.balanceClient.getTokenBalanceData(d,g);return{assetId:e,globalFarm:u,yieldFarm:c,priceAdjustment:m,potBalance:y.free.toString()}}))}async getOraclePrice(e){let t=e.rewardCurrency.toString(),r=e.incentivizedAsset.toString(),s=[t,r].sort();if(t===r)return new w.BigNumber(1).shiftedBy(18).toString();let i=await this.api.query.emaOracle.oracles("omnipool",s,"TenMinutes");if(i.isNone)return;let[n]=i.unwrap(),o=n.price.n.toString(),a=n.price.d.toString(),u;return Number(t)<Number(r)?u=(0,gt.fixed_from_rational)(o,a):u=(0,gt.fixed_from_rational)(a,o),u}getGlobalRewardPerPeriod(e,t,r,s){let n=e.times(t).shiftedBy(-18).times(s).shiftedBy(-18);return n.gte(r)?r:n}getPoolYieldPerPeriod(e,t,r,s){return e.times(t).div(r.times(s).shiftedBy(-18))}padEndU8a(e,t){return(0,ht.u8aConcat)(e,Array(Math.max(0,t-e.length)).fill(0))}getAccountResolver=e=>(t,r)=>{let s="modl",i=r?"0x78796b4c4d704944":"0x4f6d6e6957684c4d";return new Ut.GenericAccountId32(e,this.padEndU8a((0,ht.u8aConcat)(s,i,typeof t!="number"?t.toU8a():[t]),32))};async getFarmApr(e,t){if(t==="isolatedpool"&&!(0,ft.isAddress)(e))throw new Error("You must pass an address of isolated pool as id");if(t==="omnipool"&&(0,ft.isAddress)(e))throw new Error("You must pass an asset id of omnipool");let r=6,s=t==="omnipool"?await this.getOmnipoolFarms(e):await this.getIsolatedPoolFarms(e);return s.length?s.map(({yieldFarm:o,globalFarm:a,priceAdjustment:u,potBalance:c})=>{let m=new w.BigNumber(a.totalSharesZ.toString()),h=a.plannedYieldingPeriods.toString(),d=new w.BigNumber(a.yieldPerPeriod.toString()),g=new w.BigNumber(a.maxRewardPerPeriod.toString()),y=a.blocksPerPeriod.toString(),f=new w.BigNumber(o.multiplier.toString()).shiftedBy(-18),x=this.secondsInYear.div(new w.BigNumber(r).times(y)),b;if(m.isZero())b=d.times(f).times(x);else{let E=this.getGlobalRewardPerPeriod(m,d,g,u);b=this.getPoolYieldPerPeriod(E,f,m,u).times(x)}let I=new w.BigNumber(a.pendingRewards.toString()).plus(a.accumulatedPaidRewards.toString()),B=g.times(h),v=c?I.plus(c):B;return I.div(v).gte(.999)?S:b.div(t==="isolatedpool"?2:1).times(100)}).reduce((o,a)=>o.plus(a),S).toString():void 0}};var xe=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},yt=class extends Error{constructor(e,t){super(),this.message=`${e} pool missing ${t}`,this.name="PoolConfigNotFound"}},te=class extends Error{constructor(e,t){super(),this.message=`Route from ${e} to ${t} not found in pool configuration`,this.name="RouteNotFound"}},Pt=class extends Error{constructor(e){super(),this.message=`Asset ${e} not available in current network`,this.name="AssetNotFound"}},bt=class extends Error{constructor(e){super(),this.message=`Storage missing ${e}`,this.name="StorageConfigNotFound"}},St=class extends Error{constructor(e){super(),this.message=`Subscription type "${e}" not supported`,this.name="SubscriptionNotSupported"}},xt=class extends Error{constructor(e){super(),this.message=`${e}`,this.name="ProviderConfigNotFound"}};var Gt=require("viem"),Sr=["wss://hydration-rpc.n.dwellir.com","wss://hydration.dotters.network","wss://rpc.helikon.io/hydradx","wss://hydration.ibp.network","wss://rpc.cay.hydration.cloud","wss://rpc.parm.hydration.cloud","wss://rpc.roach.hydration.cloud","wss://rpc.zipp.hydration.cloud","wss://rpc.sin.hydration.cloud","wss://rpc.coke.hydration.cloud"],vt=l=>{let e=l.__internal__endpoints,t=e.some(s=>Sr.includes(s)),r=e.map(s=>s.replace("wss://","https://").replace("ws://","http://"));return(0,Gt.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:r}},blockExplorers:{default:{name:"Hydration Explorer",url:t?"https://explorer.evm.hydration.cloud":"https://explorer.nice.hydration.cloud"}},testnet:!t})};var $=require("viem");function Wt(l){let e=async({method:t,params:r})=>{let s=Array.isArray(r)?r:[];return l.send(t,s)};return()=>({request:e,config:{name:"PolkadotWsTransport",type:"webSocket",key:"polkadotWs",request:e}})}var ve=class{wsProvider;chain;constructor(e){let{provider:t}=e._options;this.wsProvider=t,this.chain=vt(t)}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return(0,$.createPublicClient)({chain:this.chain,transport:(0,$.http)()})}getWsProvider(){return(0,$.createPublicClient)({chain:this.chain,transport:Wt(this.wsProvider)})}getSigner(e){return(0,$.createWalletClient)({account:e,chain:this.chain,transport:(0,$.custom)(window.ethereum)})}};var we=(l,e)=>l===e?0:l==null?e==null?0:-1:e==null?l==null?0:1:typeof l.compare=="function"?l.compare(e):typeof e.compare=="function"?-e.compare(l):l<e?-1:l>e?1:0;var ze=(l,e=t=>t!==void 0?": "+t:"")=>class extends Error{origMessage;constructor(t){super(l(t)+e(t)),this.origMessage=t!==void 0?String(t):""}};var xr=ze(()=>"illegal argument(s)"),Ht=l=>{throw new xr(l)};var vr=ze(()=>"index out of bounds"),wt=l=>{throw new vr(l)},Xe=(l,e,t)=>(l<e||l>=t)&&wt(l);var zt=23283064365386963e-26,Ye=class{float(e=1){return this.int()*zt*e}probability(e){return this.float()<e}norm(e=1){return(this.int()*zt-.5)*2*e}normMinMax(e,t){let r=this.minmax(e,t);return this.float()<.5?r:-r}minmax(e,t){return this.float()*(t-e)+e}minmaxInt(e,t){e|=0;let r=(t|0)-e;return r?e+this.int()%r:e}minmaxUint(e,t){e>>>=0;let r=(t>>>0)-e;return r?e+this.int()%r:e}};var $e=class extends Ye{constructor(e){super(),this.rnd=e}float(e=1){return this.rnd()*e}norm(e=1){return(this.rnd()-.5)*2*e}int(){return this.rnd()*4294967296>>>0}};var Xt=new $e(Math.random);var Yt=l=>l!=null&&typeof l!="function"&&l.length!==void 0;var $t=Object.getPrototypeOf({}),Ve="function",Vt="string",oe=(l,e)=>{let t;if(l===e)return!0;if(l!=null){if(typeof l.equiv===Ve)return l.equiv(e)}else return l==e;if(e!=null){if(typeof e.equiv===Ve)return e.equiv(l)}else return l==e;return typeof l===Vt||typeof e===Vt?!1:(t=Object.getPrototypeOf(l),(t==null||t===$t)&&(t=Object.getPrototypeOf(e),t==null||t===$t)?Br(l,e):typeof l!==Ve&&l.length!==void 0&&typeof e!==Ve&&e.length!==void 0?wr(l,e):l instanceof Set&&e instanceof Set?Tr(l,e):l instanceof Map&&e instanceof Map?Or(l,e):l instanceof Date&&e instanceof Date?l.getTime()===e.getTime():l instanceof RegExp&&e instanceof RegExp?l.toString()===e.toString():l!==l&&e!==e)},wr=(l,e,t=oe)=>{let r=l.length;if(r===e.length)for(;r-- >0&&t(l[r],e[r]););return r<0},Tr=(l,e,t=oe)=>l.size===e.size&&t([...l.keys()].sort(),[...e.keys()].sort()),Or=(l,e,t=oe)=>l.size===e.size&&t([...l].sort(),[...e].sort()),Br=(l,e,t=oe)=>{if(Object.keys(l).length!==Object.keys(e).length)return!1;for(let r in l)if(!e.hasOwnProperty(r)||!t(l[r],e[r]))return!1;return!0};var Tt=class{value;constructor(e){this.value=e}deref(){return this.value}};var jt=l=>l instanceof Tt;var je=class l{_head;_length=0;constructor(e){e&&this.into(e)}get length(){return this._length}get head(){return this._head}[Symbol.iterator](){return Kt("next",this._head)}reverseIterator(){return Kt("prev",this.tail)}clear(){this.release()}compare(e,t=we){let r=this._length;if(r<e._length)return-1;if(r>e._length)return 1;if(r===0)return 0;{let s=this._head,i=e._head,n=0;for(;r-- >0&&n===0;)n=t(s.value,i.value),s=s.next,i=i.next;return n}}concat(...e){let t=this.copy();for(let r of e)t.into(r);return t}equiv(e){if(!(e instanceof l||Yt(e))||this._length!==e.length)return!1;if(!this._length||this===e)return!0;let t=e[Symbol.iterator](),r=this._head;for(let s=this._length;s-- >0;){if(!oe(r.value,t.next().value))return!1;r=r.next}return!0}filter(e){let t=this.empty();return this.traverse(r=>(e(r.value)&&t.append(r.value),!0)),t}find(e){return this.traverse(t=>t.value!==e)}findWith(e){return this.traverse(t=>!e(t.value))}first(){return this._head&&this._head.value}insertSorted(e,t){t=t||we;for(let r=this._head,s=this._length;s-- >0;){if(t(e,r.value)<=0)return this.insertBefore(r,e);r=r.next}return this.append(e)}into(e){for(let t of e)this.append(t);return this}nth(e,t){let r=this.nthCell(e);return r?r.value:t}nthCellUnsafe(e){let t,r;for(e<=this._length>>>1?(t=this._head,r="next"):(t=this.tail,r="prev",e=this._length-e-1);e-- >0&&t;)t=t[r];return t}peek(){return this.tail&&this.tail.value}$reduce(e,t){let r=this._head;for(let s=this._length;s-- >0&&!jt(t);)t=e(t,r.value),r=r.next;return t}reduce(e,t){return this.$reduce(e,t)}release(){let e=this._head;if(!e)return!0;let t;for(let r=this._length;r-- >0;)t=e.next,delete e.value,delete e.prev,delete e.next,e=t;return this._head=void 0,this._length=0,!0}reverse(){let e=this._head,t=this.tail,r=(this._length>>>1)+(this._length&1);for(;e&&t&&r>0;){let s=e.value;e.value=t.value,t.value=s,e=e.next,t=t.prev,r--}return this}setHead(e){let t=this._head;return t?(t.value=e,t):this.prepend(e)}setNth(e,t){let r=this.nthCell(e);return!r&&wt(e),r.value=t,r}setTail(e){let t=this.tail;return t?(t.value=e,t):this.append(e)}swap(e,t){if(e!==t){let r=e.value;e.value=t.value,t.value=r}return this}toArray(e=[]){return this.traverse(t=>(e.push(t.value),!0)),e}toJSON(){return this.toArray()}toString(){let e=[];return this.traverse(t=>(e.push(String(t.value)),!0)),e.join(", ")}traverse(e,t=this._head,r){if(!this._head)return;let s=t;do{if(!e(s))break;s=s.next}while(s!==r);return s}_map(e,t){return this.traverse(r=>(e.append(t(r.value)),!0)),e}};function*Kt(l,e){for(;e;)yield e.value,e=e[l]}var Ke=class l extends je{_tail;constructor(e){super(),e&&this.into(e)}get tail(){return this._tail}append(e){if(this._tail){let t={value:e,prev:this._tail};return this._tail.next=t,this._tail=t,this._length++,t}else return this.prepend(e)}asHead(e){return e===this._head?this:(this.remove(e),this._head.prev=e,e.next=this._head,e.prev=void 0,this._head=e,this._length++,this)}asTail(e){return e===this._tail?this:(this.remove(e),this._tail.next=e,e.prev=this._tail,e.next=void 0,this._tail=e,this._length++,this)}cons(e){return this.prepend(e),this}copy(){return new l(this)}*cycle(){for(;;)yield*this}drop(){let e=this._head;if(e)return this._head=e.next,this._head?this._head.prev=void 0:this._tail=void 0,this._length--,e.value}empty(){return new l}insertAfter(e,t){let r={value:t,next:e.next,prev:e};return e.next?e.next.prev=r:this._tail=r,e.next=r,this._length++,r}insertAfterNth(e,t){return e<0&&(e+=this._length),e>=this._length-1?this.append(t):(Xe(e,0,this._length),this.insertAfter(this.nthCellUnsafe(e),t))}insertBefore(e,t){let r={value:t,next:e,prev:e.prev};return e.prev?e.prev.next=r:this._head=r,e.prev=r,this._length++,r}insertBeforeNth(e,t){return e<0&&(e+=this._length),e<=0?this.prepend(t):(Xe(e,0,this._length),this.insertBefore(this.nthCellUnsafe(e),t))}map(e){return this._map(new l,e)}nth(e,t){let r=this.nthCell(e);return r?r.value:t}nthCell(e){if(e<0&&(e+=this._length),!(e<0||e>=this._length))return this.nthCellUnsafe(e)}pop(){let e=this._tail;if(e)return this._tail=e.prev,this._tail?this._tail.next=void 0:this._head=void 0,this._length--,e.value}prepend(e){let t={value:e,next:this._head};return this._head?this._head.prev=t:this._tail=t,this._head=t,this._length++,t}push(e){return this.append(e),this}release(){return this._tail=void 0,super.release()}remove(e){return e.prev?e.prev.next=e.next:this._head=e.next,e.next?e.next.prev=e.prev:this._tail=e.prev,this._length--,this}rotateLeft(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:return this.push(this.drop())}}rotateRight(){switch(this._length){case 0:case 1:return this;case 2:return this.swap(this._head,this._tail);default:let e=this.peek();return this.pop(),this.prepend(e),this}}seq(e=0,t=this.length){if(e>=t||e<0)return;let r=this.nthCell(e),s=this.nthCell(t-1),i=n=>({first(){return n.value},next(){return n!==s&&n.next?i(n.next):void 0}});return r?i(r):void 0}shuffle(e,t=Xt){if(this._length<2)return this;for(e=e!==void 0?e:Math.ceil(1.5*Math.log2(this._length));e>0;e--){let r=this._head;for(;r;){let s=r.next;t.probability(.5)?this.asHead(r):this.asTail(r),r=s}}return this}slice(e=0,t=this.length){let r=e<0?e+this._length:e,s=t<0?t+this._length:t;(r<0||s<0)&&Ht("invalid indices: ${from} / ${to}");let i=new l,n=this.nthCell(r);for(;n&&++r<=s;)i.push(n.value),n=n.next;return i}sort(e=we){if(!this._length)return this;let t=1;for(;;){let r=this._head;this._head=void 0,this._tail=void 0;let s=0;for(;r;){s++;let i=r,n=0;for(let a=0;a<t&&(n++,i=i.next,!!i);a++);let o=t;for(;n>0||o>0&&i;){let a;n===0?(a=i,i=i.next,o--):!i||o===0||e(r.value,i.value)<=0?(a=r,r=r.next,n--):(a=i,i=i.next,o--),this._tail?this._tail.next=a:this._head=a,a.prev=this._tail,this._tail=a}r=i}if(this._tail.next=void 0,s<=1)return this;t*=2}}splice(e,t=0,r){let s;typeof e=="number"?(e<0&&(e+=this._length),Xe(e,0,this._length),s=this.nthCellUnsafe(e)):s=e;let i=new l;if(t>0)for(;s&&t-- >0;)this.remove(s),i.push(s.value),s=s.next;else s&&(s=s.next);if(r)if(s)for(let n of r)this.insertBefore(s,n);else for(let n of r)this.push(n);return i}};var ae=class l{map;items;opts;_size;constructor(e,t){let r={maxlen:1/0,maxsize:1/0,map:()=>new Map,ksize:()=>0,vsize:()=>0,...t};this.map=r.map(),this.items=new Ke,this._size=0,this.opts=r,e&&this.into(e)}get length(){return this.items.length}get size(){return this._size}[Symbol.iterator](){return this.entries()}*entries(){for(let e of this.items)yield[e.k,e]}*keys(){for(let e of this.items)yield e.k}*values(){for(let e of this.items)yield e.v}copy(){let e=this.empty();e.items=this.items.copy();let t=e.items.head;for(;t;)e.map.set(t.value.k,t),t=t.next;return e}empty(){return new l(null,this.opts)}release(){this._size=0,this.map.clear();let e=this.opts.release;if(e){let t;for(;t=this.items.drop();)e(t.k,t.v);return!0}return this.items.release()}has(e){return this.map.has(e)}get(e,t){let r=this.map.get(e);return r?this.resetEntry(r):t}set(e,t){let r=this.opts.ksize(e)+this.opts.vsize(t),s=this.map.get(e),i=Math.max(0,r-(s?s.value.s:0));return this._size+=i,this.ensureSize()?this.doSetEntry(s,e,t,r):this._size-=i,t}into(e){for(let t of e)this.set(t[0],t[1]);return this}async getSet(e,t){let r=this.map.get(e);return r?this.resetEntry(r):this.set(e,await t())}delete(e){let t=this.map.get(e);return t?(this.removeEntry(t),!0):!1}resetEntry(e){return this.items.asTail(e),e.value.v}ensureSize(){let{release:e,maxsize:t,maxlen:r}=this.opts;for(;this._size>t||this.length>=r;){let s=this.items.drop();if(!s)return!1;this.map.delete(s.k),e?.(s.k,s.v),this._size-=s.s}return!0}removeEntry(e){let t=e.value;this.map.delete(t.k),this.items.remove(e),this.opts.release?.(t.k,t.v),this._size-=t.s}doSetEntry(e,t,r,s){e?(this.opts.update?.(t,e.value.v,r),e.value.v=r,e.value.s=s,this.items.asTail(e)):(this.items.push({k:t,v:r,s}),this.map.set(t,this.items.tail))}};var Je=class l extends ae{constructor(e,t){super(e,{ttl:60*60*1e3,autoExtend:!1,...t})}empty(){return new l(null,this.opts)}has(e){return this.get(e)!==void 0}get(e,t){let r=this.map.get(e);if(r){if(r.value.t>=Date.now())return this.resetEntry(r);this.removeEntry(r)}return t}set(e,t,r=this.opts.ttl){let s=this.opts.ksize(e)+this.opts.vsize(t),i=this.map.get(e),n=Math.max(0,s-(i?i.value.s:0));return this._size+=n,this.ensureSize()?this.doSetEntry(i,e,t,s,r):this._size-=n,t}async getSet(e,t,r=this.opts.ttl){let s=this.get(e);return s!==void 0?s:this.set(e,await t(),r)}prune(){let e=Date.now(),t=this.items.head,r=0;for(;t;)t.value.t<e&&(this.removeEntry(t),r++),t=t.next;return r}ensureSize(){let{maxlen:e,maxsize:t}=this.opts,r=Date.now(),s=this.items.head;for(;s&&(this._size>t||this.length>=e);)s.value.t<r&&this.removeEntry(s),s=s.next;return super.ensureSize()}doSetEntry(e,t,r,s,i=this.opts.ttl){let n=Date.now()+i;e?(this.opts.update?.(t,e.value.v,r),e.value.v=r,e.value.s=s,e.value.t=n,this.items.asTail(e)):(this.items.push({k:t,v:r,s,t:n,ttl:i}),this.map.set(t,this.items.tail))}resetEntry(e){return this.opts.autoExtend&&(e.value.t=Date.now()+e.value.ttl),super.resetEntry(e)}};var Ze=(l,e=new Map)=>t=>{let r;return e.has(t)?e.get(t):(e.set(t,r=l(t)),r)};var k=(i=>(i.Aave="Aave",i.LBP="Lbp",i.Omni="Omnipool",i.Stable="Stableswap",i.XYK="Xyk",i))(k||{}),re=(i=>(i.UnknownError="UnknownError",i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i))(re||{});var Te=class l{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new l(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit)}constructor(e,t,r,s,i){this.type="Aave",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=i}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(a=>[a.id,a])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let n=p(s.balance),o=p(i.balance);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:n,balanceOut:o,assetInED:S,assetOutED:S}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=[];return t.isGreaterThan(e.balanceOut)&&i.push("TradeNotAllowed"),{amountIn:s,calculatedIn:s,amountOut:t,feePct:0,errors:i}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=[];return s.isGreaterThan(e.balanceOut)&&i.push("TradeNotAllowed"),{amountIn:t,calculatedOut:s,amountOut:s,feePct:0,errors:i}}calculateInGivenOut(e,t){return t}calculateOutGivenIn(e,t){return t}spotPriceInGivenOut(e){return _(D,e.decimalsOut)}spotPriceOutGivenIn(e){return _(D,e.decimalsIn)}calculateTradeFee(e,t){return S}};var Jt=require("@polkadot/util-crypto"),Zt=require("@polkadot/util"),Qt=require("viem");function Ot(l,e){let t=[];return JSON.stringify(l,(r,s)=>(s&&s[e]&&t.push(s),s)),t[0]}function Ir(l,e,t){let r;return JSON.stringify(l,(s,i)=>(i&&i[e]===t&&(r=i),i)),r}var Ar=(l,e)=>typeof e=="bigint"?e.toString():e;var Bt=[{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 Oe=class{client;constructor(e){this.client=e.getWsProvider()}async getData(e,t=6){let[r,s,i]=await Promise.all([this.client.readContract({abi:Bt,address:e,functionName:"latestRoundData"}),this.client.readContract({abi:Bt,address:e,functionName:"decimals"}),this.client.getBlock()]),[n,o,a,u]=r,c=i.number-(i.timestamp-u)/BigInt(t),m=Number(c);return{price:o,decimals:s,updatedAt:m<0?0:m}}};var U=class extends q{evm;mmOracle;pools=[];subs=[];assets=new Map([]);mem=0;memPoolsCache=new Je(null,{maxlen:1,ttl:1*60*60*1e3,release:e=>{this.mem>e&&this.log(this.getPoolType(),`mem ${e} released at`,new Date)}});memPools=Ze(e=>(this.log(this.getPoolType(),`mem ${e} sync`),this.getPools()),this.memPoolsCache);constructor(e,t){super(e),this.evm=t,this.mmOracle=new Oe(t)}get augmentedPools(){return this.pools.filter(e=>this.isValidPool(e)).map(e=>this.withMetadata(e))}async withAssets(e){this.assets=new Map(e.map(t=>[t.id,t])),this.mem=this.mem+1}async getPoolsMem(){return await this.memPools(this.mem)}async getPools(){this.unsubscribe(),this.pools=await this.loadPools(),this.subs=this.subscribe();let e=this.getPoolType();return this.log(e,`mem ${this.mem} pools(${this.augmentedPools.length})`),this.log(e,`mem ${this.mem} subs(${this.subs.length})`),this.augmentedPools}subscribe(){return this.augmentedPools.map(t=>{let r=[];try{let i=this.subscribePoolChange(t);r.push(i)}catch{}if(t.type==="Aave")return r;let s=this.subscribeTokensPoolBalance(t);if(r.push(s),this.hasSystemAsset(t)){let i=this.subscribeSystemPoolBalance(t);r.push(i)}if(this.hasErc20Asset(t)){let i=this.subscribeErc20PoolBalance(t);r.push(i)}return this.subscribeLog(t),r}).flat()}hasSystemAsset(e){return e.tokens.some(t=>t.id==="0")}hasErc20Asset(e){return e.tokens.some(t=>t.type==="Erc20")}unsubscribe(){this.subs.forEach(e=>{e.then(t=>t())})}subscribeLog(e){let t=e.address.substring(0,10).concat("...");this.log(`${e.type} mem ${this.mem} [${t}] balance subscribed`)}subscribeSystemPoolBalance(e){return this.subscribeSystemBalance(e.address,this.updateBalanceCallback(e))}subscribeTokensPoolBalance(e){let t=(r,s)=>r.id!==s;return this.subscribeTokenBalance(e.address,this.updateBalancesCallback(e,t))}subscribeErc20PoolBalance(e){let t=e.tokens.filter(r=>r.type==="Erc20").map(r=>r.id);return this.subscribeErc20Balance(e.address,this.updateBalancesCallback(e,()=>!0),t)}isValidPool(e){return e.type==="Xyk"?e.tokens.every(t=>this.assets.get(t.id)):!0}withMetadata(e){return e.tokens=e.tokens.map(t=>{let r=this.assets.get(t.id);return{...t,...r}}),e}updateBalancesCallback(e,t){return function(r){r.forEach(([s,i])=>{let n=e.tokens.findIndex(o=>o.id==s);n>=0&&t(e,s)&&(e.tokens[n].balance=i.toString())})}}updateBalanceCallback(e){return function(t,r){let s=e.tokens.findIndex(i=>i.id==t);s>=0&&(e.tokens[s].balance=r.toString())}}};var _r=["Supply","Withdraw","Repay","Borrow"],Be=class extends U{isSupported(){return this.api.call.aaveTradeExecutor.pools!==void 0}async loadPools(){return(await this.api.call.aaveTradeExecutor.pools()).map(({reserve:t,atoken:r,liqudityIn:s,liqudityOut:i})=>({address:this.getPoolId(t.toString(),r.toString()),type:"Aave",tokens:[{id:t.toString(),balance:s.toString()},{id:r.toString(),balance:i.toString()}],...this.getPoolLimits()}))}async getPoolFees(e,t){return{}}getPoolType(){return"Aave"}getPoolId(e,t){let r=e+"/"+t;return(0,Jt.encodeAddress)((0,Zt.stringToU8a)(r.padEnd(32,"\0")),63)}subscribePoolChange(e){let[t,r]=e.tokens,s=this.getReserveH160Id(t);return this.api.query.system.events(i=>{i.forEach(n=>{let{event:o}=n,a=`${o.section}:${o.method}`;if(a==="router:Executed"){let{assetIn:u,assetOut:c}=o.data.toHuman(),m=u.replace(/,/g,""),h=c.replace(/,/g,"");(m===r.id||h===r.id)&&(this.log(`Sync AAVE [router:Executed] :: ${m}:${h}`),this.updatePoolState(e))}if(a==="evm:Log"){let{log:u}=o.data.toHuman();try{let{eventName:c,args:m}=(0,Qt.decodeEventLog)({abi:Ge,topics:u.topics,data:u.data});_r.includes(c)&&m.reserve.toLowerCase()===s.toLowerCase()&&(this.log(`Sync AAVE [evm:Log] :: ${c} ${t.symbol}(${t.id})`),this.updatePoolState(e))}catch{}}})})}async updatePoolState(e){let[t,r]=e.tokens,{liqudityIn:s,liqudityOut:i}=await this.api.call.aaveTradeExecutor.pool(t.id,r.id);e.tokens=e.tokens.map(n=>{let o=n.id===t.id?s.toString():i.toString();return{...n,balance:o}})}getReserveH160Id(e){return e.type==="Erc20"?Ot(e.location,"accountKey20").accountKey20.key:z.fromAssetId(e.id)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:0}}};var X=require("@galacticcouncil/math-lbp"),W=class{static getSpotPrice(e,t,r,s,i){return(0,X.get_spot_price)(e,t,r,s,i)}static calculateInGivenOut(e,t,r,s,i){return(0,X.calculate_in_given_out)(e,t,r,s,i)}static calculateOutGivenIn(e,t,r,s,i){return(0,X.calculate_out_given_in)(e,t,r,s,i)}static calculateLinearWeights(e,t,r,s,i){return(0,X.calculate_linear_weights)(e,t,r,s,i)}static calculatePoolTradeFee(e,t,r){return(0,X.calculate_pool_trade_fee)(e,t,r)}};var P=class{static toPct(e){return e[0]/e[1]*100}static toDecimals(e){return e[0]/e[1]}static fromPermill(e){return[e/1e3,1e3]}};var Ie=class l{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(e){return new l(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.fee,e.repayFeeApply)}constructor(e,t,r,s,i,n,o){this.type="Lbp",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=i,this.fee=n,this.repayFeeApply=o}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(a=>[a.id,a])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let n=p(s.balance),o=p(i.balance);return{assetIn:e,assetOut:t,balanceIn:n,balanceOut:o,decimalsIn:s.decimals,decimalsOut:i.decimals,weightIn:s.weight,weightOut:i.weight}}validateAndBuy(e,t,r){let s=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let n=e.balanceOut.div(this.maxOutRatio);if(t.isGreaterThan(n)&&i.push("MaxOutRatioExceeded"),s===e.assetOut){let o=this.calculateTradeFee(t,r),a=P.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),u=t.plus(o),c=this.calculateInGivenOut(e,u),m=e.balanceIn.div(this.maxInRatio);return c.isGreaterThan(m)&&i.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:t,feePct:a,errors:i}}else{let o=this.calculateInGivenOut(e,t),a=e.balanceIn.div(this.maxInRatio);return o.isGreaterThan(a)&&i.push("MaxInRatioExceeded"),{amountIn:o,calculatedIn:o,amountOut:t,feePct:0,errors:i}}}validateAndSell(e,t,r){let s=this.tokens[0].id,i=[];t.isLessThan(this.minTradingLimit)&&i.push("InsufficientTradingAmount");let n=e.balanceIn.div(this.maxInRatio);if(t.isGreaterThan(n)&&i.push("MaxInRatioExceeded"),s===e.assetIn){let o=this.calculateOutGivenIn(e,t),a=e.balanceOut.div(this.maxOutRatio);return o.isGreaterThan(a)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:o,amountOut:o,feePct:0,errors:i}}else{let o=this.calculateOutGivenIn(e,t),a=this.calculateTradeFee(o,r),u=P.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),c=o.minus(a),m=e.balanceOut.div(this.maxOutRatio);return c.isGreaterThan(m)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:o,amountOut:c,feePct:u,errors:i}}}calculateInGivenOut(e,t){let r=W.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?S:s}calculateOutGivenIn(e,t){let r=W.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?S:s}spotPriceInGivenOut(e){let t=W.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),_(D,e.decimalsOut).toString());return p(t)}spotPriceOutGivenIn(e){let t=W.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),_(D,e.decimalsIn).toString());return p(t)}calculateTradeFee(e,t){let r=W.calculatePoolTradeFee(e.toString(),this.repayFeeApply?t.repayFee[0]:t.exchangeFee[0],this.repayFeeApply?t.repayFee[1]:t.exchangeFee[1]);return p(r)}};var Ae=class extends U{MAX_FINAL_WEIGHT=_(p(100),6);poolsData=new Map([]);isSupported(){return this.api.query.lbp!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.lbp.poolData.entries(),this.api.query.parachainSystem.validationData()]),{relayParentNumber:r}=t.unwrap(),s=e.filter(([i,n])=>this.isActivePool(n.unwrap(),r)).map(async([{args:[i]},n])=>{let o=n.unwrap(),a=i.toString(),u=await this.getPoolDelta(a,o,r.toString());return this.poolsData.set(i.toString(),o),{address:a,type:"Lbp",fee:o.fee.toJSON(),...u,...this.getPoolLimits()}});return Promise.all(s)}async getPoolFees(e,t){let r=this.pools.find(s=>s.address===t);return{repayFee:this.getRepayFee(),exchangeFee:r.fee}}getPoolType(){return"Lbp"}async subscribePoolChange(e){return this.api.query.parachainSystem.validationData(async t=>{let{relayParentNumber:r}=t.unwrap(),s=this.poolsData.get(e.address);if(this.isActivePool(s,r)){let n=await this.getPoolDelta(e.address,s,r.toString());Object.assign(e,n)}else{let n=this.pools.findIndex(o=>o.address==e.address);this.pools.splice(n,1)}})}async getPoolDelta(e,t,r){let{start:s,end:i,assets:n,initialWeight:o,finalWeight:a,repayTarget:u,feeCollector:c}=t,m=W.calculateLinearWeights(s.toString(),i.toString(),o.toString(),a.toString(),r),[h,d]=n,g=h.toString(),y=p(m),f=d.toString(),x=this.MAX_FINAL_WEIGHT.minus(p(y)),[b,I,B]=await Promise.all([this.isRepayFeeApplied(g,u.toString(),c.toString()),this.getBalance(e,g),this.getBalance(e,f)]);return{repayFeeApply:b,tokens:[{id:g,weight:y,balance:I.toString()},{id:f,weight:x,balance:B.toString()}]}}isActivePool(e,t){if(e.start.isEmpty||e.end.isEmpty)return!1;let r=e.start.unwrap().toNumber(),s=e.end.unwrap().toNumber();return t.toNumber()>=r&&t.toNumber()<s}async isRepayFeeApplied(e,t,r){let s=p(t);if(s.isZero())return!1;try{return(await this.getBalance(e,r)).isLessThan(s)}catch{return!0}}getRepayFee(){return this.api.consts.lbp.repayFee.toJSON()}getPoolLimits(){let e=this.api.consts.lbp.maxInRatio.toJSON(),t=this.api.consts.lbp.maxOutRatio.toJSON(),r=this.api.consts.lbp.minTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};var O=require("@galacticcouncil/math-omnipool");var N=class{static calculateSpotPrice(e,t,r,s){return(0,O.calculate_spot_price)(e,t,r,s)}static calculateLrnaSpotPrice(e,t){return(0,O.calculate_lrna_spot_price)(e,t)}static calculateInGivenOut(e,t,r,s,i,n,o,a,u){return(0,O.calculate_in_given_out)(e,t,r,s,i,n,o,a,u)}static calculateLrnaInGivenOut(e,t,r,s,i){return(0,O.calculate_lrna_in_given_out)(e,t,r,s,i)}static calculateOutGivenIn(e,t,r,s,i,n,o,a,u){return(0,O.calculate_out_given_in)(e,t,r,s,i,n,o,a,u)}static calculateOutGivenLrnaIn(e,t,r,s,i){return(0,O.calculate_out_given_lrna_in)(e,t,r,s,i)}static calculatePoolTradeFee(e,t,r){return(0,O.calculate_pool_trade_fee)(e,t,r)}static calculateShares(e,t,r,s){return(0,O.calculate_shares)(e,t,r,s)}static calculateLiquidityOut(e,t,r,s,i,n,o,a){return(0,O.calculate_liquidity_out)(e,t,r,s,i,n,o,a)}static calculateLiquidityLRNAOut(e,t,r,s,i,n,o,a){return(0,O.calculate_liquidity_lrna_out)(e,t,r,s,i,n,o,a)}static calculateCapDifference(e,t,r,s){let i=(0,w.BigNumber)(t),n=(0,w.BigNumber)(e),o=(0,w.BigNumber)(s),u=(0,w.BigNumber)(r).shiftedBy(-18);if(i.div(o).lt(u)){let m=u.times(o).minus(i).times(n),h=i.times((0,w.BigNumber)(1).minus(u));return m.div(h).toFixed(0)}else return"0"}static calculateLimitHubIn(e,t,r,s){return(0,O.calculate_liquidity_hub_in)(e,t,r,s)}static isSellAllowed(e){return(0,O.is_sell_allowed)(e)}static isBuyAllowed(e){return(0,O.is_buy_allowed)(e)}static isAddLiquidityAllowed(e){return(0,O.is_add_liquidity_allowed)(e)}static isRemoveLiquidityAllowed(e){return(0,O.is_remove_liquidity_allowed)(e)}static recalculateAssetFee(e,t,r,s,i,n,o,a,u,c,m){return(0,O.recalculate_asset_fee)(e,t,r,s,i,n,o,a,u,c,m)}static recalculateProtocolFee(e,t,r,s,i,n,o,a,u,c,m){return(0,O.recalculate_protocol_fee)(e,t,r,s,i,n,o,a,u,c,m)}static verifyAssetCap(e,t,r,s){return(0,O.verify_asset_cap)(e,t,r,s)}};var _e=class l{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(e){return new l(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.hubAssetId)}constructor(e,t,r,s,i,n){this.type="Omnipool",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=i,this.hubAssetId=n}validatePair(e,t){return this.hubAssetId!=t}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let n=p(s.balance),o=p(i.balance),a=p(s.existentialDeposit),u=p(i.existentialDeposit);return{assetIn:e,assetOut:t,hubReservesIn:s.hubReserves,hubReservesOut:i.hubReserves,sharesIn:s.shares,sharesOut:i.shares,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:n,balanceOut:o,tradeableIn:s.tradeable,tradeableOut:i.tradeable,assetInED:a,assetOutED:u}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),n=i.minus(s),o=s===S?S:n.div(s).multipliedBy(100).decimalPlaces(2),a=[],u=N.isSellAllowed(e.tradeableIn),c=N.isBuyAllowed(e.tradeableOut);(!u||!c)&&a.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&a.push("InsufficientTradingAmount");let m=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(m)&&a.push("MaxOutRatioExceeded");let h=e.balanceIn.div(this.maxInRatio);return i.isGreaterThan(h)&&a.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:o.toNumber(),errors:a}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,r),o=s.minus(i).div(s).multipliedBy(100).decimalPlaces(2),a=[],u=N.isSellAllowed(e.tradeableIn),c=N.isBuyAllowed(e.tradeableOut);(!u||!c)&&a.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&a.push("InsufficientTradingAmount");let m=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(m)&&a.push("MaxInRatioExceeded");let h=e.balanceOut.div(this.maxOutRatio);return i.isGreaterThan(h)&&a.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:o.toNumber(),errors:a}}calculateInGivenOut(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(e,t,r);let s=N.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toDecimals(r.assetFee).toString():S.toString(),r?P.toDecimals(r.protocolFee).toString():S.toString()),i=p(s);return i.isNegative()?S:i}calculateLrnaInGivenOut(e,t,r){let s=N.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toDecimals(r.assetFee).toString():S.toString()),i=p(s);return i.isNegative()?S:i}calculateOutGivenIn(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,r);let s=N.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toDecimals(r.assetFee).toString():S.toString(),r?P.toDecimals(r.protocolFee).toString():S.toString()),i=p(s);return i.isNegative()?S:i}calculateOutGivenLrnaIn(e,t,r){let s=N.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toDecimals(r.assetFee).toString():S.toString()),i=p(s);return i.isNegative()?S:i}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=N.calculateSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString(),e.balanceIn.toString(),e.hubReservesIn.toString());return p(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceLrnaInGivenOut(e){let t=N.calculateLrnaSpotPrice(e.hubReservesOut.toString(),e.balanceOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceOutGivenIn(e){if(e.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(e);let t=N.calculateSpotPrice(e.balanceIn.toString(),e.hubReservesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}spotPriceOutGivenLrnaIn(e){let t=N.calculateLrnaSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}};var er=require("@polkadot/util-crypto"),tr=require("@polkadot/util");var Ne=class extends U{isSupported(){return this.api.query.omnipool!==void 0}async loadPools(){let e=this.api.consts.omnipool.hubAssetId.toString(),t=this.getPoolId(),[r,s,i]=await Promise.all([this.api.query.omnipool.assets.entries(),this.api.query.omnipool.hubAssetTradability(),this.getBalance(t,e)]),n=r.map(async([{args:[a]},u])=>{let{hubReserve:c,shares:m,tradable:h,cap:d,protocolShares:g}=u.unwrap(),y=await this.getBalance(t,a.toString());return{id:a.toString(),hubReserves:p(c.toString()),shares:p(m.toString()),tradeable:h.bits.toNumber(),balance:y.toString(),cap:p(d.toString()),protocolShares:p(g.toString())}}),o=await Promise.all(n);return o.push({id:e,tradeable:s.bits.toNumber(),balance:i.toString()}),[{address:t,type:"Omnipool",hubAssetId:e,tokens:o,...this.getPoolLimits()}]}async getPoolFees(e,t){let r=e.assetOut,s=e.assetIn,i="omnipool",n="Short",o=B=>B===M?[M,Pe]:[Pe,B],[a,u,c,m]=await Promise.all([this.api.query.system.number(),this.api.query.dynamicFees.assetFee(r),this.api.query.emaOracle.oracles(i,o(r),n),this.api.query.emaOracle.oracles(i,o(s),n)]),[h,d,g]=this.getAssetFee(e,a.toNumber(),u,c),[y,f,x]=s===Pe?[0,0,0]:this.getProtocolFee(e,a.toNumber(),u,m),b=h+y,I=g+x;return{assetFee:P.fromPermill(d),protocolFee:P.fromPermill(f),min:P.fromPermill(b),max:P.fromPermill(I)}}getPoolType(){return"Omnipool"}async subscribePoolChange(e){let t=e.tokens.map(r=>r.id);return this.api.query.omnipool.assets.multi(t,r=>{e.tokens=r.map((s,i)=>{let n=e.tokens[i];if(s.isNone)return n;let o=s.unwrap();return this.updateTokenState(n,o)})})}updateTokenState(e,t){let{hubReserve:r,shares:s,tradable:i,cap:n,protocolShares:o}=t;return{...e,hubReserves:p(r.toString()),shares:p(s.toString()),cap:p(n.toString()),protocolShares:p(o.toString()),tradeable:i.bits.toNumber()}}getAssetFee(e,t,r,s){let{assetOut:i,balanceOut:n}=e,{minFee:o,maxFee:a,decay:u,amplification:c}=this.api.consts.dynamicFees.assetFeeParameters,m=P.fromPermill(o.toNumber()),h=P.fromPermill(a.toNumber());if(r.isNone||s.isNone)return[o.toNumber(),o.toNumber(),a.toNumber()];let[d]=s.unwrap(),{assetFee:g,timestamp:y}=r.unwrap(),f=Math.max(1,t-y.toNumber()),x=d.volume.bIn.toString(),b=d.volume.bOut.toString(),I=d.liquidity.b.toString();i===M&&(x=d.volume.aIn.toString(),b=d.volume.aOut.toString(),I=d.liquidity.a.toString());let B=P.fromPermill(g.toNumber()),v=N.recalculateAssetFee(x,b,I,"9",n.toString(),P.toDecimals(B).toString(),f.toString(),P.toDecimals(m).toString(),P.toDecimals(h).toString(),u.toString(),c.toString());return[o.toNumber(),Number(v)*1e6,a.toNumber()]}getProtocolFee(e,t,r,s){let{assetIn:i,balanceIn:n}=e,{minFee:o,maxFee:a,decay:u,amplification:c}=this.api.consts.dynamicFees.protocolFeeParameters,m=P.fromPermill(o.toNumber()),h=P.fromPermill(a.toNumber());if(r.isNone||s.isNone)return[o.toNumber(),o.toNumber(),a.toNumber()];let[d]=s.unwrap(),{protocolFee:g,timestamp:y}=r.unwrap(),f=Math.max(1,t-y.toNumber()),x=d.volume.bIn.toString(),b=d.volume.bOut.toString(),I=d.liquidity.b.toString();i===M&&(x=d.volume.aIn.toString(),b=d.volume.aOut.toString(),I=d.liquidity.a.toString());let B=P.fromPermill(g.toNumber()),v=N.recalculateProtocolFee(x,b,I,"9",n.toString(),P.toDecimals(B).toString(),f.toString(),P.toDecimals(m).toString(),P.toDecimals(h).toString(),u.toString(),c.toString());return[o.toNumber(),Number(v)*1e6,a.toNumber()]}getPoolId(){return(0,er.encodeAddress)((0,tr.stringToU8a)("modlomnipool".padEnd(32,"\0")),63)}getPoolLimits(){let e=this.api.consts.omnipool.maxInRatio.toJSON(),t=this.api.consts.omnipool.maxOutRatio.toJSON(),r=this.api.consts.omnipool.minimumTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};var R=require("@galacticcouncil/math-xyk"),V=class{static getSpotPrice(e,t,r){return(0,R.get_spot_price)(e,t,r)}static calculateInGivenOut(e,t,r){return(0,R.calculate_in_given_out)(e,t,r)}static calculateOutGivenIn(e,t,r){return(0,R.calculate_out_given_in)(e,t,r)}static calculatePoolTradeFee(e,t,r){return(0,R.calculate_pool_trade_fee)(e,t,r)}static calculateLiquidityIn(e,t,r){return(0,R.calculate_liquidity_in)(e,t,r)}static calculateSpotPrice(e,t){return(0,R.calculate_spot_price)(e,t)}static calculateSpotPriceWithFee(e,t,r,s){return(0,R.calculate_spot_price_with_fee)(e,t,r,s)}static calculateShares(e,t,r){return(0,R.calculate_shares)(e,t,r)}static calculateLiquidityOutAssetA(e,t,r,s){return(0,R.calculate_liquidity_out_asset_a)(e,t,r,s)}static calculateLiquidityOutAssetB(e,t,r,s){return(0,R.calculate_liquidity_out_asset_b)(e,t,r,s)}};var Fe=class l{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new l(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit)}constructor(e,t,r,s,i){this.type="Xyk",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=i}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let n=p(s.balance),o=p(i.balance),a=p(s.existentialDeposit),u=p(i.existentialDeposit);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:n,balanceOut:o,assetInED:a,assetOutED:u}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateTradeFee(s,r),n=P.toPct(r.exchangeFee),o=s.plus(i),a=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&a.push("InsufficientTradingAmount");let u=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(u)&&a.push("MaxOutRatioExceeded");let c=e.balanceIn.div(this.maxInRatio);return o.isGreaterThan(c)&&a.push("MaxInRatioExceeded"),{amountIn:o,calculatedIn:s,amountOut:t,feePct:n,errors:a}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateTradeFee(s,r),n=P.toPct(r.exchangeFee),o=s.minus(i),a=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&a.push("InsufficientTradingAmount");let u=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(u)&&a.push("MaxInRatioExceeded");let c=e.balanceOut.div(this.maxOutRatio);return o.isGreaterThan(c)&&a.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:o,feePct:n,errors:a}}calculateInGivenOut(e,t){let r=V.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?S:s}calculateOutGivenIn(e,t){let r=V.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?S:s}spotPriceInGivenOut(e){let t=V.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),r=_(D,18-e.decimalsOut);return p(t).div(r)}spotPriceOutGivenIn(e){let t=V.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),r=_(D,18-e.decimalsIn);return p(t).div(r)}calculateTradeFee(e,t){let r=V.calculatePoolTradeFee(e.toString(),t.exchangeFee[0],t.exchangeFee[1]);return p(r)}};var Re=class extends U{isSupported(){return this.api.query.xyk!==void 0}async loadPools(){let t=(await this.api.query.xyk.poolAssets.entries()).map(async([{args:[r]},s])=>{let i=r.toString(),[n,o]=s.unwrap(),[a,u]=await Promise.all([this.getBalance(i,n.toString()),this.getBalance(i,o.toString())]);return{address:i,type:"Xyk",tokens:[{id:n.toString(),balance:a.toString()},{id:o.toString(),balance:u.toString()}],...this.getPoolLimits()}});return Promise.all(t)}async getPoolFees(e,t){return{exchangeFee:this.getExchangeFee()}}getPoolType(){return"Xyk"}subscribePoolChange(e){throw new Error("Pool change subscription not supported!")}getExchangeFee(){return this.api.consts.xyk.getExchangeFee.toJSON()}getPoolLimits(){let e=this.api.consts.xyk.maxInRatio.toJSON(),t=this.api.consts.xyk.maxOutRatio.toJSON(),r=this.api.consts.xyk.minTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};var F=require("@galacticcouncil/math-stableswap"),C=class{static getPoolAddress(e){return(0,F.pool_account_name)(e)}static defaultPegs(e){let t=[];for(let r=0;r<e;r++)t.push(["1","1"]);return t}static calculateAmplification(e,t,r,s,i){return(0,F.calculate_amplification)(e,t,r,s,i)}static calculateInGivenOut(e,t,r,s,i,n,o){return(0,F.calculate_in_given_out)(e,t,r,s,i,n,o)}static calculateAddOneAsset(e,t,r,s,i,n,o){return(0,F.calculate_add_one_asset)(e,t,r,s,i,n,o)}static calculateSharesForAmount(e,t,r,s,i,n,o){return(0,F.calculate_shares_for_amount)(e,t,r,s,i,n,o)}static calculateOutGivenIn(e,t,r,s,i,n,o){return(0,F.calculate_out_given_in)(e,t,r,s,i,n,o)}static calculateLiquidityOutOneAsset(e,t,r,s,i,n,o){return(0,F.calculate_liquidity_out_one_asset)(e,t,r,s,i,n,o)}static calculateShares(e,t,r,s,i,n){return(0,F.calculate_shares)(e,t,r,s,i,n)}static calculateSpotPriceWithFee(e,t,r,s,i,n,o,a){return(0,F.calculate_spot_price_with_fee)(e,t,r,s,i,n,o,a)}static calculatePoolTradeFee(e,t,r){return(0,F.calculate_pool_trade_fee)(e,t,r)}static recalculatePegs(e,t,r,s,i){let n=(0,F.recalculate_peg)(e,t,r,s,i);return JSON.parse(n)}};var Ee=class l{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;pegs;pegsFee;static fromPool(e){return new l(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.amplification,e.id,e.fee,e.totalIssuance,e.pegs,e.pegsFee)}constructor(e,t,r,s,i,n,o,a,u,c,m){this.type="Stableswap",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=i,this.amplification=n,this.id=o,this.fee=a,this.totalIssuance=u,this.pegs=c,this.pegsFee=m}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),i=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(i==null)throw new Error("Pool does not contain tokenOut");let n=p(s.balance),o=p(i.balance),a=p(s.existentialDeposit),u=p(i.existentialDeposit);return{assetIn:e,assetOut:t,balanceIn:n,balanceOut:o,decimalsIn:s.decimals,decimalsOut:i.decimals,tradeableIn:this.id===e?15:s.tradeable,tradeableOut:this.id===t?15:i.tradeable,assetInED:a,assetOutED:u}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),n=P.toPct(r.fee),o=[],a=N.isSellAllowed(e.tradeableIn),u=N.isBuyAllowed(e.tradeableOut);return(!a||!u)&&o.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&o.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:n,errors:o}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,r),n=P.toPct(r.fee),o=[],a=N.isSellAllowed(e.tradeableIn),u=N.isBuyAllowed(e.tradeableOut);return(!a||!u)&&o.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&o.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:n,errors:o}}calculateIn(e,t,r){let s=C.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?P.toDecimals(r.fee).toString():S.toString(),this.getPegs()),i=p(s);return i.isNegative()?S:i}calculateAddOneAsset(e,t,r){let s=C.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,r?P.toDecimals(r.fee).toString():S.toString(),this.getPegs()),i=p(s);return i.isNegative()?S:i}calculateSharesForAmount(e,t,r){let s=C.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,r?P.toDecimals(r.fee).toString():S.toString(),this.getPegs()),i=p(s);return i.isNegative()?S:i}calculateInGivenOut(e,t,r){return e.assetOut==this.id?this.calculateAddOneAsset(e,t,r):e.assetIn==this.id?this.calculateSharesForAmount(e,t,r):this.calculateIn(e,t,r)}spotPriceInGivenOut(e){let t=C.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetOut,e.assetIn,this.totalIssuance,"0",this.getPegs());if(e.assetOut==this.id)return p(t);if(e.assetIn==this.id){let s=_(D,e.decimalsIn-e.decimalsOut);return p(t).div(s)}let r=_(D,18-e.decimalsIn);return p(t).div(r)}calculateOut(e,t,r){let s=C.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?P.toDecimals(r.fee).toString():S.toString(),this.getPegs()),i=p(s);return i.isNegative()?S:i}calculateWithdrawOneAsset(e,t,r){let s=C.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,r?P.toDecimals(r.fee).toString():S.toString(),this.getPegs()),i=p(s);return i.isNegative()?S:i}calculateShares(e,t,r){let s=C.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,r?P.toDecimals(r.fee).toString():S.toString(),this.getPegs()),i=p(s);return i.isNegative()?S:i}calculateOutGivenIn(e,t,r){return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t,r):e.assetOut==this.id?this.calculateShares(e,t,r):this.calculateOut(e,t,r)}spotPriceOutGivenIn(e){let t=C.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetIn,e.assetOut,this.totalIssuance,"0",this.getPegs());if(e.assetIn==this.id)return p(t);if(e.assetOut==this.id){let s=_(D,e.decimalsOut-e.decimalsIn);return p(t).div(s)}let r=_(D,18-e.decimalsOut);return p(t).div(r)}calculateTradeFee(e,t){let r=C.calculatePoolTradeFee(e.toString(),t.fee[0],t.fee[1]);return p(r)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let e=this.tokens.filter(t=>t.id!=this.id).map(({id:t,balance:r,decimals:s})=>({asset_id:Number(t),amount:r,decimals:s}));return JSON.stringify(e)}getAssets(e,t){let r={asset_id:Number(e),amount:t.toFixed(0)};return JSON.stringify([r])}};var Qe=require("@polkadot/util-crypto");var rr=340282366920938463463374607431768211455n,De=class extends U{stablePools=new Map([]);isSupported(){return this.api.query.stableswap!==void 0}isPegSupported(){return this.api.query.stableswap.poolPegs!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.stableswap.pools.entries(),this.api.query.system.number()]),r=t.toNumber(),s=e.map(async([{args:[i]},n])=>{let o=n.unwrap(),a=i.toString(),u=this.getPoolAddress(a),[c,m,h]=await Promise.all([this.getPoolDelta(a,o,r.toString()),this.getPoolTokens(u,a,o),this.getPoolPegs(a,o,r.toString())]);return this.stablePools.set(u,o),{address:u,id:a,type:"Stableswap",fee:P.fromPermill(o.fee.toNumber()),tokens:m,...c,...h,...this.getPoolLimits()}});return Promise.all(s)}async getPoolFees(e,t){return{fee:this.pools.find(s=>s.address===t).pegsFee}}getPoolType(){return"Stableswap"}async subscribePoolChange(e){return this.api.query.system.number(async t=>{let r=t.toString(),s=this.stablePools.get(e.address);if(s){let[i,n]=await Promise.all([this.getPoolDelta(e.id,s,r),this.getPoolPegs(e.id,s,r)]);Object.assign(e,i,n)}})}async getPoolDelta(e,t,r){let{initialAmplification:s,finalAmplification:i,initialBlock:n,finalBlock:o}=t,a=C.calculateAmplification(s.toString(),i.toString(),n.toString(),o.toString(),r),u=await this.api.query.tokens.totalIssuance(e);return{amplification:a,totalIssuance:u.toString()}}async getPoolTokens(e,t,r){let{assets:s}=r,i=s.map(async o=>{let[a,u]=await Promise.all([this.api.query.stableswap.assetTradability(t,o.toString()),this.getBalance(e,o.toString())]);return{id:o.toString(),tradeable:a.bits.toNumber(),balance:u.toString()}}),n=await Promise.all(i);return n.push({id:t,tradeable:15,balance:rr.toString()}),n}getPoolDefaultPegs(e){let t=e.fee,r=C.defaultPegs(e.assets.length);return{pegsFee:P.fromPermill(t.toNumber()),pegs:r}}async getPoolPegs(e,t,r){if(!this.isPegSupported())return this.getPoolDefaultPegs(t);let s=await this.api.query.stableswap.poolPegs(e);if(s.isNone)return this.getPoolDefaultPegs(t);let i=s.unwrap(),n=await this.getLatestPegs(t,i,r),o=this.getRecentPegs(i),a=i.maxPegUpdate.toHuman(),u=t.fee.toHuman(),[c,m]=C.recalculatePegs(JSON.stringify(o),JSON.stringify(n),r,a.replace(/%/g,""),u.replace(/%/g,"")),h=Number(c)*1e4;return{pegsFee:P.fromPermill(h),pegs:m}}getRecentPegs(e){let{current:t}=e;return Array.from(t.entries()).map(([r,s])=>s.map(i=>i.toString()))}async getLatestPegs(e,t,r){let{source:s}=t,i=Array.from(e.assets.entries()).map(([o,a])=>a.toString()),n=s.map(async(o,a)=>{if(o.isOracle){let[u,c,m]=o.asOracle,h=[m.toString(),i[a]].map(b=>Number(b)).sort((b,I)=>b-I),d=await this.api.query.emaOracle.oracles(u,h,c),[{price:g,updatedAt:y}]=d.unwrap(),f=g.n.toString(),x=g.d.toString();return m.toString()===h[0].toString()?[[f,x],y.toString()]:[[x,f],y.toString()]}else if(o.isMmOracle){let u=o.asMmOracle,{price:c,decimals:m,updatedAt:h}=await this.mmOracle.getData(u.toString()),d=10**m;return[[c.toString(),d.toString()],h.toString()]}else return[o.asValue.map(u=>u.toString()),r]});return Promise.all(n)}getPoolAddress(e){let t=Number(e),r=C.getPoolAddress(t);return(0,Qe.encodeAddress)((0,Qe.blake2AsHex)(r),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:this.api.consts.stableswap.minTradingLimit.toJSON()}}};var le=class extends L{api;evm;assetClient;aaveClient;xykClient;omniClient;lbpClient;stableClient;clients=[];onChainAssets=[];memRegistry=Ze(e=>(this.log(`Registry mem ${e} sync`),this.syncRegistry()));constructor(e,t){super(e),this.api=e,this.evm=t,this.assetClient=new Z(this.api),this.aaveClient=new Be(this.api,t),this.xykClient=new Re(this.api,t),this.omniClient=new Ne(this.api,t),this.lbpClient=new Ae(this.api,t),this.stableClient=new De(this.api,t),this.clients=[this.aaveClient,this.xykClient,this.omniClient,this.lbpClient,this.stableClient]}get assets(){return this.onChainAssets}get isRegistrySynced(){return this.onChainAssets.length>0}async syncRegistry(e){let t=await this.assetClient.getOnChainAssets(!1,e);this.clients.forEach(r=>r.withAssets(t)),this.onChainAssets=t}async getPools(e){return this.isRegistrySynced||await this.memRegistry(1),e.length==0?(await Promise.all(this.clients.filter(s=>s.isSupported()).map(s=>s.getPoolsMem()))).flat():(await Promise.all(this.clients.filter(r=>e.some(s=>s===r.getPoolType())).map(r=>r.getPoolsMem()))).flat()}destroy(){this.aaveClient.unsubscribe(),this.xykClient.unsubscribe(),this.omniClient.unsubscribe(),this.lbpClient.unsubscribe(),this.stableClient.unsubscribe()}async getPoolFees(e,t){switch(t.type){case"Aave":return this.aaveClient.getPoolFees(e,t.address);case"Xyk":return this.xykClient.getPoolFees(e,t.address);case"Omnipool":return this.omniClient.getPoolFees(e,t.address);case"Lbp":return this.lbpClient.getPoolFees(e,t.address);case"Stableswap":return this.stableClient.getPoolFees(e,t.address);default:throw new xe(t.type)}}};var ue=class extends le{feeCache;disconnectSubscribeNewHeads=null;constructor(e,t){super(e,t),this.feeCache=new ae(null),this.api.rpc.chain.subscribeNewHeads(async r=>{this.feeCache.release()}).then(r=>{this.disconnectSubscribeNewHeads=r})}async getPoolFees(e,t){let r=[t.address,e.assetIn,e.assetOut].join("-");if(this.feeCache.has(r))return this.feeCache.get(r);{let i=await super.getPoolFees(e,t);return this.feeCache.set(r,i),i}}async destroy(){this.log(`Destroying pool cache!
|
|
2
|
+
Items: [${this.feeCache.length}]`),this.feeCache.release(),this.disconnectSubscribeNewHeads?.()}};var ce=class{static get(e){switch(e.type){case"Aave":return Te.fromPool(e);case"Xyk":return Fe.fromPool(e);case"Omnipool":return _e.fromPool(e);case"Lbp":return Ie.fromPool(e);case"Stableswap":return Ee.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};var et=class{constructor(e=1/0){this.capacity=e}storage=[];enqueue(e){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(e)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Nr=5,ke=class{isNotVisited(e,t){let r=!0;return t.forEach(s=>{(s[0]===e[0]||s[1]===e[1])&&(r=!1)}),r}findPaths(e,t,r){let s=[],i=new et,n=[];for(n.push([t,""]),i.enqueue(n);i.size()>0;){let o=i.dequeue();if(o==null||o.length>Nr)return s;let a=o[o.length-1];(r===null||a[0]===r)&&s.push(o),e.get(a[0])?.forEach(c=>{if(this.isNotVisited(c,o)){let m=[...o];m.push(c),i.enqueue(m)}})}return s}buildAndPopulateGraph(e,t){let r=new Map;for(let s of e)r.set(parseInt(s),[]);for(let[s,i,n]of t){let o=parseInt(i),a=parseInt(n);r.get(o)?.push([a,s])}return r}};function It(l){let e={};for(let t of l){let r=t.tokens.length;for(let s=0;s<r;s++){e[t.tokens[s].id]||(e[t.tokens[s].id]=[]);for(let i=0;i<r;i++){if(s==i)continue;let n=[t.address,t.tokens[s].id,t.tokens[i].id];e[t.tokens[s].id].push(n)}}}return e}var Ce=class{getProposals(e,t,r){let s=It(r),i=Object.keys(s),n=i.map(c=>s[c]).flat(),o=new ke,a=o.buildAndPopulateGraph(i,n),u=o.findPaths(a,parseInt(e),t?parseInt(t):null);return this.parsePaths(u)}parsePaths(e){let t=[];for(let r of e){let s=[];for(let i=0;i<r.length;i++){let n=r[i],o=r[i+1];if(o==null)break;s.push(this.toEdge(n,o))}t.push(s)}return t}toEdge(e,t){return[t[1],e[0].toString(),t[0].toString()]}};var me=class{routeSuggester;routerOptions;poolService;constructor(e,t={}){this.poolService=e,this.routeSuggester=new Ce,this.routerOptions=Object.freeze({includeOnly:t.includeOnly??[]})}async getPools(){let e=this.routerOptions.includeOnly;return await this.poolService.getPools(e)}async getAllAssets(){let e=await this.getPools();if(e.length===0)throw new Error("No pools configured");let t=await this.getAssets(e);return[...new Map(t).values()]}async getAssetPairs(e){let t=await this.getPools();if(t.length===0)throw new Error("No pools configured");let{assets:r,poolsMap:s}=await this.validateToken(e,t),n=this.getPaths(e,null,s,t).map(o=>o[o.length-1].assetOut);return this.toAssets([...new Set(n)],r)}async getAllPaths(e,t){let r=await this.getPools();if(r.length===0)throw new Error("No pools configured");let{poolsMap:s}=await this.validateTokenPair(e,t,r);return this.getPaths(e,t,s,r)}async getAssets(e){let t=e.map(r=>r.tokens.map(s=>({id:s.id,name:s.name,symbol:s.symbol,decimals:s.decimals,icon:s.icon,type:s.type,isSufficient:s.isSufficient,existentialDeposit:s.existentialDeposit,meta:s.meta,location:s.location,isWhiteListed:s.isWhiteListed}))).flat();return new Map(t.map(r=>[r.id,r]))}getPaths(e,t,r,s){return this.routeSuggester.getProposals(e,t,s).filter(o=>this.validPath(o,r)).map(o=>this.toHops(o,r))}async validateTokenPair(e,t,r){let s=await this.getAssets(r);if(s.get(e)==null)throw new Error(e+" is not supported token");if(s.get(t)==null)throw new Error(t+" is not supported token");let i=this.getPoolMap(r);return{assets:s,poolsMap:i}}async validateToken(e,t){let r=await this.getAssets(t);if(r.get(e)==null)throw new Error(e+" is not supported token");let s=this.getPoolMap(t);return{assets:r,poolsMap:s}}getPoolMap(e){return new Map(e.map(t=>[t.address,ce.get(t)]))}validPath(e,t){return e.length>0&&e.map(r=>this.validEdge(r,t)).reduce((r,s)=>r&&s)}validEdge([e,t,r],s){return s.get(e)?.validatePair(t,r)||!1}toHops(e,t){return e.map(([r,s,i])=>{let n=t.get(r);return{poolAddress:r,poolId:n?.id,pool:n?.type,assetIn:s,assetOut:i}})}toAssets(e,t){return e.map(r=>t.get(r))}};var Fr=p("100");function Rr(l,e){return l.minus(e).abs().div(l.plus(e).div(2)).multipliedBy(100).decimalPlaces(2)}function pe(l,e){return l.minus(e).div(e).multipliedBy(100).decimalPlaces(2)}function At(l,e){return D.minus(e.div(l)).multipliedBy(100).decimalPlaces(2)}function _t(l,e){return e.div(l).minus(D).multipliedBy(100).decimalPlaces(2)}function Q(l,e){return(e<.01||e>100)&&new Error("Supported range is from 0.01% - 100%"),l.div(Fr).multipliedBy(e).decimalPlaces(0,1)}var tt=(t=>(t.Buy="Buy",t.Sell="Sell",t))(tt||{}),rt=(r=>(r.Dca="Dca",r.TwapSell="TwapSell",r.TwapBuy="TwapBuy",r))(rt||{}),Nt=(r=>(r.OrderTooSmall="OrderTooSmall",r.OrderTooBig="OrderTooBig",r.OrderImpactTooBig="OrderImpactTooBig",r))(Nt||{});var de=class extends me{isDirectTrade(e){return e.length==1}findBestSellRoute(e){let t=e.sort((r,s)=>{let i=r[r.length-1].amountOut,n=s[s.length-1].amountOut;return i.isGreaterThan(n)?-1:1});return t.find(r=>r.every(s=>s.errors.length==0))||t[0]}getRouteFeeRange(e){if(e.filter(r=>r.tradeFeeRange).length>0){let r=e.map(i=>i.tradeFeeRange?.[0]??i.tradeFeePct).reduce((i,n)=>i+n),s=e.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,n)=>i+n);return[r,s]}}getPoolFeeRange(e){let t=e.min?P.toPct(e.min):void 0,r=e.max?P.toPct(e.max):void 0;if(t&&r)return[t,r]}async getBestSell(e,t,r){return this.getSell(e,t,r)}async getSell(e,t,r,s){let i=await super.getPools();if(i.length===0)throw new Error("No pools configured");let{poolsMap:n}=await super.validateTokenPair(e,t,i),o=super.getPaths(e,t,n,i);if(o.length===0)throw new te(e,t);let a;if(s)a=await this.toSellSwaps(r,s,n);else{let v=o.map(async E=>await this.toSellSwaps(r,E,n)),A=await Promise.all(v);a=this.findBestSellRoute(A)}let u=a[0],c=a[a.length-1],m=this.isDirectTrade(a),h=a.map(v=>v.spotPrice.shiftedBy(-1*v.assetOutDecimals)).reduce((v,A)=>v.multipliedBy(A)),d=_(h,c.assetOutDecimals),g=m?c.calculatedOut:this.calculateDelta0Y(u.amountIn,a,n),y=c.amountOut,f=m?c.tradeFeePct:At(g,y).toNumber(),x=g.minus(y),b=this.getRouteFeeRange(a),I=u.amountIn.shiftedBy(-1*u.assetInDecimals).multipliedBy(d),B=pe(g,I);return{type:"Sell",amountIn:u.amountIn,amountOut:c.amountOut,spotPrice:d,tradeFee:x,tradeFeePct:f,tradeFeeRange:b,priceImpactPct:B.toNumber(),swaps:a,toHuman(){return{type:"Sell",amountIn:T(u.amountIn,u.assetInDecimals),amountOut:T(c.amountOut,c.assetOutDecimals),spotPrice:T(d,c.assetOutDecimals),tradeFee:T(x,c.assetOutDecimals),tradeFeePct:f,tradeFeeRange:b,priceImpactPct:B.toNumber(),swaps:a.map(v=>v.toHuman())}}}}calculateDelta0Y(e,t,r){let s=[];for(let i=0;i<t.length;i++){let n=t[i],o=r.get(n.poolAddress);if(o==null)throw new Error("Pool does not exit");let a=o.parsePair(n.assetIn,n.assetOut),u;i>0?u=s[i-1]:u=e;let c=o.calculateOutGivenIn(a,u);s.push(c)}return s[s.length-1]}async toSellSwaps(e,t,r){let s=[];for(let i=0;i<t.length;i++){let n=t[i],o=r.get(n.poolAddress);if(o==null)throw new Error("Pool does not exit");let a=o.parsePair(n.assetIn,n.assetOut),u;i>0?u=s[i-1].amountOut:u=_(p(e),a.decimalsIn).decimalPlaces(0,1);let c=await this.poolService.getPoolFees(a,o),{amountOut:m,calculatedOut:h,feePct:d,errors:g}=o.validateAndSell(a,u,c),y=this.getPoolFeeRange(c),f=o.spotPriceOutGivenIn(a),x=u.shiftedBy(-1*a.decimalsIn).multipliedBy(f),b=pe(h,x);s.push({...n,assetInDecimals:a.decimalsIn,assetOutDecimals:a.decimalsOut,amountIn:u,amountOut:m,calculatedOut:h,spotPrice:f,tradeFeePct:d,tradeFeeRange:y,priceImpactPct:b.toNumber(),errors:g,isSupply(){return o.type==="Aave"&&o.tokens[0].id===n.assetIn},isWithdraw(){return o.type==="Aave"&&o.tokens[1].id===n.assetIn},toHuman(){return{...n,amountIn:T(u,a.decimalsIn),amountOut:T(m,a.decimalsOut),calculatedOut:T(h,a.decimalsOut),spotPrice:T(f,a.decimalsOut),tradeFeePct:d,tradeFeeRange:y,priceImpactPct:b.toNumber(),errors:g}}})}return s}async getMostLiquidRoute(e,t){let r=await super.getPools(),{poolsMap:s}=await super.validateTokenPair(e,t,r),i=super.getPaths(e,t,s,r);if(i.length===0)throw new te(e,t);let u=r.filter(d=>d.tokens.some(g=>g.id===e&&g.id!==d.id)).map(d=>d.type==="Aave"?d.tokens:d.tokens.filter(g=>g.id===e)).map(d=>d.map(g=>p(g.balance).shiftedBy(-1*g.decimals)).reduce((g,y)=>g.plus(y))).sort((d,g)=>g.isLessThan(d)?-1:1)[0].div(100).multipliedBy(.1),c=i.map(async d=>await this.toSellSwaps(u,d,s)),m=await Promise.all(c);return this.findBestSellRoute(m).map(d=>({poolAddress:d.poolAddress,poolId:d?.poolId,pool:d.pool,assetIn:d.assetIn,assetOut:d.assetOut}))}async getBestSpotPrice(e,t){let r=await super.getPools();if(r.length===0)throw new Error("No pools configured");let{poolsMap:s}=await super.validateTokenPair(e,t,r);if(super.getPaths(e,t,s,r).length===0)return Promise.resolve(void 0);let n=await this.getMostLiquidRoute(e,t),o=await this.toSellSwaps("1",n,s),a=o.map(m=>m.spotPrice.shiftedBy(-1*m.assetOutDecimals)).reduce((m,h)=>m.multipliedBy(h)),u=o[o.length-1].assetOutDecimals;return{amount:_(a,u),decimals:u}}findBestBuyRoute(e){let t=e.sort((r,s)=>{let i=r[0].amountIn,n=s[0].amountIn;return i.isGreaterThan(n)?1:-1});return t.find(r=>r.every(s=>s.errors.length==0))||t[0]}async getBestBuy(e,t,r){return this.getBuy(e,t,r)}async getBuy(e,t,r,s){let i=await super.getPools();if(i.length===0)throw new Error("No pools configured");let{poolsMap:n}=await super.validateTokenPair(e,t,i),o=super.getPaths(e,t,n,i);if(o.length===0)throw new te(e,t);let a;if(s)a=await this.toBuySwaps(r,s,n);else{let v=o.map(async E=>await this.toBuySwaps(r,E,n)),A=await Promise.all(v);a=this.findBestBuyRoute(A)}let u=a[a.length-1],c=a[0],m=this.isDirectTrade(a),h=a.map(v=>v.spotPrice.shiftedBy(-1*v.assetInDecimals)).reduce((v,A)=>v.multipliedBy(A)),d=_(h,c.assetInDecimals),g=m?c.calculatedIn:this.calculateDelta0X(u.amountOut,a,n),y=c.amountIn,f=m?c.tradeFeePct:_t(g,y).toNumber(),x=y.minus(g),b=this.getRouteFeeRange(a),I=u.amountOut.shiftedBy(-1*u.assetOutDecimals).multipliedBy(d),B;return g.isZero()?B=-100:B=pe(I,g).toNumber(),{type:"Buy",amountOut:u.amountOut,amountIn:c.amountIn,spotPrice:d,tradeFee:x,tradeFeePct:f,tradeFeeRange:b,priceImpactPct:B,swaps:a,toHuman(){return{type:"Buy",amountOut:T(u.amountOut,u.assetOutDecimals),amountIn:T(c.amountIn,c.assetInDecimals),spotPrice:T(d,c.assetInDecimals),tradeFee:T(x,c.assetInDecimals),tradeFeePct:f,tradeFeeRange:b,priceImpactPct:B,swaps:a.map(v=>v.toHuman())}}}}calculateDelta0X(e,t,r){let s=[];for(let i=t.length-1;i>=0;i--){let n=t[i],o=r.get(n.poolAddress);if(o==null)throw new Error("Pool does not exit");let a=o.parsePair(n.assetIn,n.assetOut),u;i==t.length-1?u=e:u=s[0];let c=o.calculateInGivenOut(a,u);s.unshift(c)}return s[0]}async toBuySwaps(e,t,r){let s=[];for(let i=t.length-1;i>=0;i--){let n=t[i],o=r.get(n.poolAddress);if(o==null)throw new Error("Pool does not exit");let a=o.parsePair(n.assetIn,n.assetOut),u;i==t.length-1?u=_(p(e),a.decimalsOut).decimalPlaces(0,1):u=s[0].amountIn;let c=await this.poolService.getPoolFees(a,o),{amountIn:m,calculatedIn:h,feePct:d,errors:g}=o.validateAndBuy(a,u,c),y=this.getPoolFeeRange(c),f=o.spotPriceInGivenOut(a),x=u.shiftedBy(-1*a.decimalsOut).multipliedBy(f),b;h.isZero()?b=-100:b=pe(x,h).toNumber(),s.unshift({...n,assetInDecimals:a.decimalsIn,assetOutDecimals:a.decimalsOut,amountIn:m,amountOut:u,calculatedIn:h,spotPrice:f,tradeFeePct:d,tradeFeeRange:y,priceImpactPct:b,errors:g,isSupply(){return o.type==="Aave"&&o.tokens[0].id===n.assetIn},isWithdraw(){return o.type==="Aave"&&o.tokens[1].id===n.assetIn},toHuman(){return{...n,amountIn:T(m,a.decimalsIn),amountOut:T(u,a.decimalsOut),calculatedIn:T(h,a.decimalsIn),spotPrice:T(f,a.decimalsIn),tradeFeePct:d,tradeFeeRange:y,priceImpactPct:b,errors:g}}})}return s}};var sr=6e3,ir=p(1e15),Me=6,Ft=-5,Rt=6*60*60*1e3;var nr=6;var G=class{static build(e){return e.map(({assetIn:t,assetOut:r,pool:s,poolId:i})=>s==="Stableswap"?{pool:{Stableswap:i},assetIn:t,assetOut:r}:{pool:s,assetIn:t,assetOut:r})}};var ge=class{schedulerOptions;router;constructor(e,t={}){this.router=e,this.schedulerOptions=Object.freeze({blockTime:t.blockTime??sr,minBudgetInNative:t.minBudgetInNative??ir})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(e,t,r,s,i){let[n,o]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,r)]),{amountIn:a,swaps:u,priceImpactPct:c}=o,m=u[0],h=u[u.length-1],{assetInDecimals:d}=m,{assetOutDecimals:g}=h,y=Math.abs(c),f=this.getMinimumTradeCount(a,n),x=this.getOptimalTradeCount(y),b=i?Math.round(s/i):x,I=Math.ceil(s/f),B=Math.round(s/x),v=Math.round(s/b),A=a.dividedBy(b).decimalPlaces(0,1),E=await this.router.getBestSell(e,t,T(A,d)),H=a.isLessThan(n),Le=[];H&&Le.push("OrderTooSmall");let qe=E.amountOut.multipliedBy(b),nt=this.toBlockPeriod(v),ot=E.tradeFee.multipliedBy(b),at=G.build(u),Ue={assetIn:e,assetOut:t,errors:Le,frequencyMin:I,frequencyOpt:B,frequency:v,tradeCount:b,tradeFee:ot,tradeImpactPct:E.priceImpactPct,tradePeriod:nt,tradeRoute:at,type:"Dca"};return{...Ue,amountIn:a,amountOut:qe,tradeAmountIn:E.amountIn,tradeAmountOut:E.amountOut,toHuman(){return{...Ue,amountIn:T(a,d),amountOut:T(qe,g),tradeAmountIn:T(E.amountIn,d),tradeAmountOut:T(E.amountOut,g)}}}}async getMinimumOrderBudget(e){if(M===e)return this.minOrderBudget;let t=await this.router.getBestSpotPrice(M,e);if(t)return this.minOrderBudget.times(t.amount).div(p(10).pow(12)).decimalPlaces(0,1);throw new Error("Unable to calculate order budget")}getMinimumTradeCount(e,t){let r=t.multipliedBy(.2),s=e.dividedBy(r).toNumber();return Math.round(s)}getOptimalTradeCount(e){let t=Math.round(e*10)||1;return Math.max(t,3)}async getTwapSellOrder(e,t,r){let[s,i]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,r)]),{amountIn:n,swaps:o,priceImpactPct:a}=i,u=o[0],c=o[o.length-1],{assetInDecimals:m}=u,{assetOutDecimals:h}=c,d=Math.abs(a),g=this.getTwapTradeCount(d),y=n.dividedBy(g).decimalPlaces(0,1),f=await this.router.getBestSell(u.assetIn,c.assetOut,T(y,m)),x=g===1,b=n.isLessThan(s),I=f.priceImpactPct<Ft,B=[];b||x?B.push("OrderTooSmall"):I&&B.push("OrderImpactTooBig");let v=f.amountOut.multipliedBy(g),A=f.tradeFee.multipliedBy(g),E=G.build(o),H={assetIn:e,assetOut:t,errors:B,tradeCount:g,tradeImpactPct:f.priceImpactPct,tradePeriod:Me,tradeRoute:E,type:"TwapSell"};return{...H,amountIn:n,amountOut:v,tradeAmountIn:f.amountIn,tradeAmountOut:f.amountOut,tradeFee:A,toHuman(){return{...H,amountIn:T(n,m),amountOut:T(v,h),tradeAmountIn:T(f.amountIn,m),tradeAmountOut:T(f.amountOut,h),tradeFee:T(A,h)}}}}async getTwapBuyOrder(e,t,r){let[s,i]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestBuy(e,t,r)]),{amountOut:n,swaps:o,priceImpactPct:a}=i,u=o[0],c=o[o.length-1],{assetInDecimals:m}=u,{assetOutDecimals:h}=c,d=Math.abs(a),g=this.getTwapTradeCount(d),y=n.dividedBy(g).decimalPlaces(0,1),f=await this.router.getBestBuy(u.assetIn,c.assetOut,T(y,h)),x=f.amountIn.multipliedBy(g),b=g===1,I=x.isLessThan(s),B=f.priceImpactPct<Ft,v=[];I||b?v.push("OrderTooSmall"):B&&v.push("OrderImpactTooBig");let A=f.tradeFee.multipliedBy(g),E=G.build(o),H={assetIn:e,assetOut:t,errors:v,tradeCount:g,tradeImpactPct:f.priceImpactPct,tradePeriod:Me,tradeRoute:E,type:"TwapBuy"};return{...H,amountIn:x,amountOut:n,tradeAmountIn:f.amountIn,tradeAmountOut:f.amountOut,tradeFee:A,toHuman(){return{...H,amountIn:T(x,m),amountOut:T(n,h),tradeAmountIn:T(f.amountIn,m),tradeAmountOut:T(f.amountOut,h),tradeFee:T(A,m)}}}}getTwapTradeCount(e){let t=this.getOptimalTradeCount(e);if(this.getTwapExecutionTime(t)>Rt){let s=Rt/(this.blockTime*Me);return Math.round(s)}return t}getTwapExecutionTime(e){return e*Me*this.blockTime}toBlockPeriod(e){let t=e/this.blockTime,r=Math.round(t);return Math.max(r,nr)}};var he=class extends L{evm;evmClient;balanceClient;aaveUtils;constructor(e,t){super(e),this.evm=t,this.evmClient=t.getWsProvider(),this.balanceClient=new q(e),this.aaveUtils=new J(t)}wrapTx(e,t,r){return{hex:t.toHex(),name:e,extraGas:r,get:()=>t,dryRun:s=>this.dryRun(s,t)}}async dryRun(e,t){let r;try{r=await this.api.call.dryRunApi.dryRunCall({System:{Signed:e}},t.inner.toHex())}catch(s){throw console.error(s),new Error("Dry run execution failed!")}if(r.isOk)return r.asOk;throw console.log(r.asErr.toHuman()),new Error("Dry run execution error!")}dispatchWithExtraGas(e){return this.api.tx.dispatcher.dispatchWithExtraGas(e.inner.toHex(),ye)}isDirectOmnipoolTrade(e){return e.length===1&&e[0].pool==="Omnipool"}};var st=class extends he{_trade;_beneficiary;_slippagePct=1;setTrade(e){return this._trade=e,this}withBeneficiary(e){return this._beneficiary=e,this}withSlippage(e){return this._slippagePct=e,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:e,swaps:t,type:r}=this.trade;if(r==="Buy")return this.buildBuyTx();let s=t[0],{assetIn:i,assetOut:n}=s,a=(await this.balanceClient.getBalance(this.beneficiary,i)).minus(5),u=!0;return s.isWithdraw()&&(u=(await this.aaveUtils.getMaxWithdraw(this.beneficiary,n)).amount.isGreaterThanOrEqualTo(a)),u&&e.isGreaterThanOrEqualTo(a)?this.buildSellAllTx():this.buildSellTx()}buildBuyTx(){let{amountIn:e,amountOut:t,swaps:r}=this.trade,s=r[0],i=r[r.length-1],n=Q(e,this.slippagePct),o=s.assetIn,a=i.assetOut,u=e.plus(n),c;return this.isDirectOmnipoolTrade(r)?c=this.api.tx.omnipool.buy(a,o,t.toFixed(),u.toFixed()):c=this.api.tx.router.buy(o,a,t.toFixed(),u.toFixed(),G.build(r)),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:e,amountOut:t,swaps:r}=this.trade,s=r[0],i=r[r.length-1],n=Q(t,this.slippagePct),o=s.assetIn,a=i.assetOut,u=t.minus(n),c;if(this.isDirectOmnipoolTrade(r)?c=this.api.tx.omnipool.sell(o,a,e.toFixed(),u.toFixed()):c=this.api.tx.router.sell(o,a,e.toFixed(),u.toFixed(),G.build(r)),s.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let h=this.dispatchWithExtraGas(c);return this.wrapTx("RouterSellAll",h,ye)}return this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:e,swaps:t}=this.trade,r=t[0],s=t[t.length-1],i=Q(e,this.slippagePct),n=r.assetIn,o=s.assetOut,a=e.minus(i),u=this.api.tx.router.sellAll(n,o,a.toFixed(),G.build(t));if(r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let m=this.dispatchWithExtraGas(u);return this.wrapTx("RouterSellAll",m,ye)}return this.wrapTx("RouterSellAll",u)}};var it=class extends he{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(e){return this._order=e,this}withBeneficiary(e){return this._beneficiary=e,this}withMaxRetries(e){return this._maxRetries=e,this}withSlippage(e){return this._slippagePct=e,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:e}=this.order;switch(e){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${e}`)}}buildDcaTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradePeriod:i,tradeRoute:n}=this.order,o=this.api.tx.dca.schedule({owner:this.beneficiary,period:i,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Sell:{assetIn:t,assetOut:r,amountIn:s.toFixed(),minAmountOut:"0",route:n}}},null);return this.wrapTx("DcaSchedule",o)}buildTwapSellTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:n,tradeRoute:o}=this.order,a=Q(i,this.slippagePct),u=i.minus(a),c=this.api.tx.dca.schedule({owner:this.beneficiary,period:n,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Sell:{assetIn:t,assetOut:r,amountIn:s.toFixed(),minAmountOut:u.toFixed(),route:o}}},null);return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:n,tradeRoute:o}=this.order,a=Q(s,this.slippagePct),u=s.plus(a),c=this.api.tx.dca.schedule({owner:this.beneficiary,period:n,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Buy:{assetIn:t,assetOut:r,amountOut:i.toFixed(),maxAmountIn:u.toFixed(),route:o}}},null);return this.wrapTx("DcaSchedule.twapBuy",c)}};var fe=class{api;evm;constructor(e,t){this.api=e,this.evm=t}trade(e){return new st(this.api,this.evm).setTrade(e)}order(e){return new it(this.api,this.evm).setOrder(e)}};function Er(l){let e=new ne(l),t=new ve(l),r=new ue(l,t),s=new J(t),i=new de(r),n=new ge(i,{blockTime:e.blockTime,minBudgetInNative:e.minOrderBudget});return{api:{aave:s,router:i,scheduler:n},client:{asset:new Z(l),balance:new q(l)},ctx:{pool:r},evm:t,tx:new fe(l,t),destroy:()=>{r.destroy()}}}0&&(module.exports={AMOUNT_MAX,AaveClient,AavePool,AavePoolClient,AaveUtils,AssetClient,AssetNotFound,BASILISK_PARACHAIN_ID,BalanceClient,BigNumber,CachingPoolService,ChainParams,DECIMAL_PLACES,DENOMINATOR,ERC20,EvmClient,FarmClient,H160,HUB_ASSET_ID,HYDRADX_PARACHAIN_ID,HYDRADX_SS58_PREFIX,INFINITY,LbpMath,LbpPool,LbpPoolClient,ONE,OmniMath,OmniPool,OmniPoolClient,PolkadotApiClient,PoolConfigNotFound,PoolError,PoolFactory,PoolNotFound,PoolService,PoolType,ProviderConfigNotFound,RUNTIME_DECIMALS,RouteNotFound,Router,SYSTEM_ASSET_DECIMALS,SYSTEM_ASSET_ID,StableMath,StableSwap,StableSwapClient,StorageConfigNotFound,SubscriptionNotSupported,TRADEABLE_DEFAULT,TradeOrderError,TradeOrderType,TradeRouteBuilder,TradeRouter,TradeScheduler,TradeType,TxBuilderFactory,XykMath,XykPool,XykPoolClient,ZERO,bnFormatter,bnum,calculateBuyFee,calculateDiffToAvg,calculateDiffToRef,calculateSellFee,createChain,createSdkContext,findNestedKey,findNestedObj,getFraction,isEvmAccount,isEvmAddress,isSs58Address,scale,toBn,toDecimals});
|
package/build/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var K=[{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 Ge=[{inputs:[{internalType:"contract IEACAggregatorProxy",name:"_networkBaseTokenPriceInUsdProxyAggregator",type:"address"},{internalType:"contract IEACAggregatorProxy",name:"_marketReferenceCurrencyPriceInUsdProxyAggregator",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"ETH_CURRENCY_UNIT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"MKR_ADDRESS",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_bytes32",type:"bytes32"}],name:"bytes32ToString",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint256",name:"decimals",type:"uint256"},{internalType:"uint256",name:"baseLTVasCollateral",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"reserveLiquidationBonus",type:"uint256"},{internalType:"uint256",name:"reserveFactor",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabled",type:"bool"},{internalType:"bool",name:"borrowingEnabled",type:"bool"},{internalType:"bool",name:"stableBorrowRateEnabled",type:"bool"},{internalType:"bool",name:"isActive",type:"bool"},{internalType:"bool",name:"isFrozen",type:"bool"},{internalType:"uint128",name:"liquidityIndex",type:"uint128"},{internalType:"uint128",name:"variableBorrowIndex",type:"uint128"},{internalType:"uint128",name:"liquidityRate",type:"uint128"},{internalType:"uint128",name:"variableBorrowRate",type:"uint128"},{internalType:"uint128",name:"stableBorrowRate",type:"uint128"},{internalType:"uint40",name:"lastUpdateTimestamp",type:"uint40"},{internalType:"address",name:"aTokenAddress",type:"address"},{internalType:"address",name:"stableDebtTokenAddress",type:"address"},{internalType:"address",name:"variableDebtTokenAddress",type:"address"},{internalType:"address",name:"interestRateStrategyAddress",type:"address"},{internalType:"uint256",name:"availableLiquidity",type:"uint256"},{internalType:"uint256",name:"totalPrincipalStableDebt",type:"uint256"},{internalType:"uint256",name:"averageStableRate",type:"uint256"},{internalType:"uint256",name:"stableDebtLastUpdateTimestamp",type:"uint256"},{internalType:"uint256",name:"totalScaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"priceInMarketReferenceCurrency",type:"uint256"},{internalType:"address",name:"priceOracle",type:"address"},{internalType:"uint256",name:"variableRateSlope1",type:"uint256"},{internalType:"uint256",name:"variableRateSlope2",type:"uint256"},{internalType:"uint256",name:"stableRateSlope1",type:"uint256"},{internalType:"uint256",name:"stableRateSlope2",type:"uint256"},{internalType:"uint256",name:"baseStableBorrowRate",type:"uint256"},{internalType:"uint256",name:"baseVariableBorrowRate",type:"uint256"},{internalType:"uint256",name:"optimalUsageRatio",type:"uint256"},{internalType:"bool",name:"isPaused",type:"bool"},{internalType:"bool",name:"isSiloedBorrowing",type:"bool"},{internalType:"uint128",name:"accruedToTreasury",type:"uint128"},{internalType:"uint128",name:"unbacked",type:"uint128"},{internalType:"uint128",name:"isolationModeTotalDebt",type:"uint128"},{internalType:"bool",name:"flashLoanEnabled",type:"bool"},{internalType:"uint256",name:"debtCeiling",type:"uint256"},{internalType:"uint256",name:"debtCeilingDecimals",type:"uint256"},{internalType:"uint8",name:"eModeCategoryId",type:"uint8"},{internalType:"uint256",name:"borrowCap",type:"uint256"},{internalType:"uint256",name:"supplyCap",type:"uint256"},{internalType:"uint16",name:"eModeLtv",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationThreshold",type:"uint16"},{internalType:"uint16",name:"eModeLiquidationBonus",type:"uint16"},{internalType:"address",name:"eModePriceSource",type:"address"},{internalType:"string",name:"eModeLabel",type:"string"},{internalType:"bool",name:"borrowableInIsolation",type:"bool"}],internalType:"struct IUiPoolDataProviderV3.AggregatedReserveData[]",name:"",type:"tuple[]"},{components:[{internalType:"uint256",name:"marketReferenceCurrencyUnit",type:"uint256"},{internalType:"int256",name:"marketReferenceCurrencyPriceInUsd",type:"int256"},{internalType:"int256",name:"networkBaseTokenPriceInUsd",type:"int256"},{internalType:"uint8",name:"networkBaseTokenPriceDecimals",type:"uint8"}],internalType:"struct IUiPoolDataProviderV3.BaseCurrencyInfo",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"}],name:"getReservesList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract IPoolAddressesProvider",name:"provider",type:"address"},{internalType:"address",name:"user",type:"address"}],name:"getUserReservesData",outputs:[{components:[{internalType:"address",name:"underlyingAsset",type:"address"},{internalType:"uint256",name:"scaledATokenBalance",type:"uint256"},{internalType:"bool",name:"usageAsCollateralEnabledOnUser",type:"bool"},{internalType:"uint256",name:"stableBorrowRate",type:"uint256"},{internalType:"uint256",name:"scaledVariableDebt",type:"uint256"},{internalType:"uint256",name:"principalStableDebt",type:"uint256"},{internalType:"uint256",name:"stableBorrowLastUpdateTimestamp",type:"uint256"}],internalType:"struct IUiPoolDataProviderV3.UserReserveData[]",name:"",type:"tuple[]"},{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"marketReferenceCurrencyPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"networkBaseTokenPriceInUsdProxyAggregator",outputs:[{internalType:"contract IEACAggregatorProxy",name:"",type:"address"}],stateMutability:"view",type:"function"}];var ye="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",We="0x112b087b60C1a166130d59266363C45F8aa99db0",He="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",fe=1000000n;var Qe=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Q=class{client;constructor(e){this.client=e.getWsProvider()}async getBlockTimestamp(){let e=await this.client.getBlock();return Number(e.timestamp)}async getReservesData(){return await this.client.readContract({abi:Ge,address:We,args:[He],functionName:"getReservesData"})}async getUserReservesData(e){return await this.client.readContract({abi:Ge,address:We,args:[He,e],functionName:"getUserReservesData"})}async getUserAccountData(e){return await this.client.readContract({abi:K,address:ye,args:[e],functionName:"getUserAccountData"})}};import{decodeAddress as Te,encodeAddress as tt}from"@polkadot/util-crypto";import{hexToU8a as Bt,isHex as It,u8aToHex as At}from"@polkadot/util";import{Buffer as H}from"buffer";var ts=2090,Xe=1e3,Se="1",rs=2034,W=63,ee=18,D="0",et=12,te=15;var Ye="ETH\0";function vt(m){if(!m)return!1;try{let e=Te(m,!0),t=H.from(Ye);return H.from(e.subarray(0,t.length)).equals(t)}catch{return!1}}function Nt(m){return!!/^0x[a-fA-F0-9]{40}$/.test(m)}function Ft(m){try{let e=It(m)?Bt(m):Te(m);return tt(e),!0}catch{return!1}}var X=class m{static toAccount=e=>{let t=H.from(e.slice(2),"hex"),r=H.from(Ye);return tt(new Uint8Array(H.concat([r,t,H.alloc(8)])),63)};static fromAccount=e=>{let t=Te(e),r=H.from(Ye),s=t.slice(r.length,-8);return"0x"+H.from(s).toString("hex")};static fromSS58=e=>{let r=Te(e).slice(0,20);return At(r)};static fromAny=e=>{if(Nt(e))return e;if(vt(e))return m.fromAccount(e);if(Ft(e))return m.fromSS58(e);throw new Error("Unknown address type")}};var M=class{static fromAssetId(e){let t=Number(e),r=Buffer.alloc(20,0);return r[15]=1,r.writeUInt32BE(t,16),"0x"+r.toString("hex")}static toAssetId(e){let t=Buffer.from(e.replace("0x",""),"hex");return t.length!==20||!this.isAssetAddress(e)?null:t.readUInt32BE(16)}static isAssetAddress(e){let t=Buffer.from("0000000000000000000000000000000100000000","hex"),r=Buffer.from(e.replace("0x",""),"hex");return r.length!==20?!1:r.subarray(0,16).equals(t.subarray(0,16))}};import{BigNumber as O}from"bignumber.js";var Rt=12;O.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:Rt});var S=p(0),R=p(1),ms=p("Infinity");function v(m,e){let t=new O(e.toString()),r=new O(10).pow(t);return m.times(r)}function p(m){return new O(m.toString())}function ps(m,e){let t=p(m);return v(t,e)}function x(m,e){return m.shiftedBy(-1*e).toString()}var we=p("1e27"),Et=p("1.01"),_t=p("31536000"),$=class{client;constructor(e){this.client=new Q(e)}async getSummary(e){let t=X.fromAny(e),[r,s,n,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(t),this.client.getUserAccountData(t),this.client.getBlockTimestamp()]),[i]=r,[o,l]=s,[c,u,h,d,g,b]=n,P=p(b).dividedBy(1e18).decimalPlaces(6,O.ROUND_DOWN),T=p(c),f=p(u),I=[];for(let B of o){let w=B.underlyingAsset.toLowerCase(),A=i.find(({underlyingAsset:xt})=>xt.toLowerCase()===w);if(!A)throw new Error("Missing pool reserve for "+w);let F=p(B.scaledATokenBalance),q=p(A.liquidityIndex),he=p(A.liquidityRate),Pe=p(A.priceInMarketReferenceCurrency),Le=a+6,Ue=this.calculateLinearInterest(he,A.lastUpdateTimestamp,Le),qe=q.multipliedBy(Ue).dividedBy(we).decimalPlaces(0,O.ROUND_DOWN),be=F.multipliedBy(qe).dividedBy(we).decimalPlaces(0,O.ROUND_DOWN),Tt=p(l===A.eModeCategoryId?A.eModeLiquidationThreshold:A.reserveLiquidationThreshold).div(1e4),wt=A.usageAsCollateralEnabled&&B.usageAsCollateralEnabledOnUser&&p(B.scaledATokenBalance).gt(0),Ot=M.toAssetId(w);I.push({aTokenBalance:be,decimals:Number(A.decimals),isCollateral:wt,priceInRef:Pe,reserveId:Ot,reserveAsset:w,reserveLiquidationThreshold:Tt})}return{healthFactor:P.toNumber(),totalCollateral:T,totalDebt:f,reserves:I}}async hasBorrowPositions(e){let t=X.fromAny(e),r=await this.client.getUserAccountData(t),[s,n]=r;return n>0n}async getHealthFactor(e){let t=X.fromAny(e),r=await this.client.getUserAccountData(t),[s,n,a,i,o,l]=r;return p(l).dividedBy(1e18).decimalPlaces(6,O.ROUND_DOWN).toNumber()}async getHealthFactorAfterWithdraw(e,t,r){let{totalCollateral:s,totalDebt:n,reserves:a}=await this.getSummary(e),i=M.fromAssetId(t),o=a.find(T=>T.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,isCollateral:c,priceInRef:u,reserveLiquidationThreshold:h}=o,d=v(p(r),l).decimalPlaces(0,1),g=c?d.multipliedBy(u).dividedBy(p(10).pow(l)).decimalPlaces(0,O.ROUND_DOWN):S,b=s.minus(g);return b.lte(0)?0:b.multipliedBy(h).dividedBy(n).decimalPlaces(6,O.ROUND_DOWN).toNumber()}async getHealthFactorAfterSupply(e,t,r){let{totalCollateral:s,totalDebt:n,reserves:a}=await this.getSummary(e),i=M.fromAssetId(t),o=a.find(P=>P.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:u}=o,d=v(p(r),l).decimalPlaces(0,1).multipliedBy(c).dividedBy(p(10).pow(l)).decimalPlaces(0,O.ROUND_DOWN),g=s.plus(d);return g.lte(0)?0:g.multipliedBy(u).dividedBy(n).decimalPlaces(6,O.ROUND_DOWN).toNumber()}async getMaxWithdraw(e,t){let{totalCollateral:r,totalDebt:s,reserves:n}=await this.getSummary(e),a=M.fromAssetId(t),i=n.find(o=>o.reserveAsset===a);if(!i)throw new Error("Missing reserve ctx for "+a);return this.calculateWithdrawMax(i,r,s)}async getMaxWithdrawAll(e){let{totalCollateral:t,totalDebt:r,reserves:s}=await this.getSummary(e),n={};for(let a of s){let i=this.calculateWithdrawMax(a,t,r);a.reserveId&&(n[a.reserveId]=i)}return n}calculateWithdrawMax(e,t,r){let{aTokenBalance:s,decimals:n,priceInRef:a,reserveLiquidationThreshold:i}=e,o=Et.multipliedBy(r).div(i).decimalPlaces(0,O.ROUND_UP),l=t.minus(o).decimalPlaces(0,1);if(l.lte(0))return{amount:S,decimals:n};let c=l.multipliedBy(p(10).pow(n)).dividedBy(a).decimalPlaces(0,O.ROUND_DOWN);return{amount:O.minimum(s,c),decimals:n}}calculateLinearInterest(e,t,r){let s=r-t;return s<=0?we:e.multipliedBy(s).dividedBy(_t).plus(we).decimalPlaces(0,O.ROUND_DOWN)}};function rt(m){switch(m){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}import"@galacticcouncil/api-augment/hydradx";import"@galacticcouncil/api-augment/basilisk";var k=class{api;constructor(e){this.api=e}get chainDecimals(){return this.api.registry.chainDecimals[0]}get chainToken(){return this.api.registry.chainTokens[0]}log(e,...t){let r=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");rt(r)&&console.log(e,...t)}};var V=class extends k{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(e){super(e)}async safeSharesQuery(){try{let e=await this.api.query.stableswap.pools.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}async safeBondsQuery(){try{let e=await this.api.query.bonds.bonds.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}async metadataQuery(){try{let e=await this.api.query.assetRegistry.assetMetadataMap.entries();return new Map(e.map(([{args:[t]},r])=>{let{decimals:s,symbol:n}=r.unwrap();return[t.toString(),{decimals:s.toNumber(),symbol:n.toHuman()}]}))}catch{return new Map([])}}async locationsQuery(){try{let e=await this.api.query.assetRegistry.assetLocations.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}getSystemTokenName(e){switch(e){case"HDX":return"Hydration";case"BSX":return"Basilisk";default:return e}}getToken(e,t,r,s){if(e==D){let u=this.api.consts.balances.existentialDeposit;return{id:D,name:this.getSystemTokenName(this.chainToken),symbol:this.chainToken,decimals:this.chainDecimals,icon:this.chainToken,type:"Token",isSufficient:!0,existentialDeposit:u.toString()}}let{name:n,assetType:a,isSufficient:i,existentialDeposit:o}=t,{symbol:l,decimals:c}=r.get(e)??{};return{id:e,name:n.toHuman(),symbol:l,decimals:c,icon:l,type:a.toHuman(),isSufficient:i?i.toHuman():!0,location:s?.toJSON(),existentialDeposit:o.toString()}}getBond(e,t,r,s){let[n,a]=s,{assetType:i,isSufficient:o,existentialDeposit:l}=t,{symbol:c,decimals:u}=this.getToken(n.toString(),t,r),h=a.toNumber(),d=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",d.format(h)].join(" ");return{id:e,name:g,symbol:c+"b",decimals:u,icon:c,type:i.toString(),isSufficient:o.toHuman(),existentialDeposit:l.toString(),underlyingAssetId:n.toString(),maturity:h}}getShares(e,t,r,s){let{assets:n}=s,{name:a,symbol:i,assetType:o,isSufficient:l,existentialDeposit:c}=t,h=n.map(b=>b.toString()).map(b=>{let{symbol:P}=this.getToken(b,t,r);return[b,P]}),d=Object.fromEntries(h),g=Object.values(d);return{id:e,name:g.join(", "),symbol:i?.isSome?i.toHuman():a.toHuman(),decimals:18,icon:g.join("/"),type:o.toString(),isSufficient:l.toHuman(),existentialDeposit:c.toString(),meta:d}}getExternal(e,t,r,s){let n=this.getToken(e,t,new Map,s),a=r?.find(i=>i.internalId===n.id);return a?{...n,decimals:a.decimals,name:a.name,symbol:a.symbol,icon:a.symbol,isWhiteListed:a.isWhiteListed}:n}normalizeMetadata(e,t){return t.size?t:new Map(e.map(([{args:[r]},s])=>{let{decimals:n,symbol:a}=s.unwrap();return[r.toString(),{decimals:Number(n.toString()),symbol:a.toHuman()}]}))}getSupportedAssets(e){return e.filter(([t,r])=>{if(r.isNone)return!1;let s=r.unwrap();return this.isSupportedAsset(s)})}async getOnChainAssets(e,t){let[r,s,n,a,i]=await Promise.all([this.api.query.assetRegistry.assets.entries(),this.locationsQuery(),this.safeSharesQuery(),this.safeBondsQuery(),this.metadataQuery()]),o=this.getSupportedAssets(r),l=this.normalizeMetadata(o,i),c=o.map(([{args:[u]},h])=>{let d=h.unwrap(),g=s.get(u.toString()),{assetType:b}=d;switch(b.toString()){case"Bond":let P=a.get(u.toString());return this.getBond(u.toString(),d,l,P);case"StableSwap":let T=n.get(u.toString());return this.getShares(u.toString(),d,l,T);case"External":return this.getExternal(u.toString(),d,t,g);default:return this.getToken(u.toString(),d,l,g)}});return e?c:c.filter(u=>this.isValidAsset(u))}isValidAsset(e){let t=Math.sign(e.decimals);return!!e.symbol&&(t===0||t===1)}isSupportedAsset(e){let t=e.assetType.toString();return this.SUPPORTED_TYPES.includes(t)}};var L=class extends k{constructor(e){super(e)}async getBalance(e,t){let r=await this.api.query.assetRegistry.assets(t),{assetType:s}=r.unwrap();return s.toString()==="Erc20"?this.getErc20Balance(e,t):t===D?this.getSystemBalance(e):this.getTokenBalance(e,t)}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateFreeBalance(t)}async getTokenBalance(e,t){let{free:r,reserved:s,frozen:n}=await this.api.query.tokens.accounts(e,t);return this.calculateFreeBalance({free:r,feeFrozen:s,frozen:n})}async getErc20Balance(e,t){let{free:r,reserved:s,frozen:n}=await this.getTokenBalanceData(e,t);return this.calculateFreeBalance({free:r,feeFrozen:0n,frozen:n})}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t(D,this.calculateFreeBalance(r)))}async subscribeTokenBalance(e,t,r){let s=await this.api.query.tokens.accounts.keys(e),n=r?r.map(a=>[e,a]):s.map(({args:[a,i]})=>[a.toString(),i.toString()]);return this.api.query.tokens.accounts.multi(n,a=>{let i=[];a.forEach((o,l)=>{let c=this.calculateFreeBalance(o),u=n[l][1];i.push([u,c])}),t(i)})}async subscribeErc20Balance(e,t,r){let n=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([o,l])=>{let{assetType:c}=l.unwrap();return c.toString()==="Erc20"}).map(([{args:[o]}])=>o.toString()))(),a=async()=>{let i=await Promise.all(n.map(async o=>[o,await this.getErc20Balance(e,o)]));t(i)};return this.api.rpc.chain.subscribeNewHeads(async()=>{a()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateFreeBalance(e){let{free:t,miscFrozen:r,feeFrozen:s,frozen:n}=e,a=new O(t),i=new O(r||n),o=new O(s||0n),l=i.gt(o)?i:o;return a.minus(l)}};var re=class{api;_minOrderBudget;_blockTime;constructor(e){this.api=e}get blockTime(){return this._blockTime===void 0&&(this._blockTime=this.api.consts.aura.slotDuration.toNumber()),this._blockTime}get minOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=this.api.consts.dca.minBudgetInNativeCurrency.toString()),p(this._minOrderBudget)}};import{fixed_from_rational as st}from"@galacticcouncil/math-liquidity-mining";import{GenericAccountId32 as Dt}from"@polkadot/types";import{u8aConcat as nt}from"@polkadot/util";import{isAddress as it}from"@polkadot/util-crypto";var $e=class extends k{balanceClient;constructor(e){super(e),this.balanceClient=new L(e)}secondsInYear=new O(365.2425).times(24).times(60).times(60);async getOmnipoolFarms(e){let t=await this.api.query.omnipoolWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,n])=>{let[,a]=s.args,i=n.unwrap().toString(),o=a.toString(),l=(await this.api.query.omnipoolWarehouseLM.globalFarm(o)).unwrap(),c=(await this.api.query.omnipoolWarehouseLM.yieldFarm(e,o,i)).unwrap(),u=await this.getOraclePrice(l)??l.priceAdjustment.toString(),d=this.getAccountResolver(this.api.registry)(Number(o),!1).toString(),g=l.rewardCurrency.toString(),b=await this.balanceClient.getTokenBalanceData(d,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:u,potBalance:b.free.toString()}}))}async getIsolatedPoolFarms(e){let t=await this.api.query.xykWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,n])=>{let[,a]=s.args,i=n.unwrap().toString(),o=a.toString(),l=(await this.api.query.xykWarehouseLM.globalFarm(o)).unwrap(),c=(await this.api.query.xykWarehouseLM.yieldFarm(e,o,i)).unwrap(),u=await this.getOraclePrice(l)??l.priceAdjustment.toString(),d=this.getAccountResolver(this.api.registry)(Number(o),!0).toString(),g=l.rewardCurrency.toString(),b=await this.balanceClient.getTokenBalanceData(d,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:u,potBalance:b.free.toString()}}))}async getOraclePrice(e){let t=e.rewardCurrency.toString(),r=e.incentivizedAsset.toString(),s=[t,r].sort();if(t===r)return new O(1).shiftedBy(18).toString();let n=await this.api.query.emaOracle.oracles("omnipool",s,"TenMinutes");if(n.isNone)return;let[a]=n.unwrap(),i=a.price.n.toString(),o=a.price.d.toString(),l;return Number(t)<Number(r)?l=st(i,o):l=st(o,i),l}getGlobalRewardPerPeriod(e,t,r,s){let a=e.times(t).shiftedBy(-18).times(s).shiftedBy(-18);return a.gte(r)?r:a}getPoolYieldPerPeriod(e,t,r,s){return e.times(t).div(r.times(s).shiftedBy(-18))}padEndU8a(e,t){return nt(e,Array(Math.max(0,t-e.length)).fill(0))}getAccountResolver=e=>(t,r)=>{let s="modl",n=r?"0x78796b4c4d704944":"0x4f6d6e6957684c4d";return new Dt(e,this.padEndU8a(nt(s,n,typeof t!="number"?t.toU8a():[t]),32))};async getFarmApr(e,t){if(t==="isolatedpool"&&!it(e))throw new Error("You must pass an address of isolated pool as id");if(t==="omnipool"&&it(e))throw new Error("You must pass an asset id of omnipool");let r=6,s=t==="omnipool"?await this.getOmnipoolFarms(e):await this.getIsolatedPoolFarms(e);return s.length?s.map(({yieldFarm:i,globalFarm:o,priceAdjustment:l,potBalance:c})=>{let u=new O(o.totalSharesZ.toString()),h=o.plannedYieldingPeriods.toString(),d=new O(o.yieldPerPeriod.toString()),g=new O(o.maxRewardPerPeriod.toString()),b=o.blocksPerPeriod.toString(),P=new O(i.multiplier.toString()).shiftedBy(-18),T=this.secondsInYear.div(new O(r).times(b)),f;if(u.isZero())f=d.times(P).times(T);else{let F=this.getGlobalRewardPerPeriod(u,d,g,l);f=this.getPoolYieldPerPeriod(F,P,u,l).times(T)}let I=new O(o.pendingRewards.toString()).plus(o.accumulatedPaidRewards.toString()),B=g.times(h),w=c?I.plus(c):B;return I.div(w).gte(.999)?S:f.div(t==="isolatedpool"?2:1).times(100)}).reduce((i,o)=>i.plus(o),S).toString():void 0}};var Oe=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},at=class extends Error{constructor(e,t){super(),this.message=`${e} pool missing ${t}`,this.name="PoolConfigNotFound"}},J=class extends Error{constructor(e,t){super(),this.message=`Route from ${e} to ${t} not found in pool configuration`,this.name="RouteNotFound"}},ot=class extends Error{constructor(e){super(),this.message=`Asset ${e} not available in current network`,this.name="AssetNotFound"}},lt=class extends Error{constructor(e){super(),this.message=`Storage missing ${e}`,this.name="StorageConfigNotFound"}},ct=class extends Error{constructor(e){super(),this.message=`Subscription type "${e}" not supported`,this.name="SubscriptionNotSupported"}},ut=class extends Error{constructor(e){super(),this.message=`${e}`,this.name="ProviderConfigNotFound"}};import{defineChain as kt}from"viem";var Ct=["wss://hydration-rpc.n.dwellir.com","wss://hydration.dotters.network","wss://rpc.helikon.io/hydradx","wss://hydration.ibp.network","wss://rpc.cay.hydration.cloud","wss://rpc.parm.hydration.cloud","wss://rpc.roach.hydration.cloud","wss://rpc.zipp.hydration.cloud","wss://rpc.sin.hydration.cloud","wss://rpc.coke.hydration.cloud"],mt=m=>{let e=m.__internal__endpoints,t=e.some(s=>Ct.includes(s)),r=e.map(s=>s.replace("wss://","https://").replace("ws://","http://"));return kt({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:r}},blockExplorers:{default:{name:"Hydration Explorer",url:t?"https://explorer.evm.hydration.cloud":"https://explorer.nice.hydration.cloud"}},testnet:!t})};import{createPublicClient as dt,createWalletClient as Mt,custom as Lt,http as Ut}from"viem";function pt(m){let e=async({method:t,params:r})=>{let s=Array.isArray(r)?r:[];return m.send(t,s)};return()=>({request:e,config:{name:"PolkadotWsTransport",type:"webSocket",key:"polkadotWs",request:e}})}var xe=class{wsProvider;chain;constructor(e){let{provider:t}=e._options;this.wsProvider=t,this.chain=mt(t)}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return dt({chain:this.chain,transport:Ut()})}getWsProvider(){return dt({chain:this.chain,transport:pt(this.wsProvider)})}getSigner(e){return Mt({account:e,chain:this.chain,transport:Lt(window.ethereum)})}};import{LRUCache as Wr}from"@thi.ng/cache";import{memoize1 as Gr}from"@thi.ng/memoize";var E=(n=>(n.Aave="Aave",n.LBP="Lbp",n.Omni="Omnipool",n.Stable="Stableswap",n.XYK="Xyk",n))(E||{}),j=(n=>(n.UnknownError="UnknownError",n.InsufficientTradingAmount="InsufficientTradingAmount",n.MaxInRatioExceeded="MaxInRatioExceeded",n.MaxOutRatioExceeded="MaxOutRatioExceeded",n.TradeNotAllowed="TradeNotAllowed",n))(j||{});var Be=class m{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new m(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit)}constructor(e,t,r,s,n){this.type="Aave",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=n}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(o=>[o.id,o])),s=r.get(e),n=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),i=p(n.balance);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:n.decimals,balanceIn:a,balanceOut:i,assetInED:S,assetOutED:S}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),n=[];return t.isGreaterThan(e.balanceOut)&&n.push("TradeNotAllowed"),{amountIn:s,calculatedIn:s,amountOut:t,feePct:0,errors:n}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),n=[];return s.isGreaterThan(e.balanceOut)&&n.push("TradeNotAllowed"),{amountIn:t,calculatedOut:s,amountOut:s,feePct:0,errors:n}}calculateInGivenOut(e,t){return t}calculateOutGivenIn(e,t){return t}spotPriceInGivenOut(e){return v(R,e.decimalsOut)}spotPriceOutGivenIn(e){return v(R,e.decimalsIn)}calculateTradeFee(e,t){return S}};import{encodeAddress as Wt}from"@polkadot/util-crypto";import{stringToU8a as Ht}from"@polkadot/util";import{decodeEventLog as Xt}from"viem";function gt(m,e){let t=[];return JSON.stringify(m,(r,s)=>(s&&s[e]&&t.push(s),s)),t[0]}function vn(m,e,t){let r;return JSON.stringify(m,(s,n)=>(n&&n[e]===t&&(r=n),n)),r}var Nn=(m,e)=>typeof e=="bigint"?e.toString():e;import{memoize1 as qt}from"@thi.ng/memoize";import{TLRUCache as Gt}from"@thi.ng/cache";var Ve=[{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 se=class{client;constructor(e){this.client=e.getWsProvider()}async getData(e,t=6){let[r,s,n]=await Promise.all([this.client.readContract({abi:Ve,address:e,functionName:"latestRoundData"}),this.client.readContract({abi:Ve,address:e,functionName:"decimals"}),this.client.getBlock()]),[a,i,o,l]=r,c=n.number-(n.timestamp-l)/BigInt(t);return{price:i,decimals:s,updatedAt:Number(c)}}};var C=class extends L{evm;mmOracle;pools=[];subs=[];assets=new Map([]);mem=0;memPoolsCache=new Gt(null,{maxlen:1,ttl:1*60*60*1e3,release:e=>{this.mem>e&&this.log(this.getPoolType(),`mem ${e} released at`,new Date)}});memPools=qt(e=>(this.log(this.getPoolType(),`mem ${e} sync`),this.getPools()),this.memPoolsCache);constructor(e,t){super(e),this.evm=t,this.mmOracle=new se(t)}get augmentedPools(){return this.pools.filter(e=>this.isValidPool(e)).map(e=>this.withMetadata(e))}async withAssets(e){this.assets=new Map(e.map(t=>[t.id,t])),this.mem=this.mem+1}async getPoolsMem(){return await this.memPools(this.mem)}async getPools(){this.unsubscribe(),this.pools=await this.loadPools(),this.subs=this.subscribe();let e=this.getPoolType();return this.log(e,`mem ${this.mem} pools(${this.augmentedPools.length})`),this.log(e,`mem ${this.mem} subs(${this.subs.length})`),this.augmentedPools}subscribe(){return this.augmentedPools.map(t=>{let r=[];try{let n=this.subscribePoolChange(t);r.push(n)}catch{}if(t.type==="Aave")return r;let s=this.subscribeTokensPoolBalance(t);if(r.push(s),this.hasSystemAsset(t)){let n=this.subscribeSystemPoolBalance(t);r.push(n)}if(this.hasErc20Asset(t)){let n=this.subscribeErc20PoolBalance(t);r.push(n)}return this.subscribeLog(t),r}).flat()}hasSystemAsset(e){return e.tokens.some(t=>t.id==="0")}hasErc20Asset(e){return e.tokens.some(t=>t.type==="Erc20")}unsubscribe(){this.subs.forEach(e=>{e.then(t=>t())})}subscribeLog(e){let t=e.address.substring(0,10).concat("...");this.log(`${e.type} mem ${this.mem} [${t}] balance subscribed`)}subscribeSystemPoolBalance(e){return this.subscribeSystemBalance(e.address,this.updateBalanceCallback(e))}subscribeTokensPoolBalance(e){let t=(r,s)=>r.id!==s;return this.subscribeTokenBalance(e.address,this.updateBalancesCallback(e,t))}subscribeErc20PoolBalance(e){let t=e.tokens.filter(r=>r.type==="Erc20").map(r=>r.id);return this.subscribeErc20Balance(e.address,this.updateBalancesCallback(e,()=>!0),t)}isValidPool(e){return e.type==="Xyk"?e.tokens.every(t=>this.assets.get(t.id)):!0}withMetadata(e){return e.tokens=e.tokens.map(t=>{let r=this.assets.get(t.id);return{...t,...r}}),e}updateBalancesCallback(e,t){return function(r){r.forEach(([s,n])=>{let a=e.tokens.findIndex(i=>i.id==s);a>=0&&t(e,s)&&(e.tokens[a].balance=n.toString())})}}updateBalanceCallback(e){return function(t,r){let s=e.tokens.findIndex(n=>n.id==t);s>=0&&(e.tokens[s].balance=r.toString())}}};var Yt=["Supply","Withdraw","Repay","Borrow"],Ie=class extends C{isSupported(){return this.api.call.aaveTradeExecutor.pools!==void 0}async loadPools(){return(await this.api.call.aaveTradeExecutor.pools()).map(({reserve:t,atoken:r,liqudityIn:s,liqudityOut:n})=>({address:this.getPoolId(t.toString(),r.toString()),type:"Aave",tokens:[{id:t.toString(),balance:s.toString()},{id:r.toString(),balance:n.toString()}],...this.getPoolLimits()}))}async getPoolFees(e,t){return{}}getPoolType(){return"Aave"}getPoolId(e,t){let r=e+"/"+t;return Wt(Ht(r.padEnd(32,"\0")),63)}subscribePoolChange(e){let[t,r]=e.tokens,s=this.getReserveH160Id(t);return this.api.query.system.events(n=>{n.forEach(a=>{let{event:i}=a,o=`${i.section}:${i.method}`;if(o==="router:Executed"){let{assetIn:l,assetOut:c}=i.data.toHuman(),u=l.replace(/,/g,""),h=c.replace(/,/g,"");(u===r.id||h===r.id)&&(this.log(`Sync AAVE [router:Executed] :: ${u}:${h}`),this.updatePoolState(e))}if(o==="evm:Log"){let{log:l}=i.data.toHuman();try{let{eventName:c,args:u}=Xt({abi:K,topics:l.topics,data:l.data});Yt.includes(c)&&u.reserve.toLowerCase()===s.toLowerCase()&&(this.log(`Sync AAVE [evm:Log] :: ${c} ${t.symbol}(${t.id})`),this.updatePoolState(e))}catch{}}})})}async updatePoolState(e){let[t,r]=e.tokens,{liqudityIn:s,liqudityOut:n}=await this.api.call.aaveTradeExecutor.pool(t.id,r.id);e.tokens=e.tokens.map(a=>{let i=a.id===t.id?s.toString():n.toString();return{...a,balance:i}})}getReserveH160Id(e){return e.type==="Erc20"?gt(e.location,"accountKey20").accountKey20.key:M.fromAssetId(e.id)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:0}}};import{calculate_in_given_out as $t,calculate_out_given_in as Vt,calculate_linear_weights as zt,calculate_pool_trade_fee as Kt,get_spot_price as Jt}from"@galacticcouncil/math-lbp";var G=class{static getSpotPrice(e,t,r,s,n){return Jt(e,t,r,s,n)}static calculateInGivenOut(e,t,r,s,n){return $t(e,t,r,s,n)}static calculateOutGivenIn(e,t,r,s,n){return Vt(e,t,r,s,n)}static calculateLinearWeights(e,t,r,s,n){return zt(e,t,r,s,n)}static calculatePoolTradeFee(e,t,r){return Kt(e,t,r)}};var y=class{static toPct(e){return e[0]/e[1]*100}static toDecimals(e){return e[0]/e[1]}static fromPermill(e){return[e/1e3,1e3]}};var Ae=class m{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(e){return new m(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.fee,e.repayFeeApply)}constructor(e,t,r,s,n,a,i){this.type="Lbp",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=n,this.fee=a,this.repayFeeApply=i}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(o=>[o.id,o])),s=r.get(e),n=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),i=p(n.balance);return{assetIn:e,assetOut:t,balanceIn:a,balanceOut:i,decimalsIn:s.decimals,decimalsOut:n.decimals,weightIn:s.weight,weightOut:n.weight}}validateAndBuy(e,t,r){let s=this.tokens[0].id,n=[];t.isLessThan(this.minTradingLimit)&&n.push("InsufficientTradingAmount");let a=e.balanceOut.div(this.maxOutRatio);if(t.isGreaterThan(a)&&n.push("MaxOutRatioExceeded"),s===e.assetOut){let i=this.calculateTradeFee(t,r),o=y.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),l=t.plus(i),c=this.calculateInGivenOut(e,l),u=e.balanceIn.div(this.maxInRatio);return c.isGreaterThan(u)&&n.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:t,feePct:o,errors:n}}else{let i=this.calculateInGivenOut(e,t),o=e.balanceIn.div(this.maxInRatio);return i.isGreaterThan(o)&&n.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:i,amountOut:t,feePct:0,errors:n}}}validateAndSell(e,t,r){let s=this.tokens[0].id,n=[];t.isLessThan(this.minTradingLimit)&&n.push("InsufficientTradingAmount");let a=e.balanceIn.div(this.maxInRatio);if(t.isGreaterThan(a)&&n.push("MaxInRatioExceeded"),s===e.assetIn){let i=this.calculateOutGivenIn(e,t),o=e.balanceOut.div(this.maxOutRatio);return i.isGreaterThan(o)&&n.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:i,amountOut:i,feePct:0,errors:n}}else{let i=this.calculateOutGivenIn(e,t),o=this.calculateTradeFee(i,r),l=y.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),c=i.minus(o),u=e.balanceOut.div(this.maxOutRatio);return c.isGreaterThan(u)&&n.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:i,amountOut:c,feePct:l,errors:n}}}calculateInGivenOut(e,t){let r=G.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?S:s}calculateOutGivenIn(e,t){let r=G.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?S:s}spotPriceInGivenOut(e){let t=G.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),v(R,e.decimalsOut).toString());return p(t)}spotPriceOutGivenIn(e){let t=G.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),v(R,e.decimalsIn).toString());return p(t)}calculateTradeFee(e,t){let r=G.calculatePoolTradeFee(e.toString(),this.repayFeeApply?t.repayFee[0]:t.exchangeFee[0],this.repayFeeApply?t.repayFee[1]:t.exchangeFee[1]);return p(r)}};var ve=class extends C{MAX_FINAL_WEIGHT=v(p(100),6);poolsData=new Map([]);isSupported(){return this.api.query.lbp!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.lbp.poolData.entries(),this.api.query.parachainSystem.validationData()]),{relayParentNumber:r}=t.unwrap(),s=e.filter(([n,a])=>this.isActivePool(a.unwrap(),r)).map(async([{args:[n]},a])=>{let i=a.unwrap(),o=n.toString(),l=await this.getPoolDelta(o,i,r.toString());return this.poolsData.set(n.toString(),i),{address:o,type:"Lbp",fee:i.fee.toJSON(),...l,...this.getPoolLimits()}});return Promise.all(s)}async getPoolFees(e,t){let r=this.pools.find(s=>s.address===t);return{repayFee:this.getRepayFee(),exchangeFee:r.fee}}getPoolType(){return"Lbp"}async subscribePoolChange(e){return this.api.query.parachainSystem.validationData(async t=>{let{relayParentNumber:r}=t.unwrap(),s=this.poolsData.get(e.address);if(this.isActivePool(s,r)){let a=await this.getPoolDelta(e.address,s,r.toString());Object.assign(e,a)}else{let a=this.pools.findIndex(i=>i.address==e.address);this.pools.splice(a,1)}})}async getPoolDelta(e,t,r){let{start:s,end:n,assets:a,initialWeight:i,finalWeight:o,repayTarget:l,feeCollector:c}=t,u=G.calculateLinearWeights(s.toString(),n.toString(),i.toString(),o.toString(),r),[h,d]=a,g=h.toString(),b=p(u),P=d.toString(),T=this.MAX_FINAL_WEIGHT.minus(p(b)),[f,I,B]=await Promise.all([this.isRepayFeeApplied(g,l.toString(),c.toString()),this.getBalance(e,g),this.getBalance(e,P)]);return{repayFeeApply:f,tokens:[{id:g,weight:b,balance:I.toString()},{id:P,weight:T,balance:B.toString()}]}}isActivePool(e,t){if(e.start.isEmpty||e.end.isEmpty)return!1;let r=e.start.unwrap().toNumber(),s=e.end.unwrap().toNumber();return t.toNumber()>=r&&t.toNumber()<s}async isRepayFeeApplied(e,t,r){let s=p(t);if(s.isZero())return!1;try{return(await this.getBalance(e,r)).isLessThan(s)}catch{return!0}}getRepayFee(){return this.api.consts.lbp.repayFee.toJSON()}getPoolLimits(){let e=this.api.consts.lbp.maxInRatio.toJSON(),t=this.api.consts.lbp.maxOutRatio.toJSON(),r=this.api.consts.lbp.minTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};import{calculate_in_given_out as jt,calculate_lrna_in_given_out as Zt,calculate_out_given_in as Qt,calculate_out_given_lrna_in as er,calculate_pool_trade_fee as tr,calculate_spot_price as rr,calculate_lrna_spot_price as sr,calculate_shares as nr,calculate_liquidity_out as ir,calculate_liquidity_lrna_out as ar,calculate_liquidity_hub_in as or,is_sell_allowed as lr,is_buy_allowed as cr,is_add_liquidity_allowed as ur,is_remove_liquidity_allowed as mr,recalculate_asset_fee as pr,recalculate_protocol_fee as dr,verify_asset_cap as gr}from"@galacticcouncil/math-omnipool";var N=class{static calculateSpotPrice(e,t,r,s){return rr(e,t,r,s)}static calculateLrnaSpotPrice(e,t){return sr(e,t)}static calculateInGivenOut(e,t,r,s,n,a,i,o,l){return jt(e,t,r,s,n,a,i,o,l)}static calculateLrnaInGivenOut(e,t,r,s,n){return Zt(e,t,r,s,n)}static calculateOutGivenIn(e,t,r,s,n,a,i,o,l){return Qt(e,t,r,s,n,a,i,o,l)}static calculateOutGivenLrnaIn(e,t,r,s,n){return er(e,t,r,s,n)}static calculatePoolTradeFee(e,t,r){return tr(e,t,r)}static calculateShares(e,t,r,s){return nr(e,t,r,s)}static calculateLiquidityOut(e,t,r,s,n,a,i,o){return ir(e,t,r,s,n,a,i,o)}static calculateLiquidityLRNAOut(e,t,r,s,n,a,i,o){return ar(e,t,r,s,n,a,i,o)}static calculateCapDifference(e,t,r,s){let n=O(t),a=O(e),i=O(s),l=O(r).shiftedBy(-18);if(n.div(i).lt(l)){let u=l.times(i).minus(n).times(a),h=n.times(O(1).minus(l));return u.div(h).toFixed(0)}else return"0"}static calculateLimitHubIn(e,t,r,s){return or(e,t,r,s)}static isSellAllowed(e){return lr(e)}static isBuyAllowed(e){return cr(e)}static isAddLiquidityAllowed(e){return ur(e)}static isRemoveLiquidityAllowed(e){return mr(e)}static recalculateAssetFee(e,t,r,s,n,a,i,o,l,c,u){return pr(e,t,r,s,n,a,i,o,l,c,u)}static recalculateProtocolFee(e,t,r,s,n,a,i,o,l,c,u){return dr(e,t,r,s,n,a,i,o,l,c,u)}static verifyAssetCap(e,t,r,s){return gr(e,t,r,s)}};var Ne=class m{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(e){return new m(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.hubAssetId)}constructor(e,t,r,s,n,a){this.type="Omnipool",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=n,this.hubAssetId=a}validatePair(e,t){return this.hubAssetId!=t}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),n=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),i=p(n.balance),o=p(s.existentialDeposit),l=p(n.existentialDeposit);return{assetIn:e,assetOut:t,hubReservesIn:s.hubReserves,hubReservesOut:n.hubReserves,sharesIn:s.shares,sharesOut:n.shares,decimalsIn:s.decimals,decimalsOut:n.decimals,balanceIn:a,balanceOut:i,tradeableIn:s.tradeable,tradeableOut:n.tradeable,assetInED:o,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),n=this.calculateInGivenOut(e,t,r),a=n.minus(s),i=s===S?S:a.div(s).multipliedBy(100).decimalPlaces(2),o=[],l=N.isSellAllowed(e.tradeableIn),c=N.isBuyAllowed(e.tradeableOut);(!l||!c)&&o.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&o.push("InsufficientTradingAmount");let u=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(u)&&o.push("MaxOutRatioExceeded");let h=e.balanceIn.div(this.maxInRatio);return n.isGreaterThan(h)&&o.push("MaxInRatioExceeded"),{amountIn:n,calculatedIn:s,amountOut:t,feePct:i.toNumber(),errors:o}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),n=this.calculateOutGivenIn(e,t,r),i=s.minus(n).div(s).multipliedBy(100).decimalPlaces(2),o=[],l=N.isSellAllowed(e.tradeableIn),c=N.isBuyAllowed(e.tradeableOut);(!l||!c)&&o.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&o.push("InsufficientTradingAmount");let u=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(u)&&o.push("MaxInRatioExceeded");let h=e.balanceOut.div(this.maxOutRatio);return n.isGreaterThan(h)&&o.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:n,feePct:i.toNumber(),errors:o}}calculateInGivenOut(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(e,t,r);let s=N.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?y.toDecimals(r.assetFee).toString():S.toString(),r?y.toDecimals(r.protocolFee).toString():S.toString()),n=p(s);return n.isNegative()?S:n}calculateLrnaInGivenOut(e,t,r){let s=N.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?y.toDecimals(r.assetFee).toString():S.toString()),n=p(s);return n.isNegative()?S:n}calculateOutGivenIn(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,r);let s=N.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?y.toDecimals(r.assetFee).toString():S.toString(),r?y.toDecimals(r.protocolFee).toString():S.toString()),n=p(s);return n.isNegative()?S:n}calculateOutGivenLrnaIn(e,t,r){let s=N.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?y.toDecimals(r.assetFee).toString():S.toString()),n=p(s);return n.isNegative()?S:n}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=N.calculateSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString(),e.balanceIn.toString(),e.hubReservesIn.toString());return p(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceLrnaInGivenOut(e){let t=N.calculateLrnaSpotPrice(e.hubReservesOut.toString(),e.balanceOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceOutGivenIn(e){if(e.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(e);let t=N.calculateSpotPrice(e.balanceIn.toString(),e.hubReservesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}spotPriceOutGivenLrnaIn(e){let t=N.calculateLrnaSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}};import{encodeAddress as hr}from"@polkadot/util-crypto";import{stringToU8a as Pr}from"@polkadot/util";var Fe=class extends C{isSupported(){return this.api.query.omnipool!==void 0}async loadPools(){let e=this.api.consts.omnipool.hubAssetId.toString(),t=this.getPoolId(),[r,s,n]=await Promise.all([this.api.query.omnipool.assets.entries(),this.api.query.omnipool.hubAssetTradability(),this.getBalance(t,e)]),a=r.map(async([{args:[o]},l])=>{let{hubReserve:c,shares:u,tradable:h,cap:d,protocolShares:g}=l.unwrap(),b=await this.getBalance(t,o.toString());return{id:o.toString(),hubReserves:p(c.toString()),shares:p(u.toString()),tradeable:h.bits.toNumber(),balance:b.toString(),cap:p(d.toString()),protocolShares:p(g.toString())}}),i=await Promise.all(a);return i.push({id:e,tradeable:s.bits.toNumber(),balance:n.toString()}),[{address:t,type:"Omnipool",hubAssetId:e,tokens:i,...this.getPoolLimits()}]}async getPoolFees(e,t){let r=e.assetOut,s=e.assetIn,n="omnipool",a="Short",i=B=>B===D?[D,Se]:[Se,B],[o,l,c,u]=await Promise.all([this.api.query.system.number(),this.api.query.dynamicFees.assetFee(r),this.api.query.emaOracle.oracles(n,i(r),a),this.api.query.emaOracle.oracles(n,i(s),a)]),[h,d,g]=this.getAssetFee(e,o.toNumber(),l,c),[b,P,T]=s===Se?[0,0,0]:this.getProtocolFee(e,o.toNumber(),l,u),f=h+b,I=g+T;return{assetFee:y.fromPermill(d),protocolFee:y.fromPermill(P),min:y.fromPermill(f),max:y.fromPermill(I)}}getPoolType(){return"Omnipool"}async subscribePoolChange(e){let t=e.tokens.map(r=>r.id);return this.api.query.omnipool.assets.multi(t,r=>{e.tokens=r.map((s,n)=>{let a=e.tokens[n];if(s.isNone)return a;let i=s.unwrap();return this.updateTokenState(a,i)})})}updateTokenState(e,t){let{hubReserve:r,shares:s,tradable:n,cap:a,protocolShares:i}=t;return{...e,hubReserves:p(r.toString()),shares:p(s.toString()),cap:p(a.toString()),protocolShares:p(i.toString()),tradeable:n.bits.toNumber()}}getAssetFee(e,t,r,s){let{assetOut:n,balanceOut:a}=e,{minFee:i,maxFee:o,decay:l,amplification:c}=this.api.consts.dynamicFees.assetFeeParameters,u=y.fromPermill(i.toNumber()),h=y.fromPermill(o.toNumber());if(r.isNone||s.isNone)return[i.toNumber(),i.toNumber(),o.toNumber()];let[d]=s.unwrap(),{assetFee:g,timestamp:b}=r.unwrap(),P=Math.max(1,t-b.toNumber()),T=d.volume.bIn.toString(),f=d.volume.bOut.toString(),I=d.liquidity.b.toString();n===D&&(T=d.volume.aIn.toString(),f=d.volume.aOut.toString(),I=d.liquidity.a.toString());let B=y.fromPermill(g.toNumber()),w=N.recalculateAssetFee(T,f,I,"9",a.toString(),y.toDecimals(B).toString(),P.toString(),y.toDecimals(u).toString(),y.toDecimals(h).toString(),l.toString(),c.toString());return[i.toNumber(),Number(w)*1e6,o.toNumber()]}getProtocolFee(e,t,r,s){let{assetIn:n,balanceIn:a}=e,{minFee:i,maxFee:o,decay:l,amplification:c}=this.api.consts.dynamicFees.protocolFeeParameters,u=y.fromPermill(i.toNumber()),h=y.fromPermill(o.toNumber());if(r.isNone||s.isNone)return[i.toNumber(),i.toNumber(),o.toNumber()];let[d]=s.unwrap(),{protocolFee:g,timestamp:b}=r.unwrap(),P=Math.max(1,t-b.toNumber()),T=d.volume.bIn.toString(),f=d.volume.bOut.toString(),I=d.liquidity.b.toString();n===D&&(T=d.volume.aIn.toString(),f=d.volume.aOut.toString(),I=d.liquidity.a.toString());let B=y.fromPermill(g.toNumber()),w=N.recalculateProtocolFee(T,f,I,"9",a.toString(),y.toDecimals(B).toString(),P.toString(),y.toDecimals(u).toString(),y.toDecimals(h).toString(),l.toString(),c.toString());return[i.toNumber(),Number(w)*1e6,o.toNumber()]}getPoolId(){return hr(Pr("modlomnipool".padEnd(32,"\0")),63)}getPoolLimits(){let e=this.api.consts.omnipool.maxInRatio.toJSON(),t=this.api.consts.omnipool.maxOutRatio.toJSON(),r=this.api.consts.omnipool.minimumTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};import{calculate_in_given_out as br,calculate_out_given_in as yr,calculate_pool_trade_fee as fr,get_spot_price as Sr,calculate_liquidity_in as Tr,calculate_shares as wr,calculate_spot_price as Or,calculate_spot_price_with_fee as xr,calculate_liquidity_out_asset_a as Br,calculate_liquidity_out_asset_b as Ir}from"@galacticcouncil/math-xyk";var Y=class{static getSpotPrice(e,t,r){return Sr(e,t,r)}static calculateInGivenOut(e,t,r){return br(e,t,r)}static calculateOutGivenIn(e,t,r){return yr(e,t,r)}static calculatePoolTradeFee(e,t,r){return fr(e,t,r)}static calculateLiquidityIn(e,t,r){return Tr(e,t,r)}static calculateSpotPrice(e,t){return Or(e,t)}static calculateSpotPriceWithFee(e,t,r,s){return xr(e,t,r,s)}static calculateShares(e,t,r){return wr(e,t,r)}static calculateLiquidityOutAssetA(e,t,r,s){return Br(e,t,r,s)}static calculateLiquidityOutAssetB(e,t,r,s){return Ir(e,t,r,s)}};var Re=class m{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new m(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit)}constructor(e,t,r,s,n){this.type="Xyk",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=n}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),n=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),i=p(n.balance),o=p(s.existentialDeposit),l=p(n.existentialDeposit);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:n.decimals,balanceIn:a,balanceOut:i,assetInED:o,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),n=this.calculateTradeFee(s,r),a=y.toPct(r.exchangeFee),i=s.plus(n),o=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&o.push("InsufficientTradingAmount");let l=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(l)&&o.push("MaxOutRatioExceeded");let c=e.balanceIn.div(this.maxInRatio);return i.isGreaterThan(c)&&o.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:a,errors:o}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),n=this.calculateTradeFee(s,r),a=y.toPct(r.exchangeFee),i=s.minus(n),o=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&o.push("InsufficientTradingAmount");let l=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(l)&&o.push("MaxInRatioExceeded");let c=e.balanceOut.div(this.maxOutRatio);return i.isGreaterThan(c)&&o.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:a,errors:o}}calculateInGivenOut(e,t){let r=Y.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?S:s}calculateOutGivenIn(e,t){let r=Y.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?S:s}spotPriceInGivenOut(e){let t=Y.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),r=v(R,18-e.decimalsOut);return p(t).div(r)}spotPriceOutGivenIn(e){let t=Y.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),r=v(R,18-e.decimalsIn);return p(t).div(r)}calculateTradeFee(e,t){let r=Y.calculatePoolTradeFee(e.toString(),t.exchangeFee[0],t.exchangeFee[1]);return p(r)}};var Ee=class extends C{isSupported(){return this.api.query.xyk!==void 0}async loadPools(){let t=(await this.api.query.xyk.poolAssets.entries()).map(async([{args:[r]},s])=>{let n=r.toString(),[a,i]=s.unwrap(),[o,l]=await Promise.all([this.getBalance(n,a.toString()),this.getBalance(n,i.toString())]);return{address:n,type:"Xyk",tokens:[{id:a.toString(),balance:o.toString()},{id:i.toString(),balance:l.toString()}],...this.getPoolLimits()}});return Promise.all(t)}async getPoolFees(e,t){return{exchangeFee:this.getExchangeFee()}}getPoolType(){return"Xyk"}subscribePoolChange(e){throw new Error("Pool change subscription not supported!")}getExchangeFee(){return this.api.consts.xyk.getExchangeFee.toJSON()}getPoolLimits(){let e=this.api.consts.xyk.maxInRatio.toJSON(),t=this.api.consts.xyk.maxOutRatio.toJSON(),r=this.api.consts.xyk.minTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};import{calculate_in_given_out as Ar,calculate_out_given_in as vr,calculate_amplification as Nr,calculate_add_one_asset as Fr,calculate_liquidity_out_one_asset as Rr,calculate_pool_trade_fee as Er,calculate_shares as _r,calculate_shares_for_amount as Dr,calculate_spot_price_with_fee as kr,pool_account_name as Cr,recalculate_peg as Mr}from"@galacticcouncil/math-stableswap";var _=class{static getPoolAddress(e){return Cr(e)}static defaultPegs(e){let t=[];for(let r=0;r<e;r++)t.push(["1","1"]);return t}static calculateAmplification(e,t,r,s,n){return Nr(e,t,r,s,n)}static calculateInGivenOut(e,t,r,s,n,a,i){return Ar(e,t,r,s,n,a,i)}static calculateAddOneAsset(e,t,r,s,n,a,i){return Fr(e,t,r,s,n,a,i)}static calculateSharesForAmount(e,t,r,s,n,a,i){return Dr(e,t,r,s,n,a,i)}static calculateOutGivenIn(e,t,r,s,n,a,i){return vr(e,t,r,s,n,a,i)}static calculateLiquidityOutOneAsset(e,t,r,s,n,a,i){return Rr(e,t,r,s,n,a,i)}static calculateShares(e,t,r,s,n,a){return _r(e,t,r,s,n,a)}static calculateSpotPriceWithFee(e,t,r,s,n,a,i,o){return kr(e,t,r,s,n,a,i,o)}static calculatePoolTradeFee(e,t,r){return Er(e,t,r)}static recalculatePegs(e,t,r,s,n){let a=Mr(e,t,r,s,n);return JSON.parse(a)}};var _e=class m{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;pegs;pegsFee;static fromPool(e){return new m(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.amplification,e.id,e.fee,e.totalIssuance,e.pegs,e.pegsFee)}constructor(e,t,r,s,n,a,i,o,l,c,u){this.type="Stableswap",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=n,this.amplification=a,this.id=i,this.fee=o,this.totalIssuance=l,this.pegs=c,this.pegsFee=u}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(c=>[c.id,c])),s=r.get(e),n=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),i=p(n.balance),o=p(s.existentialDeposit),l=p(n.existentialDeposit);return{assetIn:e,assetOut:t,balanceIn:a,balanceOut:i,decimalsIn:s.decimals,decimalsOut:n.decimals,tradeableIn:this.id===e?15:s.tradeable,tradeableOut:this.id===t?15:n.tradeable,assetInED:o,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),n=this.calculateInGivenOut(e,t,r),a=y.toPct(r.fee),i=[],o=N.isSellAllowed(e.tradeableIn),l=N.isBuyAllowed(e.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&i.push("InsufficientTradingAmount"),{amountIn:n,calculatedIn:s,amountOut:t,feePct:a,errors:i}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),n=this.calculateOutGivenIn(e,t,r),a=y.toPct(r.fee),i=[],o=N.isSellAllowed(e.tradeableIn),l=N.isBuyAllowed(e.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&i.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:s,amountOut:n,feePct:a,errors:i}}calculateIn(e,t,r){let s=_.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),n=p(s);return n.isNegative()?S:n}calculateAddOneAsset(e,t,r){let s=_.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),n=p(s);return n.isNegative()?S:n}calculateSharesForAmount(e,t,r){let s=_.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),n=p(s);return n.isNegative()?S:n}calculateInGivenOut(e,t,r){return e.assetOut==this.id?this.calculateAddOneAsset(e,t,r):e.assetIn==this.id?this.calculateSharesForAmount(e,t,r):this.calculateIn(e,t,r)}spotPriceInGivenOut(e){let t=_.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetOut,e.assetIn,this.totalIssuance,"0",this.getPegs());if(e.assetOut==this.id)return p(t);if(e.assetIn==this.id){let s=v(R,e.decimalsIn-e.decimalsOut);return p(t).div(s)}let r=v(R,18-e.decimalsIn);return p(t).div(r)}calculateOut(e,t,r){let s=_.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),n=p(s);return n.isNegative()?S:n}calculateWithdrawOneAsset(e,t,r){let s=_.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),n=p(s);return n.isNegative()?S:n}calculateShares(e,t,r){let s=_.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),n=p(s);return n.isNegative()?S:n}calculateOutGivenIn(e,t,r){return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t,r):e.assetOut==this.id?this.calculateShares(e,t,r):this.calculateOut(e,t,r)}spotPriceOutGivenIn(e){let t=_.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetIn,e.assetOut,this.totalIssuance,"0",this.getPegs());if(e.assetIn==this.id)return p(t);if(e.assetOut==this.id){let s=v(R,e.decimalsOut-e.decimalsIn);return p(t).div(s)}let r=v(R,18-e.decimalsOut);return p(t).div(r)}calculateTradeFee(e,t){let r=_.calculatePoolTradeFee(e.toString(),t.fee[0],t.fee[1]);return p(r)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let e=this.tokens.filter(t=>t.id!=this.id).map(({id:t,balance:r,decimals:s})=>({asset_id:Number(t),amount:r,decimals:s}));return JSON.stringify(e)}getAssets(e,t){let r={asset_id:Number(e),amount:t.toFixed(0)};return JSON.stringify([r])}};import{blake2AsHex as Lr,encodeAddress as Ur}from"@polkadot/util-crypto";var qr=340282366920938463463374607431768211455n,De=class extends C{stablePools=new Map([]);isSupported(){return this.api.query.stableswap!==void 0}isPegSupported(){return this.api.query.stableswap.poolPegs!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.stableswap.pools.entries(),this.api.query.system.number()]),r=t.toNumber(),s=e.map(async([{args:[n]},a])=>{let i=a.unwrap(),o=n.toString(),l=this.getPoolAddress(o),[c,u,h]=await Promise.all([this.getPoolDelta(o,i,r.toString()),this.getPoolTokens(l,o,i),this.getPoolPegs(o,i,r.toString())]);return this.stablePools.set(l,i),{address:l,id:o,type:"Stableswap",fee:y.fromPermill(i.fee.toNumber()),tokens:u,...c,...h,...this.getPoolLimits()}});return Promise.all(s)}async getPoolFees(e,t){return{fee:this.pools.find(s=>s.address===t).pegsFee}}getPoolType(){return"Stableswap"}async subscribePoolChange(e){return this.api.query.system.number(async t=>{let r=t.toString(),s=this.stablePools.get(e.address);if(s){let[n,a]=await Promise.all([this.getPoolDelta(e.id,s,r),this.getPoolPegs(e.id,s,r)]);Object.assign(e,n,a)}})}async getPoolDelta(e,t,r){let{initialAmplification:s,finalAmplification:n,initialBlock:a,finalBlock:i}=t,o=_.calculateAmplification(s.toString(),n.toString(),a.toString(),i.toString(),r),l=await this.api.query.tokens.totalIssuance(e);return{amplification:o,totalIssuance:l.toString()}}async getPoolTokens(e,t,r){let{assets:s}=r,n=s.map(async i=>{let[o,l]=await Promise.all([this.api.query.stableswap.assetTradability(t,i.toString()),this.getBalance(e,i.toString())]);return{id:i.toString(),tradeable:o.bits.toNumber(),balance:l.toString()}}),a=await Promise.all(n);return a.push({id:t,tradeable:15,balance:qr.toString()}),a}getPoolDefaultPegs(e){let t=e.fee,r=_.defaultPegs(e.assets.length);return{pegsFee:y.fromPermill(t.toNumber()),pegs:r}}async getPoolPegs(e,t,r){if(!this.isPegSupported())return this.getPoolDefaultPegs(t);let s=await this.api.query.stableswap.poolPegs(e);if(s.isNone)return this.getPoolDefaultPegs(t);let n=s.unwrap(),a=await this.getLatestPegs(t,n,r),i=this.getRecentPegs(n),o=n.maxPegUpdate.toHuman(),l=t.fee.toHuman(),[c,u]=_.recalculatePegs(JSON.stringify(i),JSON.stringify(a),r,o.replace(/%/g,""),l.replace(/%/g,"")),h=Number(c)*1e4;return{pegsFee:y.fromPermill(h),pegs:u}}getRecentPegs(e){let{current:t}=e;return Array.from(t.entries()).map(([r,s])=>s.map(n=>n.toString()))}async getLatestPegs(e,t,r){let{source:s}=t,n=Array.from(e.assets.entries()).map(([i,o])=>o.toString()),a=s.map(async(i,o)=>{if(i.isOracle){let[l,c,u]=i.asOracle,h=[u.toString(),n[o]].map(f=>Number(f)).sort((f,I)=>f-I),d=await this.api.query.emaOracle.oracles(l,h,c),[{price:g,updatedAt:b}]=d.unwrap(),P=g.n.toString(),T=g.d.toString();return u.toString()===h[0].toString()?[[P,T],b.toString()]:[[T,P],b.toString()]}else if(i.isMmOracle){let l=i.asMmOracle,{price:c,decimals:u,updatedAt:h}=await this.mmOracle.getData(l.toString()),d=10**u;return[[c.toString(),d.toString()],h.toString()]}else return[i.asValue.map(l=>l.toString()),r]});return Promise.all(a)}getPoolAddress(e){let t=Number(e),r=_.getPoolAddress(t);return Ur(Lr(r),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:this.api.consts.stableswap.minTradingLimit.toJSON()}}};var ne=class extends k{api;evm;assetClient;aaveClient;xykClient;omniClient;lbpClient;stableClient;clients=[];onChainAssets=[];memRegistry=Gr(e=>(this.log(`Registry mem ${e} sync`),this.syncRegistry()));constructor(e,t){super(e),this.api=e,this.evm=t,this.assetClient=new V(this.api),this.aaveClient=new Ie(this.api,t),this.xykClient=new Ee(this.api,t),this.omniClient=new Fe(this.api,t),this.lbpClient=new ve(this.api,t),this.stableClient=new De(this.api,t),this.clients=[this.aaveClient,this.xykClient,this.omniClient,this.lbpClient,this.stableClient]}get assets(){return this.onChainAssets}get isRegistrySynced(){return this.onChainAssets.length>0}async syncRegistry(e){let t=await this.assetClient.getOnChainAssets(!1,e);this.clients.forEach(r=>r.withAssets(t)),this.onChainAssets=t}async getPools(e){return this.isRegistrySynced||await this.memRegistry(1),e.length==0?(await Promise.all(this.clients.filter(s=>s.isSupported()).map(s=>s.getPoolsMem()))).flat():(await Promise.all(this.clients.filter(r=>e.some(s=>s===r.getPoolType())).map(r=>r.getPoolsMem()))).flat()}destroy(){this.aaveClient.unsubscribe(),this.xykClient.unsubscribe(),this.omniClient.unsubscribe(),this.lbpClient.unsubscribe(),this.stableClient.unsubscribe()}async getPoolFees(e,t){switch(t.type){case"Aave":return this.aaveClient.getPoolFees(e,t.address);case"Xyk":return this.xykClient.getPoolFees(e,t.address);case"Omnipool":return this.omniClient.getPoolFees(e,t.address);case"Lbp":return this.lbpClient.getPoolFees(e,t.address);case"Stableswap":return this.stableClient.getPoolFees(e,t.address);default:throw new Oe(t.type)}}};var ie=class extends ne{feeCache;disconnectSubscribeNewHeads=null;constructor(e,t){super(e,t),this.feeCache=new Wr(null),this.api.rpc.chain.subscribeNewHeads(async r=>{this.feeCache.release()}).then(r=>{this.disconnectSubscribeNewHeads=r})}async getPoolFees(e,t){let r=[t.address,e.assetIn,e.assetOut].join("-");if(this.feeCache.has(r))return this.feeCache.get(r);{let n=await super.getPoolFees(e,t);return this.feeCache.set(r,n),n}}async destroy(){this.log(`Destroying pool cache!
|
|
2
|
-
Items: [${this.feeCache.length}]`),this.feeCache.release(),this.disconnectSubscribeNewHeads?.()}};var ae=class{static get(e){switch(e.type){case"Aave":return Be.fromPool(e);case"Xyk":return Re.fromPool(e);case"Omnipool":return Ne.fromPool(e);case"Lbp":return Ae.fromPool(e);case"Stableswap":return _e.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};var ke=class{constructor(e=1/0){this.capacity=e}storage=[];enqueue(e){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(e)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Hr=5,oe=class{isNotVisited(e,t){let r=!0;return t.forEach(s=>{(s[0]===e[0]||s[1]===e[1])&&(r=!1)}),r}findPaths(e,t,r){let s=[],n=new ke,a=[];for(a.push([t,""]),n.enqueue(a);n.size()>0;){let i=n.dequeue();if(i==null||i.length>Hr)return s;let o=i[i.length-1];(r===null||o[0]===r)&&s.push(i),e.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,i)){let u=[...i];u.push(c),n.enqueue(u)}})}return s}buildAndPopulateGraph(e,t){let r=new Map;for(let s of e)r.set(parseInt(s),[]);for(let[s,n,a]of t){let i=parseInt(n),o=parseInt(a);r.get(i)?.push([o,s])}return r}};function ze(m){let e={};for(let t of m){let r=t.tokens.length;for(let s=0;s<r;s++){e[t.tokens[s].id]||(e[t.tokens[s].id]=[]);for(let n=0;n<r;n++){if(s==n)continue;let a=[t.address,t.tokens[s].id,t.tokens[n].id];e[t.tokens[s].id].push(a)}}}return e}var le=class{getProposals(e,t,r){let s=ze(r),n=Object.keys(s),a=n.map(c=>s[c]).flat(),i=new oe,o=i.buildAndPopulateGraph(n,a),l=i.findPaths(o,parseInt(e),t?parseInt(t):null);return this.parsePaths(l)}parsePaths(e){let t=[];for(let r of e){let s=[];for(let n=0;n<r.length;n++){let a=r[n],i=r[n+1];if(i==null)break;s.push(this.toEdge(a,i))}t.push(s)}return t}toEdge(e,t){return[t[1],e[0].toString(),t[0].toString()]}};var ce=class{routeSuggester;routerOptions;poolService;constructor(e,t={}){this.poolService=e,this.routeSuggester=new le,this.routerOptions=Object.freeze({includeOnly:t.includeOnly??[]})}async getPools(){let e=this.routerOptions.includeOnly;return await this.poolService.getPools(e)}async getAllAssets(){let e=await this.getPools();if(e.length===0)throw new Error("No pools configured");let t=await this.getAssets(e);return[...new Map(t).values()]}async getAssetPairs(e){let t=await this.getPools();if(t.length===0)throw new Error("No pools configured");let{assets:r,poolsMap:s}=await this.validateToken(e,t),a=this.getPaths(e,null,s,t).map(i=>i[i.length-1].assetOut);return this.toAssets([...new Set(a)],r)}async getAllPaths(e,t){let r=await this.getPools();if(r.length===0)throw new Error("No pools configured");let{poolsMap:s}=await this.validateTokenPair(e,t,r);return this.getPaths(e,t,s,r)}async getAssets(e){let t=e.map(r=>r.tokens.map(s=>({id:s.id,name:s.name,symbol:s.symbol,decimals:s.decimals,icon:s.icon,type:s.type,isSufficient:s.isSufficient,existentialDeposit:s.existentialDeposit,meta:s.meta,location:s.location,isWhiteListed:s.isWhiteListed}))).flat();return new Map(t.map(r=>[r.id,r]))}getPaths(e,t,r,s){return this.routeSuggester.getProposals(e,t,s).filter(i=>this.validPath(i,r)).map(i=>this.toHops(i,r))}async validateTokenPair(e,t,r){let s=await this.getAssets(r);if(s.get(e)==null)throw new Error(e+" is not supported token");if(s.get(t)==null)throw new Error(t+" is not supported token");let n=this.getPoolMap(r);return{assets:s,poolsMap:n}}async validateToken(e,t){let r=await this.getAssets(t);if(r.get(e)==null)throw new Error(e+" is not supported token");let s=this.getPoolMap(t);return{assets:r,poolsMap:s}}getPoolMap(e){return new Map(e.map(t=>[t.address,ae.get(t)]))}validPath(e,t){return e.length>0&&e.map(r=>this.validEdge(r,t)).reduce((r,s)=>r&&s)}validEdge([e,t,r],s){return s.get(e)?.validatePair(t,r)||!1}toHops(e,t){return e.map(([r,s,n])=>{let a=t.get(r);return{poolAddress:r,poolId:a?.id,pool:a?.type,assetIn:s,assetOut:n}})}toAssets(e,t){return e.map(r=>t.get(r))}};var Xr=p("100");function Kl(m,e){return m.minus(e).abs().div(m.plus(e).div(2)).multipliedBy(100).decimalPlaces(2)}function ue(m,e){return m.minus(e).div(e).multipliedBy(100).decimalPlaces(2)}function ht(m,e){return R.minus(e.div(m)).multipliedBy(100).decimalPlaces(2)}function Pt(m,e){return e.div(m).minus(R).multipliedBy(100).decimalPlaces(2)}function z(m,e){return(e<.01||e>100)&&new Error("Supported range is from 0.01% - 100%"),m.div(Xr).multipliedBy(e).decimalPlaces(0,1)}var Ke=(t=>(t.Buy="Buy",t.Sell="Sell",t))(Ke||{}),Je=(r=>(r.Dca="Dca",r.TwapSell="TwapSell",r.TwapBuy="TwapBuy",r))(Je||{}),bt=(r=>(r.OrderTooSmall="OrderTooSmall",r.OrderTooBig="OrderTooBig",r.OrderImpactTooBig="OrderImpactTooBig",r))(bt||{});var me=class extends ce{isDirectTrade(e){return e.length==1}findBestSellRoute(e){let t=e.sort((r,s)=>{let n=r[r.length-1].amountOut,a=s[s.length-1].amountOut;return n.isGreaterThan(a)?-1:1});return t.find(r=>r.every(s=>s.errors.length==0))||t[0]}getRouteFeeRange(e){if(e.filter(r=>r.tradeFeeRange).length>0){let r=e.map(n=>n.tradeFeeRange?.[0]??n.tradeFeePct).reduce((n,a)=>n+a),s=e.map(n=>n.tradeFeeRange?.[1]??n.tradeFeePct).reduce((n,a)=>n+a);return[r,s]}}getPoolFeeRange(e){let t=e.min?y.toPct(e.min):void 0,r=e.max?y.toPct(e.max):void 0;if(t&&r)return[t,r]}async getBestSell(e,t,r){return this.getSell(e,t,r)}async getSell(e,t,r,s){let n=await super.getPools();if(n.length===0)throw new Error("No pools configured");let{poolsMap:a}=await super.validateTokenPair(e,t,n),i=super.getPaths(e,t,a,n);if(i.length===0)throw new J(e,t);let o;if(s)o=await this.toSellSwaps(r,s,a);else{let w=i.map(async F=>await this.toSellSwaps(r,F,a)),A=await Promise.all(w);o=this.findBestSellRoute(A)}let l=o[0],c=o[o.length-1],u=this.isDirectTrade(o),h=o.map(w=>w.spotPrice.shiftedBy(-1*w.assetOutDecimals)).reduce((w,A)=>w.multipliedBy(A)),d=v(h,c.assetOutDecimals),g=u?c.calculatedOut:this.calculateDelta0Y(l.amountIn,o,a),b=c.amountOut,P=u?c.tradeFeePct:ht(g,b).toNumber(),T=g.minus(b),f=this.getRouteFeeRange(o),I=l.amountIn.shiftedBy(-1*l.assetInDecimals).multipliedBy(d),B=ue(g,I);return{type:"Sell",amountIn:l.amountIn,amountOut:c.amountOut,spotPrice:d,tradeFee:T,tradeFeePct:P,tradeFeeRange:f,priceImpactPct:B.toNumber(),swaps:o,toHuman(){return{type:"Sell",amountIn:x(l.amountIn,l.assetInDecimals),amountOut:x(c.amountOut,c.assetOutDecimals),spotPrice:x(d,c.assetOutDecimals),tradeFee:x(T,c.assetOutDecimals),tradeFeePct:P,tradeFeeRange:f,priceImpactPct:B.toNumber(),swaps:o.map(w=>w.toHuman())}}}}calculateDelta0Y(e,t,r){let s=[];for(let n=0;n<t.length;n++){let a=t[n],i=r.get(a.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(a.assetIn,a.assetOut),l;n>0?l=s[n-1]:l=e;let c=i.calculateOutGivenIn(o,l);s.push(c)}return s[s.length-1]}async toSellSwaps(e,t,r){let s=[];for(let n=0;n<t.length;n++){let a=t[n],i=r.get(a.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(a.assetIn,a.assetOut),l;n>0?l=s[n-1].amountOut:l=v(p(e),o.decimalsIn).decimalPlaces(0,1);let c=await this.poolService.getPoolFees(o,i),{amountOut:u,calculatedOut:h,feePct:d,errors:g}=i.validateAndSell(o,l,c),b=this.getPoolFeeRange(c),P=i.spotPriceOutGivenIn(o),T=l.shiftedBy(-1*o.decimalsIn).multipliedBy(P),f=ue(h,T);s.push({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:u,calculatedOut:h,spotPrice:P,tradeFeePct:d,tradeFeeRange:b,priceImpactPct:f.toNumber(),errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===a.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===a.assetIn},toHuman(){return{...a,amountIn:x(l,o.decimalsIn),amountOut:x(u,o.decimalsOut),calculatedOut:x(h,o.decimalsOut),spotPrice:x(P,o.decimalsOut),tradeFeePct:d,tradeFeeRange:b,priceImpactPct:f.toNumber(),errors:g}}})}return s}async getMostLiquidRoute(e,t){let r=await super.getPools(),{poolsMap:s}=await super.validateTokenPair(e,t,r),n=super.getPaths(e,t,s,r);if(n.length===0)throw new J(e,t);let l=r.filter(d=>d.tokens.some(g=>g.id===e&&g.id!==d.id)).map(d=>d.type==="Aave"?d.tokens:d.tokens.filter(g=>g.id===e)).map(d=>d.map(g=>p(g.balance).shiftedBy(-1*g.decimals)).reduce((g,b)=>g.plus(b))).sort((d,g)=>g.isLessThan(d)?-1:1)[0].div(100).multipliedBy(.1),c=n.map(async d=>await this.toSellSwaps(l,d,s)),u=await Promise.all(c);return this.findBestSellRoute(u).map(d=>({poolAddress:d.poolAddress,poolId:d?.poolId,pool:d.pool,assetIn:d.assetIn,assetOut:d.assetOut}))}async getBestSpotPrice(e,t){let r=await super.getPools();if(r.length===0)throw new Error("No pools configured");let{poolsMap:s}=await super.validateTokenPair(e,t,r);if(super.getPaths(e,t,s,r).length===0)return Promise.resolve(void 0);let a=await this.getMostLiquidRoute(e,t),i=await this.toSellSwaps("1",a,s),o=i.map(u=>u.spotPrice.shiftedBy(-1*u.assetOutDecimals)).reduce((u,h)=>u.multipliedBy(h)),l=i[i.length-1].assetOutDecimals;return{amount:v(o,l),decimals:l}}findBestBuyRoute(e){let t=e.sort((r,s)=>{let n=r[0].amountIn,a=s[0].amountIn;return n.isGreaterThan(a)?1:-1});return t.find(r=>r.every(s=>s.errors.length==0))||t[0]}async getBestBuy(e,t,r){return this.getBuy(e,t,r)}async getBuy(e,t,r,s){let n=await super.getPools();if(n.length===0)throw new Error("No pools configured");let{poolsMap:a}=await super.validateTokenPair(e,t,n),i=super.getPaths(e,t,a,n);if(i.length===0)throw new J(e,t);let o;if(s)o=await this.toBuySwaps(r,s,a);else{let w=i.map(async F=>await this.toBuySwaps(r,F,a)),A=await Promise.all(w);o=this.findBestBuyRoute(A)}let l=o[o.length-1],c=o[0],u=this.isDirectTrade(o),h=o.map(w=>w.spotPrice.shiftedBy(-1*w.assetInDecimals)).reduce((w,A)=>w.multipliedBy(A)),d=v(h,c.assetInDecimals),g=u?c.calculatedIn:this.calculateDelta0X(l.amountOut,o,a),b=c.amountIn,P=u?c.tradeFeePct:Pt(g,b).toNumber(),T=b.minus(g),f=this.getRouteFeeRange(o),I=l.amountOut.shiftedBy(-1*l.assetOutDecimals).multipliedBy(d),B;return g.isZero()?B=-100:B=ue(I,g).toNumber(),{type:"Buy",amountOut:l.amountOut,amountIn:c.amountIn,spotPrice:d,tradeFee:T,tradeFeePct:P,tradeFeeRange:f,priceImpactPct:B,swaps:o,toHuman(){return{type:"Buy",amountOut:x(l.amountOut,l.assetOutDecimals),amountIn:x(c.amountIn,c.assetInDecimals),spotPrice:x(d,c.assetInDecimals),tradeFee:x(T,c.assetInDecimals),tradeFeePct:P,tradeFeeRange:f,priceImpactPct:B,swaps:o.map(w=>w.toHuman())}}}}calculateDelta0X(e,t,r){let s=[];for(let n=t.length-1;n>=0;n--){let a=t[n],i=r.get(a.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(a.assetIn,a.assetOut),l;n==t.length-1?l=e:l=s[0];let c=i.calculateInGivenOut(o,l);s.unshift(c)}return s[0]}async toBuySwaps(e,t,r){let s=[];for(let n=t.length-1;n>=0;n--){let a=t[n],i=r.get(a.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(a.assetIn,a.assetOut),l;n==t.length-1?l=v(p(e),o.decimalsOut).decimalPlaces(0,1):l=s[0].amountIn;let c=await this.poolService.getPoolFees(o,i),{amountIn:u,calculatedIn:h,feePct:d,errors:g}=i.validateAndBuy(o,l,c),b=this.getPoolFeeRange(c),P=i.spotPriceInGivenOut(o),T=l.shiftedBy(-1*o.decimalsOut).multipliedBy(P),f;h.isZero()?f=-100:f=ue(T,h).toNumber(),s.unshift({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:u,amountOut:l,calculatedIn:h,spotPrice:P,tradeFeePct:d,tradeFeeRange:b,priceImpactPct:f,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===a.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===a.assetIn},toHuman(){return{...a,amountIn:x(u,o.decimalsIn),amountOut:x(l,o.decimalsOut),calculatedIn:x(h,o.decimalsIn),spotPrice:x(P,o.decimalsIn),tradeFeePct:d,tradeFeeRange:b,priceImpactPct:f,errors:g}}})}return s}};var yt=6e3,ft=p(1e15),pe=6,je=-5,Ze=6*60*60*1e3;var St=6;var U=class{static build(e){return e.map(({assetIn:t,assetOut:r,pool:s,poolId:n})=>s==="Stableswap"?{pool:{Stableswap:n},assetIn:t,assetOut:r}:{pool:s,assetIn:t,assetOut:r})}};var de=class{schedulerOptions;router;constructor(e,t={}){this.router=e,this.schedulerOptions=Object.freeze({blockTime:t.blockTime??yt,minBudgetInNative:t.minBudgetInNative??ft})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(e,t,r,s,n){let[a,i]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,r)]),{amountIn:o,swaps:l,priceImpactPct:c}=i,u=l[0],h=l[l.length-1],{assetInDecimals:d}=u,{assetOutDecimals:g}=h,b=Math.abs(c),P=this.getMinimumTradeCount(o,a),T=this.getOptimalTradeCount(b),f=n?Math.round(s/n):T,I=Math.ceil(s/P),B=Math.round(s/T),w=Math.round(s/f),A=o.dividedBy(f).decimalPlaces(0,1),F=await this.router.getBestSell(e,t,x(A,d)),q=o.isLessThan(a),he=[];q&&he.push("OrderTooSmall");let Pe=F.amountOut.multipliedBy(f),Le=this.toBlockPeriod(w),Ue=F.tradeFee.multipliedBy(f),qe=U.build(l),be={assetIn:e,assetOut:t,errors:he,frequencyMin:I,frequencyOpt:B,frequency:w,tradeCount:f,tradeFee:Ue,tradeImpactPct:F.priceImpactPct,tradePeriod:Le,tradeRoute:qe,type:"Dca"};return{...be,amountIn:o,amountOut:Pe,tradeAmountIn:F.amountIn,tradeAmountOut:F.amountOut,toHuman(){return{...be,amountIn:x(o,d),amountOut:x(Pe,g),tradeAmountIn:x(F.amountIn,d),tradeAmountOut:x(F.amountOut,g)}}}}async getMinimumOrderBudget(e){if(D===e)return this.minOrderBudget;let t=await this.router.getBestSpotPrice(D,e);if(t)return this.minOrderBudget.times(t.amount).div(p(10).pow(12)).decimalPlaces(0,1);throw new Error("Unable to calculate order budget")}getMinimumTradeCount(e,t){let r=t.multipliedBy(.2),s=e.dividedBy(r).toNumber();return Math.round(s)}getOptimalTradeCount(e){let t=Math.round(e*10)||1;return Math.max(t,3)}async getTwapSellOrder(e,t,r){let[s,n]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,r)]),{amountIn:a,swaps:i,priceImpactPct:o}=n,l=i[0],c=i[i.length-1],{assetInDecimals:u}=l,{assetOutDecimals:h}=c,d=Math.abs(o),g=this.getTwapTradeCount(d),b=a.dividedBy(g).decimalPlaces(0,1),P=await this.router.getBestSell(l.assetIn,c.assetOut,x(b,u)),T=g===1,f=a.isLessThan(s),I=P.priceImpactPct<je,B=[];f||T?B.push("OrderTooSmall"):I&&B.push("OrderImpactTooBig");let w=P.amountOut.multipliedBy(g),A=P.tradeFee.multipliedBy(g),F=U.build(i),q={assetIn:e,assetOut:t,errors:B,tradeCount:g,tradeImpactPct:P.priceImpactPct,tradePeriod:pe,tradeRoute:F,type:"TwapSell"};return{...q,amountIn:a,amountOut:w,tradeAmountIn:P.amountIn,tradeAmountOut:P.amountOut,tradeFee:A,toHuman(){return{...q,amountIn:x(a,u),amountOut:x(w,h),tradeAmountIn:x(P.amountIn,u),tradeAmountOut:x(P.amountOut,h),tradeFee:x(A,h)}}}}async getTwapBuyOrder(e,t,r){let[s,n]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestBuy(e,t,r)]),{amountOut:a,swaps:i,priceImpactPct:o}=n,l=i[0],c=i[i.length-1],{assetInDecimals:u}=l,{assetOutDecimals:h}=c,d=Math.abs(o),g=this.getTwapTradeCount(d),b=a.dividedBy(g).decimalPlaces(0,1),P=await this.router.getBestBuy(l.assetIn,c.assetOut,x(b,h)),T=P.amountIn.multipliedBy(g),f=g===1,I=T.isLessThan(s),B=P.priceImpactPct<je,w=[];I||f?w.push("OrderTooSmall"):B&&w.push("OrderImpactTooBig");let A=P.tradeFee.multipliedBy(g),F=U.build(i),q={assetIn:e,assetOut:t,errors:w,tradeCount:g,tradeImpactPct:P.priceImpactPct,tradePeriod:pe,tradeRoute:F,type:"TwapBuy"};return{...q,amountIn:T,amountOut:a,tradeAmountIn:P.amountIn,tradeAmountOut:P.amountOut,tradeFee:A,toHuman(){return{...q,amountIn:x(T,u),amountOut:x(a,h),tradeAmountIn:x(P.amountIn,u),tradeAmountOut:x(P.amountOut,h),tradeFee:x(A,u)}}}}getTwapTradeCount(e){let t=this.getOptimalTradeCount(e);if(this.getTwapExecutionTime(t)>Ze){let s=Ze/(this.blockTime*pe);return Math.round(s)}return t}getTwapExecutionTime(e){return e*pe*this.blockTime}toBlockPeriod(e){let t=e/this.blockTime,r=Math.round(t);return Math.max(r,St)}};import{encodeFunctionData as Yr}from"viem";var Z=class extends k{evm;evmClient;balanceClient;aaveUtils;constructor(e,t){super(e),this.evm=t,this.evmClient=t.getWsProvider(),this.balanceClient=new L(e),this.aaveUtils=new $(t)}wrapTx(e,t){return{hex:t.toHex(),name:e,get:()=>t,dryRun:r=>this.dryRun(r,t)}}async dryRun(e,t){let r;try{r=await this.api.call.dryRunApi.dryRunCall({System:{Signed:e}},t.inner.toHex())}catch(s){throw console.error(s),new Error("Dry run execution failed!")}if(r.isOk)return r.asOk;throw console.log(r.asErr.toHuman()),new Error("Dry run execution error!")}dispatchWithExtraGas(e){return this.api.tx.dispatcher.dispatchWithExtraGas(e.inner.toHex(),fe)}isDirectOmnipoolTrade(e){return e.length===1&&e[0].pool==="Omnipool"}};var Ce=class extends Z{_trade;_beneficiary;_slippagePct=1;setTrade(e){return this._trade=e,this}withBeneficiary(e){return this._beneficiary=e,this}withSlippage(e){return this._slippagePct=e,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:e,swaps:t,type:r}=this.trade;if(r==="Buy")return this.buildBuyTx();let s=t[0],{assetIn:n,assetOut:a}=s,o=(await this.balanceClient.getBalance(this.beneficiary,n)).minus(5),l=!0;return s.isWithdraw()&&(l=(await this.aaveUtils.getMaxWithdraw(this.beneficiary,a)).amount.isGreaterThanOrEqualTo(o)),l&&e.isGreaterThanOrEqualTo(o)?this.buildSellAllTx():this.buildSellTx()}buildBuyTx(){let{amountIn:e,amountOut:t,swaps:r}=this.trade,s=r[0],n=r[r.length-1],a=z(e,this.slippagePct),i=s.assetIn,o=n.assetOut,l=e.plus(a),c;return this.isDirectOmnipoolTrade(r)?c=this.api.tx.omnipool.buy(o,i,t.toFixed(),l.toFixed()):c=this.api.tx.router.buy(i,o,t.toFixed(),l.toFixed(),U.build(r)),this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:e,amountOut:t,swaps:r}=this.trade,s=r[0],n=r[r.length-1],a=z(t,this.slippagePct),i=s.assetIn,o=n.assetOut,l=t.minus(a),c;return this.isDirectOmnipoolTrade(r)?c=this.api.tx.omnipool.sell(i,o,e.toFixed(),l.toFixed()):c=this.api.tx.router.sell(i,o,e.toFixed(),l.toFixed(),U.build(r)),s.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(c=this.dispatchWithExtraGas(c)),this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:e,swaps:t}=this.trade,r=t[0],s=t[t.length-1],n=z(e,this.slippagePct),a=r.assetIn,i=s.assetOut,o=e.minus(n),l=this.api.tx.router.sellAll(a,i,o.toFixed(),U.build(t));return r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)&&(l=this.dispatchWithExtraGas(l)),this.wrapTx("RouterSellAll",l)}async buildWithdrawTx(e){let{swaps:t}=this.trade,r=e||this.trade.amountIn,n=t[0].assetOut,a=await this.evmClient.getGasPrice(),i=a*10n/100n,o=X.fromAny(this.beneficiary),l=e?Qe:BigInt(r.toFixed()),c=M.fromAssetId(n),u=Yr({abi:K,functionName:"withdraw",args:[c,l,o]}),h=this.api.tx.evm.call(o,ye,u,0n,fe,a+i,a+i,null,[]);return{hex:h.toHex(),name:"Withdraw",get:()=>h,dryRun:d=>this.dryRun(d,h)}}};var Me=class extends Z{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(e){return this._order=e,this}withBeneficiary(e){return this._beneficiary=e,this}withMaxRetries(e){return this._maxRetries=e,this}withSlippage(e){return this._slippagePct=e,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:e}=this.order;switch(e){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${e}`)}}buildDcaTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradePeriod:n,tradeRoute:a}=this.order,i=this.api.tx.dca.schedule({owner:this.beneficiary,period:n,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Sell:{assetIn:t,assetOut:r,amountIn:s.toFixed(),minAmountOut:"0",route:a}}},null);return this.wrapTx("DcaSchedule",i)}buildTwapSellTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:n,tradePeriod:a,tradeRoute:i}=this.order,o=z(n,this.slippagePct),l=n.minus(o),c=this.api.tx.dca.schedule({owner:this.beneficiary,period:a,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Sell:{assetIn:t,assetOut:r,amountIn:s.toFixed(),minAmountOut:l.toFixed(),route:i}}},null);return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:n,tradePeriod:a,tradeRoute:i}=this.order,o=z(s,this.slippagePct),l=s.plus(o),c=this.api.tx.dca.schedule({owner:this.beneficiary,period:a,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Buy:{assetIn:t,assetOut:r,amountOut:n.toFixed(),maxAmountIn:l.toFixed(),route:i}}},null);return this.wrapTx("DcaSchedule.twapBuy",c)}};var ge=class{api;evm;constructor(e,t){this.api=e,this.evm=t}trade(e){return new Ce(this.api,this.evm).setTrade(e)}order(e){return new Me(this.api,this.evm).setOrder(e)}};function mu(m){let e=new re(m),t=new xe(m),r=new ie(m,t),s=new $(t),n=new me(r),a=new de(n,{blockTime:e.blockTime,minBudgetInNative:e.minOrderBudget});return{api:{aave:s,router:n,scheduler:a},client:{asset:new V(m),balance:new L(m)},ctx:{pool:r},evm:t,tx:new ge(m,t),destroy:()=>{r.destroy()}}}export{qr as AMOUNT_MAX,Q as AaveClient,Be as AavePool,Ie as AavePoolClient,$ as AaveUtils,V as AssetClient,ot as AssetNotFound,ts as BASILISK_PARACHAIN_ID,L as BalanceClient,O as BigNumber,ie as CachingPoolService,re as ChainParams,Rt as DECIMAL_PLACES,Xe as DENOMINATOR,M as ERC20,xe as EvmClient,$e as FarmClient,X as H160,Se as HUB_ASSET_ID,rs as HYDRADX_PARACHAIN_ID,W as HYDRADX_SS58_PREFIX,ms as INFINITY,G as LbpMath,Ae as LbpPool,ve as LbpPoolClient,R as ONE,N as OmniMath,Ne as OmniPool,Fe as OmniPoolClient,k as PolkadotApiClient,at as PoolConfigNotFound,j as PoolError,ae as PoolFactory,Oe as PoolNotFound,ne as PoolService,E as PoolType,ut as ProviderConfigNotFound,ee as RUNTIME_DECIMALS,J as RouteNotFound,ce as Router,et as SYSTEM_ASSET_DECIMALS,D as SYSTEM_ASSET_ID,_ as StableMath,_e as StableSwap,De as StableSwapClient,lt as StorageConfigNotFound,ct as SubscriptionNotSupported,te as TRADEABLE_DEFAULT,bt as TradeOrderError,Je as TradeOrderType,U as TradeRouteBuilder,me as TradeRouter,de as TradeScheduler,Ke as TradeType,ge as TxBuilderFactory,Y as XykMath,Re as XykPool,Ee as XykPoolClient,S as ZERO,Nn as bnFormatter,p as bnum,Pt as calculateBuyFee,Kl as calculateDiffToAvg,ue as calculateDiffToRef,ht as calculateSellFee,mt as createChain,mu as createSdkContext,gt as findNestedKey,vn as findNestedObj,z as getFraction,vt as isEvmAccount,Nt as isEvmAddress,Ft as isSs58Address,v as scale,ps as toBn,x as toDecimals};
|
|
1
|
+
var ye=[{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 Ge=[{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 Ze="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",qe="0x112b087b60C1a166130d59266363C45F8aa99db0",We="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Z=1000000n;var Kr=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var Q=class{client;constructor(e){this.client=e.getWsProvider()}async getBlockTimestamp(){let e=await this.client.getBlock();return Number(e.timestamp)}async getReservesData(){return await this.client.readContract({abi:Ge,address:qe,args:[We],functionName:"getReservesData"})}async getUserReservesData(e){return await this.client.readContract({abi:Ge,address:qe,args:[We,e],functionName:"getUserReservesData"})}async getUserAccountData(e){return await this.client.readContract({abi:ye,address:Ze,args:[e],functionName:"getUserAccountData"})}};import{decodeAddress as Se,encodeAddress as et}from"@polkadot/util-crypto";import{hexToU8a as xt,isHex as Bt,u8aToHex as It}from"@polkadot/util";import{Buffer as H}from"buffer";var es=2090,He=1e3,fe="1",ts=2034,W=63,ee=18,D="0",Qe=12,te=15;var Xe="ETH\0";function At(m){if(!m)return!1;try{let e=Se(m,!0),t=H.from(Xe);return H.from(e.subarray(0,t.length)).equals(t)}catch{return!1}}function vt(m){return!!/^0x[a-fA-F0-9]{40}$/.test(m)}function Nt(m){try{let e=Bt(m)?xt(m):Se(m);return et(e),!0}catch{return!1}}var z=class m{static toAccount=e=>{let t=H.from(e.slice(2),"hex"),r=H.from(Xe);return et(new Uint8Array(H.concat([r,t,H.alloc(8)])),63)};static fromAccount=e=>{let t=Se(e),r=H.from(Xe),s=t.slice(r.length,-8);return"0x"+H.from(s).toString("hex")};static fromSS58=e=>{let r=Se(e).slice(0,20);return It(r)};static fromAny=e=>{if(vt(e))return e;if(At(e))return m.fromAccount(e);if(Nt(e))return m.fromSS58(e);throw new Error("Unknown address type")}};var q=class{static fromAssetId(e){let t=Number(e),r=Buffer.alloc(20,0);return r[15]=1,r.writeUInt32BE(t,16),"0x"+r.toString("hex")}static toAssetId(e){let t=Buffer.from(e.replace("0x",""),"hex");return t.length!==20||!this.isAssetAddress(e)?null:t.readUInt32BE(16)}static isAssetAddress(e){let t=Buffer.from("0000000000000000000000000000000100000000","hex"),r=Buffer.from(e.replace("0x",""),"hex");return r.length!==20?!1:r.subarray(0,16).equals(t.subarray(0,16))}};import{BigNumber as O}from"bignumber.js";var Ft=12;O.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:Ft});var S=p(0),R=p(1),cs=p("Infinity");function v(m,e){let t=new O(e.toString()),r=new O(10).pow(t);return m.times(r)}function p(m){return new O(m.toString())}function ms(m,e){let t=p(m);return v(t,e)}function x(m,e){return m.shiftedBy(-1*e).toString()}var Te=p("1e27"),Rt=p("1.01"),Et=p("31536000"),Y=class{client;constructor(e){this.client=new Q(e)}async getSummary(e){let t=z.fromAny(e),[r,s,n,a]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(t),this.client.getUserAccountData(t),this.client.getBlockTimestamp()]),[i]=r,[o,l]=s,[u,c,h,d,g,b]=n,P=p(b).dividedBy(1e18).decimalPlaces(6,O.ROUND_DOWN),T=p(u),f=p(c),I=[];for(let B of o){let w=B.underlyingAsset.toLowerCase(),A=i.find(({underlyingAsset:Ot})=>Ot.toLowerCase()===w);if(!A)throw new Error("Missing pool reserve for "+w);let F=p(B.scaledATokenBalance),U=p(A.liquidityIndex),he=p(A.liquidityRate),Pe=p(A.priceInMarketReferenceCurrency),Me=a+6,Le=this.calculateLinearInterest(he,A.lastUpdateTimestamp,Me),Ue=U.multipliedBy(Le).dividedBy(Te).decimalPlaces(0,O.ROUND_DOWN),be=F.multipliedBy(Ue).dividedBy(Te).decimalPlaces(0,O.ROUND_DOWN),St=p(l===A.eModeCategoryId?A.eModeLiquidationThreshold:A.reserveLiquidationThreshold).div(1e4),Tt=A.usageAsCollateralEnabled&&B.usageAsCollateralEnabledOnUser&&p(B.scaledATokenBalance).gt(0),wt=q.toAssetId(w);I.push({aTokenBalance:be,decimals:Number(A.decimals),isCollateral:Tt,priceInRef:Pe,reserveId:wt,reserveAsset:w,reserveLiquidationThreshold:St})}return{healthFactor:P.toNumber(),totalCollateral:T,totalDebt:f,reserves:I}}async hasBorrowPositions(e){let t=z.fromAny(e),r=await this.client.getUserAccountData(t),[s,n]=r;return n>0n}async getHealthFactor(e){let t=z.fromAny(e),r=await this.client.getUserAccountData(t),[s,n,a,i,o,l]=r;return p(l).dividedBy(1e18).decimalPlaces(6,O.ROUND_DOWN).toNumber()}async getHealthFactorAfterWithdraw(e,t,r){let{totalCollateral:s,totalDebt:n,reserves:a}=await this.getSummary(e),i=q.fromAssetId(t),o=a.find(T=>T.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,isCollateral:u,priceInRef:c,reserveLiquidationThreshold:h}=o,d=v(p(r),l).decimalPlaces(0,1),g=u?d.multipliedBy(c).dividedBy(p(10).pow(l)).decimalPlaces(0,O.ROUND_DOWN):S,b=s.minus(g);return b.lte(0)?0:b.multipliedBy(h).dividedBy(n).decimalPlaces(6,O.ROUND_DOWN).toNumber()}async getHealthFactorAfterSupply(e,t,r){let{totalCollateral:s,totalDebt:n,reserves:a}=await this.getSummary(e),i=q.fromAssetId(t),o=a.find(P=>P.reserveAsset===i);if(!o)throw new Error("Missing reserve ctx for "+i);let{decimals:l,priceInRef:u,reserveLiquidationThreshold:c}=o,d=v(p(r),l).decimalPlaces(0,1).multipliedBy(u).dividedBy(p(10).pow(l)).decimalPlaces(0,O.ROUND_DOWN),g=s.plus(d);return g.lte(0)?0:g.multipliedBy(c).dividedBy(n).decimalPlaces(6,O.ROUND_DOWN).toNumber()}async getMaxWithdraw(e,t){let{totalCollateral:r,totalDebt:s,reserves:n}=await this.getSummary(e),a=q.fromAssetId(t),i=n.find(o=>o.reserveAsset===a);if(!i)throw new Error("Missing reserve ctx for "+a);return this.calculateWithdrawMax(i,r,s)}async getMaxWithdrawAll(e){let{totalCollateral:t,totalDebt:r,reserves:s}=await this.getSummary(e),n={};for(let a of s){let i=this.calculateWithdrawMax(a,t,r);a.reserveId&&(n[a.reserveId]=i)}return n}calculateWithdrawMax(e,t,r){let{aTokenBalance:s,decimals:n,priceInRef:a,reserveLiquidationThreshold:i}=e,o=Rt.multipliedBy(r).div(i).decimalPlaces(0,O.ROUND_UP),l=t.minus(o).decimalPlaces(0,1);if(l.lte(0))return{amount:S,decimals:n};let u=l.multipliedBy(p(10).pow(n)).dividedBy(a).decimalPlaces(0,O.ROUND_DOWN);return{amount:O.minimum(s,u),decimals:n}}calculateLinearInterest(e,t,r){let s=r-t;return s<=0?Te:e.multipliedBy(s).dividedBy(Et).plus(Te).decimalPlaces(0,O.ROUND_DOWN)}};function tt(m){switch(m){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}import"@galacticcouncil/api-augment/hydradx";import"@galacticcouncil/api-augment/basilisk";var k=class{api;constructor(e){this.api=e}get chainDecimals(){return this.api.registry.chainDecimals[0]}get chainToken(){return this.api.registry.chainTokens[0]}log(e,...t){let r=typeof window>"u"?process.env.GC_DEBUG:window.localStorage.getItem("gc.debug");tt(r)&&console.log(e,...t)}};var $=class extends k{SUPPORTED_TYPES=["StableSwap","Bond","Token","External","Erc20"];constructor(e){super(e)}async safeSharesQuery(){try{let e=await this.api.query.stableswap.pools.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}async safeBondsQuery(){try{let e=await this.api.query.bonds.bonds.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}async metadataQuery(){try{let e=await this.api.query.assetRegistry.assetMetadataMap.entries();return new Map(e.map(([{args:[t]},r])=>{let{decimals:s,symbol:n}=r.unwrap();return[t.toString(),{decimals:s.toNumber(),symbol:n.toHuman()}]}))}catch{return new Map([])}}async locationsQuery(){try{let e=await this.api.query.assetRegistry.assetLocations.entries();return new Map(e.map(([{args:[t]},r])=>[t.toString(),r.unwrap()]))}catch{return new Map([])}}getSystemTokenName(e){switch(e){case"HDX":return"Hydration";case"BSX":return"Basilisk";default:return e}}getToken(e,t,r,s){if(e==D){let c=this.api.consts.balances.existentialDeposit;return{id:D,name:this.getSystemTokenName(this.chainToken),symbol:this.chainToken,decimals:this.chainDecimals,icon:this.chainToken,type:"Token",isSufficient:!0,existentialDeposit:c.toString()}}let{name:n,assetType:a,isSufficient:i,existentialDeposit:o}=t,{symbol:l,decimals:u}=r.get(e)??{};return{id:e,name:n.toHuman(),symbol:l,decimals:u,icon:l,type:a.toHuman(),isSufficient:i?i.toHuman():!0,location:s?.toJSON(),existentialDeposit:o.toString()}}getBond(e,t,r,s){let[n,a]=s,{assetType:i,isSufficient:o,existentialDeposit:l}=t,{symbol:u,decimals:c}=this.getToken(n.toString(),t,r),h=a.toNumber(),d=new Intl.DateTimeFormat("en-GB"),g=[u,"Bond",d.format(h)].join(" ");return{id:e,name:g,symbol:u+"b",decimals:c,icon:u,type:i.toString(),isSufficient:o.toHuman(),existentialDeposit:l.toString(),underlyingAssetId:n.toString(),maturity:h}}getShares(e,t,r,s){let{assets:n}=s,{name:a,symbol:i,assetType:o,isSufficient:l,existentialDeposit:u}=t,h=n.map(b=>b.toString()).map(b=>{let{symbol:P}=this.getToken(b,t,r);return[b,P]}),d=Object.fromEntries(h),g=Object.values(d);return{id:e,name:g.join(", "),symbol:i?.isSome?i.toHuman():a.toHuman(),decimals:18,icon:g.join("/"),type:o.toString(),isSufficient:l.toHuman(),existentialDeposit:u.toString(),meta:d}}getExternal(e,t,r,s){let n=this.getToken(e,t,new Map,s),a=r?.find(i=>i.internalId===n.id);return a?{...n,decimals:a.decimals,name:a.name,symbol:a.symbol,icon:a.symbol,isWhiteListed:a.isWhiteListed}:n}normalizeMetadata(e,t){return t.size?t:new Map(e.map(([{args:[r]},s])=>{let{decimals:n,symbol:a}=s.unwrap();return[r.toString(),{decimals:Number(n.toString()),symbol:a.toHuman()}]}))}getSupportedAssets(e){return e.filter(([t,r])=>{if(r.isNone)return!1;let s=r.unwrap();return this.isSupportedAsset(s)})}async getOnChainAssets(e,t){let[r,s,n,a,i]=await Promise.all([this.api.query.assetRegistry.assets.entries(),this.locationsQuery(),this.safeSharesQuery(),this.safeBondsQuery(),this.metadataQuery()]),o=this.getSupportedAssets(r),l=this.normalizeMetadata(o,i),u=o.map(([{args:[c]},h])=>{let d=h.unwrap(),g=s.get(c.toString()),{assetType:b}=d;switch(b.toString()){case"Bond":let P=a.get(c.toString());return this.getBond(c.toString(),d,l,P);case"StableSwap":let T=n.get(c.toString());return this.getShares(c.toString(),d,l,T);case"External":return this.getExternal(c.toString(),d,t,g);default:return this.getToken(c.toString(),d,l,g)}});return e?u:u.filter(c=>this.isValidAsset(c))}isValidAsset(e){let t=Math.sign(e.decimals);return!!e.symbol&&(t===0||t===1)}isSupportedAsset(e){let t=e.assetType.toString();return this.SUPPORTED_TYPES.includes(t)}};var M=class extends k{constructor(e){super(e)}async getBalance(e,t){let r=await this.api.query.assetRegistry.assets(t),{assetType:s}=r.unwrap();return s.toString()==="Erc20"?this.getErc20Balance(e,t):t===D?this.getSystemBalance(e):this.getTokenBalance(e,t)}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateFreeBalance(t)}async getTokenBalance(e,t){let{free:r,reserved:s,frozen:n}=await this.api.query.tokens.accounts(e,t);return this.calculateFreeBalance({free:r,feeFrozen:s,frozen:n})}async getErc20Balance(e,t){let{free:r,reserved:s,frozen:n}=await this.getTokenBalanceData(e,t);return this.calculateFreeBalance({free:r,feeFrozen:0n,frozen:n})}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t(D,this.calculateFreeBalance(r)))}async subscribeTokenBalance(e,t,r){let s=await this.api.query.tokens.accounts.keys(e),n=r?r.map(a=>[e,a]):s.map(({args:[a,i]})=>[a.toString(),i.toString()]);return this.api.query.tokens.accounts.multi(n,a=>{let i=[];a.forEach((o,l)=>{let u=this.calculateFreeBalance(o),c=n[l][1];i.push([c,u])}),t(i)})}async subscribeErc20Balance(e,t,r){let n=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([o,l])=>{let{assetType:u}=l.unwrap();return u.toString()==="Erc20"}).map(([{args:[o]}])=>o.toString()))(),a=async()=>{let i=await Promise.all(n.map(async o=>[o,await this.getErc20Balance(e,o)]));t(i)};return this.api.rpc.chain.subscribeNewHeads(async()=>{a()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateFreeBalance(e){let{free:t,miscFrozen:r,feeFrozen:s,frozen:n}=e,a=new O(t),i=new O(r||n),o=new O(s||0n),l=i.gt(o)?i:o;return a.minus(l)}};var re=class{api;_minOrderBudget;_blockTime;constructor(e){this.api=e}get blockTime(){return this._blockTime===void 0&&(this._blockTime=this.api.consts.aura.slotDuration.toNumber()),this._blockTime}get minOrderBudget(){return this._minOrderBudget===void 0&&(this._minOrderBudget=this.api.consts.dca.minBudgetInNativeCurrency.toString()),p(this._minOrderBudget)}};import{fixed_from_rational as rt}from"@galacticcouncil/math-liquidity-mining";import{GenericAccountId32 as _t}from"@polkadot/types";import{u8aConcat as st}from"@polkadot/util";import{isAddress as nt}from"@polkadot/util-crypto";var Ye=class extends k{balanceClient;constructor(e){super(e),this.balanceClient=new M(e)}secondsInYear=new O(365.2425).times(24).times(60).times(60);async getOmnipoolFarms(e){let t=await this.api.query.omnipoolWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,n])=>{let[,a]=s.args,i=n.unwrap().toString(),o=a.toString(),l=(await this.api.query.omnipoolWarehouseLM.globalFarm(o)).unwrap(),u=(await this.api.query.omnipoolWarehouseLM.yieldFarm(e,o,i)).unwrap(),c=await this.getOraclePrice(l)??l.priceAdjustment.toString(),d=this.getAccountResolver(this.api.registry)(Number(o),!1).toString(),g=l.rewardCurrency.toString(),b=await this.balanceClient.getTokenBalanceData(d,g);return{assetId:e,globalFarm:l,yieldFarm:u,priceAdjustment:c,potBalance:b.free.toString()}}))}async getIsolatedPoolFarms(e){let t=await this.api.query.xykWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,n])=>{let[,a]=s.args,i=n.unwrap().toString(),o=a.toString(),l=(await this.api.query.xykWarehouseLM.globalFarm(o)).unwrap(),u=(await this.api.query.xykWarehouseLM.yieldFarm(e,o,i)).unwrap(),c=await this.getOraclePrice(l)??l.priceAdjustment.toString(),d=this.getAccountResolver(this.api.registry)(Number(o),!0).toString(),g=l.rewardCurrency.toString(),b=await this.balanceClient.getTokenBalanceData(d,g);return{assetId:e,globalFarm:l,yieldFarm:u,priceAdjustment:c,potBalance:b.free.toString()}}))}async getOraclePrice(e){let t=e.rewardCurrency.toString(),r=e.incentivizedAsset.toString(),s=[t,r].sort();if(t===r)return new O(1).shiftedBy(18).toString();let n=await this.api.query.emaOracle.oracles("omnipool",s,"TenMinutes");if(n.isNone)return;let[a]=n.unwrap(),i=a.price.n.toString(),o=a.price.d.toString(),l;return Number(t)<Number(r)?l=rt(i,o):l=rt(o,i),l}getGlobalRewardPerPeriod(e,t,r,s){let a=e.times(t).shiftedBy(-18).times(s).shiftedBy(-18);return a.gte(r)?r:a}getPoolYieldPerPeriod(e,t,r,s){return e.times(t).div(r.times(s).shiftedBy(-18))}padEndU8a(e,t){return st(e,Array(Math.max(0,t-e.length)).fill(0))}getAccountResolver=e=>(t,r)=>{let s="modl",n=r?"0x78796b4c4d704944":"0x4f6d6e6957684c4d";return new _t(e,this.padEndU8a(st(s,n,typeof t!="number"?t.toU8a():[t]),32))};async getFarmApr(e,t){if(t==="isolatedpool"&&!nt(e))throw new Error("You must pass an address of isolated pool as id");if(t==="omnipool"&&nt(e))throw new Error("You must pass an asset id of omnipool");let r=6,s=t==="omnipool"?await this.getOmnipoolFarms(e):await this.getIsolatedPoolFarms(e);return s.length?s.map(({yieldFarm:i,globalFarm:o,priceAdjustment:l,potBalance:u})=>{let c=new O(o.totalSharesZ.toString()),h=o.plannedYieldingPeriods.toString(),d=new O(o.yieldPerPeriod.toString()),g=new O(o.maxRewardPerPeriod.toString()),b=o.blocksPerPeriod.toString(),P=new O(i.multiplier.toString()).shiftedBy(-18),T=this.secondsInYear.div(new O(r).times(b)),f;if(c.isZero())f=d.times(P).times(T);else{let F=this.getGlobalRewardPerPeriod(c,d,g,l);f=this.getPoolYieldPerPeriod(F,P,c,l).times(T)}let I=new O(o.pendingRewards.toString()).plus(o.accumulatedPaidRewards.toString()),B=g.times(h),w=u?I.plus(u):B;return I.div(w).gte(.999)?S:f.div(t==="isolatedpool"?2:1).times(100)}).reduce((i,o)=>i.plus(o),S).toString():void 0}};var we=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},it=class extends Error{constructor(e,t){super(),this.message=`${e} pool missing ${t}`,this.name="PoolConfigNotFound"}},K=class extends Error{constructor(e,t){super(),this.message=`Route from ${e} to ${t} not found in pool configuration`,this.name="RouteNotFound"}},at=class extends Error{constructor(e){super(),this.message=`Asset ${e} not available in current network`,this.name="AssetNotFound"}},ot=class extends Error{constructor(e){super(),this.message=`Storage missing ${e}`,this.name="StorageConfigNotFound"}},lt=class extends Error{constructor(e){super(),this.message=`Subscription type "${e}" not supported`,this.name="SubscriptionNotSupported"}},ut=class extends Error{constructor(e){super(),this.message=`${e}`,this.name="ProviderConfigNotFound"}};import{defineChain as Dt}from"viem";var kt=["wss://hydration-rpc.n.dwellir.com","wss://hydration.dotters.network","wss://rpc.helikon.io/hydradx","wss://hydration.ibp.network","wss://rpc.cay.hydration.cloud","wss://rpc.parm.hydration.cloud","wss://rpc.roach.hydration.cloud","wss://rpc.zipp.hydration.cloud","wss://rpc.sin.hydration.cloud","wss://rpc.coke.hydration.cloud"],ct=m=>{let e=m.__internal__endpoints,t=e.some(s=>kt.includes(s)),r=e.map(s=>s.replace("wss://","https://").replace("ws://","http://"));return Dt({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:r}},blockExplorers:{default:{name:"Hydration Explorer",url:t?"https://explorer.evm.hydration.cloud":"https://explorer.nice.hydration.cloud"}},testnet:!t})};import{createPublicClient as pt,createWalletClient as Ct,custom as Mt,http as Lt}from"viem";function mt(m){let e=async({method:t,params:r})=>{let s=Array.isArray(r)?r:[];return m.send(t,s)};return()=>({request:e,config:{name:"PolkadotWsTransport",type:"webSocket",key:"polkadotWs",request:e}})}var Oe=class{wsProvider;chain;constructor(e){let{provider:t}=e._options;this.wsProvider=t,this.chain=ct(t)}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return pt({chain:this.chain,transport:Lt()})}getWsProvider(){return pt({chain:this.chain,transport:mt(this.wsProvider)})}getSigner(e){return Ct({account:e,chain:this.chain,transport:Mt(window.ethereum)})}};import{LRUCache as qr}from"@thi.ng/cache";import{memoize1 as Gr}from"@thi.ng/memoize";var E=(n=>(n.Aave="Aave",n.LBP="Lbp",n.Omni="Omnipool",n.Stable="Stableswap",n.XYK="Xyk",n))(E||{}),J=(n=>(n.UnknownError="UnknownError",n.InsufficientTradingAmount="InsufficientTradingAmount",n.MaxInRatioExceeded="MaxInRatioExceeded",n.MaxOutRatioExceeded="MaxOutRatioExceeded",n.TradeNotAllowed="TradeNotAllowed",n))(J||{});var xe=class m{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new m(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit)}constructor(e,t,r,s,n){this.type="Aave",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=n}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(o=>[o.id,o])),s=r.get(e),n=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),i=p(n.balance);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:n.decimals,balanceIn:a,balanceOut:i,assetInED:S,assetOutED:S}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),n=[];return t.isGreaterThan(e.balanceOut)&&n.push("TradeNotAllowed"),{amountIn:s,calculatedIn:s,amountOut:t,feePct:0,errors:n}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),n=[];return s.isGreaterThan(e.balanceOut)&&n.push("TradeNotAllowed"),{amountIn:t,calculatedOut:s,amountOut:s,feePct:0,errors:n}}calculateInGivenOut(e,t){return t}calculateOutGivenIn(e,t){return t}spotPriceInGivenOut(e){return v(R,e.decimalsOut)}spotPriceOutGivenIn(e){return v(R,e.decimalsIn)}calculateTradeFee(e,t){return S}};import{encodeAddress as qt}from"@polkadot/util-crypto";import{stringToU8a as Wt}from"@polkadot/util";import{decodeEventLog as Ht}from"viem";function dt(m,e){let t=[];return JSON.stringify(m,(r,s)=>(s&&s[e]&&t.push(s),s)),t[0]}function An(m,e,t){let r;return JSON.stringify(m,(s,n)=>(n&&n[e]===t&&(r=n),n)),r}var vn=(m,e)=>typeof e=="bigint"?e.toString():e;import{memoize1 as Ut}from"@thi.ng/memoize";import{TLRUCache as Gt}from"@thi.ng/cache";var $e=[{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 se=class{client;constructor(e){this.client=e.getWsProvider()}async getData(e,t=6){let[r,s,n]=await Promise.all([this.client.readContract({abi:$e,address:e,functionName:"latestRoundData"}),this.client.readContract({abi:$e,address:e,functionName:"decimals"}),this.client.getBlock()]),[a,i,o,l]=r,u=n.number-(n.timestamp-l)/BigInt(t),c=Number(u);return{price:i,decimals:s,updatedAt:c<0?0:c}}};var C=class extends M{evm;mmOracle;pools=[];subs=[];assets=new Map([]);mem=0;memPoolsCache=new Gt(null,{maxlen:1,ttl:1*60*60*1e3,release:e=>{this.mem>e&&this.log(this.getPoolType(),`mem ${e} released at`,new Date)}});memPools=Ut(e=>(this.log(this.getPoolType(),`mem ${e} sync`),this.getPools()),this.memPoolsCache);constructor(e,t){super(e),this.evm=t,this.mmOracle=new se(t)}get augmentedPools(){return this.pools.filter(e=>this.isValidPool(e)).map(e=>this.withMetadata(e))}async withAssets(e){this.assets=new Map(e.map(t=>[t.id,t])),this.mem=this.mem+1}async getPoolsMem(){return await this.memPools(this.mem)}async getPools(){this.unsubscribe(),this.pools=await this.loadPools(),this.subs=this.subscribe();let e=this.getPoolType();return this.log(e,`mem ${this.mem} pools(${this.augmentedPools.length})`),this.log(e,`mem ${this.mem} subs(${this.subs.length})`),this.augmentedPools}subscribe(){return this.augmentedPools.map(t=>{let r=[];try{let n=this.subscribePoolChange(t);r.push(n)}catch{}if(t.type==="Aave")return r;let s=this.subscribeTokensPoolBalance(t);if(r.push(s),this.hasSystemAsset(t)){let n=this.subscribeSystemPoolBalance(t);r.push(n)}if(this.hasErc20Asset(t)){let n=this.subscribeErc20PoolBalance(t);r.push(n)}return this.subscribeLog(t),r}).flat()}hasSystemAsset(e){return e.tokens.some(t=>t.id==="0")}hasErc20Asset(e){return e.tokens.some(t=>t.type==="Erc20")}unsubscribe(){this.subs.forEach(e=>{e.then(t=>t())})}subscribeLog(e){let t=e.address.substring(0,10).concat("...");this.log(`${e.type} mem ${this.mem} [${t}] balance subscribed`)}subscribeSystemPoolBalance(e){return this.subscribeSystemBalance(e.address,this.updateBalanceCallback(e))}subscribeTokensPoolBalance(e){let t=(r,s)=>r.id!==s;return this.subscribeTokenBalance(e.address,this.updateBalancesCallback(e,t))}subscribeErc20PoolBalance(e){let t=e.tokens.filter(r=>r.type==="Erc20").map(r=>r.id);return this.subscribeErc20Balance(e.address,this.updateBalancesCallback(e,()=>!0),t)}isValidPool(e){return e.type==="Xyk"?e.tokens.every(t=>this.assets.get(t.id)):!0}withMetadata(e){return e.tokens=e.tokens.map(t=>{let r=this.assets.get(t.id);return{...t,...r}}),e}updateBalancesCallback(e,t){return function(r){r.forEach(([s,n])=>{let a=e.tokens.findIndex(i=>i.id==s);a>=0&&t(e,s)&&(e.tokens[a].balance=n.toString())})}}updateBalanceCallback(e){return function(t,r){let s=e.tokens.findIndex(n=>n.id==t);s>=0&&(e.tokens[s].balance=r.toString())}}};var Xt=["Supply","Withdraw","Repay","Borrow"],Be=class extends C{isSupported(){return this.api.call.aaveTradeExecutor.pools!==void 0}async loadPools(){return(await this.api.call.aaveTradeExecutor.pools()).map(({reserve:t,atoken:r,liqudityIn:s,liqudityOut:n})=>({address:this.getPoolId(t.toString(),r.toString()),type:"Aave",tokens:[{id:t.toString(),balance:s.toString()},{id:r.toString(),balance:n.toString()}],...this.getPoolLimits()}))}async getPoolFees(e,t){return{}}getPoolType(){return"Aave"}getPoolId(e,t){let r=e+"/"+t;return qt(Wt(r.padEnd(32,"\0")),63)}subscribePoolChange(e){let[t,r]=e.tokens,s=this.getReserveH160Id(t);return this.api.query.system.events(n=>{n.forEach(a=>{let{event:i}=a,o=`${i.section}:${i.method}`;if(o==="router:Executed"){let{assetIn:l,assetOut:u}=i.data.toHuman(),c=l.replace(/,/g,""),h=u.replace(/,/g,"");(c===r.id||h===r.id)&&(this.log(`Sync AAVE [router:Executed] :: ${c}:${h}`),this.updatePoolState(e))}if(o==="evm:Log"){let{log:l}=i.data.toHuman();try{let{eventName:u,args:c}=Ht({abi:ye,topics:l.topics,data:l.data});Xt.includes(u)&&c.reserve.toLowerCase()===s.toLowerCase()&&(this.log(`Sync AAVE [evm:Log] :: ${u} ${t.symbol}(${t.id})`),this.updatePoolState(e))}catch{}}})})}async updatePoolState(e){let[t,r]=e.tokens,{liqudityIn:s,liqudityOut:n}=await this.api.call.aaveTradeExecutor.pool(t.id,r.id);e.tokens=e.tokens.map(a=>{let i=a.id===t.id?s.toString():n.toString();return{...a,balance:i}})}getReserveH160Id(e){return e.type==="Erc20"?dt(e.location,"accountKey20").accountKey20.key:q.fromAssetId(e.id)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:0}}};import{calculate_in_given_out as Yt,calculate_out_given_in as $t,calculate_linear_weights as Vt,calculate_pool_trade_fee as zt,get_spot_price as Kt}from"@galacticcouncil/math-lbp";var G=class{static getSpotPrice(e,t,r,s,n){return Kt(e,t,r,s,n)}static calculateInGivenOut(e,t,r,s,n){return Yt(e,t,r,s,n)}static calculateOutGivenIn(e,t,r,s,n){return $t(e,t,r,s,n)}static calculateLinearWeights(e,t,r,s,n){return Vt(e,t,r,s,n)}static calculatePoolTradeFee(e,t,r){return zt(e,t,r)}};var y=class{static toPct(e){return e[0]/e[1]*100}static toDecimals(e){return e[0]/e[1]}static fromPermill(e){return[e/1e3,1e3]}};var Ie=class m{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(e){return new m(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.fee,e.repayFeeApply)}constructor(e,t,r,s,n,a,i){this.type="Lbp",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=n,this.fee=a,this.repayFeeApply=i}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(o=>[o.id,o])),s=r.get(e),n=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),i=p(n.balance);return{assetIn:e,assetOut:t,balanceIn:a,balanceOut:i,decimalsIn:s.decimals,decimalsOut:n.decimals,weightIn:s.weight,weightOut:n.weight}}validateAndBuy(e,t,r){let s=this.tokens[0].id,n=[];t.isLessThan(this.minTradingLimit)&&n.push("InsufficientTradingAmount");let a=e.balanceOut.div(this.maxOutRatio);if(t.isGreaterThan(a)&&n.push("MaxOutRatioExceeded"),s===e.assetOut){let i=this.calculateTradeFee(t,r),o=y.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),l=t.plus(i),u=this.calculateInGivenOut(e,l),c=e.balanceIn.div(this.maxInRatio);return u.isGreaterThan(c)&&n.push("MaxInRatioExceeded"),{amountIn:u,calculatedIn:u,amountOut:t,feePct:o,errors:n}}else{let i=this.calculateInGivenOut(e,t),o=e.balanceIn.div(this.maxInRatio);return i.isGreaterThan(o)&&n.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:i,amountOut:t,feePct:0,errors:n}}}validateAndSell(e,t,r){let s=this.tokens[0].id,n=[];t.isLessThan(this.minTradingLimit)&&n.push("InsufficientTradingAmount");let a=e.balanceIn.div(this.maxInRatio);if(t.isGreaterThan(a)&&n.push("MaxInRatioExceeded"),s===e.assetIn){let i=this.calculateOutGivenIn(e,t),o=e.balanceOut.div(this.maxOutRatio);return i.isGreaterThan(o)&&n.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:i,amountOut:i,feePct:0,errors:n}}else{let i=this.calculateOutGivenIn(e,t),o=this.calculateTradeFee(i,r),l=y.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),u=i.minus(o),c=e.balanceOut.div(this.maxOutRatio);return u.isGreaterThan(c)&&n.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:i,amountOut:u,feePct:l,errors:n}}}calculateInGivenOut(e,t){let r=G.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?S:s}calculateOutGivenIn(e,t){let r=G.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?S:s}spotPriceInGivenOut(e){let t=G.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),v(R,e.decimalsOut).toString());return p(t)}spotPriceOutGivenIn(e){let t=G.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),v(R,e.decimalsIn).toString());return p(t)}calculateTradeFee(e,t){let r=G.calculatePoolTradeFee(e.toString(),this.repayFeeApply?t.repayFee[0]:t.exchangeFee[0],this.repayFeeApply?t.repayFee[1]:t.exchangeFee[1]);return p(r)}};var Ae=class extends C{MAX_FINAL_WEIGHT=v(p(100),6);poolsData=new Map([]);isSupported(){return this.api.query.lbp!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.lbp.poolData.entries(),this.api.query.parachainSystem.validationData()]),{relayParentNumber:r}=t.unwrap(),s=e.filter(([n,a])=>this.isActivePool(a.unwrap(),r)).map(async([{args:[n]},a])=>{let i=a.unwrap(),o=n.toString(),l=await this.getPoolDelta(o,i,r.toString());return this.poolsData.set(n.toString(),i),{address:o,type:"Lbp",fee:i.fee.toJSON(),...l,...this.getPoolLimits()}});return Promise.all(s)}async getPoolFees(e,t){let r=this.pools.find(s=>s.address===t);return{repayFee:this.getRepayFee(),exchangeFee:r.fee}}getPoolType(){return"Lbp"}async subscribePoolChange(e){return this.api.query.parachainSystem.validationData(async t=>{let{relayParentNumber:r}=t.unwrap(),s=this.poolsData.get(e.address);if(this.isActivePool(s,r)){let a=await this.getPoolDelta(e.address,s,r.toString());Object.assign(e,a)}else{let a=this.pools.findIndex(i=>i.address==e.address);this.pools.splice(a,1)}})}async getPoolDelta(e,t,r){let{start:s,end:n,assets:a,initialWeight:i,finalWeight:o,repayTarget:l,feeCollector:u}=t,c=G.calculateLinearWeights(s.toString(),n.toString(),i.toString(),o.toString(),r),[h,d]=a,g=h.toString(),b=p(c),P=d.toString(),T=this.MAX_FINAL_WEIGHT.minus(p(b)),[f,I,B]=await Promise.all([this.isRepayFeeApplied(g,l.toString(),u.toString()),this.getBalance(e,g),this.getBalance(e,P)]);return{repayFeeApply:f,tokens:[{id:g,weight:b,balance:I.toString()},{id:P,weight:T,balance:B.toString()}]}}isActivePool(e,t){if(e.start.isEmpty||e.end.isEmpty)return!1;let r=e.start.unwrap().toNumber(),s=e.end.unwrap().toNumber();return t.toNumber()>=r&&t.toNumber()<s}async isRepayFeeApplied(e,t,r){let s=p(t);if(s.isZero())return!1;try{return(await this.getBalance(e,r)).isLessThan(s)}catch{return!0}}getRepayFee(){return this.api.consts.lbp.repayFee.toJSON()}getPoolLimits(){let e=this.api.consts.lbp.maxInRatio.toJSON(),t=this.api.consts.lbp.maxOutRatio.toJSON(),r=this.api.consts.lbp.minTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};import{calculate_in_given_out as Jt,calculate_lrna_in_given_out as jt,calculate_out_given_in as Zt,calculate_out_given_lrna_in as Qt,calculate_pool_trade_fee as er,calculate_spot_price as tr,calculate_lrna_spot_price as rr,calculate_shares as sr,calculate_liquidity_out as nr,calculate_liquidity_lrna_out as ir,calculate_liquidity_hub_in as ar,is_sell_allowed as or,is_buy_allowed as lr,is_add_liquidity_allowed as ur,is_remove_liquidity_allowed as cr,recalculate_asset_fee as mr,recalculate_protocol_fee as pr,verify_asset_cap as dr}from"@galacticcouncil/math-omnipool";var N=class{static calculateSpotPrice(e,t,r,s){return tr(e,t,r,s)}static calculateLrnaSpotPrice(e,t){return rr(e,t)}static calculateInGivenOut(e,t,r,s,n,a,i,o,l){return Jt(e,t,r,s,n,a,i,o,l)}static calculateLrnaInGivenOut(e,t,r,s,n){return jt(e,t,r,s,n)}static calculateOutGivenIn(e,t,r,s,n,a,i,o,l){return Zt(e,t,r,s,n,a,i,o,l)}static calculateOutGivenLrnaIn(e,t,r,s,n){return Qt(e,t,r,s,n)}static calculatePoolTradeFee(e,t,r){return er(e,t,r)}static calculateShares(e,t,r,s){return sr(e,t,r,s)}static calculateLiquidityOut(e,t,r,s,n,a,i,o){return nr(e,t,r,s,n,a,i,o)}static calculateLiquidityLRNAOut(e,t,r,s,n,a,i,o){return ir(e,t,r,s,n,a,i,o)}static calculateCapDifference(e,t,r,s){let n=O(t),a=O(e),i=O(s),l=O(r).shiftedBy(-18);if(n.div(i).lt(l)){let c=l.times(i).minus(n).times(a),h=n.times(O(1).minus(l));return c.div(h).toFixed(0)}else return"0"}static calculateLimitHubIn(e,t,r,s){return ar(e,t,r,s)}static isSellAllowed(e){return or(e)}static isBuyAllowed(e){return lr(e)}static isAddLiquidityAllowed(e){return ur(e)}static isRemoveLiquidityAllowed(e){return cr(e)}static recalculateAssetFee(e,t,r,s,n,a,i,o,l,u,c){return mr(e,t,r,s,n,a,i,o,l,u,c)}static recalculateProtocolFee(e,t,r,s,n,a,i,o,l,u,c){return pr(e,t,r,s,n,a,i,o,l,u,c)}static verifyAssetCap(e,t,r,s){return dr(e,t,r,s)}};var ve=class m{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(e){return new m(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.hubAssetId)}constructor(e,t,r,s,n,a){this.type="Omnipool",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=n,this.hubAssetId=a}validatePair(e,t){return this.hubAssetId!=t}parsePair(e,t){let r=new Map(this.tokens.map(u=>[u.id,u])),s=r.get(e),n=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),i=p(n.balance),o=p(s.existentialDeposit),l=p(n.existentialDeposit);return{assetIn:e,assetOut:t,hubReservesIn:s.hubReserves,hubReservesOut:n.hubReserves,sharesIn:s.shares,sharesOut:n.shares,decimalsIn:s.decimals,decimalsOut:n.decimals,balanceIn:a,balanceOut:i,tradeableIn:s.tradeable,tradeableOut:n.tradeable,assetInED:o,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),n=this.calculateInGivenOut(e,t,r),a=n.minus(s),i=s===S?S:a.div(s).multipliedBy(100).decimalPlaces(2),o=[],l=N.isSellAllowed(e.tradeableIn),u=N.isBuyAllowed(e.tradeableOut);(!l||!u)&&o.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&o.push("InsufficientTradingAmount");let c=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(c)&&o.push("MaxOutRatioExceeded");let h=e.balanceIn.div(this.maxInRatio);return n.isGreaterThan(h)&&o.push("MaxInRatioExceeded"),{amountIn:n,calculatedIn:s,amountOut:t,feePct:i.toNumber(),errors:o}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),n=this.calculateOutGivenIn(e,t,r),i=s.minus(n).div(s).multipliedBy(100).decimalPlaces(2),o=[],l=N.isSellAllowed(e.tradeableIn),u=N.isBuyAllowed(e.tradeableOut);(!l||!u)&&o.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&o.push("InsufficientTradingAmount");let c=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(c)&&o.push("MaxInRatioExceeded");let h=e.balanceOut.div(this.maxOutRatio);return n.isGreaterThan(h)&&o.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:n,feePct:i.toNumber(),errors:o}}calculateInGivenOut(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(e,t,r);let s=N.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?y.toDecimals(r.assetFee).toString():S.toString(),r?y.toDecimals(r.protocolFee).toString():S.toString()),n=p(s);return n.isNegative()?S:n}calculateLrnaInGivenOut(e,t,r){let s=N.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?y.toDecimals(r.assetFee).toString():S.toString()),n=p(s);return n.isNegative()?S:n}calculateOutGivenIn(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,r);let s=N.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?y.toDecimals(r.assetFee).toString():S.toString(),r?y.toDecimals(r.protocolFee).toString():S.toString()),n=p(s);return n.isNegative()?S:n}calculateOutGivenLrnaIn(e,t,r){let s=N.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?y.toDecimals(r.assetFee).toString():S.toString()),n=p(s);return n.isNegative()?S:n}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=N.calculateSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString(),e.balanceIn.toString(),e.hubReservesIn.toString());return p(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceLrnaInGivenOut(e){let t=N.calculateLrnaSpotPrice(e.hubReservesOut.toString(),e.balanceOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceOutGivenIn(e){if(e.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(e);let t=N.calculateSpotPrice(e.balanceIn.toString(),e.hubReservesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}spotPriceOutGivenLrnaIn(e){let t=N.calculateLrnaSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}};import{encodeAddress as gr}from"@polkadot/util-crypto";import{stringToU8a as hr}from"@polkadot/util";var Ne=class extends C{isSupported(){return this.api.query.omnipool!==void 0}async loadPools(){let e=this.api.consts.omnipool.hubAssetId.toString(),t=this.getPoolId(),[r,s,n]=await Promise.all([this.api.query.omnipool.assets.entries(),this.api.query.omnipool.hubAssetTradability(),this.getBalance(t,e)]),a=r.map(async([{args:[o]},l])=>{let{hubReserve:u,shares:c,tradable:h,cap:d,protocolShares:g}=l.unwrap(),b=await this.getBalance(t,o.toString());return{id:o.toString(),hubReserves:p(u.toString()),shares:p(c.toString()),tradeable:h.bits.toNumber(),balance:b.toString(),cap:p(d.toString()),protocolShares:p(g.toString())}}),i=await Promise.all(a);return i.push({id:e,tradeable:s.bits.toNumber(),balance:n.toString()}),[{address:t,type:"Omnipool",hubAssetId:e,tokens:i,...this.getPoolLimits()}]}async getPoolFees(e,t){let r=e.assetOut,s=e.assetIn,n="omnipool",a="Short",i=B=>B===D?[D,fe]:[fe,B],[o,l,u,c]=await Promise.all([this.api.query.system.number(),this.api.query.dynamicFees.assetFee(r),this.api.query.emaOracle.oracles(n,i(r),a),this.api.query.emaOracle.oracles(n,i(s),a)]),[h,d,g]=this.getAssetFee(e,o.toNumber(),l,u),[b,P,T]=s===fe?[0,0,0]:this.getProtocolFee(e,o.toNumber(),l,c),f=h+b,I=g+T;return{assetFee:y.fromPermill(d),protocolFee:y.fromPermill(P),min:y.fromPermill(f),max:y.fromPermill(I)}}getPoolType(){return"Omnipool"}async subscribePoolChange(e){let t=e.tokens.map(r=>r.id);return this.api.query.omnipool.assets.multi(t,r=>{e.tokens=r.map((s,n)=>{let a=e.tokens[n];if(s.isNone)return a;let i=s.unwrap();return this.updateTokenState(a,i)})})}updateTokenState(e,t){let{hubReserve:r,shares:s,tradable:n,cap:a,protocolShares:i}=t;return{...e,hubReserves:p(r.toString()),shares:p(s.toString()),cap:p(a.toString()),protocolShares:p(i.toString()),tradeable:n.bits.toNumber()}}getAssetFee(e,t,r,s){let{assetOut:n,balanceOut:a}=e,{minFee:i,maxFee:o,decay:l,amplification:u}=this.api.consts.dynamicFees.assetFeeParameters,c=y.fromPermill(i.toNumber()),h=y.fromPermill(o.toNumber());if(r.isNone||s.isNone)return[i.toNumber(),i.toNumber(),o.toNumber()];let[d]=s.unwrap(),{assetFee:g,timestamp:b}=r.unwrap(),P=Math.max(1,t-b.toNumber()),T=d.volume.bIn.toString(),f=d.volume.bOut.toString(),I=d.liquidity.b.toString();n===D&&(T=d.volume.aIn.toString(),f=d.volume.aOut.toString(),I=d.liquidity.a.toString());let B=y.fromPermill(g.toNumber()),w=N.recalculateAssetFee(T,f,I,"9",a.toString(),y.toDecimals(B).toString(),P.toString(),y.toDecimals(c).toString(),y.toDecimals(h).toString(),l.toString(),u.toString());return[i.toNumber(),Number(w)*1e6,o.toNumber()]}getProtocolFee(e,t,r,s){let{assetIn:n,balanceIn:a}=e,{minFee:i,maxFee:o,decay:l,amplification:u}=this.api.consts.dynamicFees.protocolFeeParameters,c=y.fromPermill(i.toNumber()),h=y.fromPermill(o.toNumber());if(r.isNone||s.isNone)return[i.toNumber(),i.toNumber(),o.toNumber()];let[d]=s.unwrap(),{protocolFee:g,timestamp:b}=r.unwrap(),P=Math.max(1,t-b.toNumber()),T=d.volume.bIn.toString(),f=d.volume.bOut.toString(),I=d.liquidity.b.toString();n===D&&(T=d.volume.aIn.toString(),f=d.volume.aOut.toString(),I=d.liquidity.a.toString());let B=y.fromPermill(g.toNumber()),w=N.recalculateProtocolFee(T,f,I,"9",a.toString(),y.toDecimals(B).toString(),P.toString(),y.toDecimals(c).toString(),y.toDecimals(h).toString(),l.toString(),u.toString());return[i.toNumber(),Number(w)*1e6,o.toNumber()]}getPoolId(){return gr(hr("modlomnipool".padEnd(32,"\0")),63)}getPoolLimits(){let e=this.api.consts.omnipool.maxInRatio.toJSON(),t=this.api.consts.omnipool.maxOutRatio.toJSON(),r=this.api.consts.omnipool.minimumTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};import{calculate_in_given_out as Pr,calculate_out_given_in as br,calculate_pool_trade_fee as yr,get_spot_price as fr,calculate_liquidity_in as Sr,calculate_shares as Tr,calculate_spot_price as wr,calculate_spot_price_with_fee as Or,calculate_liquidity_out_asset_a as xr,calculate_liquidity_out_asset_b as Br}from"@galacticcouncil/math-xyk";var X=class{static getSpotPrice(e,t,r){return fr(e,t,r)}static calculateInGivenOut(e,t,r){return Pr(e,t,r)}static calculateOutGivenIn(e,t,r){return br(e,t,r)}static calculatePoolTradeFee(e,t,r){return yr(e,t,r)}static calculateLiquidityIn(e,t,r){return Sr(e,t,r)}static calculateSpotPrice(e,t){return wr(e,t)}static calculateSpotPriceWithFee(e,t,r,s){return Or(e,t,r,s)}static calculateShares(e,t,r){return Tr(e,t,r)}static calculateLiquidityOutAssetA(e,t,r,s){return xr(e,t,r,s)}static calculateLiquidityOutAssetB(e,t,r,s){return Br(e,t,r,s)}};var Fe=class m{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new m(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit)}constructor(e,t,r,s,n){this.type="Xyk",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=n}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(u=>[u.id,u])),s=r.get(e),n=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),i=p(n.balance),o=p(s.existentialDeposit),l=p(n.existentialDeposit);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:n.decimals,balanceIn:a,balanceOut:i,assetInED:o,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),n=this.calculateTradeFee(s,r),a=y.toPct(r.exchangeFee),i=s.plus(n),o=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&o.push("InsufficientTradingAmount");let l=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(l)&&o.push("MaxOutRatioExceeded");let u=e.balanceIn.div(this.maxInRatio);return i.isGreaterThan(u)&&o.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:a,errors:o}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),n=this.calculateTradeFee(s,r),a=y.toPct(r.exchangeFee),i=s.minus(n),o=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&o.push("InsufficientTradingAmount");let l=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(l)&&o.push("MaxInRatioExceeded");let u=e.balanceOut.div(this.maxOutRatio);return i.isGreaterThan(u)&&o.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:a,errors:o}}calculateInGivenOut(e,t){let r=X.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?S:s}calculateOutGivenIn(e,t){let r=X.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?S:s}spotPriceInGivenOut(e){let t=X.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),r=v(R,18-e.decimalsOut);return p(t).div(r)}spotPriceOutGivenIn(e){let t=X.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),r=v(R,18-e.decimalsIn);return p(t).div(r)}calculateTradeFee(e,t){let r=X.calculatePoolTradeFee(e.toString(),t.exchangeFee[0],t.exchangeFee[1]);return p(r)}};var Re=class extends C{isSupported(){return this.api.query.xyk!==void 0}async loadPools(){let t=(await this.api.query.xyk.poolAssets.entries()).map(async([{args:[r]},s])=>{let n=r.toString(),[a,i]=s.unwrap(),[o,l]=await Promise.all([this.getBalance(n,a.toString()),this.getBalance(n,i.toString())]);return{address:n,type:"Xyk",tokens:[{id:a.toString(),balance:o.toString()},{id:i.toString(),balance:l.toString()}],...this.getPoolLimits()}});return Promise.all(t)}async getPoolFees(e,t){return{exchangeFee:this.getExchangeFee()}}getPoolType(){return"Xyk"}subscribePoolChange(e){throw new Error("Pool change subscription not supported!")}getExchangeFee(){return this.api.consts.xyk.getExchangeFee.toJSON()}getPoolLimits(){let e=this.api.consts.xyk.maxInRatio.toJSON(),t=this.api.consts.xyk.maxOutRatio.toJSON(),r=this.api.consts.xyk.minTradingLimit.toJSON();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};import{calculate_in_given_out as Ir,calculate_out_given_in as Ar,calculate_amplification as vr,calculate_add_one_asset as Nr,calculate_liquidity_out_one_asset as Fr,calculate_pool_trade_fee as Rr,calculate_shares as Er,calculate_shares_for_amount as _r,calculate_spot_price_with_fee as Dr,pool_account_name as kr,recalculate_peg as Cr}from"@galacticcouncil/math-stableswap";var _=class{static getPoolAddress(e){return kr(e)}static defaultPegs(e){let t=[];for(let r=0;r<e;r++)t.push(["1","1"]);return t}static calculateAmplification(e,t,r,s,n){return vr(e,t,r,s,n)}static calculateInGivenOut(e,t,r,s,n,a,i){return Ir(e,t,r,s,n,a,i)}static calculateAddOneAsset(e,t,r,s,n,a,i){return Nr(e,t,r,s,n,a,i)}static calculateSharesForAmount(e,t,r,s,n,a,i){return _r(e,t,r,s,n,a,i)}static calculateOutGivenIn(e,t,r,s,n,a,i){return Ar(e,t,r,s,n,a,i)}static calculateLiquidityOutOneAsset(e,t,r,s,n,a,i){return Fr(e,t,r,s,n,a,i)}static calculateShares(e,t,r,s,n,a){return Er(e,t,r,s,n,a)}static calculateSpotPriceWithFee(e,t,r,s,n,a,i,o){return Dr(e,t,r,s,n,a,i,o)}static calculatePoolTradeFee(e,t,r){return Rr(e,t,r)}static recalculatePegs(e,t,r,s,n){let a=Cr(e,t,r,s,n);return JSON.parse(a)}};var Ee=class m{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;pegs;pegsFee;static fromPool(e){return new m(e.address,e.tokens,e.maxInRatio,e.maxOutRatio,e.minTradingLimit,e.amplification,e.id,e.fee,e.totalIssuance,e.pegs,e.pegsFee)}constructor(e,t,r,s,n,a,i,o,l,u,c){this.type="Stableswap",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=n,this.amplification=a,this.id=i,this.fee=o,this.totalIssuance=l,this.pegs=u,this.pegsFee=c}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(u=>[u.id,u])),s=r.get(e),n=r.get(t);if(s==null)throw new Error("Pool does not contain tokenIn");if(n==null)throw new Error("Pool does not contain tokenOut");let a=p(s.balance),i=p(n.balance),o=p(s.existentialDeposit),l=p(n.existentialDeposit);return{assetIn:e,assetOut:t,balanceIn:a,balanceOut:i,decimalsIn:s.decimals,decimalsOut:n.decimals,tradeableIn:this.id===e?15:s.tradeable,tradeableOut:this.id===t?15:n.tradeable,assetInED:o,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),n=this.calculateInGivenOut(e,t,r),a=y.toPct(r.fee),i=[],o=N.isSellAllowed(e.tradeableIn),l=N.isBuyAllowed(e.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&i.push("InsufficientTradingAmount"),{amountIn:n,calculatedIn:s,amountOut:t,feePct:a,errors:i}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),n=this.calculateOutGivenIn(e,t,r),a=y.toPct(r.fee),i=[],o=N.isSellAllowed(e.tradeableIn),l=N.isBuyAllowed(e.tradeableOut);return(!o||!l)&&i.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&i.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:s,amountOut:n,feePct:a,errors:i}}calculateIn(e,t,r){let s=_.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),n=p(s);return n.isNegative()?S:n}calculateAddOneAsset(e,t,r){let s=_.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),n=p(s);return n.isNegative()?S:n}calculateSharesForAmount(e,t,r){let s=_.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),n=p(s);return n.isNegative()?S:n}calculateInGivenOut(e,t,r){return e.assetOut==this.id?this.calculateAddOneAsset(e,t,r):e.assetIn==this.id?this.calculateSharesForAmount(e,t,r):this.calculateIn(e,t,r)}spotPriceInGivenOut(e){let t=_.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetOut,e.assetIn,this.totalIssuance,"0",this.getPegs());if(e.assetOut==this.id)return p(t);if(e.assetIn==this.id){let s=v(R,e.decimalsIn-e.decimalsOut);return p(t).div(s)}let r=v(R,18-e.decimalsIn);return p(t).div(r)}calculateOut(e,t,r){let s=_.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),n=p(s);return n.isNegative()?S:n}calculateWithdrawOneAsset(e,t,r){let s=_.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),n=p(s);return n.isNegative()?S:n}calculateShares(e,t,r){let s=_.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,r?y.toDecimals(r.fee).toString():S.toString(),this.getPegs()),n=p(s);return n.isNegative()?S:n}calculateOutGivenIn(e,t,r){return e.assetIn==this.id?this.calculateWithdrawOneAsset(e,t,r):e.assetOut==this.id?this.calculateShares(e,t,r):this.calculateOut(e,t,r)}spotPriceOutGivenIn(e){let t=_.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetIn,e.assetOut,this.totalIssuance,"0",this.getPegs());if(e.assetIn==this.id)return p(t);if(e.assetOut==this.id){let s=v(R,e.decimalsOut-e.decimalsIn);return p(t).div(s)}let r=v(R,18-e.decimalsOut);return p(t).div(r)}calculateTradeFee(e,t){let r=_.calculatePoolTradeFee(e.toString(),t.fee[0],t.fee[1]);return p(r)}getPegs(){return JSON.stringify(this.pegs)}getReserves(){let e=this.tokens.filter(t=>t.id!=this.id).map(({id:t,balance:r,decimals:s})=>({asset_id:Number(t),amount:r,decimals:s}));return JSON.stringify(e)}getAssets(e,t){let r={asset_id:Number(e),amount:t.toFixed(0)};return JSON.stringify([r])}};import{blake2AsHex as Mr,encodeAddress as Lr}from"@polkadot/util-crypto";var Ur=340282366920938463463374607431768211455n,_e=class extends C{stablePools=new Map([]);isSupported(){return this.api.query.stableswap!==void 0}isPegSupported(){return this.api.query.stableswap.poolPegs!==void 0}async loadPools(){let[e,t]=await Promise.all([this.api.query.stableswap.pools.entries(),this.api.query.system.number()]),r=t.toNumber(),s=e.map(async([{args:[n]},a])=>{let i=a.unwrap(),o=n.toString(),l=this.getPoolAddress(o),[u,c,h]=await Promise.all([this.getPoolDelta(o,i,r.toString()),this.getPoolTokens(l,o,i),this.getPoolPegs(o,i,r.toString())]);return this.stablePools.set(l,i),{address:l,id:o,type:"Stableswap",fee:y.fromPermill(i.fee.toNumber()),tokens:c,...u,...h,...this.getPoolLimits()}});return Promise.all(s)}async getPoolFees(e,t){return{fee:this.pools.find(s=>s.address===t).pegsFee}}getPoolType(){return"Stableswap"}async subscribePoolChange(e){return this.api.query.system.number(async t=>{let r=t.toString(),s=this.stablePools.get(e.address);if(s){let[n,a]=await Promise.all([this.getPoolDelta(e.id,s,r),this.getPoolPegs(e.id,s,r)]);Object.assign(e,n,a)}})}async getPoolDelta(e,t,r){let{initialAmplification:s,finalAmplification:n,initialBlock:a,finalBlock:i}=t,o=_.calculateAmplification(s.toString(),n.toString(),a.toString(),i.toString(),r),l=await this.api.query.tokens.totalIssuance(e);return{amplification:o,totalIssuance:l.toString()}}async getPoolTokens(e,t,r){let{assets:s}=r,n=s.map(async i=>{let[o,l]=await Promise.all([this.api.query.stableswap.assetTradability(t,i.toString()),this.getBalance(e,i.toString())]);return{id:i.toString(),tradeable:o.bits.toNumber(),balance:l.toString()}}),a=await Promise.all(n);return a.push({id:t,tradeable:15,balance:Ur.toString()}),a}getPoolDefaultPegs(e){let t=e.fee,r=_.defaultPegs(e.assets.length);return{pegsFee:y.fromPermill(t.toNumber()),pegs:r}}async getPoolPegs(e,t,r){if(!this.isPegSupported())return this.getPoolDefaultPegs(t);let s=await this.api.query.stableswap.poolPegs(e);if(s.isNone)return this.getPoolDefaultPegs(t);let n=s.unwrap(),a=await this.getLatestPegs(t,n,r),i=this.getRecentPegs(n),o=n.maxPegUpdate.toHuman(),l=t.fee.toHuman(),[u,c]=_.recalculatePegs(JSON.stringify(i),JSON.stringify(a),r,o.replace(/%/g,""),l.replace(/%/g,"")),h=Number(u)*1e4;return{pegsFee:y.fromPermill(h),pegs:c}}getRecentPegs(e){let{current:t}=e;return Array.from(t.entries()).map(([r,s])=>s.map(n=>n.toString()))}async getLatestPegs(e,t,r){let{source:s}=t,n=Array.from(e.assets.entries()).map(([i,o])=>o.toString()),a=s.map(async(i,o)=>{if(i.isOracle){let[l,u,c]=i.asOracle,h=[c.toString(),n[o]].map(f=>Number(f)).sort((f,I)=>f-I),d=await this.api.query.emaOracle.oracles(l,h,u),[{price:g,updatedAt:b}]=d.unwrap(),P=g.n.toString(),T=g.d.toString();return c.toString()===h[0].toString()?[[P,T],b.toString()]:[[T,P],b.toString()]}else if(i.isMmOracle){let l=i.asMmOracle,{price:u,decimals:c,updatedAt:h}=await this.mmOracle.getData(l.toString()),d=10**c;return[[u.toString(),d.toString()],h.toString()]}else return[i.asValue.map(l=>l.toString()),r]});return Promise.all(a)}getPoolAddress(e){let t=Number(e),r=_.getPoolAddress(t);return Lr(Mr(r),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:this.api.consts.stableswap.minTradingLimit.toJSON()}}};var ne=class extends k{api;evm;assetClient;aaveClient;xykClient;omniClient;lbpClient;stableClient;clients=[];onChainAssets=[];memRegistry=Gr(e=>(this.log(`Registry mem ${e} sync`),this.syncRegistry()));constructor(e,t){super(e),this.api=e,this.evm=t,this.assetClient=new $(this.api),this.aaveClient=new Be(this.api,t),this.xykClient=new Re(this.api,t),this.omniClient=new Ne(this.api,t),this.lbpClient=new Ae(this.api,t),this.stableClient=new _e(this.api,t),this.clients=[this.aaveClient,this.xykClient,this.omniClient,this.lbpClient,this.stableClient]}get assets(){return this.onChainAssets}get isRegistrySynced(){return this.onChainAssets.length>0}async syncRegistry(e){let t=await this.assetClient.getOnChainAssets(!1,e);this.clients.forEach(r=>r.withAssets(t)),this.onChainAssets=t}async getPools(e){return this.isRegistrySynced||await this.memRegistry(1),e.length==0?(await Promise.all(this.clients.filter(s=>s.isSupported()).map(s=>s.getPoolsMem()))).flat():(await Promise.all(this.clients.filter(r=>e.some(s=>s===r.getPoolType())).map(r=>r.getPoolsMem()))).flat()}destroy(){this.aaveClient.unsubscribe(),this.xykClient.unsubscribe(),this.omniClient.unsubscribe(),this.lbpClient.unsubscribe(),this.stableClient.unsubscribe()}async getPoolFees(e,t){switch(t.type){case"Aave":return this.aaveClient.getPoolFees(e,t.address);case"Xyk":return this.xykClient.getPoolFees(e,t.address);case"Omnipool":return this.omniClient.getPoolFees(e,t.address);case"Lbp":return this.lbpClient.getPoolFees(e,t.address);case"Stableswap":return this.stableClient.getPoolFees(e,t.address);default:throw new we(t.type)}}};var ie=class extends ne{feeCache;disconnectSubscribeNewHeads=null;constructor(e,t){super(e,t),this.feeCache=new qr(null),this.api.rpc.chain.subscribeNewHeads(async r=>{this.feeCache.release()}).then(r=>{this.disconnectSubscribeNewHeads=r})}async getPoolFees(e,t){let r=[t.address,e.assetIn,e.assetOut].join("-");if(this.feeCache.has(r))return this.feeCache.get(r);{let n=await super.getPoolFees(e,t);return this.feeCache.set(r,n),n}}async destroy(){this.log(`Destroying pool cache!
|
|
2
|
+
Items: [${this.feeCache.length}]`),this.feeCache.release(),this.disconnectSubscribeNewHeads?.()}};var ae=class{static get(e){switch(e.type){case"Aave":return xe.fromPool(e);case"Xyk":return Fe.fromPool(e);case"Omnipool":return ve.fromPool(e);case"Lbp":return Ie.fromPool(e);case"Stableswap":return Ee.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};var De=class{constructor(e=1/0){this.capacity=e}storage=[];enqueue(e){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(e)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var Wr=5,oe=class{isNotVisited(e,t){let r=!0;return t.forEach(s=>{(s[0]===e[0]||s[1]===e[1])&&(r=!1)}),r}findPaths(e,t,r){let s=[],n=new De,a=[];for(a.push([t,""]),n.enqueue(a);n.size()>0;){let i=n.dequeue();if(i==null||i.length>Wr)return s;let o=i[i.length-1];(r===null||o[0]===r)&&s.push(i),e.get(o[0])?.forEach(u=>{if(this.isNotVisited(u,i)){let c=[...i];c.push(u),n.enqueue(c)}})}return s}buildAndPopulateGraph(e,t){let r=new Map;for(let s of e)r.set(parseInt(s),[]);for(let[s,n,a]of t){let i=parseInt(n),o=parseInt(a);r.get(i)?.push([o,s])}return r}};function Ve(m){let e={};for(let t of m){let r=t.tokens.length;for(let s=0;s<r;s++){e[t.tokens[s].id]||(e[t.tokens[s].id]=[]);for(let n=0;n<r;n++){if(s==n)continue;let a=[t.address,t.tokens[s].id,t.tokens[n].id];e[t.tokens[s].id].push(a)}}}return e}var le=class{getProposals(e,t,r){let s=Ve(r),n=Object.keys(s),a=n.map(u=>s[u]).flat(),i=new oe,o=i.buildAndPopulateGraph(n,a),l=i.findPaths(o,parseInt(e),t?parseInt(t):null);return this.parsePaths(l)}parsePaths(e){let t=[];for(let r of e){let s=[];for(let n=0;n<r.length;n++){let a=r[n],i=r[n+1];if(i==null)break;s.push(this.toEdge(a,i))}t.push(s)}return t}toEdge(e,t){return[t[1],e[0].toString(),t[0].toString()]}};var ue=class{routeSuggester;routerOptions;poolService;constructor(e,t={}){this.poolService=e,this.routeSuggester=new le,this.routerOptions=Object.freeze({includeOnly:t.includeOnly??[]})}async getPools(){let e=this.routerOptions.includeOnly;return await this.poolService.getPools(e)}async getAllAssets(){let e=await this.getPools();if(e.length===0)throw new Error("No pools configured");let t=await this.getAssets(e);return[...new Map(t).values()]}async getAssetPairs(e){let t=await this.getPools();if(t.length===0)throw new Error("No pools configured");let{assets:r,poolsMap:s}=await this.validateToken(e,t),a=this.getPaths(e,null,s,t).map(i=>i[i.length-1].assetOut);return this.toAssets([...new Set(a)],r)}async getAllPaths(e,t){let r=await this.getPools();if(r.length===0)throw new Error("No pools configured");let{poolsMap:s}=await this.validateTokenPair(e,t,r);return this.getPaths(e,t,s,r)}async getAssets(e){let t=e.map(r=>r.tokens.map(s=>({id:s.id,name:s.name,symbol:s.symbol,decimals:s.decimals,icon:s.icon,type:s.type,isSufficient:s.isSufficient,existentialDeposit:s.existentialDeposit,meta:s.meta,location:s.location,isWhiteListed:s.isWhiteListed}))).flat();return new Map(t.map(r=>[r.id,r]))}getPaths(e,t,r,s){return this.routeSuggester.getProposals(e,t,s).filter(i=>this.validPath(i,r)).map(i=>this.toHops(i,r))}async validateTokenPair(e,t,r){let s=await this.getAssets(r);if(s.get(e)==null)throw new Error(e+" is not supported token");if(s.get(t)==null)throw new Error(t+" is not supported token");let n=this.getPoolMap(r);return{assets:s,poolsMap:n}}async validateToken(e,t){let r=await this.getAssets(t);if(r.get(e)==null)throw new Error(e+" is not supported token");let s=this.getPoolMap(t);return{assets:r,poolsMap:s}}getPoolMap(e){return new Map(e.map(t=>[t.address,ae.get(t)]))}validPath(e,t){return e.length>0&&e.map(r=>this.validEdge(r,t)).reduce((r,s)=>r&&s)}validEdge([e,t,r],s){return s.get(e)?.validatePair(t,r)||!1}toHops(e,t){return e.map(([r,s,n])=>{let a=t.get(r);return{poolAddress:r,poolId:a?.id,pool:a?.type,assetIn:s,assetOut:n}})}toAssets(e,t){return e.map(r=>t.get(r))}};var Hr=p("100");function zl(m,e){return m.minus(e).abs().div(m.plus(e).div(2)).multipliedBy(100).decimalPlaces(2)}function ce(m,e){return m.minus(e).div(e).multipliedBy(100).decimalPlaces(2)}function gt(m,e){return R.minus(e.div(m)).multipliedBy(100).decimalPlaces(2)}function ht(m,e){return e.div(m).minus(R).multipliedBy(100).decimalPlaces(2)}function V(m,e){return(e<.01||e>100)&&new Error("Supported range is from 0.01% - 100%"),m.div(Hr).multipliedBy(e).decimalPlaces(0,1)}var ze=(t=>(t.Buy="Buy",t.Sell="Sell",t))(ze||{}),Ke=(r=>(r.Dca="Dca",r.TwapSell="TwapSell",r.TwapBuy="TwapBuy",r))(Ke||{}),Pt=(r=>(r.OrderTooSmall="OrderTooSmall",r.OrderTooBig="OrderTooBig",r.OrderImpactTooBig="OrderImpactTooBig",r))(Pt||{});var me=class extends ue{isDirectTrade(e){return e.length==1}findBestSellRoute(e){let t=e.sort((r,s)=>{let n=r[r.length-1].amountOut,a=s[s.length-1].amountOut;return n.isGreaterThan(a)?-1:1});return t.find(r=>r.every(s=>s.errors.length==0))||t[0]}getRouteFeeRange(e){if(e.filter(r=>r.tradeFeeRange).length>0){let r=e.map(n=>n.tradeFeeRange?.[0]??n.tradeFeePct).reduce((n,a)=>n+a),s=e.map(n=>n.tradeFeeRange?.[1]??n.tradeFeePct).reduce((n,a)=>n+a);return[r,s]}}getPoolFeeRange(e){let t=e.min?y.toPct(e.min):void 0,r=e.max?y.toPct(e.max):void 0;if(t&&r)return[t,r]}async getBestSell(e,t,r){return this.getSell(e,t,r)}async getSell(e,t,r,s){let n=await super.getPools();if(n.length===0)throw new Error("No pools configured");let{poolsMap:a}=await super.validateTokenPair(e,t,n),i=super.getPaths(e,t,a,n);if(i.length===0)throw new K(e,t);let o;if(s)o=await this.toSellSwaps(r,s,a);else{let w=i.map(async F=>await this.toSellSwaps(r,F,a)),A=await Promise.all(w);o=this.findBestSellRoute(A)}let l=o[0],u=o[o.length-1],c=this.isDirectTrade(o),h=o.map(w=>w.spotPrice.shiftedBy(-1*w.assetOutDecimals)).reduce((w,A)=>w.multipliedBy(A)),d=v(h,u.assetOutDecimals),g=c?u.calculatedOut:this.calculateDelta0Y(l.amountIn,o,a),b=u.amountOut,P=c?u.tradeFeePct:gt(g,b).toNumber(),T=g.minus(b),f=this.getRouteFeeRange(o),I=l.amountIn.shiftedBy(-1*l.assetInDecimals).multipliedBy(d),B=ce(g,I);return{type:"Sell",amountIn:l.amountIn,amountOut:u.amountOut,spotPrice:d,tradeFee:T,tradeFeePct:P,tradeFeeRange:f,priceImpactPct:B.toNumber(),swaps:o,toHuman(){return{type:"Sell",amountIn:x(l.amountIn,l.assetInDecimals),amountOut:x(u.amountOut,u.assetOutDecimals),spotPrice:x(d,u.assetOutDecimals),tradeFee:x(T,u.assetOutDecimals),tradeFeePct:P,tradeFeeRange:f,priceImpactPct:B.toNumber(),swaps:o.map(w=>w.toHuman())}}}}calculateDelta0Y(e,t,r){let s=[];for(let n=0;n<t.length;n++){let a=t[n],i=r.get(a.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(a.assetIn,a.assetOut),l;n>0?l=s[n-1]:l=e;let u=i.calculateOutGivenIn(o,l);s.push(u)}return s[s.length-1]}async toSellSwaps(e,t,r){let s=[];for(let n=0;n<t.length;n++){let a=t[n],i=r.get(a.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(a.assetIn,a.assetOut),l;n>0?l=s[n-1].amountOut:l=v(p(e),o.decimalsIn).decimalPlaces(0,1);let u=await this.poolService.getPoolFees(o,i),{amountOut:c,calculatedOut:h,feePct:d,errors:g}=i.validateAndSell(o,l,u),b=this.getPoolFeeRange(u),P=i.spotPriceOutGivenIn(o),T=l.shiftedBy(-1*o.decimalsIn).multipliedBy(P),f=ce(h,T);s.push({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:c,calculatedOut:h,spotPrice:P,tradeFeePct:d,tradeFeeRange:b,priceImpactPct:f.toNumber(),errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===a.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===a.assetIn},toHuman(){return{...a,amountIn:x(l,o.decimalsIn),amountOut:x(c,o.decimalsOut),calculatedOut:x(h,o.decimalsOut),spotPrice:x(P,o.decimalsOut),tradeFeePct:d,tradeFeeRange:b,priceImpactPct:f.toNumber(),errors:g}}})}return s}async getMostLiquidRoute(e,t){let r=await super.getPools(),{poolsMap:s}=await super.validateTokenPair(e,t,r),n=super.getPaths(e,t,s,r);if(n.length===0)throw new K(e,t);let l=r.filter(d=>d.tokens.some(g=>g.id===e&&g.id!==d.id)).map(d=>d.type==="Aave"?d.tokens:d.tokens.filter(g=>g.id===e)).map(d=>d.map(g=>p(g.balance).shiftedBy(-1*g.decimals)).reduce((g,b)=>g.plus(b))).sort((d,g)=>g.isLessThan(d)?-1:1)[0].div(100).multipliedBy(.1),u=n.map(async d=>await this.toSellSwaps(l,d,s)),c=await Promise.all(u);return this.findBestSellRoute(c).map(d=>({poolAddress:d.poolAddress,poolId:d?.poolId,pool:d.pool,assetIn:d.assetIn,assetOut:d.assetOut}))}async getBestSpotPrice(e,t){let r=await super.getPools();if(r.length===0)throw new Error("No pools configured");let{poolsMap:s}=await super.validateTokenPair(e,t,r);if(super.getPaths(e,t,s,r).length===0)return Promise.resolve(void 0);let a=await this.getMostLiquidRoute(e,t),i=await this.toSellSwaps("1",a,s),o=i.map(c=>c.spotPrice.shiftedBy(-1*c.assetOutDecimals)).reduce((c,h)=>c.multipliedBy(h)),l=i[i.length-1].assetOutDecimals;return{amount:v(o,l),decimals:l}}findBestBuyRoute(e){let t=e.sort((r,s)=>{let n=r[0].amountIn,a=s[0].amountIn;return n.isGreaterThan(a)?1:-1});return t.find(r=>r.every(s=>s.errors.length==0))||t[0]}async getBestBuy(e,t,r){return this.getBuy(e,t,r)}async getBuy(e,t,r,s){let n=await super.getPools();if(n.length===0)throw new Error("No pools configured");let{poolsMap:a}=await super.validateTokenPair(e,t,n),i=super.getPaths(e,t,a,n);if(i.length===0)throw new K(e,t);let o;if(s)o=await this.toBuySwaps(r,s,a);else{let w=i.map(async F=>await this.toBuySwaps(r,F,a)),A=await Promise.all(w);o=this.findBestBuyRoute(A)}let l=o[o.length-1],u=o[0],c=this.isDirectTrade(o),h=o.map(w=>w.spotPrice.shiftedBy(-1*w.assetInDecimals)).reduce((w,A)=>w.multipliedBy(A)),d=v(h,u.assetInDecimals),g=c?u.calculatedIn:this.calculateDelta0X(l.amountOut,o,a),b=u.amountIn,P=c?u.tradeFeePct:ht(g,b).toNumber(),T=b.minus(g),f=this.getRouteFeeRange(o),I=l.amountOut.shiftedBy(-1*l.assetOutDecimals).multipliedBy(d),B;return g.isZero()?B=-100:B=ce(I,g).toNumber(),{type:"Buy",amountOut:l.amountOut,amountIn:u.amountIn,spotPrice:d,tradeFee:T,tradeFeePct:P,tradeFeeRange:f,priceImpactPct:B,swaps:o,toHuman(){return{type:"Buy",amountOut:x(l.amountOut,l.assetOutDecimals),amountIn:x(u.amountIn,u.assetInDecimals),spotPrice:x(d,u.assetInDecimals),tradeFee:x(T,u.assetInDecimals),tradeFeePct:P,tradeFeeRange:f,priceImpactPct:B,swaps:o.map(w=>w.toHuman())}}}}calculateDelta0X(e,t,r){let s=[];for(let n=t.length-1;n>=0;n--){let a=t[n],i=r.get(a.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(a.assetIn,a.assetOut),l;n==t.length-1?l=e:l=s[0];let u=i.calculateInGivenOut(o,l);s.unshift(u)}return s[0]}async toBuySwaps(e,t,r){let s=[];for(let n=t.length-1;n>=0;n--){let a=t[n],i=r.get(a.poolAddress);if(i==null)throw new Error("Pool does not exit");let o=i.parsePair(a.assetIn,a.assetOut),l;n==t.length-1?l=v(p(e),o.decimalsOut).decimalPlaces(0,1):l=s[0].amountIn;let u=await this.poolService.getPoolFees(o,i),{amountIn:c,calculatedIn:h,feePct:d,errors:g}=i.validateAndBuy(o,l,u),b=this.getPoolFeeRange(u),P=i.spotPriceInGivenOut(o),T=l.shiftedBy(-1*o.decimalsOut).multipliedBy(P),f;h.isZero()?f=-100:f=ce(T,h).toNumber(),s.unshift({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:c,amountOut:l,calculatedIn:h,spotPrice:P,tradeFeePct:d,tradeFeeRange:b,priceImpactPct:f,errors:g,isSupply(){return i.type==="Aave"&&i.tokens[0].id===a.assetIn},isWithdraw(){return i.type==="Aave"&&i.tokens[1].id===a.assetIn},toHuman(){return{...a,amountIn:x(c,o.decimalsIn),amountOut:x(l,o.decimalsOut),calculatedIn:x(h,o.decimalsIn),spotPrice:x(P,o.decimalsIn),tradeFeePct:d,tradeFeeRange:b,priceImpactPct:f,errors:g}}})}return s}};var bt=6e3,yt=p(1e15),pe=6,Je=-5,je=6*60*60*1e3;var ft=6;var L=class{static build(e){return e.map(({assetIn:t,assetOut:r,pool:s,poolId:n})=>s==="Stableswap"?{pool:{Stableswap:n},assetIn:t,assetOut:r}:{pool:s,assetIn:t,assetOut:r})}};var de=class{schedulerOptions;router;constructor(e,t={}){this.router=e,this.schedulerOptions=Object.freeze({blockTime:t.blockTime??bt,minBudgetInNative:t.minBudgetInNative??yt})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(e,t,r,s,n){let[a,i]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,r)]),{amountIn:o,swaps:l,priceImpactPct:u}=i,c=l[0],h=l[l.length-1],{assetInDecimals:d}=c,{assetOutDecimals:g}=h,b=Math.abs(u),P=this.getMinimumTradeCount(o,a),T=this.getOptimalTradeCount(b),f=n?Math.round(s/n):T,I=Math.ceil(s/P),B=Math.round(s/T),w=Math.round(s/f),A=o.dividedBy(f).decimalPlaces(0,1),F=await this.router.getBestSell(e,t,x(A,d)),U=o.isLessThan(a),he=[];U&&he.push("OrderTooSmall");let Pe=F.amountOut.multipliedBy(f),Me=this.toBlockPeriod(w),Le=F.tradeFee.multipliedBy(f),Ue=L.build(l),be={assetIn:e,assetOut:t,errors:he,frequencyMin:I,frequencyOpt:B,frequency:w,tradeCount:f,tradeFee:Le,tradeImpactPct:F.priceImpactPct,tradePeriod:Me,tradeRoute:Ue,type:"Dca"};return{...be,amountIn:o,amountOut:Pe,tradeAmountIn:F.amountIn,tradeAmountOut:F.amountOut,toHuman(){return{...be,amountIn:x(o,d),amountOut:x(Pe,g),tradeAmountIn:x(F.amountIn,d),tradeAmountOut:x(F.amountOut,g)}}}}async getMinimumOrderBudget(e){if(D===e)return this.minOrderBudget;let t=await this.router.getBestSpotPrice(D,e);if(t)return this.minOrderBudget.times(t.amount).div(p(10).pow(12)).decimalPlaces(0,1);throw new Error("Unable to calculate order budget")}getMinimumTradeCount(e,t){let r=t.multipliedBy(.2),s=e.dividedBy(r).toNumber();return Math.round(s)}getOptimalTradeCount(e){let t=Math.round(e*10)||1;return Math.max(t,3)}async getTwapSellOrder(e,t,r){let[s,n]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,r)]),{amountIn:a,swaps:i,priceImpactPct:o}=n,l=i[0],u=i[i.length-1],{assetInDecimals:c}=l,{assetOutDecimals:h}=u,d=Math.abs(o),g=this.getTwapTradeCount(d),b=a.dividedBy(g).decimalPlaces(0,1),P=await this.router.getBestSell(l.assetIn,u.assetOut,x(b,c)),T=g===1,f=a.isLessThan(s),I=P.priceImpactPct<Je,B=[];f||T?B.push("OrderTooSmall"):I&&B.push("OrderImpactTooBig");let w=P.amountOut.multipliedBy(g),A=P.tradeFee.multipliedBy(g),F=L.build(i),U={assetIn:e,assetOut:t,errors:B,tradeCount:g,tradeImpactPct:P.priceImpactPct,tradePeriod:pe,tradeRoute:F,type:"TwapSell"};return{...U,amountIn:a,amountOut:w,tradeAmountIn:P.amountIn,tradeAmountOut:P.amountOut,tradeFee:A,toHuman(){return{...U,amountIn:x(a,c),amountOut:x(w,h),tradeAmountIn:x(P.amountIn,c),tradeAmountOut:x(P.amountOut,h),tradeFee:x(A,h)}}}}async getTwapBuyOrder(e,t,r){let[s,n]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestBuy(e,t,r)]),{amountOut:a,swaps:i,priceImpactPct:o}=n,l=i[0],u=i[i.length-1],{assetInDecimals:c}=l,{assetOutDecimals:h}=u,d=Math.abs(o),g=this.getTwapTradeCount(d),b=a.dividedBy(g).decimalPlaces(0,1),P=await this.router.getBestBuy(l.assetIn,u.assetOut,x(b,h)),T=P.amountIn.multipliedBy(g),f=g===1,I=T.isLessThan(s),B=P.priceImpactPct<Je,w=[];I||f?w.push("OrderTooSmall"):B&&w.push("OrderImpactTooBig");let A=P.tradeFee.multipliedBy(g),F=L.build(i),U={assetIn:e,assetOut:t,errors:w,tradeCount:g,tradeImpactPct:P.priceImpactPct,tradePeriod:pe,tradeRoute:F,type:"TwapBuy"};return{...U,amountIn:T,amountOut:a,tradeAmountIn:P.amountIn,tradeAmountOut:P.amountOut,tradeFee:A,toHuman(){return{...U,amountIn:x(T,c),amountOut:x(a,h),tradeAmountIn:x(P.amountIn,c),tradeAmountOut:x(P.amountOut,h),tradeFee:x(A,c)}}}}getTwapTradeCount(e){let t=this.getOptimalTradeCount(e);if(this.getTwapExecutionTime(t)>je){let s=je/(this.blockTime*pe);return Math.round(s)}return t}getTwapExecutionTime(e){return e*pe*this.blockTime}toBlockPeriod(e){let t=e/this.blockTime,r=Math.round(t);return Math.max(r,ft)}};var j=class extends k{evm;evmClient;balanceClient;aaveUtils;constructor(e,t){super(e),this.evm=t,this.evmClient=t.getWsProvider(),this.balanceClient=new M(e),this.aaveUtils=new Y(t)}wrapTx(e,t,r){return{hex:t.toHex(),name:e,extraGas:r,get:()=>t,dryRun:s=>this.dryRun(s,t)}}async dryRun(e,t){let r;try{r=await this.api.call.dryRunApi.dryRunCall({System:{Signed:e}},t.inner.toHex())}catch(s){throw console.error(s),new Error("Dry run execution failed!")}if(r.isOk)return r.asOk;throw console.log(r.asErr.toHuman()),new Error("Dry run execution error!")}dispatchWithExtraGas(e){return this.api.tx.dispatcher.dispatchWithExtraGas(e.inner.toHex(),Z)}isDirectOmnipoolTrade(e){return e.length===1&&e[0].pool==="Omnipool"}};var ke=class extends j{_trade;_beneficiary;_slippagePct=1;setTrade(e){return this._trade=e,this}withBeneficiary(e){return this._beneficiary=e,this}withSlippage(e){return this._slippagePct=e,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:e,swaps:t,type:r}=this.trade;if(r==="Buy")return this.buildBuyTx();let s=t[0],{assetIn:n,assetOut:a}=s,o=(await this.balanceClient.getBalance(this.beneficiary,n)).minus(5),l=!0;return s.isWithdraw()&&(l=(await this.aaveUtils.getMaxWithdraw(this.beneficiary,a)).amount.isGreaterThanOrEqualTo(o)),l&&e.isGreaterThanOrEqualTo(o)?this.buildSellAllTx():this.buildSellTx()}buildBuyTx(){let{amountIn:e,amountOut:t,swaps:r}=this.trade,s=r[0],n=r[r.length-1],a=V(e,this.slippagePct),i=s.assetIn,o=n.assetOut,l=e.plus(a),u;return this.isDirectOmnipoolTrade(r)?u=this.api.tx.omnipool.buy(o,i,t.toFixed(),l.toFixed()):u=this.api.tx.router.buy(i,o,t.toFixed(),l.toFixed(),L.build(r)),this.wrapTx("RouterBuy",u)}async buildSellTx(){let{amountIn:e,amountOut:t,swaps:r}=this.trade,s=r[0],n=r[r.length-1],a=V(t,this.slippagePct),i=s.assetIn,o=n.assetOut,l=t.minus(a),u;if(this.isDirectOmnipoolTrade(r)?u=this.api.tx.omnipool.sell(i,o,e.toFixed(),l.toFixed()):u=this.api.tx.router.sell(i,o,e.toFixed(),l.toFixed(),L.build(r)),s.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let h=this.dispatchWithExtraGas(u);return this.wrapTx("RouterSellAll",h,Z)}return this.wrapTx("RouterSell",u)}async buildSellAllTx(){let{amountOut:e,swaps:t}=this.trade,r=t[0],s=t[t.length-1],n=V(e,this.slippagePct),a=r.assetIn,i=s.assetOut,o=e.minus(n),l=this.api.tx.router.sellAll(a,i,o.toFixed(),L.build(t));if(r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let c=this.dispatchWithExtraGas(l);return this.wrapTx("RouterSellAll",c,Z)}return this.wrapTx("RouterSellAll",l)}};var Ce=class extends j{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(e){return this._order=e,this}withBeneficiary(e){return this._beneficiary=e,this}withMaxRetries(e){return this._maxRetries=e,this}withSlippage(e){return this._slippagePct=e,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:e}=this.order;switch(e){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${e}`)}}buildDcaTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradePeriod:n,tradeRoute:a}=this.order,i=this.api.tx.dca.schedule({owner:this.beneficiary,period:n,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Sell:{assetIn:t,assetOut:r,amountIn:s.toFixed(),minAmountOut:"0",route:a}}},null);return this.wrapTx("DcaSchedule",i)}buildTwapSellTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:n,tradePeriod:a,tradeRoute:i}=this.order,o=V(n,this.slippagePct),l=n.minus(o),u=this.api.tx.dca.schedule({owner:this.beneficiary,period:a,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Sell:{assetIn:t,assetOut:r,amountIn:s.toFixed(),minAmountOut:l.toFixed(),route:i}}},null);return this.wrapTx("DcaSchedule.twapSell",u)}buildTwapBuyTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:n,tradePeriod:a,tradeRoute:i}=this.order,o=V(s,this.slippagePct),l=s.plus(o),u=this.api.tx.dca.schedule({owner:this.beneficiary,period:a,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Buy:{assetIn:t,assetOut:r,amountOut:n.toFixed(),maxAmountIn:l.toFixed(),route:i}}},null);return this.wrapTx("DcaSchedule.twapBuy",u)}};var ge=class{api;evm;constructor(e,t){this.api=e,this.evm=t}trade(e){return new ke(this.api,this.evm).setTrade(e)}order(e){return new Ce(this.api,this.evm).setOrder(e)}};function oc(m){let e=new re(m),t=new Oe(m),r=new ie(m,t),s=new Y(t),n=new me(r),a=new de(n,{blockTime:e.blockTime,minBudgetInNative:e.minOrderBudget});return{api:{aave:s,router:n,scheduler:a},client:{asset:new $(m),balance:new M(m)},ctx:{pool:r},evm:t,tx:new ge(m,t),destroy:()=>{r.destroy()}}}export{Ur as AMOUNT_MAX,Q as AaveClient,xe as AavePool,Be as AavePoolClient,Y as AaveUtils,$ as AssetClient,at as AssetNotFound,es as BASILISK_PARACHAIN_ID,M as BalanceClient,O as BigNumber,ie as CachingPoolService,re as ChainParams,Ft as DECIMAL_PLACES,He as DENOMINATOR,q as ERC20,Oe as EvmClient,Ye as FarmClient,z as H160,fe as HUB_ASSET_ID,ts as HYDRADX_PARACHAIN_ID,W as HYDRADX_SS58_PREFIX,cs as INFINITY,G as LbpMath,Ie as LbpPool,Ae as LbpPoolClient,R as ONE,N as OmniMath,ve as OmniPool,Ne as OmniPoolClient,k as PolkadotApiClient,it as PoolConfigNotFound,J as PoolError,ae as PoolFactory,we as PoolNotFound,ne as PoolService,E as PoolType,ut as ProviderConfigNotFound,ee as RUNTIME_DECIMALS,K as RouteNotFound,ue as Router,Qe as SYSTEM_ASSET_DECIMALS,D as SYSTEM_ASSET_ID,_ as StableMath,Ee as StableSwap,_e as StableSwapClient,ot as StorageConfigNotFound,lt as SubscriptionNotSupported,te as TRADEABLE_DEFAULT,Pt as TradeOrderError,Ke as TradeOrderType,L as TradeRouteBuilder,me as TradeRouter,de as TradeScheduler,ze as TradeType,ge as TxBuilderFactory,X as XykMath,Fe as XykPool,Re as XykPoolClient,S as ZERO,vn as bnFormatter,p as bnum,ht as calculateBuyFee,zl as calculateDiffToAvg,ce as calculateDiffToRef,gt as calculateSellFee,ct as createChain,oc as createSdkContext,dt as findNestedKey,An as findNestedObj,V as getFraction,At as isEvmAccount,vt as isEvmAddress,Nt as isSs58Address,v as scale,ms as toBn,x as toDecimals};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare const AAVE_POOL_PROXY = "0x1b02E051683b5cfaC5929C25E84adb26ECf87B38";
|
|
2
2
|
export declare const AAVE_POOL_DATA_PROVIDER = "0x112b087b60C1a166130d59266363C45F8aa99db0";
|
|
3
3
|
export declare const AAVE_LENDING_POOL_ADDRESS = "0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691";
|
|
4
|
-
export declare const
|
|
4
|
+
export declare const AAVE_EXTRA_GAS = 1000000n;
|
|
5
5
|
export declare const AAVE_ROUNDING_THRESHOLD = 5;
|
|
6
6
|
export declare const AAVE_UINT_256_MAX: bigint;
|
|
@@ -2,7 +2,7 @@ import { ApiPromise } from '@polkadot/api';
|
|
|
2
2
|
import { UnsubscribePromise } from '@polkadot/api-base/types';
|
|
3
3
|
import { BalanceClient } from '../client';
|
|
4
4
|
import { EvmClient } from '../evm';
|
|
5
|
-
import { MmOracleClient } from '../
|
|
5
|
+
import { MmOracleClient } from '../oracle';
|
|
6
6
|
import { Asset } from '../types';
|
|
7
7
|
import { PoolBase, PoolFees, PoolPair, PoolType } from './types';
|
|
8
8
|
export declare abstract class PoolClient extends BalanceClient {
|
|
@@ -29,7 +29,7 @@ export declare class TradeScheduler {
|
|
|
29
29
|
* @param asset - assetIn id
|
|
30
30
|
* @returns minimum order budget
|
|
31
31
|
*/
|
|
32
|
-
|
|
32
|
+
getMinimumOrderBudget(asset: string): Promise<BigNumber>;
|
|
33
33
|
/**
|
|
34
34
|
* Calculate minimum number of trades for order execution.
|
|
35
35
|
*
|
|
@@ -14,7 +14,7 @@ export declare abstract class TxBuilder extends PolkadotApiClient {
|
|
|
14
14
|
protected readonly balanceClient: BalanceClient;
|
|
15
15
|
protected readonly aaveUtils: AaveUtils;
|
|
16
16
|
constructor(api: ApiPromise, evm: EvmClient);
|
|
17
|
-
protected wrapTx(name: string, tx: SubmittableExtrinsic): SubstrateTransaction;
|
|
17
|
+
protected wrapTx(name: string, tx: SubmittableExtrinsic, extraGas?: bigint): SubstrateTransaction;
|
|
18
18
|
protected dryRun(account: string, extrinsic: SubmittableExtrinsic): Promise<CallDryRunEffects>;
|
|
19
19
|
protected dispatchWithExtraGas(tx: SubmittableExtrinsic): SubmittableExtrinsic;
|
|
20
20
|
protected isDirectOmnipoolTrade(swaps: Swap[]): boolean;
|
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|