@galacticcouncil/sdk 9.6.3 → 9.7.0-pr175-55d0189
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var ct=Object.defineProperty;var mr=Object.getOwnPropertyDescriptor;var pr=Object.getOwnPropertyNames;var dr=Object.prototype.hasOwnProperty;var gr=(l,e)=>{for(var t in e)ct(l,t,{get:e[t],enumerable:!0})},hr=(l,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of pr(e))!dr.call(l,s)&&s!==t&&ct(l,s,{get:()=>e[s],enumerable:!(r=mr(e,s))||r.enumerable});return l};var fr=l=>hr(ct({},"__esModule",{value:!0}),l);var Dr={};gr(Dr,{AaveClient:()=>ie,AavePool:()=>Be,AavePoolClient:()=>Ae,AaveUtils:()=>Z,AssetClient:()=>J,AssetNotFound:()=>bt,BASILISK_PARACHAIN_ID:()=>Vr,BalanceClient:()=>q,BigNumber:()=>x.BigNumber,CachingPoolService:()=>ce,ChainParams:()=>oe,DECIMAL_PLACES:()=>qt,ERC20:()=>z,EvmClient:()=>Te,FarmClient:()=>Xe,H160:()=>te,HUB_ASSET_ID:()=>be,HYDRADX_PARACHAIN_ID:()=>jr,HYDRADX_SS58_PREFIX:()=>j,INFINITY:()=>yr,LbpMath:()=>W,LbpPool:()=>Re,LbpPoolClient:()=>Ne,ONE:()=>k,OmniMath:()=>N,OmniPool:()=>_e,OmniPoolClient:()=>Ee,PERMILL_DENOMINATOR:()=>ee,PolkadotApiClient:()=>L,PoolConfigNotFound:()=>Pt,PoolError:()=>se,PoolFactory:()=>me,PoolNotFound:()=>ve,PoolService:()=>ue,PoolType:()=>D,ProviderConfigNotFound:()=>xt,RUNTIME_DECIMALS:()=>Se,RouteNotFound:()=>re,Router:()=>pe,SYSTEM_ASSET_DECIMALS:()=>Dt,SYSTEM_ASSET_ID:()=>M,StableMath:()=>C,StableSwap:()=>De,StableSwapClient:()=>Ce,StorageConfigNotFound:()=>St,SubscriptionNotSupported:()=>wt,TRADEABLE_DEFAULT:()=>we,TradeOrderError:()=>_t,TradeOrderType:()=>it,TradeRouteBuilder:()=>G,TradeRouter:()=>ge,TradeScheduler:()=>he,TradeType:()=>st,TxBuilderFactory:()=>ye,XykMath:()=>V,XykPool:()=>Fe,XykPoolClient:()=>ke,ZERO:()=>b,bnFormatter:()=>Rr,bnum:()=>p,calculateBuyFee:()=>Nt,calculateDiffToAvg:()=>Fr,calculateDiffToRef:()=>de,calculateSellFee:()=>Rt,createChain:()=>vt,createSdkContext:()=>kr,findNestedKey:()=>Bt,findNestedObj:()=>Ar,getFraction:()=>Q,isEvmAccount:()=>Ct,isEvmAddress:()=>Mt,isSs58Address:()=>Lt,scale:()=>R,toBn:()=>Pr,toDecimals:()=>T});module.exports=fr(Dr);var He=[{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 mt=[{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 kt="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",pt="0x112b087b60C1a166130d59266363C45F8aa99db0",dt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",Pe=1000000n;var Hr=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:mt,address:pt,args:[dt],functionName:"getReservesData"})}async getUserReservesData(e){return await this.client.readContract({abi:mt,address:pt,args:[dt,e],functionName:"getUserReservesData"})}async getUserAccountData(e){return await this.client.readContract({abi:He,address:kt,args:[e],functionName:"getUserAccountData"})}};var K=require("@polkadot/util-crypto"),ne=require("@polkadot/util"),Y=require("buffer");var Vr=2090,ee=1e6,be="1",jr=2034,j=63,Se=18,M="0",Dt=12,we=15;var gt="ETH\0";function Ct(l){if(!l)return!1;try{let e=(0,K.decodeAddress)(l,!0),t=Y.Buffer.from(gt);return Y.Buffer.from(e.subarray(0,t.length)).equals(t)}catch{return!1}}function Mt(l){return!!/^0x[a-fA-F0-9]{40}$/.test(l)}function Lt(l){try{let e=(0,ne.isHex)(l)?(0,ne.hexToU8a)(l):(0,K.decodeAddress)(l);return(0,K.encodeAddress)(e),!0}catch{return!1}}var te=class l{static toAccount=e=>{let t=Y.Buffer.from(e.slice(2),"hex"),r=Y.Buffer.from(gt);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(gt),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,ne.u8aToHex)(r)};static fromAny=e=>{if(Mt(e))return e;if(Ct(e))return l.fromAccount(e);if(Lt(e))return l.fromSS58(e);throw new Error("Unknown address type")}};var xe=require("buffer"),z=class{static fromAssetId(e){let t=Number(e),r=xe.Buffer.alloc(20,0);return r[15]=1,r.writeUInt32BE(t,16),"0x"+r.toString("hex")}static toAssetId(e){let t=xe.Buffer.from(e.replace("0x",""),"hex");return t.length!==20||!this.isAssetAddress(e)?null:t.readUInt32BE(16)}static isAssetAddress(e){let t=xe.Buffer.from("0000000000000000000000000000000100000000","hex"),r=xe.Buffer.from(e.replace("0x",""),"hex");return r.length!==20?!1:r.subarray(0,16).equals(t.subarray(0,16))}};var x=require("bignumber.js"),qt=12;x.BigNumber.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:qt});var b=p(0),k=p(1),yr=p("Infinity");function R(l,e){let t=new x.BigNumber(e.toString()),r=new x.BigNumber(10).pow(t);return l.times(r).decimalPlaces(0,1)}function p(l){return new x.BigNumber(l.toString())}function Pr(l,e){let t=p(l);return R(t,e)}function T(l,e){return l.shiftedBy(-1*e).toString()}var ze=p("1e27"),br=p("1.01"),Sr=p("31536000"),Z=class{client;constructor(e){this.client=new ie(e)}async getSummary(e){let t=te.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,P]=i,f=p(P).dividedBy(1e18).decimalPlaces(6,x.BigNumber.ROUND_DOWN),w=p(c),S=p(m),A=[];for(let B of a){let v=B.underlyingAsset.toLowerCase(),I=o.find(({underlyingAsset:cr})=>cr.toLowerCase()===v);if(!I)throw new Error("Missing pool reserve for "+v);let F=p(B.scaledATokenBalance),H=p(I.liquidityIndex),Ue=p(I.liquidityRate),Ge=p(I.availableLiquidity),at=p(I.priceInMarketReferenceCurrency),lt=n+6,ut=this.calculateLinearInterest(Ue,I.lastUpdateTimestamp,lt),We=H.multipliedBy(ut).dividedBy(ze).decimalPlaces(0,x.BigNumber.ROUND_DOWN),or=F.multipliedBy(We).dividedBy(ze).decimalPlaces(0,x.BigNumber.ROUND_DOWN),ar=p(u!==0&&u===I.eModeCategoryId?I.eModeLiquidationThreshold:I.reserveLiquidationThreshold).div(1e4),lr=I.usageAsCollateralEnabled&&B.usageAsCollateralEnabledOnUser&&p(B.scaledATokenBalance).gt(0),ur=z.toAssetId(v);A.push({aTokenBalance:or,availableLiquidity:Ge,decimals:Number(I.decimals),isCollateral:lr,priceInRef:at,reserveId:ur,reserveAsset:v,reserveLiquidationThreshold:ar})}return{healthFactor:f.toNumber(),totalCollateral:w,totalDebt:S,reserves:A}}async hasBorrowPositions(e){let t=te.fromAny(e),r=await this.client.getUserAccountData(t),[s,i]=r;return i>0n}async getHealthFactor(e){let t=te.fromAny(e),r=await this.client.getUserAccountData(t),[s,i,n,o,a,u]=r;return p(u).dividedBy(1e18).decimalPlaces(6,x.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(w=>w.reserveAsset===o);if(!a)throw new Error("Missing reserve ctx for "+o);let{decimals:u,isCollateral:c,priceInRef:m,reserveLiquidationThreshold:h}=a,d=R(p(r),u).decimalPlaces(0,1),g=c?d.multipliedBy(m).dividedBy(p(10).pow(u)).decimalPlaces(0,x.BigNumber.ROUND_DOWN):b,P=s.minus(g);return P.lte(0)?0:P.multipliedBy(h).dividedBy(i).decimalPlaces(6,x.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=R(p(r),u).decimalPlaces(0,1).multipliedBy(c).dividedBy(p(10).pow(u)).decimalPlaces(0,x.BigNumber.ROUND_DOWN),g=s.plus(d);return g.lte(0)?0:g.multipliedBy(m).dividedBy(i).decimalPlaces(6,x.BigNumber.ROUND_DOWN).toNumber()}async getMaxWithdraw(e,t){let{totalDebt:r,reserves:s,healthFactor:i}=await this.getSummary(e),n=z.fromAssetId(t),o=s.find(a=>a.reserveAsset===n);if(!o)throw new Error("Missing reserve data for "+n);return this.calculateWithdrawMax(o,r,i)}async getMaxWithdrawAll(e){let{totalDebt:t,reserves:r,healthFactor:s}=await this.getSummary(e),i={};for(let n of r){let o=this.calculateWithdrawMax(n,t,s);n.reserveId&&(i[n.reserveId]=o)}return i}calculateWithdrawMax(e,t,r){let{aTokenBalance:s,availableLiquidity:i,decimals:n,priceInRef:o,reserveLiquidationThreshold:a,isCollateral:u}=e,c=s;if(u&&t.gt(0)){let h=p(r).minus(br);if(h.gt(0)){let g=h.multipliedBy(t).dividedBy(a).decimalPlaces(0,x.BigNumber.ROUND_DOWN).dividedBy(o).multipliedBy(p(10).pow(n)).decimalPlaces(0,x.BigNumber.ROUND_DOWN);c=x.BigNumber.minimum(s,g)}else c=b}return{amount:x.BigNumber.minimum(c,i),decimals:n}}calculateLinearInterest(e,t,r){let s=r-t;return s<=0?ze:e.multipliedBy(s).dividedBy(Sr).plus(ze).decimalPlaces(0,x.BigNumber.ROUND_DOWN)}};function Ut(l){switch(l){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var ds=require("@galacticcouncil/api-augment/hydradx"),gs=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 J=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(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: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:P}=d;switch(P.toString()){case"Bond":let f=n.get(m.toString());return this.getBond(m.toString(),d,u,f);case"StableSwap":let w=i.get(m.toString());return this.getShares(m.toString(),d,u,w);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 r=await this.api.query.tokens.accounts(e,t);return this.calculateFreeBalance(r)}async getErc20Balance(e,t){let r=await this.getTokenBalanceData(e,t);return this.calculateFreeBalance(r)}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 t=e.free.toString(),r=e.frozen.toString();return(0,x.BigNumber)(t).lt(r)?(0,x.BigNumber)(0):(0,x.BigNumber)(t).minus(r)}};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"),yt=require("@polkadot/util-crypto");var Xe=class extends L{balanceClient;constructor(e){super(e),this.balanceClient=new q(e)}secondsInYear=new x.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(),P=await this.balanceClient.getTokenBalanceData(d,g);return{assetId:e,globalFarm:u,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(),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(),P=await this.balanceClient.getTokenBalanceData(d,g);return{assetId:e,globalFarm:u,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 x.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,ht.fixed_from_rational)(o,a):u=(0,ht.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,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,yt.isAddress)(e))throw new Error("You must pass an address of isolated pool as id");if(t==="omnipool"&&(0,yt.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 x.BigNumber(a.totalSharesZ.toString()),h=a.plannedYieldingPeriods.toString(),d=new x.BigNumber(a.yieldPerPeriod.toString()),g=new x.BigNumber(a.maxRewardPerPeriod.toString()),P=a.blocksPerPeriod.toString(),f=new x.BigNumber(o.multiplier.toString()).shiftedBy(-18),w=this.secondsInYear.div(new x.BigNumber(r).times(P)),S;if(m.isZero())S=d.times(f).times(w);else{let F=this.getGlobalRewardPerPeriod(m,d,g,u);S=this.getPoolYieldPerPeriod(F,f,m,u).times(w)}let A=new x.BigNumber(a.pendingRewards.toString()).plus(a.accumulatedPaidRewards.toString()),B=g.times(h),v=c?A.plus(c):B;return A.div(v).gte(.999)?b:S.div(t==="isolatedpool"?2:1).times(100)}).reduce((o,a)=>o.plus(a),b).toString():void 0}};var ve=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},Pt=class extends Error{constructor(e,t){super(),this.message=`${e} pool missing ${t}`,this.name="PoolConfigNotFound"}},re=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"}},wt=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 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=l=>{let t=[l.endpoint,...wr],r=Array.from(new Set(t.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:"https://explorer.evm.hydration.cloud"}},testnet:!1})};var $=require("viem");function Ht(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 Te=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:Ht(this.wsProvider)})}getSigner(e){return(0,$.createWalletClient)({account:e,chain:this.chain,transport:(0,$.custom)(window.ethereum)})}};var Oe=(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 Ye=(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=Ye(()=>"illegal argument(s)"),zt=l=>{throw new xr(l)};var vr=Ye(()=>"index out of bounds"),Tt=l=>{throw new vr(l)},$e=(l,e,t)=>(l<e||l>=t)&&Tt(l);var Xt=23283064365386963e-26,Ve=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 je=class extends Ve{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 je(Math.random);var $t=l=>l!=null&&typeof l!="function"&&l.length!==void 0;var Vt=Object.getPrototypeOf({}),Ke="function",jt="string",ae=(l,e)=>{let t;if(l===e)return!0;if(l!=null){if(typeof l.equiv===Ke)return l.equiv(e)}else return l==e;if(e!=null){if(typeof e.equiv===Ke)return e.equiv(l)}else return l==e;return typeof l===jt||typeof e===jt?!1:(t=Object.getPrototypeOf(l),(t==null||t===Vt)&&(t=Object.getPrototypeOf(e),t==null||t===Vt)?Ir(l,e):typeof l!==Ke&&l.length!==void 0&&typeof e!==Ke&&e.length!==void 0?Tr(l,e):l instanceof Set&&e instanceof Set?Or(l,e):l instanceof Map&&e instanceof Map?Br(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)},Tr=(l,e,t=ae)=>{let r=l.length;if(r===e.length)for(;r-- >0&&t(l[r],e[r]););return r<0},Or=(l,e,t=ae)=>l.size===e.size&&t([...l.keys()].sort(),[...e.keys()].sort()),Br=(l,e,t=ae)=>l.size===e.size&&t([...l].sort(),[...e].sort()),Ir=(l,e,t=ae)=>{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 Ot=class{value;constructor(e){this.value=e}deref(){return this.value}};var Kt=l=>l instanceof Ot;var Ze=class l{_head;_length=0;constructor(e){e&&this.into(e)}get length(){return this._length}get head(){return this._head}[Symbol.iterator](){return Zt("next",this._head)}reverseIterator(){return Zt("prev",this.tail)}clear(){this.release()}compare(e,t=Oe){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||$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||Oe;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*Zt(l,e){for(;e;)yield e.value,e=e[l]}var Je=class l extends Ze{_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):($e(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):($e(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=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 l,n=this.nthCell(r);for(;n&&++r<=s;)i.push(n.value),n=n.next;return i}sort(e=Oe){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),$e(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 le=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 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 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 Qe=class l extends le{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 et=(l,e=new Map)=>t=>{let r;return e.has(t)?e.get(t):(e.set(t,r=l(t)),r)};var D=(i=>(i.Aave="Aave",i.LBP="Lbp",i.Omni="Omnipool",i.Stable="Stableswap",i.XYK="Xyk",i))(D||{}),se=(i=>(i.UnknownError="UnknownError",i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i))(se||{});var Be=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:b,assetOutED:b}}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 R(k,e.decimalsOut)}spotPriceOutGivenIn(e){return R(k,e.decimalsIn)}calculateTradeFee(e,t){return b}};var Jt=require("@polkadot/util-crypto"),Qt=require("@polkadot/util"),er=require("viem");function Bt(l,e){let t=[];return JSON.stringify(l,(r,s)=>(s&&s[e]&&t.push(s),s)),t[0]}function Ar(l,e,t){let r;return JSON.stringify(l,(s,i)=>(i&&i[e]===t&&(r=i),i)),r}var Rr=(l,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 Ie=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,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 Qe(null,{maxlen:1,ttl:1*60*60*1e3,release:e=>{this.mem>e&&this.log(this.getPoolType(),`mem ${e} released at`,new Date)}});memPools=et(e=>(this.log(this.getPoolType(),`mem ${e} sync`),this.getPools()),this.memPoolsCache);constructor(e,t){super(e),this.evm=t,this.mmOracle=new Ie(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 Nr=["Supply","Withdraw","Repay","Borrow"],Ae=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,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: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,er.decodeEventLog)({abi:He,topics:u.topics,data:u.data});Nr.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: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 y=class l{static toPct(e){let[t,r]=e;return l.safeDivide(t*100,r)}static toRaw(e){let[t,r]=e;return l.safeDivide(t,r)}static fromPermill(e){return[e,1e6]}static fromRate(e,t){return[e,t]}static safeDivide(e,t,r=12){let s=10**r;return Math.round(e*s/t)/s}static safeRound(e){return parseFloat(e.toPrecision(15))}};var Re=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=y.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=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: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()?b: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()?b:s}spotPriceInGivenOut(e){let t=W.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),R(k,e.decimalsOut).toString());return p(t)}spotPriceOutGivenIn(e){let t=W.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),R(k,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 Ne=class extends U{MAX_FINAL_WEIGHT=R(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());this.poolsData.set(i.toString(),o);let[c,m]=o.fee;return{address:a,type:"Lbp",fee:y.fromRate(c.toNumber(),m.toNumber()),...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(),P=p(m),f=d.toString(),w=this.MAX_FINAL_WEIGHT.minus(p(P)),[S,A,B]=await Promise.all([this.isRepayFeeApplied(g,u.toString(),c.toString()),this.getBalance(e,g),this.getBalance(e,f)]);return{repayFeeApply:S,tokens:[{id:g,weight:P,balance:A.toString()},{id:f,weight:w,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(){let[e,t]=this.api.consts.lbp.repayFee;return y.fromRate(e.toNumber(),t.toNumber())}getPoolLimits(){let e=this.api.consts.lbp.maxInRatio.toNumber(),t=this.api.consts.lbp.maxOutRatio.toNumber(),r=this.api.consts.lbp.minTradingLimit.toNumber();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 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,x.BigNumber)(t),n=(0,x.BigNumber)(e),o=(0,x.BigNumber)(s),u=(0,x.BigNumber)(r).shiftedBy(-18);if(i.div(o).lt(u)){let m=u.times(o).minus(i).times(n),h=i.times((0,x.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===b?b:n.div(s).multipliedBy(100).decimalPlaces(4),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(4),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?y.toRaw(r.assetFee).toString():b.toString(),r?y.toRaw(r.protocolFee).toString():b.toString()),i=p(s);return i.isNegative()?b:i}calculateLrnaInGivenOut(e,t,r){let s=N.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?y.toRaw(r.assetFee).toString():b.toString()),i=p(s);return i.isNegative()?b: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.toRaw(r.assetFee).toString():b.toString(),r?y.toRaw(r.protocolFee).toString():b.toString()),i=p(s);return i.isNegative()?b:i}calculateOutGivenLrnaIn(e,t,r){let s=N.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?y.toRaw(r.assetFee).toString():b.toString()),i=p(s);return i.isNegative()?b: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 Ee=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(),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,be]:[be,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),[P,f,w]=s===be?[0,0,0]:this.getProtocolFee(e,a.toNumber(),u,m),S=h+P,A=g+w;return{assetFee:y.fromPermill(d),protocolFee:y.fromPermill(f),min:y.fromPermill(S),max:y.fromPermill(A)}}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=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()),w=d.volume.bIn.toString(),S=d.volume.bOut.toString(),A=d.liquidity.b.toString();i===M&&(w=d.volume.aIn.toString(),S=d.volume.aOut.toString(),A=d.liquidity.a.toString());let B=y.fromPermill(g.toNumber()),v=N.recalculateAssetFee(w,S,A,"9",n.toString(),y.toRaw(B).toString(),f.toString(),y.toRaw(m).toString(),y.toRaw(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=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()),w=d.volume.bIn.toString(),S=d.volume.bOut.toString(),A=d.liquidity.b.toString();i===M&&(w=d.volume.aIn.toString(),S=d.volume.aOut.toString(),A=d.liquidity.a.toString());let B=y.fromPermill(g.toNumber()),v=N.recalculateProtocolFee(w,S,A,"9",n.toString(),y.toRaw(B).toString(),f.toString(),y.toRaw(m).toString(),y.toRaw(h).toString(),u.toString(),c.toString());return[o.toNumber(),Number(v)*1e6,a.toNumber()]}getPoolId(){return(0,tr.encodeAddress)((0,rr.stringToU8a)("modlomnipool".padEnd(32,"\0")),63)}getPoolLimits(){let e=this.api.consts.omnipool.maxInRatio.toNumber(),t=this.api.consts.omnipool.maxOutRatio.toNumber(),r=this.api.consts.omnipool.minimumTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};var _=require("@galacticcouncil/math-xyk"),V=class{static getSpotPrice(e,t,r){return(0,_.get_spot_price)(e,t,r)}static calculateInGivenOut(e,t,r){return(0,_.calculate_in_given_out)(e,t,r)}static calculateOutGivenIn(e,t,r){return(0,_.calculate_out_given_in)(e,t,r)}static calculatePoolTradeFee(e,t,r){return(0,_.calculate_pool_trade_fee)(e,t,r)}static calculateLiquidityIn(e,t,r){return(0,_.calculate_liquidity_in)(e,t,r)}static calculateSpotPrice(e,t){return(0,_.calculate_spot_price)(e,t)}static calculateSpotPriceWithFee(e,t,r,s){return(0,_.calculate_spot_price_with_fee)(e,t,r,s)}static calculateShares(e,t,r){return(0,_.calculate_shares)(e,t,r)}static calculateLiquidityOutAssetA(e,t,r,s){return(0,_.calculate_liquidity_out_asset_a)(e,t,r,s)}static calculateLiquidityOutAssetB(e,t,r,s){return(0,_.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=y.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=y.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()?b:s}calculateOutGivenIn(e,t){let r=V.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?b:s}spotPriceInGivenOut(e){let t=V.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),r=R(k,18-e.decimalsOut);return p(t).div(r)}spotPriceOutGivenIn(e){let t=V.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),r=R(k,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 ke=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(){let[e,t]=this.api.consts.xyk.getExchangeFee;return y.fromRate(e.toNumber(),t.toNumber())}getPoolLimits(){let e=this.api.consts.xyk.maxInRatio.toNumber(),t=this.api.consts.xyk.maxOutRatio.toNumber(),r=this.api.consts.xyk.minTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};var E=require("@galacticcouncil/math-stableswap"),C=class{static getPoolAddress(e){return(0,E.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,E.calculate_amplification)(e,t,r,s,i)}static calculateInGivenOut(e,t,r,s,i,n,o){return(0,E.calculate_in_given_out)(e,t,r,s,i,n,o)}static calculateAddOneAsset(e,t,r,s,i,n,o){return(0,E.calculate_add_one_asset)(e,t,r,s,i,n,o)}static calculateSharesForAmount(e,t,r,s,i,n,o){return(0,E.calculate_shares_for_amount)(e,t,r,s,i,n,o)}static calculateOutGivenIn(e,t,r,s,i,n,o){return(0,E.calculate_out_given_in)(e,t,r,s,i,n,o)}static calculateLiquidityOutOneAsset(e,t,r,s,i,n,o){return(0,E.calculate_liquidity_out_one_asset)(e,t,r,s,i,n,o)}static calculateShares(e,t,r,s,i,n){return(0,E.calculate_shares)(e,t,r,s,i,n)}static calculateSpotPriceWithFee(e,t,r,s,i,n,o,a){return(0,E.calculate_spot_price_with_fee)(e,t,r,s,i,n,o,a)}static recalculatePegs(e,t,r,s,i){let n=(0,E.recalculate_peg)(e,t,r,s,i);return JSON.parse(n)}};var De=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=i.minus(s),o=s===b?b:n.div(s).multipliedBy(100).decimalPlaces(4),a=[],u=N.isSellAllowed(e.tradeableIn),c=N.isBuyAllowed(e.tradeableOut);return(!u||!c)&&a.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&a.push("InsufficientTradingAmount"),{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(4),a=[],u=N.isSellAllowed(e.tradeableIn),c=N.isBuyAllowed(e.tradeableOut);return(!u||!c)&&a.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&a.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:o.toNumber(),errors:a}}calculateIn(e,t,r){let s=C.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?y.toRaw(r.fee).toString():b.toString(),this.getPegs()),i=p(s);return i.isNegative()?b:i}calculateAddOneAsset(e,t,r){let s=C.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,r?y.toRaw(r.fee).toString():b.toString(),this.getPegs()),i=p(s);return i.isNegative()?b:i}calculateSharesForAmount(e,t,r){let s=C.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,r?y.toRaw(r.fee).toString():b.toString(),this.getPegs()),i=p(s);return i.isNegative()?b: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=R(k,e.decimalsIn-e.decimalsOut);return p(t).div(s)}let r=R(k,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.toRaw(r.fee).toString():b.toString(),this.getPegs()),i=p(s);return i.isNegative()?b:i}calculateWithdrawOneAsset(e,t,r){let s=C.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,r?y.toRaw(r.fee).toString():b.toString(),this.getPegs()),i=p(s);return i.isNegative()?b:i}calculateShares(e,t,r){let s=C.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,r?y.toRaw(r.fee).toString():b.toString(),this.getPegs()),i=p(s);return i.isNegative()?b: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=R(k,e.decimalsOut-e.decimalsIn);return p(t).div(s)}let r=R(k,18-e.decimalsOut);return p(t).div(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 tt=require("@polkadot/util-crypto");var Ce=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:[n]},o])=>{try{let a=o.unwrap(),u=n.toString(),c=this.getPoolAddress(u),[m,h,d]=await Promise.all([this.getPoolDelta(u,a,r.toString()),this.getPoolTokens(c,u,a),this.getPoolPegs(u,a,r.toString())]);return h.push({id:u,tradeable:15,balance:m.totalIssuance}),this.stablePools.set(c,a),{address:c,id:u,type:"Stableswap",fee:y.fromPermill(a.fee.toNumber()),tokens:h,...m,...d,...this.getPoolLimits()}}catch(a){return console.warn(`Skipping pool ${n.toString()}
|
|
2
|
-
`,String(
|
|
3
|
-
Items: [${this.feeCache.length}]`),this.feeCache.release(),this.disconnectSubscribeNewHeads?.()}};var me=class{static get(e){switch(e.type){case"Aave":return Be.fromPool(e);case"Xyk":return Fe.fromPool(e);case"Omnipool":return _e.fromPool(e);case"Lbp":return Re.fromPool(e);case"Stableswap":return De.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};var rt=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 _r=6,Me=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 rt,n=[];for(n.push([t,""]),i.enqueue(n);i.size()>0;){let o=i.dequeue();if(o==null||o.length>_r)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(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 Le=class{getProposals(e,t,r){let s=At(r),i=Object.keys(s),n=i.map(c=>s[c]).flat(),o=new Me,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 pe=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),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 Fr(l,e){return l.minus(e).abs().div(l.plus(e).div(2)).multipliedBy(100).decimalPlaces(2)}function de(l,e){return l.minus(e).div(e).multipliedBy(100).decimalPlaces(2)}function Rt(l,e){return k.minus(e.div(l)).multipliedBy(100).decimalPlaces(4)}function Nt(l,e){return e.div(l).minus(k).multipliedBy(100).decimalPlaces(4)}function Q(l,e){return(e<.01||e>100)&&new Error("Supported range is from 0.01% - 100%"),l.div(Er).multipliedBy(e).decimalPlaces(0,1)}var st=(t=>(t.Buy="Buy",t.Sell="Sell",t))(st||{}),it=(r=>(r.Dca="Dca",r.TwapSell="TwapSell",r.TwapBuy="TwapBuy",r))(it||{}),_t=(r=>(r.OrderTooSmall="OrderTooSmall",r.OrderTooBig="OrderTooBig",r.OrderImpactTooBig="OrderImpactTooBig",r))(_t||{});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 re(e,t);let a;if(s)a=await this.toSellSwaps(r,s,n);else{let v=o.map(async F=>await this.toSellSwaps(r,F,n)),I=await Promise.all(v);a=this.findBestSellRoute(I)}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,I)=>v.multipliedBy(I)),d=R(h,c.assetOutDecimals),g=m?c.calculatedOut:this.calculateDelta0Y(u.amountIn,a,n),P=c.amountOut,f=m?c.tradeFeePct:Rt(g,P).toNumber(),w=g.minus(P),S=this.getRouteFeeRange(a),A=u.amountIn.shiftedBy(-1*u.assetInDecimals).multipliedBy(d),B=de(g,A);return{type:"Sell",amountIn:u.amountIn,amountOut:c.amountOut,spotPrice:d,tradeFee:w,tradeFeePct:f,tradeFeeRange:S,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(w,c.assetOutDecimals),tradeFeePct:f,tradeFeeRange:S,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=R(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),P=this.getPoolFeeRange(c),f=o.spotPriceOutGivenIn(a),w=u.shiftedBy(-1*a.decimalsIn).multipliedBy(f),S=de(h,w);s.push({...n,assetInDecimals:a.decimalsIn,assetOutDecimals:a.decimalsOut,amountIn:u,amountOut:m,calculatedOut:h,spotPrice:f,tradeFeePct:d,tradeFeeRange:P,priceImpactPct:S.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:P,priceImpactPct:S.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 re(e,t);let u=r.filter(d=>d.tokens.some(g=>g.id===e)).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(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:R(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 re(e,t);let a;if(s)a=await this.toBuySwaps(r,s,n);else{let v=o.map(async F=>await this.toBuySwaps(r,F,n)),I=await Promise.all(v);a=this.findBestBuyRoute(I)}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,I)=>v.multipliedBy(I)),d=R(h,c.assetInDecimals),g=m?c.calculatedIn:this.calculateDelta0X(u.amountOut,a,n),P=c.amountIn,f=m?c.tradeFeePct:Nt(g,P).toNumber(),w=P.minus(g),S=this.getRouteFeeRange(a),A=u.amountOut.shiftedBy(-1*u.assetOutDecimals).multipliedBy(d),B;return g.isZero()?B=-100:B=de(A,g).toNumber(),{type:"Buy",amountOut:u.amountOut,amountIn:c.amountIn,spotPrice:d,tradeFee:w,tradeFeePct:f,tradeFeeRange:S,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(w,c.assetInDecimals),tradeFeePct:f,tradeFeeRange:S,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=R(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),P=this.getPoolFeeRange(c),f=o.spotPriceInGivenOut(a),w=u.shiftedBy(-1*a.decimalsOut).multipliedBy(f),S;h.isZero()?S=-100:S=de(w,h).toNumber(),s.unshift({...n,assetInDecimals:a.decimalsIn,assetOutDecimals:a.decimalsOut,amountIn:m,amountOut:u,calculatedIn:h,spotPrice:f,tradeFeePct:d,tradeFeeRange:P,priceImpactPct:S,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:P,priceImpactPct:S,errors:g}}})}return s}};var sr=6e3,ir=p(1e15),qe=6,Et=-5,Ft=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 he=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,P=Math.abs(c),f=this.getMinimumTradeCount(a,n),w=this.getOptimalTradeCount(P),S=i?Math.round(s/i):w,A=Math.ceil(s/f),B=Math.round(s/w),v=Math.round(s/S),I=a.dividedBy(S).decimalPlaces(0,1),F=await this.router.getBestSell(e,t,T(I,d)),H=a.isLessThan(n),Ue=[];H&&Ue.push("OrderTooSmall");let Ge=F.amountOut.multipliedBy(S),at=this.toBlockPeriod(v),lt=F.tradeFee.multipliedBy(S),ut=G.build(u),We={assetIn:e,assetOut:t,errors:Ue,frequencyMin:A,frequencyOpt:B,frequency:v,tradeCount:S,tradeFee:lt,tradeImpactPct:F.priceImpactPct,tradePeriod:at,tradeRoute:ut,type:"Dca"};return{...We,amountIn:a,amountOut:Ge,tradeAmountIn:F.amountIn,tradeAmountOut:F.amountOut,toHuman(){return{...We,amountIn:T(a,d),amountOut:T(Ge,g),tradeAmountIn:T(F.amountIn,d),tradeAmountOut:T(F.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),P=n.dividedBy(g).decimalPlaces(0,1),f=await this.router.getBestSell(u.assetIn,c.assetOut,T(P,m)),w=g===1,S=n.isLessThan(s),A=f.priceImpactPct<Et,B=[];S||w?B.push("OrderTooSmall"):A&&B.push("OrderImpactTooBig");let v=f.amountOut.multipliedBy(g),I=f.tradeFee.multipliedBy(g),F=G.build(o),H={assetIn:e,assetOut:t,errors:B,tradeCount:g,tradeImpactPct:f.priceImpactPct,tradePeriod:qe,tradeRoute:F,type:"TwapSell"};return{...H,amountIn:n,amountOut:v,tradeAmountIn:f.amountIn,tradeAmountOut:f.amountOut,tradeFee:I,toHuman(){return{...H,amountIn:T(n,m),amountOut:T(v,h),tradeAmountIn:T(f.amountIn,m),tradeAmountOut:T(f.amountOut,h),tradeFee:T(I,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),P=n.dividedBy(g).decimalPlaces(0,1),f=await this.router.getBestBuy(u.assetIn,c.assetOut,T(P,h)),w=f.amountIn.multipliedBy(g),S=g===1,A=w.isLessThan(s),B=f.priceImpactPct<Et,v=[];A||S?v.push("OrderTooSmall"):B&&v.push("OrderImpactTooBig");let I=f.tradeFee.multipliedBy(g),F=G.build(o),H={assetIn:e,assetOut:t,errors:v,tradeCount:g,tradeImpactPct:f.priceImpactPct,tradePeriod:qe,tradeRoute:F,type:"TwapBuy"};return{...H,amountIn:w,amountOut:n,tradeAmountIn:f.amountIn,tradeAmountOut:f.amountOut,tradeFee:I,toHuman(){return{...H,amountIn:T(w,m),amountOut:T(n,h),tradeAmountIn:T(f.amountIn,m),tradeAmountOut:T(f.amountOut,h),tradeFee:T(I,m)}}}}getTwapTradeCount(e){let t=this.getOptimalTradeCount(e);if(this.getTwapExecutionTime(t)>Ft){let s=Ft/(this.blockTime*qe);return Math.round(s)}return t}getTwapExecutionTime(e){return e*qe*this.blockTime}toBlockPeriod(e){let t=e/this.blockTime,r=Math.round(t);return Math.max(r,nr)}};var fe=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 Z(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(),Pe)}isDirectOmnipoolTrade(e){return e.length===1&&e[0].pool==="Omnipool"}};var nt=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),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,Pe)}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,Pe)}return this.wrapTx("RouterSellAll",u)}};var ot=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=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 ye=class{api;evm;constructor(e,t){this.api=e,this.evm=t}trade(e){return new nt(this.api,this.evm).setTrade(e)}order(e){return new ot(this.api,this.evm).setOrder(e)}};function kr(l){let e=new oe(l),t=new Te(l),r=new ce(l,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 J(l),balance:new q(l)},ctx:{pool:r},evm:t,tx:new ye(l,t),destroy:()=>{r.destroy()}}}0&&(module.exports={AaveClient,AavePool,AavePoolClient,AaveUtils,AssetClient,AssetNotFound,BASILISK_PARACHAIN_ID,BalanceClient,BigNumber,CachingPoolService,ChainParams,DECIMAL_PLACES,ERC20,EvmClient,FarmClient,H160,HUB_ASSET_ID,HYDRADX_PARACHAIN_ID,HYDRADX_SS58_PREFIX,INFINITY,LbpMath,LbpPool,LbpPoolClient,ONE,OmniMath,OmniPool,OmniPoolClient,PERMILL_DENOMINATOR,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 mt=Object.defineProperty;var pr=Object.getOwnPropertyDescriptor;var dr=Object.getOwnPropertyNames;var gr=Object.prototype.hasOwnProperty;var hr=(l,e)=>{for(var t in e)mt(l,t,{get:e[t],enumerable:!0})},yr=(l,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of dr(e))!gr.call(l,s)&&s!==t&&mt(l,s,{get:()=>e[s],enumerable:!(r=pr(e,s))||r.enumerable});return l};var fr=l=>yr(mt({},"__esModule",{value:!0}),l);var Cr={};hr(Cr,{AaveClient:()=>ie,AavePool:()=>Ie,AavePoolClient:()=>Re,AaveUtils:()=>Z,AssetClient:()=>J,AssetNotFound:()=>St,BASILISK_PARACHAIN_ID:()=>jr,BalanceClient:()=>q,BalanceClientV2:()=>ae,BigNumber:()=>w.BigNumber,CachingPoolService:()=>me,ChainParams:()=>oe,DECIMAL_PLACES:()=>Ut,ERC20:()=>z,EvmClient:()=>Be,FarmClient:()=>Ye,H160:()=>te,HUB_ASSET_ID:()=>Se,HYDRADX_PARACHAIN_ID:()=>Kr,HYDRADX_SS58_PREFIX:()=>j,INFINITY:()=>Pr,LbpMath:()=>W,LbpPool:()=>Ne,LbpPoolClient:()=>_e,ONE:()=>D,OmniMath:()=>N,OmniPool:()=>Ee,OmniPoolClient:()=>Fe,PERMILL_DENOMINATOR:()=>ee,PolkadotApiClient:()=>L,PoolConfigNotFound:()=>bt,PoolError:()=>se,PoolFactory:()=>pe,PoolNotFound:()=>Te,PoolService:()=>ce,PoolType:()=>C,ProviderConfigNotFound:()=>vt,RUNTIME_DECIMALS:()=>we,RouteNotFound:()=>re,Router:()=>de,SYSTEM_ASSET_DECIMALS:()=>Ct,SYSTEM_ASSET_ID:()=>_,StableMath:()=>M,StableSwap:()=>Ce,StableSwapClient:()=>Me,StorageConfigNotFound:()=>wt,SubscriptionNotSupported:()=>xt,TRADEABLE_DEFAULT:()=>xe,TradeOrderError:()=>Et,TradeOrderType:()=>nt,TradeRouteBuilder:()=>G,TradeRouter:()=>he,TradeScheduler:()=>ye,TradeType:()=>it,TxBuilderFactory:()=>Pe,XykMath:()=>V,XykPool:()=>ke,XykPoolClient:()=>De,ZERO:()=>b,bnFormatter:()=>Nr,bnum:()=>p,calculateBuyFee:()=>_t,calculateDiffToAvg:()=>kr,calculateDiffToRef:()=>ge,calculateSellFee:()=>Nt,createChain:()=>Tt,createSdkContext:()=>Dr,findNestedKey:()=>It,findNestedObj:()=>Rr,getFraction:()=>Q,isEvmAccount:()=>Mt,isEvmAddress:()=>Lt,isSs58Address:()=>qt,scale:()=>R,toBn:()=>br,toDecimals:()=>T});module.exports=fr(Cr);var ze=[{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 pt=[{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 Dt="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",dt="0x112b087b60C1a166130d59266363C45F8aa99db0",gt="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",be=1000000n;var zr=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:pt,address:dt,args:[gt],functionName:"getReservesData"})}async getUserReservesData(e){return await this.client.readContract({abi:pt,address:dt,args:[gt,e],functionName:"getUserReservesData"})}async getUserAccountData(e){return await this.client.readContract({abi:ze,address:Dt,args:[e],functionName:"getUserAccountData"})}};var K=require("@polkadot/util-crypto"),ne=require("@polkadot/util"),Y=require("buffer");var jr=2090,ee=1e6,Se="1",Kr=2034,j=63,we=18,_="0",Ct=12,xe=15;var ht="ETH\0";function Mt(l){if(!l)return!1;try{let e=(0,K.decodeAddress)(l,!0),t=Y.Buffer.from(ht);return Y.Buffer.from(e.subarray(0,t.length)).equals(t)}catch{return!1}}function Lt(l){return!!/^0x[a-fA-F0-9]{40}$/.test(l)}function qt(l){try{let e=(0,ne.isHex)(l)?(0,ne.hexToU8a)(l):(0,K.decodeAddress)(l);return(0,K.encodeAddress)(e),!0}catch{return!1}}var te=class l{static toAccount=e=>{let t=Y.Buffer.from(e.slice(2),"hex"),r=Y.Buffer.from(ht);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(ht),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,ne.u8aToHex)(r)};static fromAny=e=>{if(Lt(e))return e;if(Mt(e))return l.fromAccount(e);if(qt(e))return l.fromSS58(e);throw new Error("Unknown address type")}};var ve=require("buffer"),z=class{static fromAssetId(e){let t=Number(e),r=ve.Buffer.alloc(20,0);return r[15]=1,r.writeUInt32BE(t,16),"0x"+r.toString("hex")}static toAssetId(e){let t=ve.Buffer.from(e.replace("0x",""),"hex");return t.length!==20||!this.isAssetAddress(e)?null:t.readUInt32BE(16)}static isAssetAddress(e){let t=ve.Buffer.from("0000000000000000000000000000000100000000","hex"),r=ve.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"),Ut=12;w.BigNumber.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:Ut});var b=p(0),D=p(1),Pr=p("Infinity");function R(l,e){let t=new w.BigNumber(e.toString()),r=new w.BigNumber(10).pow(t);return l.times(r).decimalPlaces(0,1)}function p(l){return new w.BigNumber(l.toString())}function br(l,e){let t=p(l);return R(t,e)}function T(l,e){return l.shiftedBy(-1*e).toString()}var Xe=p("1e27"),Sr=p("1.01"),wr=p("31536000"),Z=class{client;constructor(e){this.client=new ie(e)}async getSummary(e){let t=te.fromAny(e),[r,s,i,n]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(t),this.client.getUserAccountData(t),this.client.getBlockTimestamp()]),[a]=r,[o,u]=s,[c,m,h,d,g,P]=i,y=p(P).dividedBy(1e18).decimalPlaces(6,w.BigNumber.ROUND_DOWN),x=p(c),S=p(m),A=[];for(let O of o){let v=O.underlyingAsset.toLowerCase(),I=a.find(({underlyingAsset:mr})=>mr.toLowerCase()===v);if(!I)throw new Error("Missing pool reserve for "+v);let k=p(O.scaledATokenBalance),H=p(I.liquidityIndex),Ge=p(I.liquidityRate),We=p(I.availableLiquidity),lt=p(I.priceInMarketReferenceCurrency),ut=n+6,ct=this.calculateLinearInterest(Ge,I.lastUpdateTimestamp,ut),He=H.multipliedBy(ct).dividedBy(Xe).decimalPlaces(0,w.BigNumber.ROUND_DOWN),or=k.multipliedBy(He).dividedBy(Xe).decimalPlaces(0,w.BigNumber.ROUND_DOWN),lr=p(u!==0&&u===I.eModeCategoryId?I.eModeLiquidationThreshold:I.reserveLiquidationThreshold).div(1e4),ur=I.usageAsCollateralEnabled&&O.usageAsCollateralEnabledOnUser&&p(O.scaledATokenBalance).gt(0),cr=z.toAssetId(v);A.push({aTokenBalance:or,availableLiquidity:We,decimals:Number(I.decimals),isCollateral:ur,priceInRef:lt,reserveId:cr,reserveAsset:v,reserveLiquidationThreshold:lr})}return{healthFactor:y.toNumber(),totalCollateral:x,totalDebt:S,reserves:A}}async hasBorrowPositions(e){let t=te.fromAny(e),r=await this.client.getUserAccountData(t),[s,i]=r;return i>0n}async getHealthFactor(e){let t=te.fromAny(e),r=await this.client.getUserAccountData(t),[s,i,n,a,o,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),a=z.fromAssetId(t),o=n.find(x=>x.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:u,isCollateral:c,priceInRef:m,reserveLiquidationThreshold:h}=o,d=R(p(r),u).decimalPlaces(0,1),g=c?d.multipliedBy(m).dividedBy(p(10).pow(u)).decimalPlaces(0,w.BigNumber.ROUND_DOWN):b,P=s.minus(g);return P.lte(0)?0:P.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),a=z.fromAssetId(t),o=n.find(y=>y.reserveAsset===a);if(!o)throw new Error("Missing reserve ctx for "+a);let{decimals:u,priceInRef:c,reserveLiquidationThreshold:m}=o,d=R(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{totalDebt:r,reserves:s,healthFactor:i}=await this.getSummary(e),n=z.fromAssetId(t),a=s.find(o=>o.reserveAsset===n);if(!a)throw new Error("Missing reserve data for "+n);return this.calculateWithdrawMax(a,r,i)}async getMaxWithdrawAll(e){let{totalDebt:t,reserves:r,healthFactor:s}=await this.getSummary(e),i={};for(let n of r){let a=this.calculateWithdrawMax(n,t,s);n.reserveId&&(i[n.reserveId]=a)}return i}calculateWithdrawMax(e,t,r){let{aTokenBalance:s,availableLiquidity:i,decimals:n,priceInRef:a,reserveLiquidationThreshold:o,isCollateral:u}=e,c=s;if(u&&t.gt(0)){let h=p(r).minus(Sr);if(h.gt(0)){let g=h.multipliedBy(t).dividedBy(o).decimalPlaces(0,w.BigNumber.ROUND_DOWN).dividedBy(a).multipliedBy(p(10).pow(n)).decimalPlaces(0,w.BigNumber.ROUND_DOWN);c=w.BigNumber.minimum(s,g)}else c=b}return{amount:w.BigNumber.minimum(c,i),decimals:n}}calculateLinearInterest(e,t,r){let s=r-t;return s<=0?Xe:e.multipliedBy(s).dividedBy(wr).plus(Xe).decimalPlaces(0,w.BigNumber.ROUND_DOWN)}};function Gt(l){switch(l){case!0:case"true":case 1:case"1":case"on":case"yes":return!0;default:return!1}}var gs=require("@galacticcouncil/api-augment/hydradx"),hs=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");Gt(r)&&console.log(e,...t)}};var J=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==_){let m=this.api.consts.balances.existentialDeposit;return{id:_,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:a,existentialDeposit:o}=t,{symbol:u,decimals:c}=r.get(e)??{};return{id:e,name:i.toHuman(),symbol:u,decimals:c,icon:u,type:n.toHuman(),isSufficient:a?a.toHuman():!0,location:s?.toJSON(),existentialDeposit:o.toString()}}getBond(e,t,r,s){let[i,n]=s,{assetType:a,isSufficient:o,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:a.toString(),isSufficient:o.toHuman(),existentialDeposit:u.toString(),underlyingAssetId:i.toString(),maturity:h}}getShares(e,t,r,s){let{assets:i}=s,{name:n,symbol:a,assetType:o,isSufficient:u,existentialDeposit:c}=t,h=i.map(P=>P.toString()).map(P=>{let{symbol:y}=this.getToken(P,t,r);return[P,y]}),d=Object.fromEntries(h),g=Object.values(d);return{id:e,name:g.join(", "),symbol:a?.isSome?a.toHuman():n.toHuman(),decimals:18,icon:g.join("/"),type:o.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(a=>a.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,a]=await Promise.all([this.api.query.assetRegistry.assets.entries(),this.locationsQuery(),this.safeSharesQuery(),this.safeBondsQuery(),this.metadataQuery()]),o=this.getSupportedAssets(r),u=this.normalizeMetadata(o,a),c=o.map(([{args:[m]},h])=>{let d=h.unwrap(),g=s.get(m.toString()),{assetType:P}=d;switch(P.toString()){case"Bond":let y=n.get(m.toString());return this.getBond(m.toString(),d,u,y);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===_?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 r=await this.api.query.tokens.accounts(e,t);return this.calculateFreeBalance(r)}async getErc20Balance(e,t){let r=await this.getTokenBalanceData(e,t);return this.calculateFreeBalance(r)}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t(_,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,a]})=>[n.toString(),a.toString()]);return this.api.query.tokens.accounts.multi(i,n=>{let a=[];n.forEach((o,u)=>{let c=this.calculateFreeBalance(o),m=i[u][1];a.push([m,c])}),t(a)})}async subscribeErc20Balance(e,t,r){let i=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([o,u])=>{let{assetType:c}=u.unwrap();return c.toString()==="Erc20"}).map(([{args:[o]}])=>o.toString()))(),n=async()=>{let a=await Promise.all(i.map(async o=>[o,await this.getErc20Balance(e,o)]));t(a)};return this.api.rpc.chain.subscribeNewHeads(async()=>{n()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateFreeBalance(e){let t=e.free.toString(),r=e.frozen.toString();return(0,w.BigNumber)(t).lt(r)?(0,w.BigNumber)(0):(0,w.BigNumber)(t).minus(r)}};var ae=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===_?this.getSystemBalance(e):this.getTokenBalance(e,t)}async getAccountBalances(e){return(await this.api.call.currenciesApi.account(e)).map(([r,s])=>this.calculateBalance(s,r.toString()))}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateBalance(t,_)}async getTokenBalance(e,t){let r=await this.api.query.tokens.accounts(e,t);return this.calculateBalance(r,t)}async getErc20Balance(e,t){let r=await this.getTokenBalanceData(e,t);return this.calculateBalance(r,t)}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t(_,this.calculateBalance(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,a]})=>[n.toString(),a.toString()]);return this.api.query.tokens.accounts.multi(i,n=>{let a=[];n.forEach((o,u)=>{let c=i[u][1],m=this.calculateBalance(o,c);a.push([c,m])}),t(a)})}async subscribeErc20Balance(e,t,r){let i=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([o,u])=>{let{assetType:c}=u.unwrap();return c.toString()==="Erc20"}).map(([{args:[o]}])=>o.toString()))(),n=async()=>{let a=await Promise.all(i.map(async o=>[o,await this.getErc20Balance(e,o)]));t(a)};return this.api.rpc.chain.subscribeNewHeads(async()=>{n()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateBalance(e,t){let r=(0,w.BigNumber)(e.free.toString()),s=e.frozen.toString(),i=e.reserved.toString(),n=r.gte(s)?r.minus(s).toString():"0",a=r.plus(i).toString();return{freeBalance:r.toString(),total:a,transferable:n,reservedBalance:i,frozenBalance:s,assetId:t}}};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 yt=require("@galacticcouncil/math-liquidity-mining"),Wt=require("@polkadot/types"),ft=require("@polkadot/util"),Pt=require("@polkadot/util-crypto");var Ye=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,a=i.unwrap().toString(),o=n.toString(),u=(await this.api.query.omnipoolWarehouseLM.globalFarm(o)).unwrap(),c=(await this.api.query.omnipoolWarehouseLM.yieldFarm(e,o,a)).unwrap(),m=await this.getOraclePrice(u)??u.priceAdjustment.toString(),d=this.getAccountResolver(this.api.registry)(Number(o),!1).toString(),g=u.rewardCurrency.toString(),P=await this.balanceClient.getTokenBalanceData(d,g);return{assetId:e,globalFarm:u,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,a=i.unwrap().toString(),o=n.toString(),u=(await this.api.query.xykWarehouseLM.globalFarm(o)).unwrap(),c=(await this.api.query.xykWarehouseLM.yieldFarm(e,o,a)).unwrap(),m=await this.getOraclePrice(u)??u.priceAdjustment.toString(),d=this.getAccountResolver(this.api.registry)(Number(o),!0).toString(),g=u.rewardCurrency.toString(),P=await this.balanceClient.getTokenBalanceData(d,g);return{assetId:e,globalFarm:u,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 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(),a=n.price.n.toString(),o=n.price.d.toString(),u;return Number(t)<Number(r)?u=(0,yt.fixed_from_rational)(a,o):u=(0,yt.fixed_from_rational)(o,a),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,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 Wt.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:a,globalFarm:o,priceAdjustment:u,potBalance:c})=>{let m=new w.BigNumber(o.totalSharesZ.toString()),h=o.plannedYieldingPeriods.toString(),d=new w.BigNumber(o.yieldPerPeriod.toString()),g=new w.BigNumber(o.maxRewardPerPeriod.toString()),P=o.blocksPerPeriod.toString(),y=new w.BigNumber(a.multiplier.toString()).shiftedBy(-18),x=this.secondsInYear.div(new w.BigNumber(r).times(P)),S;if(m.isZero())S=d.times(y).times(x);else{let k=this.getGlobalRewardPerPeriod(m,d,g,u);S=this.getPoolYieldPerPeriod(k,y,m,u).times(x)}let A=new w.BigNumber(o.pendingRewards.toString()).plus(o.accumulatedPaidRewards.toString()),O=g.times(h),v=c?A.plus(c):O;return A.div(v).gte(.999)?b:S.div(t==="isolatedpool"?2:1).times(100)}).reduce((a,o)=>a.plus(o),b).toString():void 0}};var Te=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},bt=class extends Error{constructor(e,t){super(),this.message=`${e} pool missing ${t}`,this.name="PoolConfigNotFound"}},re=class extends Error{constructor(e,t){super(),this.message=`Route from ${e} to ${t} not found in pool configuration`,this.name="RouteNotFound"}},St=class extends Error{constructor(e){super(),this.message=`Asset ${e} not available in current network`,this.name="AssetNotFound"}},wt=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"}},vt=class extends Error{constructor(e){super(),this.message=`${e}`,this.name="ProviderConfigNotFound"}};var Ht=require("viem"),xr=["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"],Tt=l=>{let t=[l.endpoint,...xr],r=Array.from(new Set(t.map(s=>s.replace("wss://","https://").replace("ws://","http://"))));return(0,Ht.defineChain)({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:r}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1})};var $=require("viem");function zt(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 Be=class{wsProvider;chain;constructor(e){let{provider:t}=e._options;this.wsProvider=t,this.chain=Tt(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:zt(this.wsProvider)})}getSigner(e){return(0,$.createWalletClient)({account:e,chain:this.chain,transport:(0,$.custom)(window.ethereum)})}};var Oe=(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 $e=(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 vr=$e(()=>"illegal argument(s)"),Xt=l=>{throw new vr(l)};var Tr=$e(()=>"index out of bounds"),Bt=l=>{throw new Tr(l)},Ve=(l,e,t)=>(l<e||l>=t)&&Bt(l);var Yt=23283064365386963e-26,je=class{float(e=1){return this.int()*Yt*e}probability(e){return this.float()<e}norm(e=1){return(this.int()*Yt-.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 Ke=class extends je{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 $t=new Ke(Math.random);var Vt=l=>l!=null&&typeof l!="function"&&l.length!==void 0;var jt=Object.getPrototypeOf({}),Ze="function",Kt="string",le=(l,e)=>{let t;if(l===e)return!0;if(l!=null){if(typeof l.equiv===Ze)return l.equiv(e)}else return l==e;if(e!=null){if(typeof e.equiv===Ze)return e.equiv(l)}else return l==e;return typeof l===Kt||typeof e===Kt?!1:(t=Object.getPrototypeOf(l),(t==null||t===jt)&&(t=Object.getPrototypeOf(e),t==null||t===jt)?Ar(l,e):typeof l!==Ze&&l.length!==void 0&&typeof e!==Ze&&e.length!==void 0?Br(l,e):l instanceof Set&&e instanceof Set?Or(l,e):l instanceof Map&&e instanceof Map?Ir(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)},Br=(l,e,t=le)=>{let r=l.length;if(r===e.length)for(;r-- >0&&t(l[r],e[r]););return r<0},Or=(l,e,t=le)=>l.size===e.size&&t([...l.keys()].sort(),[...e.keys()].sort()),Ir=(l,e,t=le)=>l.size===e.size&&t([...l].sort(),[...e].sort()),Ar=(l,e,t=le)=>{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 Ot=class{value;constructor(e){this.value=e}deref(){return this.value}};var Zt=l=>l instanceof Ot;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 Jt("next",this._head)}reverseIterator(){return Jt("prev",this.tail)}clear(){this.release()}compare(e,t=Oe){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||Vt(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(!le(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||Oe;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&&!Zt(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&&Bt(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(l,e){for(;e;)yield e.value,e=e[l]}var Qe=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):(Ve(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):(Ve(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=$t){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)&&Xt("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=Oe){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 o=0;o<t&&(n++,i=i.next,!!i);o++);let a=t;for(;n>0||a>0&&i;){let o;n===0?(o=i,i=i.next,a--):!i||a===0||e(r.value,i.value)<=0?(o=r,r=r.next,n--):(o=i,i=i.next,a--),this._tail?this._tail.next=o:this._head=o,o.prev=this._tail,this._tail=o}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),Ve(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 ue=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 Qe,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 et=class l extends ue{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 tt=(l,e=new Map)=>t=>{let r;return e.has(t)?e.get(t):(e.set(t,r=l(t)),r)};var C=(i=>(i.Aave="Aave",i.LBP="Lbp",i.Omni="Omnipool",i.Stable="Stableswap",i.XYK="Xyk",i))(C||{}),se=(i=>(i.UnknownError="UnknownError",i.InsufficientTradingAmount="InsufficientTradingAmount",i.MaxInRatioExceeded="MaxInRatioExceeded",i.MaxOutRatioExceeded="MaxOutRatioExceeded",i.TradeNotAllowed="TradeNotAllowed",i))(se||{});var Ie=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(o=>[o.id,o])),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),a=p(i.balance);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:n,balanceOut:a,assetInED:b,assetOutED:b}}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 R(D,e.decimalsOut)}spotPriceOutGivenIn(e){return R(D,e.decimalsIn)}calculateTradeFee(e,t){return b}};var Qt=require("@polkadot/util-crypto"),er=require("@polkadot/util"),tr=require("viem");function It(l,e){let t=[];return JSON.stringify(l,(r,s)=>(s&&s[e]&&t.push(s),s)),t[0]}function Rr(l,e,t){let r;return JSON.stringify(l,(s,i)=>(i&&i[e]===t&&(r=i),i)),r}var Nr=(l,e)=>typeof e=="bigint"?e.toString():e;var At=[{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 Ae=class{client;constructor(e){this.client=e.getWsProvider()}async getData(e,t=6){let[r,s,i]=await Promise.all([this.client.readContract({abi:At,address:e,functionName:"latestRoundData"}),this.client.readContract({abi:At,address:e,functionName:"decimals"}),this.client.getBlock()]),[n,a,o,u]=r,c=i.number-(i.timestamp-u)/BigInt(t),m=Number(c);return{price:a,decimals:s,updatedAt:m<0?0:m}}};var U=class extends q{evm;mmOracle;pools=[];subs=[];assets=new Map([]);mem=0;memPoolsCache=new et(null,{maxlen:1,ttl:1*60*60*1e3,release:e=>{this.mem>e&&this.log(this.getPoolType(),`mem ${e} released at`,new Date)}});memPools=tt(e=>(this.log(this.getPoolType(),`mem ${e} sync`),this.getPools()),this.memPoolsCache);constructor(e,t){super(e),this.evm=t,this.mmOracle=new Ae(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(a=>a.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"],Re=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,Qt.encodeAddress)((0,er.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:a}=n,o=`${a.section}:${a.method}`;if(o==="router:Executed"){let{assetIn:u,assetOut:c}=a.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(o==="evm:Log"){let{log:u}=a.data.toHuman();try{let{eventName:c,args:m}=(0,tr.decodeEventLog)({abi:ze,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 a=n.id===t.id?s.toString():i.toString();return{...n,balance:a}})}getReserveH160Id(e){return e.type==="Erc20"?It(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 f=class l{static toPct(e){let[t,r]=e;return l.safeDivide(t*100,r)}static toRaw(e){let[t,r]=e;return l.safeDivide(t,r)}static fromPermill(e){return[e,1e6]}static fromRate(e,t){return[e,t]}static safeDivide(e,t,r=12){let s=10**r;return Math.round(e*s/t)/s}static safeRound(e){return parseFloat(e.toPrecision(15))}};var Ne=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,a){this.type="Lbp",this.address=e,this.tokens=t,this.maxInRatio=r,this.maxOutRatio=s,this.minTradingLimit=i,this.fee=n,this.repayFeeApply=a}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(o=>[o.id,o])),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),a=p(i.balance);return{assetIn:e,assetOut:t,balanceIn:n,balanceOut:a,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 a=this.calculateTradeFee(t,r),o=f.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),u=t.plus(a),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:o,errors:i}}else{let a=this.calculateInGivenOut(e,t),o=e.balanceIn.div(this.maxInRatio);return a.isGreaterThan(o)&&i.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:a,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 a=this.calculateOutGivenIn(e,t),o=e.balanceOut.div(this.maxOutRatio);return a.isGreaterThan(o)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:a,amountOut:a,feePct:0,errors:i}}else{let a=this.calculateOutGivenIn(e,t),o=this.calculateTradeFee(a,r),u=f.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),c=a.minus(o),m=e.balanceOut.div(this.maxOutRatio);return c.isGreaterThan(m)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:a,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()?b: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()?b:s}spotPriceInGivenOut(e){let t=W.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),R(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(),R(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 _e=class extends U{MAX_FINAL_WEIGHT=R(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 a=n.unwrap(),o=i.toString(),u=await this.getPoolDelta(o,a,r.toString());this.poolsData.set(i.toString(),a);let[c,m]=a.fee;return{address:o,type:"Lbp",fee:f.fromRate(c.toNumber(),m.toNumber()),...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(a=>a.address==e.address);this.pools.splice(n,1)}})}async getPoolDelta(e,t,r){let{start:s,end:i,assets:n,initialWeight:a,finalWeight:o,repayTarget:u,feeCollector:c}=t,m=W.calculateLinearWeights(s.toString(),i.toString(),a.toString(),o.toString(),r),[h,d]=n,g=h.toString(),P=p(m),y=d.toString(),x=this.MAX_FINAL_WEIGHT.minus(p(P)),[S,A,O]=await Promise.all([this.isRepayFeeApplied(g,u.toString(),c.toString()),this.getBalance(e,g),this.getBalance(e,y)]);return{repayFeeApply:S,tokens:[{id:g,weight:P,balance:A.toString()},{id:y,weight:x,balance:O.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(){let[e,t]=this.api.consts.lbp.repayFee;return f.fromRate(e.toNumber(),t.toNumber())}getPoolLimits(){let e=this.api.consts.lbp.maxInRatio.toNumber(),t=this.api.consts.lbp.maxOutRatio.toNumber(),r=this.api.consts.lbp.minTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};var B=require("@galacticcouncil/math-omnipool");var N=class{static calculateSpotPrice(e,t,r,s){return(0,B.calculate_spot_price)(e,t,r,s)}static calculateLrnaSpotPrice(e,t){return(0,B.calculate_lrna_spot_price)(e,t)}static calculateInGivenOut(e,t,r,s,i,n,a,o,u){return(0,B.calculate_in_given_out)(e,t,r,s,i,n,a,o,u)}static calculateLrnaInGivenOut(e,t,r,s,i){return(0,B.calculate_lrna_in_given_out)(e,t,r,s,i)}static calculateOutGivenIn(e,t,r,s,i,n,a,o,u){return(0,B.calculate_out_given_in)(e,t,r,s,i,n,a,o,u)}static calculateOutGivenLrnaIn(e,t,r,s,i){return(0,B.calculate_out_given_lrna_in)(e,t,r,s,i)}static calculateShares(e,t,r,s){return(0,B.calculate_shares)(e,t,r,s)}static calculateLiquidityOut(e,t,r,s,i,n,a,o){return(0,B.calculate_liquidity_out)(e,t,r,s,i,n,a,o)}static calculateLiquidityLRNAOut(e,t,r,s,i,n,a,o){return(0,B.calculate_liquidity_lrna_out)(e,t,r,s,i,n,a,o)}static calculateCapDifference(e,t,r,s){let i=(0,w.BigNumber)(t),n=(0,w.BigNumber)(e),a=(0,w.BigNumber)(s),u=(0,w.BigNumber)(r).shiftedBy(-18);if(i.div(a).lt(u)){let m=u.times(a).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,B.calculate_liquidity_hub_in)(e,t,r,s)}static isSellAllowed(e){return(0,B.is_sell_allowed)(e)}static isBuyAllowed(e){return(0,B.is_buy_allowed)(e)}static isAddLiquidityAllowed(e){return(0,B.is_add_liquidity_allowed)(e)}static isRemoveLiquidityAllowed(e){return(0,B.is_remove_liquidity_allowed)(e)}static recalculateAssetFee(e,t,r,s,i,n,a,o,u,c,m){return(0,B.recalculate_asset_fee)(e,t,r,s,i,n,a,o,u,c,m)}static recalculateProtocolFee(e,t,r,s,i,n,a,o,u,c,m){return(0,B.recalculate_protocol_fee)(e,t,r,s,i,n,a,o,u,c,m)}static verifyAssetCap(e,t,r,s){return(0,B.verify_asset_cap)(e,t,r,s)}};var Ee=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),a=p(i.balance),o=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:a,tradeableIn:s.tradeable,tradeableOut:i.tradeable,assetInED:o,assetOutED:u}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),n=i.minus(s),a=s===b?b:n.div(s).multipliedBy(100).decimalPlaces(4),o=[],u=N.isSellAllowed(e.tradeableIn),c=N.isBuyAllowed(e.tradeableOut);(!u||!c)&&o.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&o.push("InsufficientTradingAmount");let m=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(m)&&o.push("MaxOutRatioExceeded");let h=e.balanceIn.div(this.maxInRatio);return i.isGreaterThan(h)&&o.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:a.toNumber(),errors:o}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,r),a=s.minus(i).div(s).multipliedBy(100).decimalPlaces(4),o=[],u=N.isSellAllowed(e.tradeableIn),c=N.isBuyAllowed(e.tradeableOut);(!u||!c)&&o.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&o.push("InsufficientTradingAmount");let m=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(m)&&o.push("MaxInRatioExceeded");let h=e.balanceOut.div(this.maxOutRatio);return i.isGreaterThan(h)&&o.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:a.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?f.toRaw(r.assetFee).toString():b.toString(),r?f.toRaw(r.protocolFee).toString():b.toString()),i=p(s);return i.isNegative()?b:i}calculateLrnaInGivenOut(e,t,r){let s=N.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?f.toRaw(r.assetFee).toString():b.toString()),i=p(s);return i.isNegative()?b: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?f.toRaw(r.assetFee).toString():b.toString(),r?f.toRaw(r.protocolFee).toString():b.toString()),i=p(s);return i.isNegative()?b:i}calculateOutGivenLrnaIn(e,t,r){let s=N.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?f.toRaw(r.assetFee).toString():b.toString()),i=p(s);return i.isNegative()?b: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 rr=require("@polkadot/util-crypto"),sr=require("@polkadot/util");var Fe=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:[o]},u])=>{let{hubReserve:c,shares:m,tradable:h,cap:d,protocolShares:g}=u.unwrap(),P=await this.getBalance(t,o.toString());return{id:o.toString(),hubReserves:p(c.toString()),shares:p(m.toString()),tradeable:h.bits.toNumber(),balance:P.toString(),cap:p(d.toString()),protocolShares:p(g.toString())}}),a=await Promise.all(n);return a.push({id:e,tradeable:s.bits.toNumber(),balance:i.toString()}),[{address:t,type:"Omnipool",hubAssetId:e,tokens:a,...this.getPoolLimits()}]}async getPoolFees(e,t){let r=e.assetOut,s=e.assetIn,i="omnipool",n="Short",a=O=>O===_?[_,Se]:[Se,O],[o,u,c,m]=await Promise.all([this.api.query.system.number(),this.api.query.dynamicFees.assetFee(r),this.api.query.emaOracle.oracles(i,a(r),n),this.api.query.emaOracle.oracles(i,a(s),n)]),[h,d,g]=this.getAssetFee(e,o.toNumber(),u,c),[P,y,x]=s===Se?[0,0,0]:this.getProtocolFee(e,o.toNumber(),u,m),S=h+P,A=g+x;return{assetFee:f.fromPermill(d),protocolFee:f.fromPermill(y),min:f.fromPermill(S),max:f.fromPermill(A)}}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 a=s.unwrap();return this.updateTokenState(n,a)})})}updateTokenState(e,t){let{hubReserve:r,shares:s,tradable:i,cap:n,protocolShares:a}=t;return{...e,hubReserves:p(r.toString()),shares:p(s.toString()),cap:p(n.toString()),protocolShares:p(a.toString()),tradeable:i.bits.toNumber()}}getAssetFee(e,t,r,s){let{assetOut:i,balanceOut:n}=e,{minFee:a,maxFee:o,decay:u,amplification:c}=this.api.consts.dynamicFees.assetFeeParameters,m=f.fromPermill(a.toNumber()),h=f.fromPermill(o.toNumber());if(r.isNone||s.isNone)return[a.toNumber(),a.toNumber(),o.toNumber()];let[d]=s.unwrap(),{assetFee:g,timestamp:P}=r.unwrap(),y=Math.max(1,t-P.toNumber()),x=d.volume.bIn.toString(),S=d.volume.bOut.toString(),A=d.liquidity.b.toString();i===_&&(x=d.volume.aIn.toString(),S=d.volume.aOut.toString(),A=d.liquidity.a.toString());let O=f.fromPermill(g.toNumber()),v=N.recalculateAssetFee(x,S,A,"9",n.toString(),f.toRaw(O).toString(),y.toString(),f.toRaw(m).toString(),f.toRaw(h).toString(),u.toString(),c.toString());return[a.toNumber(),Number(v)*1e6,o.toNumber()]}getProtocolFee(e,t,r,s){let{assetIn:i,balanceIn:n}=e,{minFee:a,maxFee:o,decay:u,amplification:c}=this.api.consts.dynamicFees.protocolFeeParameters,m=f.fromPermill(a.toNumber()),h=f.fromPermill(o.toNumber());if(r.isNone||s.isNone)return[a.toNumber(),a.toNumber(),o.toNumber()];let[d]=s.unwrap(),{protocolFee:g,timestamp:P}=r.unwrap(),y=Math.max(1,t-P.toNumber()),x=d.volume.bIn.toString(),S=d.volume.bOut.toString(),A=d.liquidity.b.toString();i===_&&(x=d.volume.aIn.toString(),S=d.volume.aOut.toString(),A=d.liquidity.a.toString());let O=f.fromPermill(g.toNumber()),v=N.recalculateProtocolFee(x,S,A,"9",n.toString(),f.toRaw(O).toString(),y.toString(),f.toRaw(m).toString(),f.toRaw(h).toString(),u.toString(),c.toString());return[a.toNumber(),Number(v)*1e6,o.toNumber()]}getPoolId(){return(0,rr.encodeAddress)((0,sr.stringToU8a)("modlomnipool".padEnd(32,"\0")),63)}getPoolLimits(){let e=this.api.consts.omnipool.maxInRatio.toNumber(),t=this.api.consts.omnipool.maxOutRatio.toNumber(),r=this.api.consts.omnipool.minimumTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};var E=require("@galacticcouncil/math-xyk"),V=class{static getSpotPrice(e,t,r){return(0,E.get_spot_price)(e,t,r)}static calculateInGivenOut(e,t,r){return(0,E.calculate_in_given_out)(e,t,r)}static calculateOutGivenIn(e,t,r){return(0,E.calculate_out_given_in)(e,t,r)}static calculatePoolTradeFee(e,t,r){return(0,E.calculate_pool_trade_fee)(e,t,r)}static calculateLiquidityIn(e,t,r){return(0,E.calculate_liquidity_in)(e,t,r)}static calculateSpotPrice(e,t){return(0,E.calculate_spot_price)(e,t)}static calculateSpotPriceWithFee(e,t,r,s){return(0,E.calculate_spot_price_with_fee)(e,t,r,s)}static calculateShares(e,t,r){return(0,E.calculate_shares)(e,t,r)}static calculateLiquidityOutAssetA(e,t,r,s){return(0,E.calculate_liquidity_out_asset_a)(e,t,r,s)}static calculateLiquidityOutAssetB(e,t,r,s){return(0,E.calculate_liquidity_out_asset_b)(e,t,r,s)}};var ke=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),a=p(i.balance),o=p(s.existentialDeposit),u=p(i.existentialDeposit);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:n,balanceOut:a,assetInED:o,assetOutED:u}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateTradeFee(s,r),n=f.toPct(r.exchangeFee),a=s.plus(i),o=[];(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 c=e.balanceIn.div(this.maxInRatio);return a.isGreaterThan(c)&&o.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:s,amountOut:t,feePct:n,errors:o}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateTradeFee(s,r),n=f.toPct(r.exchangeFee),a=s.minus(i),o=[];(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 c=e.balanceOut.div(this.maxOutRatio);return a.isGreaterThan(c)&&o.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:a,feePct:n,errors:o}}calculateInGivenOut(e,t){let r=V.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?b:s}calculateOutGivenIn(e,t){let r=V.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?b:s}spotPriceInGivenOut(e){let t=V.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),r=R(D,18-e.decimalsOut);return p(t).div(r)}spotPriceOutGivenIn(e){let t=V.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),r=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 De=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,a]=s.unwrap(),[o,u]=await Promise.all([this.getBalance(i,n.toString()),this.getBalance(i,a.toString())]);return{address:i,type:"Xyk",tokens:[{id:n.toString(),balance:o.toString()},{id:a.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(){let[e,t]=this.api.consts.xyk.getExchangeFee;return f.fromRate(e.toNumber(),t.toNumber())}getPoolLimits(){let e=this.api.consts.xyk.maxInRatio.toNumber(),t=this.api.consts.xyk.maxOutRatio.toNumber(),r=this.api.consts.xyk.minTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};var F=require("@galacticcouncil/math-stableswap"),M=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,a){return(0,F.calculate_in_given_out)(e,t,r,s,i,n,a)}static calculateAddOneAsset(e,t,r,s,i,n,a){return(0,F.calculate_add_one_asset)(e,t,r,s,i,n,a)}static calculateSharesForAmount(e,t,r,s,i,n,a){return(0,F.calculate_shares_for_amount)(e,t,r,s,i,n,a)}static calculateOutGivenIn(e,t,r,s,i,n,a){return(0,F.calculate_out_given_in)(e,t,r,s,i,n,a)}static calculateLiquidityOutOneAsset(e,t,r,s,i,n,a){return(0,F.calculate_liquidity_out_one_asset)(e,t,r,s,i,n,a)}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,a,o){return(0,F.calculate_spot_price_with_fee)(e,t,r,s,i,n,a,o)}static recalculatePegs(e,t,r,s,i){let n=(0,F.recalculate_peg)(e,t,r,s,i);return JSON.parse(n)}};var Ce=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,a,o,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=a,this.fee=o,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),a=p(i.balance),o=p(s.existentialDeposit),u=p(i.existentialDeposit);return{assetIn:e,assetOut:t,balanceIn:n,balanceOut:a,decimalsIn:s.decimals,decimalsOut:i.decimals,tradeableIn:this.id===e?15:s.tradeable,tradeableOut:this.id===t?15:i.tradeable,assetInED:o,assetOutED:u}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),n=i.minus(s),a=s===b?b:n.div(s).multipliedBy(100).decimalPlaces(4),o=[],u=N.isSellAllowed(e.tradeableIn),c=N.isBuyAllowed(e.tradeableOut);return(!u||!c)&&o.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&o.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:a.toNumber(),errors:o}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,r),a=s.minus(i).div(s).multipliedBy(100).decimalPlaces(4),o=[],u=N.isSellAllowed(e.tradeableIn),c=N.isBuyAllowed(e.tradeableOut);return(!u||!c)&&o.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&o.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:a.toNumber(),errors:o}}calculateIn(e,t,r){let s=M.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?f.toRaw(r.fee).toString():b.toString(),this.getPegs()),i=p(s);return i.isNegative()?b:i}calculateAddOneAsset(e,t,r){let s=M.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,r?f.toRaw(r.fee).toString():b.toString(),this.getPegs()),i=p(s);return i.isNegative()?b:i}calculateSharesForAmount(e,t,r){let s=M.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,r?f.toRaw(r.fee).toString():b.toString(),this.getPegs()),i=p(s);return i.isNegative()?b: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=M.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=R(D,e.decimalsIn-e.decimalsOut);return p(t).div(s)}let r=R(D,18-e.decimalsIn);return p(t).div(r)}calculateOut(e,t,r){let s=M.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?f.toRaw(r.fee).toString():b.toString(),this.getPegs()),i=p(s);return i.isNegative()?b:i}calculateWithdrawOneAsset(e,t,r){let s=M.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,r?f.toRaw(r.fee).toString():b.toString(),this.getPegs()),i=p(s);return i.isNegative()?b:i}calculateShares(e,t,r){let s=M.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,r?f.toRaw(r.fee).toString():b.toString(),this.getPegs()),i=p(s);return i.isNegative()?b: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=M.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=R(D,e.decimalsOut-e.decimalsIn);return p(t).div(s)}let r=R(D,18-e.decimalsOut);return p(t).div(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 rt=require("@polkadot/util-crypto");var Me=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:[n]},a])=>{try{let o=a.unwrap(),u=n.toString(),c=this.getPoolAddress(u),[m,h,d]=await Promise.all([this.getPoolDelta(u,o,r.toString()),this.getPoolTokens(c,u,o),this.getPoolPegs(u,o,r.toString())]);return h.push({id:u,tradeable:15,balance:m.totalIssuance}),this.stablePools.set(c,o),{address:c,id:u,type:"Stableswap",fee:f.fromPermill(o.fee.toNumber()),tokens:h,...m,...d,...this.getPoolLimits()}}catch(o){return console.warn(`Skipping pool ${n.toString()}
|
|
2
|
+
`,String(o)),null}});return(await Promise.all(s)).filter(n=>n!==null)}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)]),a=e.tokens.map(o=>o.id===e.id?{...o,balance:i.totalIssuance}:o);Object.assign(e,{tokens:a},i,n)}})}async getPoolDelta(e,t,r){let{initialAmplification:s,finalAmplification:i,initialBlock:n,finalBlock:a}=t,o=M.calculateAmplification(s.toString(),i.toString(),n.toString(),a.toString(),r),u=await this.api.query.tokens.totalIssuance(e);return{amplification:o,totalIssuance:u.toString()}}async getPoolTokens(e,t,r){let{assets:s}=r,i=s.map(async n=>{let[a,o]=await Promise.all([this.api.query.stableswap.assetTradability(t,n.toString()),this.getBalance(e,n.toString())]);return{id:n.toString(),tradeable:a.bits.toNumber(),balance:o.toString()}});return Promise.all(i)}getPoolDefaultPegs(e){let t=e.fee,r=M.defaultPegs(e.assets.length);return{pegsFee:f.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),a=this.getRecentPegs(i),o=f.fromPermill(i.maxPegUpdate.toNumber()),u=f.fromPermill(t.fee.toNumber()),[c,m]=M.recalculatePegs(JSON.stringify(a),JSON.stringify(n),r,f.toRaw(o).toString(),f.toRaw(u).toString()),h=Number(c)*1e6;return{pegsFee:f.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(([a,o])=>o.toString()),n=s.map(async(a,o)=>{if(a.isOracle){let[u,c,m]=a.asOracle,h=[m.toString(),i[o]].map(S=>Number(S)).sort((S,A)=>S-A),d=await this.api.query.emaOracle.oracles(u,h,c),[{price:g,updatedAt:P}]=d.unwrap(),y=g.n.toString(),x=g.d.toString();return m.toString()===h[0].toString()?[[y,x],P.toString()]:[[x,y],P.toString()]}else if(a.isMmOracle){let u=a.asMmOracle,{price:c,decimals:m,updatedAt:h}=await this.mmOracle.getData(u.toString()),d=10**m;return[[c.toString(),d.toString()],h.toString()]}else{if(a.isValue)return[a.asValue.map(u=>u.toString()),r];throw Error(a.type+" is not supported")}});return Promise.all(n)}getPoolAddress(e){let t=Number(e),r=M.getPoolAddress(t);return(0,rt.encodeAddress)((0,rt.blake2AsHex)(r),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:this.api.consts.stableswap.minTradingLimit.toNumber()}}};var ce=class extends L{api;evm;assetClient;aaveClient;xykClient;omniClient;lbpClient;stableClient;clients=[];onChainAssets=[];memRegistry=tt(e=>(this.log(`Registry mem ${e} sync`),this.syncRegistry()));constructor(e,t){super(e),this.api=e,this.evm=t,this.assetClient=new J(this.api),this.aaveClient=new Re(this.api,t),this.xykClient=new De(this.api,t),this.omniClient=new Fe(this.api,t),this.lbpClient=new _e(this.api,t),this.stableClient=new Me(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 Te(t.type)}}};var me=class extends ce{feeCache;disconnectSubscribeNewHeads=null;constructor(e,t){super(e,t),this.feeCache=new ue(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!
|
|
3
|
+
Items: [${this.feeCache.length}]`),this.feeCache.release(),this.disconnectSubscribeNewHeads?.()}};var pe=class{static get(e){switch(e.type){case"Aave":return Ie.fromPool(e);case"Xyk":return ke.fromPool(e);case"Omnipool":return Ee.fromPool(e);case"Lbp":return Ne.fromPool(e);case"Stableswap":return Ce.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};var st=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 Er=6,Le=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 st,n=[];for(n.push([t,""]),i.enqueue(n);i.size()>0;){let a=i.dequeue();if(a==null||a.length>Er)return s;let o=a[a.length-1];(r===null||o[0]===r)&&s.push(a),e.get(o[0])?.forEach(c=>{if(this.isNotVisited(c,a)){let m=[...a];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 a=parseInt(i),o=parseInt(n);r.get(a)?.push([o,s])}return r}};function Rt(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 qe=class{getProposals(e,t,r){let s=Rt(r),i=Object.keys(s),n=i.map(c=>s[c]).flat(),a=new Le,o=a.buildAndPopulateGraph(i,n),u=a.findPaths(o,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],a=r[i+1];if(a==null)break;s.push(this.toEdge(n,a))}t.push(s)}return t}toEdge(e,t){return[t[1],e[0].toString(),t[0].toString()]}};var de=class{routeSuggester;routerOptions;poolService;constructor(e,t={}){this.poolService=e,this.routeSuggester=new qe,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(a=>a[a.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(a=>this.validPath(a,r)).map(a=>this.toHops(a,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,pe.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 kr(l,e){return l.minus(e).abs().div(l.plus(e).div(2)).multipliedBy(100).decimalPlaces(2)}function ge(l,e){return l.minus(e).div(e).multipliedBy(100).decimalPlaces(2)}function Nt(l,e){return D.minus(e.div(l)).multipliedBy(100).decimalPlaces(4)}function _t(l,e){return e.div(l).minus(D).multipliedBy(100).decimalPlaces(4)}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 it=(t=>(t.Buy="Buy",t.Sell="Sell",t))(it||{}),nt=(r=>(r.Dca="Dca",r.TwapSell="TwapSell",r.TwapBuy="TwapBuy",r))(nt||{}),Et=(r=>(r.OrderTooSmall="OrderTooSmall",r.OrderTooBig="OrderTooBig",r.OrderImpactTooBig="OrderImpactTooBig",r))(Et||{});var he=class extends de{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?f.toPct(e.min):void 0,r=e.max?f.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),a=super.getPaths(e,t,n,i);if(a.length===0)throw new re(e,t);let o;if(s)o=await this.toSellSwaps(r,s,n);else{let v=a.map(async k=>await this.toSellSwaps(r,k,n)),I=await Promise.all(v);o=this.findBestSellRoute(I)}let u=o[0],c=o[o.length-1],m=this.isDirectTrade(o),h=o.map(v=>v.spotPrice.shiftedBy(-1*v.assetOutDecimals)).reduce((v,I)=>v.multipliedBy(I)),d=R(h,c.assetOutDecimals),g=m?c.calculatedOut:this.calculateDelta0Y(u.amountIn,o,n),P=c.amountOut,y=m?c.tradeFeePct:Nt(g,P).toNumber(),x=g.minus(P),S=this.getRouteFeeRange(o),A=u.amountIn.shiftedBy(-1*u.assetInDecimals).multipliedBy(d),O=ge(g,A);return{type:"Sell",amountIn:u.amountIn,amountOut:c.amountOut,spotPrice:d,tradeFee:x,tradeFeePct:y,tradeFeeRange:S,priceImpactPct:O.toNumber(),swaps:o,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:y,tradeFeeRange:S,priceImpactPct:O.toNumber(),swaps:o.map(v=>v.toHuman())}}}}calculateDelta0Y(e,t,r){let s=[];for(let i=0;i<t.length;i++){let n=t[i],a=r.get(n.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(n.assetIn,n.assetOut),u;i>0?u=s[i-1]:u=e;let c=a.calculateOutGivenIn(o,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],a=r.get(n.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(n.assetIn,n.assetOut),u;i>0?u=s[i-1].amountOut:u=R(p(e),o.decimalsIn).decimalPlaces(0,1);let c=await this.poolService.getPoolFees(o,a),{amountOut:m,calculatedOut:h,feePct:d,errors:g}=a.validateAndSell(o,u,c),P=this.getPoolFeeRange(c),y=a.spotPriceOutGivenIn(o),x=u.shiftedBy(-1*o.decimalsIn).multipliedBy(y),S=ge(h,x);s.push({...n,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:u,amountOut:m,calculatedOut:h,spotPrice:y,tradeFeePct:d,tradeFeeRange:P,priceImpactPct:S.toNumber(),errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===n.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===n.assetIn},toHuman(){return{...n,amountIn:T(u,o.decimalsIn),amountOut:T(m,o.decimalsOut),calculatedOut:T(h,o.decimalsOut),spotPrice:T(y,o.decimalsOut),tradeFeePct:d,tradeFeeRange:P,priceImpactPct:S.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 re(e,t);let u=r.filter(d=>d.tokens.some(g=>g.id===e)).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(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),a=await this.toSellSwaps("1",n,s),o=a.map(m=>m.spotPrice.shiftedBy(-1*m.assetOutDecimals)).reduce((m,h)=>m.multipliedBy(h)),u=a[a.length-1].assetOutDecimals;return{amount:R(o,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),a=super.getPaths(e,t,n,i);if(a.length===0)throw new re(e,t);let o;if(s)o=await this.toBuySwaps(r,s,n);else{let v=a.map(async k=>await this.toBuySwaps(r,k,n)),I=await Promise.all(v);o=this.findBestBuyRoute(I)}let u=o[o.length-1],c=o[0],m=this.isDirectTrade(o),h=o.map(v=>v.spotPrice.shiftedBy(-1*v.assetInDecimals)).reduce((v,I)=>v.multipliedBy(I)),d=R(h,c.assetInDecimals),g=m?c.calculatedIn:this.calculateDelta0X(u.amountOut,o,n),P=c.amountIn,y=m?c.tradeFeePct:_t(g,P).toNumber(),x=P.minus(g),S=this.getRouteFeeRange(o),A=u.amountOut.shiftedBy(-1*u.assetOutDecimals).multipliedBy(d),O;return g.isZero()?O=-100:O=ge(A,g).toNumber(),{type:"Buy",amountOut:u.amountOut,amountIn:c.amountIn,spotPrice:d,tradeFee:x,tradeFeePct:y,tradeFeeRange:S,priceImpactPct:O,swaps:o,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:y,tradeFeeRange:S,priceImpactPct:O,swaps:o.map(v=>v.toHuman())}}}}calculateDelta0X(e,t,r){let s=[];for(let i=t.length-1;i>=0;i--){let n=t[i],a=r.get(n.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(n.assetIn,n.assetOut),u;i==t.length-1?u=e:u=s[0];let c=a.calculateInGivenOut(o,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],a=r.get(n.poolAddress);if(a==null)throw new Error("Pool does not exit");let o=a.parsePair(n.assetIn,n.assetOut),u;i==t.length-1?u=R(p(e),o.decimalsOut).decimalPlaces(0,1):u=s[0].amountIn;let c=await this.poolService.getPoolFees(o,a),{amountIn:m,calculatedIn:h,feePct:d,errors:g}=a.validateAndBuy(o,u,c),P=this.getPoolFeeRange(c),y=a.spotPriceInGivenOut(o),x=u.shiftedBy(-1*o.decimalsOut).multipliedBy(y),S;h.isZero()?S=-100:S=ge(x,h).toNumber(),s.unshift({...n,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:m,amountOut:u,calculatedIn:h,spotPrice:y,tradeFeePct:d,tradeFeeRange:P,priceImpactPct:S,errors:g,isSupply(){return a.type==="Aave"&&a.tokens[0].id===n.assetIn},isWithdraw(){return a.type==="Aave"&&a.tokens[1].id===n.assetIn},toHuman(){return{...n,amountIn:T(m,o.decimalsIn),amountOut:T(u,o.decimalsOut),calculatedIn:T(h,o.decimalsIn),spotPrice:T(y,o.decimalsIn),tradeFeePct:d,tradeFeeRange:P,priceImpactPct:S,errors:g}}})}return s}};var ir=6e3,nr=p(1e15),Ue=6,Ft=-5,kt=6*60*60*1e3;var ar=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 ye=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,a]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,r)]),{amountIn:o,swaps:u,priceImpactPct:c}=a,m=u[0],h=u[u.length-1],{assetInDecimals:d}=m,{assetOutDecimals:g}=h,P=Math.abs(c),y=this.getMinimumTradeCount(o,n),x=this.getOptimalTradeCount(P),S=i?Math.round(s/i):x,A=Math.ceil(s/y),O=Math.round(s/x),v=Math.round(s/S),I=o.dividedBy(S).decimalPlaces(0,1),k=await this.router.getBestSell(e,t,T(I,d)),H=o.isLessThan(n),Ge=[];H&&Ge.push("OrderTooSmall");let We=k.amountOut.multipliedBy(S),lt=this.toBlockPeriod(v),ut=k.tradeFee.multipliedBy(S),ct=G.build(u),He={assetIn:e,assetOut:t,errors:Ge,frequencyMin:A,frequencyOpt:O,frequency:v,tradeCount:S,tradeFee:ut,tradeImpactPct:k.priceImpactPct,tradePeriod:lt,tradeRoute:ct,type:"Dca"};return{...He,amountIn:o,amountOut:We,tradeAmountIn:k.amountIn,tradeAmountOut:k.amountOut,toHuman(){return{...He,amountIn:T(o,d),amountOut:T(We,g),tradeAmountIn:T(k.amountIn,d),tradeAmountOut:T(k.amountOut,g)}}}}async getMinimumOrderBudget(e){if(_===e)return this.minOrderBudget;let t=await this.router.getBestSpotPrice(_,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:a,priceImpactPct:o}=i,u=a[0],c=a[a.length-1],{assetInDecimals:m}=u,{assetOutDecimals:h}=c,d=Math.abs(o),g=this.getTwapTradeCount(d),P=n.dividedBy(g).decimalPlaces(0,1),y=await this.router.getBestSell(u.assetIn,c.assetOut,T(P,m)),x=g===1,S=n.isLessThan(s),A=y.priceImpactPct<Ft,O=[];S||x?O.push("OrderTooSmall"):A&&O.push("OrderImpactTooBig");let v=y.amountOut.multipliedBy(g),I=y.tradeFee.multipliedBy(g),k=G.build(a),H={assetIn:e,assetOut:t,errors:O,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:Ue,tradeRoute:k,type:"TwapSell"};return{...H,amountIn:n,amountOut:v,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:I,toHuman(){return{...H,amountIn:T(n,m),amountOut:T(v,h),tradeAmountIn:T(y.amountIn,m),tradeAmountOut:T(y.amountOut,h),tradeFee:T(I,h)}}}}async getTwapBuyOrder(e,t,r){let[s,i]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestBuy(e,t,r)]),{amountOut:n,swaps:a,priceImpactPct:o}=i,u=a[0],c=a[a.length-1],{assetInDecimals:m}=u,{assetOutDecimals:h}=c,d=Math.abs(o),g=this.getTwapTradeCount(d),P=n.dividedBy(g).decimalPlaces(0,1),y=await this.router.getBestBuy(u.assetIn,c.assetOut,T(P,h)),x=y.amountIn.multipliedBy(g),S=g===1,A=x.isLessThan(s),O=y.priceImpactPct<Ft,v=[];A||S?v.push("OrderTooSmall"):O&&v.push("OrderImpactTooBig");let I=y.tradeFee.multipliedBy(g),k=G.build(a),H={assetIn:e,assetOut:t,errors:v,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:Ue,tradeRoute:k,type:"TwapBuy"};return{...H,amountIn:x,amountOut:n,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:I,toHuman(){return{...H,amountIn:T(x,m),amountOut:T(n,h),tradeAmountIn:T(y.amountIn,m),tradeAmountOut:T(y.amountOut,h),tradeFee:T(I,m)}}}}getTwapTradeCount(e){let t=this.getOptimalTradeCount(e);if(this.getTwapExecutionTime(t)>kt){let s=kt/(this.blockTime*Ue);return Math.round(s)}return t}getTwapExecutionTime(e){return e*Ue*this.blockTime}toBlockPeriod(e){let t=e/this.blockTime,r=Math.round(t);return Math.max(r,ar)}};var fe=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 Z(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(),be)}isDirectOmnipoolTrade(e){return e.length===1&&e[0].pool==="Omnipool"}};var at=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,o=(await this.balanceClient.getBalance(this.beneficiary,i)).minus(5),u=!0;return s.isWithdraw()&&(u=(await this.aaveUtils.getMaxWithdraw(this.beneficiary,n)).amount.isGreaterThanOrEqualTo(o)),u&&e.isGreaterThanOrEqualTo(o)?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),a=s.assetIn,o=i.assetOut,u=e.plus(n),c;return this.isDirectOmnipoolTrade(r)?c=this.api.tx.omnipool.buy(o,a,t.toFixed(),u.toFixed()):c=this.api.tx.router.buy(a,o,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),a=s.assetIn,o=i.assetOut,u=t.minus(n),c;if(this.isDirectOmnipoolTrade(r)?c=this.api.tx.omnipool.sell(a,o,e.toFixed(),u.toFixed()):c=this.api.tx.router.sell(a,o,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,be)}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,a=s.assetOut,o=e.minus(i),u=this.api.tx.router.sellAll(n,a,o.toFixed(),G.build(t));if(r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let m=this.dispatchWithExtraGas(u);return this.wrapTx("RouterSellAll",m,be)}return this.wrapTx("RouterSellAll",u)}};var ot=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,a=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",a)}buildTwapSellTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:n,tradeRoute:a}=this.order,o=Q(i,this.slippagePct),u=i.minus(o),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:a}}},null);return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:n,tradeRoute:a}=this.order,o=Q(s,this.slippagePct),u=s.plus(o),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:a}}},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 at(this.api,this.evm).setTrade(e)}order(e){return new ot(this.api,this.evm).setOrder(e)}};function Dr(l){let e=new oe(l),t=new Be(l),r=new me(l,t),s=new Z(t),i=new he(r),n=new ye(i,{blockTime:e.blockTime,minBudgetInNative:e.minOrderBudget});return{api:{aave:s,router:i,scheduler:n},client:{asset:new J(l),balance:new q(l),balanceV2:new ae(l)},ctx:{pool:r},evm:t,tx:new Pe(l,t),destroy:()=>{r.destroy()}}}0&&(module.exports={AaveClient,AavePool,AavePoolClient,AaveUtils,AssetClient,AssetNotFound,BASILISK_PARACHAIN_ID,BalanceClient,BalanceClientV2,BigNumber,CachingPoolService,ChainParams,DECIMAL_PLACES,ERC20,EvmClient,FarmClient,H160,HUB_ASSET_ID,HYDRADX_PARACHAIN_ID,HYDRADX_SS58_PREFIX,INFINITY,LbpMath,LbpPool,LbpPoolClient,ONE,OmniMath,OmniPool,OmniPoolClient,PERMILL_DENOMINATOR,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,3 +1,3 @@
|
|
|
1
|
-
var fe=[{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 We=[{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 Je="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",He="0x112b087b60C1a166130d59266363C45F8aa99db0",Xe="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",J=1000000n;var jr=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var ee=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:We,address:He,args:[Xe],functionName:"getReservesData"})}async getUserReservesData(e){return await this.client.readContract({abi:We,address:He,args:[Xe,e],functionName:"getUserReservesData"})}async getUserAccountData(e){return await this.client.readContract({abi:fe,address:Je,args:[e],functionName:"getUserAccountData"})}};import{decodeAddress as Te,encodeAddress as tt}from"@polkadot/util-crypto";import{hexToU8a as It,isHex as At,u8aToHex as vt}from"@polkadot/util";import{Buffer as H}from"buffer";var es=2090,Y=1e6,Se="1",ts=2034,W=63,te=18,k="0",et=12,re=15;var Ye="ETH\0";function Rt(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=At(m)?It(m):Te(m);return tt(e),!0}catch{return!1}}var j=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 vt(r)};static fromAny=e=>{if(Nt(e))return e;if(Rt(e))return m.fromAccount(e);if(Ft(e))return m.fromSS58(e);throw new Error("Unknown address type")}};import{Buffer as we}from"buffer";var G=class{static fromAssetId(e){let t=Number(e),r=we.alloc(20,0);return r[15]=1,r.writeUInt32BE(t,16),"0x"+r.toString("hex")}static toAssetId(e){let t=we.from(e.replace("0x",""),"hex");return t.length!==20||!this.isAssetAddress(e)?null:t.readUInt32BE(16)}static isAssetAddress(e){let t=we.from("0000000000000000000000000000000100000000","hex"),r=we.from(e.replace("0x",""),"hex");return r.length!==20?!1:r.subarray(0,16).equals(t.subarray(0,16))}};import{BigNumber as x}from"bignumber.js";var Et=12;x.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:Et});var f=p(0),F=p(1),ms=p("Infinity");function v(m,e){let t=new x(e.toString()),r=new x(10).pow(t);return m.times(r).decimalPlaces(0,1)}function p(m){return new x(m.toString())}function ps(m,e){let t=p(m);return v(t,e)}function O(m,e){return m.shiftedBy(-1*e).toString()}var xe=p("1e27"),_t=p("1.01"),kt=p("31536000"),$=class{client;constructor(e){this.client=new ee(e)}async getSummary(e){let t=j.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,y]=n,P=p(y).dividedBy(1e18).decimalPlaces(6,x.ROUND_DOWN),T=p(u),S=p(c),A=[];for(let B of o){let w=B.underlyingAsset.toLowerCase(),I=i.find(({underlyingAsset:Bt})=>Bt.toLowerCase()===w);if(!I)throw new Error("Missing pool reserve for "+w);let N=p(B.scaledATokenBalance),U=p(I.liquidityIndex),Pe=p(I.liquidityRate),be=p(I.availableLiquidity),Ue=p(I.priceInMarketReferenceCurrency),qe=a+6,Ge=this.calculateLinearInterest(Pe,I.lastUpdateTimestamp,qe),ye=U.multipliedBy(Ge).dividedBy(xe).decimalPlaces(0,x.ROUND_DOWN),Tt=N.multipliedBy(ye).dividedBy(xe).decimalPlaces(0,x.ROUND_DOWN),wt=p(l!==0&&l===I.eModeCategoryId?I.eModeLiquidationThreshold:I.reserveLiquidationThreshold).div(1e4),xt=I.usageAsCollateralEnabled&&B.usageAsCollateralEnabledOnUser&&p(B.scaledATokenBalance).gt(0),Ot=G.toAssetId(w);A.push({aTokenBalance:Tt,availableLiquidity:be,decimals:Number(I.decimals),isCollateral:xt,priceInRef:Ue,reserveId:Ot,reserveAsset:w,reserveLiquidationThreshold:wt})}return{healthFactor:P.toNumber(),totalCollateral:T,totalDebt:S,reserves:A}}async hasBorrowPositions(e){let t=j.fromAny(e),r=await this.client.getUserAccountData(t),[s,n]=r;return n>0n}async getHealthFactor(e){let t=j.fromAny(e),r=await this.client.getUserAccountData(t),[s,n,a,i,o,l]=r;return p(l).dividedBy(1e18).decimalPlaces(6,x.ROUND_DOWN).toNumber()}async getHealthFactorAfterWithdraw(e,t,r){let{totalCollateral:s,totalDebt:n,reserves:a}=await this.getSummary(e),i=G.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,x.ROUND_DOWN):f,y=s.minus(g);return y.lte(0)?0:y.multipliedBy(h).dividedBy(n).decimalPlaces(6,x.ROUND_DOWN).toNumber()}async getHealthFactorAfterSupply(e,t,r){let{totalCollateral:s,totalDebt:n,reserves:a}=await this.getSummary(e),i=G.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,x.ROUND_DOWN),g=s.plus(d);return g.lte(0)?0:g.multipliedBy(c).dividedBy(n).decimalPlaces(6,x.ROUND_DOWN).toNumber()}async getMaxWithdraw(e,t){let{totalDebt:r,reserves:s,healthFactor:n}=await this.getSummary(e),a=G.fromAssetId(t),i=s.find(o=>o.reserveAsset===a);if(!i)throw new Error("Missing reserve data for "+a);return this.calculateWithdrawMax(i,r,n)}async getMaxWithdrawAll(e){let{totalDebt:t,reserves:r,healthFactor:s}=await this.getSummary(e),n={};for(let a of r){let i=this.calculateWithdrawMax(a,t,s);a.reserveId&&(n[a.reserveId]=i)}return n}calculateWithdrawMax(e,t,r){let{aTokenBalance:s,availableLiquidity:n,decimals:a,priceInRef:i,reserveLiquidationThreshold:o,isCollateral:l}=e,u=s;if(l&&t.gt(0)){let h=p(r).minus(_t);if(h.gt(0)){let g=h.multipliedBy(t).dividedBy(o).decimalPlaces(0,x.ROUND_DOWN).dividedBy(i).multipliedBy(p(10).pow(a)).decimalPlaces(0,x.ROUND_DOWN);u=x.minimum(s,g)}else u=f}return{amount:x.minimum(u,n),decimals:a}}calculateLinearInterest(e,t,r){let s=r-t;return s<=0?xe:e.multipliedBy(s).dividedBy(kt).plus(xe).decimalPlaces(0,x.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 D=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 D{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==k){let c=this.api.consts.balances.existentialDeposit;return{id:k,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(y=>y.toString()).map(y=>{let{symbol:P}=this.getToken(y,t,r);return[y,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:y}=d;switch(y.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 L=class extends D{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===k?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 r=await this.api.query.tokens.accounts(e,t);return this.calculateFreeBalance(r)}async getErc20Balance(e,t){let r=await this.getTokenBalanceData(e,t);return this.calculateFreeBalance(r)}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t(k,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 t=e.free.toString(),r=e.frozen.toString();return x(t).lt(r)?x(0):x(t).minus(r)}};var se=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 D{balanceClient;constructor(e){super(e),this.balanceClient=new L(e)}secondsInYear=new x(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(),y=await this.balanceClient.getTokenBalanceData(d,g);return{assetId:e,globalFarm:l,yieldFarm:u,priceAdjustment:c,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,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(),y=await this.balanceClient.getTokenBalanceData(d,g);return{assetId:e,globalFarm:l,yieldFarm:u,priceAdjustment:c,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 x(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:u})=>{let c=new x(o.totalSharesZ.toString()),h=o.plannedYieldingPeriods.toString(),d=new x(o.yieldPerPeriod.toString()),g=new x(o.maxRewardPerPeriod.toString()),y=o.blocksPerPeriod.toString(),P=new x(i.multiplier.toString()).shiftedBy(-18),T=this.secondsInYear.div(new x(r).times(y)),S;if(c.isZero())S=d.times(P).times(T);else{let N=this.getGlobalRewardPerPeriod(c,d,g,l);S=this.getPoolYieldPerPeriod(N,P,c,l).times(T)}let A=new x(o.pendingRewards.toString()).plus(o.accumulatedPaidRewards.toString()),B=g.times(h),w=u?A.plus(u):B;return A.div(w).gte(.999)?f:S.div(t==="isolatedpool"?2:1).times(100)}).reduce((i,o)=>i.plus(o),f).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"}},z=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"}},ut=class extends Error{constructor(e){super(),this.message=`Subscription type "${e}" not supported`,this.name="SubscriptionNotSupported"}},ct=class extends Error{constructor(e){super(),this.message=`${e}`,this.name="ProviderConfigNotFound"}};import{defineChain as Ct}from"viem";var Lt=["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 t=[m.endpoint,...Lt],r=Array.from(new Set(t.map(s=>s.replace("wss://","https://").replace("ws://","http://"))));return Ct({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:r}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1})};import{createPublicClient as dt,createWalletClient as Mt,custom as Ut,http as qt}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 Be=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:qt()})}getWsProvider(){return dt({chain:this.chain,transport:pt(this.wsProvider)})}getSigner(e){return Mt({account:e,chain:this.chain,transport:Ut(window.ethereum)})}};import{LRUCache as qr}from"@thi.ng/cache";import{memoize1 as Ur}from"@thi.ng/memoize";var E=(n=>(n.Aave="Aave",n.LBP="Lbp",n.Omni="Omnipool",n.Stable="Stableswap",n.XYK="Xyk",n))(E||{}),Z=(n=>(n.UnknownError="UnknownError",n.InsufficientTradingAmount="InsufficientTradingAmount",n.MaxInRatioExceeded="MaxInRatioExceeded",n.MaxOutRatioExceeded="MaxOutRatioExceeded",n.TradeNotAllowed="TradeNotAllowed",n))(Z||{});var Ie=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:f,assetOutED:f}}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(F,e.decimalsOut)}spotPriceOutGivenIn(e){return v(F,e.decimalsIn)}calculateTradeFee(e,t){return f}};import{encodeAddress as Ht}from"@polkadot/util-crypto";import{stringToU8a as Xt}from"@polkadot/util";import{decodeEventLog as Yt}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 Rn=(m,e)=>typeof e=="bigint"?e.toString():e;import{memoize1 as Gt}from"@thi.ng/memoize";import{TLRUCache as Wt}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 ne=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,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 L{evm;mmOracle;pools=[];subs=[];assets=new Map([]);mem=0;memPoolsCache=new Wt(null,{maxlen:1,ttl:1*60*60*1e3,release:e=>{this.mem>e&&this.log(this.getPoolType(),`mem ${e} released at`,new Date)}});memPools=Gt(e=>(this.log(this.getPoolType(),`mem ${e} sync`),this.getPools()),this.memPoolsCache);constructor(e,t){super(e),this.evm=t,this.mmOracle=new ne(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 $t=["Supply","Withdraw","Repay","Borrow"],Ae=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 Ht(Xt(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}=Yt({abi:fe,topics:l.topics,data:l.data});$t.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"?gt(e.location,"accountKey20").accountKey20.key:G.fromAssetId(e.id)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:0}}};import{calculate_in_given_out as Vt,calculate_out_given_in as Kt,calculate_linear_weights as jt,calculate_pool_trade_fee as zt,get_spot_price as Zt}from"@galacticcouncil/math-lbp";var q=class{static getSpotPrice(e,t,r,s,n){return Zt(e,t,r,s,n)}static calculateInGivenOut(e,t,r,s,n){return Vt(e,t,r,s,n)}static calculateOutGivenIn(e,t,r,s,n){return Kt(e,t,r,s,n)}static calculateLinearWeights(e,t,r,s,n){return jt(e,t,r,s,n)}static calculatePoolTradeFee(e,t,r){return zt(e,t,r)}};var b=class m{static toPct(e){let[t,r]=e;return m.safeDivide(t*100,r)}static toRaw(e){let[t,r]=e;return m.safeDivide(t,r)}static fromPermill(e){return[e,1e6]}static fromRate(e,t){return[e,t]}static safeDivide(e,t,r=12){let s=10**r;return Math.round(e*s/t)/s}static safeRound(e){return parseFloat(e.toPrecision(15))}};var ve=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=b.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=b.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=q.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?f:s}calculateOutGivenIn(e,t){let r=q.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?f:s}spotPriceInGivenOut(e){let t=q.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),v(F,e.decimalsOut).toString());return p(t)}spotPriceOutGivenIn(e){let t=q.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),v(F,e.decimalsIn).toString());return p(t)}calculateTradeFee(e,t){let r=q.calculatePoolTradeFee(e.toString(),this.repayFeeApply?t.repayFee[0]:t.exchangeFee[0],this.repayFeeApply?t.repayFee[1]:t.exchangeFee[1]);return p(r)}};var Re=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());this.poolsData.set(n.toString(),i);let[u,c]=i.fee;return{address:o,type:"Lbp",fee:b.fromRate(u.toNumber(),c.toNumber()),...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=q.calculateLinearWeights(s.toString(),n.toString(),i.toString(),o.toString(),r),[h,d]=a,g=h.toString(),y=p(c),P=d.toString(),T=this.MAX_FINAL_WEIGHT.minus(p(y)),[S,A,B]=await Promise.all([this.isRepayFeeApplied(g,l.toString(),u.toString()),this.getBalance(e,g),this.getBalance(e,P)]);return{repayFeeApply:S,tokens:[{id:g,weight:y,balance:A.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(){let[e,t]=this.api.consts.lbp.repayFee;return b.fromRate(e.toNumber(),t.toNumber())}getPoolLimits(){let e=this.api.consts.lbp.maxInRatio.toNumber(),t=this.api.consts.lbp.maxOutRatio.toNumber(),r=this.api.consts.lbp.minTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};import{calculate_in_given_out as Qt,calculate_lrna_in_given_out as Jt,calculate_out_given_in as er,calculate_out_given_lrna_in 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 ur,is_add_liquidity_allowed as cr,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 R=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 Qt(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 er(e,t,r,s,n,a,i,o,l)}static calculateOutGivenLrnaIn(e,t,r,s,n){return tr(e,t,r,s,n)}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=x(t),a=x(e),i=x(s),l=x(r).shiftedBy(-18);if(n.div(i).lt(l)){let c=l.times(i).minus(n).times(a),h=n.times(x(1).minus(l));return c.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 ur(e)}static isAddLiquidityAllowed(e){return cr(e)}static isRemoveLiquidityAllowed(e){return mr(e)}static recalculateAssetFee(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 recalculateProtocolFee(e,t,r,s,n,a,i,o,l,u,c){return dr(e,t,r,s,n,a,i,o,l,u,c)}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(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===f?f:a.div(s).multipliedBy(100).decimalPlaces(4),o=[],l=R.isSellAllowed(e.tradeableIn),u=R.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(4),o=[],l=R.isSellAllowed(e.tradeableIn),u=R.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=R.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?b.toRaw(r.assetFee).toString():f.toString(),r?b.toRaw(r.protocolFee).toString():f.toString()),n=p(s);return n.isNegative()?f:n}calculateLrnaInGivenOut(e,t,r){let s=R.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?b.toRaw(r.assetFee).toString():f.toString()),n=p(s);return n.isNegative()?f:n}calculateOutGivenIn(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,r);let s=R.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?b.toRaw(r.assetFee).toString():f.toString(),r?b.toRaw(r.protocolFee).toString():f.toString()),n=p(s);return n.isNegative()?f:n}calculateOutGivenLrnaIn(e,t,r){let s=R.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?b.toRaw(r.assetFee).toString():f.toString()),n=p(s);return n.isNegative()?f:n}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=R.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=R.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=R.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=R.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:u,shares:c,tradable:h,cap:d,protocolShares:g}=l.unwrap(),y=await this.getBalance(t,o.toString());return{id:o.toString(),hubReserves:p(u.toString()),shares:p(c.toString()),tradeable:h.bits.toNumber(),balance:y.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===k?[k,Se]:[Se,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),[y,P,T]=s===Se?[0,0,0]:this.getProtocolFee(e,o.toNumber(),l,c),S=h+y,A=g+T;return{assetFee:b.fromPermill(d),protocolFee:b.fromPermill(P),min:b.fromPermill(S),max:b.fromPermill(A)}}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=b.fromPermill(i.toNumber()),h=b.fromPermill(o.toNumber());if(r.isNone||s.isNone)return[i.toNumber(),i.toNumber(),o.toNumber()];let[d]=s.unwrap(),{assetFee:g,timestamp:y}=r.unwrap(),P=Math.max(1,t-y.toNumber()),T=d.volume.bIn.toString(),S=d.volume.bOut.toString(),A=d.liquidity.b.toString();n===k&&(T=d.volume.aIn.toString(),S=d.volume.aOut.toString(),A=d.liquidity.a.toString());let B=b.fromPermill(g.toNumber()),w=R.recalculateAssetFee(T,S,A,"9",a.toString(),b.toRaw(B).toString(),P.toString(),b.toRaw(c).toString(),b.toRaw(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=b.fromPermill(i.toNumber()),h=b.fromPermill(o.toNumber());if(r.isNone||s.isNone)return[i.toNumber(),i.toNumber(),o.toNumber()];let[d]=s.unwrap(),{protocolFee:g,timestamp:y}=r.unwrap(),P=Math.max(1,t-y.toNumber()),T=d.volume.bIn.toString(),S=d.volume.bOut.toString(),A=d.liquidity.b.toString();n===k&&(T=d.volume.aIn.toString(),S=d.volume.aOut.toString(),A=d.liquidity.a.toString());let B=b.fromPermill(g.toNumber()),w=R.recalculateProtocolFee(T,S,A,"9",a.toString(),b.toRaw(B).toString(),P.toString(),b.toRaw(c).toString(),b.toRaw(h).toString(),l.toString(),u.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.toNumber(),t=this.api.consts.omnipool.maxOutRatio.toNumber(),r=this.api.consts.omnipool.minimumTradingLimit.toNumber();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 xr,calculate_spot_price_with_fee as Or,calculate_liquidity_out_asset_a as Br,calculate_liquidity_out_asset_b as Ir}from"@galacticcouncil/math-xyk";var X=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 xr(e,t)}static calculateSpotPriceWithFee(e,t,r,s){return Or(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 Ee=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=b.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=b.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()?f:s}calculateOutGivenIn(e,t){let r=X.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?f:s}spotPriceInGivenOut(e){let t=X.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),r=v(F,18-e.decimalsOut);return p(t).div(r)}spotPriceOutGivenIn(e){let t=X.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),r=v(F,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 _e=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(){let[e,t]=this.api.consts.xyk.getExchangeFee;return b.fromRate(e.toNumber(),t.toNumber())}getPoolLimits(){let e=this.api.consts.xyk.maxInRatio.toNumber(),t=this.api.consts.xyk.maxOutRatio.toNumber(),r=this.api.consts.xyk.minTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};import{calculate_in_given_out as Ar,calculate_out_given_in as vr,calculate_amplification as Rr,calculate_add_one_asset as Nr,calculate_liquidity_out_one_asset as Fr,calculate_shares as Er,calculate_shares_for_amount as _r,calculate_spot_price_with_fee as kr,pool_account_name as Dr,recalculate_peg as Cr}from"@galacticcouncil/math-stableswap";var _=class{static getPoolAddress(e){return Dr(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 Rr(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 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 vr(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 kr(e,t,r,s,n,a,i,o)}static recalculatePegs(e,t,r,s,n){let a=Cr(e,t,r,s,n);return JSON.parse(a)}};var ke=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=n.minus(s),i=s===f?f:a.div(s).multipliedBy(100).decimalPlaces(4),o=[],l=R.isSellAllowed(e.tradeableIn),u=R.isBuyAllowed(e.tradeableOut);return(!l||!u)&&o.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&o.push("InsufficientTradingAmount"),{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(4),o=[],l=R.isSellAllowed(e.tradeableIn),u=R.isBuyAllowed(e.tradeableOut);return(!l||!u)&&o.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&o.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:s,amountOut:n,feePct:i.toNumber(),errors:o}}calculateIn(e,t,r){let s=_.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?b.toRaw(r.fee).toString():f.toString(),this.getPegs()),n=p(s);return n.isNegative()?f:n}calculateAddOneAsset(e,t,r){let s=_.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,r?b.toRaw(r.fee).toString():f.toString(),this.getPegs()),n=p(s);return n.isNegative()?f:n}calculateSharesForAmount(e,t,r){let s=_.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,r?b.toRaw(r.fee).toString():f.toString(),this.getPegs()),n=p(s);return n.isNegative()?f: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(F,e.decimalsIn-e.decimalsOut);return p(t).div(s)}let r=v(F,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?b.toRaw(r.fee).toString():f.toString(),this.getPegs()),n=p(s);return n.isNegative()?f:n}calculateWithdrawOneAsset(e,t,r){let s=_.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,r?b.toRaw(r.fee).toString():f.toString(),this.getPegs()),n=p(s);return n.isNegative()?f:n}calculateShares(e,t,r){let s=_.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,r?b.toRaw(r.fee).toString():f.toString(),this.getPegs()),n=p(s);return n.isNegative()?f: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(F,e.decimalsOut-e.decimalsIn);return p(t).div(s)}let r=v(F,18-e.decimalsOut);return p(t).div(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 Mr}from"@polkadot/util-crypto";var 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:[a]},i])=>{try{let o=i.unwrap(),l=a.toString(),u=this.getPoolAddress(l),[c,h,d]=await Promise.all([this.getPoolDelta(l,o,r.toString()),this.getPoolTokens(u,l,o),this.getPoolPegs(l,o,r.toString())]);return h.push({id:l,tradeable:15,balance:c.totalIssuance}),this.stablePools.set(u,o),{address:u,id:l,type:"Stableswap",fee:b.fromPermill(o.fee.toNumber()),tokens:h,...c,...d,...this.getPoolLimits()}}catch(o){return console.warn(`Skipping pool ${a.toString()}
|
|
2
|
-
`,String(o)),null}});return(await Promise.all(s)).filter(a=>a!==null)}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)]),i=e.tokens.map(o=>o.id===e.id?{...o,balance:n.totalIssuance}:o);Object.assign(e,{tokens:i},n,a)}})}async getPoolDelta(e,t,r){let{initialAmplification:s,finalAmplification:n,initialBlock:a,finalBlock:i}=t,o=
|
|
3
|
-
Items: [${this.feeCache.length}]`),this.feeCache.release(),this.disconnectSubscribeNewHeads?.()}};var oe=class{static get(e){switch(e.type){case"Aave":return Ie.fromPool(e);case"Xyk":return Ee.fromPool(e);case"Omnipool":return Ne.fromPool(e);case"Lbp":return ve.fromPool(e);case"Stableswap":return ke.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};var Ce=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 Gr=6,le=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 Ce,a=[];for(a.push([t,""]),n.enqueue(a);n.size()>0;){let i=n.dequeue();if(i==null||i.length>Gr)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 Ke(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 ue=class{getProposals(e,t,r){let s=Ke(r),n=Object.keys(s),a=n.map(u=>s[u]).flat(),i=new le,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 ue,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,oe.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 Wr=p("100");function Zl(m,e){return m.minus(e).abs().div(m.plus(e).div(2)).multipliedBy(100).decimalPlaces(2)}function me(m,e){return m.minus(e).div(e).multipliedBy(100).decimalPlaces(2)}function ht(m,e){return F.minus(e.div(m)).multipliedBy(100).decimalPlaces(4)}function Pt(m,e){return e.div(m).minus(F).multipliedBy(100).decimalPlaces(4)}function K(m,e){return(e<.01||e>100)&&new Error("Supported range is from 0.01% - 100%"),m.div(Wr).multipliedBy(e).decimalPlaces(0,1)}var je=(t=>(t.Buy="Buy",t.Sell="Sell",t))(je||{}),ze=(r=>(r.Dca="Dca",r.TwapSell="TwapSell",r.TwapBuy="TwapBuy",r))(ze||{}),bt=(r=>(r.OrderTooSmall="OrderTooSmall",r.OrderTooBig="OrderTooBig",r.OrderImpactTooBig="OrderImpactTooBig",r))(bt||{});var pe=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?b.toPct(e.min):void 0,r=e.max?b.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 z(e,t);let o;if(s)o=await this.toSellSwaps(r,s,a);else{let w=i.map(async N=>await this.toSellSwaps(r,N,a)),I=await Promise.all(w);o=this.findBestSellRoute(I)}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,I)=>w.multipliedBy(I)),d=v(h,u.assetOutDecimals),g=c?u.calculatedOut:this.calculateDelta0Y(l.amountIn,o,a),y=u.amountOut,P=c?u.tradeFeePct:ht(g,y).toNumber(),T=g.minus(y),S=this.getRouteFeeRange(o),A=l.amountIn.shiftedBy(-1*l.assetInDecimals).multipliedBy(d),B=me(g,A);return{type:"Sell",amountIn:l.amountIn,amountOut:u.amountOut,spotPrice:d,tradeFee:T,tradeFeePct:P,tradeFeeRange:S,priceImpactPct:B.toNumber(),swaps:o,toHuman(){return{type:"Sell",amountIn:O(l.amountIn,l.assetInDecimals),amountOut:O(u.amountOut,u.assetOutDecimals),spotPrice:O(d,u.assetOutDecimals),tradeFee:O(T,u.assetOutDecimals),tradeFeePct:P,tradeFeeRange:S,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),y=this.getPoolFeeRange(u),P=i.spotPriceOutGivenIn(o),T=l.shiftedBy(-1*o.decimalsIn).multipliedBy(P),S=me(h,T);s.push({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:c,calculatedOut:h,spotPrice:P,tradeFeePct:d,tradeFeeRange:y,priceImpactPct:S.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:O(l,o.decimalsIn),amountOut:O(c,o.decimalsOut),calculatedOut:O(h,o.decimalsOut),spotPrice:O(P,o.decimalsOut),tradeFeePct:d,tradeFeeRange:y,priceImpactPct:S.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 z(e,t);let l=r.filter(d=>d.tokens.some(g=>g.id===e)).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),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 z(e,t);let o;if(s)o=await this.toBuySwaps(r,s,a);else{let w=i.map(async N=>await this.toBuySwaps(r,N,a)),I=await Promise.all(w);o=this.findBestBuyRoute(I)}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,I)=>w.multipliedBy(I)),d=v(h,u.assetInDecimals),g=c?u.calculatedIn:this.calculateDelta0X(l.amountOut,o,a),y=u.amountIn,P=c?u.tradeFeePct:Pt(g,y).toNumber(),T=y.minus(g),S=this.getRouteFeeRange(o),A=l.amountOut.shiftedBy(-1*l.assetOutDecimals).multipliedBy(d),B;return g.isZero()?B=-100:B=me(A,g).toNumber(),{type:"Buy",amountOut:l.amountOut,amountIn:u.amountIn,spotPrice:d,tradeFee:T,tradeFeePct:P,tradeFeeRange:S,priceImpactPct:B,swaps:o,toHuman(){return{type:"Buy",amountOut:O(l.amountOut,l.assetOutDecimals),amountIn:O(u.amountIn,u.assetInDecimals),spotPrice:O(d,u.assetInDecimals),tradeFee:O(T,u.assetInDecimals),tradeFeePct:P,tradeFeeRange:S,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),y=this.getPoolFeeRange(u),P=i.spotPriceInGivenOut(o),T=l.shiftedBy(-1*o.decimalsOut).multipliedBy(P),S;h.isZero()?S=-100:S=me(T,h).toNumber(),s.unshift({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:c,amountOut:l,calculatedIn:h,spotPrice:P,tradeFeePct:d,tradeFeeRange:y,priceImpactPct:S,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:O(c,o.decimalsIn),amountOut:O(l,o.decimalsOut),calculatedIn:O(h,o.decimalsIn),spotPrice:O(P,o.decimalsIn),tradeFeePct:d,tradeFeeRange:y,priceImpactPct:S,errors:g}}})}return s}};var yt=6e3,ft=p(1e15),de=6,Ze=-5,Qe=6*60*60*1e3;var St=6;var M=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 ge=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:u}=i,c=l[0],h=l[l.length-1],{assetInDecimals:d}=c,{assetOutDecimals:g}=h,y=Math.abs(u),P=this.getMinimumTradeCount(o,a),T=this.getOptimalTradeCount(y),S=n?Math.round(s/n):T,A=Math.ceil(s/P),B=Math.round(s/T),w=Math.round(s/S),I=o.dividedBy(S).decimalPlaces(0,1),N=await this.router.getBestSell(e,t,O(I,d)),U=o.isLessThan(a),Pe=[];U&&Pe.push("OrderTooSmall");let be=N.amountOut.multipliedBy(S),Ue=this.toBlockPeriod(w),qe=N.tradeFee.multipliedBy(S),Ge=M.build(l),ye={assetIn:e,assetOut:t,errors:Pe,frequencyMin:A,frequencyOpt:B,frequency:w,tradeCount:S,tradeFee:qe,tradeImpactPct:N.priceImpactPct,tradePeriod:Ue,tradeRoute:Ge,type:"Dca"};return{...ye,amountIn:o,amountOut:be,tradeAmountIn:N.amountIn,tradeAmountOut:N.amountOut,toHuman(){return{...ye,amountIn:O(o,d),amountOut:O(be,g),tradeAmountIn:O(N.amountIn,d),tradeAmountOut:O(N.amountOut,g)}}}}async getMinimumOrderBudget(e){if(k===e)return this.minOrderBudget;let t=await this.router.getBestSpotPrice(k,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),y=a.dividedBy(g).decimalPlaces(0,1),P=await this.router.getBestSell(l.assetIn,u.assetOut,O(y,c)),T=g===1,S=a.isLessThan(s),A=P.priceImpactPct<Ze,B=[];S||T?B.push("OrderTooSmall"):A&&B.push("OrderImpactTooBig");let w=P.amountOut.multipliedBy(g),I=P.tradeFee.multipliedBy(g),N=M.build(i),U={assetIn:e,assetOut:t,errors:B,tradeCount:g,tradeImpactPct:P.priceImpactPct,tradePeriod:de,tradeRoute:N,type:"TwapSell"};return{...U,amountIn:a,amountOut:w,tradeAmountIn:P.amountIn,tradeAmountOut:P.amountOut,tradeFee:I,toHuman(){return{...U,amountIn:O(a,c),amountOut:O(w,h),tradeAmountIn:O(P.amountIn,c),tradeAmountOut:O(P.amountOut,h),tradeFee:O(I,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),y=a.dividedBy(g).decimalPlaces(0,1),P=await this.router.getBestBuy(l.assetIn,u.assetOut,O(y,h)),T=P.amountIn.multipliedBy(g),S=g===1,A=T.isLessThan(s),B=P.priceImpactPct<Ze,w=[];A||S?w.push("OrderTooSmall"):B&&w.push("OrderImpactTooBig");let I=P.tradeFee.multipliedBy(g),N=M.build(i),U={assetIn:e,assetOut:t,errors:w,tradeCount:g,tradeImpactPct:P.priceImpactPct,tradePeriod:de,tradeRoute:N,type:"TwapBuy"};return{...U,amountIn:T,amountOut:a,tradeAmountIn:P.amountIn,tradeAmountOut:P.amountOut,tradeFee:I,toHuman(){return{...U,amountIn:O(T,c),amountOut:O(a,h),tradeAmountIn:O(P.amountIn,c),tradeAmountOut:O(P.amountOut,h),tradeFee:O(I,c)}}}}getTwapTradeCount(e){let t=this.getOptimalTradeCount(e);if(this.getTwapExecutionTime(t)>Qe){let s=Qe/(this.blockTime*de);return Math.round(s)}return t}getTwapExecutionTime(e){return e*de*this.blockTime}toBlockPeriod(e){let t=e/this.blockTime,r=Math.round(t);return Math.max(r,St)}};var Q=class extends D{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,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(),J)}isDirectOmnipoolTrade(e){return e.length===1&&e[0].pool==="Omnipool"}};var Le=class extends Q{_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=K(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(),M.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=K(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(),M.build(r)),s.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let h=this.dispatchWithExtraGas(u);return this.wrapTx("RouterSellAll",h,J)}return this.wrapTx("RouterSell",u)}async buildSellAllTx(){let{amountOut:e,swaps:t}=this.trade,r=t[0],s=t[t.length-1],n=K(e,this.slippagePct),a=r.assetIn,i=s.assetOut,o=e.minus(n),l=this.api.tx.router.sellAll(a,i,o.toFixed(),M.build(t));if(r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let c=this.dispatchWithExtraGas(l);return this.wrapTx("RouterSellAll",c,J)}return this.wrapTx("RouterSellAll",l)}};var Me=class extends Q{_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=K(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=K(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 he=class{api;evm;constructor(e,t){this.api=e,this.evm=t}trade(e){return new Le(this.api,this.evm).setTrade(e)}order(e){return new Me(this.api,this.evm).setOrder(e)}};function cc(m){let e=new se(m),t=new Be(m),r=new ae(m,t),s=new $(t),n=new pe(r),a=new ge(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 he(m,t),destroy:()=>{r.destroy()}}}export{ee as AaveClient,Ie as AavePool,Ae as AavePoolClient,$ as AaveUtils,V as AssetClient,ot as AssetNotFound,es as BASILISK_PARACHAIN_ID,L as BalanceClient,x as BigNumber,ae as CachingPoolService,se as ChainParams,Et as DECIMAL_PLACES,G as ERC20,Be as EvmClient,$e as FarmClient,j as H160,Se as HUB_ASSET_ID,ts as HYDRADX_PARACHAIN_ID,W as HYDRADX_SS58_PREFIX,ms as INFINITY,q as LbpMath,ve as LbpPool,Re as LbpPoolClient,F as ONE,R as OmniMath,Ne as OmniPool,Fe as OmniPoolClient,Y as PERMILL_DENOMINATOR,D as PolkadotApiClient,at as PoolConfigNotFound,Z as PoolError,oe as PoolFactory,Oe as PoolNotFound,ie as PoolService,E as PoolType,ct as ProviderConfigNotFound,te as RUNTIME_DECIMALS,z as RouteNotFound,ce as Router,et as SYSTEM_ASSET_DECIMALS,k as SYSTEM_ASSET_ID,_ as StableMath,ke as StableSwap,De as StableSwapClient,lt as StorageConfigNotFound,ut as SubscriptionNotSupported,re as TRADEABLE_DEFAULT,bt as TradeOrderError,ze as TradeOrderType,M as TradeRouteBuilder,pe as TradeRouter,ge as TradeScheduler,je as TradeType,he as TxBuilderFactory,X as XykMath,Ee as XykPool,_e as XykPoolClient,f as ZERO,Rn as bnFormatter,p as bnum,Pt as calculateBuyFee,Zl as calculateDiffToAvg,me as calculateDiffToRef,ht as calculateSellFee,mt as createChain,cc as createSdkContext,gt as findNestedKey,vn as findNestedObj,K as getFraction,Rt as isEvmAccount,Nt as isEvmAddress,Ft as isSs58Address,v as scale,ps as toBn,O as toDecimals};
|
|
1
|
+
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 He=[{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",Xe="0x112b087b60C1a166130d59266363C45F8aa99db0",Ye="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",J=1000000n;var jr=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var ee=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:He,address:Xe,args:[Ye],functionName:"getReservesData"})}async getUserReservesData(e){return await this.client.readContract({abi:He,address:Xe,args:[Ye,e],functionName:"getUserReservesData"})}async getUserAccountData(e){return await this.client.readContract({abi:Se,address:et,args:[e],functionName:"getUserAccountData"})}};import{decodeAddress as we,encodeAddress as rt}from"@polkadot/util-crypto";import{hexToU8a as At,isHex as vt,u8aToHex as Rt}from"@polkadot/util";import{Buffer as H}from"buffer";var ts=2090,Y=1e6,Te="1",rs=2034,W=63,te=18,E="0",tt=12,re=15;var Ve="ETH\0";function Nt(m){if(!m)return!1;try{let e=we(m,!0),t=H.from(Ve);return H.from(e.subarray(0,t.length)).equals(t)}catch{return!1}}function Et(m){return!!/^0x[a-fA-F0-9]{40}$/.test(m)}function Ft(m){try{let e=vt(m)?At(m):we(m);return rt(e),!0}catch{return!1}}var z=class m{static toAccount=e=>{let t=H.from(e.slice(2),"hex"),r=H.from(Ve);return rt(new Uint8Array(H.concat([r,t,H.alloc(8)])),63)};static fromAccount=e=>{let t=we(e),r=H.from(Ve),s=t.slice(r.length,-8);return"0x"+H.from(s).toString("hex")};static fromSS58=e=>{let r=we(e).slice(0,20);return Rt(r)};static fromAny=e=>{if(Et(e))return e;if(Nt(e))return m.fromAccount(e);if(Ft(e))return m.fromSS58(e);throw new Error("Unknown address type")}};import{Buffer as Be}from"buffer";var G=class{static fromAssetId(e){let t=Number(e),r=Be.alloc(20,0);return r[15]=1,r.writeUInt32BE(t,16),"0x"+r.toString("hex")}static toAssetId(e){let t=Be.from(e.replace("0x",""),"hex");return t.length!==20||!this.isAssetAddress(e)?null:t.readUInt32BE(16)}static isAssetAddress(e){let t=Be.from("0000000000000000000000000000000100000000","hex"),r=Be.from(e.replace("0x",""),"hex");return r.length!==20?!1:r.subarray(0,16).equals(t.subarray(0,16))}};import{BigNumber as w}from"bignumber.js";var _t=12;w.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:_t});var f=p(0),F=p(1),ps=p("Infinity");function v(m,e){let t=new w(e.toString()),r=new w(10).pow(t);return m.times(r).decimalPlaces(0,1)}function p(m){return new w(m.toString())}function ds(m,e){let t=p(m);return v(t,e)}function x(m,e){return m.shiftedBy(-1*e).toString()}var xe=p("1e27"),kt=p("1.01"),Dt=p("31536000"),V=class{client;constructor(e){this.client=new ee(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,[c,u,h,d,g,y]=n,P=p(y).dividedBy(1e18).decimalPlaces(6,w.ROUND_DOWN),T=p(c),S=p(u),A=[];for(let O of o){let B=O.underlyingAsset.toLowerCase(),I=i.find(({underlyingAsset:It})=>It.toLowerCase()===B);if(!I)throw new Error("Missing pool reserve for "+B);let N=p(O.scaledATokenBalance),q=p(I.liquidityIndex),be=p(I.liquidityRate),ye=p(I.availableLiquidity),Ue=p(I.priceInMarketReferenceCurrency),Ge=a+6,We=this.calculateLinearInterest(be,I.lastUpdateTimestamp,Ge),fe=q.multipliedBy(We).dividedBy(xe).decimalPlaces(0,w.ROUND_DOWN),wt=N.multipliedBy(fe).dividedBy(xe).decimalPlaces(0,w.ROUND_DOWN),Bt=p(l!==0&&l===I.eModeCategoryId?I.eModeLiquidationThreshold:I.reserveLiquidationThreshold).div(1e4),xt=I.usageAsCollateralEnabled&&O.usageAsCollateralEnabledOnUser&&p(O.scaledATokenBalance).gt(0),Ot=G.toAssetId(B);A.push({aTokenBalance:wt,availableLiquidity:ye,decimals:Number(I.decimals),isCollateral:xt,priceInRef:Ue,reserveId:Ot,reserveAsset:B,reserveLiquidationThreshold:Bt})}return{healthFactor:P.toNumber(),totalCollateral:T,totalDebt:S,reserves:A}}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,w.ROUND_DOWN).toNumber()}async getHealthFactorAfterWithdraw(e,t,r){let{totalCollateral:s,totalDebt:n,reserves:a}=await this.getSummary(e),i=G.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,w.ROUND_DOWN):f,y=s.minus(g);return y.lte(0)?0:y.multipliedBy(h).dividedBy(n).decimalPlaces(6,w.ROUND_DOWN).toNumber()}async getHealthFactorAfterSupply(e,t,r){let{totalCollateral:s,totalDebt:n,reserves:a}=await this.getSummary(e),i=G.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,w.ROUND_DOWN),g=s.plus(d);return g.lte(0)?0:g.multipliedBy(u).dividedBy(n).decimalPlaces(6,w.ROUND_DOWN).toNumber()}async getMaxWithdraw(e,t){let{totalDebt:r,reserves:s,healthFactor:n}=await this.getSummary(e),a=G.fromAssetId(t),i=s.find(o=>o.reserveAsset===a);if(!i)throw new Error("Missing reserve data for "+a);return this.calculateWithdrawMax(i,r,n)}async getMaxWithdrawAll(e){let{totalDebt:t,reserves:r,healthFactor:s}=await this.getSummary(e),n={};for(let a of r){let i=this.calculateWithdrawMax(a,t,s);a.reserveId&&(n[a.reserveId]=i)}return n}calculateWithdrawMax(e,t,r){let{aTokenBalance:s,availableLiquidity:n,decimals:a,priceInRef:i,reserveLiquidationThreshold:o,isCollateral:l}=e,c=s;if(l&&t.gt(0)){let h=p(r).minus(kt);if(h.gt(0)){let g=h.multipliedBy(t).dividedBy(o).decimalPlaces(0,w.ROUND_DOWN).dividedBy(i).multipliedBy(p(10).pow(a)).decimalPlaces(0,w.ROUND_DOWN);c=w.minimum(s,g)}else c=f}return{amount:w.minimum(c,n),decimals:a}}calculateLinearInterest(e,t,r){let s=r-t;return s<=0?xe:e.multipliedBy(s).dividedBy(Dt).plus(xe).decimalPlaces(0,w.ROUND_DOWN)}};function st(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 D=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");st(r)&&console.log(e,...t)}};var $=class extends D{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==E){let u=this.api.consts.balances.existentialDeposit;return{id:E,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(y=>y.toString()).map(y=>{let{symbol:P}=this.getToken(y,t,r);return[y,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:y}=d;switch(y.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 D{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===E?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 r=await this.api.query.tokens.accounts(e,t);return this.calculateFreeBalance(r)}async getErc20Balance(e,t){let r=await this.getTokenBalanceData(e,t);return this.calculateFreeBalance(r)}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t(E,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 t=e.free.toString(),r=e.frozen.toString();return w(t).lt(r)?w(0):w(t).minus(r)}};var se=class extends D{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===E?this.getSystemBalance(e):this.getTokenBalance(e,t)}async getAccountBalances(e){return(await this.api.call.currenciesApi.account(e)).map(([r,s])=>this.calculateBalance(s,r.toString()))}async getSystemBalance(e){let{data:t}=await this.api.query.system.account(e);return this.calculateBalance(t,E)}async getTokenBalance(e,t){let r=await this.api.query.tokens.accounts(e,t);return this.calculateBalance(r,t)}async getErc20Balance(e,t){let r=await this.getTokenBalanceData(e,t);return this.calculateBalance(r,t)}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t(E,this.calculateBalance(r,E)))}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=n[l][1],u=this.calculateBalance(o,c);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: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)}calculateBalance(e,t){let r=w(e.free.toString()),s=e.frozen.toString(),n=e.reserved.toString(),a=r.gte(s)?r.minus(s).toString():"0",i=r.plus(n).toString();return{freeBalance:r.toString(),total:i,transferable:a,reservedBalance:n,frozenBalance:s,assetId:t}}};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)}};import{fixed_from_rational as nt}from"@galacticcouncil/math-liquidity-mining";import{GenericAccountId32 as Ct}from"@polkadot/types";import{u8aConcat as it}from"@polkadot/util";import{isAddress as at}from"@polkadot/util-crypto";var $e=class extends D{balanceClient;constructor(e){super(e),this.balanceClient=new L(e)}secondsInYear=new w(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(),y=await this.balanceClient.getTokenBalanceData(d,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:u,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,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(),y=await this.balanceClient.getTokenBalanceData(d,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:u,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(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=nt(i,o):l=nt(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 it(e,Array(Math.max(0,t-e.length)).fill(0))}getAccountResolver=e=>(t,r)=>{let s="modl",n=r?"0x78796b4c4d704944":"0x4f6d6e6957684c4d";return new Ct(e,this.padEndU8a(it(s,n,typeof t!="number"?t.toU8a():[t]),32))};async getFarmApr(e,t){if(t==="isolatedpool"&&!at(e))throw new Error("You must pass an address of isolated pool as id");if(t==="omnipool"&&at(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 w(o.totalSharesZ.toString()),h=o.plannedYieldingPeriods.toString(),d=new w(o.yieldPerPeriod.toString()),g=new w(o.maxRewardPerPeriod.toString()),y=o.blocksPerPeriod.toString(),P=new w(i.multiplier.toString()).shiftedBy(-18),T=this.secondsInYear.div(new w(r).times(y)),S;if(u.isZero())S=d.times(P).times(T);else{let N=this.getGlobalRewardPerPeriod(u,d,g,l);S=this.getPoolYieldPerPeriod(N,P,u,l).times(T)}let A=new w(o.pendingRewards.toString()).plus(o.accumulatedPaidRewards.toString()),O=g.times(h),B=c?A.plus(c):O;return A.div(B).gte(.999)?f:S.div(t==="isolatedpool"?2:1).times(100)}).reduce((i,o)=>i.plus(o),f).toString():void 0}};var Oe=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},ot=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"}},lt=class extends Error{constructor(e){super(),this.message=`Asset ${e} not available in current network`,this.name="AssetNotFound"}},ct=class extends Error{constructor(e){super(),this.message=`Storage missing ${e}`,this.name="StorageConfigNotFound"}},ut=class extends Error{constructor(e){super(),this.message=`Subscription type "${e}" not supported`,this.name="SubscriptionNotSupported"}},mt=class extends Error{constructor(e){super(),this.message=`${e}`,this.name="ProviderConfigNotFound"}};import{defineChain as Lt}from"viem";var Mt=["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"],pt=m=>{let t=[m.endpoint,...Mt],r=Array.from(new Set(t.map(s=>s.replace("wss://","https://").replace("ws://","http://"))));return Lt({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:r}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://explorer.evm.hydration.cloud"}},testnet:!1})};import{createPublicClient as gt,createWalletClient as qt,custom as Ut,http as Gt}from"viem";function dt(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 Ie=class{wsProvider;chain;constructor(e){let{provider:t}=e._options;this.wsProvider=t,this.chain=pt(t)}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return gt({chain:this.chain,transport:Gt()})}getWsProvider(){return gt({chain:this.chain,transport:dt(this.wsProvider)})}getSigner(e){return qt({account:e,chain:this.chain,transport:Ut(window.ethereum)})}};import{LRUCache as Gr}from"@thi.ng/cache";import{memoize1 as Ur}from"@thi.ng/memoize";var _=(n=>(n.Aave="Aave",n.LBP="Lbp",n.Omni="Omnipool",n.Stable="Stableswap",n.XYK="Xyk",n))(_||{}),Z=(n=>(n.UnknownError="UnknownError",n.InsufficientTradingAmount="InsufficientTradingAmount",n.MaxInRatioExceeded="MaxInRatioExceeded",n.MaxOutRatioExceeded="MaxOutRatioExceeded",n.TradeNotAllowed="TradeNotAllowed",n))(Z||{});var Ae=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:f,assetOutED:f}}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(F,e.decimalsOut)}spotPriceOutGivenIn(e){return v(F,e.decimalsIn)}calculateTradeFee(e,t){return f}};import{encodeAddress as Xt}from"@polkadot/util-crypto";import{stringToU8a as Yt}from"@polkadot/util";import{decodeEventLog as Vt}from"viem";function ht(m,e){let t=[];return JSON.stringify(m,(r,s)=>(s&&s[e]&&t.push(s),s)),t[0]}function kn(m,e,t){let r;return JSON.stringify(m,(s,n)=>(n&&n[e]===t&&(r=n),n)),r}var Dn=(m,e)=>typeof e=="bigint"?e.toString():e;import{memoize1 as Wt}from"@thi.ng/memoize";import{TLRUCache as Ht}from"@thi.ng/cache";var Ke=[{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 ie=class{client;constructor(e){this.client=e.getWsProvider()}async getData(e,t=6){let[r,s,n]=await Promise.all([this.client.readContract({abi:Ke,address:e,functionName:"latestRoundData"}),this.client.readContract({abi:Ke,address:e,functionName:"decimals"}),this.client.getBlock()]),[a,i,o,l]=r,c=n.number-(n.timestamp-l)/BigInt(t),u=Number(c);return{price:i,decimals:s,updatedAt:u<0?0:u}}};var C=class extends L{evm;mmOracle;pools=[];subs=[];assets=new Map([]);mem=0;memPoolsCache=new Ht(null,{maxlen:1,ttl:1*60*60*1e3,release:e=>{this.mem>e&&this.log(this.getPoolType(),`mem ${e} released at`,new Date)}});memPools=Wt(e=>(this.log(this.getPoolType(),`mem ${e} sync`),this.getPools()),this.memPoolsCache);constructor(e,t){super(e),this.evm=t,this.mmOracle=new ie(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 $t=["Supply","Withdraw","Repay","Borrow"],ve=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 Xt(Yt(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}=Vt({abi:Se,topics:l.topics,data:l.data});$t.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"?ht(e.location,"accountKey20").accountKey20.key:G.fromAssetId(e.id)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:0}}};import{calculate_in_given_out as Kt,calculate_out_given_in as zt,calculate_linear_weights as jt,calculate_pool_trade_fee as Zt,get_spot_price as Qt}from"@galacticcouncil/math-lbp";var U=class{static getSpotPrice(e,t,r,s,n){return Qt(e,t,r,s,n)}static calculateInGivenOut(e,t,r,s,n){return Kt(e,t,r,s,n)}static calculateOutGivenIn(e,t,r,s,n){return zt(e,t,r,s,n)}static calculateLinearWeights(e,t,r,s,n){return jt(e,t,r,s,n)}static calculatePoolTradeFee(e,t,r){return Zt(e,t,r)}};var b=class m{static toPct(e){let[t,r]=e;return m.safeDivide(t*100,r)}static toRaw(e){let[t,r]=e;return m.safeDivide(t,r)}static fromPermill(e){return[e,1e6]}static fromRate(e,t){return[e,t]}static safeDivide(e,t,r=12){let s=10**r;return Math.round(e*s/t)/s}static safeRound(e){return parseFloat(e.toPrecision(15))}};var Re=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=b.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=b.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=U.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?f:s}calculateOutGivenIn(e,t){let r=U.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?f:s}spotPriceInGivenOut(e){let t=U.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),v(F,e.decimalsOut).toString());return p(t)}spotPriceOutGivenIn(e){let t=U.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),v(F,e.decimalsIn).toString());return p(t)}calculateTradeFee(e,t){let r=U.calculatePoolTradeFee(e.toString(),this.repayFeeApply?t.repayFee[0]:t.exchangeFee[0],this.repayFeeApply?t.repayFee[1]:t.exchangeFee[1]);return p(r)}};var Ne=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());this.poolsData.set(n.toString(),i);let[c,u]=i.fee;return{address:o,type:"Lbp",fee:b.fromRate(c.toNumber(),u.toNumber()),...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=U.calculateLinearWeights(s.toString(),n.toString(),i.toString(),o.toString(),r),[h,d]=a,g=h.toString(),y=p(u),P=d.toString(),T=this.MAX_FINAL_WEIGHT.minus(p(y)),[S,A,O]=await Promise.all([this.isRepayFeeApplied(g,l.toString(),c.toString()),this.getBalance(e,g),this.getBalance(e,P)]);return{repayFeeApply:S,tokens:[{id:g,weight:y,balance:A.toString()},{id:P,weight:T,balance:O.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(){let[e,t]=this.api.consts.lbp.repayFee;return b.fromRate(e.toNumber(),t.toNumber())}getPoolLimits(){let e=this.api.consts.lbp.maxInRatio.toNumber(),t=this.api.consts.lbp.maxOutRatio.toNumber(),r=this.api.consts.lbp.minTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};import{calculate_in_given_out as Jt,calculate_lrna_in_given_out as er,calculate_out_given_in as tr,calculate_out_given_lrna_in as rr,calculate_spot_price as sr,calculate_lrna_spot_price as nr,calculate_shares as ir,calculate_liquidity_out as ar,calculate_liquidity_lrna_out as or,calculate_liquidity_hub_in as lr,is_sell_allowed as cr,is_buy_allowed as ur,is_add_liquidity_allowed as mr,is_remove_liquidity_allowed as pr,recalculate_asset_fee as dr,recalculate_protocol_fee as gr,verify_asset_cap as hr}from"@galacticcouncil/math-omnipool";var R=class{static calculateSpotPrice(e,t,r,s){return sr(e,t,r,s)}static calculateLrnaSpotPrice(e,t){return nr(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 er(e,t,r,s,n)}static calculateOutGivenIn(e,t,r,s,n,a,i,o,l){return tr(e,t,r,s,n,a,i,o,l)}static calculateOutGivenLrnaIn(e,t,r,s,n){return rr(e,t,r,s,n)}static calculateShares(e,t,r,s){return ir(e,t,r,s)}static calculateLiquidityOut(e,t,r,s,n,a,i,o){return ar(e,t,r,s,n,a,i,o)}static calculateLiquidityLRNAOut(e,t,r,s,n,a,i,o){return or(e,t,r,s,n,a,i,o)}static calculateCapDifference(e,t,r,s){let n=w(t),a=w(e),i=w(s),l=w(r).shiftedBy(-18);if(n.div(i).lt(l)){let u=l.times(i).minus(n).times(a),h=n.times(w(1).minus(l));return u.div(h).toFixed(0)}else return"0"}static calculateLimitHubIn(e,t,r,s){return lr(e,t,r,s)}static isSellAllowed(e){return cr(e)}static isBuyAllowed(e){return ur(e)}static isAddLiquidityAllowed(e){return mr(e)}static isRemoveLiquidityAllowed(e){return pr(e)}static recalculateAssetFee(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 recalculateProtocolFee(e,t,r,s,n,a,i,o,l,c,u){return gr(e,t,r,s,n,a,i,o,l,c,u)}static verifyAssetCap(e,t,r,s){return hr(e,t,r,s)}};var Ee=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===f?f:a.div(s).multipliedBy(100).decimalPlaces(4),o=[],l=R.isSellAllowed(e.tradeableIn),c=R.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(4),o=[],l=R.isSellAllowed(e.tradeableIn),c=R.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=R.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?b.toRaw(r.assetFee).toString():f.toString(),r?b.toRaw(r.protocolFee).toString():f.toString()),n=p(s);return n.isNegative()?f:n}calculateLrnaInGivenOut(e,t,r){let s=R.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?b.toRaw(r.assetFee).toString():f.toString()),n=p(s);return n.isNegative()?f:n}calculateOutGivenIn(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,r);let s=R.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?b.toRaw(r.assetFee).toString():f.toString(),r?b.toRaw(r.protocolFee).toString():f.toString()),n=p(s);return n.isNegative()?f:n}calculateOutGivenLrnaIn(e,t,r){let s=R.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?b.toRaw(r.assetFee).toString():f.toString()),n=p(s);return n.isNegative()?f:n}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=R.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=R.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=R.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=R.calculateLrnaSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString());return p(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}};import{encodeAddress as Pr}from"@polkadot/util-crypto";import{stringToU8a as br}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(),y=await this.getBalance(t,o.toString());return{id:o.toString(),hubReserves:p(c.toString()),shares:p(u.toString()),tradeable:h.bits.toNumber(),balance:y.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=O=>O===E?[E,Te]:[Te,O],[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),[y,P,T]=s===Te?[0,0,0]:this.getProtocolFee(e,o.toNumber(),l,u),S=h+y,A=g+T;return{assetFee:b.fromPermill(d),protocolFee:b.fromPermill(P),min:b.fromPermill(S),max:b.fromPermill(A)}}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=b.fromPermill(i.toNumber()),h=b.fromPermill(o.toNumber());if(r.isNone||s.isNone)return[i.toNumber(),i.toNumber(),o.toNumber()];let[d]=s.unwrap(),{assetFee:g,timestamp:y}=r.unwrap(),P=Math.max(1,t-y.toNumber()),T=d.volume.bIn.toString(),S=d.volume.bOut.toString(),A=d.liquidity.b.toString();n===E&&(T=d.volume.aIn.toString(),S=d.volume.aOut.toString(),A=d.liquidity.a.toString());let O=b.fromPermill(g.toNumber()),B=R.recalculateAssetFee(T,S,A,"9",a.toString(),b.toRaw(O).toString(),P.toString(),b.toRaw(u).toString(),b.toRaw(h).toString(),l.toString(),c.toString());return[i.toNumber(),Number(B)*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=b.fromPermill(i.toNumber()),h=b.fromPermill(o.toNumber());if(r.isNone||s.isNone)return[i.toNumber(),i.toNumber(),o.toNumber()];let[d]=s.unwrap(),{protocolFee:g,timestamp:y}=r.unwrap(),P=Math.max(1,t-y.toNumber()),T=d.volume.bIn.toString(),S=d.volume.bOut.toString(),A=d.liquidity.b.toString();n===E&&(T=d.volume.aIn.toString(),S=d.volume.aOut.toString(),A=d.liquidity.a.toString());let O=b.fromPermill(g.toNumber()),B=R.recalculateProtocolFee(T,S,A,"9",a.toString(),b.toRaw(O).toString(),P.toString(),b.toRaw(u).toString(),b.toRaw(h).toString(),l.toString(),c.toString());return[i.toNumber(),Number(B)*1e6,o.toNumber()]}getPoolId(){return Pr(br("modlomnipool".padEnd(32,"\0")),63)}getPoolLimits(){let e=this.api.consts.omnipool.maxInRatio.toNumber(),t=this.api.consts.omnipool.maxOutRatio.toNumber(),r=this.api.consts.omnipool.minimumTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};import{calculate_in_given_out as yr,calculate_out_given_in as fr,calculate_pool_trade_fee as Sr,get_spot_price as Tr,calculate_liquidity_in as wr,calculate_shares as Br,calculate_spot_price as xr,calculate_spot_price_with_fee as Or,calculate_liquidity_out_asset_a as Ir,calculate_liquidity_out_asset_b as Ar}from"@galacticcouncil/math-xyk";var X=class{static getSpotPrice(e,t,r){return Tr(e,t,r)}static calculateInGivenOut(e,t,r){return yr(e,t,r)}static calculateOutGivenIn(e,t,r){return fr(e,t,r)}static calculatePoolTradeFee(e,t,r){return Sr(e,t,r)}static calculateLiquidityIn(e,t,r){return wr(e,t,r)}static calculateSpotPrice(e,t){return xr(e,t)}static calculateSpotPriceWithFee(e,t,r,s){return Or(e,t,r,s)}static calculateShares(e,t,r){return Br(e,t,r)}static calculateLiquidityOutAssetA(e,t,r,s){return Ir(e,t,r,s)}static calculateLiquidityOutAssetB(e,t,r,s){return Ar(e,t,r,s)}};var _e=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=b.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=b.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=X.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?f:s}calculateOutGivenIn(e,t){let r=X.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=p(r);return s.isNegative()?f:s}spotPriceInGivenOut(e){let t=X.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),r=v(F,18-e.decimalsOut);return p(t).div(r)}spotPriceOutGivenIn(e){let t=X.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),r=v(F,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 ke=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(){let[e,t]=this.api.consts.xyk.getExchangeFee;return b.fromRate(e.toNumber(),t.toNumber())}getPoolLimits(){let e=this.api.consts.xyk.maxInRatio.toNumber(),t=this.api.consts.xyk.maxOutRatio.toNumber(),r=this.api.consts.xyk.minTradingLimit.toNumber();return{maxInRatio:e,maxOutRatio:t,minTradingLimit:r}}};import{calculate_in_given_out as vr,calculate_out_given_in as Rr,calculate_amplification as Nr,calculate_add_one_asset as Er,calculate_liquidity_out_one_asset as Fr,calculate_shares as _r,calculate_shares_for_amount as kr,calculate_spot_price_with_fee as Dr,pool_account_name as Cr,recalculate_peg as Lr}from"@galacticcouncil/math-stableswap";var k=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 vr(e,t,r,s,n,a,i)}static calculateAddOneAsset(e,t,r,s,n,a,i){return Er(e,t,r,s,n,a,i)}static calculateSharesForAmount(e,t,r,s,n,a,i){return kr(e,t,r,s,n,a,i)}static calculateOutGivenIn(e,t,r,s,n,a,i){return Rr(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 _r(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 recalculatePegs(e,t,r,s,n){let a=Lr(e,t,r,s,n);return JSON.parse(a)}};var De=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=n.minus(s),i=s===f?f:a.div(s).multipliedBy(100).decimalPlaces(4),o=[],l=R.isSellAllowed(e.tradeableIn),c=R.isBuyAllowed(e.tradeableOut);return(!l||!c)&&o.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&o.push("InsufficientTradingAmount"),{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(4),o=[],l=R.isSellAllowed(e.tradeableIn),c=R.isBuyAllowed(e.tradeableOut);return(!l||!c)&&o.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&o.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:s,amountOut:n,feePct:i.toNumber(),errors:o}}calculateIn(e,t,r){let s=k.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?b.toRaw(r.fee).toString():f.toString(),this.getPegs()),n=p(s);return n.isNegative()?f:n}calculateAddOneAsset(e,t,r){let s=k.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,r?b.toRaw(r.fee).toString():f.toString(),this.getPegs()),n=p(s);return n.isNegative()?f:n}calculateSharesForAmount(e,t,r){let s=k.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,r?b.toRaw(r.fee).toString():f.toString(),this.getPegs()),n=p(s);return n.isNegative()?f: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=k.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(F,e.decimalsIn-e.decimalsOut);return p(t).div(s)}let r=v(F,18-e.decimalsIn);return p(t).div(r)}calculateOut(e,t,r){let s=k.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?b.toRaw(r.fee).toString():f.toString(),this.getPegs()),n=p(s);return n.isNegative()?f:n}calculateWithdrawOneAsset(e,t,r){let s=k.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,r?b.toRaw(r.fee).toString():f.toString(),this.getPegs()),n=p(s);return n.isNegative()?f:n}calculateShares(e,t,r){let s=k.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,r?b.toRaw(r.fee).toString():f.toString(),this.getPegs()),n=p(s);return n.isNegative()?f: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=k.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(F,e.decimalsOut-e.decimalsIn);return p(t).div(s)}let r=v(F,18-e.decimalsOut);return p(t).div(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 qr}from"@polkadot/util-crypto";var Ce=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:[a]},i])=>{try{let o=i.unwrap(),l=a.toString(),c=this.getPoolAddress(l),[u,h,d]=await Promise.all([this.getPoolDelta(l,o,r.toString()),this.getPoolTokens(c,l,o),this.getPoolPegs(l,o,r.toString())]);return h.push({id:l,tradeable:15,balance:u.totalIssuance}),this.stablePools.set(c,o),{address:c,id:l,type:"Stableswap",fee:b.fromPermill(o.fee.toNumber()),tokens:h,...u,...d,...this.getPoolLimits()}}catch(o){return console.warn(`Skipping pool ${a.toString()}
|
|
2
|
+
`,String(o)),null}});return(await Promise.all(s)).filter(a=>a!==null)}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)]),i=e.tokens.map(o=>o.id===e.id?{...o,balance:n.totalIssuance}:o);Object.assign(e,{tokens:i},n,a)}})}async getPoolDelta(e,t,r){let{initialAmplification:s,finalAmplification:n,initialBlock:a,finalBlock:i}=t,o=k.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 a=>{let[i,o]=await Promise.all([this.api.query.stableswap.assetTradability(t,a.toString()),this.getBalance(e,a.toString())]);return{id:a.toString(),tradeable:i.bits.toNumber(),balance:o.toString()}});return Promise.all(n)}getPoolDefaultPegs(e){let t=e.fee,r=k.defaultPegs(e.assets.length);return{pegsFee:b.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=b.fromPermill(n.maxPegUpdate.toNumber()),l=b.fromPermill(t.fee.toNumber()),[c,u]=k.recalculatePegs(JSON.stringify(i),JSON.stringify(a),r,b.toRaw(o).toString(),b.toRaw(l).toString()),h=Number(c)*1e6;return{pegsFee:b.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(S=>Number(S)).sort((S,A)=>S-A),d=await this.api.query.emaOracle.oracles(l,h,c),[{price:g,updatedAt:y}]=d.unwrap(),P=g.n.toString(),T=g.d.toString();return u.toString()===h[0].toString()?[[P,T],y.toString()]:[[T,P],y.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{if(i.isValue)return[i.asValue.map(l=>l.toString()),r];throw Error(i.type+" is not supported")}});return Promise.all(a)}getPoolAddress(e){let t=Number(e),r=k.getPoolAddress(t);return qr(Mr(r),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:this.api.consts.stableswap.minTradingLimit.toNumber()}}};var ae=class extends D{api;evm;assetClient;aaveClient;xykClient;omniClient;lbpClient;stableClient;clients=[];onChainAssets=[];memRegistry=Ur(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 ve(this.api,t),this.xykClient=new ke(this.api,t),this.omniClient=new Fe(this.api,t),this.lbpClient=new Ne(this.api,t),this.stableClient=new Ce(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 oe=class extends ae{feeCache;disconnectSubscribeNewHeads=null;constructor(e,t){super(e,t),this.feeCache=new Gr(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!
|
|
3
|
+
Items: [${this.feeCache.length}]`),this.feeCache.release(),this.disconnectSubscribeNewHeads?.()}};var le=class{static get(e){switch(e.type){case"Aave":return Ae.fromPool(e);case"Xyk":return _e.fromPool(e);case"Omnipool":return Ee.fromPool(e);case"Lbp":return Re.fromPool(e);case"Stableswap":return De.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};var Le=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=6,ce=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 Le,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(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 ue=class{getProposals(e,t,r){let s=ze(r),n=Object.keys(s),a=n.map(c=>s[c]).flat(),i=new ce,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 me=class{routeSuggester;routerOptions;poolService;constructor(e,t={}){this.poolService=e,this.routeSuggester=new ue,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,le.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 sc(m,e){return m.minus(e).abs().div(m.plus(e).div(2)).multipliedBy(100).decimalPlaces(2)}function pe(m,e){return m.minus(e).div(e).multipliedBy(100).decimalPlaces(2)}function Pt(m,e){return F.minus(e.div(m)).multipliedBy(100).decimalPlaces(4)}function bt(m,e){return e.div(m).minus(F).multipliedBy(100).decimalPlaces(4)}function K(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 je=(t=>(t.Buy="Buy",t.Sell="Sell",t))(je||{}),Ze=(r=>(r.Dca="Dca",r.TwapSell="TwapSell",r.TwapBuy="TwapBuy",r))(Ze||{}),yt=(r=>(r.OrderTooSmall="OrderTooSmall",r.OrderTooBig="OrderTooBig",r.OrderImpactTooBig="OrderImpactTooBig",r))(yt||{});var de=class extends me{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?b.toPct(e.min):void 0,r=e.max?b.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 B=i.map(async N=>await this.toSellSwaps(r,N,a)),I=await Promise.all(B);o=this.findBestSellRoute(I)}let l=o[0],c=o[o.length-1],u=this.isDirectTrade(o),h=o.map(B=>B.spotPrice.shiftedBy(-1*B.assetOutDecimals)).reduce((B,I)=>B.multipliedBy(I)),d=v(h,c.assetOutDecimals),g=u?c.calculatedOut:this.calculateDelta0Y(l.amountIn,o,a),y=c.amountOut,P=u?c.tradeFeePct:Pt(g,y).toNumber(),T=g.minus(y),S=this.getRouteFeeRange(o),A=l.amountIn.shiftedBy(-1*l.assetInDecimals).multipliedBy(d),O=pe(g,A);return{type:"Sell",amountIn:l.amountIn,amountOut:c.amountOut,spotPrice:d,tradeFee:T,tradeFeePct:P,tradeFeeRange:S,priceImpactPct:O.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:S,priceImpactPct:O.toNumber(),swaps:o.map(B=>B.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),y=this.getPoolFeeRange(c),P=i.spotPriceOutGivenIn(o),T=l.shiftedBy(-1*o.decimalsIn).multipliedBy(P),S=pe(h,T);s.push({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:l,amountOut:u,calculatedOut:h,spotPrice:P,tradeFeePct:d,tradeFeeRange:y,priceImpactPct:S.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:y,priceImpactPct:S.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)).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=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 B=i.map(async N=>await this.toBuySwaps(r,N,a)),I=await Promise.all(B);o=this.findBestBuyRoute(I)}let l=o[o.length-1],c=o[0],u=this.isDirectTrade(o),h=o.map(B=>B.spotPrice.shiftedBy(-1*B.assetInDecimals)).reduce((B,I)=>B.multipliedBy(I)),d=v(h,c.assetInDecimals),g=u?c.calculatedIn:this.calculateDelta0X(l.amountOut,o,a),y=c.amountIn,P=u?c.tradeFeePct:bt(g,y).toNumber(),T=y.minus(g),S=this.getRouteFeeRange(o),A=l.amountOut.shiftedBy(-1*l.assetOutDecimals).multipliedBy(d),O;return g.isZero()?O=-100:O=pe(A,g).toNumber(),{type:"Buy",amountOut:l.amountOut,amountIn:c.amountIn,spotPrice:d,tradeFee:T,tradeFeePct:P,tradeFeeRange:S,priceImpactPct:O,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:S,priceImpactPct:O,swaps:o.map(B=>B.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),y=this.getPoolFeeRange(c),P=i.spotPriceInGivenOut(o),T=l.shiftedBy(-1*o.decimalsOut).multipliedBy(P),S;h.isZero()?S=-100:S=pe(T,h).toNumber(),s.unshift({...a,assetInDecimals:o.decimalsIn,assetOutDecimals:o.decimalsOut,amountIn:u,amountOut:l,calculatedIn:h,spotPrice:P,tradeFeePct:d,tradeFeeRange:y,priceImpactPct:S,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:y,priceImpactPct:S,errors:g}}})}return s}};var ft=6e3,St=p(1e15),ge=6,Qe=-5,Je=6*60*60*1e3;var Tt=6;var M=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 he=class{schedulerOptions;router;constructor(e,t={}){this.router=e,this.schedulerOptions=Object.freeze({blockTime:t.blockTime??ft,minBudgetInNative:t.minBudgetInNative??St})}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,y=Math.abs(c),P=this.getMinimumTradeCount(o,a),T=this.getOptimalTradeCount(y),S=n?Math.round(s/n):T,A=Math.ceil(s/P),O=Math.round(s/T),B=Math.round(s/S),I=o.dividedBy(S).decimalPlaces(0,1),N=await this.router.getBestSell(e,t,x(I,d)),q=o.isLessThan(a),be=[];q&&be.push("OrderTooSmall");let ye=N.amountOut.multipliedBy(S),Ue=this.toBlockPeriod(B),Ge=N.tradeFee.multipliedBy(S),We=M.build(l),fe={assetIn:e,assetOut:t,errors:be,frequencyMin:A,frequencyOpt:O,frequency:B,tradeCount:S,tradeFee:Ge,tradeImpactPct:N.priceImpactPct,tradePeriod:Ue,tradeRoute:We,type:"Dca"};return{...fe,amountIn:o,amountOut:ye,tradeAmountIn:N.amountIn,tradeAmountOut:N.amountOut,toHuman(){return{...fe,amountIn:x(o,d),amountOut:x(ye,g),tradeAmountIn:x(N.amountIn,d),tradeAmountOut:x(N.amountOut,g)}}}}async getMinimumOrderBudget(e){if(E===e)return this.minOrderBudget;let t=await this.router.getBestSpotPrice(E,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),y=a.dividedBy(g).decimalPlaces(0,1),P=await this.router.getBestSell(l.assetIn,c.assetOut,x(y,u)),T=g===1,S=a.isLessThan(s),A=P.priceImpactPct<Qe,O=[];S||T?O.push("OrderTooSmall"):A&&O.push("OrderImpactTooBig");let B=P.amountOut.multipliedBy(g),I=P.tradeFee.multipliedBy(g),N=M.build(i),q={assetIn:e,assetOut:t,errors:O,tradeCount:g,tradeImpactPct:P.priceImpactPct,tradePeriod:ge,tradeRoute:N,type:"TwapSell"};return{...q,amountIn:a,amountOut:B,tradeAmountIn:P.amountIn,tradeAmountOut:P.amountOut,tradeFee:I,toHuman(){return{...q,amountIn:x(a,u),amountOut:x(B,h),tradeAmountIn:x(P.amountIn,u),tradeAmountOut:x(P.amountOut,h),tradeFee:x(I,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),y=a.dividedBy(g).decimalPlaces(0,1),P=await this.router.getBestBuy(l.assetIn,c.assetOut,x(y,h)),T=P.amountIn.multipliedBy(g),S=g===1,A=T.isLessThan(s),O=P.priceImpactPct<Qe,B=[];A||S?B.push("OrderTooSmall"):O&&B.push("OrderImpactTooBig");let I=P.tradeFee.multipliedBy(g),N=M.build(i),q={assetIn:e,assetOut:t,errors:B,tradeCount:g,tradeImpactPct:P.priceImpactPct,tradePeriod:ge,tradeRoute:N,type:"TwapBuy"};return{...q,amountIn:T,amountOut:a,tradeAmountIn:P.amountIn,tradeAmountOut:P.amountOut,tradeFee:I,toHuman(){return{...q,amountIn:x(T,u),amountOut:x(a,h),tradeAmountIn:x(P.amountIn,u),tradeAmountOut:x(P.amountOut,h),tradeFee:x(I,u)}}}}getTwapTradeCount(e){let t=this.getOptimalTradeCount(e);if(this.getTwapExecutionTime(t)>Je){let s=Je/(this.blockTime*ge);return Math.round(s)}return t}getTwapExecutionTime(e){return e*ge*this.blockTime}toBlockPeriod(e){let t=e/this.blockTime,r=Math.round(t);return Math.max(r,Tt)}};var Q=class extends D{evm;evmClient;balanceClient;aaveUtils;constructor(e,t){super(e),this.evm=t,this.evmClient=t.getWsProvider(),this.balanceClient=new L(e),this.aaveUtils=new V(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(),J)}isDirectOmnipoolTrade(e){return e.length===1&&e[0].pool==="Omnipool"}};var Me=class extends Q{_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=K(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(),M.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=K(t,this.slippagePct),i=s.assetIn,o=n.assetOut,l=t.minus(a),c;if(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(),M.build(r)),s.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let h=this.dispatchWithExtraGas(c);return this.wrapTx("RouterSellAll",h,J)}return this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:e,swaps:t}=this.trade,r=t[0],s=t[t.length-1],n=K(e,this.slippagePct),a=r.assetIn,i=s.assetOut,o=e.minus(n),l=this.api.tx.router.sellAll(a,i,o.toFixed(),M.build(t));if(r.isWithdraw()&&await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let u=this.dispatchWithExtraGas(l);return this.wrapTx("RouterSellAll",u,J)}return this.wrapTx("RouterSellAll",l)}};var qe=class extends Q{_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=K(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=K(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 Pe=class{api;evm;constructor(e,t){this.api=e,this.evm=t}trade(e){return new Me(this.api,this.evm).setTrade(e)}order(e){return new qe(this.api,this.evm).setOrder(e)}};function Pu(m){let e=new ne(m),t=new Ie(m),r=new oe(m,t),s=new V(t),n=new de(r),a=new he(n,{blockTime:e.blockTime,minBudgetInNative:e.minOrderBudget});return{api:{aave:s,router:n,scheduler:a},client:{asset:new $(m),balance:new L(m),balanceV2:new se(m)},ctx:{pool:r},evm:t,tx:new Pe(m,t),destroy:()=>{r.destroy()}}}export{ee as AaveClient,Ae as AavePool,ve as AavePoolClient,V as AaveUtils,$ as AssetClient,lt as AssetNotFound,ts as BASILISK_PARACHAIN_ID,L as BalanceClient,se as BalanceClientV2,w as BigNumber,oe as CachingPoolService,ne as ChainParams,_t as DECIMAL_PLACES,G as ERC20,Ie as EvmClient,$e as FarmClient,z as H160,Te as HUB_ASSET_ID,rs as HYDRADX_PARACHAIN_ID,W as HYDRADX_SS58_PREFIX,ps as INFINITY,U as LbpMath,Re as LbpPool,Ne as LbpPoolClient,F as ONE,R as OmniMath,Ee as OmniPool,Fe as OmniPoolClient,Y as PERMILL_DENOMINATOR,D as PolkadotApiClient,ot as PoolConfigNotFound,Z as PoolError,le as PoolFactory,Oe as PoolNotFound,ae as PoolService,_ as PoolType,mt as ProviderConfigNotFound,te as RUNTIME_DECIMALS,j as RouteNotFound,me as Router,tt as SYSTEM_ASSET_DECIMALS,E as SYSTEM_ASSET_ID,k as StableMath,De as StableSwap,Ce as StableSwapClient,ct as StorageConfigNotFound,ut as SubscriptionNotSupported,re as TRADEABLE_DEFAULT,yt as TradeOrderError,Ze as TradeOrderType,M as TradeRouteBuilder,de as TradeRouter,he as TradeScheduler,je as TradeType,Pe as TxBuilderFactory,X as XykMath,_e as XykPool,ke as XykPoolClient,f as ZERO,Dn as bnFormatter,p as bnum,bt as calculateBuyFee,sc as calculateDiffToAvg,pe as calculateDiffToRef,Pt as calculateSellFee,pt as createChain,Pu as createSdkContext,ht as findNestedKey,kn as findNestedObj,K as getFraction,Nt as isEvmAccount,Et as isEvmAddress,Ft as isSs58Address,v as scale,ds as toBn,x as toDecimals};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ApiPromise } from '@polkadot/api';
|
|
2
|
+
import { PalletBalancesAccountData, OrmlTokensAccountData } from '@polkadot/types/lookup';
|
|
3
|
+
import { UnsubscribePromise } from '@polkadot/api-base/types';
|
|
4
|
+
import { PolkadotApiClient } from '../api';
|
|
5
|
+
import { Balance } from '../types';
|
|
6
|
+
export declare class BalanceClientV2 extends PolkadotApiClient {
|
|
7
|
+
constructor(api: ApiPromise);
|
|
8
|
+
getBalance(account: string, assetId: string): Promise<Balance>;
|
|
9
|
+
getAccountBalances(account: string): Promise<Array<Balance>>;
|
|
10
|
+
getSystemBalance(account: string): Promise<Balance>;
|
|
11
|
+
getTokenBalance(account: string, assetId: string): Promise<Balance>;
|
|
12
|
+
getErc20Balance(account: string, assetId: string): Promise<Balance>;
|
|
13
|
+
subscribeSystemBalance(address: string, onChange: (token: string, balance: Balance) => void): UnsubscribePromise;
|
|
14
|
+
subscribeTokenBalance(address: string, onChange: (balances: [string, Balance][]) => void, assets?: string[]): UnsubscribePromise;
|
|
15
|
+
subscribeErc20Balance(address: string, onChange: (balances: [string, Balance][]) => void, assets?: string[]): UnsubscribePromise;
|
|
16
|
+
getTokenBalanceData(account: string, assetId: string): Promise<OrmlTokensAccountData>;
|
|
17
|
+
protected calculateBalance(data: PalletBalancesAccountData | OrmlTokensAccountData, assetId: string): Balance;
|
|
18
|
+
}
|
package/build/types/factory.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ApiPromise } from '@polkadot/api';
|
|
2
2
|
import { AaveUtils } from './aave';
|
|
3
|
-
import { AssetClient, BalanceClient } from './client';
|
|
3
|
+
import { AssetClient, BalanceClient, BalanceClientV2 } from './client';
|
|
4
4
|
import { EvmClient } from './evm';
|
|
5
5
|
import { PoolService } from './pool';
|
|
6
6
|
import { TradeRouter, TradeScheduler } from './sor';
|
|
@@ -14,6 +14,7 @@ export type SdkCtx = {
|
|
|
14
14
|
client: {
|
|
15
15
|
asset: AssetClient;
|
|
16
16
|
balance: BalanceClient;
|
|
17
|
+
balanceV2: BalanceClientV2;
|
|
17
18
|
};
|
|
18
19
|
ctx: {
|
|
19
20
|
pool: PoolService;
|
package/build/types/types.d.ts
CHANGED
|
@@ -29,3 +29,11 @@ export interface ExternalAsset extends AssetMetadata {
|
|
|
29
29
|
internalId: string;
|
|
30
30
|
isWhiteListed?: boolean;
|
|
31
31
|
}
|
|
32
|
+
export interface Balance {
|
|
33
|
+
freeBalance: string;
|
|
34
|
+
total: string;
|
|
35
|
+
transferable: string;
|
|
36
|
+
reservedBalance: string;
|
|
37
|
+
frozenBalance: string;
|
|
38
|
+
assetId: string;
|
|
39
|
+
}
|
package/package.json
CHANGED