@galacticcouncil/sdk 9.17.1 → 10.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.cjs +2 -2
- package/build/index.mjs +2 -2
- package/build/types/aave/AaveClient.d.ts +1 -1
- package/build/types/evm/adapter.d.ts +11 -0
- package/build/types/evm/client.d.ts +4 -1
- package/build/types/evm/index.d.ts +1 -0
- package/build/types/gho/GhoTokenClient.d.ts +1 -1
- package/build/types/oracle/MmOracleClient.d.ts +2 -2
- package/package.json +17 -17
package/build/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var Te=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"to",type:"address"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"interestRateMode",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"address",name:"onBehalfOf",type:"address"}],name:"borrow",outputs:[],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getUserAccountData",outputs:[{internalType:"uint256",name:"totalCollateralBase",type:"uint256"},{internalType:"uint256",name:"totalDebtBase",type:"uint256"},{internalType:"uint256",name:"availableBorrowsBase",type:"uint256"},{internalType:"uint256",name:"currentLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"ltv",type:"uint256"},{internalType:"uint256",name:"healthFactor",type:"uint256"}],stateMutability:"view",type:"function"}];var Qe=[{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 ot="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",je="0x112b087b60C1a166130d59266363C45F8aa99db0",ze="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",ee=1000000n;var Ss=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var te=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:Qe,address:je,args:[ze],functionName:"getReservesData"})}async getUserReservesData(e){return await this.client.readContract({abi:Qe,address:je,args:[ze,e],functionName:"getUserReservesData"})}async getUserAccountData(e){return await this.client.readContract({abi:Te,address:ot,args:[e],functionName:"getUserAccountData"})}};import{decodeAddress as Oe,encodeAddress as ut}from"@polkadot/util-crypto";import{hexToU8a as Lt,isHex as Ht,u8aToHex as Gt}from"@polkadot/util";import{Buffer as Y}from"buffer";var ws=2090,V=1e6,lt=1e9,we="1",Os=2034,L=63,re=18,R="0",ct=12,se=15;var Je="ETH\0";function Ut(p){if(!p)return!1;try{let e=Oe(p,!0),t=Y.from(Je);return Y.from(e.subarray(0,t.length)).equals(t)}catch{return!1}}function qt(p){return!!/^0x[a-fA-F0-9]{40}$/.test(p)}function Wt(p){try{let e=Ht(p)?Lt(p):Oe(p);return ut(e),!0}catch{return!1}}var W=class p{static toAccount=e=>{let t=Y.from(e.slice(2),"hex"),r=Y.from(Je);return ut(new Uint8Array(Y.concat([r,t,Y.alloc(8)])),63)};static fromAccount=e=>{let t=Oe(e),r=Y.from(Je),s=t.slice(r.length,-8);return"0x"+Y.from(s).toString("hex")};static fromSS58=e=>{let r=Oe(e).slice(0,20);return Gt(r)};static fromAny=e=>{if(qt(e))return e;if(Ut(e))return p.fromAccount(e);if(Wt(e))return p.fromSS58(e);throw new Error("Unknown address type")}};import{Buffer as Ie}from"buffer";var X=class{static fromAssetId(e){let t=Number(e),r=Ie.alloc(20,0);return r[15]=1,r.writeUInt32BE(t,16),"0x"+r.toString("hex")}static toAssetId(e){let t=Ie.from(e.replace("0x",""),"hex");return t.length!==20||!this.isAssetAddress(e)?null:t.readUInt32BE(16)}static isAssetAddress(e){let t=Ie.from("0000000000000000000000000000000100000000","hex"),r=Ie.from(e.replace("0x",""),"hex");return r.length!==20?!1:r.subarray(0,16).equals(t.subarray(0,16))}};import{BigNumber as v}from"bignumber.js";var Xt=12;v.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:Xt});var B=m(0),N=m(1),Ds=m("Infinity");function A(p,e){let t=new v(e.toString()),r=new v(10).pow(t);return p.times(r).decimalPlaces(4)}function m(p){return new v(p.toString())}function Ms(p,e){let t=m(p);return A(t,e)}function O(p,e){return p.shiftedBy(-1*e).toString()}var Ae=m("1e27"),Yt=m("1.01"),Kt=m("31536000"),$=class{client;constructor(e){this.client=new te(e)}async getSummary(e){let t=W.fromAny(e),[r,s,i,o]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(t),this.client.getUserAccountData(t),this.client.getBlockTimestamp()]),[a]=r,[n,l]=s,[c,u,d,h,g,b]=i,y=m(b).dividedBy(1e18).decimalPlaces(6,v.ROUND_DOWN),S=m(c),f=m(u),x=[];for(let I of n){let T=I.underlyingAsset.toLowerCase(),w=a.find(({underlyingAsset:Mt})=>Mt.toLowerCase()===T);if(!w)throw new Error("Missing pool reserve for "+T);let C=m(I.scaledATokenBalance),M=m(w.liquidityIndex),Be=m(w.liquidityRate),xe=m(w.availableLiquidity),Ke=m(w.priceInMarketReferenceCurrency),Ve=o+6,$e=this.calculateLinearInterest(Be,w.lastUpdateTimestamp,Ve),ve=M.multipliedBy($e).dividedBy(Ae).decimalPlaces(0,v.ROUND_DOWN),Ct=C.multipliedBy(ve).dividedBy(Ae).decimalPlaces(0,v.ROUND_DOWN),kt=m(l!==0&&l===w.eModeCategoryId?w.eModeLiquidationThreshold:w.reserveLiquidationThreshold).div(1e4),_t=w.usageAsCollateralEnabled&&I.usageAsCollateralEnabledOnUser&&m(I.scaledATokenBalance).gt(0),Dt=X.toAssetId(T);x.push({aTokenBalance:Ct,availableLiquidity:xe,decimals:Number(w.decimals),isCollateral:_t,priceInRef:Ke,reserveId:Dt,reserveAsset:T,reserveLiquidationThreshold:kt})}return{healthFactor:y.toNumber(),totalCollateral:S,totalDebt:f,reserves:x}}async hasBorrowPositions(e){let t=W.fromAny(e),r=await this.client.getUserAccountData(t),[s,i]=r;return i>0n}async getHealthFactor(e){let t=W.fromAny(e),r=await this.client.getUserAccountData(t),[s,i,o,a,n,l]=r;return m(l).dividedBy(1e18).decimalPlaces(6,v.ROUND_DOWN).toNumber()}async getHealthFactorAfterWithdraw(e,t,r){let{totalCollateral:s,totalDebt:i,reserves:o}=await this.getSummary(e),a=X.fromAssetId(t),n=o.find(S=>S.reserveAsset===a);if(!n)throw new Error("Missing reserve ctx for "+a);let{decimals:l,isCollateral:c,priceInRef:u,reserveLiquidationThreshold:d}=n,h=A(m(r),l).decimalPlaces(0,1),g=c?h.multipliedBy(u).dividedBy(m(10).pow(l)).decimalPlaces(0,v.ROUND_DOWN):B,b=s.minus(g);return b.lte(0)?0:b.multipliedBy(d).dividedBy(i).decimalPlaces(6,v.ROUND_DOWN).toNumber()}async getHealthFactorAfterSupply(e,t,r){let{totalCollateral:s,totalDebt:i,reserves:o}=await this.getSummary(e),a=X.fromAssetId(t),n=o.find(y=>y.reserveAsset===a);if(!n)throw new Error("Missing reserve ctx for "+a);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:u}=n,h=A(m(r),l).decimalPlaces(0,1).multipliedBy(c).dividedBy(m(10).pow(l)).decimalPlaces(0,v.ROUND_DOWN),g=s.plus(h);return g.lte(0)?0:g.multipliedBy(u).dividedBy(i).decimalPlaces(6,v.ROUND_DOWN).toNumber()}async getMaxWithdraw(e,t){let{totalDebt:r,reserves:s,healthFactor:i}=await this.getSummary(e),o=X.fromAssetId(t),a=s.find(n=>n.reserveAsset===o);if(!a)throw new Error("Missing reserve data for "+o);return this.calculateWithdrawMax(a,r,i)}async getMaxWithdrawAll(e){let{totalDebt:t,reserves:r,healthFactor:s}=await this.getSummary(e),i={};for(let o of r){let a=this.calculateWithdrawMax(o,t,s);o.reserveId&&(i[o.reserveId]=a)}return i}calculateWithdrawMax(e,t,r){let{aTokenBalance:s,availableLiquidity:i,decimals:o,priceInRef:a,reserveLiquidationThreshold:n,isCollateral:l}=e,c=s;if(l&&t.gt(0)){let d=m(r).minus(Yt);if(d.gt(0)){let g=d.multipliedBy(t).dividedBy(n).decimalPlaces(0,v.ROUND_DOWN).dividedBy(a).multipliedBy(m(10).pow(o)).decimalPlaces(0,v.ROUND_DOWN);c=v.minimum(s,g)}else c=B}return{amount:v.minimum(c,i),decimals:o}}calculateLinearInterest(e,t,r){let s=r-t;return s<=0?Ae:e.multipliedBy(s).dividedBy(Kt).plus(Ae).decimalPlaces(0,v.ROUND_DOWN)}};function mt(p){switch(p){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 _=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");mt(r)&&console.log(e,...t)}};var Q=class extends _{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=="0"){let u=this.api.consts.balances.existentialDeposit;return{id:"0",name:this.getSystemTokenName(this.chainToken),symbol:this.chainToken,decimals:this.chainDecimals,icon:this.chainToken,type:"Token",isSufficient:!0,existentialDeposit:u.toString()}}let{name:i,assetType:o,isSufficient:a,existentialDeposit:n}=t,{symbol:l,decimals:c}=r.get(e)??{};return{id:e,name:i.toHuman(),symbol:l,decimals:c,icon:l,type:o.toHuman(),isSufficient:a?a.toHuman():!0,location:s?.toJSON(),existentialDeposit:n.toString()}}getBond(e,t,r,s){let[i,o]=s,{assetType:a,isSufficient:n,existentialDeposit:l}=t,{symbol:c,decimals:u}=this.getToken(i.toString(),t,r),d=o.toNumber(),h=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",h.format(d)].join(" ");return{id:e,name:g,symbol:c+"b",decimals:u,icon:c,type:a.toString(),isSufficient:n.toHuman(),existentialDeposit:l.toString(),underlyingAssetId:i.toString(),maturity:d}}getShares(e,t,r,s){let{assets:i}=s,{name:o,symbol:a,assetType:n,isSufficient:l,existentialDeposit:c}=t,d=i.map(b=>b.toString()).map(b=>{let{symbol:y}=this.getToken(b,t,r);return[b,y]}),h=Object.fromEntries(d),g=Object.values(h);return{id:e,name:g.join(", "),symbol:a?.isSome?a.toHuman():o.toHuman(),decimals:18,icon:g.join("/"),type:n.toString(),isSufficient:l.toHuman(),existentialDeposit:c.toString(),meta:h}}getExternal(e,t,r,s){let i=this.getToken(e,t,new Map,s),o=r?.find(a=>a.internalId===i.id);return o?{...i,decimals:o.decimals,name:o.name,symbol:o.symbol,icon:o.symbol,isWhiteListed:o.isWhiteListed}:i}normalizeMetadata(e,t){return t.size?t:new Map(e.map(([{args:[r]},s])=>{let{decimals:i,symbol:o}=s.unwrap();return[r.toString(),{decimals:Number(i.toString()),symbol:o.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,o,a]=await Promise.all([this.api.query.assetRegistry.assets.entries(),this.locationsQuery(),this.safeSharesQuery(),this.safeBondsQuery(),this.metadataQuery()]),n=this.getSupportedAssets(r),l=this.normalizeMetadata(n,a),c=n.map(([{args:[u]},d])=>{let h=d.unwrap(),g=s.get(u.toString()),{assetType:b}=h;switch(b.toString()){case"Bond":let y=o.get(u.toString());return this.getBond(u.toString(),h,l,y);case"StableSwap":let S=i.get(u.toString());return this.getShares(u.toString(),h,l,S);case"External":return this.getExternal(u.toString(),h,t,g);default:return this.getToken(u.toString(),h,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 H=class extends _{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==="0"?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("0",this.calculateFreeBalance(r)))}async subscribeSystemBalances(e,t){return this.api.query.system.account.multi(e,r=>{let s=[];r.forEach((i,o)=>{let a=this.calculateFreeBalance(i.data),n=e[o];s.push([n,a])}),t(s)})}async subscribeTokenBalance(e,t,r){let s=await this.api.query.tokens.accounts.keys(e),i=r?r.map(o=>[e,o]):s.map(({args:[o,a]})=>[o.toString(),a.toString()]);return this.api.query.tokens.accounts.multi(i,o=>{let a=[];o.forEach((n,l)=>{let c=this.calculateFreeBalance(n),u=i[l][1];a.push([u,c])}),t(a)})}async subscribeTokenBalances(e,t){return this.api.query.tokens.accounts.multi(e,r=>{let s=[];r.forEach((i,o)=>{let a=this.calculateFreeBalance(i),n=e[o];s.push([n,a])}),t(s)})}async subscribeErc20Balance(e,t,r){let i=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([n,l])=>{let{assetType:c}=l.unwrap();return c.toString()==="Erc20"}).map(([{args:[n]}])=>n.toString()))(),o=async()=>{let a=await Promise.all(i.map(async n=>[n,await this.getErc20Balance(e,n)]));t(a)};return this.api.rpc.chain.subscribeNewHeads(async()=>{o()})}async subscribeErc20Balances(e,t){let r=async()=>{let s=await Promise.all(e.map(async i=>{let[o,a]=i;return[i,await this.getErc20Balance(o,a)]}));t(s)};return this.api.rpc.chain.subscribeNewHeads(async()=>{r()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateFreeBalance(e){let t=e.free.toString(),r=e.frozen.toString();return v(t).lt(r)?v(0):v(t).minus(r)}};var ie=class extends _{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==="0"?this.getSystemBalance(e):this.getTokenBalance(e,t)}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)}async getErc20Balance(e,t){let r=await this.getTokenBalanceData(e,t);return this.calculateBalance(r)}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t("0",this.calculateBalance(r)))}async subscribeTokenBalance(e,t,r){let s=await this.api.query.tokens.accounts.keys(e),i=r?r.map(o=>[e,o]):s.map(({args:[o,a]})=>[o.toString(),a.toString()]);return this.api.query.tokens.accounts.multi(i,o=>{let a=[];o.forEach((n,l)=>{let c=i[l][1],u=this.calculateBalance(n);a.push([c,u])}),t(a)})}async subscribeErc20Balance(e,t,r){let i=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([n,l])=>{let{assetType:c}=l.unwrap();return c.toString()==="Erc20"}).map(([{args:[n]}])=>n.toString()))(),o=async()=>{let a=await Promise.all(i.map(async n=>[n,await this.getErc20Balance(e,n)]));t(a)};return this.api.rpc.chain.subscribeNewHeads(async()=>{o()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateBalance(e){let t=v(e.free.toString()),r=e.frozen.toString(),s=e.reserved.toString(),i=t.gte(r)?t.minus(r).toString():"0",o=t.plus(s).toString();return{free:t.toString(),total:o,transferable:i,reserved:s,frozen:r}}};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()),m(this._minOrderBudget)}};import{fixed_from_rational as pt}from"@galacticcouncil/math-liquidity-mining";import{GenericAccountId32 as Vt}from"@polkadot/types";import{u8aConcat as dt}from"@polkadot/util";import{isAddress as gt}from"@polkadot/util-crypto";var Ze=class extends _{balanceClient;constructor(e){super(e),this.balanceClient=new H(e)}secondsInYear=new v(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[,o]=s.args,a=i.unwrap().toString(),n=o.toString(),l=(await this.api.query.omnipoolWarehouseLM.globalFarm(n)).unwrap(),c=(await this.api.query.omnipoolWarehouseLM.yieldFarm(e,n,a)).unwrap(),u=await this.getOraclePrice(l)??l.priceAdjustment.toString(),h=this.getAccountResolver(this.api.registry)(Number(n),!1).toString(),g=l.rewardCurrency.toString(),b=await this.balanceClient.getTokenBalanceData(h,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:u,potBalance:b.free.toString()}}))}async getIsolatedPoolFarms(e){let t=await this.api.query.xykWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,i])=>{let[,o]=s.args,a=i.unwrap().toString(),n=o.toString(),l=(await this.api.query.xykWarehouseLM.globalFarm(n)).unwrap(),c=(await this.api.query.xykWarehouseLM.yieldFarm(e,n,a)).unwrap(),u=await this.getOraclePrice(l)??l.priceAdjustment.toString(),h=this.getAccountResolver(this.api.registry)(Number(n),!0).toString(),g=l.rewardCurrency.toString(),b=await this.balanceClient.getTokenBalanceData(h,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:u,potBalance:b.free.toString()}}))}async getOraclePrice(e){let t=e.rewardCurrency.toString(),r=e.incentivizedAsset.toString(),s=[t,r].sort();if(t===r)return new v(1).shiftedBy(18).toString();let i=await this.api.query.emaOracle.oracles("omnipool",s,"TenMinutes");if(i.isNone)return;let[o]=i.unwrap(),a=o.price.n.toString(),n=o.price.d.toString(),l;return Number(t)<Number(r)?l=pt(a,n):l=pt(n,a),l}getGlobalRewardPerPeriod(e,t,r,s){let o=e.times(t).shiftedBy(-18).times(s).shiftedBy(-18);return o.gte(r)?r:o}getPoolYieldPerPeriod(e,t,r,s){return e.times(t).div(r.times(s).shiftedBy(-18))}padEndU8a(e,t){return dt(e,Array(Math.max(0,t-e.length)).fill(0))}getAccountResolver=e=>(t,r)=>{let s="modl",i=r?"0x78796b4c4d704944":"0x4f6d6e6957684c4d";return new Vt(e,this.padEndU8a(dt(s,i,typeof t!="number"?t.toU8a():[t]),32))};async getFarmApr(e,t){if(t==="isolatedpool"&&!gt(e))throw new Error("You must pass an address of isolated pool as id");if(t==="omnipool"&>(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:n,priceAdjustment:l,potBalance:c})=>{let u=new v(n.totalSharesZ.toString()),d=n.plannedYieldingPeriods.toString(),h=new v(n.yieldPerPeriod.toString()),g=new v(n.maxRewardPerPeriod.toString()),b=n.blocksPerPeriod.toString(),y=new v(a.multiplier.toString()).shiftedBy(-18),S=this.secondsInYear.div(new v(r).times(b)),f;if(u.isZero())f=h.times(y).times(S);else{let C=this.getGlobalRewardPerPeriod(u,h,g,l);f=this.getPoolYieldPerPeriod(C,y,u,l).times(S)}let x=new v(n.pendingRewards.toString()).plus(n.accumulatedPaidRewards.toString()),I=g.times(d),T=c?x.plus(c):I;return x.div(T).gte(.999)?B:f.div(t==="isolatedpool"?2:1).times(100)}).reduce((a,n)=>a.plus(n),B).toString():void 0}};var Fe=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},ht=class extends Error{constructor(e,t){super(),this.message=`${e} pool missing ${t}`,this.name="PoolConfigNotFound"}},Ne=class extends Error{constructor(e,t){super(),this.message=`Route from ${e} to ${t} not found in pool configuration`,this.name="RouteNotFound"}},yt=class extends Error{constructor(e){super(),this.message=`Asset ${e} not available in current network`,this.name="AssetNotFound"}},bt=class extends Error{constructor(e){super(),this.message=`Storage missing ${e}`,this.name="StorageConfigNotFound"}},Pt=class extends Error{constructor(e){super(),this.message=`Subscription type "${e}" not supported`,this.name="SubscriptionNotSupported"}},ft=class extends Error{constructor(e){super(),this.message=`${e}`,this.name="ProviderConfigNotFound"}};import{defineChain as $t}from"viem";var Qt=["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"],St=p=>{let t=[p.endpoint,...Qt],r=Array.from(new Set(t.map(s=>s.replace("wss://","https://").replace("ws://","http://"))));return $t({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:r}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1})};import{createPublicClient as xt,createWalletClient as jt,custom as zt,http as Jt}from"viem";function Bt(p){let e=async({method:t,params:r})=>{let s=Array.isArray(r)?r:[];return p.send(t,s)};return()=>({request:e,config:{name:"PolkadotWsTransport",type:"webSocket",key:"polkadotWs",request:e}})}var Re=class{wsProvider;chain;constructor(e){let{provider:t}=e._options;this.wsProvider=t,this.chain=St(t)}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return xt({chain:this.chain,transport:Jt()})}getWsProvider(){return xt({chain:this.chain,transport:Bt(this.wsProvider)})}getSigner(e){return jt({account:e,chain:this.chain,transport:zt(window.ethereum)})}};var et=[{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:et,address:e,functionName:"latestRoundData"}),this.client.readContract({abi:et,address:e,functionName:"decimals"}),this.client.getBlock()]),[o,a,n,l]=r,c=i.number-(i.timestamp-l)/BigInt(t),u=Number(c);return{price:a,decimals:s,updatedAt:u<0?0:u}}};import{memoize1 as ls}from"@thi.ng/memoize";var E=(o=>(o.Aave="Aave",o.LBP="Lbp",o.Omni="Omnipool",o.Stable="Stableswap",o.XYK="Xyk",o.HSM="Hsm",o))(E||{}),j=(c=>(c.UnknownError="UnknownError",c.FacilitatorCapacityExceeded="FacilitatorCapacityExceeded",c.InsufficientTradingAmount="InsufficientTradingAmount",c.InsufficientCollateral="InsufficientCollateral",c.MaxHoldingExceeded="MaxHoldingExceeded",c.MaxInRatioExceeded="MaxInRatioExceeded",c.MaxOutRatioExceeded="MaxOutRatioExceeded",c.TradeNotAllowed="TradeNotAllowed",c.MaxBuyBackExceeded="MaxBuyBackExceeded",c.MaxBuyPriceExceeded="MaxBuyPriceExceeded",c))(j||{});var Ee=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new p(e)}constructor(e){this.type="Aave",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(n=>[n.id,n])),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 o=m(s.balance),a=m(i.balance);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:o,balanceOut:a,assetInED:B,assetOutED:B}}validateAndBuy(e,t){let r=this.calculateInGivenOut(e,t),s=[];return t.isGreaterThan(e.balanceOut)&&s.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:t,feePct:0,errors:s}}validateAndSell(e,t){let r=this.calculateOutGivenIn(e,t),s=[];return r.isGreaterThan(e.balanceOut)&&s.push("TradeNotAllowed"),{amountIn:t,calculatedOut:r,amountOut:r,feePct:0,errors:s}}calculateInGivenOut(e,t){return t}calculateOutGivenIn(e,t){return t}spotPriceInGivenOut(e){return A(N,e.decimalsOut)}spotPriceOutGivenIn(e){return A(N,e.decimalsIn)}calculateTradeFee(e,t){return B}};import{encodeAddress as tr}from"@polkadot/util-crypto";import{stringToU8a as rr}from"@polkadot/util";import{decodeEventLog as sr}from"viem";import{memoize1 as Zt}from"@thi.ng/memoize";import{TLRUCache as er}from"@thi.ng/cache";var D=class extends H{evm;mmOracle;pools=[];subs=[];assets=new Map([]);mem=0;onNewBlockHandler;onEventsHandler;memPoolsCache=new er(null,{maxlen:1,ttl:3600*1e3,release:e=>{this.mem>e&&this.log(this.getPoolType(),`mem ${e} released at`,new Date)}});memPools=Zt(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),this.onNewBlockHandler=this.onNewBlock.bind(this),this.onEventsHandler=this.onEvents.bind(this)}onNewBlock(e){}onEvents(e){}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 this.memPools(this.mem)}async getPools(){this.unsubscribe(),this.pools=await this.loadPools();let e=this.subscribeBalances(),t=this.subscribeUpdates();this.subs.push(e),this.subs.push(t);let r=this.getPoolType();return this.log(r,`mem ${this.mem} pools(${this.augmentedPools.length})`),this.log(r,`mem ${this.mem} subs(${this.subs.length})`),this.augmentedPools}async subscribeBalances(){let e=[],t=[],r=[],s=[];for(let a of this.augmentedPools){let{address:n,tokens:l}=a;l.filter(c=>c.id==="0").forEach(()=>{e.push(n)}),l.filter(c=>["Token","StableSwap"].includes(c.type)&&c.id!=="0"&&c.id!==a.id).forEach(c=>{t.push([n,c.id])}),l.filter(c=>c.type==="Erc20").forEach(c=>{r.push([n,c.id])})}let i=a=>{a.forEach(([n,l])=>{let c=this.pools.find(u=>u.address===n);if(c){let u=c.tokens.findIndex(d=>d.id==="0");c.tokens[u].balance=l.toString()}})},o=a=>{a.forEach(([n,l])=>{let[c,u]=n,d=this.pools.find(h=>h.address===c);if(d){let h=d.tokens.findIndex(g=>g.id===u);d.tokens[h].balance=l.toString()}})};if(e.length>0){let a=await this.subscribeSystemBalances(e,i);s.push(a)}if(t.length>0){let a=await this.subscribeTokenBalances(t,o);s.push(a)}if(r.length>0){let a=await this.subscribeErc20Balances(r,o);s.push(a)}return()=>{for(let a of s)try{a()}catch(n){console.warn("Balance unsub failed",n)}}}unsubscribe(){this.subs.forEach(e=>{e.then(t=>t()).catch(t=>console.warn("Unsub failed",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}};function Ce(p,e){let t=[];return JSON.stringify(p,(r,s)=>(s&&s[e]&&t.push(s),s)),t[0]}function Bn(p,e,t){let r;return JSON.stringify(p,(s,i)=>(i&&i[e]===t&&(r=i),i)),r}var xn=(p,e)=>typeof e=="bigint"?e.toString():e;var ir=["Supply","Withdraw","Repay","Borrow"],ke=class extends D{getPoolType(){return"Aave"}getPoolId(e,t){let r="aave:"+e+"/"+t;return tr(rr(r.padEnd(32,"\0")),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:0}}getReserveH160Id(e){return e.type==="Erc20"?Ce(e.location,"accountKey20").accountKey20.key:X.fromAssetId(e.id)}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,r){return{}}onEvents(e){e.forEach(t=>{let{event:r}=t,s=`${r.section}:${r.method}`;if(s==="router:Executed"){let[i,o]=r.data.toJSON();this.pools.filter(a=>a.tokens.some(n=>n.id===i.toString()||n.id===o.toString())).forEach(a=>{this.log(`Sync AAVE via [router:Executed] :: ${i}:${o}`),this.updatePoolState(a)})}if(s==="evm:Log"){let[i]=r.data.toJSON();try{let{eventName:o,args:a}=sr({abi:Te,topics:i.topics,data:i.data});if(ir.includes(o)){let n=a.reserve.toLowerCase();this.pools.filter(l=>{let[c]=l.tokens;return this.getReserveH160Id(c).toLowerCase()===n}).forEach(l=>{this.log(`Sync AAVE via [evm:Log] :: ${o} ${n}`),this.updatePoolState(l)})}}catch{}}})}async subscribeBalances(){return()=>{}}async subscribeUpdates(){return()=>{}}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(o=>{let a=o.id===t.id?s.toString():i.toString();return{...o,balance:a}})}};import{calculate_in_given_out as nr,calculate_out_given_in as ar,calculate_linear_weights as or,calculate_pool_trade_fee as lr,get_spot_price as cr}from"@galacticcouncil/math-lbp";var U=class{static getSpotPrice(e,t,r,s,i){return cr(e,t,r,s,i)}static calculateInGivenOut(e,t,r,s,i){return nr(e,t,r,s,i)}static calculateOutGivenIn(e,t,r,s,i){return ar(e,t,r,s,i)}static calculateLinearWeights(e,t,r,s,i){return or(e,t,r,s,i)}static calculatePoolTradeFee(e,t,r){return lr(e,t,r)}};var P=class p{static toPct(e){let[t,r]=e;return p.safeDivide(t*100,r)}static toRaw(e){let[t,r]=e;return p.safeDivide(t,r)}static fromPermill(e){return[e,1e6]}static fromPerbill(e){return[e,1e9]}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 _e=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(e){return new p(e)}constructor(e){this.type="Lbp",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.fee=e.fee,this.repayFeeApply=e.repayFeeApply}validatePair(e,t){return!0}parsePair(e,t){let r=new Map(this.tokens.map(n=>[n.id,n])),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 o=m(s.balance),a=m(i.balance);return{assetIn:e,assetOut:t,balanceIn:o,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 o=e.balanceOut.div(this.maxOutRatio);if(t.isGreaterThan(o)&&i.push("MaxOutRatioExceeded"),s===e.assetOut){let a=this.calculateTradeFee(t,r),n=P.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),l=t.plus(a),c=this.calculateInGivenOut(e,l),u=e.balanceIn.div(this.maxInRatio);return c.isGreaterThan(u)&&i.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:t,feePct:n,errors:i}}else{let a=this.calculateInGivenOut(e,t),n=e.balanceIn.div(this.maxInRatio);return a.isGreaterThan(n)&&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 o=e.balanceIn.div(this.maxInRatio);if(t.isGreaterThan(o)&&i.push("MaxInRatioExceeded"),s===e.assetIn){let a=this.calculateOutGivenIn(e,t),n=e.balanceOut.div(this.maxOutRatio);return a.isGreaterThan(n)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:a,amountOut:a,feePct:0,errors:i}}else{let a=this.calculateOutGivenIn(e,t),n=this.calculateTradeFee(a,r),l=P.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),c=a.minus(n),u=e.balanceOut.div(this.maxOutRatio);return c.isGreaterThan(u)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:a,amountOut:c,feePct:l,errors:i}}}calculateInGivenOut(e,t){let r=U.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=m(r);return s.isNegative()?B:s}calculateOutGivenIn(e,t){let r=U.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=m(r);return s.isNegative()?B:s}spotPriceInGivenOut(e){let t=U.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),A(N,e.decimalsOut).toString());return m(t)}spotPriceOutGivenIn(e){let t=U.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),A(N,e.decimalsIn).toString());return m(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 m(r)}};var De=class extends D{MAX_FINAL_WEIGHT=A(m(100),6);poolsData=new Map([]);getPoolType(){return"Lbp"}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}}async getPoolDelta(e,t,r){let{start:s,end:i,assets:o,initialWeight:a,finalWeight:n,repayTarget:l,feeCollector:c}=t,u=U.calculateLinearWeights(s.toString(),i.toString(),a.toString(),n.toString(),r),[d,h]=o,g=d.toString(),b=m(u),y=h.toString(),S=this.MAX_FINAL_WEIGHT.minus(m(b)),[f,x,I]=await Promise.all([this.isRepayFeeApplied(g,l.toString(),c.toString()),this.getBalance(e,g),this.getBalance(e,y)]);return{repayFeeApply:f,tokens:[{id:g,weight:b,balance:x.toString()},{id:y,weight:S,balance:I.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>=r&&t<s}async isRepayFeeApplied(e,t,r){let s=m(t);if(s.isZero())return!1;try{return(await this.getBalance(e,r)).isLessThan(s)}catch{return!0}}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,o])=>this.isActivePool(o.unwrap(),r.toNumber())).map(async([{args:[i]},o])=>{let a=o.unwrap(),n=i.toString(),l=await this.getPoolDelta(n,a,r.toString());this.poolsData.set(i.toString(),a);let[c,u]=a.fee;return{address:n,type:"Lbp",fee:P.fromRate(c.toNumber(),u.toNumber()),...l,...this.getPoolLimits()}});return Promise.all(s)}async getPoolFees(e,t,r){let s=this.pools.find(i=>i.address===r);return{repayFee:this.getRepayFee(),exchangeFee:s.fee}}getRepayFee(){let[e,t]=this.api.consts.lbp.repayFee;return P.fromRate(e.toNumber(),t.toNumber())}async subscribeUpdates(){return this.api.query.parachainSystem.validationData(async e=>{let{relayParentNumber:t}=e.unwrap();this.pools.forEach(async r=>{let s=this.poolsData.get(r.address);if(s)if(this.isActivePool(s,t.toNumber())){let o=await this.getPoolDelta(r.address,s,t.toString());Object.assign(r,o)}else{let o=this.pools.findIndex(a=>a.address==r.address);this.pools.splice(o,1)}})})}};import{calculate_in_given_out as ur,calculate_lrna_in_given_out as mr,calculate_out_given_in as pr,calculate_out_given_lrna_in as dr,calculate_spot_price as gr,calculate_lrna_spot_price as hr,calculate_shares as yr,calculate_liquidity_out as br,calculate_liquidity_lrna_out as Pr,calculate_liquidity_hub_in as fr,is_sell_allowed as Sr,is_buy_allowed as Br,is_add_liquidity_allowed as xr,is_remove_liquidity_allowed as vr,recalculate_asset_fee as Tr,recalculate_protocol_fee as wr,verify_asset_cap as Or}from"@galacticcouncil/math-omnipool";var F=class{static calculateSpotPrice(e,t,r,s){return gr(e,t,r,s)}static calculateLrnaSpotPrice(e,t){return hr(e,t)}static calculateInGivenOut(e,t,r,s,i,o,a,n,l){return ur(e,t,r,s,i,o,a,n,l)}static calculateLrnaInGivenOut(e,t,r,s,i){return mr(e,t,r,s,i)}static calculateOutGivenIn(e,t,r,s,i,o,a,n,l){return pr(e,t,r,s,i,o,a,n,l)}static calculateOutGivenLrnaIn(e,t,r,s,i){return dr(e,t,r,s,i)}static calculateShares(e,t,r,s){return yr(e,t,r,s)}static calculateLiquidityOut(e,t,r,s,i,o,a,n){return br(e,t,r,s,i,o,a,n)}static calculateLiquidityLRNAOut(e,t,r,s,i,o,a,n){return Pr(e,t,r,s,i,o,a,n)}static calculateCapDifference(e,t,r,s){let i=v(t),o=v(e),a=v(s),l=v(r).shiftedBy(-18);if(i.div(a).lt(l)){let u=l.times(a).minus(i).times(o),d=i.times(v(1).minus(l));return u.div(d).toFixed(0)}else return"0"}static calculateLimitHubIn(e,t,r,s){return fr(e,t,r,s)}static isSellAllowed(e){return Sr(e)}static isBuyAllowed(e){return Br(e)}static isAddLiquidityAllowed(e){return xr(e)}static isRemoveLiquidityAllowed(e){return vr(e)}static recalculateAssetFee(e,t,r,s,i,o,a,n,l,c,u){return Tr(e,t,r,s,i,o,a,n,l,c,u)}static recalculateProtocolFee(e,t,r,s,i,o,a,n,l,c,u){return wr(e,t,r,s,i,o,a,n,l,c,u)}static verifyAssetCap(e,t,r,s){return Or(e,t,r,s)}};var Me=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(e){return new p(e)}constructor(e){this.type="Omnipool",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.hubAssetId=e.hubAssetId}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 o=m(s.balance),a=m(i.balance),n=m(s.existentialDeposit),l=m(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:o,balanceOut:a,tradeableIn:s.tradeable,tradeableOut:i.tradeable,assetInED:n,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),o=i.minus(s),a=s===B?B:o.div(s).multipliedBy(100).decimalPlaces(4),n=[],l=F.isSellAllowed(e.tradeableIn),c=F.isBuyAllowed(e.tradeableOut);(!l||!c)&&n.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&n.push("InsufficientTradingAmount");let u=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(u)&&n.push("MaxOutRatioExceeded");let d=e.balanceIn.div(this.maxInRatio);return i.isGreaterThan(d)&&n.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:a.toNumber(),errors:n}}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),n=[],l=F.isSellAllowed(e.tradeableIn),c=F.isBuyAllowed(e.tradeableOut);(!l||!c)&&n.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&n.push("InsufficientTradingAmount");let u=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(u)&&n.push("MaxInRatioExceeded");let d=e.balanceOut.div(this.maxOutRatio);return i.isGreaterThan(d)&&n.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:a.toNumber(),errors:n}}calculateInGivenOut(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(e,t,r);let s=F.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toRaw(r.assetFee).toString():B.toString(),r?P.toRaw(r.protocolFee).toString():B.toString()),i=m(s);return i.isNegative()?B:i}calculateLrnaInGivenOut(e,t,r){let s=F.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toRaw(r.assetFee).toString():B.toString()),i=m(s);return i.isNegative()?B:i}calculateOutGivenIn(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,r);let s=F.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toRaw(r.assetFee).toString():B.toString(),r?P.toRaw(r.protocolFee).toString():B.toString()),i=m(s);return i.isNegative()?B:i}calculateOutGivenLrnaIn(e,t,r){let s=F.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toRaw(r.assetFee).toString():B.toString()),i=m(s);return i.isNegative()?B:i}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=F.calculateSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString(),e.balanceIn.toString(),e.hubReservesIn.toString());return m(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceLrnaInGivenOut(e){let t=F.calculateLrnaSpotPrice(e.hubReservesOut.toString(),e.balanceOut.toString());return m(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceOutGivenIn(e){if(e.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(e);let t=F.calculateSpotPrice(e.balanceIn.toString(),e.hubReservesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString());return m(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}spotPriceOutGivenLrnaIn(e){let t=F.calculateLrnaSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString());return m(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}};import{encodeAddress as Ir}from"@polkadot/util-crypto";import{stringToU8a as Ar}from"@polkadot/util";import{memoize1 as tt}from"@thi.ng/memoize";import{TLRUCache as Fr}from"@thi.ng/cache";var vt="omnipool",Tt="Short",Le=class extends D{dynamicFees=new Map;dynamicFeesConfiguration=new Map;oracles=new Map;memQueryCache=new Fr(null,{ttl:6*1e3});memOracleQuery=tt(e=>{let t=e.split(":");return this.api.query.emaOracle.oracles(vt,t,Tt)},this.memQueryCache);memFeesQuery=tt(e=>this.api.query.dynamicFees.assetFee(e),this.memQueryCache);memFeesConfigurationQuery=tt(e=>this.api.query.dynamicFees.assetFeeConfiguration(e),this.memQueryCache);getPoolType(){return"Omnipool"}getPoolId(){return Ir(Ar("modlomnipool".padEnd(32,"\0")),63)}getOracleKey(e){return e==="0"?["0","1"]:["1",e]}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}}async getDynamicFees(e){return this.dynamicFees.has(e)?this.dynamicFees.get(e):this.memFeesQuery(e)}async getDynamicFeesConfiguration(e){return this.dynamicFeesConfiguration.has(e)?this.dynamicFeesConfiguration.get(e):this.memFeesConfigurationQuery(e)}async getOraclePrice(e){let r=this.getOracleKey(e).join(":");return this.oracles.has(r)?this.oracles.get(r):this.memOracleQuery(r)}isSupported(){return this.api.query.omnipool!==void 0}isAssetConfigSupported(){return this.api.query.dynamicFees.assetFeeConfiguration!==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)]),o=r.map(async([{args:[n]},l])=>{let{hubReserve:c,shares:u,tradable:d,cap:h,protocolShares:g}=l.unwrap(),b=await this.getBalance(t,n.toString());return{id:n.toString(),hubReserves:m(c.toString()),shares:m(u.toString()),tradeable:d.bits.toNumber(),balance:b.toString(),cap:m(h.toString()),protocolShares:m(g.toString())}}),a=await Promise.all(o);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,r){let s=t.assetOut,i=t.assetIn,o;if(this.isAssetConfigSupported()&&(o=await this.getDynamicFeesConfiguration(s).then(f=>f.unwrapOr(null))),o?.isFixed){let f=o.asFixed.assetFee.toNumber(),x=o.asFixed.protocolFee.toNumber();return{assetFee:P.fromPermill(f),protocolFee:P.fromPermill(x)}}let[a,n,l]=await Promise.all([this.getDynamicFees(s),this.getOraclePrice(s),this.getOraclePrice(i)]),[c,u,d]=this.getAssetFee(t,e,a,n,o?.isDynamic?o.asDynamic.assetFeeParams:void 0),[h,g,b]=i==="1"?[0,0,0]:this.getProtocolFee(t,e,a,l,o?.isDynamic?o.asDynamic.protocolFeeParams:void 0),y=c+h,S=d+b;return{assetFee:P.fromPermill(u),protocolFee:P.fromPermill(g),min:P.fromPermill(y),max:P.fromPermill(S)}}getAssetFee(e,t,r,s,i){let{assetOut:o,balanceOut:a}=e,{minFee:n,maxFee:l,decay:c,amplification:u}=i||this.api.consts.dynamicFees.assetFeeParameters,d=P.fromPermill(n.toNumber()),h=P.fromPermill(l.toNumber());if(r.isNone||s.isNone)return[n.toNumber(),n.toNumber(),l.toNumber()];let[g]=s.unwrap(),{assetFee:b,timestamp:y}=r.unwrap(),S=Math.max(1,t-y.toNumber()),f=g.volume.bIn.toString(),x=g.volume.bOut.toString(),I=g.liquidity.b.toString();o==="0"&&(f=g.volume.aIn.toString(),x=g.volume.aOut.toString(),I=g.liquidity.a.toString());let T=P.fromPermill(b.toNumber()),w=F.recalculateAssetFee(f,x,I,"9",a.toString(),P.toRaw(T).toString(),S.toString(),P.toRaw(d).toString(),P.toRaw(h).toString(),c.toString(),u.toString());return[n.toNumber(),Number(w)*1e6,l.toNumber()]}getProtocolFee(e,t,r,s,i){let{assetIn:o,balanceIn:a}=e,{minFee:n,maxFee:l,decay:c,amplification:u}=i||this.api.consts.dynamicFees.protocolFeeParameters,d=P.fromPermill(n.toNumber()),h=P.fromPermill(l.toNumber());if(r.isNone||s.isNone)return[n.toNumber(),n.toNumber(),l.toNumber()];let[g]=s.unwrap(),{protocolFee:b,timestamp:y}=r.unwrap(),S=Math.max(1,t-y.toNumber()),f=g.volume.bIn.toString(),x=g.volume.bOut.toString(),I=g.liquidity.b.toString();o==="0"&&(f=g.volume.aIn.toString(),x=g.volume.aOut.toString(),I=g.liquidity.a.toString());let T=P.fromPermill(b.toNumber()),w=F.recalculateProtocolFee(f,x,I,"9",a.toString(),P.toRaw(T).toString(),S.toString(),P.toRaw(d).toString(),P.toRaw(h).toString(),c.toString(),u.toString());return[n.toNumber(),Number(w)*1e6,l.toNumber()]}async subscribeUpdates(){let[e]=this.pools,t=e.tokens.map(n=>n.id),r=[],s=await this.api.query.omnipool.assets.multi(t,n=>{e.tokens=n.map((l,c)=>{let u=e.tokens[c];if(l.isNone)return u;let d=l.unwrap();return this.updateTokenState(u,d)})});r.push(s);let i=await this.api.query.dynamicFees.assetFee.multi(t,n=>{n.forEach((l,c)=>{let u=t[c];this.dynamicFees.set(u,l)})});if(r.push(i),this.isAssetConfigSupported()){let n=await this.api.query.dynamicFees.assetFeeConfiguration.multi(t,l=>{l.forEach((c,u)=>{let d=t[u];this.dynamicFeesConfiguration.set(d,c)})});r.push(n)}let o=t.map(n=>{let l=this.getOracleKey(n);return[vt,l,Tt]}),a=await this.api.query.emaOracle.oracles.multi(o,n=>{n.forEach(async(l,c)=>{let u=o[c],[d,h,g]=u;this.oracles.set(h.join(":"),l)})});return r.push(a),()=>{for(let n of r)try{n()}catch(l){console.warn("Omnipool unsubscribe failed",l)}}}updateTokenState(e,t){let{hubReserve:r,shares:s,tradable:i,cap:o,protocolShares:a}=t;return{...e,hubReserves:m(r.toString()),shares:m(s.toString()),cap:m(o.toString()),protocolShares:m(a.toString()),tradeable:i.bits.toNumber()}}};import{calculate_in_given_out as Nr,calculate_out_given_in as Rr,calculate_pool_trade_fee as Er,get_spot_price as Cr,calculate_liquidity_in as kr,calculate_shares as _r,calculate_spot_price as Dr,calculate_spot_price_with_fee as Mr,calculate_liquidity_out_asset_a as Lr,calculate_liquidity_out_asset_b as Hr}from"@galacticcouncil/math-xyk";var K=class{static getSpotPrice(e,t,r){return Cr(e,t,r)}static calculateInGivenOut(e,t,r){return Nr(e,t,r)}static calculateOutGivenIn(e,t,r){return Rr(e,t,r)}static calculatePoolTradeFee(e,t,r){return Er(e,t,r)}static calculateLiquidityIn(e,t,r){return kr(e,t,r)}static calculateSpotPrice(e,t){return Dr(e,t)}static calculateSpotPriceWithFee(e,t,r,s){return Mr(e,t,r,s)}static calculateShares(e,t,r){return _r(e,t,r)}static calculateLiquidityOutAssetA(e,t,r,s){return Lr(e,t,r,s)}static calculateLiquidityOutAssetB(e,t,r,s){return Hr(e,t,r,s)}};var He=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new p(e)}constructor(e){this.type="Xyk",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit}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 o=m(s.balance),a=m(i.balance),n=m(s.existentialDeposit),l=m(i.existentialDeposit);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:o,balanceOut:a,assetInED:n,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateTradeFee(s,r),o=P.toPct(r.exchangeFee),a=s.plus(i),n=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&n.push("InsufficientTradingAmount");let l=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(l)&&n.push("MaxOutRatioExceeded");let c=e.balanceIn.div(this.maxInRatio);return a.isGreaterThan(c)&&n.push("MaxInRatioExceeded"),{amountIn:a,calculatedIn:s,amountOut:t,feePct:o,errors:n}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateTradeFee(s,r),o=P.toPct(r.exchangeFee),a=s.minus(i),n=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&n.push("InsufficientTradingAmount");let l=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(l)&&n.push("MaxInRatioExceeded");let c=e.balanceOut.div(this.maxOutRatio);return a.isGreaterThan(c)&&n.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:a,feePct:o,errors:n}}calculateInGivenOut(e,t){let r=K.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=m(r);return s.isNegative()?B:s}calculateOutGivenIn(e,t){let r=K.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=m(r);return s.isNegative()?B:s}spotPriceInGivenOut(e){let t=K.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),r=A(N,18-e.decimalsOut);return m(t).div(r)}spotPriceOutGivenIn(e){let t=K.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),r=A(N,18-e.decimalsIn);return m(t).div(r)}calculateTradeFee(e,t){let r=K.calculatePoolTradeFee(e.toString(),t.exchangeFee[0],t.exchangeFee[1]);return m(r)}};var Ge=class extends D{getPoolType(){return"Xyk"}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}}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(),[o,a]=s.unwrap(),[n,l]=await Promise.all([this.getBalance(i,o.toString()),this.getBalance(i,a.toString())]);return{address:i,type:"Xyk",tokens:[{id:o.toString(),balance:n.toString()},{id:a.toString(),balance:l.toString()}],...this.getPoolLimits()}});return Promise.all(t)}async getPoolFees(e,t,r){return{exchangeFee:this.getExchangeFee()}}getExchangeFee(){let[e,t]=this.api.consts.xyk.getExchangeFee;return P.fromRate(e.toNumber(),t.toNumber())}async subscribeUpdates(){return()=>{}}};import{calculate_in_given_out as Gr,calculate_out_given_in as Ur,calculate_amplification as qr,calculate_add_one_asset as Wr,calculate_liquidity_out_one_asset as Xr,calculate_shares as Yr,calculate_shares_for_amount as Kr,calculate_spot_price_with_fee as Vr,pool_account_name as $r,recalculate_peg as Qr}from"@galacticcouncil/math-stableswap";var k=class{static getPoolAddress(e){return $r(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 qr(e,t,r,s,i)}static calculateInGivenOut(e,t,r,s,i,o,a){return Gr(e,t,r,s,i,o,a)}static calculateAddOneAsset(e,t,r,s,i,o,a){return Wr(e,t,r,s,i,o,a)}static calculateSharesForAmount(e,t,r,s,i,o,a){return Kr(e,t,r,s,i,o,a)}static calculateOutGivenIn(e,t,r,s,i,o,a){return Ur(e,t,r,s,i,o,a)}static calculateLiquidityOutOneAsset(e,t,r,s,i,o,a){return Xr(e,t,r,s,i,o,a)}static calculateShares(e,t,r,s,i,o){return Yr(e,t,r,s,i,o)}static calculateSpotPriceWithFee(e,t,r,s,i,o,a,n){return Vr(e,t,r,s,i,o,a,n)}static recalculatePegs(e,t,r,s,i){let o=Qr(e,t,r,s,i);return JSON.parse(o)}};var J=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;pegs;pegsFee;static fromPool(e){return new p(e)}constructor(e){this.type="Stableswap",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.amplification=e.amplification,this.id=e.id,this.fee=e.fee,this.totalIssuance=e.totalIssuance,this.pegs=e.pegs,this.pegsFee=e.pegsFee}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 o=m(s.balance),a=m(i.balance),n=m(s.existentialDeposit),l=m(i.existentialDeposit);return{assetIn:e,assetOut:t,balanceIn:o,balanceOut:a,decimalsIn:s.decimals,decimalsOut:i.decimals,tradeableIn:this.id===e?15:s.tradeable,tradeableOut:this.id===t?15:i.tradeable,assetInED:n,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),o=i.minus(s),a=s===B?B:o.div(s).multipliedBy(100).decimalPlaces(4),n=[],l=F.isSellAllowed(e.tradeableIn),c=F.isBuyAllowed(e.tradeableOut);return(!l||!c)&&n.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&n.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:a.toNumber(),errors:n}}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),n=[],l=F.isSellAllowed(e.tradeableIn),c=F.isBuyAllowed(e.tradeableOut);return(!l||!c)&&n.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&n.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:a.toNumber(),errors:n}}calculateIn(e,t,r){let s=k.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?P.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=m(s);return i.isNegative()?B:i}calculateAddOneAsset(e,t,r){let s=k.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,r?P.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=m(s);return i.isNegative()?B:i}calculateSharesForAmount(e,t,r){let s=k.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,r?P.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=m(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=k.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetOut,e.assetIn,this.totalIssuance,"0",this.getPegs());if(e.assetOut==this.id)return m(t);if(e.assetIn==this.id){let s=A(N,e.decimalsIn-e.decimalsOut);return m(t).div(s).decimalPlaces(0,1)}let r=A(N,18-e.decimalsIn);return m(t).div(r).decimalPlaces(0,1)}calculateOut(e,t,r){let s=k.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?P.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=m(s);return i.isNegative()?B:i}calculateWithdrawOneAsset(e,t,r){let s=k.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,r?P.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=m(s);return i.isNegative()?B:i}calculateShares(e,t,r){let s=k.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,r?P.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=m(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=k.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetIn,e.assetOut,this.totalIssuance,"0",this.getPegs());if(e.assetIn==this.id)return m(t);if(e.assetOut==this.id){let s=A(N,e.decimalsOut-e.decimalsIn);return m(t).div(s).decimalPlaces(0,1)}let r=A(N,18-e.decimalsOut);return m(t).div(r).decimalPlaces(0,1)}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 jr,encodeAddress as zr}from"@polkadot/util-crypto";var Ue=class extends D{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(e){let t=Number(e),r=k.getPoolAddress(t);return zr(jr(r),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:this.api.consts.stableswap.minTradingLimit.toNumber()}}async getPoolDelta(e,t,r){let{initialAmplification:s,finalAmplification:i,initialBlock:o,finalBlock:a}=t,n=k.calculateAmplification(s.toString(),i.toString(),o.toString(),a.toString(),r),l=await this.api.query.tokens.totalIssuance(e);return{amplification:n,totalIssuance:l.toString()}}async getPoolTokens(e,t,r){let{assets:s}=r,i=s.map(async o=>{let[a,n]=await Promise.all([this.api.query.stableswap.assetTradability(t,o.toString()),this.getBalance(e,o.toString())]);return{id:o.toString(),tradeable:a.bits.toNumber(),balance:n.toString()}});return Promise.all(i)}isSupported(){return this.api.query.stableswap!==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:[o]},a])=>{try{let n=a.unwrap(),l=o.toString(),c=this.getPoolAddress(l),[u,d,h]=await Promise.all([this.getPoolDelta(l,n,r.toString()),this.getPoolTokens(c,l,n),this.getPoolPegs(l,n,r.toString())]);return d.push({id:l,tradeable:15,balance:u.totalIssuance}),this.poolsData.set(c,n),{address:c,id:l,type:"Stableswap",fee:P.fromPermill(n.fee.toNumber()),tokens:d,...u,...h,...this.getPoolLimits()}}catch(n){return console.warn(`Skipping pool ${o.toString()}
|
|
2
|
-
`,String(n)),null}});return(await Promise.all(s)).filter(o=>o!==null)}async getPoolFees(e,t,r){return{fee:this.pools.find(i=>i.address===r).pegsFee}}async getPoolPegs(e,t,r){let s=await this.api.query.stableswap.poolPegs(e);if(s.isNone)return this.getDefaultPegs(t);let i=s.unwrap(),o=await this.getLatestPegs(t,i,r),a=this.getRecentPegs(i),n=P.fromPermill(t.fee.toNumber()),l=P.fromPerbill(i.maxPegUpdate.toNumber()),[c,u]=k.recalculatePegs(JSON.stringify(a),JSON.stringify(o),r,P.toRaw(l).toString(),P.toRaw(n).toString()),d=Number(c)*1e6;return{pegsFee:P.fromPermill(d),pegs:u}}getDefaultPegs(e){let t=e.fee,r=k.defaultPegs(e.assets.length);return{pegsFee:P.fromPermill(t.toNumber()),pegs:r}}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,n])=>n.toString()),o=s.map(async(a,n)=>{if(a.isOracle){let[l,c,u]=a.asOracle,d=[u.toString(),i[n]].map(f=>Number(f)).sort((f,x)=>f-x),h=await this.api.query.emaOracle.oracles(l,d,c),[{price:g,updatedAt:b}]=h.unwrap(),y=g.n.toString(),S=g.d.toString();return u.toString()===d[0].toString()?[[y,S],b.toString()]:[[S,y],b.toString()]}else if(a.isMmOracle){let l=a.asMmOracle,{price:c,decimals:u,updatedAt:d}=await this.mmOracle.getData(l.toString()),h=10**u;return[[c.toString(),h.toString()],d.toString()]}else{if(a.isValue)return[a.asValue.map(l=>l.toString()),r];throw Error(a.type+" is not supported")}});return Promise.all(o)}async subscribeUpdates(){return this.api.query.system.number(async e=>{let t=e.toString();this.pools.forEach(async r=>{let s=this.poolsData.get(r.address);if(s){let[i,o]=await Promise.all([this.getPoolDelta(r.id,s,t),this.getPoolPegs(r.id,s,t)]),a=r.tokens.map(n=>n.id===r.id?{...n,balance:i.totalIssuance}:n);Object.assign(r,{tokens:a},i,o)}})})}};import{calculate_collateral_in_given_hollar_out as Jr,calculate_collateral_out_given_hollar_in as Zr,calculate_hollar_in_given_collateral_out as es,calculate_hollar_out_given_collateral_in as ts,calculate_imbalance as rs,calculate_max_price as ss,calculate_buyback_limit as is,calculate_buyback_price_with_fee as ns}from"@galacticcouncil/math-hsm";var q=class{static calculateCollateralInGivenHollarOut(e,t,r){return Jr(e,t,r)}static calculateCollateralOutGivenHollarIn(e,t,r){return Zr(e,t,r)}static calculateHollarOutGivenCollateralIn(e,t,r){return ts(e,t,r)}static calculateHollarInGivenCollateralOut(e,t,r){return es(e,t,r)}static calculateImbalance(e,t,r){return rs(e,t,r)}static calculateBuybackLimit(e,t){return is(e,t)}static calculateBuybackPriceWithFee(e,t,r){return ns(e,t,r)}static calculateMaxPrice(e,t){return ss(e,t)}};var qe=class p extends J{hsmAddress;hsmMintCapacity;hollarId;hollarH160;collateralId;collateralBalance;maxBuyPriceCoefficient;maxInHolding;purchaseFee;buyBackFee;buyBackRate;static fromPool(e){return new p(e)}constructor(e){super(e),this.type="Hsm",this.hsmAddress=e.hsmAddress,this.hsmMintCapacity=e.hsmMintCapacity,this.hollarId=e.hollarId,this.hollarH160=e.hollarH160,this.collateralId=e.collateralId,this.collateralBalance=e.collateralBalance,this.maxBuyPriceCoefficient=e.maxBuyPriceCoefficient,this.maxInHolding=e.maxInHolding,this.purchaseFee=e.purchaseFee,this.buyBackFee=e.buyBackFee,this.buyBackRate=e.buyBackRate}validatePair(e,t){return!0}parsePair(e,t){return super.parsePair(e,t)}validateTradeHollarIn(e,t,r,s){let i=this.calculateBuybackLimit(e);t.gt(i)&&s.push("MaxBuyBackExceeded");let o=this.calculateBuyPrice(e,t,r),a=this.calculateMaxPrice(e);return o.gt(a)&&s.push("MaxBuyPriceExceeded"),r.gt(this.collateralBalance)&&s.push("InsufficientCollateral"),s}validateTradeHollarOut(e,t,r){return this.collateralBalance.plus(e).gt(this.maxInHolding)&&r.push("MaxHoldingExceeded"),t.gt(this.hsmMintCapacity)&&r.push("FacilitatorCapacityExceeded"),r}validateTradeConstraints(e,t,r){let s=[];return e.assetIn===this.hollarId?this.validateTradeHollarIn(e,t,r,s):this.validateTradeHollarOut(t,r,s)}validateAndBuy(e,t){let r=this.calculateInGivenOut(e,t),s=this.validateTradeConstraints(e,r,t);return{amountIn:r,calculatedIn:r,amountOut:t,feePct:0,errors:s}}validateAndSell(e,t){let r=this.calculateOutGivenIn(e,t),s=this.validateTradeConstraints(e,t,r);return{amountIn:t,calculatedOut:r,amountOut:r,feePct:0,errors:s}}calculateHollarInGivenCollateralOut(e,t){let r=super.calculateInGivenOut(e,t,{fee:this.fee}),s=q.calculateHollarInGivenCollateralOut(t.toFixed(0),r.toFixed(0),P.toRaw(this.buyBackFee).toString());return m(s)}calculateCollateralInGivenHollarOut(e){let t=this.getCollateralPeg(),r=q.calculateCollateralInGivenHollarOut(e.toFixed(0),JSON.stringify(t),P.toRaw(this.purchaseFee).toString());return m(r)}calculateInGivenOut(e,t){return e.assetOut==this.hollarId?this.calculateCollateralInGivenHollarOut(t):this.calculateHollarInGivenCollateralOut(e,t)}calculateCollateralOutGivenHollarIn(e,t){let r=super.calculateOutGivenIn(e,t,{fee:this.fee}),s=q.calculateCollateralOutGivenHollarIn(t.toFixed(0),r.toFixed(0),P.toRaw(this.buyBackFee).toString());return m(s)}calculateHollarOutGivenCollateralIn(e){let t=this.getCollateralPeg(),r=q.calculateHollarOutGivenCollateralIn(e.toFixed(0),JSON.stringify(t),P.toRaw(this.purchaseFee).toString());return m(r)}calculateOutGivenIn(e,t){return e.assetIn==this.hollarId?this.calculateCollateralOutGivenHollarIn(e,t):this.calculateHollarOutGivenCollateralIn(t)}calculateImbalance(e){let t=this.getCollateralPeg(),r=q.calculateImbalance(e.balanceIn.toString(),JSON.stringify(t),e.balanceOut.toString());return m(r)}calculateBuybackLimit(e){let t=this.calculateImbalance(e),r=q.calculateBuybackLimit(t.toString(),P.toRaw(this.buyBackRate).toString());return m(r)}calculateBuyPrice(e,t,r){let s=t.dividedBy(m(10).pow(e.decimalsIn));return r.dividedBy(m(10).pow(e.decimalsOut)).dividedBy(s)}calculateMaxPrice(e){let t=this.getCollateralPeg(),r=q.calculateMaxPrice(JSON.stringify(t),this.maxBuyPriceCoefficient.toFixed(0)),[s,i]=JSON.parse(r);return m(s).div(m(i)).shiftedBy(-1*e.decimalsOut)}spotPriceInGivenOut(e){let t=A(N,e.decimalsOut);return this.calculateInGivenOut(e,t)}spotPriceOutGivenIn(e){let t=A(N,e.decimalsIn);return this.calculateOutGivenIn(e,t)}getCollateralPeg(){let e=this.tokens.findIndex(s=>s.id!==this.hollarId),t=this.pegs[e],r=this.tokens[e].decimals;return this.isDefaultPeg(t)?[A(N,18).toString(),A(N,r).toString()]:t}isDefaultPeg(e){let[t,r]=e;return Array.isArray(e)&&e.length===2&&t==="1"&&r==="1"}};import{stringToU8a as wt}from"@polkadot/util";import{encodeAddress as Ot}from"@polkadot/util-crypto";import{decodeEventLog as as}from"viem";var oe=[{inputs:[{internalType:"address",name:"facilitator",type:"address"}],name:"getFacilitator",outputs:[{type:"tuple",components:[{name:"addr",type:"address"},{name:"label",type:"bytes32"},{name:"bucketCapacity",type:"uint128"},{name:"bucketLevel",type:"uint128"}]}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"facilitator",type:"address"}],name:"getFacilitatorBucket",outputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getFacilitatorsList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!0,internalType:"bytes32",name:"label",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"bucketCapacity",type:"uint256"}],name:"FacilitatorAdded",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"oldCapacity",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newCapacity",type:"uint256"}],name:"FacilitatorBucketCapacityUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"oldLevel",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newLevel",type:"uint256"}],name:"FacilitatorBucketLevelUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"}],name:"FacilitatorRemoved",type:"event"}];var le=class{client;constructor(e){this.client=e.getWsProvider()}async getFacilitatorCapacity(e,t){let[r,s]=await this.client.readContract({abi:oe,address:e,functionName:"getFacilitatorBucket",args:[t]});return r-s}};var os=["FacilitatorBucketCapacityUpdated","FacilitatorBucketLevelUpdated"],We=class extends D{stableClient;ghoTokenClient;constructor(e,t,r){super(e,t),this.stableClient=r,this.ghoTokenClient=new le(t)}getPoolType(){return"Hsm"}getPoolId(e){let t="hsm:"+e;return Ot(wt(t.padEnd(32,"\0")),63)}getFacilitatorAddress(){return Ot(wt("modlpy/hsmod".padEnd(32,"\0")),63)}getHollarAddress(e){return Ce(e,"accountKey20").accountKey20.key}isSupported(){return this.api.query.hsm!==void 0}async loadPools(){let e=this.api.consts.hsm.hollarId.toString(),[t,r,s]=await Promise.all([this.api.query.assetRegistry.assetLocations(e),this.api.query.hsm.collaterals.entries(),this.stableClient.getPoolsMem()]);if(r.length===0)return[];let i=this.getFacilitatorAddress(),o=W.fromAny(i),a=this.getHollarAddress(t.unwrap()),n=await this.ghoTokenClient.getFacilitatorCapacity(a,o),l=r.map(async([{args:[u]},d])=>{let h=d.unwrap(),g=u.toString(),{poolId:b,maxBuyPriceCoefficient:y,maxInHolding:S,purchaseFee:f,buyBackFee:x,buybackRate:I}=h,T=s.find(w=>w.id===b.toString());if(T){let w=this.getPoolId(b.toString()),C=await this.getBalance(i,g);return{...T,address:w,type:"Hsm",tokens:T.tokens.filter(M=>M.id!==b.toString()),hsmAddress:i,hsmMintCapacity:m(n),hollarId:e,hollarH160:a,collateralId:g,collateralBalance:C,maxBuyPriceCoefficient:m(y.toString()),maxInHolding:m(S.unwrap().toString()),purchaseFee:P.fromPermill(f.toNumber()),buyBackFee:P.fromPermill(x.toNumber()),buyBackRate:P.fromPerbill(I.toNumber())}}});return(await Promise.all(l)).filter(u=>u!==null)}async getPoolFees(e,t,r){return{}}onEvents(e){e.forEach(async t=>{let{event:r}=t;if(`${r.section}:${r.method}`==="evm:Log"){let[i]=r.data.toJSON();try{let{eventName:o,args:a}=as({abi:oe,topics:i.topics,data:i.data}),[n]=this.pools,{hsmAddress:l,hollarH160:c}=n,u=W.fromAny(l),d=u.toLowerCase()===a.facilitatorAddress.toLowerCase();if(os.includes(o)&&d){let h=await this.ghoTokenClient.getFacilitatorCapacity(c,u);this.log(`Sync HSM facilitator via [evm:Log] :: ${o} ${h}`),this.pools.forEach(g=>{Object.assign(g,{hsmMintCapacity:h})})}}catch{}}})}async subscribeBalances(){let e=[],t=[],r=[];for(let i of this.pools){let{tokens:o,hsmAddress:a,collateralId:n}=i;o.find(c=>c.id===n).type==="Erc20"?t.push([a,n]):e.push([a,n])}let s=i=>{i.forEach(([o,a])=>{let[n,l]=o,c=this.pools.find(u=>u.tokens.some(d=>d.id===l));c&&Object.assign(c,{collateralBalance:a})})};if(e.length>0){let i=await this.subscribeTokenBalances(e,s);r.push(i)}if(t.length>0){let i=await this.subscribeErc20Balances(t,s);r.push(i)}return()=>{for(let i of r)try{i()}catch(o){console.warn("Balance unsub failed",o)}}}async subscribeUpdates(){return()=>{}}};var ce=class extends _{api;evm;assetClient;aaveClient;xykClient;omniClient;lbpClient;stableClient;hsmClient;clients=[];onChainAssets=[];block=0;blockHandlers=[];eventHandlers=[];disconnectSubscribeNewHeads=null;disconnectSubscribeEvents=null;memRegistry=ls(e=>(this.log(`Registry mem ${e} sync`),this.syncRegistry()));constructor(e,t){super(e),this.api=e,this.evm=t,this.assetClient=new Q(this.api),this.aaveClient=new ke(this.api,t),this.xykClient=new Ge(this.api,t),this.omniClient=new Le(this.api,t),this.lbpClient=new De(this.api,t),this.stableClient=new Ue(this.api,t),this.hsmClient=new We(this.api,t,this.stableClient),this.clients=[this.aaveClient,this.xykClient,this.omniClient,this.lbpClient,this.stableClient,this.hsmClient],this.blockHandlers=this.clients.map(r=>r.onNewBlockHandler),this.eventHandlers=this.clients.map(r=>r.onEventsHandler),this.api.rpc.chain.subscribeNewHeads(async r=>{let s=r.number.toNumber();this.onNewBlock(s)}).then(r=>{this.disconnectSubscribeNewHeads=r}),this.api.query.system.events(r=>{this.onEvents(r)}).then(r=>{this.disconnectSubscribeEvents=r})}onNewBlock(e){this.block=e;for(let t of this.blockHandlers)try{t(e)}catch(r){this.log("onNewBlock handler error",r)}}onEvents(e){for(let t of this.eventHandlers)try{t(e)}catch(r){this.log("onEvents handler error",r)}}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={}){this.isRegistrySynced||await this.memRegistry(1);let{includeOnly:t=[],exclude:r=[]}=e;return t.length>0?this.getFilteredPools(s=>t.includes(s.getPoolType())):r.length>0?this.getFilteredPools(s=>!r.includes(s.getPoolType())):this.getFilteredPools(s=>s.isSupported())}async getFilteredPools(e){let t=this.clients.filter(e);return(await Promise.all(t.map(s=>s.getPoolsMem()))).flat()}destroy(){this.aaveClient.unsubscribe(),this.xykClient.unsubscribe(),this.omniClient.unsubscribe(),this.lbpClient.unsubscribe(),this.stableClient.unsubscribe(),this.hsmClient.unsubscribe(),this.disconnectSubscribeNewHeads?.(),this.disconnectSubscribeEvents?.()}async getPoolFees(e,t){switch(t.type){case"Aave":return this.aaveClient.getPoolFees(this.block,e,t.address);case"Xyk":return this.xykClient.getPoolFees(this.block,e,t.address);case"Omnipool":return this.omniClient.getPoolFees(this.block,e,t.address);case"Lbp":return this.lbpClient.getPoolFees(this.block,e,t.address);case"Stableswap":return this.stableClient.getPoolFees(this.block,e,t.address);case"Hsm":return this.hsmClient.getPoolFees(this.block,e,t.address);default:throw new Fe(t.type)}}};var ue=class extends ce{feeCache=new Map;constructor(e,t){super(e,t)}onNewBlock(e){super.onNewBlock(e),this.feeCache.clear()}async getPoolFees(e,t){let r=[t.address,e.assetIn,e.assetOut].join("-");if(this.feeCache.has(r))return this.feeCache.get(r);let s=super.getPoolFees(e,t);return this.feeCache.set(r,s),s}async destroy(){this.feeCache.clear(),super.destroy()}};var me=class{static get(e){switch(e.type){case"Aave":return Ee.fromPool(e);case"Xyk":return He.fromPool(e);case"Omnipool":return Me.fromPool(e);case"Lbp":return _e.fromPool(e);case"Stableswap":return J.fromPool(e);case"Hsm":return qe.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};import{sha256 as cs}from"@noble/hashes/sha2";import{bytesToHex as us}from"@noble/hashes/utils";function Mc(p){let e=p.map(s=>s.address).sort().join(":"),t=new TextEncoder().encode(e),r=cs(t);return us(r)}var pe=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 ms=10,de=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 pe,o=[];for(o.push([t,""]),i.enqueue(o);i.size()>0;){let a=i.dequeue();if(!a||a.length>ms)continue;let n=a[a.length-1];(r===null||n[0]===r)&&s.push(a),e.get(n[0])?.forEach(c=>{if(this.isNotVisited(c,a)){let u=[...a];u.push(c),i.enqueue(u)}})}return s}findShortestPaths(e,t,r){let s=[],i=new pe,o=[];o.push([t,""]),i.enqueue(o);let a=1/0;for(;i.size()>0;){let n=i.dequeue();if(!n)continue;let l=n[n.length-1];if(l[0]===r){n.length<a?(a=n.length,s.length=0,s.push(n)):n.length===a&&s.push(n);continue}let c=e.get(l[0]);for(let u of c??[])this.isNotVisited(u,n)&&i.enqueue([...n,u])}return s}buildAndPopulateGraph(e,t){let r=new Map;for(let s of e)r.set(parseInt(s),[]);for(let[s,i,o]of t){let a=parseInt(i),n=parseInt(o);r.get(a)?.push([n,s])}return r}};function rt(p){let e={};for(let t of p){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 o=[t.address,t.tokens[s].id,t.tokens[i].id];e[t.tokens[s].id].push(o)}}}return e}var ge=class{getProposals(e,t,r){let s=r.filter(f=>f.type==="Xyk"),i=r.filter(f=>f.type!=="Xyk"),o=parseInt(e),a=parseInt(t),n=new Set(i.map(f=>f.tokens).flat().map(f=>f.id)),l=n.has(e),c=n.has(t),u=new de,d=f=>{let x=rt(f),I=Object.keys(x),T=I.flatMap(w=>x[w]);return u.buildAndPopulateGraph(I,T)};if(!l&&!c){let f=s.filter(T=>T.tokens.find(w=>w.id===e)||T.tokens.find(w=>w.id===t)),x=d(f),I=u.findPaths(x,o,a);return this.parsePaths(I)}if(l&&c){let f=d(i),x=u.findPaths(f,o,a);return this.parsePaths(x)}let h=l?t:e,g=s.filter(f=>f.tokens.some(x=>x.id===h));if(g.length===0)return[];let b=[...i,...g],y=d(b),S=u.findPaths(y,o,a);return this.parsePaths(S)}parsePaths(e){let t=[];for(let r of e){let s=[];for(let i=0;i<r.length;i++){let o=r[i],a=r[i+1];if(a==null)break;s.push(this.toEdge(o,a))}t.push(s)}return t}toEdge(e,t){return[t[1],e[0].toString(),t[0].toString()]}};var he=class{routeSuggester;routeProposals;routerOptions;poolService;constructor(e,t={}){this.poolService=e,this.routeSuggester=new ge,this.routeProposals=new Map,this.routerOptions=Object.freeze(t)}buildRouteKey(e,t,r){return`${e}->${t}::${r.length}`}async getPools(){return this.poolService.getPools(this.routerOptions)}async getAllAssets(){let e=await this.getPools(),t=this.getAssets(e);return[...new Map(t).values()]}async getRouteableAssets(e){let t=await this.getAllAssets();return(await Promise.all(t.map(s=>s.id).filter(s=>s!==e).map(s=>this.getRoutes(s,e)))).filter(s=>s.length>0).map(([s])=>s[0].assetIn).sort()}async getRoutes(e,t){let r=await this.getPools();return this.validateInput(e,t,r),this.getPaths(e,t,r)}validateInput(e,t,r){if(r.length===0)throw new Error("No pools configured");if(e===t)throw new Error("Trading pair can't be identical");let s=this.getAssets(r);if(s.get(e)===null)throw new Error(e+" is not supported asset");if(s.get(t)===null)throw new Error(t+" is not supported asset");return this.toPoolsMap(r)}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){let s=this.toPoolsMap(r);return this.getProposals(e,t,r).filter(a=>this.validPath(a,s)).map(a=>this.toHops(a,s))}getProposals(e,t,r){let s=this.buildRouteKey(e,t,r);if(this.routeProposals.has(s))return this.routeProposals.get(s);let i=this.routeSuggester.getProposals(e,t,r);return this.routeProposals.set(s,i),i}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}toPoolsMap(e){return new Map(e.map(t=>[t.address,me.get(t)]))}toHops(e,t){return e.map(([r,s,i])=>{let o=t.get(r);return{poolAddress:r,poolId:o?.id,pool:o?.type,assetIn:s,assetOut:i}})}};var ps=m("100");function Iu(p,e){return p.minus(e).abs().div(p.plus(e).div(2)).multipliedBy(100).decimalPlaces(2)}function ye(p,e){return p.minus(e).div(e).multipliedBy(100).decimalPlaces(2)}function It(p,e){return N.minus(e.div(p)).multipliedBy(100).decimalPlaces(4)}function At(p,e){return e.div(p).minus(N).multipliedBy(100).decimalPlaces(4)}function z(p,e){return(e<.01||e>100)&&new Error("Supported range is from 0.01% - 100%"),p.div(ps).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||{}),Ft=(r=>(r.OrderTooSmall="OrderTooSmall",r.OrderTooBig="OrderTooBig",r.OrderImpactTooBig="OrderImpactTooBig",r))(Ft||{});var be=class extends he{mlr;poolsSnapshot;constructor(e,t={}){super(e,t),this.mlr=new Map}buildCtxSync(e,t){let r=this.poolsSnapshot,s=super.validateInput(e,t,r),i=super.getPaths(e,t,r);if(!i.length)throw new Ne(e,t);return{paths:i,pools:r,poolsMap:s}}async withCtx(e,t,r){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let s=this.buildCtxSync(e,t);return r(s)}isDirectTrade(e){return e.length==1}findBestSellRoute(e){let t=e.sort((r,s)=>{let i=r[r.length-1].amountOut,o=s[s.length-1].amountOut;return i.isGreaterThan(o)?-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,o)=>i+o),s=e.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,o)=>i+o);return[r,s]}}getPoolFeeRange(e){let t=e.min?P.toPct(e.min):void 0,r=e.max?P.toPct(e.max):void 0;if(t&&r)return[t,r]}async getBestSell(e,t,r){return this.getSell(e,t,r)}async getSell(e,t,r,s){return this.withCtx(e,t,async({paths:i,poolsMap:o})=>{let a;if(s)a=await this.toSellSwaps(r,s,o);else{let n=i.map(c=>this.toSellSwaps(r,c,o)),l=await Promise.all(n);a=this.findBestSellRoute(l)}return this.buildSell(o,a)})}async getSellTrades(e,t,r){return this.withCtx(e,t,async({paths:s,poolsMap:i})=>{let o=s.map(n=>this.toSellSwaps(r,n,i));return(await Promise.all(o)).filter(n=>n.every(l=>l.errors.length==0)).map(n=>this.buildSell(i,n)).sort((n,l)=>n.amountOut.isGreaterThan(l.amountOut)?-1:1)})}buildSell(e,t){let r=t[0],s=t[t.length-1],i=this.isDirectTrade(t),o=t.map(b=>b.spotPrice.shiftedBy(-1*b.assetOutDecimals)).reduce((b,y)=>b.multipliedBy(y)),a=A(o,s.assetOutDecimals),n=i?s.calculatedOut:this.calculateDelta0Y(r.amountIn,t,e),l=s.amountOut,c=i?s.tradeFeePct:It(n,l).toNumber(),u=n.minus(l),d=this.getRouteFeeRange(t),h=r.amountIn.shiftedBy(-1*r.assetInDecimals).multipliedBy(a),g=ye(n,h);return{type:"Sell",amountIn:r.amountIn,amountOut:s.amountOut,spotPrice:a,tradeFee:u,tradeFeePct:c,tradeFeeRange:d,priceImpactPct:g.toNumber(),swaps:t,toHuman(){return{type:"Sell",amountIn:O(r.amountIn,r.assetInDecimals),amountOut:O(s.amountOut,s.assetOutDecimals),spotPrice:O(a,s.assetOutDecimals),tradeFee:O(u,s.assetOutDecimals),tradeFeePct:c,tradeFeeRange:d,priceImpactPct:g.toNumber(),swaps:t.map(b=>b.toHuman())}}}}calculateDelta0Y(e,t,r){let s=[];for(let i=0;i<t.length;i++){let o=t[i],a=r.get(o.poolAddress);if(a==null)throw new Error("Pool does not exit");let n=a.parsePair(o.assetIn,o.assetOut),l;i>0?l=s[i-1]:l=e;let c=a.calculateOutGivenIn(n,l);s.push(c)}return s[s.length-1]}async calculateMostLiquidRoute(e,t,r){let{paths:s,pools:i,poolsMap:o}=r,c=i.filter(y=>y.tokens.some(S=>S.id===e)).map(y=>y.type==="Aave"?y.tokens:y.tokens.filter(S=>S.id===e)).map(y=>y.map(S=>m(S.balance).shiftedBy(-1*S.decimals)).reduce((S,f)=>S.plus(f))).sort((y,S)=>S.isLessThan(y)?-1:1)[0].div(100).multipliedBy(.1),u=s.map(async y=>await this.toSellSwaps(c,y,o)),d=await Promise.all(u),g=this.findBestSellRoute(d).map(y=>({poolAddress:y.poolAddress,poolId:y?.poolId,pool:y.pool,assetIn:y.assetIn,assetOut:y.assetOut})),b=this.buildRouteKey(e,t,i);return this.mlr.set(b,g),g}async toSellSwaps(e,t,r){let s=[],i=[];for(let n=0;n<t.length;n++){let l=t[n],c=r.get(l.poolAddress);if(!c)throw new Error("Pool does not exit");let u=c.parsePair(l.assetIn,l.assetOut);s[n]=c,i[n]=u}let o=await Promise.all(i.map((n,l)=>this.poolService.getPoolFees(n,s[l]))),a=[];for(let n=0;n<t.length;n++){let l=t[n],c=s[n],u=o[n],d=i[n],h;n>0?h=a[n-1].amountOut:h=A(m(e),d.decimalsIn).decimalPlaces(0,1);let{amountOut:g,calculatedOut:b,feePct:y,errors:S}=c.validateAndSell(d,h,u),f=this.getPoolFeeRange(u),x=c.spotPriceOutGivenIn(d),I=h.shiftedBy(-1*d.decimalsIn).multipliedBy(x),T=ye(b,I),w=c.type==="Aave";a.push({...l,assetInDecimals:d.decimalsIn,assetOutDecimals:d.decimalsOut,amountIn:h,amountOut:g,calculatedOut:b,spotPrice:x,tradeFeePct:y,tradeFeeRange:f,priceImpactPct:T.toNumber(),errors:S,isSupply:()=>w&&c.tokens[0].id===l.assetIn,isWithdraw:()=>w&&c.tokens[1].id===l.assetIn,toHuman(){return{...l,amountIn:O(h,d.decimalsIn),amountOut:O(g,d.decimalsOut),calculatedOut:O(b,d.decimalsOut),spotPrice:O(x,d.decimalsOut),tradeFeePct:y,priceImpactPct:T.toNumber(),errors:S}}})}return a}async getMostLiquidRoute(e,t){return this.withCtx(e,t,async r=>{let s=this.buildRouteKey(e,t,r.pools),i=this.mlr.get(s);return i||this.calculateMostLiquidRoute(e,t,r)})}async getBestSpotPrice(e,t){return this.withCtx(e,t,async r=>{let{pools:s,poolsMap:i}=r,o=this.buildRouteKey(e,t,s),a=this.mlr.get(o);a||(a=await this.calculateMostLiquidRoute(e,t,r));let n=await this.toSellSwaps("1",a,i),l=n.map(d=>d.spotPrice.shiftedBy(-1*d.assetOutDecimals)).reduce((d,h)=>d.multipliedBy(h)),c=n[n.length-1].assetOutDecimals;return{amount:A(l,c),decimals:c}}).catch(()=>{})}findBestBuyRoute(e){let t=e.sort((r,s)=>{let i=r[0].amountIn,o=s[0].amountIn;return i.isGreaterThan(o)?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){return this.withCtx(e,t,async({paths:i,poolsMap:o})=>{let a;if(s)a=await this.toBuySwaps(r,s,o);else{let n=i.map(c=>this.toBuySwaps(r,c,o)),l=await Promise.all(n);a=this.findBestBuyRoute(l)}return this.buildBuy(o,a)})}async getBuyTrades(e,t,r){return this.withCtx(e,t,async({paths:s,poolsMap:i})=>{let o=s.map(n=>this.toBuySwaps(r,n,i));return(await Promise.all(o)).filter(n=>n.every(l=>l.errors.length==0)).map(n=>this.buildBuy(i,n)).sort((n,l)=>n.amountIn.isGreaterThan(l.amountIn)?1:-1)})}buildBuy(e,t){let r=t[t.length-1],s=t[0],i=this.isDirectTrade(t),o=t.map(b=>b.spotPrice.shiftedBy(-1*b.assetInDecimals)).reduce((b,y)=>b.multipliedBy(y)),a=A(o,s.assetInDecimals),n=i?s.calculatedIn:this.calculateDelta0X(r.amountOut,t,e),l=s.amountIn,c=i?s.tradeFeePct:At(n,l).toNumber(),u=l.minus(n),d=this.getRouteFeeRange(t),h=r.amountOut.shiftedBy(-1*r.assetOutDecimals).multipliedBy(a),g;return n.isZero()?g=-100:g=ye(h,n).toNumber(),{type:"Buy",amountOut:r.amountOut,amountIn:s.amountIn,spotPrice:a,tradeFee:u,tradeFeePct:c,tradeFeeRange:d,priceImpactPct:g,swaps:t,toHuman(){return{type:"Buy",amountOut:O(r.amountOut,r.assetOutDecimals),amountIn:O(s.amountIn,s.assetInDecimals),spotPrice:O(a,s.assetInDecimals),tradeFee:O(u,s.assetInDecimals),tradeFeePct:c,tradeFeeRange:d,priceImpactPct:g,swaps:t.map(b=>b.toHuman())}}}}calculateDelta0X(e,t,r){let s=[];for(let i=t.length-1;i>=0;i--){let o=t[i],a=r.get(o.poolAddress);if(a==null)throw new Error("Pool does not exit");let n=a.parsePair(o.assetIn,o.assetOut),l;i==t.length-1?l=e:l=s[0];let c=a.calculateInGivenOut(n,l);s.unshift(c)}return s[0]}async toBuySwaps(e,t,r){let s=[],i=[];for(let n=0;n<t.length;n++){let l=t[n],c=r.get(l.poolAddress);if(!c)throw new Error("Pool does not exit");let u=c.parsePair(l.assetIn,l.assetOut);s[n]=c,i[n]=u}let o=await Promise.all(i.map((n,l)=>this.poolService.getPoolFees(n,s[l]))),a=[];for(let n=t.length-1;n>=0;n--){let l=t[n],c=s[n],u=o[n],d=i[n],h;n==t.length-1?h=A(m(e),d.decimalsOut).decimalPlaces(0,1):h=a[0].amountIn;let{amountIn:g,calculatedIn:b,feePct:y,errors:S}=c.validateAndBuy(d,h,u),f=this.getPoolFeeRange(u),x=c.spotPriceInGivenOut(d),I=h.shiftedBy(-1*d.decimalsOut).multipliedBy(x),T;b.isZero()?T=-100:T=ye(I,b).toNumber(),a.unshift({...l,assetInDecimals:d.decimalsIn,assetOutDecimals:d.decimalsOut,amountIn:g,amountOut:h,calculatedIn:b,spotPrice:x,tradeFeePct:y,tradeFeeRange:f,priceImpactPct:T,errors:S,isSupply(){return c.type==="Aave"&&c.tokens[0].id===l.assetIn},isWithdraw(){return c.type==="Aave"&&c.tokens[1].id===l.assetIn},toHuman(){return{...l,amountIn:O(g,d.decimalsIn),amountOut:O(h,d.decimalsOut),calculatedIn:O(b,d.decimalsIn),spotPrice:O(x,d.decimalsIn),tradeFeePct:y,tradeFeeRange:f,priceImpactPct:T,errors:S}}})}return a}};var Nt=6e3,Rt=m(1e15),Pe=6,nt=-5,at=360*60*1e3,ju=3,Et=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 fe=class{schedulerOptions;router;constructor(e,t={}){this.router=e,this.schedulerOptions=Object.freeze({blockTime:t.blockTime??Nt,minBudgetInNative:t.minBudgetInNative??Rt})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(e,t,r,s,i){let[o,a]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,r)]),{amountIn:n,swaps:l,priceImpactPct:c}=a,u=l[0],d=l[l.length-1],{assetInDecimals:h}=u,{assetOutDecimals:g}=d,b=Math.abs(c),y=this.getMinimumTradeCount(n,o),S=this.getOptimalTradeCount(b),f=i?Math.round(s/i):S,x=Math.ceil(s/y),I=Math.round(s/S),T=Math.round(s/f),w=n.dividedBy(f).decimalPlaces(0,1),C=await this.router.getBestSell(e,t,O(w,h)),M=n.isLessThan(o),Be=[];M&&Be.push("OrderTooSmall");let xe=C.amountOut.multipliedBy(f),Ke=this.toBlockPeriod(T),Ve=C.tradeFee.multipliedBy(f),$e=G.build(l),ve={assetIn:e,assetOut:t,errors:Be,frequencyMin:x,frequencyOpt:I,frequency:T,tradeCount:f,tradeFee:Ve,tradeImpactPct:C.priceImpactPct,tradePeriod:Ke,tradeRoute:$e,type:"Dca"};return{...ve,amountIn:n,amountOut:xe,tradeAmountIn:C.amountIn,tradeAmountOut:C.amountOut,toHuman(){return{...ve,amountIn:O(n,h),amountOut:O(xe,g),tradeAmountIn:O(C.amountIn,h),tradeAmountOut:O(C.amountOut,g)}}}}async getMinimumOrderBudget(e){if("0"===e)return this.minOrderBudget;let t=await this.router.getBestSpotPrice("0",e);if(t)return this.minOrderBudget.times(t.amount).div(m(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:o,swaps:a,priceImpactPct:n}=i,l=a[0],c=a[a.length-1],{assetInDecimals:u}=l,{assetOutDecimals:d}=c,h=Math.abs(n),g=this.getTwapTradeCount(h),b=o.dividedBy(g).decimalPlaces(0,1),y=await this.router.getBestSell(l.assetIn,c.assetOut,O(b,u)),S=g===1,f=o.isLessThan(s),x=y.priceImpactPct<nt,I=[];f||S?I.push("OrderTooSmall"):x&&I.push("OrderImpactTooBig");let T=y.amountOut.multipliedBy(g),w=y.tradeFee.multipliedBy(g),C=G.build(a),M={assetIn:e,assetOut:t,errors:I,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:Pe,tradeRoute:C,type:"TwapSell"};return{...M,amountIn:o,amountOut:T,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:w,toHuman(){return{...M,amountIn:O(o,u),amountOut:O(T,d),tradeAmountIn:O(y.amountIn,u),tradeAmountOut:O(y.amountOut,d),tradeFee:O(w,d)}}}}async getTwapBuyOrder(e,t,r){let[s,i]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestBuy(e,t,r)]),{amountOut:o,swaps:a,priceImpactPct:n}=i,l=a[0],c=a[a.length-1],{assetInDecimals:u}=l,{assetOutDecimals:d}=c,h=Math.abs(n),g=this.getTwapTradeCount(h),b=o.dividedBy(g).decimalPlaces(0,1),y=await this.router.getBestBuy(l.assetIn,c.assetOut,O(b,d)),S=y.amountIn.multipliedBy(g),f=g===1,x=S.isLessThan(s),I=y.priceImpactPct<nt,T=[];x||f?T.push("OrderTooSmall"):I&&T.push("OrderImpactTooBig");let w=y.tradeFee.multipliedBy(g),C=G.build(a),M={assetIn:e,assetOut:t,errors:T,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:Pe,tradeRoute:C,type:"TwapBuy"};return{...M,amountIn:S,amountOut:o,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:w,toHuman(){return{...M,amountIn:O(S,u),amountOut:O(o,d),tradeAmountIn:O(y.amountIn,u),tradeAmountOut:O(y.amountOut,d),tradeFee:O(w,u)}}}}getTwapTradeCount(e){let t=this.getOptimalTradeCount(e);if(this.getTwapExecutionTime(t)>at){let s=at/(this.blockTime*Pe);return Math.round(s)}return t}getTwapExecutionTime(e){return e*Pe*this.blockTime}toBlockPeriod(e){let t=e/this.blockTime,r=Math.round(t);return Math.max(r,Et)}};var Z=class extends _{evm;evmClient;balanceClient;aaveUtils;constructor(e,t){super(e),this.evm=t,this.evmClient=t.getWsProvider(),this.balanceClient=new H(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(),ee)}isDirectOmnipoolTrade(e){return e.length===1&&e[0].pool==="Omnipool"}};var Xe=class extends Z{_trade;_beneficiary;_slippagePct=1;setTrade(e){return this._trade=e,this}withBeneficiary(e){return this._beneficiary=e,this}withSlippage(e){return this._slippagePct=e,this}get trade(){if(!this._trade)throw new Error("Trade not set. Use setTrade().");return this._trade}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get slippagePct(){return this._slippagePct}async build(){let{amountIn:e,swaps:t,type:r}=this.trade;if(r==="Buy")return this.buildBuyTx();let s=t[0],{assetIn:i,assetOut:o}=s,n=(await this.balanceClient.getBalance(this.beneficiary,i)).minus(5),l=!0;return s.isWithdraw()&&(l=(await this.aaveUtils.getMaxWithdraw(this.beneficiary,o)).amount.isGreaterThanOrEqualTo(n)),l&&e.isGreaterThanOrEqualTo(n)?this.buildSellAllTx():this.buildSellTx()}buildBuyTx(){let{amountIn:e,amountOut:t,swaps:r}=this.trade,s=r[0],i=r[r.length-1],o=z(e,this.slippagePct),a=s.assetIn,n=i.assetOut,l=e.plus(o),c;return this.isDirectOmnipoolTrade(r)?c=this.api.tx.omnipool.buy(n,a,t.toFixed(),l.toFixed()):c=this.api.tx.router.buy(a,n,t.toFixed(),l.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],o=z(t,this.slippagePct),a=s.assetIn,n=i.assetOut,l=t.minus(o),c;if(this.isDirectOmnipoolTrade(r)?c=this.api.tx.omnipool.sell(a,n,e.toFixed(),l.toFixed()):c=this.api.tx.router.sell(a,n,e.toFixed(),l.toFixed(),G.build(r)),await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let d=this.dispatchWithExtraGas(c);return this.wrapTx("RouterSell",d,ee)}return this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:e,swaps:t}=this.trade,r=t[0],s=t[t.length-1],i=z(e,this.slippagePct),o=r.assetIn,a=s.assetOut,n=e.minus(i),l=this.api.tx.router.sellAll(o,a,n.toFixed(),G.build(t));if(await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let u=this.dispatchWithExtraGas(l);return this.wrapTx("RouterSellAll",u,ee)}return this.wrapTx("RouterSellAll",l)}};var Ye=class extends Z{_order;_beneficiary;_maxRetries=3;_slippagePct=1;setOrder(e){return this._order=e,this}withBeneficiary(e){return this._beneficiary=e,this}withMaxRetries(e){return this._maxRetries=e,this}withSlippage(e){return this._slippagePct=e,this}get order(){if(!this._order)throw new Error("Order not set. Use setOrder().");return this._order}get beneficiary(){if(!this._beneficiary)throw new Error("Beneficiary not set. Use withBeneficiary().");return this._beneficiary}get maxRetries(){return this._maxRetries}get slippagePct(){return this._slippagePct}async build(){let{type:e}=this.order;switch(e){case"Dca":return this.buildDcaTx();case"TwapSell":return this.buildTwapSellTx();case"TwapBuy":return this.buildTwapBuyTx();default:throw new Error(`Unsupported TradeOrderType: ${e}`)}}buildDcaTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradePeriod:i,tradeRoute:o}=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:o}}},null);return this.wrapTx("DcaSchedule",a)}buildTwapSellTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:o,tradeRoute:a}=this.order,n=z(i,this.slippagePct),l=i.minus(n),c=this.api.tx.dca.schedule({owner:this.beneficiary,period:o,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Sell:{assetIn:t,assetOut:r,amountIn:s.toFixed(),minAmountOut:l.toFixed(),route:a}}},null);return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:o,tradeRoute:a}=this.order,n=z(s,this.slippagePct),l=s.plus(n),c=this.api.tx.dca.schedule({owner:this.beneficiary,period:o,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Buy:{assetIn:t,assetOut:r,amountOut:i.toFixed(),maxAmountIn:l.toFixed(),route:a}}},null);return this.wrapTx("DcaSchedule.twapBuy",c)}};var Se=class{api;evm;constructor(e,t){this.api=e,this.evm=t}trade(e){return new Xe(this.api,this.evm).setTrade(e)}order(e){return new Ye(this.api,this.evm).setOrder(e)}};var ds={router:{}};function Vm(p,e=ds){let t=new ne(p),r=new Re(p),s=new ue(p,r),i=new $(r),o=new be(s,e.router),a=new fe(o,{blockTime:t.blockTime,minBudgetInNative:t.minOrderBudget});return{api:{aave:i,router:o,scheduler:a},client:{asset:new Q(p),balance:new H(p),balanceV2:new ie(p)},ctx:{pool:s},evm:r,tx:new Se(p,r),destroy:()=>{s.destroy()}}}export{te as AaveClient,Ee as AavePool,ke as AavePoolClient,$ as AaveUtils,Q as AssetClient,yt as AssetNotFound,ws as BASILISK_PARACHAIN_ID,H as BalanceClient,ie as BalanceClientV2,v as BigNumber,ue as CachingPoolService,ne as ChainParams,Xt as DECIMAL_PLACES,Nt as DEFAULT_BLOCK_TIME,Rt as DEFAULT_MIN_BUDGET,X as ERC20,Re as EvmClient,Ze as FarmClient,W as H160,we as HUB_ASSET_ID,Os as HYDRADX_PARACHAIN_ID,L as HYDRADX_SS58_PREFIX,Ds as INFINITY,U as LbpMath,_e as LbpPool,De as LbpPoolClient,ae as MmOracleClient,N as ONE,Et as ORDER_MIN_BLOCK_PERIOD,F as OmniMath,Me as OmniPool,Le as OmniPoolClient,lt as PERBILL_DENOMINATOR,V as PERMILL_DENOMINATOR,_ as PolkadotApiClient,ht as PoolConfigNotFound,j as PoolError,me as PoolFactory,Fe as PoolNotFound,ce as PoolService,E as PoolType,ft as ProviderConfigNotFound,re as RUNTIME_DECIMALS,Ne as RouteNotFound,he as Router,ct as SYSTEM_ASSET_DECIMALS,R as SYSTEM_ASSET_ID,k as StableMath,J as StableSwap,Ue as StableSwapClient,bt as StorageConfigNotFound,Pt as SubscriptionNotSupported,se as TRADEABLE_DEFAULT,Pe as TWAP_BLOCK_PERIOD,at as TWAP_MAX_DURATION,nt as TWAP_MAX_PRICE_IMPACT,ju as TWAP_TX_MULTIPLIER,Ft as TradeOrderError,it as TradeOrderType,G as TradeRouteBuilder,be as TradeRouter,fe as TradeScheduler,st as TradeType,Se as TxBuilderFactory,K as XykMath,He as XykPool,Ge as XykPoolClient,B as ZERO,xn as bnFormatter,m as bnum,At as calculateBuyFee,Iu as calculateDiffToAvg,ye as calculateDiffToRef,It as calculateSellFee,St as createChain,Vm as createSdkContext,Ce as findNestedKey,Bn as findNestedObj,z as getFraction,Mc as hashPools,Ut as isEvmAccount,qt as isEvmAddress,Wt as isSs58Address,A as scale,Ms as toBn,O as toDecimals};
|
|
1
|
+
var we=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Supply",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"address",name:"to",type:"address"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"onBehalfOf",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"enum DataTypes.InterestRateMode",name:"interestRateMode",type:"uint8"},{indexed:!1,internalType:"uint256",name:"borrowRate",type:"uint256"},{indexed:!0,internalType:"uint16",name:"referralCode",type:"uint16"}],name:"Borrow",type:"event"},{inputs:[{internalType:"address",name:"asset",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"interestRateMode",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"address",name:"onBehalfOf",type:"address"}],name:"borrow",outputs:[],stateMutability:"nonpayable",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"reserve",type:"address"},{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!0,internalType:"address",name:"repayer",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bool",name:"useATokens",type:"bool"}],name:"Repay",type:"event"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"getUserAccountData",outputs:[{internalType:"uint256",name:"totalCollateralBase",type:"uint256"},{internalType:"uint256",name:"totalDebtBase",type:"uint256"},{internalType:"uint256",name:"availableBorrowsBase",type:"uint256"},{internalType:"uint256",name:"currentLiquidationThreshold",type:"uint256"},{internalType:"uint256",name:"ltv",type:"uint256"},{internalType:"uint256",name:"healthFactor",type:"uint256"}],stateMutability:"view",type:"function"}];var je=[{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 lt="0x1b02E051683b5cfaC5929C25E84adb26ECf87B38",ze="0x112b087b60C1a166130d59266363C45F8aa99db0",Je="0xf3Ba4D1b50f78301BDD7EAEa9B67822A15FCA691",J=1000000n;var ws=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");var te=class{rpcAdapter;constructor(e){this.rpcAdapter=e.getRPCAdapter()}async getBlockTimestamp(){let e=await this.rpcAdapter.getBlock();return Number(e.timestamp)}async getReservesData(){return await this.rpcAdapter.readContract({abi:je,address:ze,functionName:"getReservesData",args:[Je]})}async getUserReservesData(e){return await this.rpcAdapter.readContract({abi:je,address:ze,functionName:"getUserReservesData",args:[Je,e]})}async getUserAccountData(e){return await this.rpcAdapter.readContract({abi:we,address:lt,functionName:"getUserAccountData",args:[e]})}};import{decodeAddress as Oe,encodeAddress as mt}from"@polkadot/util-crypto";import{hexToU8a as Ht,isHex as Gt,u8aToHex as Ut}from"@polkadot/util";import{Buffer as Y}from"buffer";var Fs=2090,V=1e6,ct=1e9,Te="1",Rs=2034,L=63,re=18,N="0",ut=12,se=15;var Ze="ETH\0";function qt(p){if(!p)return!1;try{let e=Oe(p,!0),t=Y.from(Ze);return Y.from(e.subarray(0,t.length)).equals(t)}catch{return!1}}function Wt(p){return!!/^0x[a-fA-F0-9]{40}$/.test(p)}function Xt(p){try{let e=Gt(p)?Ht(p):Oe(p);return mt(e),!0}catch{return!1}}var W=class p{static toAccount=e=>{let t=Y.from(e.slice(2),"hex"),r=Y.from(Ze);return mt(new Uint8Array(Y.concat([r,t,Y.alloc(8)])),63)};static fromAccount=e=>{let t=Oe(e),r=Y.from(Ze),s=t.slice(r.length,-8);return"0x"+Y.from(s).toString("hex")};static fromSS58=e=>{let r=Oe(e).slice(0,20);return Ut(r)};static fromAny=e=>{if(Wt(e))return e;if(qt(e))return p.fromAccount(e);if(Xt(e))return p.fromSS58(e);throw new Error("Unknown address type")}};import{Buffer as Ie}from"buffer";var X=class{static fromAssetId(e){let t=Number(e),r=Ie.alloc(20,0);return r[15]=1,r.writeUInt32BE(t,16),"0x"+r.toString("hex")}static toAssetId(e){let t=Ie.from(e.replace("0x",""),"hex");return t.length!==20||!this.isAssetAddress(e)?null:t.readUInt32BE(16)}static isAssetAddress(e){let t=Ie.from("0000000000000000000000000000000100000000","hex"),r=Ie.from(e.replace("0x",""),"hex");return r.length!==20?!1:r.subarray(0,16).equals(t.subarray(0,16))}};import{BigNumber as v}from"bignumber.js";var Yt=12;v.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:4,DECIMAL_PLACES:Yt});var B=m(0),R=m(1),Gs=m("Infinity");function A(p,e){let t=new v(e.toString()),r=new v(10).pow(t);return p.times(r).decimalPlaces(4)}function m(p){return new v(p.toString())}function Us(p,e){let t=m(p);return A(t,e)}function O(p,e){return p.shiftedBy(-1*e).toString()}var Ae=m("1e27"),Kt=m("1.01"),Vt=m("31536000"),$=class{client;constructor(e){this.client=new te(e)}async getSummary(e){let t=W.fromAny(e),[r,s,i,o]=await Promise.all([this.client.getReservesData(),this.client.getUserReservesData(t),this.client.getUserAccountData(t),this.client.getBlockTimestamp()]),[n]=r,[a,l]=s,[c,u,d,h,g,b]=i,y=m(b).dividedBy(1e18).decimalPlaces(6,v.ROUND_DOWN),S=m(c),f=m(u),x=[];for(let I of a){let w=I.underlyingAsset.toLowerCase(),T=n.find(({underlyingAsset:Lt})=>Lt.toLowerCase()===w);if(!T)throw new Error("Missing pool reserve for "+w);let C=m(I.scaledATokenBalance),M=m(T.liquidityIndex),Be=m(T.liquidityRate),xe=m(T.availableLiquidity),Ve=m(T.priceInMarketReferenceCurrency),$e=o+6,Qe=this.calculateLinearInterest(Be,T.lastUpdateTimestamp,$e),ve=M.multipliedBy(Qe).dividedBy(Ae).decimalPlaces(0,v.ROUND_DOWN),kt=C.multipliedBy(ve).dividedBy(Ae).decimalPlaces(0,v.ROUND_DOWN),_t=m(l!==0&&l===T.eModeCategoryId?T.eModeLiquidationThreshold:T.reserveLiquidationThreshold).div(1e4),Dt=T.usageAsCollateralEnabled&&I.usageAsCollateralEnabledOnUser&&m(I.scaledATokenBalance).gt(0),Mt=X.toAssetId(w);x.push({aTokenBalance:kt,availableLiquidity:xe,decimals:Number(T.decimals),isCollateral:Dt,priceInRef:Ve,reserveId:Mt,reserveAsset:w,reserveLiquidationThreshold:_t})}return{healthFactor:y.toNumber(),totalCollateral:S,totalDebt:f,reserves:x}}async hasBorrowPositions(e){let t=W.fromAny(e),r=await this.client.getUserAccountData(t),[s,i]=r;return i>0n}async getHealthFactor(e){let t=W.fromAny(e),r=await this.client.getUserAccountData(t),[s,i,o,n,a,l]=r;return m(l).dividedBy(1e18).decimalPlaces(6,v.ROUND_DOWN).toNumber()}async getHealthFactorAfterWithdraw(e,t,r){let{totalCollateral:s,totalDebt:i,reserves:o}=await this.getSummary(e),n=X.fromAssetId(t),a=o.find(S=>S.reserveAsset===n);if(!a)throw new Error("Missing reserve ctx for "+n);let{decimals:l,isCollateral:c,priceInRef:u,reserveLiquidationThreshold:d}=a,h=A(m(r),l).decimalPlaces(0,1),g=c?h.multipliedBy(u).dividedBy(m(10).pow(l)).decimalPlaces(0,v.ROUND_DOWN):B,b=s.minus(g);return b.lte(0)?0:b.multipliedBy(d).dividedBy(i).decimalPlaces(6,v.ROUND_DOWN).toNumber()}async getHealthFactorAfterSupply(e,t,r){let{totalCollateral:s,totalDebt:i,reserves:o}=await this.getSummary(e),n=X.fromAssetId(t),a=o.find(y=>y.reserveAsset===n);if(!a)throw new Error("Missing reserve ctx for "+n);let{decimals:l,priceInRef:c,reserveLiquidationThreshold:u}=a,h=A(m(r),l).decimalPlaces(0,1).multipliedBy(c).dividedBy(m(10).pow(l)).decimalPlaces(0,v.ROUND_DOWN),g=s.plus(h);return g.lte(0)?0:g.multipliedBy(u).dividedBy(i).decimalPlaces(6,v.ROUND_DOWN).toNumber()}async getMaxWithdraw(e,t){let{totalDebt:r,reserves:s,healthFactor:i}=await this.getSummary(e),o=X.fromAssetId(t),n=s.find(a=>a.reserveAsset===o);if(!n)throw new Error("Missing reserve data for "+o);return this.calculateWithdrawMax(n,r,i)}async getMaxWithdrawAll(e){let{totalDebt:t,reserves:r,healthFactor:s}=await this.getSummary(e),i={};for(let o of r){let n=this.calculateWithdrawMax(o,t,s);o.reserveId&&(i[o.reserveId]=n)}return i}calculateWithdrawMax(e,t,r){let{aTokenBalance:s,availableLiquidity:i,decimals:o,priceInRef:n,reserveLiquidationThreshold:a,isCollateral:l}=e,c=s;if(l&&t.gt(0)){let d=m(r).minus(Kt);if(d.gt(0)){let g=d.multipliedBy(t).dividedBy(a).decimalPlaces(0,v.ROUND_DOWN).dividedBy(n).multipliedBy(m(10).pow(o)).decimalPlaces(0,v.ROUND_DOWN);c=v.minimum(s,g)}else c=B}return{amount:v.minimum(c,i),decimals:o}}calculateLinearInterest(e,t,r){let s=r-t;return s<=0?Ae:e.multipliedBy(s).dividedBy(Vt).plus(Ae).decimalPlaces(0,v.ROUND_DOWN)}};function pt(p){switch(p){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 _=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");pt(r)&&console.log(e,...t)}};var Q=class extends _{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=="0"){let u=this.api.consts.balances.existentialDeposit;return{id:"0",name:this.getSystemTokenName(this.chainToken),symbol:this.chainToken,decimals:this.chainDecimals,icon:this.chainToken,type:"Token",isSufficient:!0,existentialDeposit:u.toString()}}let{name:i,assetType:o,isSufficient:n,existentialDeposit:a}=t,{symbol:l,decimals:c}=r.get(e)??{};return{id:e,name:i.toHuman(),symbol:l,decimals:c,icon:l,type:o.toHuman(),isSufficient:n?n.toHuman():!0,location:s?.toJSON(),existentialDeposit:a.toString()}}getBond(e,t,r,s){let[i,o]=s,{assetType:n,isSufficient:a,existentialDeposit:l}=t,{symbol:c,decimals:u}=this.getToken(i.toString(),t,r),d=o.toNumber(),h=new Intl.DateTimeFormat("en-GB"),g=[c,"Bond",h.format(d)].join(" ");return{id:e,name:g,symbol:c+"b",decimals:u,icon:c,type:n.toString(),isSufficient:a.toHuman(),existentialDeposit:l.toString(),underlyingAssetId:i.toString(),maturity:d}}getShares(e,t,r,s){let{assets:i}=s,{name:o,symbol:n,assetType:a,isSufficient:l,existentialDeposit:c}=t,d=i.map(b=>b.toString()).map(b=>{let{symbol:y}=this.getToken(b,t,r);return[b,y]}),h=Object.fromEntries(d),g=Object.values(h);return{id:e,name:g.join(", "),symbol:n?.isSome?n.toHuman():o.toHuman(),decimals:18,icon:g.join("/"),type:a.toString(),isSufficient:l.toHuman(),existentialDeposit:c.toString(),meta:h}}getExternal(e,t,r,s){let i=this.getToken(e,t,new Map,s),o=r?.find(n=>n.internalId===i.id);return o?{...i,decimals:o.decimals,name:o.name,symbol:o.symbol,icon:o.symbol,isWhiteListed:o.isWhiteListed}:i}normalizeMetadata(e,t){return t.size?t:new Map(e.map(([{args:[r]},s])=>{let{decimals:i,symbol:o}=s.unwrap();return[r.toString(),{decimals:Number(i.toString()),symbol:o.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,o,n]=await Promise.all([this.api.query.assetRegistry.assets.entries(),this.locationsQuery(),this.safeSharesQuery(),this.safeBondsQuery(),this.metadataQuery()]),a=this.getSupportedAssets(r),l=this.normalizeMetadata(a,n),c=a.map(([{args:[u]},d])=>{let h=d.unwrap(),g=s.get(u.toString()),{assetType:b}=h;switch(b.toString()){case"Bond":let y=o.get(u.toString());return this.getBond(u.toString(),h,l,y);case"StableSwap":let S=i.get(u.toString());return this.getShares(u.toString(),h,l,S);case"External":return this.getExternal(u.toString(),h,t,g);default:return this.getToken(u.toString(),h,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 H=class extends _{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==="0"?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("0",this.calculateFreeBalance(r)))}async subscribeSystemBalances(e,t){return this.api.query.system.account.multi(e,r=>{let s=[];r.forEach((i,o)=>{let n=this.calculateFreeBalance(i.data),a=e[o];s.push([a,n])}),t(s)})}async subscribeTokenBalance(e,t,r){let s=await this.api.query.tokens.accounts.keys(e),i=r?r.map(o=>[e,o]):s.map(({args:[o,n]})=>[o.toString(),n.toString()]);return this.api.query.tokens.accounts.multi(i,o=>{let n=[];o.forEach((a,l)=>{let c=this.calculateFreeBalance(a),u=i[l][1];n.push([u,c])}),t(n)})}async subscribeTokenBalances(e,t){return this.api.query.tokens.accounts.multi(e,r=>{let s=[];r.forEach((i,o)=>{let n=this.calculateFreeBalance(i),a=e[o];s.push([a,n])}),t(s)})}async subscribeErc20Balance(e,t,r){let i=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([a,l])=>{let{assetType:c}=l.unwrap();return c.toString()==="Erc20"}).map(([{args:[a]}])=>a.toString()))(),o=async()=>{let n=await Promise.all(i.map(async a=>[a,await this.getErc20Balance(e,a)]));t(n)};return this.api.rpc.chain.subscribeNewHeads(async()=>{o()})}async subscribeErc20Balances(e,t){let r=async()=>{let s=await Promise.all(e.map(async i=>{let[o,n]=i;return[i,await this.getErc20Balance(o,n)]}));t(s)};return this.api.rpc.chain.subscribeNewHeads(async()=>{r()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateFreeBalance(e){let t=e.free.toString(),r=e.frozen.toString();return v(t).lt(r)?v(0):v(t).minus(r)}};var ie=class extends _{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==="0"?this.getSystemBalance(e):this.getTokenBalance(e,t)}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)}async getErc20Balance(e,t){let r=await this.getTokenBalanceData(e,t);return this.calculateBalance(r)}async subscribeSystemBalance(e,t){return this.api.query.system.account(e,({data:r})=>t("0",this.calculateBalance(r)))}async subscribeTokenBalance(e,t,r){let s=await this.api.query.tokens.accounts.keys(e),i=r?r.map(o=>[e,o]):s.map(({args:[o,n]})=>[o.toString(),n.toString()]);return this.api.query.tokens.accounts.multi(i,o=>{let n=[];o.forEach((a,l)=>{let c=i[l][1],u=this.calculateBalance(a);n.push([c,u])}),t(n)})}async subscribeErc20Balance(e,t,r){let i=r||await(async()=>(await this.api.query.assetRegistry.assets.entries()).filter(([a,l])=>{let{assetType:c}=l.unwrap();return c.toString()==="Erc20"}).map(([{args:[a]}])=>a.toString()))(),o=async()=>{let n=await Promise.all(i.map(async a=>[a,await this.getErc20Balance(e,a)]));t(n)};return this.api.rpc.chain.subscribeNewHeads(async()=>{o()})}async getTokenBalanceData(e,t){return this.api.call.currenciesApi.account(t,e)}calculateBalance(e){let t=v(e.free.toString()),r=e.frozen.toString(),s=e.reserved.toString(),i=t.gte(r)?t.minus(r).toString():"0",o=t.plus(s).toString();return{free:t.toString(),total:o,transferable:i,reserved:s,frozen:r}}};var ae=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()),m(this._minOrderBudget)}};import{fixed_from_rational as dt}from"@galacticcouncil/math-liquidity-mining";import{GenericAccountId32 as $t}from"@polkadot/types";import{u8aConcat as gt}from"@polkadot/util";import{isAddress as ht}from"@polkadot/util-crypto";var et=class extends _{balanceClient;constructor(e){super(e),this.balanceClient=new H(e)}secondsInYear=new v(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[,o]=s.args,n=i.unwrap().toString(),a=o.toString(),l=(await this.api.query.omnipoolWarehouseLM.globalFarm(a)).unwrap(),c=(await this.api.query.omnipoolWarehouseLM.yieldFarm(e,a,n)).unwrap(),u=await this.getOraclePrice(l)??l.priceAdjustment.toString(),h=this.getAccountResolver(this.api.registry)(Number(a),!1).toString(),g=l.rewardCurrency.toString(),b=await this.balanceClient.getTokenBalanceData(h,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:u,potBalance:b.free.toString()}}))}async getIsolatedPoolFarms(e){let t=await this.api.query.xykWarehouseLM.activeYieldFarm.entries(e);return await Promise.all(t.map(async([s,i])=>{let[,o]=s.args,n=i.unwrap().toString(),a=o.toString(),l=(await this.api.query.xykWarehouseLM.globalFarm(a)).unwrap(),c=(await this.api.query.xykWarehouseLM.yieldFarm(e,a,n)).unwrap(),u=await this.getOraclePrice(l)??l.priceAdjustment.toString(),h=this.getAccountResolver(this.api.registry)(Number(a),!0).toString(),g=l.rewardCurrency.toString(),b=await this.balanceClient.getTokenBalanceData(h,g);return{assetId:e,globalFarm:l,yieldFarm:c,priceAdjustment:u,potBalance:b.free.toString()}}))}async getOraclePrice(e){let t=e.rewardCurrency.toString(),r=e.incentivizedAsset.toString(),s=[t,r].sort();if(t===r)return new v(1).shiftedBy(18).toString();let i=await this.api.query.emaOracle.oracles("omnipool",s,"TenMinutes");if(i.isNone)return;let[o]=i.unwrap(),n=o.price.n.toString(),a=o.price.d.toString(),l;return Number(t)<Number(r)?l=dt(n,a):l=dt(a,n),l}getGlobalRewardPerPeriod(e,t,r,s){let o=e.times(t).shiftedBy(-18).times(s).shiftedBy(-18);return o.gte(r)?r:o}getPoolYieldPerPeriod(e,t,r,s){return e.times(t).div(r.times(s).shiftedBy(-18))}padEndU8a(e,t){return gt(e,Array(Math.max(0,t-e.length)).fill(0))}getAccountResolver=e=>(t,r)=>{let s="modl",i=r?"0x78796b4c4d704944":"0x4f6d6e6957684c4d";return new $t(e,this.padEndU8a(gt(s,i,typeof t!="number"?t.toU8a():[t]),32))};async getFarmApr(e,t){if(t==="isolatedpool"&&!ht(e))throw new Error("You must pass an address of isolated pool as id");if(t==="omnipool"&&ht(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:n,globalFarm:a,priceAdjustment:l,potBalance:c})=>{let u=new v(a.totalSharesZ.toString()),d=a.plannedYieldingPeriods.toString(),h=new v(a.yieldPerPeriod.toString()),g=new v(a.maxRewardPerPeriod.toString()),b=a.blocksPerPeriod.toString(),y=new v(n.multiplier.toString()).shiftedBy(-18),S=this.secondsInYear.div(new v(r).times(b)),f;if(u.isZero())f=h.times(y).times(S);else{let C=this.getGlobalRewardPerPeriod(u,h,g,l);f=this.getPoolYieldPerPeriod(C,y,u,l).times(S)}let x=new v(a.pendingRewards.toString()).plus(a.accumulatedPaidRewards.toString()),I=g.times(d),w=c?x.plus(c):I;return x.div(w).gte(.999)?B:f.div(t==="isolatedpool"?2:1).times(100)}).reduce((n,a)=>n.plus(a),B).toString():void 0}};var Fe=class extends Error{constructor(e){super(),this.message=`${e} pool invalid`,this.name="PoolNotFound"}},yt=class extends Error{constructor(e,t){super(),this.message=`${e} pool missing ${t}`,this.name="PoolConfigNotFound"}},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"}},Pt=class extends Error{constructor(e){super(),this.message=`Storage missing ${e}`,this.name="StorageConfigNotFound"}},ft=class extends Error{constructor(e){super(),this.message=`Subscription type "${e}" not supported`,this.name="SubscriptionNotSupported"}},St=class extends Error{constructor(e){super(),this.message=`${e}`,this.name="ProviderConfigNotFound"}};import{encodeFunctionData as Qt,decodeFunctionResult as jt}from"viem";var zt=1e7,Ne=class{api;constructor(e){this.api=e}async getBlock(){let e=await this.api.query.ethereum.currentBlock(),{header:t}=e.unwrap(),r=t.timestamp.toBigInt()/1000n,s=t.number.toBigInt();return{timestamp:r,number:s}}readContract=(async e=>{let{abi:t,address:r,functionName:s,args:i}=e,o=Qt({abi:t,functionName:s,args:i}),n=await this.api.call.ethereumRuntimeRPCApi.call("",r,o,0,zt,null,null,null,!1,[]);if(n.isErr)throw console.error(s,n.asErr.toHuman()),new Error("Contract read failure");let{value:a,exitReason:l,usedGas:c}=n.asOk;if(l.isSucceed)return jt({abi:t,functionName:s,data:a.toHex()});throw console.log(s,l.toString(),c.toHuman()),new Error("Contract read error")})};import{defineChain as Jt}from"viem";var Zt=["wss://hydration-rpc.n.dwellir.com","wss://hydration.dotters.network","wss://rpc.helikon.io/hydradx","wss://hydration.ibp.network","wss://rpc.cay.hydration.cloud","wss://rpc.parm.hydration.cloud","wss://rpc.roach.hydration.cloud","wss://rpc.zipp.hydration.cloud","wss://rpc.sin.hydration.cloud","wss://rpc.coke.hydration.cloud"],Bt=p=>{let t=[p.endpoint,...Zt],r=Array.from(new Set(t.map(s=>s.replace("wss://","https://").replace("ws://","http://"))));return Jt({id:222222,name:"Hydration",network:"hydration",nativeCurrency:{decimals:18,name:"WETH",symbol:"WETH"},rpcUrls:{default:{http:r}},blockExplorers:{default:{name:"Hydration Explorer",url:"https://hydration.subscan.io"}},testnet:!1})};import{createPublicClient as vt,createWalletClient as er,custom as tr,http as rr}from"viem";function xt(p){let e=async({method:t,params:r})=>{let s=Array.isArray(r)?r:[];return p.send(t,s)};return()=>({request:e,config:{name:"PolkadotWsTransport",type:"webSocket",key:"polkadotWs",request:e}})}var Ee=class{api;chain;constructor(e){this.api=e,this.chain=Bt(this.provider)}get provider(){let{provider:e}=this.api._options;return e}get chainId(){return this.chain.id}get chainCurrency(){return this.chain.nativeCurrency.symbol}get chainDecimals(){return this.chain.nativeCurrency.decimals}getProvider(){return vt({chain:this.chain,transport:rr()})}getWsProvider(){return vt({chain:this.chain,transport:xt(this.provider)})}getSigner(e){return er({account:e,chain:this.chain,transport:tr(window.ethereum)})}getRPCAdapter(){return new Ne(this.api)}};var tt=[{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{rpcAdapter;constructor(e){this.rpcAdapter=e.getRPCAdapter()}async getData(e,t=6){let[r,s,i]=await Promise.all([this.rpcAdapter.readContract({abi:tt,address:e,functionName:"latestRoundData"}),this.rpcAdapter.readContract({abi:tt,address:e,functionName:"decimals"}),this.rpcAdapter.getBlock()]),[o,n,a,l]=r,c=i.number-(i.timestamp-l)/BigInt(t),u=Number(c);return{price:n,decimals:s,updatedAt:u<0?0:u}}};import{memoize1 as ps}from"@thi.ng/memoize";var E=(o=>(o.Aave="Aave",o.LBP="Lbp",o.Omni="Omnipool",o.Stable="Stableswap",o.XYK="Xyk",o.HSM="Hsm",o))(E||{}),j=(c=>(c.UnknownError="UnknownError",c.FacilitatorCapacityExceeded="FacilitatorCapacityExceeded",c.InsufficientTradingAmount="InsufficientTradingAmount",c.InsufficientCollateral="InsufficientCollateral",c.MaxHoldingExceeded="MaxHoldingExceeded",c.MaxInRatioExceeded="MaxInRatioExceeded",c.MaxOutRatioExceeded="MaxOutRatioExceeded",c.TradeNotAllowed="TradeNotAllowed",c.MaxBuyBackExceeded="MaxBuyBackExceeded",c.MaxBuyPriceExceeded="MaxBuyPriceExceeded",c))(j||{});var Ce=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new p(e)}constructor(e){this.type="Aave",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit}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 o=m(s.balance),n=m(i.balance);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:o,balanceOut:n,assetInED:B,assetOutED:B}}validateAndBuy(e,t){let r=this.calculateInGivenOut(e,t),s=[];return t.isGreaterThan(e.balanceOut)&&s.push("TradeNotAllowed"),{amountIn:r,calculatedIn:r,amountOut:t,feePct:0,errors:s}}validateAndSell(e,t){let r=this.calculateOutGivenIn(e,t),s=[];return r.isGreaterThan(e.balanceOut)&&s.push("TradeNotAllowed"),{amountIn:t,calculatedOut:r,amountOut:r,feePct:0,errors:s}}calculateInGivenOut(e,t){return t}calculateOutGivenIn(e,t){return t}spotPriceInGivenOut(e){return A(R,e.decimalsOut)}spotPriceOutGivenIn(e){return A(R,e.decimalsIn)}calculateTradeFee(e,t){return B}};import{encodeAddress as ar}from"@polkadot/util-crypto";import{stringToU8a as nr}from"@polkadot/util";import{decodeEventLog as or}from"viem";import{memoize1 as sr}from"@thi.ng/memoize";import{TLRUCache as ir}from"@thi.ng/cache";var D=class extends H{evm;mmOracle;pools=[];subs=[];assets=new Map([]);mem=0;onNewBlockHandler;onEventsHandler;memPoolsCache=new ir(null,{maxlen:1,ttl:3600*1e3,release:e=>{this.mem>e&&this.log(this.getPoolType(),`mem ${e} released at`,new Date)}});memPools=sr(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),this.onNewBlockHandler=this.onNewBlock.bind(this),this.onEventsHandler=this.onEvents.bind(this)}onNewBlock(e){}onEvents(e){}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 this.memPools(this.mem)}async getPools(){this.unsubscribe(),this.pools=await this.loadPools();let e=this.subscribeBalances(),t=this.subscribeUpdates();this.subs.push(e),this.subs.push(t);let r=this.getPoolType();return this.log(r,`mem ${this.mem} pools(${this.augmentedPools.length})`),this.log(r,`mem ${this.mem} subs(${this.subs.length})`),this.augmentedPools}async subscribeBalances(){let e=[],t=[],r=[],s=[];for(let n of this.augmentedPools){let{address:a,tokens:l}=n;l.filter(c=>c.id==="0").forEach(()=>{e.push(a)}),l.filter(c=>["Token","StableSwap"].includes(c.type)&&c.id!=="0"&&c.id!==n.id).forEach(c=>{t.push([a,c.id])}),l.filter(c=>c.type==="Erc20").forEach(c=>{r.push([a,c.id])})}let i=n=>{n.forEach(([a,l])=>{let c=this.pools.find(u=>u.address===a);if(c){let u=c.tokens.findIndex(d=>d.id==="0");c.tokens[u].balance=l.toString()}})},o=n=>{n.forEach(([a,l])=>{let[c,u]=a,d=this.pools.find(h=>h.address===c);if(d){let h=d.tokens.findIndex(g=>g.id===u);d.tokens[h].balance=l.toString()}})};if(e.length>0){let n=await this.subscribeSystemBalances(e,i);s.push(n)}if(t.length>0){let n=await this.subscribeTokenBalances(t,o);s.push(n)}if(r.length>0){let n=await this.subscribeErc20Balances(r,o);s.push(n)}return()=>{for(let n of s)try{n()}catch(a){console.warn("Balance unsub failed",a)}}}unsubscribe(){this.subs.forEach(e=>{e.then(t=>t()).catch(t=>console.warn("Unsub failed",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}};function ke(p,e){let t=[];return JSON.stringify(p,(r,s)=>(s&&s[e]&&t.push(s),s)),t[0]}function Aa(p,e,t){let r;return JSON.stringify(p,(s,i)=>(i&&i[e]===t&&(r=i),i)),r}var Fa=(p,e)=>typeof e=="bigint"?e.toString():e;var lr=["Supply","Withdraw","Repay","Borrow"],_e=class extends D{getPoolType(){return"Aave"}getPoolId(e,t){let r="aave:"+e+"/"+t;return ar(nr(r.padEnd(32,"\0")),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:0}}getReserveH160Id(e){return e.type==="Erc20"?ke(e.location,"accountKey20").accountKey20.key:X.fromAssetId(e.id)}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,r){return{}}onEvents(e){e.forEach(t=>{let{event:r}=t,s=`${r.section}:${r.method}`;if(s==="router:Executed"){let[i,o]=r.data.toJSON();this.pools.filter(n=>n.tokens.some(a=>a.id===i.toString()||a.id===o.toString())).forEach(n=>{this.log(`Sync AAVE via [router:Executed] :: ${i}:${o}`),this.updatePoolState(n)})}if(s==="evm:Log"){let[i]=r.data.toJSON();try{let{eventName:o,args:n}=or({abi:we,topics:i.topics,data:i.data});if(lr.includes(o)){let a=n.reserve.toLowerCase();this.pools.filter(l=>{let[c]=l.tokens;return this.getReserveH160Id(c).toLowerCase()===a}).forEach(l=>{this.log(`Sync AAVE via [evm:Log] :: ${o} ${a}`),this.updatePoolState(l)})}}catch{}}})}async subscribeBalances(){return()=>{}}async subscribeUpdates(){return()=>{}}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(o=>{let n=o.id===t.id?s.toString():i.toString();return{...o,balance:n}})}};import{calculate_in_given_out as cr,calculate_out_given_in as ur,calculate_linear_weights as mr,calculate_pool_trade_fee as pr,get_spot_price as dr}from"@galacticcouncil/math-lbp";var U=class{static getSpotPrice(e,t,r,s,i){return dr(e,t,r,s,i)}static calculateInGivenOut(e,t,r,s,i){return cr(e,t,r,s,i)}static calculateOutGivenIn(e,t,r,s,i){return ur(e,t,r,s,i)}static calculateLinearWeights(e,t,r,s,i){return mr(e,t,r,s,i)}static calculatePoolTradeFee(e,t,r){return pr(e,t,r)}};var P=class p{static toPct(e){let[t,r]=e;return p.safeDivide(t*100,r)}static toRaw(e){let[t,r]=e;return p.safeDivide(t,r)}static fromPermill(e){return[e,1e6]}static fromPerbill(e){return[e,1e9]}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 De=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;fee;repayFeeApply;static fromPool(e){return new p(e)}constructor(e){this.type="Lbp",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.fee=e.fee,this.repayFeeApply=e.repayFeeApply}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 o=m(s.balance),n=m(i.balance);return{assetIn:e,assetOut:t,balanceIn:o,balanceOut:n,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 o=e.balanceOut.div(this.maxOutRatio);if(t.isGreaterThan(o)&&i.push("MaxOutRatioExceeded"),s===e.assetOut){let n=this.calculateTradeFee(t,r),a=P.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),l=t.plus(n),c=this.calculateInGivenOut(e,l),u=e.balanceIn.div(this.maxInRatio);return c.isGreaterThan(u)&&i.push("MaxInRatioExceeded"),{amountIn:c,calculatedIn:c,amountOut:t,feePct:a,errors:i}}else{let n=this.calculateInGivenOut(e,t),a=e.balanceIn.div(this.maxInRatio);return n.isGreaterThan(a)&&i.push("MaxInRatioExceeded"),{amountIn:n,calculatedIn:n,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 o=e.balanceIn.div(this.maxInRatio);if(t.isGreaterThan(o)&&i.push("MaxInRatioExceeded"),s===e.assetIn){let n=this.calculateOutGivenIn(e,t),a=e.balanceOut.div(this.maxOutRatio);return n.isGreaterThan(a)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:n,amountOut:n,feePct:0,errors:i}}else{let n=this.calculateOutGivenIn(e,t),a=this.calculateTradeFee(n,r),l=P.toPct(this.repayFeeApply?r.repayFee:r.exchangeFee),c=n.minus(a),u=e.balanceOut.div(this.maxOutRatio);return c.isGreaterThan(u)&&i.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:n,amountOut:c,feePct:l,errors:i}}}calculateInGivenOut(e,t){let r=U.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=m(r);return s.isNegative()?B:s}calculateOutGivenIn(e,t){let r=U.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),t.toFixed(0)),s=m(r);return s.isNegative()?B:s}spotPriceInGivenOut(e){let t=U.getSpotPrice(e.balanceOut.toString(),e.balanceIn.toString(),e.weightOut.toString(),e.weightIn.toString(),A(R,e.decimalsOut).toString());return m(t)}spotPriceOutGivenIn(e){let t=U.getSpotPrice(e.balanceIn.toString(),e.balanceOut.toString(),e.weightIn.toString(),e.weightOut.toString(),A(R,e.decimalsIn).toString());return m(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 m(r)}};var Me=class extends D{MAX_FINAL_WEIGHT=A(m(100),6);poolsData=new Map([]);getPoolType(){return"Lbp"}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}}async getPoolDelta(e,t,r){let{start:s,end:i,assets:o,initialWeight:n,finalWeight:a,repayTarget:l,feeCollector:c}=t,u=U.calculateLinearWeights(s.toString(),i.toString(),n.toString(),a.toString(),r),[d,h]=o,g=d.toString(),b=m(u),y=h.toString(),S=this.MAX_FINAL_WEIGHT.minus(m(b)),[f,x,I]=await Promise.all([this.isRepayFeeApplied(g,l.toString(),c.toString()),this.getBalance(e,g),this.getBalance(e,y)]);return{repayFeeApply:f,tokens:[{id:g,weight:b,balance:x.toString()},{id:y,weight:S,balance:I.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>=r&&t<s}async isRepayFeeApplied(e,t,r){let s=m(t);if(s.isZero())return!1;try{return(await this.getBalance(e,r)).isLessThan(s)}catch{return!0}}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,o])=>this.isActivePool(o.unwrap(),r.toNumber())).map(async([{args:[i]},o])=>{let n=o.unwrap(),a=i.toString(),l=await this.getPoolDelta(a,n,r.toString());this.poolsData.set(i.toString(),n);let[c,u]=n.fee;return{address:a,type:"Lbp",fee:P.fromRate(c.toNumber(),u.toNumber()),...l,...this.getPoolLimits()}});return Promise.all(s)}async getPoolFees(e,t,r){let s=this.pools.find(i=>i.address===r);return{repayFee:this.getRepayFee(),exchangeFee:s.fee}}getRepayFee(){let[e,t]=this.api.consts.lbp.repayFee;return P.fromRate(e.toNumber(),t.toNumber())}async subscribeUpdates(){return this.api.query.parachainSystem.validationData(async e=>{let{relayParentNumber:t}=e.unwrap();this.pools.forEach(async r=>{let s=this.poolsData.get(r.address);if(s)if(this.isActivePool(s,t.toNumber())){let o=await this.getPoolDelta(r.address,s,t.toString());Object.assign(r,o)}else{let o=this.pools.findIndex(n=>n.address==r.address);this.pools.splice(o,1)}})})}};import{calculate_in_given_out as gr,calculate_lrna_in_given_out as hr,calculate_out_given_in as yr,calculate_out_given_lrna_in as br,calculate_spot_price as Pr,calculate_lrna_spot_price as fr,calculate_shares as Sr,calculate_liquidity_out as Br,calculate_liquidity_lrna_out as xr,calculate_liquidity_hub_in as vr,is_sell_allowed as wr,is_buy_allowed as Tr,is_add_liquidity_allowed as Or,is_remove_liquidity_allowed as Ir,recalculate_asset_fee as Ar,recalculate_protocol_fee as Fr,verify_asset_cap as Rr}from"@galacticcouncil/math-omnipool";var F=class{static calculateSpotPrice(e,t,r,s){return Pr(e,t,r,s)}static calculateLrnaSpotPrice(e,t){return fr(e,t)}static calculateInGivenOut(e,t,r,s,i,o,n,a,l){return gr(e,t,r,s,i,o,n,a,l)}static calculateLrnaInGivenOut(e,t,r,s,i){return hr(e,t,r,s,i)}static calculateOutGivenIn(e,t,r,s,i,o,n,a,l){return yr(e,t,r,s,i,o,n,a,l)}static calculateOutGivenLrnaIn(e,t,r,s,i){return br(e,t,r,s,i)}static calculateShares(e,t,r,s){return Sr(e,t,r,s)}static calculateLiquidityOut(e,t,r,s,i,o,n,a){return Br(e,t,r,s,i,o,n,a)}static calculateLiquidityLRNAOut(e,t,r,s,i,o,n,a){return xr(e,t,r,s,i,o,n,a)}static calculateCapDifference(e,t,r,s){let i=v(t),o=v(e),n=v(s),l=v(r).shiftedBy(-18);if(i.div(n).lt(l)){let u=l.times(n).minus(i).times(o),d=i.times(v(1).minus(l));return u.div(d).toFixed(0)}else return"0"}static calculateLimitHubIn(e,t,r,s){return vr(e,t,r,s)}static isSellAllowed(e){return wr(e)}static isBuyAllowed(e){return Tr(e)}static isAddLiquidityAllowed(e){return Or(e)}static isRemoveLiquidityAllowed(e){return Ir(e)}static recalculateAssetFee(e,t,r,s,i,o,n,a,l,c,u){return Ar(e,t,r,s,i,o,n,a,l,c,u)}static recalculateProtocolFee(e,t,r,s,i,o,n,a,l,c,u){return Fr(e,t,r,s,i,o,n,a,l,c,u)}static verifyAssetCap(e,t,r,s){return Rr(e,t,r,s)}};var Le=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;hubAssetId;static fromPool(e){return new p(e)}constructor(e){this.type="Omnipool",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.hubAssetId=e.hubAssetId}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 o=m(s.balance),n=m(i.balance),a=m(s.existentialDeposit),l=m(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:o,balanceOut:n,tradeableIn:s.tradeable,tradeableOut:i.tradeable,assetInED:a,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),o=i.minus(s),n=s===B?B:o.div(s).multipliedBy(100).decimalPlaces(4),a=[],l=F.isSellAllowed(e.tradeableIn),c=F.isBuyAllowed(e.tradeableOut);(!l||!c)&&a.push("TradeNotAllowed"),(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 d=e.balanceIn.div(this.maxInRatio);return i.isGreaterThan(d)&&a.push("MaxInRatioExceeded"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:n.toNumber(),errors:a}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,r),n=s.minus(i).div(s).multipliedBy(100).decimalPlaces(4),a=[],l=F.isSellAllowed(e.tradeableIn),c=F.isBuyAllowed(e.tradeableOut);(!l||!c)&&a.push("TradeNotAllowed"),(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 d=e.balanceOut.div(this.maxOutRatio);return i.isGreaterThan(d)&&a.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:n.toNumber(),errors:a}}calculateInGivenOut(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateLrnaInGivenOut(e,t,r);let s=F.calculateInGivenOut(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toRaw(r.assetFee).toString():B.toString(),r?P.toRaw(r.protocolFee).toString():B.toString()),i=m(s);return i.isNegative()?B:i}calculateLrnaInGivenOut(e,t,r){let s=F.calculateLrnaInGivenOut(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toRaw(r.assetFee).toString():B.toString()),i=m(s);return i.isNegative()?B:i}calculateOutGivenIn(e,t,r){if(e.assetIn==this.hubAssetId)return this.calculateOutGivenLrnaIn(e,t,r);let s=F.calculateOutGivenIn(e.balanceIn.toString(),e.hubReservesIn.toString(),e.sharesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toRaw(r.assetFee).toString():B.toString(),r?P.toRaw(r.protocolFee).toString():B.toString()),i=m(s);return i.isNegative()?B:i}calculateOutGivenLrnaIn(e,t,r){let s=F.calculateOutGivenLrnaIn(e.balanceOut.toString(),e.hubReservesOut.toString(),e.sharesOut.toString(),t.toFixed(0),r?P.toRaw(r.assetFee).toString():B.toString()),i=m(s);return i.isNegative()?B:i}spotPriceInGivenOut(e){if(e.assetIn==this.hubAssetId)return this.spotPriceLrnaInGivenOut(e);let t=F.calculateSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString(),e.balanceIn.toString(),e.hubReservesIn.toString());return m(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceLrnaInGivenOut(e){let t=F.calculateLrnaSpotPrice(e.hubReservesOut.toString(),e.balanceOut.toString());return m(t).shiftedBy(-1*(18-e.decimalsOut)).decimalPlaces(0,1)}spotPriceOutGivenIn(e){if(e.assetIn==this.hubAssetId)return this.spotPriceOutGivenLrnaIn(e);let t=F.calculateSpotPrice(e.balanceIn.toString(),e.hubReservesIn.toString(),e.balanceOut.toString(),e.hubReservesOut.toString());return m(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}spotPriceOutGivenLrnaIn(e){let t=F.calculateLrnaSpotPrice(e.balanceOut.toString(),e.hubReservesOut.toString());return m(t).shiftedBy(-1*(18-e.decimalsIn)).decimalPlaces(0,1)}};import{encodeAddress as Nr}from"@polkadot/util-crypto";import{stringToU8a as Er}from"@polkadot/util";import{memoize1 as rt}from"@thi.ng/memoize";import{TLRUCache as Cr}from"@thi.ng/cache";var wt="omnipool",Tt="Short",He=class extends D{dynamicFees=new Map;dynamicFeesConfiguration=new Map;oracles=new Map;memQueryCache=new Cr(null,{ttl:6*1e3});memOracleQuery=rt(e=>{let t=e.split(":");return this.api.query.emaOracle.oracles(wt,t,Tt)},this.memQueryCache);memFeesQuery=rt(e=>this.api.query.dynamicFees.assetFee(e),this.memQueryCache);memFeesConfigurationQuery=rt(e=>this.api.query.dynamicFees.assetFeeConfiguration(e),this.memQueryCache);getPoolType(){return"Omnipool"}getPoolId(){return Nr(Er("modlomnipool".padEnd(32,"\0")),63)}getOracleKey(e){return e==="0"?["0","1"]:["1",e]}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}}async getDynamicFees(e){return this.dynamicFees.has(e)?this.dynamicFees.get(e):this.memFeesQuery(e)}async getDynamicFeesConfiguration(e){return this.dynamicFeesConfiguration.has(e)?this.dynamicFeesConfiguration.get(e):this.memFeesConfigurationQuery(e)}async getOraclePrice(e){let r=this.getOracleKey(e).join(":");return this.oracles.has(r)?this.oracles.get(r):this.memOracleQuery(r)}isSupported(){return this.api.query.omnipool!==void 0}isAssetConfigSupported(){return this.api.query.dynamicFees.assetFeeConfiguration!==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)]),o=r.map(async([{args:[a]},l])=>{let{hubReserve:c,shares:u,tradable:d,cap:h,protocolShares:g}=l.unwrap(),b=await this.getBalance(t,a.toString());return{id:a.toString(),hubReserves:m(c.toString()),shares:m(u.toString()),tradeable:d.bits.toNumber(),balance:b.toString(),cap:m(h.toString()),protocolShares:m(g.toString())}}),n=await Promise.all(o);return n.push({id:e,tradeable:s.bits.toNumber(),balance:i.toString()}),[{address:t,type:"Omnipool",hubAssetId:e,tokens:n,...this.getPoolLimits()}]}async getPoolFees(e,t,r){let s=t.assetOut,i=t.assetIn,o;if(this.isAssetConfigSupported()&&(o=await this.getDynamicFeesConfiguration(s).then(f=>f.unwrapOr(null))),o?.isFixed){let f=o.asFixed.assetFee.toNumber(),x=o.asFixed.protocolFee.toNumber();return{assetFee:P.fromPermill(f),protocolFee:P.fromPermill(x)}}let[n,a,l]=await Promise.all([this.getDynamicFees(s),this.getOraclePrice(s),this.getOraclePrice(i)]),[c,u,d]=this.getAssetFee(t,e,n,a,o?.isDynamic?o.asDynamic.assetFeeParams:void 0),[h,g,b]=i==="1"?[0,0,0]:this.getProtocolFee(t,e,n,l,o?.isDynamic?o.asDynamic.protocolFeeParams:void 0),y=c+h,S=d+b;return{assetFee:P.fromPermill(u),protocolFee:P.fromPermill(g),min:P.fromPermill(y),max:P.fromPermill(S)}}getAssetFee(e,t,r,s,i){let{assetOut:o,balanceOut:n}=e,{minFee:a,maxFee:l,decay:c,amplification:u}=i||this.api.consts.dynamicFees.assetFeeParameters,d=P.fromPermill(a.toNumber()),h=P.fromPermill(l.toNumber());if(r.isNone||s.isNone)return[a.toNumber(),a.toNumber(),l.toNumber()];let[g]=s.unwrap(),{assetFee:b,timestamp:y}=r.unwrap(),S=Math.max(1,t-y.toNumber()),f=g.volume.bIn.toString(),x=g.volume.bOut.toString(),I=g.liquidity.b.toString();o==="0"&&(f=g.volume.aIn.toString(),x=g.volume.aOut.toString(),I=g.liquidity.a.toString());let w=P.fromPermill(b.toNumber()),T=F.recalculateAssetFee(f,x,I,"9",n.toString(),P.toRaw(w).toString(),S.toString(),P.toRaw(d).toString(),P.toRaw(h).toString(),c.toString(),u.toString());return[a.toNumber(),Number(T)*1e6,l.toNumber()]}getProtocolFee(e,t,r,s,i){let{assetIn:o,balanceIn:n}=e,{minFee:a,maxFee:l,decay:c,amplification:u}=i||this.api.consts.dynamicFees.protocolFeeParameters,d=P.fromPermill(a.toNumber()),h=P.fromPermill(l.toNumber());if(r.isNone||s.isNone)return[a.toNumber(),a.toNumber(),l.toNumber()];let[g]=s.unwrap(),{protocolFee:b,timestamp:y}=r.unwrap(),S=Math.max(1,t-y.toNumber()),f=g.volume.bIn.toString(),x=g.volume.bOut.toString(),I=g.liquidity.b.toString();o==="0"&&(f=g.volume.aIn.toString(),x=g.volume.aOut.toString(),I=g.liquidity.a.toString());let w=P.fromPermill(b.toNumber()),T=F.recalculateProtocolFee(f,x,I,"9",n.toString(),P.toRaw(w).toString(),S.toString(),P.toRaw(d).toString(),P.toRaw(h).toString(),c.toString(),u.toString());return[a.toNumber(),Number(T)*1e6,l.toNumber()]}async subscribeUpdates(){let[e]=this.pools,t=e.tokens.map(a=>a.id),r=[],s=await this.api.query.omnipool.assets.multi(t,a=>{e.tokens=a.map((l,c)=>{let u=e.tokens[c];if(l.isNone)return u;let d=l.unwrap();return this.updateTokenState(u,d)})});r.push(s);let i=await this.api.query.dynamicFees.assetFee.multi(t,a=>{a.forEach((l,c)=>{let u=t[c];this.dynamicFees.set(u,l)})});if(r.push(i),this.isAssetConfigSupported()){let a=await this.api.query.dynamicFees.assetFeeConfiguration.multi(t,l=>{l.forEach((c,u)=>{let d=t[u];this.dynamicFeesConfiguration.set(d,c)})});r.push(a)}let o=t.map(a=>{let l=this.getOracleKey(a);return[wt,l,Tt]}),n=await this.api.query.emaOracle.oracles.multi(o,a=>{a.forEach(async(l,c)=>{let u=o[c],[d,h,g]=u;this.oracles.set(h.join(":"),l)})});return r.push(n),()=>{for(let a of r)try{a()}catch(l){console.warn("Omnipool unsubscribe failed",l)}}}updateTokenState(e,t){let{hubReserve:r,shares:s,tradable:i,cap:o,protocolShares:n}=t;return{...e,hubReserves:m(r.toString()),shares:m(s.toString()),cap:m(o.toString()),protocolShares:m(n.toString()),tradeable:i.bits.toNumber()}}};import{calculate_in_given_out as kr,calculate_out_given_in as _r,calculate_pool_trade_fee as Dr,get_spot_price as Mr,calculate_liquidity_in as Lr,calculate_shares as Hr,calculate_spot_price as Gr,calculate_spot_price_with_fee as Ur,calculate_liquidity_out_asset_a as qr,calculate_liquidity_out_asset_b as Wr}from"@galacticcouncil/math-xyk";var K=class{static getSpotPrice(e,t,r){return Mr(e,t,r)}static calculateInGivenOut(e,t,r){return kr(e,t,r)}static calculateOutGivenIn(e,t,r){return _r(e,t,r)}static calculatePoolTradeFee(e,t,r){return Dr(e,t,r)}static calculateLiquidityIn(e,t,r){return Lr(e,t,r)}static calculateSpotPrice(e,t){return Gr(e,t)}static calculateSpotPriceWithFee(e,t,r,s){return Ur(e,t,r,s)}static calculateShares(e,t,r){return Hr(e,t,r)}static calculateLiquidityOutAssetA(e,t,r,s){return qr(e,t,r,s)}static calculateLiquidityOutAssetB(e,t,r,s){return Wr(e,t,r,s)}};var Ge=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;static fromPool(e){return new p(e)}constructor(e){this.type="Xyk",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit}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 o=m(s.balance),n=m(i.balance),a=m(s.existentialDeposit),l=m(i.existentialDeposit);return{assetIn:e,assetOut:t,decimalsIn:s.decimals,decimalsOut:i.decimals,balanceIn:o,balanceOut:n,assetInED:a,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateTradeFee(s,r),o=P.toPct(r.exchangeFee),n=s.plus(i),a=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&a.push("InsufficientTradingAmount");let l=e.balanceOut.div(this.maxOutRatio);t.isGreaterThan(l)&&a.push("MaxOutRatioExceeded");let c=e.balanceIn.div(this.maxInRatio);return n.isGreaterThan(c)&&a.push("MaxInRatioExceeded"),{amountIn:n,calculatedIn:s,amountOut:t,feePct:o,errors:a}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateTradeFee(s,r),o=P.toPct(r.exchangeFee),n=s.minus(i),a=[];(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&a.push("InsufficientTradingAmount");let l=e.balanceIn.div(this.maxInRatio);t.isGreaterThan(l)&&a.push("MaxInRatioExceeded");let c=e.balanceOut.div(this.maxOutRatio);return n.isGreaterThan(c)&&a.push("MaxOutRatioExceeded"),{amountIn:t,calculatedOut:s,amountOut:n,feePct:o,errors:a}}calculateInGivenOut(e,t){let r=K.calculateInGivenOut(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=m(r);return s.isNegative()?B:s}calculateOutGivenIn(e,t){let r=K.calculateOutGivenIn(e.balanceIn.toString(),e.balanceOut.toString(),t.toFixed(0)),s=m(r);return s.isNegative()?B:s}spotPriceInGivenOut(e){let t=K.calculateSpotPrice(e.balanceOut.toString(),e.balanceIn.toString()),r=A(R,18-e.decimalsOut);return m(t).div(r)}spotPriceOutGivenIn(e){let t=K.calculateSpotPrice(e.balanceIn.toString(),e.balanceOut.toString()),r=A(R,18-e.decimalsIn);return m(t).div(r)}calculateTradeFee(e,t){let r=K.calculatePoolTradeFee(e.toString(),t.exchangeFee[0],t.exchangeFee[1]);return m(r)}};var Ue=class extends D{getPoolType(){return"Xyk"}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}}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(),[o,n]=s.unwrap(),[a,l]=await Promise.all([this.getBalance(i,o.toString()),this.getBalance(i,n.toString())]);return{address:i,type:"Xyk",tokens:[{id:o.toString(),balance:a.toString()},{id:n.toString(),balance:l.toString()}],...this.getPoolLimits()}});return Promise.all(t)}async getPoolFees(e,t,r){return{exchangeFee:this.getExchangeFee()}}getExchangeFee(){let[e,t]=this.api.consts.xyk.getExchangeFee;return P.fromRate(e.toNumber(),t.toNumber())}async subscribeUpdates(){return()=>{}}};import{calculate_in_given_out as Xr,calculate_out_given_in as Yr,calculate_amplification as Kr,calculate_add_one_asset as Vr,calculate_liquidity_out_one_asset as $r,calculate_shares as Qr,calculate_shares_for_amount as jr,calculate_spot_price_with_fee as zr,pool_account_name as Jr,recalculate_peg as Zr}from"@galacticcouncil/math-stableswap";var k=class{static getPoolAddress(e){return Jr(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 Kr(e,t,r,s,i)}static calculateInGivenOut(e,t,r,s,i,o,n){return Xr(e,t,r,s,i,o,n)}static calculateAddOneAsset(e,t,r,s,i,o,n){return Vr(e,t,r,s,i,o,n)}static calculateSharesForAmount(e,t,r,s,i,o,n){return jr(e,t,r,s,i,o,n)}static calculateOutGivenIn(e,t,r,s,i,o,n){return Yr(e,t,r,s,i,o,n)}static calculateLiquidityOutOneAsset(e,t,r,s,i,o,n){return $r(e,t,r,s,i,o,n)}static calculateShares(e,t,r,s,i,o){return Qr(e,t,r,s,i,o)}static calculateSpotPriceWithFee(e,t,r,s,i,o,n,a){return zr(e,t,r,s,i,o,n,a)}static recalculatePegs(e,t,r,s,i){let o=Zr(e,t,r,s,i);return JSON.parse(o)}};var Z=class p{type;address;tokens;maxInRatio;maxOutRatio;minTradingLimit;amplification;id;fee;totalIssuance;pegs;pegsFee;static fromPool(e){return new p(e)}constructor(e){this.type="Stableswap",this.address=e.address,this.tokens=e.tokens,this.maxInRatio=e.maxInRatio,this.maxOutRatio=e.maxOutRatio,this.minTradingLimit=e.minTradingLimit,this.amplification=e.amplification,this.id=e.id,this.fee=e.fee,this.totalIssuance=e.totalIssuance,this.pegs=e.pegs,this.pegsFee=e.pegsFee}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 o=m(s.balance),n=m(i.balance),a=m(s.existentialDeposit),l=m(i.existentialDeposit);return{assetIn:e,assetOut:t,balanceIn:o,balanceOut:n,decimalsIn:s.decimals,decimalsOut:i.decimals,tradeableIn:this.id===e?15:s.tradeable,tradeableOut:this.id===t?15:i.tradeable,assetInED:a,assetOutED:l}}validateAndBuy(e,t,r){let s=this.calculateInGivenOut(e,t),i=this.calculateInGivenOut(e,t,r),o=i.minus(s),n=s===B?B:o.div(s).multipliedBy(100).decimalPlaces(4),a=[],l=F.isSellAllowed(e.tradeableIn),c=F.isBuyAllowed(e.tradeableOut);return(!l||!c)&&a.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetInED))&&a.push("InsufficientTradingAmount"),{amountIn:i,calculatedIn:s,amountOut:t,feePct:n.toNumber(),errors:a}}validateAndSell(e,t,r){let s=this.calculateOutGivenIn(e,t),i=this.calculateOutGivenIn(e,t,r),n=s.minus(i).div(s).multipliedBy(100).decimalPlaces(4),a=[],l=F.isSellAllowed(e.tradeableIn),c=F.isBuyAllowed(e.tradeableOut);return(!l||!c)&&a.push("TradeNotAllowed"),(t.isLessThan(this.minTradingLimit)||s.isLessThan(e.assetOutED))&&a.push("InsufficientTradingAmount"),{amountIn:t,calculatedOut:s,amountOut:i,feePct:n.toNumber(),errors:a}}calculateIn(e,t,r){let s=k.calculateInGivenOut(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?P.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=m(s);return i.isNegative()?B:i}calculateAddOneAsset(e,t,r){let s=k.calculateAddOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetIn),this.amplification,this.totalIssuance,r?P.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=m(s);return i.isNegative()?B:i}calculateSharesForAmount(e,t,r){let s=k.calculateSharesForAmount(this.getReserves(),Number(e.assetOut),t.toFixed(0),this.amplification,this.totalIssuance,r?P.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=m(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=k.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetOut,e.assetIn,this.totalIssuance,"0",this.getPegs());if(e.assetOut==this.id)return m(t);if(e.assetIn==this.id){let s=A(R,e.decimalsIn-e.decimalsOut);return m(t).div(s).decimalPlaces(0,1)}let r=A(R,18-e.decimalsIn);return m(t).div(r).decimalPlaces(0,1)}calculateOut(e,t,r){let s=k.calculateOutGivenIn(this.getReserves(),Number(e.assetIn),Number(e.assetOut),t.toFixed(0),this.amplification,r?P.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=m(s);return i.isNegative()?B:i}calculateWithdrawOneAsset(e,t,r){let s=k.calculateLiquidityOutOneAsset(this.getReserves(),t.toFixed(0),Number(e.assetOut),this.amplification,this.totalIssuance,r?P.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=m(s);return i.isNegative()?B:i}calculateShares(e,t,r){let s=k.calculateShares(this.getReserves(),this.getAssets(e.assetIn,t),this.amplification,this.totalIssuance,r?P.toRaw(r.fee).toString():B.toString(),this.getPegs()),i=m(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=k.calculateSpotPriceWithFee(this.id,this.getReserves(),this.amplification,e.assetIn,e.assetOut,this.totalIssuance,"0",this.getPegs());if(e.assetIn==this.id)return m(t);if(e.assetOut==this.id){let s=A(R,e.decimalsOut-e.decimalsIn);return m(t).div(s).decimalPlaces(0,1)}let r=A(R,18-e.decimalsOut);return m(t).div(r).decimalPlaces(0,1)}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 es,encodeAddress as ts}from"@polkadot/util-crypto";var qe=class extends D{poolsData=new Map([]);getPoolType(){return"Stableswap"}getPoolAddress(e){let t=Number(e),r=k.getPoolAddress(t);return ts(es(r),63)}getPoolLimits(){return{maxInRatio:0,maxOutRatio:0,minTradingLimit:this.api.consts.stableswap.minTradingLimit.toNumber()}}async getPoolDelta(e,t,r){let{initialAmplification:s,finalAmplification:i,initialBlock:o,finalBlock:n}=t,a=k.calculateAmplification(s.toString(),i.toString(),o.toString(),n.toString(),r),l=await this.api.query.tokens.totalIssuance(e);return{amplification:a,totalIssuance:l.toString()}}async getPoolTokens(e,t,r){let{assets:s}=r,i=s.map(async o=>{let[n,a]=await Promise.all([this.api.query.stableswap.assetTradability(t,o.toString()),this.getBalance(e,o.toString())]);return{id:o.toString(),tradeable:n.bits.toNumber(),balance:a.toString()}});return Promise.all(i)}isSupported(){return this.api.query.stableswap!==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:[o]},n])=>{try{let a=n.unwrap(),l=o.toString(),c=this.getPoolAddress(l),[u,d,h]=await Promise.all([this.getPoolDelta(l,a,r.toString()),this.getPoolTokens(c,l,a),this.getPoolPegs(l,a,r.toString())]);return d.push({id:l,tradeable:15,balance:u.totalIssuance}),this.poolsData.set(c,a),{address:c,id:l,type:"Stableswap",fee:P.fromPermill(a.fee.toNumber()),tokens:d,...u,...h,...this.getPoolLimits()}}catch(a){return console.warn(`Skipping pool ${o.toString()}
|
|
2
|
+
`,String(a)),null}});return(await Promise.all(s)).filter(o=>o!==null)}async getPoolFees(e,t,r){return{fee:this.pools.find(i=>i.address===r).pegsFee}}async getPoolPegs(e,t,r){let s=await this.api.query.stableswap.poolPegs(e);if(s.isNone)return this.getDefaultPegs(t);let i=s.unwrap(),o=await this.getLatestPegs(t,i,r),n=this.getRecentPegs(i),a=P.fromPermill(t.fee.toNumber()),l=P.fromPerbill(i.maxPegUpdate.toNumber()),[c,u]=k.recalculatePegs(JSON.stringify(n),JSON.stringify(o),r,P.toRaw(l).toString(),P.toRaw(a).toString()),d=Number(c)*1e6;return{pegsFee:P.fromPermill(d),pegs:u}}getDefaultPegs(e){let t=e.fee,r=k.defaultPegs(e.assets.length);return{pegsFee:P.fromPermill(t.toNumber()),pegs:r}}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(([n,a])=>a.toString()),o=s.map(async(n,a)=>{if(n.isOracle){let[l,c,u]=n.asOracle,d=[u.toString(),i[a]].map(f=>Number(f)).sort((f,x)=>f-x),h=await this.api.query.emaOracle.oracles(l,d,c),[{price:g,updatedAt:b}]=h.unwrap(),y=g.n.toString(),S=g.d.toString();return u.toString()===d[0].toString()?[[y,S],b.toString()]:[[S,y],b.toString()]}else if(n.isMmOracle){let l=n.asMmOracle,{price:c,decimals:u,updatedAt:d}=await this.mmOracle.getData(l.toString()),h=10**u;return[[c.toString(),h.toString()],d.toString()]}else{if(n.isValue)return[n.asValue.map(l=>l.toString()),r];throw Error(n.type+" is not supported")}});return Promise.all(o)}async subscribeUpdates(){return this.api.query.system.number(async e=>{let t=e.toString();this.pools.forEach(async r=>{let s=this.poolsData.get(r.address);if(s){let[i,o]=await Promise.all([this.getPoolDelta(r.id,s,t),this.getPoolPegs(r.id,s,t)]),n=r.tokens.map(a=>a.id===r.id?{...a,balance:i.totalIssuance}:a);Object.assign(r,{tokens:n},i,o)}})})}};import{calculate_collateral_in_given_hollar_out as rs,calculate_collateral_out_given_hollar_in as ss,calculate_hollar_in_given_collateral_out as is,calculate_hollar_out_given_collateral_in as as,calculate_imbalance as ns,calculate_max_price as os,calculate_buyback_limit as ls,calculate_buyback_price_with_fee as cs}from"@galacticcouncil/math-hsm";var q=class{static calculateCollateralInGivenHollarOut(e,t,r){return rs(e,t,r)}static calculateCollateralOutGivenHollarIn(e,t,r){return ss(e,t,r)}static calculateHollarOutGivenCollateralIn(e,t,r){return as(e,t,r)}static calculateHollarInGivenCollateralOut(e,t,r){return is(e,t,r)}static calculateImbalance(e,t,r){return ns(e,t,r)}static calculateBuybackLimit(e,t){return ls(e,t)}static calculateBuybackPriceWithFee(e,t,r){return cs(e,t,r)}static calculateMaxPrice(e,t){return os(e,t)}};var We=class p extends Z{hsmAddress;hsmMintCapacity;hollarId;hollarH160;collateralId;collateralBalance;maxBuyPriceCoefficient;maxInHolding;purchaseFee;buyBackFee;buyBackRate;static fromPool(e){return new p(e)}constructor(e){super(e),this.type="Hsm",this.hsmAddress=e.hsmAddress,this.hsmMintCapacity=e.hsmMintCapacity,this.hollarId=e.hollarId,this.hollarH160=e.hollarH160,this.collateralId=e.collateralId,this.collateralBalance=e.collateralBalance,this.maxBuyPriceCoefficient=e.maxBuyPriceCoefficient,this.maxInHolding=e.maxInHolding,this.purchaseFee=e.purchaseFee,this.buyBackFee=e.buyBackFee,this.buyBackRate=e.buyBackRate}validatePair(e,t){return!0}parsePair(e,t){return super.parsePair(e,t)}validateTradeHollarIn(e,t,r,s){let i=this.calculateBuybackLimit(e);t.gt(i)&&s.push("MaxBuyBackExceeded");let o=this.calculateBuyPrice(e,t,r),n=this.calculateMaxPrice(e);return o.gt(n)&&s.push("MaxBuyPriceExceeded"),r.gt(this.collateralBalance)&&s.push("InsufficientCollateral"),s}validateTradeHollarOut(e,t,r){return this.collateralBalance.plus(e).gt(this.maxInHolding)&&r.push("MaxHoldingExceeded"),t.gt(this.hsmMintCapacity)&&r.push("FacilitatorCapacityExceeded"),r}validateTradeConstraints(e,t,r){let s=[];return e.assetIn===this.hollarId?this.validateTradeHollarIn(e,t,r,s):this.validateTradeHollarOut(t,r,s)}validateAndBuy(e,t){let r=this.calculateInGivenOut(e,t),s=this.validateTradeConstraints(e,r,t);return{amountIn:r,calculatedIn:r,amountOut:t,feePct:0,errors:s}}validateAndSell(e,t){let r=this.calculateOutGivenIn(e,t),s=this.validateTradeConstraints(e,t,r);return{amountIn:t,calculatedOut:r,amountOut:r,feePct:0,errors:s}}calculateHollarInGivenCollateralOut(e,t){let r=super.calculateInGivenOut(e,t,{fee:this.fee}),s=q.calculateHollarInGivenCollateralOut(t.toFixed(0),r.toFixed(0),P.toRaw(this.buyBackFee).toString());return m(s)}calculateCollateralInGivenHollarOut(e){let t=this.getCollateralPeg(),r=q.calculateCollateralInGivenHollarOut(e.toFixed(0),JSON.stringify(t),P.toRaw(this.purchaseFee).toString());return m(r)}calculateInGivenOut(e,t){return e.assetOut==this.hollarId?this.calculateCollateralInGivenHollarOut(t):this.calculateHollarInGivenCollateralOut(e,t)}calculateCollateralOutGivenHollarIn(e,t){let r=super.calculateOutGivenIn(e,t,{fee:this.fee}),s=q.calculateCollateralOutGivenHollarIn(t.toFixed(0),r.toFixed(0),P.toRaw(this.buyBackFee).toString());return m(s)}calculateHollarOutGivenCollateralIn(e){let t=this.getCollateralPeg(),r=q.calculateHollarOutGivenCollateralIn(e.toFixed(0),JSON.stringify(t),P.toRaw(this.purchaseFee).toString());return m(r)}calculateOutGivenIn(e,t){return e.assetIn==this.hollarId?this.calculateCollateralOutGivenHollarIn(e,t):this.calculateHollarOutGivenCollateralIn(t)}calculateImbalance(e){let t=this.getCollateralPeg(),r=q.calculateImbalance(e.balanceIn.toString(),JSON.stringify(t),e.balanceOut.toString());return m(r)}calculateBuybackLimit(e){let t=this.calculateImbalance(e),r=q.calculateBuybackLimit(t.toString(),P.toRaw(this.buyBackRate).toString());return m(r)}calculateBuyPrice(e,t,r){let s=t.dividedBy(m(10).pow(e.decimalsIn));return r.dividedBy(m(10).pow(e.decimalsOut)).dividedBy(s)}calculateMaxPrice(e){let t=this.getCollateralPeg(),r=q.calculateMaxPrice(JSON.stringify(t),this.maxBuyPriceCoefficient.toFixed(0)),[s,i]=JSON.parse(r);return m(s).div(m(i)).shiftedBy(-1*e.decimalsOut)}spotPriceInGivenOut(e){let t=A(R,e.decimalsOut);return this.calculateInGivenOut(e,t)}spotPriceOutGivenIn(e){let t=A(R,e.decimalsIn);return this.calculateOutGivenIn(e,t)}getCollateralPeg(){let e=this.tokens.findIndex(s=>s.id!==this.hollarId),t=this.pegs[e],r=this.tokens[e].decimals;return this.isDefaultPeg(t)?[A(R,18).toString(),A(R,r).toString()]:t}isDefaultPeg(e){let[t,r]=e;return Array.isArray(e)&&e.length===2&&t==="1"&&r==="1"}};import{stringToU8a as Ot}from"@polkadot/util";import{encodeAddress as It}from"@polkadot/util-crypto";import{decodeEventLog as us}from"viem";var oe=[{inputs:[{internalType:"address",name:"facilitator",type:"address"}],name:"getFacilitator",outputs:[{type:"tuple",components:[{name:"addr",type:"address"},{name:"label",type:"bytes32"},{name:"bucketCapacity",type:"uint128"},{name:"bucketLevel",type:"uint128"}]}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"facilitator",type:"address"}],name:"getFacilitatorBucket",outputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getFacilitatorsList",outputs:[{internalType:"address[]",name:"",type:"address[]"}],stateMutability:"view",type:"function"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!0,internalType:"bytes32",name:"label",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"bucketCapacity",type:"uint256"}],name:"FacilitatorAdded",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"oldCapacity",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newCapacity",type:"uint256"}],name:"FacilitatorBucketCapacityUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"oldLevel",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newLevel",type:"uint256"}],name:"FacilitatorBucketLevelUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"facilitatorAddress",type:"address"}],name:"FacilitatorRemoved",type:"event"}];var le=class{rpcAdapter;constructor(e){this.rpcAdapter=e.getRPCAdapter()}async getFacilitatorCapacity(e,t){let[r,s]=await this.rpcAdapter.readContract({abi:oe,address:e,functionName:"getFacilitatorBucket",args:[t]});return r-s}};var ms=["FacilitatorBucketCapacityUpdated","FacilitatorBucketLevelUpdated"],Xe=class extends D{stableClient;ghoTokenClient;constructor(e,t,r){super(e,t),this.stableClient=r,this.ghoTokenClient=new le(t)}getPoolType(){return"Hsm"}getPoolId(e){let t="hsm:"+e;return It(Ot(t.padEnd(32,"\0")),63)}getFacilitatorAddress(){return It(Ot("modlpy/hsmod".padEnd(32,"\0")),63)}getHollarAddress(e){return ke(e,"accountKey20").accountKey20.key}isSupported(){return this.api.query.hsm!==void 0}async loadPools(){let e=this.api.consts.hsm.hollarId.toString(),[t,r,s]=await Promise.all([this.api.query.assetRegistry.assetLocations(e),this.api.query.hsm.collaterals.entries(),this.stableClient.getPoolsMem()]);if(r.length===0)return[];let i=this.getFacilitatorAddress(),o=W.fromAny(i),n=this.getHollarAddress(t.unwrap()),a=await this.ghoTokenClient.getFacilitatorCapacity(n,o),l=r.map(async([{args:[u]},d])=>{let h=d.unwrap(),g=u.toString(),{poolId:b,maxBuyPriceCoefficient:y,maxInHolding:S,purchaseFee:f,buyBackFee:x,buybackRate:I}=h,w=s.find(T=>T.id===b.toString());if(w){let T=this.getPoolId(b.toString()),C=await this.getBalance(i,g);return{...w,address:T,type:"Hsm",tokens:w.tokens.filter(M=>M.id!==b.toString()),hsmAddress:i,hsmMintCapacity:m(a),hollarId:e,hollarH160:n,collateralId:g,collateralBalance:C,maxBuyPriceCoefficient:m(y.toString()),maxInHolding:m(S.unwrap().toString()),purchaseFee:P.fromPermill(f.toNumber()),buyBackFee:P.fromPermill(x.toNumber()),buyBackRate:P.fromPerbill(I.toNumber())}}});return(await Promise.all(l)).filter(u=>u!==null)}async getPoolFees(e,t,r){return{}}onEvents(e){e.forEach(async t=>{let{event:r}=t;if(`${r.section}:${r.method}`==="evm:Log"){let[i]=r.data.toJSON();try{let{eventName:o,args:n}=us({abi:oe,topics:i.topics,data:i.data}),[a]=this.pools,{hsmAddress:l,hollarH160:c}=a,u=W.fromAny(l),d=u.toLowerCase()===n.facilitatorAddress.toLowerCase();if(ms.includes(o)&&d){let h=await this.ghoTokenClient.getFacilitatorCapacity(c,u);this.log(`Sync HSM facilitator via [evm:Log] :: ${o} ${h}`),this.pools.forEach(g=>{Object.assign(g,{hsmMintCapacity:h})})}}catch{}}})}async subscribeBalances(){let e=[],t=[],r=[];for(let i of this.pools){let{tokens:o,hsmAddress:n,collateralId:a}=i;o.find(c=>c.id===a).type==="Erc20"?t.push([n,a]):e.push([n,a])}let s=i=>{i.forEach(([o,n])=>{let[a,l]=o,c=this.pools.find(u=>u.tokens.some(d=>d.id===l));c&&Object.assign(c,{collateralBalance:n})})};if(e.length>0){let i=await this.subscribeTokenBalances(e,s);r.push(i)}if(t.length>0){let i=await this.subscribeErc20Balances(t,s);r.push(i)}return()=>{for(let i of r)try{i()}catch(o){console.warn("Balance unsub failed",o)}}}async subscribeUpdates(){return()=>{}}};var ce=class extends _{api;evm;assetClient;aaveClient;xykClient;omniClient;lbpClient;stableClient;hsmClient;clients=[];onChainAssets=[];block=0;blockHandlers=[];eventHandlers=[];disconnectSubscribeNewHeads=null;disconnectSubscribeEvents=null;memRegistry=ps(e=>(this.log(`Registry mem ${e} sync`),this.syncRegistry()));constructor(e,t){super(e),this.api=e,this.evm=t,this.assetClient=new Q(this.api),this.aaveClient=new _e(this.api,t),this.xykClient=new Ue(this.api,t),this.omniClient=new He(this.api,t),this.lbpClient=new Me(this.api,t),this.stableClient=new qe(this.api,t),this.hsmClient=new Xe(this.api,t,this.stableClient),this.clients=[this.aaveClient,this.xykClient,this.omniClient,this.lbpClient,this.stableClient,this.hsmClient],this.blockHandlers=this.clients.map(r=>r.onNewBlockHandler),this.eventHandlers=this.clients.map(r=>r.onEventsHandler),this.api.rpc.chain.subscribeNewHeads(async r=>{let s=r.number.toNumber();this.onNewBlock(s)}).then(r=>{this.disconnectSubscribeNewHeads=r}),this.api.query.system.events(r=>{this.onEvents(r)}).then(r=>{this.disconnectSubscribeEvents=r})}onNewBlock(e){this.block=e;for(let t of this.blockHandlers)try{t(e)}catch(r){this.log("onNewBlock handler error",r)}}onEvents(e){for(let t of this.eventHandlers)try{t(e)}catch(r){this.log("onEvents handler error",r)}}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={}){this.isRegistrySynced||await this.memRegistry(1);let{includeOnly:t=[],exclude:r=[]}=e;return t.length>0?this.getFilteredPools(s=>t.includes(s.getPoolType())):r.length>0?this.getFilteredPools(s=>!r.includes(s.getPoolType())):this.getFilteredPools(s=>s.isSupported())}async getFilteredPools(e){let t=this.clients.filter(e);return(await Promise.all(t.map(s=>s.getPoolsMem()))).flat()}destroy(){this.aaveClient.unsubscribe(),this.xykClient.unsubscribe(),this.omniClient.unsubscribe(),this.lbpClient.unsubscribe(),this.stableClient.unsubscribe(),this.hsmClient.unsubscribe(),this.disconnectSubscribeNewHeads?.(),this.disconnectSubscribeEvents?.()}async getPoolFees(e,t){switch(t.type){case"Aave":return this.aaveClient.getPoolFees(this.block,e,t.address);case"Xyk":return this.xykClient.getPoolFees(this.block,e,t.address);case"Omnipool":return this.omniClient.getPoolFees(this.block,e,t.address);case"Lbp":return this.lbpClient.getPoolFees(this.block,e,t.address);case"Stableswap":return this.stableClient.getPoolFees(this.block,e,t.address);case"Hsm":return this.hsmClient.getPoolFees(this.block,e,t.address);default:throw new Fe(t.type)}}};var ue=class extends ce{feeCache=new Map;constructor(e,t){super(e,t)}onNewBlock(e){super.onNewBlock(e),this.feeCache.clear()}async getPoolFees(e,t){let r=[t.address,e.assetIn,e.assetOut].join("-");if(this.feeCache.has(r))return this.feeCache.get(r);let s=super.getPoolFees(e,t);return this.feeCache.set(r,s),s}async destroy(){this.feeCache.clear(),super.destroy()}};var me=class{static get(e){switch(e.type){case"Aave":return Ce.fromPool(e);case"Xyk":return Ge.fromPool(e);case"Omnipool":return Le.fromPool(e);case"Lbp":return De.fromPool(e);case"Stableswap":return Z.fromPool(e);case"Hsm":return We.fromPool(e);default:throw new Error("Pool type "+e.type+" is not supported yet")}}};import{sha256 as ds}from"@noble/hashes/sha2";import{bytesToHex as gs}from"@noble/hashes/utils";function Yc(p){let e=p.map(s=>s.address).sort().join(":"),t=new TextEncoder().encode(e),r=ds(t);return gs(r)}var pe=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 hs=10,de=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 pe,o=[];for(o.push([t,""]),i.enqueue(o);i.size()>0;){let n=i.dequeue();if(!n||n.length>hs)continue;let a=n[n.length-1];(r===null||a[0]===r)&&s.push(n),e.get(a[0])?.forEach(c=>{if(this.isNotVisited(c,n)){let u=[...n];u.push(c),i.enqueue(u)}})}return s}findShortestPaths(e,t,r){let s=[],i=new pe,o=[];o.push([t,""]),i.enqueue(o);let n=1/0;for(;i.size()>0;){let a=i.dequeue();if(!a)continue;let l=a[a.length-1];if(l[0]===r){a.length<n?(n=a.length,s.length=0,s.push(a)):a.length===n&&s.push(a);continue}let c=e.get(l[0]);for(let u of c??[])this.isNotVisited(u,a)&&i.enqueue([...a,u])}return s}buildAndPopulateGraph(e,t){let r=new Map;for(let s of e)r.set(parseInt(s),[]);for(let[s,i,o]of t){let n=parseInt(i),a=parseInt(o);r.get(n)?.push([a,s])}return r}};function st(p){let e={};for(let t of p){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 o=[t.address,t.tokens[s].id,t.tokens[i].id];e[t.tokens[s].id].push(o)}}}return e}var ge=class{getProposals(e,t,r){let s=r.filter(f=>f.type==="Xyk"),i=r.filter(f=>f.type!=="Xyk"),o=parseInt(e),n=parseInt(t),a=new Set(i.map(f=>f.tokens).flat().map(f=>f.id)),l=a.has(e),c=a.has(t),u=new de,d=f=>{let x=st(f),I=Object.keys(x),w=I.flatMap(T=>x[T]);return u.buildAndPopulateGraph(I,w)};if(!l&&!c){let f=s.filter(w=>w.tokens.find(T=>T.id===e)||w.tokens.find(T=>T.id===t)),x=d(f),I=u.findPaths(x,o,n);return this.parsePaths(I)}if(l&&c){let f=d(i),x=u.findPaths(f,o,n);return this.parsePaths(x)}let h=l?t:e,g=s.filter(f=>f.tokens.some(x=>x.id===h));if(g.length===0)return[];let b=[...i,...g],y=d(b),S=u.findPaths(y,o,n);return this.parsePaths(S)}parsePaths(e){let t=[];for(let r of e){let s=[];for(let i=0;i<r.length;i++){let o=r[i],n=r[i+1];if(n==null)break;s.push(this.toEdge(o,n))}t.push(s)}return t}toEdge(e,t){return[t[1],e[0].toString(),t[0].toString()]}};var he=class{routeSuggester;routeProposals;routerOptions;poolService;constructor(e,t={}){this.poolService=e,this.routeSuggester=new ge,this.routeProposals=new Map,this.routerOptions=Object.freeze(t)}buildRouteKey(e,t,r){return`${e}->${t}::${r.length}`}async getPools(){return this.poolService.getPools(this.routerOptions)}async getAllAssets(){let e=await this.getPools(),t=this.getAssets(e);return[...new Map(t).values()]}async getRouteableAssets(e){let t=await this.getAllAssets();return(await Promise.all(t.map(s=>s.id).filter(s=>s!==e).map(s=>this.getRoutes(s,e)))).filter(s=>s.length>0).map(([s])=>s[0].assetIn).sort()}async getRoutes(e,t){let r=await this.getPools();return this.validateInput(e,t,r),this.getPaths(e,t,r)}validateInput(e,t,r){if(r.length===0)throw new Error("No pools configured");if(e===t)throw new Error("Trading pair can't be identical");let s=this.getAssets(r);if(s.get(e)===null)throw new Error(e+" is not supported asset");if(s.get(t)===null)throw new Error(t+" is not supported asset");return this.toPoolsMap(r)}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){let s=this.toPoolsMap(r);return this.getProposals(e,t,r).filter(n=>this.validPath(n,s)).map(n=>this.toHops(n,s))}getProposals(e,t,r){let s=this.buildRouteKey(e,t,r);if(this.routeProposals.has(s))return this.routeProposals.get(s);let i=this.routeSuggester.getProposals(e,t,r);return this.routeProposals.set(s,i),i}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}toPoolsMap(e){return new Map(e.map(t=>[t.address,me.get(t)]))}toHops(e,t){return e.map(([r,s,i])=>{let o=t.get(r);return{poolAddress:r,poolId:o?.id,pool:o?.type,assetIn:s,assetOut:i}})}};var ys=m("100");function _u(p,e){return p.minus(e).abs().div(p.plus(e).div(2)).multipliedBy(100).decimalPlaces(2)}function ye(p,e){return p.minus(e).div(e).multipliedBy(100).decimalPlaces(2)}function At(p,e){return R.minus(e.div(p)).multipliedBy(100).decimalPlaces(4)}function Ft(p,e){return e.div(p).minus(R).multipliedBy(100).decimalPlaces(4)}function z(p,e){return(e<.01||e>100)&&new Error("Supported range is from 0.01% - 100%"),p.div(ys).multipliedBy(e).decimalPlaces(0,1)}var it=(t=>(t.Buy="Buy",t.Sell="Sell",t))(it||{}),at=(r=>(r.Dca="Dca",r.TwapSell="TwapSell",r.TwapBuy="TwapBuy",r))(at||{}),Rt=(r=>(r.OrderTooSmall="OrderTooSmall",r.OrderTooBig="OrderTooBig",r.OrderImpactTooBig="OrderImpactTooBig",r))(Rt||{});var be=class extends he{mlr;poolsSnapshot;constructor(e,t={}){super(e,t),this.mlr=new Map}buildCtxSync(e,t){let r=this.poolsSnapshot,s=super.validateInput(e,t,r),i=super.getPaths(e,t,r);if(!i.length)throw new Re(e,t);return{paths:i,pools:r,poolsMap:s}}async withCtx(e,t,r){this.poolsSnapshot||(this.poolsSnapshot=await super.getPools());let s=this.buildCtxSync(e,t);return r(s)}isDirectTrade(e){return e.length==1}findBestSellRoute(e){let t=e.sort((r,s)=>{let i=r[r.length-1].amountOut,o=s[s.length-1].amountOut;return i.isGreaterThan(o)?-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,o)=>i+o),s=e.map(i=>i.tradeFeeRange?.[1]??i.tradeFeePct).reduce((i,o)=>i+o);return[r,s]}}getPoolFeeRange(e){let t=e.min?P.toPct(e.min):void 0,r=e.max?P.toPct(e.max):void 0;if(t&&r)return[t,r]}async getBestSell(e,t,r){return this.getSell(e,t,r)}async getSell(e,t,r,s){return this.withCtx(e,t,async({paths:i,poolsMap:o})=>{let n;if(s)n=await this.toSellSwaps(r,s,o);else{let a=i.map(c=>this.toSellSwaps(r,c,o)),l=await Promise.all(a);n=this.findBestSellRoute(l)}return this.buildSell(o,n)})}async getSellTrades(e,t,r){return this.withCtx(e,t,async({paths:s,poolsMap:i})=>{let o=s.map(a=>this.toSellSwaps(r,a,i));return(await Promise.all(o)).filter(a=>a.every(l=>l.errors.length==0)).map(a=>this.buildSell(i,a)).sort((a,l)=>a.amountOut.isGreaterThan(l.amountOut)?-1:1)})}buildSell(e,t){let r=t[0],s=t[t.length-1],i=this.isDirectTrade(t),o=t.map(b=>b.spotPrice.shiftedBy(-1*b.assetOutDecimals)).reduce((b,y)=>b.multipliedBy(y)),n=A(o,s.assetOutDecimals),a=i?s.calculatedOut:this.calculateDelta0Y(r.amountIn,t,e),l=s.amountOut,c=i?s.tradeFeePct:At(a,l).toNumber(),u=a.minus(l),d=this.getRouteFeeRange(t),h=r.amountIn.shiftedBy(-1*r.assetInDecimals).multipliedBy(n),g=ye(a,h);return{type:"Sell",amountIn:r.amountIn,amountOut:s.amountOut,spotPrice:n,tradeFee:u,tradeFeePct:c,tradeFeeRange:d,priceImpactPct:g.toNumber(),swaps:t,toHuman(){return{type:"Sell",amountIn:O(r.amountIn,r.assetInDecimals),amountOut:O(s.amountOut,s.assetOutDecimals),spotPrice:O(n,s.assetOutDecimals),tradeFee:O(u,s.assetOutDecimals),tradeFeePct:c,tradeFeeRange:d,priceImpactPct:g.toNumber(),swaps:t.map(b=>b.toHuman())}}}}calculateDelta0Y(e,t,r){let s=[];for(let i=0;i<t.length;i++){let o=t[i],n=r.get(o.poolAddress);if(n==null)throw new Error("Pool does not exit");let a=n.parsePair(o.assetIn,o.assetOut),l;i>0?l=s[i-1]:l=e;let c=n.calculateOutGivenIn(a,l);s.push(c)}return s[s.length-1]}async calculateMostLiquidRoute(e,t,r){let{paths:s,pools:i,poolsMap:o}=r,c=i.filter(y=>y.tokens.some(S=>S.id===e)).map(y=>y.type==="Aave"?y.tokens:y.tokens.filter(S=>S.id===e)).map(y=>y.map(S=>m(S.balance).shiftedBy(-1*S.decimals)).reduce((S,f)=>S.plus(f))).sort((y,S)=>S.isLessThan(y)?-1:1)[0].div(100).multipliedBy(.1),u=s.map(async y=>await this.toSellSwaps(c,y,o)),d=await Promise.all(u),g=this.findBestSellRoute(d).map(y=>({poolAddress:y.poolAddress,poolId:y?.poolId,pool:y.pool,assetIn:y.assetIn,assetOut:y.assetOut})),b=this.buildRouteKey(e,t,i);return this.mlr.set(b,g),g}async toSellSwaps(e,t,r){let s=[],i=[];for(let a=0;a<t.length;a++){let l=t[a],c=r.get(l.poolAddress);if(!c)throw new Error("Pool does not exit");let u=c.parsePair(l.assetIn,l.assetOut);s[a]=c,i[a]=u}let o=await Promise.all(i.map((a,l)=>this.poolService.getPoolFees(a,s[l]))),n=[];for(let a=0;a<t.length;a++){let l=t[a],c=s[a],u=o[a],d=i[a],h;a>0?h=n[a-1].amountOut:h=A(m(e),d.decimalsIn).decimalPlaces(0,1);let{amountOut:g,calculatedOut:b,feePct:y,errors:S}=c.validateAndSell(d,h,u),f=this.getPoolFeeRange(u),x=c.spotPriceOutGivenIn(d),I=h.shiftedBy(-1*d.decimalsIn).multipliedBy(x),w=ye(b,I),T=c.type==="Aave";n.push({...l,assetInDecimals:d.decimalsIn,assetOutDecimals:d.decimalsOut,amountIn:h,amountOut:g,calculatedOut:b,spotPrice:x,tradeFeePct:y,tradeFeeRange:f,priceImpactPct:w.toNumber(),errors:S,isSupply:()=>T&&c.tokens[0].id===l.assetIn,isWithdraw:()=>T&&c.tokens[1].id===l.assetIn,toHuman(){return{...l,amountIn:O(h,d.decimalsIn),amountOut:O(g,d.decimalsOut),calculatedOut:O(b,d.decimalsOut),spotPrice:O(x,d.decimalsOut),tradeFeePct:y,priceImpactPct:w.toNumber(),errors:S}}})}return n}async getMostLiquidRoute(e,t){return this.withCtx(e,t,async r=>{let s=this.buildRouteKey(e,t,r.pools),i=this.mlr.get(s);return i||this.calculateMostLiquidRoute(e,t,r)})}async getBestSpotPrice(e,t){return this.withCtx(e,t,async r=>{let{pools:s,poolsMap:i}=r,o=this.buildRouteKey(e,t,s),n=this.mlr.get(o);n||(n=await this.calculateMostLiquidRoute(e,t,r));let a=await this.toSellSwaps("1",n,i),l=a.map(d=>d.spotPrice.shiftedBy(-1*d.assetOutDecimals)).reduce((d,h)=>d.multipliedBy(h)),c=a[a.length-1].assetOutDecimals;return{amount:A(l,c),decimals:c}}).catch(()=>{})}findBestBuyRoute(e){let t=e.sort((r,s)=>{let i=r[0].amountIn,o=s[0].amountIn;return i.isGreaterThan(o)?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){return this.withCtx(e,t,async({paths:i,poolsMap:o})=>{let n;if(s)n=await this.toBuySwaps(r,s,o);else{let a=i.map(c=>this.toBuySwaps(r,c,o)),l=await Promise.all(a);n=this.findBestBuyRoute(l)}return this.buildBuy(o,n)})}async getBuyTrades(e,t,r){return this.withCtx(e,t,async({paths:s,poolsMap:i})=>{let o=s.map(a=>this.toBuySwaps(r,a,i));return(await Promise.all(o)).filter(a=>a.every(l=>l.errors.length==0)).map(a=>this.buildBuy(i,a)).sort((a,l)=>a.amountIn.isGreaterThan(l.amountIn)?1:-1)})}buildBuy(e,t){let r=t[t.length-1],s=t[0],i=this.isDirectTrade(t),o=t.map(b=>b.spotPrice.shiftedBy(-1*b.assetInDecimals)).reduce((b,y)=>b.multipliedBy(y)),n=A(o,s.assetInDecimals),a=i?s.calculatedIn:this.calculateDelta0X(r.amountOut,t,e),l=s.amountIn,c=i?s.tradeFeePct:Ft(a,l).toNumber(),u=l.minus(a),d=this.getRouteFeeRange(t),h=r.amountOut.shiftedBy(-1*r.assetOutDecimals).multipliedBy(n),g;return a.isZero()?g=-100:g=ye(h,a).toNumber(),{type:"Buy",amountOut:r.amountOut,amountIn:s.amountIn,spotPrice:n,tradeFee:u,tradeFeePct:c,tradeFeeRange:d,priceImpactPct:g,swaps:t,toHuman(){return{type:"Buy",amountOut:O(r.amountOut,r.assetOutDecimals),amountIn:O(s.amountIn,s.assetInDecimals),spotPrice:O(n,s.assetInDecimals),tradeFee:O(u,s.assetInDecimals),tradeFeePct:c,tradeFeeRange:d,priceImpactPct:g,swaps:t.map(b=>b.toHuman())}}}}calculateDelta0X(e,t,r){let s=[];for(let i=t.length-1;i>=0;i--){let o=t[i],n=r.get(o.poolAddress);if(n==null)throw new Error("Pool does not exit");let a=n.parsePair(o.assetIn,o.assetOut),l;i==t.length-1?l=e:l=s[0];let c=n.calculateInGivenOut(a,l);s.unshift(c)}return s[0]}async toBuySwaps(e,t,r){let s=[],i=[];for(let a=0;a<t.length;a++){let l=t[a],c=r.get(l.poolAddress);if(!c)throw new Error("Pool does not exit");let u=c.parsePair(l.assetIn,l.assetOut);s[a]=c,i[a]=u}let o=await Promise.all(i.map((a,l)=>this.poolService.getPoolFees(a,s[l]))),n=[];for(let a=t.length-1;a>=0;a--){let l=t[a],c=s[a],u=o[a],d=i[a],h;a==t.length-1?h=A(m(e),d.decimalsOut).decimalPlaces(0,1):h=n[0].amountIn;let{amountIn:g,calculatedIn:b,feePct:y,errors:S}=c.validateAndBuy(d,h,u),f=this.getPoolFeeRange(u),x=c.spotPriceInGivenOut(d),I=h.shiftedBy(-1*d.decimalsOut).multipliedBy(x),w;b.isZero()?w=-100:w=ye(I,b).toNumber(),n.unshift({...l,assetInDecimals:d.decimalsIn,assetOutDecimals:d.decimalsOut,amountIn:g,amountOut:h,calculatedIn:b,spotPrice:x,tradeFeePct:y,tradeFeeRange:f,priceImpactPct:w,errors:S,isSupply(){return c.type==="Aave"&&c.tokens[0].id===l.assetIn},isWithdraw(){return c.type==="Aave"&&c.tokens[1].id===l.assetIn},toHuman(){return{...l,amountIn:O(g,d.decimalsIn),amountOut:O(h,d.decimalsOut),calculatedIn:O(b,d.decimalsIn),spotPrice:O(x,d.decimalsIn),tradeFeePct:y,tradeFeeRange:f,priceImpactPct:w,errors:S}}})}return n}};var Nt=6e3,Et=m(1e15),Pe=6,nt=-5,ot=360*60*1e3,im=3,Ct=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 fe=class{schedulerOptions;router;constructor(e,t={}){this.router=e,this.schedulerOptions=Object.freeze({blockTime:t.blockTime??Nt,minBudgetInNative:t.minBudgetInNative??Et})}get blockTime(){return this.schedulerOptions.blockTime}get minOrderBudget(){return this.schedulerOptions.minBudgetInNative}async getDcaOrder(e,t,r,s,i){let[o,n]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestSell(e,t,r)]),{amountIn:a,swaps:l,priceImpactPct:c}=n,u=l[0],d=l[l.length-1],{assetInDecimals:h}=u,{assetOutDecimals:g}=d,b=Math.abs(c),y=this.getMinimumTradeCount(a,o),S=this.getOptimalTradeCount(b),f=i?Math.round(s/i):S,x=Math.ceil(s/y),I=Math.round(s/S),w=Math.round(s/f),T=a.dividedBy(f).decimalPlaces(0,1),C=await this.router.getBestSell(e,t,O(T,h)),M=a.isLessThan(o),Be=[];M&&Be.push("OrderTooSmall");let xe=C.amountOut.multipliedBy(f),Ve=this.toBlockPeriod(w),$e=C.tradeFee.multipliedBy(f),Qe=G.build(l),ve={assetIn:e,assetOut:t,errors:Be,frequencyMin:x,frequencyOpt:I,frequency:w,tradeCount:f,tradeFee:$e,tradeImpactPct:C.priceImpactPct,tradePeriod:Ve,tradeRoute:Qe,type:"Dca"};return{...ve,amountIn:a,amountOut:xe,tradeAmountIn:C.amountIn,tradeAmountOut:C.amountOut,toHuman(){return{...ve,amountIn:O(a,h),amountOut:O(xe,g),tradeAmountIn:O(C.amountIn,h),tradeAmountOut:O(C.amountOut,g)}}}}async getMinimumOrderBudget(e){if("0"===e)return this.minOrderBudget;let t=await this.router.getBestSpotPrice("0",e);if(t)return this.minOrderBudget.times(t.amount).div(m(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:o,swaps:n,priceImpactPct:a}=i,l=n[0],c=n[n.length-1],{assetInDecimals:u}=l,{assetOutDecimals:d}=c,h=Math.abs(a),g=this.getTwapTradeCount(h),b=o.dividedBy(g).decimalPlaces(0,1),y=await this.router.getBestSell(l.assetIn,c.assetOut,O(b,u)),S=g===1,f=o.isLessThan(s),x=y.priceImpactPct<nt,I=[];f||S?I.push("OrderTooSmall"):x&&I.push("OrderImpactTooBig");let w=y.amountOut.multipliedBy(g),T=y.tradeFee.multipliedBy(g),C=G.build(n),M={assetIn:e,assetOut:t,errors:I,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:Pe,tradeRoute:C,type:"TwapSell"};return{...M,amountIn:o,amountOut:w,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:T,toHuman(){return{...M,amountIn:O(o,u),amountOut:O(w,d),tradeAmountIn:O(y.amountIn,u),tradeAmountOut:O(y.amountOut,d),tradeFee:O(T,d)}}}}async getTwapBuyOrder(e,t,r){let[s,i]=await Promise.all([this.getMinimumOrderBudget(e),this.router.getBestBuy(e,t,r)]),{amountOut:o,swaps:n,priceImpactPct:a}=i,l=n[0],c=n[n.length-1],{assetInDecimals:u}=l,{assetOutDecimals:d}=c,h=Math.abs(a),g=this.getTwapTradeCount(h),b=o.dividedBy(g).decimalPlaces(0,1),y=await this.router.getBestBuy(l.assetIn,c.assetOut,O(b,d)),S=y.amountIn.multipliedBy(g),f=g===1,x=S.isLessThan(s),I=y.priceImpactPct<nt,w=[];x||f?w.push("OrderTooSmall"):I&&w.push("OrderImpactTooBig");let T=y.tradeFee.multipliedBy(g),C=G.build(n),M={assetIn:e,assetOut:t,errors:w,tradeCount:g,tradeImpactPct:y.priceImpactPct,tradePeriod:Pe,tradeRoute:C,type:"TwapBuy"};return{...M,amountIn:S,amountOut:o,tradeAmountIn:y.amountIn,tradeAmountOut:y.amountOut,tradeFee:T,toHuman(){return{...M,amountIn:O(S,u),amountOut:O(o,d),tradeAmountIn:O(y.amountIn,u),tradeAmountOut:O(y.amountOut,d),tradeFee:O(T,u)}}}}getTwapTradeCount(e){let t=this.getOptimalTradeCount(e);if(this.getTwapExecutionTime(t)>ot){let s=ot/(this.blockTime*Pe);return Math.round(s)}return t}getTwapExecutionTime(e){return e*Pe*this.blockTime}toBlockPeriod(e){let t=e/this.blockTime,r=Math.round(t);return Math.max(r,Ct)}};var ee=class extends _{evm;evmClient;balanceClient;aaveUtils;constructor(e,t){super(e),this.evm=t,this.evmClient=t.getWsProvider(),this.balanceClient=new H(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 Ye=class extends ee{_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:o}=s,a=(await this.balanceClient.getBalance(this.beneficiary,i)).minus(5),l=!0;return s.isWithdraw()&&(l=(await this.aaveUtils.getMaxWithdraw(this.beneficiary,o)).amount.isGreaterThanOrEqualTo(a)),l&&e.isGreaterThanOrEqualTo(a)?this.buildSellAllTx():this.buildSellTx()}async buildBuyTx(){let{amountIn:e,amountOut:t,swaps:r}=this.trade,s=r[0],i=r[r.length-1],o=z(e,this.slippagePct),n=s.assetIn,a=i.assetOut,l=e.plus(o),c;if(this.isDirectOmnipoolTrade(r)?c=this.api.tx.omnipool.buy(a,n,t.toFixed(),l.toFixed()):c=this.api.tx.router.buy(n,a,t.toFixed(),l.toFixed(),G.build(r)),await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let d=this.dispatchWithExtraGas(c);return this.wrapTx("RouterBuy",d,J)}return this.wrapTx("RouterBuy",c)}async buildSellTx(){let{amountIn:e,amountOut:t,swaps:r}=this.trade,s=r[0],i=r[r.length-1],o=z(t,this.slippagePct),n=s.assetIn,a=i.assetOut,l=t.minus(o),c;if(this.isDirectOmnipoolTrade(r)?c=this.api.tx.omnipool.sell(n,a,e.toFixed(),l.toFixed()):c=this.api.tx.router.sell(n,a,e.toFixed(),l.toFixed(),G.build(r)),await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let d=this.dispatchWithExtraGas(c);return this.wrapTx("RouterSell",d,J)}return this.wrapTx("RouterSell",c)}async buildSellAllTx(){let{amountOut:e,swaps:t}=this.trade,r=t[0],s=t[t.length-1],i=z(e,this.slippagePct),o=r.assetIn,n=s.assetOut,a=e.minus(i),l=this.api.tx.router.sellAll(o,n,a.toFixed(),G.build(t));if(await this.aaveUtils.hasBorrowPositions(this.beneficiary)){let u=this.dispatchWithExtraGas(l);return this.wrapTx("RouterSellAll",u,J)}return this.wrapTx("RouterSellAll",l)}};var Ke=class extends ee{_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:o}=this.order,n=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:o}}},null);return this.wrapTx("DcaSchedule",n)}buildTwapSellTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:o,tradeRoute:n}=this.order,a=z(i,this.slippagePct),l=i.minus(a),c=this.api.tx.dca.schedule({owner:this.beneficiary,period:o,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Sell:{assetIn:t,assetOut:r,amountIn:s.toFixed(),minAmountOut:l.toFixed(),route:n}}},null);return this.wrapTx("DcaSchedule.twapSell",c)}buildTwapBuyTx(){let{amountIn:e,assetIn:t,assetOut:r,tradeAmountIn:s,tradeAmountOut:i,tradePeriod:o,tradeRoute:n}=this.order,a=z(s,this.slippagePct),l=s.plus(a),c=this.api.tx.dca.schedule({owner:this.beneficiary,period:o,maxRetries:this.maxRetries,totalAmount:e.toFixed(),slippage:this.slippagePct*1e4,order:{Buy:{assetIn:t,assetOut:r,amountOut:i.toFixed(),maxAmountIn:l.toFixed(),route:n}}},null);return this.wrapTx("DcaSchedule.twapBuy",c)}};var Se=class{api;evm;constructor(e,t){this.api=e,this.evm=t}trade(e){return new Ye(this.api,this.evm).setTrade(e)}order(e){return new Ke(this.api,this.evm).setOrder(e)}};var bs={router:{}};function tp(p,e=bs){let t=new ae(p),r=new Ee(p),s=new ue(p,r),i=new $(r),o=new be(s,e.router),n=new fe(o,{blockTime:t.blockTime,minBudgetInNative:t.minOrderBudget});return{api:{aave:i,router:o,scheduler:n},client:{asset:new Q(p),balance:new H(p),balanceV2:new ie(p)},ctx:{pool:s},evm:r,tx:new Se(p,r),destroy:()=>{s.destroy()}}}export{te as AaveClient,Ce as AavePool,_e as AavePoolClient,$ as AaveUtils,Q as AssetClient,bt as AssetNotFound,Fs as BASILISK_PARACHAIN_ID,H as BalanceClient,ie as BalanceClientV2,v as BigNumber,ue as CachingPoolService,ae as ChainParams,Yt as DECIMAL_PLACES,Nt as DEFAULT_BLOCK_TIME,Et as DEFAULT_MIN_BUDGET,X as ERC20,Ee as EvmClient,Ne as EvmRpcAdapter,et as FarmClient,W as H160,Te as HUB_ASSET_ID,Rs as HYDRADX_PARACHAIN_ID,L as HYDRADX_SS58_PREFIX,Gs as INFINITY,U as LbpMath,De as LbpPool,Me as LbpPoolClient,ne as MmOracleClient,R as ONE,Ct as ORDER_MIN_BLOCK_PERIOD,F as OmniMath,Le as OmniPool,He as OmniPoolClient,ct as PERBILL_DENOMINATOR,V as PERMILL_DENOMINATOR,_ as PolkadotApiClient,yt as PoolConfigNotFound,j as PoolError,me as PoolFactory,Fe as PoolNotFound,ce as PoolService,E as PoolType,St as ProviderConfigNotFound,re as RUNTIME_DECIMALS,Re as RouteNotFound,he as Router,ut as SYSTEM_ASSET_DECIMALS,N as SYSTEM_ASSET_ID,k as StableMath,Z as StableSwap,qe as StableSwapClient,Pt as StorageConfigNotFound,ft as SubscriptionNotSupported,se as TRADEABLE_DEFAULT,Pe as TWAP_BLOCK_PERIOD,ot as TWAP_MAX_DURATION,nt as TWAP_MAX_PRICE_IMPACT,im as TWAP_TX_MULTIPLIER,Rt as TradeOrderError,at as TradeOrderType,G as TradeRouteBuilder,be as TradeRouter,fe as TradeScheduler,it as TradeType,Se as TxBuilderFactory,K as XykMath,Ge as XykPool,Ue as XykPoolClient,B as ZERO,Fa as bnFormatter,m as bnum,Ft as calculateBuyFee,_u as calculateDiffToAvg,ye as calculateDiffToRef,At as calculateSellFee,Bt as createChain,tp as createSdkContext,ke as findNestedKey,Aa as findNestedObj,z as getFraction,Yc as hashPools,qt as isEvmAccount,Wt as isEvmAddress,Xt as isSs58Address,A as scale,Us as toBn,O as toDecimals};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ApiPromise } from '@polkadot/api';
|
|
2
|
+
import type { PublicClient } from 'viem';
|
|
3
|
+
export declare class EvmRpcAdapter {
|
|
4
|
+
private api;
|
|
5
|
+
constructor(api: ApiPromise);
|
|
6
|
+
getBlock(): Promise<{
|
|
7
|
+
timestamp: bigint;
|
|
8
|
+
number: bigint;
|
|
9
|
+
}>;
|
|
10
|
+
readContract: PublicClient['readContract'];
|
|
11
|
+
}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { ApiPromise } from '@polkadot/api';
|
|
2
2
|
import { Chain, PublicClient, WalletClient } from 'viem';
|
|
3
|
+
import { EvmRpcAdapter } from './adapter';
|
|
3
4
|
export declare class EvmClient {
|
|
4
|
-
private
|
|
5
|
+
private api;
|
|
5
6
|
readonly chain: Chain;
|
|
6
7
|
constructor(api: ApiPromise);
|
|
8
|
+
get provider(): any;
|
|
7
9
|
get chainId(): number;
|
|
8
10
|
get chainCurrency(): string;
|
|
9
11
|
get chainDecimals(): number;
|
|
10
12
|
getProvider(): PublicClient;
|
|
11
13
|
getWsProvider(): PublicClient;
|
|
12
14
|
getSigner(address: string): WalletClient;
|
|
15
|
+
getRPCAdapter(): EvmRpcAdapter;
|
|
13
16
|
}
|