@xchainjs/xchain-thorchain-query 1.0.13 → 2.0.1

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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/chain-defaults.ts","../src/liquidity-pool.ts","../src/utils/const.ts","../src/utils/utils.ts","../src/utils/liquidity.ts","../src/utils/thornode.ts","../src/thorchain-cache.ts","../src/thorchain-query.ts","../src/thorchain-checktx.ts"],"sourcesContent":["// Import necessary modules and types\nimport { Chain } from '@xchainjs/xchain-util'\n\n// Import the custom type ChainAttributes\nimport { ChainAttributes } from './types'\n\n// Default attributes for each chain\nconst DefaultChainAttributes: Record<Chain, ChainAttributes> = {\n BCH: {\n blockReward: 6.25, // Block reward for Bitcoin Cash\n avgBlockTimeInSecs: 600, // Average block time for Bitcoin Cash in seconds\n },\n BTC: {\n blockReward: 6.25, // Block reward for Bitcoin\n avgBlockTimeInSecs: 600, // Average block time for Bitcoin in seconds\n },\n ETH: {\n blockReward: 2, // Block reward for Ethereum\n avgBlockTimeInSecs: 13, // Average block time for Ethereum in seconds\n },\n AVAX: {\n blockReward: 2, // Block reward for Avalanche\n avgBlockTimeInSecs: 3, // Average block time for Avalanche in seconds\n },\n LTC: {\n blockReward: 12.5, // Block reward for Litecoin\n avgBlockTimeInSecs: 150, // Average block time for Litecoin in seconds\n },\n DOGE: {\n blockReward: 10000, // Block reward for Dogecoin\n avgBlockTimeInSecs: 60, // Average block time for Dogecoin in seconds\n },\n GAIA: {\n blockReward: 0, // No block reward for Gaia\n avgBlockTimeInSecs: 6, // Average block time for Gaia in seconds\n },\n THOR: {\n blockReward: 0, // No block reward for THORChain\n avgBlockTimeInSecs: 6, // Average block time for THORChain in seconds\n },\n BSC: {\n blockReward: 0, // No block reward for Binance Smart Chain\n avgBlockTimeInSecs: 3, // Average block time for Binance Smart Chain in seconds\n },\n MAYA: {\n blockReward: 0, // No block reward for MAYAChain\n avgBlockTimeInSecs: 6, // Average block time for MAYAChain in seconds\n },\n BASE: {\n blockReward: 0, // No block reward for base\n avgBlockTimeInSecs: 2, // Average block time for Base in seconds\n },\n}\n\n// Export the DefaultChainAttributes object\nexport { DefaultChainAttributes }\n","import { Pool } from '@xchainjs/xchain-thornode/lib'\nimport { Asset, BaseAmount, TokenAsset, assetFromString, baseAmount } from '@xchainjs/xchain-util'\nimport { BigNumber } from 'bignumber.js'\n\n/**\n * Represents a Liquidity Pool in Thorchain\n */\nexport class LiquidityPool {\n readonly thornodeDetails: Pool // Details of the liquidity pool from ThorNode\n readonly assetBalance: BaseAmount // Balance of the asset in the pool\n readonly runeBalance: BaseAmount // Balance of Rune in the pool\n\n readonly asset: Asset | TokenAsset // Asset of the pool\n readonly assetString: string // String representation of the asset\n readonly runeToAssetRatio: BigNumber // Ratio of Rune to the asset in the pool\n readonly assetToRuneRatio: BigNumber // Ratio of the asset to Rune in the pool\n\n constructor(thornodeDetails: Pool) {\n this.thornodeDetails = thornodeDetails\n const asset = assetFromString(this.thornodeDetails.asset) as Asset | TokenAsset\n if (!asset) throw new Error(`could not parse ${this.thornodeDetails.asset}`)\n\n this.asset = asset\n // this.decimals = decimals\n this.assetString = this.thornodeDetails.asset\n this.assetBalance = baseAmount(this.thornodeDetails.balance_asset)\n this.runeBalance = baseAmount(this.thornodeDetails.balance_rune)\n // Calculate the ratio of Rune to the asset and the ratio of the asset to Rune\n this.runeToAssetRatio = this.runeBalance.amount().div(this.assetBalance.amount())\n this.assetToRuneRatio = this.assetBalance.amount().div(this.runeBalance.amount())\n }\n\n /**\n * Checks if the liquidity pool is available\n * @returns {boolean} True if the liquidity pool is available, otherwise false\n */\n isAvailable(): boolean {\n return this.thornodeDetails.status.toLowerCase() === 'available'\n }\n}\n","import { AnyAsset, Asset, TokenAsset, assetFromStringEx, assetToString } from '@xchainjs/xchain-util'\n\nexport const AssetAVAX = assetFromStringEx('AVAX.AVAX') as Asset\nexport const AssetBTC = assetFromStringEx('BTC.BTC') as Asset\nexport const AssetBCH = assetFromStringEx('BCH.BCH') as Asset\nexport const AssetETH = assetFromStringEx('ETH.ETH') as Asset\nexport const AssetDOGE = assetFromStringEx('DOGE.DOGE') as Asset\nexport const AssetLTC = assetFromStringEx('LTC.LTC') as Asset\nexport const AssetATOM = assetFromStringEx('GAIA.ATOM') as Asset\nexport const AssetMAYA = assetFromStringEx('MAYA.CACAO') as Asset\nexport const AssetBSC = assetFromStringEx('BSC.BNB') as Asset\nexport const AssetRuneNative = assetFromStringEx('THOR.RUNE') as Asset\nexport const assetUSDC = assetFromStringEx('ETH.USDC-0XA0B86991C6218B36C1D19D4A2E9EB0CE3606EB48') as TokenAsset\nexport const AssetBNB = assetFromStringEx('BSC.BNB') as Asset\nexport const AssetBASE = assetFromStringEx('BASE.ETH') as Asset\n\nexport const BNBChain = 'BNB'\nexport const BTCChain = 'BTC'\nexport const BCHChain = 'BCH'\nexport const ETHChain = 'ETH'\nexport const GAIAChain = 'GAIA'\nexport const DOGEChain = 'DOGE'\nexport const LTCChain = 'LTC'\nexport const AVAXChain = 'AVAX'\nexport const MAYAChain = 'MAYA'\nexport const BSCChain = 'BSC'\nexport const THORChain = 'THOR'\nexport const BASEChain = 'BASE'\n\nexport const THORCHAIN_DECIMAL = 8\n\nexport const isAssetRuneNative = (asset: AnyAsset): boolean => assetToString(asset) === assetToString(AssetRuneNative)\n","import {\n // Address,\n Asset,\n AssetCryptoAmount,\n Chain,\n CryptoAmount,\n baseAmount,\n eqAsset,\n isSynthAsset,\n} from '@xchainjs/xchain-util'\nimport { BigNumber } from 'bignumber.js'\n\nimport { CompatibleAsset, InboundDetail } from '../types'\n// eslint-disable-next-line ordered-imports/ordered-imports\nimport {\n AVAXChain,\n AssetATOM,\n AssetAVAX,\n AssetBASE,\n AssetBCH,\n AssetBSC,\n AssetBTC,\n AssetDOGE,\n AssetETH,\n AssetLTC,\n AssetMAYA,\n AssetRuneNative,\n BASEChain,\n BCHChain,\n BNBChain,\n BSCChain,\n BTCChain,\n DOGEChain,\n ETHChain,\n GAIAChain,\n LTCChain,\n MAYAChain,\n THORChain,\n} from './const'\n\nexport const getBaseAmountWithDiffDecimals = (inputAmount: CryptoAmount, outDecimals: number): BigNumber => {\n const inDecimals = inputAmount.baseAmount.decimal\n let baseAmountOut = inputAmount.baseAmount.amount()\n const adjustDecimals = outDecimals - inDecimals\n baseAmountOut = baseAmountOut.times(10 ** adjustDecimals)\n return baseAmount(baseAmountOut, outDecimals).amount()\n}\n\nexport const getCryptoAmountWithNotation = <T extends CompatibleAsset>(\n amount: CryptoAmount<T>,\n notation: number,\n): CryptoAmount<T> => {\n const inputAmountBaseNotation = amount.baseAmount.amount()\n const decimalsDiff = notation - amount.baseAmount.decimal\n return new CryptoAmount<T>(baseAmount(inputAmountBaseNotation.times(10 ** decimalsDiff), notation), amount.asset)\n}\n\n/**\n * Returns the native asset for a given chain\n * @param chain\n * @returns the gas asset type for the given chain\n */\nexport const getChainAsset = (chain: Chain): Asset => {\n switch (chain) {\n case BTCChain:\n return AssetBTC\n case ETHChain:\n return AssetETH\n case THORChain:\n return AssetRuneNative\n case GAIAChain:\n return AssetATOM\n case BCHChain:\n return AssetBCH\n case LTCChain:\n return AssetLTC\n case DOGEChain:\n return AssetDOGE\n case AVAXChain:\n return AssetAVAX\n case BSCChain:\n return AssetBSC\n case MAYAChain:\n return AssetMAYA\n case BASEChain:\n return AssetBASE\n default:\n throw Error('Unknown chain')\n }\n}\n\n/**\n *\n * @param asset\n * @returns a boolean based on Assets being compared are equal\n */\nexport const isNativeChainAsset = (asset: CompatibleAsset): asset is Asset => {\n return eqAsset(asset, getChainAsset(asset.chain))\n}\n\n/**\n * Works out the required inbound fee based on the chain.\n * Call getInboundDetails to get the current gasRate\n *\n * @param sourceAsset\n * @param gasRate\n * @see https://dev.thorchain.org/thorchain-dev/thorchain-and-fees#fee-calcuation-by-chain\n * @returns\n */\nexport const calcNetworkFee = (asset: CompatibleAsset, inbound: InboundDetail): AssetCryptoAmount => {\n // synths are always 0.02R fee\n if (isSynthAsset(asset)) return new AssetCryptoAmount(baseAmount(2000000), AssetRuneNative)\n // if you are swapping a non-gas asset on a multiAsset chain (ex. ERC-20 on ETH), the\n // gas fees will be paid in a diff asset than the one you are swapping\n\n switch (asset.chain) {\n case BTCChain:\n return new AssetCryptoAmount(baseAmount(inbound.gasRate.multipliedBy(inbound.outboundTxSize)), AssetBTC)\n case BCHChain:\n return new AssetCryptoAmount(baseAmount(inbound.gasRate.multipliedBy(inbound.outboundTxSize)), AssetBCH)\n case LTCChain:\n return new AssetCryptoAmount(baseAmount(inbound.gasRate.multipliedBy(inbound.outboundTxSize)), AssetLTC)\n case DOGEChain:\n // NOTE: UTXO chains estimate fees with a 250 byte size\n return new AssetCryptoAmount(baseAmount(inbound.gasRate.multipliedBy(inbound.outboundTxSize)), AssetDOGE)\n case ETHChain:\n const gasRateinETHGwei = inbound.gasRate\n const gasRateinETHWei = baseAmount(gasRateinETHGwei.multipliedBy(10 ** 9), 18)\n if (eqAsset(asset, AssetETH)) {\n return new AssetCryptoAmount(gasRateinETHWei.times(21000), AssetETH)\n } else {\n return new AssetCryptoAmount(gasRateinETHWei.times(70000), AssetETH)\n }\n case AVAXChain:\n const gasRateinAVAXGwei = inbound.gasRate\n const gasRateinAVAXWei = baseAmount(gasRateinAVAXGwei.multipliedBy(10 ** 9), 18)\n if (eqAsset(asset, AssetAVAX)) {\n return new AssetCryptoAmount(gasRateinAVAXWei.times(21000), AssetAVAX)\n } else {\n return new AssetCryptoAmount(gasRateinAVAXWei.times(70000), AssetAVAX)\n }\n case GAIAChain:\n return new AssetCryptoAmount(baseAmount(inbound.gasRate), AssetATOM)\n case THORChain:\n return new AssetCryptoAmount(baseAmount(2000000), AssetRuneNative)\n case BSCChain:\n return new AssetCryptoAmount(baseAmount(inbound.gasRate), AssetBSC)\n case MAYAChain:\n return new AssetCryptoAmount(baseAmount(inbound.gasRate), AssetMAYA)\n case BASEChain:\n return new AssetCryptoAmount(baseAmount(inbound.gasRate), AssetBASE)\n }\n throw new Error(`could not calculate inbound fee for ${asset.chain}`)\n}\n\n/**\n * Works out the required outbound fee based on the chain.\n * Call getInboundDetails to get the current outbound fee\n *\n * @param sourceAsset\n * @param inbound detail\n * @see https://dev.thorchain.org/thorchain-dev/thorchain-and-fees#fee-calcuation-by-chain\n * @returns\n */\nexport const calcOutboundFee = (asset: CompatibleAsset, inbound: InboundDetail): AssetCryptoAmount => {\n if (isSynthAsset(asset)) return new AssetCryptoAmount(baseAmount(2000000), AssetRuneNative)\n switch (asset.chain) {\n case BTCChain:\n return new AssetCryptoAmount(baseAmount(inbound.outboundFee), AssetBTC)\n case BCHChain:\n return new AssetCryptoAmount(baseAmount(inbound.outboundFee), AssetBCH)\n case LTCChain:\n return new AssetCryptoAmount(baseAmount(inbound.outboundFee), AssetLTC)\n case DOGEChain:\n // NOTE: UTXO chains estimate fees with a 250 byte size\n return new AssetCryptoAmount(baseAmount(inbound.outboundFee), AssetDOGE)\n case ETHChain:\n return new AssetCryptoAmount(baseAmount(inbound.outboundFee.multipliedBy(10 ** 9), 18), AssetETH)\n case AVAXChain:\n return new AssetCryptoAmount(baseAmount(inbound.outboundFee.multipliedBy(10 ** 9), 18), AssetAVAX)\n case GAIAChain:\n return new AssetCryptoAmount(baseAmount(inbound.outboundFee), AssetATOM)\n case BSCChain:\n return new AssetCryptoAmount(baseAmount(inbound.outboundFee), AssetBSC)\n case THORChain:\n return new AssetCryptoAmount(baseAmount(2000000), AssetRuneNative)\n case MAYAChain:\n return new AssetCryptoAmount(baseAmount(2000000), AssetMAYA)\n case BASEChain:\n return new AssetCryptoAmount(baseAmount(2000000), AssetBASE)\n }\n throw new Error(`could not calculate outbound fee for ${asset.chain}`)\n}\n\n/**\n *\n * @param chain - input chain string\n * @returns - returns correct chain from string\n */\nexport const getChain = (chain: string): Chain => {\n switch (chain) {\n case 'AVAX':\n return AVAXChain\n case 'BNB':\n return BNBChain\n case 'BTC':\n return BTCChain\n case 'ETH':\n return ETHChain\n case 'THOR':\n return THORChain\n case 'GAIA':\n return GAIAChain\n case 'BCH':\n return BCHChain\n case 'LTC':\n return LTCChain\n case 'DOGE':\n return DOGEChain\n case 'BSC':\n return BSCChain\n case 'MAYA':\n return MAYAChain\n case 'BASE':\n return BASEChain\n default:\n throw Error('Unknown chain')\n }\n}\n","import { CryptoAmount, baseAmount } from '@xchainjs/xchain-util'\nimport { BigNumber } from 'bignumber.js'\n\nimport { LiquidityPool } from '../liquidity-pool'\nimport { Block, ILProtectionData, LiquidityToAdd, PoolShareDetail, PostionDepositValue, UnitData } from '../types'\n\nimport { AssetRuneNative } from './const'\nimport { getBaseAmountWithDiffDecimals } from './utils'\n\n/**\n * https://dev.thorchain.org/thorchain-dev/interface-guide/math#lp-units-add\n * @param liquidity - asset amount added\n * @param pool - pool depths\n * @returns liquidity units - ownership of pool\n */\nexport const getLiquidityUnits = (liquidity: LiquidityToAdd, pool: LiquidityPool): BigNumber => {\n const baseAmount8decimals = getBaseAmountWithDiffDecimals(liquidity.asset, 8)\n const P = new BigNumber(pool.thornodeDetails.LP_units)\n const r = liquidity.rune.baseAmount.amount()\n const a = baseAmount8decimals\n const R = pool.runeBalance.amount()\n const A = pool.assetBalance.amount()\n const part1 = R.times(a)\n const part2 = r.times(A)\n\n const numerator = P.times(part1.plus(part2))\n const denominator = R.times(A).times(2)\n const result = numerator.div(denominator)\n return result\n}\n/**\n *\n * @param unitData - units for both asset and rune\n * @param pool - pool that the asset is bound to\n * @returns - pool share of both asset and rune in percentage\n */\nexport const getPoolShare = (unitData: UnitData, pool: LiquidityPool): PoolShareDetail => {\n // formula: (rune * part) / total; (asset * part) / total\n const units = unitData.liquidityUnits\n const total = unitData.totalUnits\n const R = pool.runeBalance.amount()\n const T = pool.assetBalance.amount()\n const asset = T.times(units).div(total)\n const rune = R.times(units).div(total)\n const poolShareDetail = {\n assetShare: new CryptoAmount(baseAmount(asset), pool.asset),\n runeShare: new CryptoAmount(baseAmount(rune), AssetRuneNative),\n }\n return poolShareDetail\n}\n\n/**\n *\n * @param poolShare - the share of asset and rune added to the pool\n * @param pool - Pool that the asset is attached to\n * @returns - returns bignumber representing a slip percentage\n */\nexport const getSlipOnLiquidity = (stake: LiquidityToAdd, pool: LiquidityPool): BigNumber => {\n const baseAmount8decimals = getBaseAmountWithDiffDecimals(stake.asset, 8)\n // formula: (t * R - T * r)/ (T*r + R*T)\n const r = stake.rune.baseAmount.amount()\n const t = baseAmount8decimals\n const R = pool.runeBalance.amount()\n const T = pool.assetBalance.amount()\n const numerator = t.times(R).minus(T.times(r))\n const denominator = T.times(r).plus(R.times(T))\n const result = numerator.div(denominator).abs()\n return result\n}\n\n/**\n * https://docs.thorchain.org/thorchain-finance/continuous-liquidity-pools#impermanent-loss-protection\n * @param poolShare - the share of asset and rune added to the pool\n * @param pool - Pool that the asset is attached to\n * @param block - blockl object with current, last added and the constant blocksforlossProtection\n * @returns\n */\n// Blocks for full protection 1440000 // 100 days\nexport const getLiquidityProtectionData = (\n depositValue: PostionDepositValue,\n poolShare: PoolShareDetail,\n block: Block,\n): ILProtectionData => {\n //Coverage formula coverage=((A0∗P1)+R0)−((A1∗P1)+R1)=>((A0∗R1/A1)+R0)−(R1+R1)\n //formula: protectionProgress (currentHeight-heightLastAdded)/blocksforfullprotection\n const R0 = depositValue.rune.amount() // rune deposit value\n const A0 = depositValue.asset.amount() // asset deposit value\n const R1 = poolShare.runeShare.baseAmount.amount() // rune amount to redeem\n const A1 = poolShare.assetShare.baseAmount.amount() // asset amount to redeem\n const P1 = R1.div(A1) // Pool ratio at withdrawal\n const part1 = A0.times(P1).plus(R0).minus(A1.times(P1).plus(R1)) // start position minus end position\n const part2 = A0.times(R1.div(A1)).plus(R0).minus(R1.plus(R1)) // different way to check position\n const coverage = part1 >= part2 ? part1 : part2 // Coverage represents how much ILP a LP is entitled to\n const currentHeight = block.current\n const heightLastAdded = block.lastAdded || 0 //default to zero if undefined\n const blocksforfullprotection = block.fullProtection\n const fractionOfFullILPProtection = (currentHeight - heightLastAdded) / blocksforfullprotection\n const protectionProgress = Math.min(fractionOfFullILPProtection, 1) // percentage of entitlement, max 100%\n const result = coverage.times(protectionProgress) // impermanent loss protection result\n const maxILP = result.lt(0) ? new BigNumber(0) : result // max negative ILP to 0\n const ILProtection: ILProtectionData = {\n ILProtection: new CryptoAmount(baseAmount(maxILP), AssetRuneNative),\n totalDays: (fractionOfFullILPProtection * 100).toFixed(2),\n }\n return ILProtection\n}\n\n/**\n * https://docs.thorchain.org/thorchain-finance/continuous-liquidity-pools#calculating-pool-ownership\n * @param liquidity - asset amount added\n * @param pool - pool depths\n * @returns liquidity units - % ownership of pool\n */\nexport const getPoolOwnership = (liquidity: LiquidityToAdd, pool: LiquidityPool): number => {\n const P = new BigNumber(pool.thornodeDetails.LP_units)\n const r = liquidity.rune.baseAmount.amount()\n const a = liquidity.asset.baseAmount.amount()\n const R = pool.runeBalance.amount().plus(r) // Must add r first\n const A = pool.assetBalance.amount().plus(a) // Must add t first\n const part1 = R.plus(a)\n const part2 = r.times(A)\n\n const numerator = P.times(part1.plus(part2))\n const denominator = R.times(A).times(2)\n const lpUnits = numerator.div(denominator)\n const percent = lpUnits.div(P)\n return percent.toNumber()\n}\n","import { Network } from '@xchainjs/xchain-client'\nimport {\n Configuration,\n InboundAddress,\n LastBlock,\n LiquidityProviderSummary,\n LiquidityProvidersApi,\n MimirApi,\n MimirResponse,\n NetworkApi,\n Pool,\n PoolsApi,\n QueueApi,\n QueueResponse,\n QuoteApi,\n QuoteLoanCloseResponse,\n QuoteLoanOpenResponse,\n QuoteSaverDepositResponse,\n QuoteSaverWithdrawResponse,\n QuoteSwapResponse,\n RUNEPoolApi,\n RUNEPoolResponse,\n RUNEProvider,\n RUNEProvidersResponse,\n Saver,\n SaversApi,\n SaversResponse,\n Thorname,\n ThornamesApi,\n TradeAccountApi,\n TradeAccountsApi,\n TradeAccountsResponse,\n TradeUnitApi,\n TradeUnitResponse,\n TradeUnitsApi,\n TradeUnitsResponse,\n TransactionsApi,\n TxDetailsResponse,\n TxOutItem,\n TxResponse,\n} from '@xchainjs/xchain-thornode'\nimport { Address } from '@xchainjs/xchain-util'\nimport axios from 'axios'\nimport axiosRetry from 'axios-retry'\n\nimport { SaversWithdraw } from '../types'\n\nexport type ThornodeConfig = {\n apiRetries: number\n thornodeBaseUrls: string[]\n}\n\nconst defaultThornodeConfig: Record<Network, ThornodeConfig> = {\n mainnet: {\n apiRetries: 3,\n thornodeBaseUrls: [`https://thornode.ninerealms.com`],\n },\n stagenet: {\n apiRetries: 3,\n thornodeBaseUrls: ['https://stagenet-thornode.ninerealms.com'],\n },\n testnet: {\n apiRetries: 3,\n thornodeBaseUrls: ['https://testnet.thornode.thorchain.info'],\n },\n}\n\nexport class Thornode {\n private config: ThornodeConfig\n private network: Network\n private transactionsApi: TransactionsApi[]\n private queueApi: QueueApi[]\n private networkApi: NetworkApi[]\n private poolsApi: PoolsApi[]\n private liquidityProvidersApi: LiquidityProvidersApi[]\n private saversApi: SaversApi[]\n private quoteApi: QuoteApi[]\n private mimirApi: MimirApi[]\n private tradeUnitApi: TradeUnitApi[]\n private tradeUnitsApi: TradeUnitsApi[]\n private tradeAccountApi: TradeAccountApi[]\n private tradeAccountsApi: TradeAccountsApi[]\n private thornamesApi: ThornamesApi[]\n private runePoolApi: RUNEPoolApi[]\n\n constructor(network: Network = Network.Mainnet, config?: ThornodeConfig) {\n this.network = network\n this.config = config ?? defaultThornodeConfig[this.network]\n axiosRetry(axios, { retries: this.config.apiRetries, retryDelay: axiosRetry.exponentialDelay })\n this.transactionsApi = this.config.thornodeBaseUrls.map(\n (url) => new TransactionsApi(new Configuration({ basePath: url })),\n )\n this.queueApi = this.config.thornodeBaseUrls.map((url) => new QueueApi(new Configuration({ basePath: url })))\n this.networkApi = this.config.thornodeBaseUrls.map((url) => new NetworkApi(new Configuration({ basePath: url })))\n this.poolsApi = this.config.thornodeBaseUrls.map((url) => new PoolsApi(new Configuration({ basePath: url })))\n this.liquidityProvidersApi = this.config.thornodeBaseUrls.map(\n (url) => new LiquidityProvidersApi(new Configuration({ basePath: url })),\n )\n this.saversApi = this.config.thornodeBaseUrls.map((url) => new SaversApi(new Configuration({ basePath: url })))\n this.quoteApi = this.config.thornodeBaseUrls.map((url) => new QuoteApi(new Configuration({ basePath: url })))\n this.mimirApi = this.config.thornodeBaseUrls.map((url) => new MimirApi(new Configuration({ basePath: url })))\n this.thornamesApi = this.config.thornodeBaseUrls.map(\n (url) => new ThornamesApi(new Configuration({ basePath: url })),\n )\n this.tradeUnitApi = this.config.thornodeBaseUrls.map(\n (url) => new TradeUnitApi(new Configuration({ basePath: url })),\n )\n this.tradeUnitsApi = this.config.thornodeBaseUrls.map(\n (url) => new TradeUnitsApi(new Configuration({ basePath: url })),\n )\n this.tradeAccountApi = this.config.thornodeBaseUrls.map(\n (url) => new TradeAccountApi(new Configuration({ basePath: url })),\n )\n this.tradeAccountsApi = this.config.thornodeBaseUrls.map(\n (url) => new TradeAccountsApi(new Configuration({ basePath: url })),\n )\n this.runePoolApi = this.config.thornodeBaseUrls.map((url) => new RUNEPoolApi(new Configuration({ basePath: url })))\n }\n\n /**\n * Returns the oubound transactions held by THORChain due to outbound delay\n * May be empty if there are no transactions\n *\n * @returns {ScheduledQueueItem} Array\n *\n */\n async getscheduledQueue(): Promise<TxOutItem[]> {\n for (const api of this.queueApi) {\n try {\n const queueScheduled = await api.queueScheduled()\n return queueScheduled.data\n } catch (e) {\n //console.error(e)\n throw new Error(`THORNode not responding`)\n }\n }\n throw Error(`THORNode not responding`)\n }\n /**\n * Returns queue\n * May be empty if there are no transactions\n *\n * @returns {ScheduledQueueItem} Array\n *\n */\n async getQueue(): Promise<QueueResponse> {\n for (const api of this.queueApi) {\n try {\n const queue = await api.queue()\n return queue.data\n } catch (e) {\n //console.error(e)\n throw new Error(`THORNode not responding`)\n }\n }\n throw Error(`THORNode not responding`)\n }\n /**\n * Returns Mimir\n * May be empty if there are no transactions\n *\n * @returns {ScheduledQueueItem} Array\n *\n */\n async getMimir(): Promise<MimirResponse> {\n for (const api of this.mimirApi) {\n try {\n const queue = await api.mimir()\n return queue.data\n } catch (e) {\n //console.error(e)\n throw new Error(`THORNode not responding`)\n }\n }\n throw Error(`THORNode not responding`)\n }\n /**\n *\n * @param txHash - transaction hash\n * @returns - transaction object\n */\n async getTxData(txHash: string): Promise<TxResponse> {\n for (const api of this.transactionsApi) {\n try {\n const txResponse = await api.tx(txHash)\n return txResponse.data\n } catch (e) {\n const txR: TxResponse = {\n observed_tx: undefined,\n keysign_metric: undefined,\n }\n return txR\n }\n }\n throw new Error(`THORNode not responding`)\n }\n /**\n *\n * @param txHash - transaction hash\n * @returns - transaction object\n */\n async getTxDetail(txHash: string): Promise<TxDetailsResponse> {\n for (const api of this.transactionsApi) {\n try {\n const txResponse = await api.txSigners(txHash)\n return txResponse.data\n } catch (e) {\n throw new Error(`THORNode not responding`)\n }\n }\n throw new Error(`THORNode not responding`)\n }\n /**\n *\n * @param height - optional thorchain height only\n * @returns - last block data || or block data pertaining to that height number\n */\n async getLastBlock(height?: number): Promise<LastBlock[]> {\n for (const api of this.networkApi) {\n try {\n const lastBlock = await api.lastblock(height)\n return lastBlock.data\n } catch (e) {\n //console.error(e)\n }\n }\n throw new Error(`THORNode not responding`)\n }\n /**\n *\n * @returns - thorchain pools\n */\n async getPools(): Promise<Pool[]> {\n for (const api of this.poolsApi) {\n try {\n const pools = await api.pools()\n return pools.data\n } catch (e) {\n //console.error(e)\n }\n }\n throw new Error(`THORNode not responding`)\n }\n /**\n *\n * @returns - thorchain pool\n */\n async getPool(asset: string): Promise<Pool> {\n for (const api of this.poolsApi) {\n try {\n const pools = await api.pool(asset)\n return pools.data\n } catch (e) {\n //console.error(e)\n }\n }\n throw new Error(`THORNode not responding`)\n }\n\n /**\n *\n * @returns Thorchain constants\n */\n async getTcConstants(): Promise<Record<string, string>> {\n for (const api of this.networkApi) {\n try {\n const constants = await api.constants()\n if (constants.data.int_64_values) {\n return constants.data.int_64_values\n }\n } catch (e) {\n //console.error(e)\n }\n }\n throw new Error(`THORNode not responding`)\n }\n\n /**\n * Function that wraps Mimir and Constants to return the value from a given constant name. Searchs Mimir first.\n *\n * @param networkValueName the network value to be used to search the contsants\n * @returns the mimir or constants value\n */\n async getNetworkValues(): Promise<Record<string, number>> {\n const [mimirDetails, constantDetails] = await Promise.all([this.getMimir(), this.getTcConstants()])\n const retVal: Record<string, number> = {}\n // insert constants first\n\n for (const [key, value] of Object.entries(constantDetails)) {\n retVal[key.toUpperCase()] = parseInt(value)\n }\n // // mimir will overwrite any dupe constants\n for (const [key, value] of Object.entries(mimirDetails)) {\n retVal[key] = parseInt(value)\n }\n return retVal\n }\n /**\n *\n * @param asset - asset string\n * @param address - address\n * @param height - optional block height, defaults to current tip\n * @returns\n */\n async getLiquidityProvider(\n asset: string,\n address: string,\n height?: number,\n ): Promise<LiquidityProviderSummary | undefined> {\n for (const api of this.liquidityProvidersApi) {\n try {\n const lps = (await api.liquidityProviders(asset, height)).data\n return lps.find((lp) => lp.asset_address === address || lp.rune_address === address)\n } catch (e) {\n //console.error(e)\n }\n }\n throw new Error(`THORNode not responding`)\n }\n /**\n *\n * @param asset - asset string\n * @param address - address\n * @param height - optional block height, defaults to current tip\n * @returns\n */\n async getInboundAddresses(): Promise<InboundAddress[]> {\n for (const api of this.networkApi) {\n try {\n const resp = (await api.inboundAddresses()).data\n return resp\n } catch (e) {\n //console.error(e)\n }\n }\n throw new Error(`THORNode not responding`)\n }\n /**\n *\n * @param asset - asset string\n * @param height - optional thorchain block height parameter\n * @returns - Liquidity Provider Object\n */\n async getSavers(asset: string, height?: number): Promise<SaversResponse> {\n for (const api of this.saversApi) {\n try {\n const resp = (await api.savers(asset, height)).data\n return resp\n } catch (e) {\n //console.error(e)\n }\n }\n throw new Error(`THORNode not responding`)\n }\n /**\n *\n * @param asset - asset string\n * @param height - optional thorchain block height parameter\n * @returns - Liquidity Provider Object\n */\n async getSaver(asset: string, address: string, height?: number): Promise<Saver> {\n for (const api of this.saversApi) {\n try {\n const resp = (await api.saver(asset, address, height)).data\n return resp\n } catch (e) {\n //console.error(e)\n }\n }\n throw new Error(`THORNode not responding`)\n }\n\n /**\n *\n * @param asset - asset to add to savers\n * @param amount - amount to deposit\n * @param height - block height\n * @returns quotes deposit object response\n */\n async getSaversDepositQuote(asset: string, amount: number, height?: number): Promise<QuoteSaverDepositResponse> {\n for (const api of this.quoteApi) {\n try {\n const resp = (await api.quotesaverdeposit(height, asset, amount)).data\n return resp\n } catch (e) {\n //console.error(e)\n }\n }\n throw new Error(`THORNode not responding`)\n }\n\n /**\n *\n * @param asset - asset to withdraw\n * @param address - savers address\n * @param height - block height\n * @param withdrawBps - withddraw percent\n * @returns quotes withdraw object response\n */\n async getSaversWithdrawQuote(withdrawParams: SaversWithdraw): Promise<QuoteSaverWithdrawResponse> {\n for (const api of this.quoteApi) {\n try {\n const resp = await api.quotesaverwithdraw(\n withdrawParams.height,\n `${withdrawParams.asset.chain}.${withdrawParams.asset.symbol}`,\n withdrawParams.address,\n withdrawParams.withdrawBps,\n )\n return resp.data\n } catch (e) {\n //console.error(e)\n }\n }\n throw new Error(`THORNode not responding`)\n }\n\n /**\n *\n * @param fromAsset - input asset\n * @param toAsset - output asset\n * @param amount - amount to swap\n * @param destination - vault address\n * @param toleranceBps - slip percent\n * @param affiliateBps - affiliate percent\n * @param affiliate - affiliate address\n * @param height - block height\n * @returns quotes swap object response\n */\n async getSwapQuote(\n fromAsset: string,\n toAsset: string,\n amount: number,\n destinationAddress?: string,\n streamingInterval?: number,\n streamingQuantity?: number,\n toleranceBps?: number,\n affiliateBps?: number,\n affiliate?: string,\n height?: number,\n refundAddress?: string,\n ): Promise<QuoteSwapResponse> {\n for (const api of this.quoteApi) {\n try {\n const resp = (\n await api.quoteswap(\n height,\n fromAsset,\n toAsset,\n amount,\n destinationAddress,\n refundAddress,\n streamingInterval,\n streamingQuantity,\n toleranceBps,\n affiliateBps,\n affiliate,\n )\n ).data\n return resp\n } catch (e) {\n //console.error(e)\n }\n }\n throw new Error(`THORNode not responding`)\n }\n\n /**\n *\n * @param height\n * @param asset\n * @param amount\n * @param targetAsset\n * @param destination\n * @param minOut\n * @param affiliateBps\n * @param affiliate\n * @returns\n */\n async getLoanQuoteOpen(\n asset: string,\n amount: number,\n targetAsset: string,\n destination: string,\n minOut?: string,\n affiliateBps?: number,\n affiliate?: string,\n height?: number,\n ): Promise<QuoteLoanOpenResponse> {\n for (const api of this.quoteApi) {\n try {\n const resp = (\n await api.quoteloanopen(height, asset, amount, targetAsset, destination, minOut, affiliateBps, affiliate)\n ).data\n return resp\n } catch (e) {\n //console.log(e)\n }\n }\n throw new Error(`THORNode is not responding`)\n }\n\n /**\n *\n * @param height\n * @param asset\n * @param amount\n * @param targetAsset\n * @param destination\n * @param minOut\n * @param affiliateBps\n * @param affiliate\n * @returns\n */\n async getLoanQuoteClose(\n asset: string,\n amount: number,\n loanAsset: string,\n loanOwner: string,\n minOut?: string,\n height?: number,\n ): Promise<QuoteLoanCloseResponse> {\n for (const api of this.quoteApi) {\n try {\n const resp = (await api.quoteloanclose(height, asset, amount, loanAsset, loanOwner, minOut)).data\n return resp\n } catch (e) {\n // console.log(e)\n }\n }\n throw new Error(`THORNode is not responding`)\n }\n\n async getThornameDetails(thorname: string, height?: number): Promise<Thorname> {\n for (const api of this.thornamesApi) {\n try {\n const resp = (await api.thorname(thorname, height)).data\n return resp\n } catch (e) {}\n }\n throw new Error(`THORNode is not responding`)\n }\n\n /*\n * Returns the total units and depth of a trade asset\n * @param {string} asset Trade asset\n * @param {number} height Optional - Block height\n * @returns Returns the total units and depth of a trade asset\n */\n public async getTradeAssetUnits(asset: string, height?: number): Promise<TradeUnitResponse> {\n for (const api of this.tradeUnitApi) {\n try {\n const resp = (await api.tradeUnit(asset, height)).data\n return resp\n } catch (e) {}\n }\n throw new Error(`THORNode is not responding. Can not get asset trade units`)\n }\n\n /**\n * Returns the total units and depth for each trade asset\n * @param {number} height Block height\n * @returns Returns the total units and depth for each trade asset\n */\n public async getTradeAssetsUnits(height?: number): Promise<TradeUnitsResponse> {\n for (const api of this.tradeUnitsApi) {\n try {\n const resp = (await api.tradeUnits(height)).data\n return resp\n } catch (e) {}\n }\n throw new Error(`THORNode is not responding. Can not get trade units`)\n }\n\n /**\n * Returns the units and depth of a trade account address\n * @param {Address} address Thorchain address\n * @param {number} height Optional - Block height\n * @returns Returns the units and depth of a trade account\n */\n public async getTradeAssetAccount(address: Address, height?: number): Promise<TradeAccountsResponse> {\n for (const api of this.tradeAccountApi) {\n try {\n const resp = (await api.tradeAccount(address, height)).data\n return resp as unknown as TradeAccountsResponse\n } catch (e) {}\n }\n throw new Error(`THORNode is not responding. Can not get trade asset account`)\n }\n\n /**\n * Returns all trade accounts for an asset\n * @param {Address} address Thorchain address\n * @param {number} height Optional - Block height\n * @returns Returns all trade accounts for an asset\n */\n public async getTradeAssetAccounts(asset: string, height?: number): Promise<TradeAccountsResponse> {\n for (const api of this.tradeAccountsApi) {\n try {\n const resp = (await api.tradeAccounts(asset, height)).data\n return resp\n } catch (e) {}\n }\n throw new Error(`THORNode is not responding. Can not get trade asset accounts`)\n }\n\n /**\n * Get rune pool information\n * @param {number} height block height\n * @returns {RUNEPoolResponse} the pool information for the RUNE pool.\n */\n async getRunePool(height?: number): Promise<RUNEPoolResponse> {\n for (const api of this.runePoolApi) {\n try {\n const resp = (await api.runePool(height)).data\n return resp\n } catch (e) {}\n }\n throw new Error(`THORNode is not responding. Can not get Rune pool`)\n }\n\n /**\n * Get Rune pool provider information\n * @param {string} address of which return the info\n * @param {number} height block height\n * @returns {RUNEProvider} the RUNE Provider information for an address.\n */\n async getRunePoolProvider(address: string, height?: number): Promise<RUNEProvider> {\n for (const api of this.runePoolApi) {\n try {\n const resp = (await api.runeProvider(address, height)).data\n return resp\n } catch (e) {}\n }\n throw new Error(`THORNode is not responding. Can not get Rune pool provider info`)\n }\n\n /**\n * Get all Rune pool providers information\n * @param {number} height block height\n * @returns {RUNEProvidersResponse} all Rune Providers.\n */\n async getRunePoolProviders(height?: number): Promise<RUNEProvidersResponse> {\n for (const api of this.runePoolApi) {\n try {\n const resp = (await api.runeProviders(height)).data\n return resp\n } catch (e) {}\n }\n throw new Error(`THORNode is not responding. Can not get all Rune providers info`)\n }\n}\n","import { MidgardQuery } from '@xchainjs/xchain-midgard-query'\nimport {\n Address,\n Asset,\n CachedValue,\n Chain,\n CryptoAmount,\n SecuredAsset,\n SynthAsset,\n TokenAsset,\n TradeAsset,\n assetToString,\n baseAmount,\n eqAsset,\n isSecuredAsset,\n isSynthAsset,\n isTradeAsset,\n} from '@xchainjs/xchain-util'\nimport { BigNumber } from 'bignumber.js'\n\nimport { LiquidityPool } from './liquidity-pool'\nimport { InboundDetail } from './types'\nimport { THORChain, isAssetRuneNative } from './utils'\nimport { Thornode } from './utils/thornode'\n// Constants\nconst SAME_ASSET_EXCHANGE_RATE = new BigNumber(1)\nconst TEN_MINUTES = 10 * 60 * 1000\n// Default instances\nconst defaultThornode = new Thornode()\nconst defaultMidgardQuery = new MidgardQuery()\n\n/**\n * This class manages retrieving information from up-to-date Thorchain.\n */\nexport class ThorchainCache {\n readonly thornode: Thornode // Instance of Thornode\n readonly midgardQuery: MidgardQuery // Instance of MidgardQuery\n private readonly poolCache: CachedValue<Record<string, LiquidityPool> | undefined> // Cached liquidity pool data\n private readonly inboundDetailCache: CachedValue<Record<string, InboundDetail>> // Cached inbound details\n private readonly networkValuesCache: CachedValue<Record<string, number>> // Cached network values\n\n /**\n * Constructor to create a ThorchainCache\n * @param thornode - An instance of the Thornode API (could be pointing to stagenet, testnet, or mainnet).\n * @param midgardQuery - An instance of the MidgardQuery class (could be pointing to stagenet, testnet, or mainnet).\n * @param expirePoolCacheMillis - How long the pools should be cached before expiry.\n * @param expireInboundDetailsCacheMillis - How long the InboundDetails should be cached before expiry.\n * @param expireNetworkValuesCacheMillis - How long the Mimir/Constants should be cached before expiry.\n * @returns ThorchainCache\n */\n constructor(\n thornode = defaultThornode,\n midgardQuery = defaultMidgardQuery,\n expirePoolCacheMillis = 6000,\n expireInboundDetailsCacheMillis = 6000,\n expireNetworkValuesCacheMillis = TEN_MINUTES,\n ) {\n this.thornode = thornode\n this.midgardQuery = midgardQuery\n // Initialize cached values\n this.poolCache = new CachedValue<Record<string, LiquidityPool> | undefined>(\n () => this.refreshPoolCache(),\n expirePoolCacheMillis,\n )\n this.inboundDetailCache = new CachedValue<Record<string, InboundDetail>>(\n () => this.refreshInboundDetailCache(),\n expireInboundDetailsCacheMillis,\n )\n this.networkValuesCache = new CachedValue<Record<string, number>>(\n () => thornode.getNetworkValues(),\n expireNetworkValuesCacheMillis,\n )\n }\n\n /**\n * Gets the exchange rate of the `from` asset in terms of the `to` asset.\n * @param asset - The asset to swap from.\n * @returns Promise<BigNumber> - The exchange rate.\n */\n async getExchangeRate(\n from: Asset | TokenAsset | SynthAsset | TradeAsset | SecuredAsset,\n to: Asset | TokenAsset | SynthAsset | TradeAsset | SecuredAsset,\n ): Promise<BigNumber> {\n let exchangeRate: BigNumber\n if (eqAsset(from, to)) {\n exchangeRate = SAME_ASSET_EXCHANGE_RATE\n } else if (isAssetRuneNative(from)) {\n // Runes per Asset\n const poolToAsset =\n isSynthAsset(to) || isTradeAsset(to) || isSecuredAsset(to) ? await this.getAnalogAsset(to) : to\n const lpTo = await this.getPoolForAsset(poolToAsset)\n exchangeRate = lpTo.assetToRuneRatio\n } else if (isAssetRuneNative(to)) {\n // Asset per rune\n const poolFromAsset =\n isSynthAsset(from) || isTradeAsset(from) || isSecuredAsset(from) ? await this.getAnalogAsset(from) : from\n const lpFrom = await this.getPoolForAsset(poolFromAsset)\n exchangeRate = lpFrom.runeToAssetRatio\n } else {\n // AssetA per AssetB\n const poolFromAsset =\n isSynthAsset(from) || isTradeAsset(from) || isSecuredAsset(from) ? await this.getAnalogAsset(from) : from\n const poolToAsset =\n isSynthAsset(to) || isTradeAsset(to) || isSecuredAsset(to) ? await this.getAnalogAsset(to) : to\n const lpFrom = await this.getPoolForAsset(poolFromAsset)\n const lpTo = await this.getPoolForAsset(poolToAsset)\n // from/R * R/to = from/to\n exchangeRate = lpFrom.runeToAssetRatio.times(lpTo.assetToRuneRatio)\n }\n // console.log(` 1 ${assetToString(from)} = ${exchangeRate} ${assetToString(to)}`)\n return exchangeRate\n }\n\n /**\n * Gets the Liquidity Pool for a given Asset.\n * @param asset - The asset to retrieve the pool for.\n * @returns Promise<LiquidityPool> - The liquidity pool.\n */\n async getPoolForAsset(asset: Asset | TokenAsset): Promise<LiquidityPool> {\n if (isAssetRuneNative(asset)) throw Error(`AssetRuneNative doesn't have a pool`)\n const pools = await this.getPools()\n // Note: we use ticker, not asset string to get the same pool for both assets and synths\n // using ticker causes problems between same named tickers but different chains\n const pool = pools[`${asset.chain}.${asset.ticker}`]\n if (pool) {\n return pool\n }\n throw Error(`Pool for ${assetToString(asset)} not found`)\n }\n\n /**\n * Get all the Liquidity Pools currently cached.\n * If the cache is expired, the pools will be re-fetched from Thornode.\n * @returns Promise<Record<string, LiquidityPool>> - The liquidity pools.\n */\n async getPools(): Promise<Record<string, LiquidityPool>> {\n const pools = await this.poolCache.getValue()\n if (pools) {\n return pools\n } else {\n throw Error('Could not refresh pools')\n }\n }\n /**\n * Refreshes the Pool Cache.\n * @returns Promise<Record<string, LiquidityPool> |\n */\n private async refreshPoolCache(): Promise<Record<string, LiquidityPool> | undefined> {\n try {\n const thornodePools = await this.thornode.getPools()\n const poolMap: Record<string, LiquidityPool> = {}\n\n if (thornodePools) {\n for (const pool of thornodePools) {\n try {\n const thornodePool = thornodePools.find((p) => p.asset === pool.asset)\n if (!thornodePool) throw Error(`Could not find thornode pool ${pool.asset}`)\n const lp = new LiquidityPool(thornodePool)\n poolMap[`${lp.asset.chain}.${lp.asset.ticker}`] = lp\n } catch (error) {\n console.log(error)\n }\n }\n\n return poolMap\n }\n } catch (error) {\n console.error('Error refreshing pool cache:', error)\n }\n return undefined\n }\n\n /**\n * Refreshes the InboundDetailCache Cache.\n * @returns Promise<Record<string, InboundDetail>> - The refreshed inbound detail cache.\n */\n private async refreshInboundDetailCache(): Promise<Record<string, InboundDetail>> {\n // Fetching mimir details and all inbound addresses concurrently\n const [mimirDetails, allInboundAddresses] = await Promise.all([\n this.thornode.getMimir(),\n this.thornode.getInboundAddresses(),\n ])\n // Mapping inbound details\n const inboundDetails: Record<string, InboundDetail> = {}\n for (const inbound of allInboundAddresses) {\n const chain = inbound.chain\n if (\n !chain ||\n !inbound.gas_rate ||\n !inbound.address ||\n !inbound.gas_rate_units ||\n !inbound.outbound_tx_size ||\n !inbound.outbound_fee ||\n !inbound.gas_rate_units\n )\n throw new Error(`Missing required inbound info`)\n // Adding mock THORCHAIN inbound details\n const details: InboundDetail = {\n chain: chain,\n address: inbound.address,\n router: inbound.router,\n gasRate: new BigNumber(inbound.gas_rate),\n gasRateUnits: inbound.gas_rate_units,\n outboundTxSize: new BigNumber(inbound.outbound_tx_size),\n outboundFee: new BigNumber(inbound.outbound_fee),\n haltedChain: inbound?.halted || !!mimirDetails[`HALT${chain}CHAIN`] || !!mimirDetails['HALTCHAINGLOBAL'],\n haltedTrading: !!mimirDetails['HALTTRADING'] || !!mimirDetails[`HALT${chain}TRADING`],\n haltedLP: !!mimirDetails['PAUSELP'] || !!mimirDetails[`PAUSELP${chain}`],\n }\n inboundDetails[chain] = details\n }\n // add mock THORCHAIN inbound details\n const details: InboundDetail = {\n chain: THORChain,\n address: '',\n router: '',\n gasRate: new BigNumber(0),\n gasRateUnits: '',\n outboundTxSize: new BigNumber(0),\n outboundFee: new BigNumber(0),\n haltedChain: false,\n haltedTrading: !!mimirDetails['HALTTRADING'],\n haltedLP: false, //\n }\n inboundDetails[THORChain] = details\n\n return inboundDetails\n }\n\n /**\n * Returns the exchange of a CryptoAmount to a different Asset.\n * @param input - The amount/asset to convert.\n * @param outAsset - The asset you want to convert to.\n * @returns Promise<CryptoAmount> - The converted amount.\n */\n async convert<T extends Asset | TokenAsset | SynthAsset | TradeAsset | SecuredAsset>(\n input: CryptoAmount<Asset | TokenAsset | SynthAsset | TradeAsset | SecuredAsset>,\n outAsset: T,\n ): Promise<CryptoAmount<T>> {\n const exchangeRate = await this.getExchangeRate(input.asset, outAsset)\n const outDecimals = await this.midgardQuery.getDecimalForAsset(outAsset)\n const inDecimals = input.baseAmount.decimal\n\n let baseAmountOut = input.baseAmount.times(exchangeRate).amount()\n const adjustDecimals = outDecimals - inDecimals\n\n baseAmountOut = baseAmountOut.times(10 ** adjustDecimals)\n const amt = baseAmount(baseAmountOut, outDecimals)\n const result = new CryptoAmount<T>(amt, outAsset)\n\n return result\n }\n /**\n * Gets the router address for a given chain.\n * @param chain - The chain to get the router address for.\n * @returns Promise<Address> - The router address.\n */\n async getRouterAddressForChain(chain: Chain): Promise<Address> {\n const inboundAsgard = (await this.getInboundDetails())[chain]\n\n if (!inboundAsgard?.router) {\n throw new Error('router address is not defined')\n }\n return inboundAsgard?.router\n }\n\n /**\n * Gets the inbound details.\n * @returns Promise<Record<string, InboundDetail>> - The inbound details.\n */\n async getInboundDetails(): Promise<Record<string, InboundDetail>> {\n if (this.inboundDetailCache) {\n return await this.inboundDetailCache.getValue()\n } else {\n throw Error(`Could not refresh inbound details `)\n }\n }\n /**\n * Gets the network values.\n * @returns Promise<Record<string, number>> - The network values.\n */\n async getNetworkValues(): Promise<Record<string, number>> {\n if (this.networkValuesCache) {\n return await this.networkValuesCache.getValue()\n } else {\n throw Error(`Could not refresh network values `)\n }\n }\n\n private async getAnalogAsset(asset: SynthAsset | TradeAsset | SecuredAsset): Promise<Asset | TokenAsset> {\n const pools = await this.getPools()\n const analogAssetPool = Object.values(pools).find((pool) => {\n return (\n pool.asset.chain === asset.chain && pool.asset.ticker === asset.ticker && pool.asset.symbol === asset.symbol\n )\n })\n\n if (!analogAssetPool) throw Error(`Can not find analog asset pool for ${assetToString(asset)}`)\n return analogAssetPool.asset\n }\n}\n","import { SwapMetadata, Transaction } from '@xchainjs/xchain-midgard'\nimport { LastBlock, TradeAccountResponse, TradeUnitResponse } from '@xchainjs/xchain-thornode'\nimport {\n Address,\n Asset,\n AssetCryptoAmount,\n Chain,\n CryptoAmount,\n SECURED_ASSET_DELIMITER,\n SYNTH_ASSET_DELIMITER,\n SecuredAsset,\n SynthAsset,\n TOKEN_ASSET_DELIMITER,\n TRADE_ASSET_DELIMITER,\n TokenAsset,\n TradeAsset,\n assetAmount,\n assetFromStringEx,\n assetToBase,\n assetToString,\n baseAmount,\n isSynthAsset,\n} from '@xchainjs/xchain-util'\nimport { BigNumber } from 'bignumber.js'\n\nimport { DefaultChainAttributes } from './chain-defaults'\nimport { LiquidityPool } from './liquidity-pool'\nimport { ThorchainCache } from './thorchain-cache'\nimport {\n AddliquidityPosition,\n AddressTradeAccounts,\n AddressTradeAccountsParams,\n Block,\n ChainAttributes,\n CompatibleAsset,\n DustValues,\n EstimateAddLP,\n EstimateAddSaver,\n EstimateWithdrawLP,\n EstimateWithdrawSaver,\n InboundDetail,\n LiquidityPosition,\n LoanCloseParams,\n LoanCloseQuote,\n LoanOpenParams,\n LoanOpenQuote,\n PoolRatios,\n PostionDepositValue,\n QuoteSwapParams,\n QuoteTHORName,\n QuoteTHORNameParams,\n RunePool,\n RunePoolParams,\n RunePoolProvider,\n RunePoolProviderParams,\n RunePoolProvidersParams,\n SaverFees,\n SaversPosition,\n SaversWithdraw,\n SwapHistoryParams,\n SwapsHistory,\n ThornameAlias,\n ThornameDetails,\n TotalFees,\n TradeAssetAccounts,\n TradeAssetAccountsParams,\n TradeAssetUnits,\n TradeAssetUnitsParams,\n TradeAssetsUnitsParams,\n TransactionAction,\n TxDetails,\n UnitData,\n WithdrawLiquidityPosition,\n getSaver,\n} from './types'\nimport {\n AssetRuneNative,\n BNBChain,\n GAIAChain,\n THORCHAIN_DECIMAL,\n THORChain,\n getCryptoAmountWithNotation,\n isAssetRuneNative,\n} from './utils'\nimport { getLiquidityProtectionData, getLiquidityUnits, getPoolShare, getSlipOnLiquidity } from './utils/liquidity'\nimport { calcNetworkFee, calcOutboundFee, getBaseAmountWithDiffDecimals, getChainAsset } from './utils/utils'\n\nconst defaultCache = new ThorchainCache()\n\n/**\n * ThorchainQuery Class for interacting with THORChain.\n * Recommended main class to use for swapping with THORChain\n * Has access to Midgard and THORNode data\n */\nexport class ThorchainQuery {\n readonly thorchainCache: ThorchainCache\n private chainAttributes: Record<Chain, ChainAttributes>\n\n /**\n * Constructor to create a ThorchainQuery\n *\n * @param thorchainCache - an instance of the ThorchainCache (could be pointing to stagenet,testnet,mainnet)\n * @param chainAttributes - attributes used to calculate waitTime & conf counting\n * @returns ThorchainAMM\n */\n constructor(thorchainCache = defaultCache, chainAttributes = DefaultChainAttributes) {\n this.thorchainCache = thorchainCache\n this.chainAttributes = chainAttributes\n }\n\n /** Quote a swap transaction.\n *\n * @param quoteSwapParams - Input parameters for the swap quote.\n * @returns Transaction details including memo, address, fees, etc.\n */\n public async quoteSwap({\n fromAsset,\n destinationAsset,\n amount,\n destinationAddress,\n streamingInterval,\n streamingQuantity,\n toleranceBps,\n affiliateBps,\n affiliateAddress,\n height,\n }: QuoteSwapParams): Promise<TxDetails> {\n // Validates swap and pushes error if there is one\n const errors: string[] = []\n\n const error = await this.validateAmount(amount)\n if (error) errors.push(error.message)\n\n const fromAssetString = assetToString(fromAsset)\n const toAssetString = assetToString(destinationAsset)\n const inputAmount = getBaseAmountWithDiffDecimals(amount, 8)\n\n // Fetch quote\n const swapQuote = await this.thorchainCache.thornode.getSwapQuote(\n fromAssetString,\n toAssetString,\n inputAmount.toNumber(),\n destinationAddress,\n streamingInterval,\n streamingQuantity,\n toleranceBps,\n affiliateBps,\n affiliateAddress,\n height,\n )\n\n let response\n\n // Check if swapQuote is a string, which we assume indicates an error message\n if (typeof swapQuote === 'string') {\n response = { error: swapQuote }\n } else {\n response = swapQuote\n }\n const responseError: { error?: string } = JSON.parse(JSON.stringify(response))\n if (responseError.error) errors.push(`Thornode request quote: ${responseError.error}`)\n if (errors.length > 0) {\n // If there are errors, construct and return a transaction details object with error information\n return {\n memo: ``,\n toAddress: ``,\n dustThreshold: new AssetCryptoAmount(baseAmount(0), AssetRuneNative),\n expiry: new Date(),\n txEstimate: {\n totalFees: {\n asset: destinationAsset,\n affiliateFee: new AssetCryptoAmount(baseAmount(0), AssetRuneNative),\n outboundFee: new AssetCryptoAmount(baseAmount(0), AssetRuneNative),\n },\n slipBasisPoints: 0,\n netOutput: new CryptoAmount(baseAmount(0), destinationAsset),\n outboundDelaySeconds: 0,\n inboundConfirmationSeconds: 0,\n canSwap: false,\n errors,\n netOutputStreaming: new AssetCryptoAmount(baseAmount(0), AssetRuneNative),\n maxStreamingQuantity: 0,\n outboundDelayBlocks: 0,\n streamingSlipBasisPoints: 0,\n streamingSwapBlocks: 0,\n streamingSwapSeconds: 0,\n totalSwapSeconds: 0,\n warning: '',\n },\n }\n }\n // The recommended minimum inbound amount for this transaction type & inbound asset.\n // Sending less than this amount could result in failed refunds\n const feeAsset = assetFromStringEx(swapQuote.fees.asset) as Asset | TokenAsset | SynthAsset\n const feeAssetDecimals = await this.thorchainCache.midgardQuery.getDecimalForAsset(feeAsset)\n const destinationAssetDecimals = await this.thorchainCache.midgardQuery.getDecimalForAsset(destinationAsset)\n if (swapQuote.recommended_min_amount_in && inputAmount.toNumber() < Number(swapQuote.recommended_min_amount_in))\n errors.push(\n `Error amount in: ${inputAmount.toNumber()} is less than reccommended Min Amount: ${\n swapQuote.recommended_min_amount_in\n }`,\n )\n // Check to see if memo is undefined\n if (swapQuote.memo === undefined) errors.push(`Error parsing swap quote: Memo is ${swapQuote.memo}`)\n\n // No errors ? and memo is returned ? return quote flag canSwap to true\n const txDetails: TxDetails = {\n memo: swapQuote.memo ? swapQuote.memo : '',\n dustThreshold: getCryptoAmountWithNotation(\n new CryptoAmount(baseAmount(swapQuote.dust_threshold), fromAsset),\n amount.baseAmount.decimal,\n ),\n toAddress: swapQuote.inbound_address ? swapQuote.inbound_address : '',\n expiry: new Date(swapQuote.expiry * 1000),\n txEstimate: {\n totalFees: {\n asset: destinationAsset,\n affiliateFee: getCryptoAmountWithNotation(\n new CryptoAmount(baseAmount(swapQuote.fees.affiliate), feeAsset),\n feeAssetDecimals,\n ),\n outboundFee: getCryptoAmountWithNotation(\n new CryptoAmount(baseAmount(swapQuote.fees.outbound), feeAsset),\n feeAssetDecimals,\n ),\n },\n slipBasisPoints: swapQuote.fees.slippage_bps,\n netOutput: getCryptoAmountWithNotation(\n new CryptoAmount(baseAmount(swapQuote.expected_amount_out), destinationAsset),\n destinationAssetDecimals,\n ),\n netOutputStreaming: getCryptoAmountWithNotation(\n new CryptoAmount(baseAmount(swapQuote.expected_amount_out), destinationAsset),\n destinationAssetDecimals,\n ),\n outboundDelaySeconds: swapQuote.outbound_delay_seconds,\n inboundConfirmationSeconds: swapQuote.inbound_confirmation_seconds,\n recommendedMinAmountIn: swapQuote.recommended_min_amount_in,\n maxStreamingQuantity: swapQuote.max_streaming_quantity ? swapQuote.max_streaming_quantity : 0,\n outboundDelayBlocks: swapQuote.outbound_delay_blocks,\n streamingSlipBasisPoints: swapQuote.fees.slippage_bps,\n streamingSwapBlocks: swapQuote.streaming_swap_blocks ? swapQuote.streaming_swap_blocks : 0,\n streamingSwapSeconds: swapQuote.streaming_swap_seconds ? swapQuote.streaming_swap_seconds : 0,\n totalSwapSeconds: swapQuote.total_swap_seconds ? swapQuote.total_swap_seconds : 0,\n canSwap: !swapQuote.memo || errors.length > 0 ? false : true,\n errors,\n warning: swapQuote.warning,\n },\n }\n return txDetails\n }\n\n /**\n * Validate a cryptoAmount is well formed\n * @param {CryptoAmount} cryptoAmount - CryptoAmount to validate\n * @returns {void | Error} Error if the cryptoAmount is not well formed\n */\n public async validateAmount(cryptoAmount: CryptoAmount<CompatibleAsset>): Promise<Error | void> {\n // Get the number of decimals for the asset\n const assetDecimals = await this.thorchainCache.midgardQuery.getDecimalForAsset(cryptoAmount.asset)\n // Check if the base amount decimal is equal to the asset's decimal\n if (cryptoAmount.baseAmount.decimal !== assetDecimals)\n return new Error(\n `Invalid number of decimals: ${assetToString(cryptoAmount.asset)} must have ${assetDecimals} decimals`,\n )\n }\n\n /**\n * Works out how long an outbound Tx will be held by THORChain before sending.\n * @param outboundAmount: CryptoAmount being sent.\n * @returns required delay in seconds\n * @see https://gitlab.com/thorchain/thornode/-/blob/develop/x/thorchain/manager_txout_current.go#L548\n */\n async outboundDelay(outboundAmount: CryptoAmount<Asset | TokenAsset>): Promise<number> {\n // Retrieve network values\n const networkValues = await this.thorchainCache.getNetworkValues()\n // Create CryptoAmounts for minimum transaction out volume threshold and maximum transaction out offset\n const minTxOutVolumeThreshold = new AssetCryptoAmount(\n baseAmount(networkValues['MINTXOUTVOLUMETHRESHOLD']),\n AssetRuneNative,\n )\n const maxTxOutOffset = networkValues['MAXTXOUTOFFSET']\n // Get the delay rate for outbound transactions\n let txOutDelayRate = new AssetCryptoAmount(baseAmount(networkValues['TXOUTDELAYRATE']), AssetRuneNative).assetAmount\n .amount()\n .toNumber()\n // Get the outbound queue\n const getQueue = await this.thorchainCache.thornode.getQueue()\n // Create a CryptoAmount for the scheduled outbound value\n const outboundValue = new AssetCryptoAmount(baseAmount(getQueue.scheduled_outbound_value), AssetRuneNative)\n // Get the average block time for THORChain\n const thorChainblocktime = this.chainAttributes[THORChain].avgBlockTimeInSecs // blocks required to confirm tx\n // Convert the outbound amount to its value in RUNE\n const runeValue = await this.thorchainCache.convert(outboundAmount, AssetRuneNative)\n // Check if the rune value is less than the minimum transaction out volume threshold\n if (runeValue.lt(minTxOutVolumeThreshold)) {\n return thorChainblocktime\n }\n // Check if the outbound value is undefined\n if (outboundValue == undefined) {\n throw new Error(`Could not return Scheduled Outbound Value`)\n }\n // Calculate the total outbound amount in rune\n const outboundAmountTotal = runeValue.plus(outboundValue)\n // Calculate the volume threshold\n const volumeThreshold = outboundAmountTotal.div(minTxOutVolumeThreshold)\n // Adjust the delay rate based on the volume threshold\n txOutDelayRate = txOutDelayRate - volumeThreshold.assetAmount.amount().toNumber() <= 1 ? 1 : txOutDelayRate\n // Calculate the minimum number of blocks required for the transaction to be confirmed\n let minBlocks = runeValue.assetAmount.amount().toNumber() / txOutDelayRate\n minBlocks = minBlocks > maxTxOutOffset ? maxTxOutOffset : minBlocks\n // Return the required delay in seconds\n return minBlocks * thorChainblocktime\n }\n\n /**\n * Convenience method to convert TotalFees to a different CryptoAmount\n * TotalFees are always calculated and returned in RUNE, this method can\n * be used to show the equivalent fees in another Asset Type\n * @param fees: TotalFees - the fees you want to convert\n * @param asset: Asset - the asset you want the fees converted to\n * @returns TotalFees in asset\n */\n async getFeesIn(fees: TotalFees, asset: CompatibleAsset): Promise<TotalFees> {\n // Return the fees converted to the specified asset\n return {\n asset: fees.asset, // Shouldn't be asset?\n // swapFee: await this.convert(fees.swapFee, asset),\n outboundFee: await this.convert(fees.outboundFee, asset),\n affiliateFee: await this.convert(fees.affiliateFee, asset),\n // totatBps: fees.totatBps,\n }\n }\n\n /**\n * Returns the exchange of a CryptoAmount to a different Asset\n * Ex. convert(input:100 BUSD, outAsset: BTC) -> 0.0001234 BTC\n * @param input - amount/asset to convert to outAsset\n * @param ouAsset - the Asset you want to convert to\n * @returns CryptoAmount of input\n */\n async convert<T extends Asset | TokenAsset | SynthAsset | TradeAsset | SecuredAsset>(\n input: CryptoAmount<Asset | TokenAsset | SynthAsset | TradeAsset | SecuredAsset>,\n outAsset: T,\n ): Promise<CryptoAmount<T>> {\n // Convert the input amount to the specified asset\n return await this.thorchainCache.convert(input, outAsset)\n }\n /**\n * Finds the required confCount required for an inbound or outbound Tx to THORChain. Estimate based on Midgard data only.\n * Finds the gas asset of the given asset (e.g. BUSD is on BNB), finds the value of asset in Gas Asset then finds the required confirmation count.\n * ConfCount is then times by 6 seconds.\n * @param inbound: CryptoAmount - amount/asset of the outbound amount.\n * @returns time in seconds before a Tx is confirmed by THORChain\n * @see https://docs.thorchain.org/chain-clients/overview\n */\n async confCounting(inbound: CryptoAmount): Promise<number> {\n // Check for instant finality assets or synths\n if (\n isAssetRuneNative(inbound.asset) ||\n inbound.asset.chain == BNBChain ||\n inbound.asset.chain == GAIAChain ||\n isSynthAsset(inbound.asset)\n ) {\n // Return the average block time for THORChain\n return this.chainAttributes[THORChain].avgBlockTimeInSecs\n }\n // Get the gas asset for the inbound asset's chain\n const chainGasAsset = getChainAsset(inbound.asset.chain)\n // Convert the inbound amount to the gas asset\n const amountInGasAsset = await this.thorchainCache.convert(inbound, chainGasAsset)\n // Get the number of confirmations required based on the asset's value in the gas asset\n const amountInGasAssetInAsset = amountInGasAsset.assetAmount\n const confConfig = this.chainAttributes[inbound.asset.chain]\n const requiredConfs = Math.ceil(amountInGasAssetInAsset.amount().div(confConfig.blockReward).toNumber())\n // Convert the number of confirmations to seconds\n return requiredConfs * confConfig.avgBlockTimeInSecs\n }\n\n /**\n * Estimates a liquidity position for given crypto amount value, both asymmetrical and symmetrical\n * @param params - parameters needed for an estimated liquidity position\n * @returns - object of type EstimateLP\n */\n public async estimateAddLP(params: AddliquidityPosition): Promise<EstimateAddLP> {\n const errors: string[] = []\n // Check if either of the assets are synths or if the rune is not THOR.RUNE\n if (isSynthAsset(params.asset.asset) || isSynthAsset(params.rune.asset)) {\n errors.push('you cannot add liquidity with a synth')\n }\n if (!isAssetRuneNative(params.rune.asset)) errors.push('params.rune must be THOR.RUNE')\n // Get the pool for the asset\n const assetPool = await this.thorchainCache.getPoolForAsset(params.asset.asset)\n // Calculate liquidity units\n const lpUnits = getLiquidityUnits({ asset: params.asset, rune: params.rune }, assetPool)\n // Get inbound details\n const inboundDetails = await this.thorchainCache.getInboundDetails()\n // Create unit data\n const unitData: UnitData = {\n liquidityUnits: lpUnits,\n totalUnits: new BigNumber(assetPool.thornodeDetails.LP_units),\n }\n // Calculate pool share\n const poolShare = getPoolShare(unitData, assetPool)\n // Calculate wait time\n const assetWaitTimeSeconds = await this.confCounting(params.asset)\n const runeWaitTimeSeconds = await this.confCounting(params.rune)\n const waitTimeSeconds = assetWaitTimeSeconds > runeWaitTimeSeconds ? assetWaitTimeSeconds : runeWaitTimeSeconds\n // Calculate inbound fees\n let assetInboundFee = new CryptoAmount(baseAmount(0), params.asset.asset)\n let runeInboundFee = new AssetCryptoAmount(baseAmount(0), AssetRuneNative)\n\n if (!params.asset.assetAmount.eq(0)) {\n assetInboundFee = calcNetworkFee(params.asset.asset, inboundDetails[params.asset.asset.chain])\n if (assetInboundFee.assetAmount.amount().times(3).gt(params.asset.assetAmount.amount()))\n errors.push(`Asset amount is less than fees`)\n }\n if (!params.rune.assetAmount.eq(0)) {\n runeInboundFee = calcNetworkFee(params.rune.asset, inboundDetails[params.rune.asset.chain])\n if (runeInboundFee.assetAmount.amount().times(3).gt(params.rune.assetAmount.amount()))\n errors.push(`Rune amount is less than fees`)\n }\n // Calculate total fees\n const totalFees = (await this.convert(assetInboundFee, AssetRuneNative)).plus(runeInboundFee)\n // Calculate slip\n const slip = getSlipOnLiquidity({ asset: params.asset, rune: params.rune }, assetPool)\n // Create estimate LP object\n const estimateLP: EstimateAddLP = {\n assetPool: assetPool.thornodeDetails.asset,\n slipPercent: slip.times(100),\n poolShare: poolShare,\n lpUnits: baseAmount(lpUnits),\n runeToAssetRatio: assetPool.runeToAssetRatio,\n inbound: {\n fees: {\n asset: assetInboundFee,\n rune: runeInboundFee,\n total: totalFees,\n },\n },\n estimatedWaitSeconds: waitTimeSeconds,\n errors,\n canAdd: errors.length > 0 ? false : true,\n }\n return estimateLP\n }\n\n /**\n * @param - Asset for LP\n * @param address - address used for LP\n * @returns - Object of type LiquidityPosition\n */\n public async checkLiquidityPosition(\n asset: Asset | TokenAsset,\n assetOrRuneAddress?: string,\n ): Promise<LiquidityPosition> {\n const poolAsset = await this.thorchainCache.getPoolForAsset(asset)\n if (!poolAsset) throw Error(`Could not find pool for ${asset}`)\n if (!assetOrRuneAddress) throw Error(`No address provided ${assetOrRuneAddress}`)\n // Get the current block number for that chain\n const liquidityProvider = await this.thorchainCache.thornode.getLiquidityProvider(\n poolAsset.assetString,\n assetOrRuneAddress,\n )\n if (!liquidityProvider) throw Error(`Could not find LP for ${assetOrRuneAddress}`)\n // Current block number for that chain\n const blockData = (await this.thorchainCache.thornode.getLastBlock()).find((item) => item.chain === asset.chain)\n if (!blockData) throw Error(`Could not get block data`)\n // Pools total units & Lp's total units\n const unitData: UnitData = {\n totalUnits: new BigNumber(poolAsset.thornodeDetails.LP_units),\n liquidityUnits: new BigNumber(liquidityProvider.units),\n }\n const networkValues = await this.thorchainCache.thornode.getNetworkValues()\n // Create block object\n const block: Block = {\n current: blockData.thorchain,\n lastAdded: liquidityProvider.last_add_height,\n fullProtection: networkValues['FULLIMPLOSSPROTECTIONBLOCKS'],\n }\n\n const assetDecimals = await this.thorchainCache.midgardQuery.getDecimalForAsset(asset)\n // Get the current LP\n const currentLP: PostionDepositValue = {\n asset: baseAmount(liquidityProvider.asset_deposit_value, assetDecimals),\n rune: baseAmount(liquidityProvider.rune_deposit_value),\n }\n // Calculate pool share\n const poolShare = getPoolShare(unitData, poolAsset)\n // Liquidity Unit Value Index = sprt(assetdepth * runeDepth) / Poolunits\n // Using this formula we can work out an individual position to find LUVI and then the growth rate\n // Calculate deposit and redeem Liquidity Unit Value Index (LUVI)\n const depositLuvi = Math.sqrt(\n currentLP.asset.times(currentLP.rune).div(unitData.liquidityUnits).amount().toNumber(),\n )\n const redeemLuvi = Math.sqrt(\n poolShare.assetShare.baseAmount\n .times(poolShare.runeShare.baseAmount)\n .div(unitData.liquidityUnits)\n .amount()\n .toNumber(),\n )\n // Calculate LP growth\n const lpGrowth = redeemLuvi - depositLuvi\n const currentLpGrowth = lpGrowth > 0 ? lpGrowth / depositLuvi : 0\n // Get impermanent loss protection data\n const impermanentLossProtection = getLiquidityProtectionData(currentLP, poolShare, block)\n // Create Liquidity Position object\n const lpPosition: LiquidityPosition = {\n poolShare,\n lpGrowth: `${(currentLpGrowth * 100).toFixed(2)} %`,\n position: liquidityProvider,\n impermanentLossProtection: impermanentLossProtection,\n }\n return lpPosition\n }\n\n /**\n * Do not send assetNativeRune, There is no pool for it.\n * @param asset - asset required to find the pool\n * @returns - object type ratios\n */\n public async getPoolRatios(asset: Asset | TokenAsset): Promise<PoolRatios> {\n // Get pool data for the asset\n const assetPool = await this.thorchainCache.getPoolForAsset(asset)\n // Create pool ratios object\n const poolRatio: PoolRatios = {\n assetToRune: assetPool.assetToRuneRatio,\n runeToAsset: assetPool.runeToAssetRatio,\n }\n return poolRatio\n }\n\n /**\n * Estimates the result of withdrawing liquidity from a pool\n * @param params - parameters needed for estimating withdrawal of liquidity\n * @returns - object of type EstimateWithdrawLP\n */\n public async estimateWithdrawLP(params: WithdrawLiquidityPosition): Promise<EstimateWithdrawLP> {\n // Caution Dust Limits: BTC,BCH,LTC chains 10k sats; DOGE 1m Sats; ETH 0 wei; THOR 0 RUNE.\n const assetOrRuneAddress = params.assetAddress ? params.assetAddress : params.runeAddress\n // Check liquidity position for the provided asset\n const memberDetail = await this.checkLiquidityPosition(params.asset, assetOrRuneAddress)\n // Get dust values\n const dustValues = await this.getDustValues(getChainAsset(params.asset.chain)) // returns asset and rune dust values\n // Get asset pool\n const assetPool = await this.thorchainCache.getPoolForAsset(params.asset)\n // Calculate pool share\n const poolShare = getPoolShare(\n {\n liquidityUnits: new BigNumber(memberDetail.position.units),\n totalUnits: new BigNumber(assetPool.thornodeDetails.LP_units),\n },\n assetPool,\n )\n // Calculate slip on liquidity removal\n const slip = getSlipOnLiquidity(\n {\n asset: poolShare.assetShare,\n rune: poolShare.runeShare,\n },\n assetPool,\n )\n // Calculate wait time\n const waitTimeSecondsForAsset = await this.confCounting(poolShare.assetShare.div(params.percentage / 100))\n const waitTimeSecondsForRune = await this.confCounting(poolShare.runeShare.div(params.percentage / 100))\n let waitTimeSeconds = 0\n if (memberDetail.position.asset_address && memberDetail.position.rune_address) {\n waitTimeSeconds =\n waitTimeSecondsForAsset > waitTimeSecondsForRune ? waitTimeSecondsForAsset : waitTimeSecondsForRune\n } else if (memberDetail.position.asset_address) {\n waitTimeSeconds = waitTimeSecondsForAsset\n } else {\n waitTimeSeconds = waitTimeSecondsForRune\n }\n // Get inbound and outbound fees\n const allInboundDetails = await this.thorchainCache.getInboundDetails()\n const inboundDetails = allInboundDetails[params.asset.chain]\n const runeInbound = calcNetworkFee(AssetRuneNative, inboundDetails)\n const assetInbound = calcNetworkFee(params.asset, inboundDetails)\n const runeOutbound = calcOutboundFee(AssetRuneNative, inboundDetails)\n const assetOutbound = calcOutboundFee(params.asset, inboundDetails)\n // Create an EstimateWithdrawLP object\n const estimateLP: EstimateWithdrawLP = {\n assetAddress: memberDetail.position.asset_address, // Address for the asset\n runeAddress: memberDetail.position.rune_address, // Address for the rune\n slipPercent: slip.times(100), // Slip percentage\n inbound: {\n minToSend: {\n // Minimum amount to send\n rune: dustValues.rune, // Rune amount\n asset: dustValues.asset, // Asset amount\n total: (await this.convert(dustValues.asset, AssetRuneNative)).plus(dustValues.rune), // Total amount\n },\n fees: {\n // Inbound fees\n rune: runeInbound, // Rune fees\n asset: assetInbound, // Asset fees\n total: (await this.convert(assetInbound, AssetRuneNative)).plus(runeInbound), // Total fees\n },\n },\n outboundFee: {\n // Outbound fees\n asset: assetOutbound, // Asset fees\n rune: runeOutbound, // Rune fees\n total: (await this.convert(assetOutbound, AssetRuneNative)).plus(runeOutbound), // Total fees\n },\n assetAmount: poolShare.assetShare, // Asset amount\n runeAmount: poolShare.runeShare, // Rune amount\n lpGrowth: memberDetail.lpGrowth, // LP growth\n estimatedWaitSeconds: waitTimeSeconds, // Estimated wait time in seconds\n impermanentLossProtection: memberDetail.impermanentLossProtection, // Impermanent loss protection\n assetPool: assetPool.thornodeDetails.asset, // Asset pool\n }\n return estimateLP // Return the EstimateWithdrawLP object\n }\n /**\n * Can this become a queried constant? added to inbound_addresses or something\n * Retrieves dust values for the given asset\n * @param asset - The asset for which to retrieve dust values\n * @returns - Object containing dust values\n */\n private async getDustValues(asset: Asset): Promise<DustValues> {\n // Get the number of decimals for the asset\n const assetDecimals = await this.thorchainCache.midgardQuery.getDecimalForAsset(asset)\n // Determine the dust values based on the asset's chain\n switch (asset.chain) {\n case 'BTC':\n case `BCH`:\n case `LTC`:\n // Dust value: 10k sats\n return {\n asset: new AssetCryptoAmount(assetToBase(assetAmount(0.0001, assetDecimals)), asset),\n rune: new AssetCryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n case 'ETH':\n // Dust value: 0 wei\n return {\n asset: new AssetCryptoAmount(assetToBase(assetAmount(0, assetDecimals)), asset),\n rune: new AssetCryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n case 'THOR':\n // Dust value: 0 Rune\n return {\n asset: new AssetCryptoAmount(assetToBase(assetAmount(0, assetDecimals)), asset),\n rune: new AssetCryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n case 'GAIA':\n // Dust value: 0 GAIA\n return {\n asset: new AssetCryptoAmount(assetToBase(assetAmount(0, assetDecimals)), asset),\n rune: new AssetCryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n case 'DOGE':\n // Dust value: 1 million sats\n return {\n asset: new AssetCryptoAmount(assetToBase(assetAmount(0.01, assetDecimals)), asset),\n rune: new AssetCryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n case 'AVAX':\n // Dust value: 0 AVAX\n return {\n asset: new AssetCryptoAmount(assetToBase(assetAmount(0, assetDecimals)), asset),\n rune: new AssetCryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n case 'BSC':\n // Dust value: 0 BSC\n return {\n asset: new AssetCryptoAmount(assetToBase(assetAmount(0, assetDecimals)), asset),\n rune: new AssetCryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n case 'MAYA':\n // Dust value: 0 MAYA\n return {\n asset: new AssetCryptoAmount(assetToBase(assetAmount(0, assetDecimals)), asset),\n rune: new AssetCryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n default:\n throw Error('Unknown chain') // Throw error for unknown chain\n }\n }\n\n // Savers Queries\n // Derrived from https://dev.thorchain.org/thorchain-dev/connection-guide/savers-guide\n /**\n * Estimates the result of adding to a saver\n * @param addAmount - The amount to be added to the saver\n * @returns - Object of type EstimateAddSaver\n */\n public async estimateAddSaver(addAmount: CryptoAmount<Asset | TokenAsset>): Promise<EstimateAddSaver> {\n let errors: string[] = [] // Initialize errors array\n // Check for errors before sending quote\n errors = await this.getAddSaversEstimateErrors(addAmount)\n // Request parameter amount should always be in 1e8\n // Adjust decimals if chain decimals != 8\n const newAddAmount =\n addAmount.baseAmount.decimal != 8 ? getBaseAmountWithDiffDecimals(addAmount, 8) : addAmount.baseAmount.amount()\n // Fetch quote\n const depositQuote = await this.thorchainCache.thornode.getSaversDepositQuote(\n assetToString(addAmount.asset), // Convert asset to string\n newAddAmount.toNumber(), // Convert new amount to number\n )\n\n // Error handling\n const response: { error?: string } = JSON.parse(JSON.stringify(depositQuote))\n if (response.error) errors.push(`Thornode request quote failed: ${response.error}`) // Push error to array if exists\n\n // The recommended minimum inbound amount for this transaction type & inbound asset.\n // Sending less than this amount could result in failed refunds\n if (\n depositQuote.recommended_min_amount_in &&\n addAmount.baseAmount.amount().toNumber() < Number(depositQuote.recommended_min_amount_in)\n )\n errors.push(\n `Error amount in: ${addAmount.baseAmount.amount().toNumber()} is less than recommended Min Amount: ${\n depositQuote.recommended_min_amount_in\n }`,\n )\n // Return errors if there is any\n if (errors.length > 0) {\n // Return an object with default values and errors\n return {\n assetAmount: addAmount,\n estimatedDepositValue: new CryptoAmount(baseAmount(0), addAmount.asset),\n fee: {\n affiliate: new CryptoAmount(baseAmount(0), addAmount.asset),\n asset: addAmount.asset,\n outbound: new CryptoAmount(baseAmount(0), addAmount.asset),\n liquidity: new CryptoAmount(baseAmount(0), addAmount.asset),\n totalBps: depositQuote.fees.total_bps || 0,\n },\n expiry: new Date(0),\n toAddress: '',\n memo: '',\n saverCapFilledPercent: -1,\n estimatedWaitTime: -1,\n slipBasisPoints: -1,\n recommendedMinAmountIn: depositQuote.recommended_min_amount_in,\n canAddSaver: false,\n errors, // Errors\n }\n }\n\n // Get pool details\n const pool = (await this.thorchainCache.getPoolForAsset(addAmount.asset)).thornodeDetails\n // Get asset decimals\n const assetDecimals = await this.thorchainCache.midgardQuery.getDecimalForAsset(addAmount.asset)\n // Get fee asset decimals\n const feeAssetDecimals = await this.thorchainCache.midgardQuery.getDecimalForAsset(addAmount.asset)\n // Organize fees\n\n const feeAsset = assetFromStringEx(depositQuote.fees.asset) as Asset | TokenAsset\n\n const saverFees: SaverFees = {\n affiliate: getCryptoAmountWithNotation(\n // Affiliate fee\n new CryptoAmount(baseAmount(depositQuote.fees.affiliate), addAmount.asset), // Convert to base amount\n assetDecimals, // Asset decimals\n ),\n asset: feeAsset, // Asset fee\n outbound: getCryptoAmountWithNotation(\n // Outbound fee\n new CryptoAmount(baseAmount(depositQuote.fees.outbound), feeAsset), // Convert to base amount\n feeAssetDecimals, // Fee asset decimals\n ),\n liquidity: getCryptoAmountWithNotation(\n // Liquidity fee\n new CryptoAmount(baseAmount(depositQuote.fees.liquidity), feeAsset), // Convert to base amount\n feeAssetDecimals, // Fee asset decimals\n ),\n totalBps: depositQuote.fees.total_bps || 0, // Total basis points\n }\n\n // Define saver filled capacity\n const saverCapFilledPercent = (Number(pool.synth_supply) / Number(pool.balance_asset)) * 100\n\n // Return object\n const estimateAddSaver: EstimateAddSaver = {\n assetAmount: getCryptoAmountWithNotation(\n // Asset amount\n new CryptoAmount(baseAmount(depositQuote.expected_amount_out), addAmount.asset), // Convert to base amount\n assetDecimals, // Asset decimals\n ),\n estimatedDepositValue: getCryptoAmountWithNotation(\n // Estimated deposit value\n new CryptoAmount(baseAmount(depositQuote.expected_amount_deposit), addAmount.asset), // Convert to base amount\n assetDecimals, // Asset decimals\n ),\n fee: saverFees, // Fees\n expiry: new Date(depositQuote.expiry), // Expiry date\n toAddress: depositQuote.inbound_address, // Recipient address\n memo: depositQuote.memo, // Memo\n estimatedWaitTime: depositQuote.inbound_confirmation_seconds || 0, // Estimated wait time\n canAddSaver: errors.length === 0, // Can add saver flag\n slipBasisPoints: depositQuote.fees.slippage_bps, // Slip basis points\n saverCapFilledPercent, // Saver filled capacity\n recommendedMinAmountIn: depositQuote.recommended_min_amount_in, // Recommended minimum amount in\n errors, // Errors\n }\n return estimateAddSaver // Return the EstimateAddSaver object\n }\n\n /**\n * Estimates the result of withdrawing from a saver\n * @param withdrawParams - Withdrawal parameters including height, asset, address, and withdrawal basis points\n * @returns - Object of type EstimateWithdrawSaver\n */\n public async estimateWithdrawSaver(withdrawParams: SaversWithdraw): Promise<EstimateWithdrawSaver> {\n const errors: string[] = [] // Initialize errors array\n\n // Return error if asset in is incorrect\n if (isAssetRuneNative(withdrawParams.asset) || isSynthAsset(withdrawParams.asset))\n errors.push(`Native Rune and synth assets are not supported only L1's`)\n\n // Get inbound details\n const inboundDetails = await this.thorchainCache.getInboundDetails()\n\n // Check if there is a position before calling withdraw quote\n const checkPositon = await this.getSaverPosition(withdrawParams)\n\n // If there are errors in the position, return those errors\n if (checkPositon.errors.length > 0) {\n for (let i = 0; i < checkPositon.errors.length; i++) {\n errors.push(checkPositon.errors[i])\n }\n return {\n dustAmount: new AssetCryptoAmount(baseAmount(0), getChainAsset(withdrawParams.asset.chain)), // Dust amount\n dustThreshold: new AssetCryptoAmount(baseAmount(0), getChainAsset(withdrawParams.asset.chain)), // Dust threshold\n expectedAssetAmount: new CryptoAmount( // Expected asset amount\n assetToBase(assetAmount(checkPositon.redeemableValue.assetAmount.amount())), // Convert to base amount\n withdrawParams.asset, // Asset\n ),\n fee: {\n affiliate: new CryptoAmount(assetToBase(assetAmount(0)), withdrawParams.asset), // Affiliate fee\n asset: withdrawParams.asset, // Asset\n liquidity: new CryptoAmount(baseAmount(0), withdrawParams.asset), // Liquidity fee\n outbound: new CryptoAmount( // Outbound fee\n assetToBase(\n assetAmount(\n calcOutboundFee(withdrawParams.asset, inboundDetails[withdrawParams.asset.chain]).assetAmount.amount(),\n ),\n ),\n withdrawParams.asset,\n ),\n totalBps: 0, // Total basis points\n },\n expiry: new Date(0), // Expiry date\n toAddress: '', // Recipient address\n memo: '', // Memo\n inboundDelayBlocks: 0, // Number of blocks for inbound delay\n inboundDelaySeconds: 0, // Number of seconds for inbound delay\n outBoundDelayBlocks: 0, // Number of blocks for outbound delay\n outBoundDelaySeconds: 0, // Number of seconds for outbound delay\n slipBasisPoints: -1, // Slip basis points (negative value indicates no slip)\n errors, // Errors array\n }\n }\n // Request withdraw quote\n const withdrawQuote = await this.thorchainCache.thornode.getSaversWithdrawQuote(withdrawParams)\n\n // error handling\n const response: { error?: string } = JSON.parse(JSON.stringify(withdrawQuote))\n if (response.error) errors.push(`Thornode request quote failed: ${response.error}`)\n if (errors.length > 0) {\n // Return default values and errors if there are any errors\n return {\n dustAmount: new AssetCryptoAmount(baseAmount(0), getChainAsset(withdrawParams.asset.chain)),\n dustThreshold: new AssetCryptoAmount(baseAmount(0), getChainAsset(withdrawParams.asset.chain)),\n expectedAssetAmount: new CryptoAmount(assetToBase(assetAmount(0)), withdrawParams.asset),\n fee: {\n affiliate: new CryptoAmount(baseAmount(0), withdrawParams.asset),\n asset: withdrawParams.asset,\n liquidity: new CryptoAmount(baseAmount(0), withdrawParams.asset),\n outbound: new CryptoAmount(baseAmount(0), withdrawParams.asset),\n totalBps: 0,\n },\n expiry: new Date(0),\n toAddress: '',\n memo: '',\n inboundDelayBlocks: 0,\n inboundDelaySeconds: 0,\n outBoundDelayBlocks: 0,\n outBoundDelaySeconds: 0,\n slipBasisPoints: -1,\n errors,\n }\n }\n // Extract the withdraw asset and chain asset from the withdraw quote\n const withdrawAsset = assetFromStringEx(withdrawQuote.fees.asset) as Asset | TokenAsset\n const chainAsset = getChainAsset(withdrawParams.asset.chain)\n // Get the decimals for the withdraw asset and chain asset\n const withdrawAssetDecimals = await this.thorchainCache.midgardQuery.getDecimalForAsset(withdrawAsset)\n const chainAssetDecimals = await this.thorchainCache.midgardQuery.getDecimalForAsset(chainAsset)\n // Create an EstimateWithdrawSaver object with the necessary data\n const estimateWithdrawSaver: EstimateWithdrawSaver = {\n // Format the dust amount with appropriate notation and decimals\n dustAmount: getCryptoAmountWithNotation(\n new AssetCryptoAmount(baseAmount(withdrawQuote.dust_amount), chainAsset),\n chainAssetDecimals,\n ),\n // Format the dust threshold with appropriate notation and decimals\n dustThreshold: getCryptoAmountWithNotation(\n new AssetCryptoAmount(baseAmount(withdrawQuote.dust_threshold), chainAsset),\n chainAssetDecimals,\n ),\n // Format the expected asset amount with appropriate notation and decimals\n expectedAssetAmount: getCryptoAmountWithNotation(\n new CryptoAmount(baseAmount(withdrawQuote.expected_amount_out), withdrawParams.asset),\n withdrawAssetDecimals,\n ),\n // Format the withdrawal fees with appropriate notation and decimals\n fee: {\n affiliate: getCryptoAmountWithNotation(\n new CryptoAmount(baseAmount(withdrawQuote.fees.affiliate), withdrawAsset),\n withdrawAssetDecimals,\n ),\n asset: withdrawAsset,\n liquidity: getCryptoAmountWithNotation(\n new CryptoAmount(baseAmount(withdrawQuote.fees.liquidity), withdrawAsset),\n withdrawAssetDecimals,\n ),\n outbound: getCryptoAmountWithNotation(\n new CryptoAmount(baseAmount(withdrawQuote.fees.outbound), withdrawAsset),\n withdrawAssetDecimals,\n ),\n totalBps: withdrawQuote.fees.total_bps || 0,\n },\n // Set the expiry date\n expiry: new Date(withdrawQuote.expiry),\n // Set the recipient address\n toAddress: withdrawQuote.inbound_address,\n // Set the memo\n memo: withdrawQuote.memo,\n // Set the inbound delay blocks\n inboundDelayBlocks: withdrawQuote.inbound_confirmation_blocks || 0,\n // Set the inbound delay seconds\n inboundDelaySeconds: withdrawQuote.inbound_confirmation_seconds || 0,\n // Set the outbound delay blocks\n outBoundDelayBlocks: withdrawQuote.outbound_delay_blocks || 0,\n // Set the outbound delay seconds\n outBoundDelaySeconds: withdrawQuote.outbound_delay_seconds || 0,\n // Set the slip basis points\n slipBasisPoints: withdrawQuote.fees.slippage_bps,\n // Set the errors\n errors,\n }\n\n // Return the withdrawal estimation object\n return estimateWithdrawSaver\n }\n\n /**\n * Retrieve the position of a saver given the asset, address, and height.\n * @param params - Object containing the asset, address, and height.\n * @returns - Object representing the saver's position.\n */\n public async getSaverPosition(params: getSaver): Promise<SaversPosition> {\n // Initialize errors array\n const errors: string[] = []\n // Retrieve inbound details\n const inboundDetails = await this.thorchainCache.getInboundDetails()\n // Get the decimals for the asset\n const assetDecimals = await this.thorchainCache.midgardQuery.getDecimalForAsset(params.asset)\n // Retrieve block data for the specified asset chain\n const blockData = (await this.thorchainCache.thornode.getLastBlock()).find(\n (item: LastBlock) => item.chain === params.asset.chain,\n )\n // Retrieve the saver from the Thorchain node API\n const savers = (await this.thorchainCache.thornode.getSavers(`${params.asset.chain}.${params.asset.symbol}`)).find(\n (item) => item.asset_address.toLowerCase() === params.address.toLowerCase(),\n )\n // Retrieve pool details for the specified asset\n const pool = (await this.thorchainCache.getPoolForAsset(params.asset)).thornodeDetails\n // Push errors if necessary data is not found\n if (!savers) errors.push(`Could not find position for ${params.address}`)\n if (!savers?.last_add_height) errors.push(`Could not find position for ${params.address}`)\n if (!blockData?.thorchain) errors.push(`Could not get thorchain block height`)\n // Calculate the outbound fee\n const outboundFee = calcOutboundFee(params.asset, inboundDetails[params.asset.chain])\n const convertToBaseEight = getBaseAmountWithDiffDecimals(outboundFee, 8)\n // Push an error if the redeemable value is less than the outbound fee\n if (Number(savers?.asset_redeem_value) < convertToBaseEight.toNumber())\n errors.push(`Unlikely to withdraw balance as outbound fee is greater than redeemable amount`)\n // Calculate the redeemable value\n // Extract necessary data for calculation\n const ownerUnits = Number(savers?.units) // Number of units owned by the saver\n const lastAdded = Number(savers?.last_add_height) // Height at which the last addition was made to the pool\n const saverUnits = Number(pool.savers_units) // Total units in the pool\n const assetDepth = Number(pool.savers_depth) // Total asset depth in the pool\n\n // Calculate the redeemable value of the saver's position based on their ownership in the pool\n const redeemableValue = (ownerUnits / saverUnits) * assetDepth\n\n // Format the deposit amount and redeemable asset amount with appropriate notation and decimals\n const depositAmount = getCryptoAmountWithNotation(\n new CryptoAmount(baseAmount(savers?.asset_deposit_value), params.asset),\n assetDecimals,\n )\n const redeemableAssetAmount = getCryptoAmountWithNotation(\n new CryptoAmount(baseAmount(redeemableValue), params.asset),\n assetDecimals,\n )\n\n // Calculate the age of the saver's position in years and days\n const saversAge = (Number(blockData?.thorchain) - lastAdded) / ((365 * 86400) / 6)\n\n // Calculate the growth percentage of the saver's position\n const saverGrowth = redeemableAssetAmount.minus(depositAmount).div(depositAmount).times(100)\n\n // Create and populate a SaversPosition object with the calculated values\n const saversPos: SaversPosition = {\n depositValue: depositAmount, // Current deposit value of the saver\n redeemableValue: redeemableAssetAmount, // Redeemable value of the saver's position\n lastAddHeight: Number(savers?.last_add_height), // Height at which the last addition was made to the pool\n percentageGrowth: saverGrowth.assetAmount.amount().toNumber(), // Percentage growth of the saver's position\n ageInYears: saversAge, // Age of the saver's position in years\n ageInDays: saversAge * 365, // Age of the saver's position in days\n asset: params.asset, // Asset of the saver's position\n errors, // Array of any errors encountered during the calculation\n }\n\n // Return the SaversPosition object representing the saver's position\n return saversPos\n }\n\n /**\n * Get errors related to estimating the addition of funds to a saver's pool.\n * @param addAmount - Amount of funds to be added to the saver's pool.\n * @returns An array of strings representing any errors encountered during the estimation process.\n */\n private async getAddSaversEstimateErrors(addAmount: CryptoAmount<Asset | TokenAsset>): Promise<string[]> {\n const errors = []\n // Retrieve all pools\n const pools = await this.thorchainCache.getPools()\n // Filter out saver's pools with non-zero depth\n const saversPools = Object.values(pools).filter((i) => i.thornodeDetails.savers_depth !== '0')\n // Retrieve inbound details\n const inboundDetails = await this.thorchainCache.getInboundDetails()\n // Find the saver's pool corresponding to the provided asset\n const saverPool = saversPools.find((i) => assetToString(i.asset) === assetToString(addAmount.asset))\n // Check if a saver's pool exists for the provided asset\n if (!saverPool) errors.push(` ${assetToString(addAmount.asset)} does not have a saver's pool`)\n // Check if the chain for the provided asset is halted\n if (inboundDetails[addAmount.asset.chain].haltedChain) errors.push(`${addAmount.asset.chain} is halted, cannot add`)\n // Get details of the pool for the provided asset\n const pool = (await this.thorchainCache.getPoolForAsset(addAmount.asset)).thornodeDetails\n // Check if the pool for the provided asset is available\n if (pool.status.toLowerCase() !== 'available')\n errors.push(`Pool is not available for this asset ${assetToString(addAmount.asset)}`)\n // Calculate inbound fee for the provided asset\n const inboundFee = new CryptoAmount(baseAmount(inboundDetails[addAmount.asset.chain].gasRate), addAmount.asset)\n // Convert inbound fee to the same asset as the addAmount to ensure consistency in calculations\n const inboundFeeInAddAmountAsset = (await this.convert(inboundFee, addAmount.asset)) as CryptoAmount<\n Asset | TokenAsset\n >\n // Check if the addAmount covers the inbound fees\n if (addAmount.lte(inboundFeeInAddAmountAsset)) errors.push(`Add amount does not cover fees`)\n // Return array of errors encountered during estimation\n return errors\n }\n\n /**\n *\n * @param loanOpenParams - params needed for the end Point\n * @returns\n */\n public async getLoanQuoteOpen({\n asset,\n amount,\n targetAsset,\n destination,\n minOut,\n affiliateBps,\n affiliate,\n height,\n }: LoanOpenParams): Promise<LoanOpenQuote> {\n const errors: string[] = []\n const loanOpenResp = await this.thorchainCache.thornode.getLoanQuoteOpen(\n `${asset.chain}.${asset.symbol}`,\n amount.baseAmount.amount().toNumber(),\n `${targetAsset.chain}.${targetAsset.symbol}`,\n destination,\n minOut,\n affiliateBps,\n affiliate,\n height,\n )\n const response: { error?: string } = JSON.parse(JSON.stringify(loanOpenResp))\n if (response.error) errors.push(`Thornode request quote failed: ${response.error}`)\n if (\n loanOpenResp.recommended_min_amount_in &&\n amount.baseAmount.amount().toNumber() < Number(loanOpenResp.recommended_min_amount_in)\n )\n errors.push(\n `Error amount in: ${amount.baseAmount.amount().toNumber()} is less than reccommended Min Amount: ${\n loanOpenResp.recommended_min_amount_in\n }`,\n )\n if (errors.length > 0) {\n return {\n inboundAddress: '',\n expectedWaitTime: {\n outboundDelayBlocks: undefined,\n outbondDelaySeconds: undefined,\n },\n fees: {\n asset: '',\n liquidity: undefined,\n outbound: undefined,\n total_bps: undefined,\n },\n slippageBps: undefined,\n router: undefined,\n expiry: 0,\n warning: '',\n notes: '',\n dustThreshold: undefined,\n recommendedMinAmountIn: loanOpenResp.recommended_min_amount_in,\n memo: undefined,\n expectedAmountOut: '',\n expectedCollateralizationRatio: '',\n expectedCollateralDeposited: '',\n expectedDebtIssued: '',\n errors: errors,\n }\n }\n const loanOpenQuote: LoanOpenQuote = {\n inboundAddress: loanOpenResp.inbound_address,\n expectedWaitTime: {\n outboundDelayBlocks: loanOpenResp.outbound_delay_blocks,\n outbondDelaySeconds: loanOpenResp.outbound_delay_seconds,\n },\n fees: {\n asset: loanOpenResp.fees.asset,\n liquidity: loanOpenResp.fees.liquidity,\n outbound: loanOpenResp.fees.outbound,\n total_bps: loanOpenResp.fees.total_bps,\n },\n slippageBps: loanOpenResp.fees.slippage_bps,\n router: loanOpenResp.router,\n expiry: loanOpenResp.expiry,\n warning: loanOpenResp.warning,\n notes: loanOpenResp.notes,\n dustThreshold: loanOpenResp.dust_threshold,\n recommendedMinAmountIn: loanOpenResp.recommended_min_amount_in,\n memo: loanOpenResp.memo,\n expectedAmountOut: loanOpenResp.expected_amount_out,\n expectedCollateralizationRatio: loanOpenResp.expected_collateralization_ratio,\n expectedCollateralDeposited: loanOpenResp.expected_collateral_deposited,\n expectedDebtIssued: loanOpenResp.expected_debt_issued,\n errors: errors,\n }\n return loanOpenQuote\n }\n\n /**\n * Get a quote for opening a loan.\n * @param loanOpenParams - Parameters needed for the endpoint.\n * @returns A Promise resolving to a LoanOpenQuote.\n */\n public async getLoanQuoteClose({\n asset,\n amount,\n loanAsset,\n loanOwner,\n minOut,\n height,\n }: LoanCloseParams): Promise<LoanCloseQuote> {\n const errors: string[] = []\n // Retrieve loan open response from ThorNode API\n const loanCloseResp = await this.thorchainCache.thornode.getLoanQuoteClose(\n `${asset.chain}.${asset.symbol}`,\n amount.baseAmount.amount().toNumber(),\n `${loanAsset.chain}.${loanAsset.symbol}`,\n loanOwner,\n minOut,\n height,\n )\n // Parse loan open response\n const response: { error?: string } = JSON.parse(JSON.stringify(loanCloseResp))\n // Check for errors in response\n if (response.error) errors.push(`Thornode request quote failed: ${response.error}`)\n // If errors exist, return an object with error details\n if (errors.length > 0) {\n return {\n inboundAddress: '',\n expectedWaitTime: {\n outboundDelayBlocks: undefined,\n outbondDelaySeconds: undefined,\n },\n fees: {\n asset: '',\n liquidity: undefined,\n outbound: undefined,\n total_bps: undefined,\n },\n slippageBps: undefined,\n router: undefined,\n expiry: 0,\n warning: '',\n notes: '',\n dustThreshold: undefined,\n recommendedMinAmountIn: loanCloseResp.recommended_min_amount_in,\n memo: undefined,\n expectedAmountOut: '',\n expectedCollateralWithdrawn: '',\n expectedDebtRepaid: '',\n errors: errors,\n }\n }\n // Construct loan open quote object\n const loanCloseQuote: LoanCloseQuote = {\n inboundAddress: loanCloseResp.inbound_address,\n expectedWaitTime: {\n outboundDelayBlocks: loanCloseResp.outbound_delay_blocks,\n outbondDelaySeconds: loanCloseResp.outbound_delay_seconds,\n },\n fees: {\n asset: loanCloseResp.fees.asset,\n liquidity: loanCloseResp.fees.liquidity,\n outbound: loanCloseResp.fees.outbound,\n total_bps: loanCloseResp.fees.total_bps,\n },\n slippageBps: loanCloseResp.fees.slippage_bps,\n router: loanCloseResp.router,\n expiry: loanCloseResp.expiry,\n warning: loanCloseResp.warning,\n notes: loanCloseResp.notes,\n dustThreshold: loanCloseResp.dust_threshold,\n recommendedMinAmountIn: loanCloseResp.recommended_min_amount_in,\n memo: loanCloseResp.memo,\n expectedAmountOut: loanCloseResp.expected_amount_out,\n expectedCollateralWithdrawn: loanCloseResp.expected_collateral_withdrawn,\n expectedDebtRepaid: loanCloseResp.expected_debt_repaid,\n errors: errors,\n }\n\n return loanCloseQuote\n }\n\n /**\n * Retrieve details for a THORName.\n * @param thorname - The THORName to get details for.\n * @param height - Optional parameter specifying the block height.\n * @returns A Promise resolving to ThornameDetails.\n */\n public async getThornameDetails(thorname: string, height?: number): Promise<ThornameDetails> {\n const errors: string[] = []\n\n try {\n // Retrieve THORName details from ThorNode API\n const thornameResp = await this.thorchainCache.thornode.getThornameDetails(thorname, height)\n const response: { error?: string } = JSON.parse(JSON.stringify(thornameResp))\n // Check for errors in response\n if (response.error) errors.push(`Thornode request quote failed: ${response.error}`)\n if (errors.length > 0) {\n // If errors exist, return an object with error details\n const errorResp: ThornameDetails = {\n name: '',\n expireBlockHeight: 0,\n owner: '',\n preferredAsset: '',\n affiliateCollectorRune: '',\n aliases: [],\n error: errors,\n }\n return errorResp\n }\n // Map aliases to ThornameAlias objects\n const thornameAliases: ThornameAlias[] = thornameResp.aliases.map((alias) => ({\n chain: alias.chain as Chain,\n address: alias.address as Address,\n }))\n // Construct ThornameDetails object\n const thornameDetails: ThornameDetails = {\n name: thornameResp.name || '',\n expireBlockHeight: thornameResp.expire_block_height || 0,\n owner: thornameResp.owner || '',\n preferredAsset: thornameResp.preferred_asset || '',\n affiliateCollectorRune: thornameResp.affiliate_collector_rune || '',\n aliases: thornameAliases || [],\n }\n return thornameDetails\n } catch (e) {\n // If an error occurs during the process, return an object with error details\n const errorResp: ThornameDetails = {\n name: '',\n expireBlockHeight: 0,\n owner: '',\n preferredAsset: '',\n affiliateCollectorRune: '',\n aliases: [],\n error: errors,\n }\n return errorResp\n }\n }\n\n /**\n * Generate the memo and estimate the cost of registering or updating a THORName.\n * @param thorname - The name to register or update.\n * @param chain - The chain to update/register.\n * @param chainAddress - The address to add to chain alias.\n * @param owner - The owner address (rune address).\n * @param preferredAsset - The preferred asset.\n * @param expirity - The expiry of the domain in MILLISECONDS.\n * @param isUpdate - True only if the domain is already registered and you want to update its data.\n * @returns Memo and value of deposit.\n */\n public async estimateThorname(params: QuoteTHORNameParams): Promise<QuoteTHORName> {\n // Check if THORName already exists\n const thornameDetails = await this.getThornameDetails(params.name)\n\n if (thornameDetails.owner !== '' && !params.isUpdate) {\n throw Error('Thorname already registered')\n }\n // Retrieve block data\n const blockData = await this.thorchainCache.thornode.getLastBlock()\n const currentThorchainHeight = blockData[0].thorchain\n const currentHeightForExpirity = params.isUpdate\n ? (thornameDetails?.expireBlockHeight as number)\n : currentThorchainHeight\n\n // Default expiry\n let numberOfBlocksToAddToExpirity = params.isUpdate ? 0 : 5259600 // One year by default\n\n // Compute expiry height\n if (params.expiry) {\n const currentTimestamp = Math.floor(Date.now() / 1000)\n const expirityTimestamp = Math.floor(params.expiry.getTime() / 1000)\n const numberOfSecondsToExpire = expirityTimestamp - currentTimestamp\n const numberOfBlocks = Math.round(numberOfSecondsToExpire / 6)\n const newHeightExpirity = currentThorchainHeight + numberOfBlocks\n numberOfBlocksToAddToExpirity = thornameDetails?.expireBlockHeight\n ? newHeightExpirity - thornameDetails?.expireBlockHeight\n : numberOfBlocks\n }\n // Compute value\n const constantsDetails = await this.thorchainCache.thornode.getTcConstants()\n const oneTimeFee = params.isUpdate ? baseAmount(0) : baseAmount(constantsDetails['TNSRegisterFee'])\n const totalFeePerBlock = baseAmount(constantsDetails['TNSFeePerBlock']).times(\n numberOfBlocksToAddToExpirity > 0 ? numberOfBlocksToAddToExpirity : 0,\n )\n const txFee = baseAmount(constantsDetails['NativeTransactionFee'], THORCHAIN_DECIMAL)\n const totalCost = new CryptoAmount(oneTimeFee.plus(totalFeePerBlock).plus(txFee), AssetRuneNative)\n const thornameMemo = `~:${params.name}:${\n params.isUpdate ? params.chain || thornameDetails?.aliases[0].chain : params.chain\n }:${params.isUpdate ? params.chainAddress || thornameDetails?.aliases[0].address : params.chainAddress}:${\n params.owner ? params.owner : ''\n }:${params.preferredAsset ? assetToString(params.preferredAsset) : ''}:${\n params.isUpdate ? '' : currentHeightForExpirity + numberOfBlocksToAddToExpirity\n }`.replace(/^:+|:+$/g, '')\n return {\n memo: thornameMemo,\n value: totalCost,\n }\n }\n\n /**\n * Get inbound addresses details\n * @returns Inbound details\n */\n public async getInboundDetails(): Promise<Record<string, InboundDetail>> {\n return this.thorchainCache.getInboundDetails()\n }\n\n /**\n * Get chain inbound address details\n * @returns Inbound details\n */\n public async getChainInboundDetails(chain: string): Promise<InboundDetail> {\n const inboundDetails = await this.getInboundDetails()\n if (!inboundDetails[chain]) throw Error(`No inbound details known for ${chain} chain`)\n return inboundDetails[chain]\n }\n\n /**\n * Get addresses swap history\n * @param {SwapHistoryParams} params Swap history params\n * @param {Address[]} params.addresses - List of addresses\n * @returns {SwapsHistory} Swap history\n */\n public async getSwapHistory({ addresses }: SwapHistoryParams): Promise<SwapsHistory> {\n const actionsResume = await this.thorchainCache.midgardQuery.midgardCache.midgard.getActions({\n address: addresses.join(','),\n type: 'swap',\n })\n const pools = await this.thorchainCache.getPools()\n\n const getInboundCryptoAmount = (\n pools: Record<string, LiquidityPool>,\n asset: string,\n amount: string,\n ): CryptoAmount => {\n const decimals = asset in pools ? pools[asset].thornodeDetails.decimals || THORCHAIN_DECIMAL : THORCHAIN_DECIMAL\n return decimals === THORCHAIN_DECIMAL\n ? new CryptoAmount(baseAmount(amount), assetFromStringEx(asset))\n : getCryptoAmountWithNotation(new CryptoAmount(baseAmount(amount), assetFromStringEx(asset)), decimals)\n }\n\n return {\n count: actionsResume.count ? Number(actionsResume.count) : 0,\n swaps: actionsResume.actions.map((action) => {\n const inboundTx: TransactionAction = {\n hash: action.in[0].txID,\n address: action.in[0].address,\n amount: getInboundCryptoAmount(pools, action.in[0].coins[0].asset, action.in[0].coins[0].amount),\n }\n\n const fromAsset: CompatibleAsset = inboundTx.amount.asset\n const toAsset: CompatibleAsset = this.getAssetFromMemo((action.metadata.swap as SwapMetadata).memo, pools)\n\n if (action.status === 'pending') {\n return {\n date: new Date(Number(action.date) / 10 ** 6),\n status: 'pending',\n fromAsset,\n toAsset,\n inboundTx,\n }\n }\n\n const transaction: Transaction = action.out\n .filter((out) => out.coins[0].asset === assetToString(toAsset))\n .sort((out1, out2) => Number(out2.coins[0].amount) - Number(out1.coins[0].amount))[0]\n\n return {\n date: new Date(Number(action.date) / 10 ** 6),\n status: 'success',\n fromAsset,\n toAsset,\n inboundTx,\n outboundTx: {\n hash: transaction.txID,\n address: transaction.address,\n amount: getInboundCryptoAmount(pools, transaction.coins[0].asset, transaction.coins[0].amount),\n },\n }\n }),\n }\n }\n\n /*\n * Returns the total units and depth of a trade asset\n * @param {TradeAssetUnitsParams} params Get trade asset unit params\n * @returns {TradeAssetUnits} Returns the total units and depth of a trade asset\n */\n public async getTradeAssetUnits({ asset, height }: TradeAssetUnitsParams): Promise<TradeAssetUnits> {\n const { units, depth } = await this.thorchainCache.thornode.getTradeAssetUnits(assetToString(asset), height)\n const decimals = await this.thorchainCache.midgardQuery.getDecimalForAsset(asset)\n return {\n asset,\n units: new CryptoAmount(baseAmount(units, decimals), asset),\n depth: new CryptoAmount(baseAmount(depth, decimals), asset),\n }\n }\n\n /*\n * Returns the total units and depth for each trade asset\n * @param {TradeAssetsUnitsParams} params Get trade asset unit params\n * @returns {TradeAssetUnits[]} Returns the total units and depth for each trade asset\n */\n public async getTradeAssetsUnits(params?: TradeAssetsUnitsParams): Promise<TradeAssetUnits[]> {\n const tradeAssetsUnits = await this.thorchainCache.thornode.getTradeAssetsUnits(params?.height)\n const parseData = async ({ asset, units, depth }: TradeUnitResponse): Promise<TradeAssetUnits> => {\n const tradeAsset = assetFromStringEx(asset) as TradeAsset\n const decimals = await this.thorchainCache.midgardQuery.getDecimalForAsset(tradeAsset)\n return {\n asset: tradeAsset,\n units: new CryptoAmount(baseAmount(units, decimals), tradeAsset),\n depth: new CryptoAmount(baseAmount(depth, decimals), tradeAsset),\n }\n }\n return Promise.all(tradeAssetsUnits.map(parseData))\n }\n\n /**\n * Returns the units and depth of a trade account address\n * @param {TradeAssetsUnitsParams} params Get trade asset unit params\n * @returns {TradeAssetUnits[]} Returns the total units and depth for each trade asset\n */\n public async getAddressTradeAccounts({\n address,\n height,\n }: AddressTradeAccountsParams): Promise<AddressTradeAccounts[]> {\n const account = await this.thorchainCache.thornode.getTradeAssetAccount(address, height)\n\n const parseData = async (tradeAssetInfo: TradeAccountResponse): Promise<AddressTradeAccounts> => {\n const asset = assetFromStringEx(tradeAssetInfo.asset) as TradeAsset\n return {\n asset,\n address,\n balance: new CryptoAmount(baseAmount(tradeAssetInfo.units), asset),\n lastAddHeight: tradeAssetInfo.last_add_height ? +tradeAssetInfo.last_add_height : undefined,\n lastWithdrawHeight: tradeAssetInfo.last_withdraw_height ? +tradeAssetInfo.last_withdraw_height : undefined,\n }\n }\n\n return Promise.all(account.map(parseData))\n }\n\n /**\n * Returns all trade accounts for a trade asset\n * @param {TradeAssetAccountsParams} params Get Trade asset accounts params\n * @param {number} height Optional - Block height\n * @returns Returns all trade accounts for an asset\n */\n public async getTradeAssetAccounts({ asset, height }: TradeAssetAccountsParams): Promise<TradeAssetAccounts[]> {\n const accounts = await this.thorchainCache.thornode.getTradeAssetAccounts(assetToString(asset), height)\n const decimals = await this.thorchainCache.midgardQuery.getDecimalForAsset(asset)\n return accounts.map((account) => {\n return {\n address: account.owner,\n asset,\n balance: new CryptoAmount(baseAmount(account.units, decimals), asset),\n lastAddHeight: account.last_add_height ? +account.last_add_height : undefined,\n lastWithdrawHeight: account.last_withdraw_height ? +account.last_withdraw_height : undefined,\n }\n })\n }\n\n /**\n * Get Rune pool\n * @param {GetRunePoolParmas} params Get Rune pool params\n * @returns {RunePool} Rune pool information\n */\n public async getRunePool(params?: RunePoolParams): Promise<RunePool> {\n const pool = await this.thorchainCache.thornode.getRunePool(params?.height)\n return {\n pol: {\n runeDeposited: new AssetCryptoAmount(baseAmount(pool.pol.rune_deposited, THORCHAIN_DECIMAL), AssetRuneNative),\n runeWithdrawn: new AssetCryptoAmount(baseAmount(pool.pol.rune_withdrawn, THORCHAIN_DECIMAL), AssetRuneNative),\n value: new AssetCryptoAmount(baseAmount(pool.pol.value, THORCHAIN_DECIMAL), AssetRuneNative),\n pnl: new AssetCryptoAmount(baseAmount(pool.pol.pnl, THORCHAIN_DECIMAL), AssetRuneNative),\n currentRuneDeposited: new AssetCryptoAmount(\n baseAmount(pool.pol.current_deposit, THORCHAIN_DECIMAL),\n AssetRuneNative,\n ),\n },\n providers: {\n units: pool.providers.units,\n pendingUnits: pool.providers.pending_units,\n pendingRune: new AssetCryptoAmount(baseAmount(pool.providers.pending_rune, THORCHAIN_DECIMAL), AssetRuneNative),\n value: new AssetCryptoAmount(baseAmount(pool.providers.value, THORCHAIN_DECIMAL), AssetRuneNative),\n pnl: new AssetCryptoAmount(baseAmount(pool.providers.pnl, THORCHAIN_DECIMAL), AssetRuneNative),\n currentRuneDeposited: new AssetCryptoAmount(\n baseAmount(pool.providers.current_deposit, THORCHAIN_DECIMAL),\n AssetRuneNative,\n ),\n },\n reserve: {\n units: pool.reserve.units,\n value: new AssetCryptoAmount(baseAmount(pool.reserve.value, THORCHAIN_DECIMAL), AssetRuneNative),\n pnl: new AssetCryptoAmount(baseAmount(pool.reserve.pnl, THORCHAIN_DECIMAL), AssetRuneNative),\n currentRuneDeposited: new AssetCryptoAmount(\n baseAmount(pool.reserve.current_deposit, THORCHAIN_DECIMAL),\n AssetRuneNative,\n ),\n },\n }\n }\n\n /**\n * Get Rune pool provider position\n * @param {RunePoolProviderParams} params Get Rune pool provider position params\n * @returns {RunePoolProvider} Rune pool provider position\n */\n public async getRunePoolProvider({ address, height }: RunePoolProviderParams): Promise<RunePoolProvider> {\n const position = await this.thorchainCache.thornode.getRunePoolProvider(address, height)\n\n return {\n address: position.rune_address,\n units: position.units,\n value: new AssetCryptoAmount(baseAmount(position.value), AssetRuneNative),\n pnl: new AssetCryptoAmount(baseAmount(position.pnl), AssetRuneNative),\n depositAmount: new AssetCryptoAmount(baseAmount(position.deposit_amount), AssetRuneNative),\n withdrawAmount: new AssetCryptoAmount(baseAmount(position.withdraw_amount), AssetRuneNative),\n lastDepositHeight: position.last_deposit_height,\n lastWithdrawHeight: position.last_withdraw_height,\n }\n }\n\n /**\n * Get all Rune pool providers position\n * @param {RunePoolProvidersParams} params Get Rune pool provider position params\n * @returns {RunePoolProvider[]} All Rune pool providers position\n */\n public async getRunePoolProviders(params?: RunePoolProvidersParams): Promise<RunePoolProvider[]> {\n const positions = await this.thorchainCache.thornode.getRunePoolProviders(params?.height)\n\n return positions.map((position) => {\n return {\n address: position.rune_address,\n units: position.units,\n value: new AssetCryptoAmount(baseAmount(position.value), AssetRuneNative),\n pnl: new AssetCryptoAmount(baseAmount(position.pnl), AssetRuneNative),\n depositAmount: new AssetCryptoAmount(baseAmount(position.deposit_amount), AssetRuneNative),\n withdrawAmount: new AssetCryptoAmount(baseAmount(position.withdraw_amount), AssetRuneNative),\n lastDepositHeight: position.last_deposit_height,\n lastWithdrawHeight: position.last_withdraw_height,\n }\n })\n }\n\n private getAssetFromMemo(memo: string, pools: Record<string, LiquidityPool>): CompatibleAsset {\n const getAssetFromAliasIfNeeded = (alias: string, pools: Record<string, LiquidityPool>): string => {\n const nativeAlias = new Map<string, string>([\n ['r', 'THOR.RUNE'],\n ['rune', 'THOR.RUNE'],\n ['b', 'BTC.BTC'],\n ['e', 'ETH.ETH'],\n ['g', 'GAIA.ATOM'],\n ['d', 'DOGE.DOGE'],\n ['l', 'LTC.LTC'],\n ['c', 'BCH.BCH'],\n ['a', 'AVAX.AVAX'],\n ['s', 'BSC.BNB'],\n ['f', 'BASE.ETH'],\n ])\n\n const nativeAsset = nativeAlias.get(alias.toLowerCase())\n if (nativeAsset) return nativeAsset\n\n let delimiter: string = TOKEN_ASSET_DELIMITER\n\n if (alias.includes(TRADE_ASSET_DELIMITER)) {\n delimiter = TRADE_ASSET_DELIMITER\n } else if (alias.includes(SYNTH_ASSET_DELIMITER)) {\n delimiter = SYNTH_ASSET_DELIMITER\n } else if (alias.includes(SECURED_ASSET_DELIMITER)) {\n delimiter = SECURED_ASSET_DELIMITER\n }\n\n const splitedAlias = alias.split(delimiter)\n const poolId = Object.keys(pools).find((pool) => pool === `${splitedAlias[0]}.${splitedAlias[1].split('-')[0]}`)\n\n if (poolId) return pools[poolId].assetString.replace('.', delimiter)\n\n return alias\n }\n\n const attributes = memo.split(':')\n if (!attributes[0]) throw Error(`Invalid memo: ${memo}`)\n\n switch (attributes[0]) {\n case 'SWAP':\n case '=':\n if (!attributes[1]) throw Error('Asset not defined')\n return assetFromStringEx(getAssetFromAliasIfNeeded(attributes[1], pools)) as CompatibleAsset\n default:\n throw Error(`Get asset from memo unsupported for ${attributes[0]} operation`)\n }\n }\n}\n","import { Saver, TxDetailsResponse, TxSignersResponse } from '@xchainjs/xchain-thornode'\nimport {\n Asset,\n Chain,\n CryptoAmount,\n TokenAsset,\n assetFromStringEx,\n baseAmount,\n isSynthAsset,\n} from '@xchainjs/xchain-util'\n\nimport { DefaultChainAttributes } from './chain-defaults'\nimport { ThorchainCache } from './thorchain-cache'\nimport { ChainAttributes, CompatibleAsset } from './types'\nimport { AssetRuneNative, THORChain, isAssetRuneNative } from './utils'\n/**\n * Enum representing different types of transactions.\n */\nexport enum TxType {\n Swap = 'Swap',\n AddLP = 'AddLP',\n WithdrawLP = 'WithdrawLP',\n AddSaver = 'AddSaver',\n WithdrawSaver = 'WithdrawSaver',\n Refund = 'Refund',\n Other = 'Other',\n Unknown = 'Unknown',\n}\n/**\n * Enum representing inbound transaction status.\n */\nexport enum InboundStatus {\n Observed_Consensus = 'Observed_Consensus',\n Observed_Incomplete = 'Observed_Incomplete',\n Unknown = 'Unknown',\n}\n/**\n * Enum representing swap transaction status.\n */\nexport enum SwapStatus {\n Complete = 'Complete',\n Complete_Refunded = 'Complete_Refunded',\n Complete_Below_Dust = 'Complete_Below_Dust',\n Incomplete = 'Incomplete',\n}\n/**\n * Enum representing add liquidity pool transaction status.\n */\nexport enum AddLpStatus {\n Complete = 'Complete',\n Complete_Refunded = 'Complete_Refunded',\n Complete_Below_Dust = 'Complete_Below_Dust',\n Incomplete = 'Incomplete',\n}\n/**\n * Enum representing withdraw transaction status.\n */\nexport enum WithdrawStatus {\n Complete = 'Complete',\n Incomplete = 'Incomplete',\n Complete_Refunded = 'Complete_Refunded',\n}\n/**\n * Enum representing refund transaction status.\n */\nexport enum RefundStatus {\n Complete = 'Complete',\n Incomplete = 'Incomplete',\n Complete_Refunded = 'Complete_Refunded',\n}\n/**\n * Enum representing add saver transaction status.\n */\nexport enum AddSaverStatus {\n Complete = 'Complete',\n Complete_Refunded = 'Complete_Refunded',\n Complete_Below_Dust = 'Complete_Below_Dust',\n Incomplete = 'Incomplete',\n}\n/**\n * Object representing swap information.\n */\nexport type SwapInfo = {\n status: SwapStatus\n toAddress: string\n minimumAmountOut: CryptoAmount\n affliateFee: CryptoAmount\n expectedOutBlock: number\n expectedOutDate: Date\n confirmations: number\n expectedAmountOut: CryptoAmount\n actualAmountOut?: CryptoAmount\n}\n/**\n * Object representing add liquidity pool information.\n */\nexport type AddLpInfo = {\n status: AddLpStatus\n isSymmetric: boolean\n assetTx?: InboundTx\n runeTx?: InboundTx\n assetConfirmationDate?: Date\n pool: Asset | TokenAsset\n}\n/**\n * Object representing withdraw saver information.\n */\nexport type WithdrawSaverInfo = {\n status: WithdrawStatus\n withdrawalAmount: CryptoAmount\n expectedConfirmationDate: Date\n thorchainHeight: number\n finalisedHeight: number\n outboundBlock: number\n estimatedWaitTime: number\n}\n/**\n * Object representing withdraw information.\n */\nexport type WithdrawInfo = {\n status: WithdrawStatus\n withdrawalAmount: CryptoAmount\n expectedConfirmationDate: Date\n thorchainHeight: number\n outboundHeight: number\n estimatedWaitTime: number\n}\n/**\n * Object representing refund information.\n */\nexport type RefundInfo = {\n status: RefundStatus\n refundAmount: CryptoAmount\n toAddress: string\n expectedConfirmationDate: Date\n finalisedHeight: number\n thorchainHeight: number\n outboundBlock: number\n estimatedWaitTime: number\n}\n/**\n * Object representing add saver information.\n */\nexport type AddSaverInfo = {\n status: AddSaverStatus\n assetTx?: InboundTx\n saverPos?: Saver\n}\n/**\n * Object representing inbound transaction.\n */\ntype InboundTx = {\n status: InboundStatus\n date: Date\n block: number\n expectedConfirmationBlock: number\n expectedConfirmationDate: Date\n amount: CryptoAmount\n fromAddress: string\n memo: string\n}\n/**\n * Object representing transaction progress.\n */\nexport type TXProgress = {\n txType: TxType\n inboundObserved?: InboundTx\n swapInfo?: SwapInfo\n addLpInfo?: AddLpInfo\n addSaverInfo?: AddSaverInfo\n withdrawLpInfo?: WithdrawInfo\n withdrawSaverInfo?: WithdrawSaverInfo\n refundInfo?: RefundInfo\n}\n/**\n * Class for managing transaction stages.\n */\nexport class TransactionStage {\n readonly thorchainCache: ThorchainCache\n private chainAttributes: Record<Chain, ChainAttributes>\n /**\n * Constructor to create a TransactionStage instance.\n * @param thorchainCache - ThorchainCache instance.\n * @param chainAttributes - ChainAttributes object representing default chain attributes.\n */\n constructor(thorchainCache: ThorchainCache, chainAttributes = DefaultChainAttributes) {\n this.thorchainCache = thorchainCache\n this.chainAttributes = chainAttributes\n }\n /**\n * Checks transaction progress.\n * @param inboundTxHash - Inbound transaction hash.\n * @returns Promise<TXProgress> - Transaction progress object.\n */\n public async checkTxProgress(inboundTxHash: string): Promise<TXProgress> {\n let txData\n try {\n if (inboundTxHash.length < 1) throw Error('inboundTxHash too short')\n txData = await this.thorchainCache.thornode.getTxDetail(inboundTxHash)\n // console.log(JSON.stringify(txData, null, 2))\n } catch (error) {\n return {\n txType: TxType.Unknown,\n }\n }\n //valid tx\n const progress = await this.determineObserved(txData)\n\n switch (progress.txType) {\n case TxType.Swap:\n await this.checkSwapProgress(txData, progress)\n break\n case TxType.AddLP:\n await this.checkAddLpProgress(txData, progress)\n break\n case TxType.WithdrawLP:\n await this.checkWithdrawLpProgress(txData, progress)\n break\n case TxType.AddSaver:\n await this.checkAddSaverProgress(txData, progress)\n break\n case TxType.WithdrawSaver:\n await this.checkWithdrawSaverProgress(txData, progress)\n break\n case TxType.Refund:\n await this.checkRefund(txData, progress)\n break\n case TxType.Other:\n break\n default:\n break\n }\n\n return progress\n }\n /**\n * Checks the progress of a swap transaction.\n * @param txData - Transaction details response.\n * @param progress - Transaction progress object.\n */\n private async checkSwapProgress(txData: TxDetailsResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n // Extract memo fields\n const memo = txData.tx.tx.memo ?? ''\n const memoFields = this.parseSwapMemo(memo)\n const assetOut = assetFromStringEx(memoFields.asset.toUpperCase())\n // Determine swap status\n const swapStatus = txData.out_txs[0].memo?.match('OUT') ? SwapStatus.Complete : SwapStatus.Complete_Refunded\n // Get current chain height for confirmations\n const chainHeight = await this.blockHeight(AssetRuneNative)\n\n // Expected outbound height and date\n const outboundHeight = Number(txData.outbound_height ?? txData.finalised_height)\n const expectedOutBlock = Number(txData.outbound_height ?? txData.finalised_height)\n const expectedOutDate = await this.blockToDate(THORChain, txData, outboundHeight) // height held in the scheduled queue\n // Calculate confirmations\n const confirmations = chainHeight > outboundHeight ? chainHeight - outboundHeight : 0\n // Calculate minimum amount out and affiliate fee\n const minimumAmountOut = memoFields.limit\n ? await this.getCryptoAmount(memoFields.limit, assetOut)\n : await this.getCryptoAmount('0', assetOut)\n\n const affliateFee = memoFields.affiliateFee\n ? await this.getCryptoAmount(memoFields.affiliateFee, assetOut)\n : await this.getCryptoAmount('0', assetOut)\n // Construct swap info object\n const swapInfo: SwapInfo = {\n status: swapStatus,\n expectedOutBlock,\n expectedOutDate,\n expectedAmountOut: minimumAmountOut, // TODO call estimateSwap()\n confirmations,\n minimumAmountOut,\n affliateFee,\n toAddress: memoFields.destAddress,\n }\n // Assign swap info to progress object\n progress.swapInfo = swapInfo\n }\n }\n /**\n * Parses swap memo to extract relevant fields.\n * @param memo - Transaction memo.\n * @returns Parsed swap memo fields.\n */\n private parseSwapMemo(memo: string) {\n //SWAP:ASSET:DESTADDR:LIM:AFFILIATE:FEE\n const parts = memo.split(`:`)\n const action = parts[0]\n const asset = parts[1]\n const destAddress = parts[2]\n const limit = parts.length > 3 && parts[3].length > 0 ? parts[3] : undefined\n const affiliateAddress = parts.length > 4 && parts[4].length > 0 ? parts[4] : undefined\n const affiliateFee = parts.length > 5 && parts[5].length > 0 ? parts[5] : undefined\n return { action, asset, destAddress, limit, affiliateAddress, affiliateFee }\n }\n /**\n * Retrieves a CryptoAmount object.\n * @param baseAmt - Base amount.\n * @param asset - Asset object.\n * @returns Promise<CryptoAmount> - CryptoAmount object.\n */\n private async getCryptoAmount(baseAmt: string, asset: CompatibleAsset): Promise<CryptoAmount<CompatibleAsset>> {\n const decimals =\n THORChain === asset.chain ? 8 : Number(await this.thorchainCache.midgardQuery.getDecimalForAsset(asset))\n return new CryptoAmount(baseAmount(baseAmt, decimals), asset)\n }\n /**\n * Determines the observed status of a transaction.\n * @param txData - Transaction signers response.\n * @returns Promise<TXProgress> - Transaction progress object.\n */\n private async determineObserved(txData: TxSignersResponse): Promise<TXProgress> {\n const progress: TXProgress = {\n txType: TxType.Unknown,\n }\n\n if (txData.tx) {\n const memo = txData.tx.tx.memo ?? ''\n const parts = memo?.split(`:`)\n const operation = parts && parts[0] ? parts[0] : ''\n const assetIn = assetFromStringEx(txData.tx.tx.coins?.[0].asset)\n const inboundAmount = txData.tx.tx.coins?.[0].amount\n const fromAddress = txData.tx.tx.from_address ?? 'unknkown'\n const block = txData.tx.tx.chain == THORChain ? Number(txData.finalised_height) : Number(txData.consensus_height)\n\n const finalizeBlock =\n txData.tx.tx.chain == THORChain ? Number(txData.finalised_height) : Number(txData.finalised_height)\n\n const status = txData.tx.status === 'done' ? InboundStatus.Observed_Consensus : InboundStatus.Observed_Incomplete\n\n if (operation.match(/swap|s|=/gi)) progress.txType = TxType.Swap\n if ((operation.match(/add/gi) && parts[1].match(`/`)) || (operation.match(/a|[+]/) && parts[1].match(/[/]/)))\n progress.txType = TxType.AddSaver\n if ((operation.match(/add/gi) && parts[1].match(`.`)) || (operation.match(/a|[+]/) && parts[1].match(/[.]/)))\n progress.txType = TxType.AddLP\n if (operation.match(/withdraw|wd|-/gi) && parts[1].match(/[/]/)) progress.txType = TxType.WithdrawSaver\n if (operation.match(/withdraw|wd|-/gi) && parts[1].match(/[.]/)) progress.txType = TxType.WithdrawLP\n if (operation.match(/refund/gi)) progress.txType = TxType.Refund\n if (operation.match(/out/gi)) progress.txType = TxType.Other\n\n const amount = await this.getCryptoAmount(inboundAmount, assetIn)\n // find a date for when it should be competed\n\n const dateObserved = await this.blockToDate(THORChain, txData)\n const expectedConfirmationDate =\n txData.tx.tx.chain === THORChain\n ? await this.blockToDate(THORChain, txData)\n : await this.blockToDate(assetIn.chain, txData)\n\n progress.inboundObserved = {\n status,\n date: dateObserved, // date observed?\n block,\n expectedConfirmationBlock: finalizeBlock,\n expectedConfirmationDate,\n amount,\n fromAddress,\n memo,\n }\n }\n return progress\n }\n /**\n * Checks the progress of an add liquidity pool transaction.\n * @param txData - Transaction details response.\n * @param progress - Transaction progress object.\n */\n private async checkAddLpProgress(txData: TxSignersResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n // Extract memo fields\n const memo = txData.tx.tx.memo ?? ''\n const memoFields = this.parseAddLpMemo(memo)\n const asset = assetFromStringEx(memoFields.asset) as Asset | TokenAsset\n const isSymmetric = memoFields.pairedAddress ? true : false\n // Determine if assetTx or runeTx\n const assetTx = !isAssetRuneNative(progress.inboundObserved.amount.asset) ? progress.inboundObserved : undefined\n const runeTx = isAssetRuneNative(progress.inboundObserved.amount.asset) ? progress.inboundObserved : undefined\n\n const pairedAssetExpectedConfirmationDate = assetTx ? await this.blockToDate(asset.chain, txData) : undefined\n const checkLpPosition = await this.thorchainCache.thornode.getLiquidityProvider(\n memoFields.asset,\n progress.inboundObserved.fromAddress,\n )\n const status = checkLpPosition ? AddLpStatus.Complete : AddLpStatus.Incomplete\n const addLpInfo: AddLpInfo = {\n status,\n isSymmetric,\n assetTx,\n runeTx,\n assetConfirmationDate: pairedAssetExpectedConfirmationDate,\n pool: asset,\n }\n progress.addLpInfo = addLpInfo\n }\n }\n /**\n * Checks the progress of a withdraw liquidity pool transaction.\n * @param txData - Transaction details response.\n * @param progress - Transaction progress object.\n */\n private async checkWithdrawLpProgress(txData: TxSignersResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n // Extract memo fields\n const memo = txData.tx.tx.memo ?? ''\n const memoFields = this.parseWithdrawLpMemo(memo)\n const asset = assetFromStringEx(memoFields.asset)\n // Get the last block object\n const lastBlockObj = await this.thorchainCache.thornode.getLastBlock()\n const currentHeight = lastBlockObj.find((obj) => obj)\n\n // Calculate expected confirmation date\n const outboundHeight = txData.tx.status === 'done' ? txData.finalised_height : Number(`${txData.outbound_height}`)\n\n const expectedConfirmationDate = await this.blockToDate(THORChain, txData, outboundHeight) // always pass in thorchain\n\n // Determine transaction status\n const status = txData.tx.status === 'done' ? WithdrawStatus.Complete : WithdrawStatus.Incomplete\n // Extract output amount\n const outAmount =\n status === WithdrawStatus.Complete ? JSON.stringify(txData.out_txs).split(`\"amount\":\"`)[1].split(`\"`) : ''\n // Extract relevant block heights and calculate estimated wait time\n const outboundBlock = Number(txData.outbound_height ?? txData.finalised_height)\n const currentTCHeight = Number(`${currentHeight?.thorchain}`)\n const estimatedWaitTime =\n outboundBlock > currentTCHeight\n ? (outboundBlock - currentTCHeight) * this.chainAttributes[THORChain].avgBlockTimeInSecs\n : 0\n // Get withdrawal amount\n const withdrawalAmount = await this.getCryptoAmount(outAmount[0], asset)\n // Construct withdraw liquidity pool info object\n const withdrawLpInfo: WithdrawInfo = {\n status,\n withdrawalAmount,\n expectedConfirmationDate,\n thorchainHeight: currentTCHeight,\n outboundHeight: outboundBlock,\n estimatedWaitTime,\n }\n // Assign withdraw liquidity pool info to progress object\n progress.withdrawLpInfo = withdrawLpInfo\n }\n }\n /**\n * Checks the progress of an add saver transaction.\n * @param txData - Transaction details response.\n * @param progress - Transaction progress object.\n */\n private async checkAddSaverProgress(txData: TxSignersResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n // Determine if it's an asset transaction\n const assetTx = !isAssetRuneNative(progress.inboundObserved.amount.asset) ? progress.inboundObserved : undefined\n // Check saver vaults\n const checkSaverVaults = await this.thorchainCache.thornode.getSaver(\n txData.tx.tx.coins[0].asset,\n `${assetTx?.fromAddress}`,\n )\n // Determine transaction status\n const status = checkSaverVaults ? AddSaverStatus.Complete : AddSaverStatus.Incomplete\n // Construct add saver info object\n const addSaverInfo: AddSaverInfo = {\n status: status,\n assetTx,\n saverPos: checkSaverVaults,\n }\n // Assign add saver info to progress object\n progress.addSaverInfo = addSaverInfo\n }\n }\n /**\n * Checks the progress of a withdraw saver transaction.\n * @param txData - Transaction details response.\n * @param progress - Transaction progress object.\n */\n private async checkWithdrawSaverProgress(txData: TxSignersResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n // Extract memo fields\n const memo = txData.tx.tx.memo ?? ''\n const memoFields = this.parseWithdrawLpMemo(memo)\n const asset = assetFromStringEx(memoFields.asset)\n // Get the last block object\n const lastBlockObj = await this.thorchainCache.thornode.getLastBlock()\n const currentHeight = lastBlockObj.find((obj) => obj)\n\n // Calculate expected confirmation date\n const outboundHeight = txData.tx.status === 'done' ? txData.finalised_height : Number(`${txData.outbound_height}`)\n\n const expectedConfirmationDate = await this.blockToDate(THORChain, txData, outboundHeight) // always pass in thorchain\n // Extract output amount\n const outAmount = txData.out_txs ? JSON.stringify(txData.out_txs).split(`\"amount\":\"`)[1].split(`\"`) : ''\n // Extract relevant block heights and calculate estimated wait time\n const outboundBlock = Number(txData.outbound_height)\n const finalisedHeight = Number(txData.finalised_height)\n const currentTCHeight = Number(`${currentHeight?.thorchain}`)\n const estimatedWaitTime =\n outboundBlock > currentTCHeight\n ? (outboundBlock - currentTCHeight) * this.chainAttributes[THORChain].avgBlockTimeInSecs +\n this.chainAttributes[asset.chain].avgBlockTimeInSecs\n : 0\n\n // Determine transaction status\n const status = txData.out_txs ? WithdrawStatus.Complete : WithdrawStatus.Incomplete\n // Get withdrawal amount\n const withdrawalAmount = await this.getCryptoAmount(outAmount[0], asset)\n // Construct withdraw saver info object\n const withdrawSaverInfo: WithdrawSaverInfo = {\n status,\n withdrawalAmount,\n expectedConfirmationDate,\n thorchainHeight: currentTCHeight,\n finalisedHeight,\n outboundBlock,\n estimatedWaitTime,\n }\n // Assign withdraw saver info to progress object\n progress.withdrawSaverInfo = withdrawSaverInfo\n }\n }\n /**\n * Checks the progress of a refund transaction.\n * @param txData - Transaction details response.\n * @param progress - Transaction progress object.\n */\n private async checkRefund(txData: TxSignersResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n // Get the last block object\n const lastBlockObj = await this.thorchainCache.thornode.getLastBlock()\n // Calculate expected confirmation date\n const outboundHeight = txData.tx.status === 'done' ? txData.finalised_height : Number(`${txData.outbound_height}`)\n\n const expectedConfirmationDate = await this.blockToDate(THORChain, txData, outboundHeight) // always pass in thorchain\n // Extract amount and asset\n const amount = txData.tx.tx.coins[0].amount\n const asset = assetFromStringEx(txData.tx.tx.coins[0].asset)\n const toAddress = `${txData.tx.tx.to_address}`\n const currentHeight = lastBlockObj.find((obj) => obj.chain === asset.chain)\n console.log(currentHeight)\n // Extract relevant block heights and calculate estimated wait time\n const outboundBlock = Number(`${currentHeight?.last_observed_in}`)\n const finalisedHeight = Number(txData.finalised_height)\n const currentTCHeight = Number(`${currentHeight?.thorchain}`)\n const estimatedWaitTime =\n outboundBlock > currentTCHeight\n ? (outboundBlock - currentTCHeight) * this.chainAttributes[THORChain].avgBlockTimeInSecs +\n this.chainAttributes[asset.chain].avgBlockTimeInSecs\n : 0\n\n // if the TC has process the block that the outbound tx was assigned to then its completed.\n const status = txData.tx.status === 'done' ? RefundStatus.Complete : RefundStatus.Incomplete\n\n const refundAmount = await this.getCryptoAmount(amount, asset)\n const refundInfo: RefundInfo = {\n status,\n refundAmount,\n toAddress,\n expectedConfirmationDate,\n thorchainHeight: currentTCHeight,\n finalisedHeight,\n outboundBlock,\n estimatedWaitTime,\n }\n progress.refundInfo = refundInfo\n }\n }\n /**\n * Parses the memo of an add liquidity pool transaction.\n * @param memo - Memo string of the transaction.\n * @returns Parsed memo fields.\n */\n private parseAddLpMemo(memo: string) {\n // Memo format: ADD:POOL:PAIREDADDR:AFFILIATE:FEE\n const parts = memo.split(`:`)\n const action = parts[0]\n const asset = parts[1]\n // Optional fields\n const pairedAddress = parts.length > 2 && parts[2].length > 0 ? parts[2] : undefined\n const affiliateAddress = parts.length > 3 && parts[3].length > 0 ? parts[3] : undefined\n const affiliateFee = parts.length > 4 && parts[4].length > 0 ? parts[4] : undefined\n return { action, asset, pairedAddress, affiliateAddress, affiliateFee }\n }\n /**\n * Parses the memo of a withdraw liquidity pool transaction.\n * @param memo - Memo string of the transaction.\n * @returns Parsed memo fields.\n */\n private parseWithdrawLpMemo(memo: string) {\n // Memo format: ADD:POOL:PAIREDADDR:AFFILIATE:FEE\n const parts = memo.split(`:`)\n const action = parts[0]\n const asset = parts[1]\n // Optional fields\n const pairedAddress = parts.length > 2 && parts[2].length > 0 ? parts[2] : undefined\n const affiliateAddress = parts.length > 3 && parts[3].length > 0 ? parts[3] : undefined\n const affiliateFee = parts.length > 4 && parts[4].length > 0 ? parts[4] : undefined\n return { action, asset, pairedAddress, affiliateAddress, affiliateFee }\n }\n /**\n * Converts block height to date.\n * @param chain - Input chain.\n * @param txData - Transaction response data.\n * @returns Date object.\n */\n private async blockToDate(chain: Chain, txData: TxSignersResponse, outboundBlock?: number) {\n const lastBlockObj = await this.thorchainCache.thornode.getLastBlock()\n const time = new Date()\n let blockDifference: number\n const currentHeight = lastBlockObj.find((obj) => obj.chain == chain)\n const chainHeight = Number(`${currentHeight?.last_observed_in}`)\n const recordedChainHeight = Number(`${txData.consensus_height}`)\n // If outbound time is required\n if (outboundBlock) {\n const currentHeight = lastBlockObj.find((obj) => obj)\n const thorchainHeight = Number(`${currentHeight?.thorchain}`)\n if (outboundBlock > thorchainHeight) {\n blockDifference = outboundBlock - thorchainHeight\n time.setSeconds(time.getSeconds() + blockDifference * this.chainAttributes[chain].avgBlockTimeInSecs)\n console.log(time)\n } else {\n blockDifference = thorchainHeight - outboundBlock // already processed find the date it was completed\n time.setSeconds(time.getSeconds() - blockDifference * this.chainAttributes[chain].avgBlockTimeInSecs)\n return time\n }\n }\n // Find out how long ago it was processed for all chains\n if (chain == THORChain) {\n const currentHeight = lastBlockObj.find((obj) => obj)\n const thorchainHeight = Number(`${currentHeight?.thorchain}`) // current height of the TC\n const finalisedHeight = Number(`${txData.finalised_height}`) // height tx was completed in\n blockDifference = thorchainHeight - finalisedHeight\n time.setSeconds(time.getSeconds() - blockDifference * this.chainAttributes[chain].avgBlockTimeInSecs) // note if using data from a tx that was before a thorchain halt this calculation becomes inaccurate...\n } else {\n // set the time for all other chains\n blockDifference = chainHeight - recordedChainHeight\n time.setSeconds(time.getSeconds() - blockDifference * this.chainAttributes[chain].avgBlockTimeInSecs)\n }\n return time\n }\n\n /**\n * Returns the current block height of an asset's native chain.\n * @param asset - Asset for which block height is needed.\n * @returns Block height.\n */\n private async blockHeight(asset: CompatibleAsset) {\n const lastBlockObj = await this.thorchainCache.thornode.getLastBlock()\n const currentHeight = lastBlockObj.find((obj) => obj.chain == asset.chain)\n let blockHeight\n if (asset.chain === THORChain || isSynthAsset(asset)) {\n const currentHeight = lastBlockObj.find((obj) => obj)\n blockHeight = Number(`${currentHeight?.thorchain}`)\n } else {\n blockHeight = Number(`${currentHeight?.last_observed_in}`)\n }\n return blockHeight\n }\n}\n"],"names":[],"mappings":"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"}