@xchainjs/xchain-thorchain-query 0.4.0 → 0.4.2

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 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/chain-defaults.ts","../src/crypto-amount.ts","../src/liquidity-pool.ts","../src/utils/const.ts","../src/utils/utils.ts","../src/utils/liquidity.ts","../src/utils/midgard.ts","../src/utils/thornode.ts","../src/thorchain-cache.ts","../src/thorchain-query.ts","../src/thorchain-checktx.ts"],"sourcesContent":["import { Chain } from '@xchainjs/xchain-util'\n\nimport { ChainAttributes } from './types'\n\nconst DefaultChainAttributes: Record<Chain, ChainAttributes> = {\n BCH: {\n blockReward: 6.25,\n avgBlockTimeInSecs: 600,\n },\n BTC: {\n blockReward: 6.25,\n avgBlockTimeInSecs: 600,\n },\n ETH: {\n blockReward: 2,\n avgBlockTimeInSecs: 13,\n },\n AVAX: {\n blockReward: 2,\n avgBlockTimeInSecs: 3,\n },\n LTC: {\n blockReward: 12.5,\n avgBlockTimeInSecs: 150,\n },\n DOGE: {\n blockReward: 10000,\n avgBlockTimeInSecs: 60,\n },\n GAIA: {\n blockReward: 0,\n avgBlockTimeInSecs: 6,\n },\n BNB: {\n blockReward: 0,\n avgBlockTimeInSecs: 6,\n },\n THOR: {\n blockReward: 0,\n avgBlockTimeInSecs: 6,\n },\n BSC: {\n blockReward: 0,\n avgBlockTimeInSecs: 3,\n },\n MAYA: {\n blockReward: 0,\n avgBlockTimeInSecs: 6,\n },\n}\n\nexport { DefaultChainAttributes }\n","import {\n Asset,\n AssetAmount,\n BaseAmount,\n assetToBase,\n assetToString,\n baseToAsset,\n eqAsset,\n formatAssetAmountCurrency,\n} from '@xchainjs/xchain-util'\nimport { BigNumber } from 'bignumber.js'\n\ntype CryptoNumeric = CryptoAmount | number | BigNumber\n\n/**\n * Utility Class to combine an amount (asset/base) with the Asset\n *\n */\nexport class CryptoAmount {\n baseAmount: BaseAmount\n readonly asset: Asset\n constructor(amount: BaseAmount, asset: Asset) {\n this.asset = asset\n this.baseAmount = amount\n }\n plus(v: CryptoAmount): CryptoAmount {\n this.check(v)\n const assetAmountResult = assetToBase(this.assetAmount.plus(v.assetAmount))\n return new CryptoAmount(assetAmountResult, this.asset)\n }\n minus(v: CryptoAmount): CryptoAmount {\n this.check(v)\n const assetAmountResult = assetToBase(this.assetAmount.minus(v.assetAmount))\n return new CryptoAmount(assetAmountResult, this.asset)\n }\n times(v: CryptoNumeric): CryptoAmount {\n this.check(v)\n if (v instanceof CryptoAmount) {\n const assetAmountResult = assetToBase(this.assetAmount.times(v.assetAmount))\n return new CryptoAmount(assetAmountResult, this.asset)\n } else {\n const assetAmountResult = assetToBase(this.assetAmount.times(v))\n return new CryptoAmount(assetAmountResult, this.asset)\n }\n }\n div(v: CryptoNumeric): CryptoAmount {\n this.check(v)\n if (v instanceof CryptoAmount) {\n const assetAmountResult = assetToBase(this.assetAmount.div(v.assetAmount))\n return new CryptoAmount(assetAmountResult, this.asset)\n } else {\n const assetAmountResult = assetToBase(this.assetAmount.div(v))\n return new CryptoAmount(assetAmountResult, this.asset)\n }\n }\n lt(v: CryptoAmount): boolean {\n this.check(v)\n return this.assetAmount.lt(v.assetAmount)\n }\n lte(v: CryptoAmount): boolean {\n this.check(v)\n return this.assetAmount.lte(v.assetAmount)\n }\n gt(v: CryptoAmount): boolean {\n this.check(v)\n return this.assetAmount.gt(v.assetAmount)\n }\n gte(v: CryptoAmount): boolean {\n this.check(v)\n\n return this.assetAmount.gte(v.assetAmount)\n }\n eq(v: CryptoAmount): boolean {\n this.check(v)\n return this.assetAmount.eq(v.assetAmount)\n }\n formatedAssetString(): string {\n return formatAssetAmountCurrency({\n amount: this.assetAmount,\n asset: this.asset,\n trimZeros: true,\n })\n }\n assetAmountFixedString(): string {\n return this.assetAmount.amount().toFixed()\n }\n get assetAmount(): AssetAmount {\n return baseToAsset(this.baseAmount)\n }\n /**\n * This guard protects against trying to perform math with different assets\n *\n * Example.\n * const x = new CryptoAmount(assetAmount(1),AssetBTC)\n * const y = new CryptoAmount(assetAmount(1),AssetETH)\n *\n * x.plus(y) <- will throw error \"cannot perform math on 2 diff assets BTC.BTC ETH.ETH\n *\n * @param v - CryptoNumeric\n */\n private check(v: CryptoNumeric) {\n if (v instanceof CryptoAmount) {\n if (!eqAsset(this.asset, v.asset)) {\n throw Error(`cannot perform math on 2 diff assets ${assetToString(this.asset)} ${assetToString(v.asset)}`)\n }\n }\n }\n}\n","import { PoolDetail } from '@xchainjs/xchain-midgard/lib'\nimport { Pool } from '@xchainjs/xchain-thornode/lib'\nimport { Asset, BaseAmount, assetFromString, baseAmount } from '@xchainjs/xchain-util'\nimport { BigNumber } from 'bignumber.js'\n\n/**\n * Represent a Liquidity Pool in Thorchain\n */\nexport class LiquidityPool {\n readonly pool: PoolDetail\n readonly thornodeDetails: Pool\n readonly assetBalance: BaseAmount\n readonly runeBalance: BaseAmount\n // readonly decimals: number\n\n readonly asset: Asset\n readonly assetString: string\n readonly runeToAssetRatio: BigNumber\n readonly assetToRuneRatio: BigNumber\n\n constructor(pool: PoolDetail, thornodeDetails: Pool) {\n this.pool = pool\n this.thornodeDetails = thornodeDetails\n const asset = assetFromString(this.pool.asset)\n if (!asset) throw new Error(`could not parse ${this.pool.asset}`)\n\n this.asset = asset\n // this.decimals = decimals\n this.assetString = this.pool.asset\n this.assetBalance = baseAmount(this.pool.assetDepth)\n this.runeBalance = baseAmount(this.pool.runeDepth)\n\n this.runeToAssetRatio = this.runeBalance.amount().div(this.assetBalance.amount())\n this.assetToRuneRatio = this.assetBalance.amount().div(this.runeBalance.amount())\n }\n isAvailable(): boolean {\n return this.pool.status.toLowerCase() === 'available'\n }\n}\n","import { Asset, assetFromStringEx, assetToString } from '@xchainjs/xchain-util'\n\nexport const AssetBNB = assetFromStringEx('BNB.BNB')\nexport const AssetAVAX = assetFromStringEx('AVAX.AVAX')\nexport const AssetBTC = assetFromStringEx('BTC.BTC')\nexport const AssetBCH = assetFromStringEx('BCH.BCH')\nexport const AssetETH = assetFromStringEx('ETH.ETH')\nexport const AssetDOGE = assetFromStringEx('DOGE.DOGE')\nexport const AssetLTC = assetFromStringEx('LTC.LTC')\nexport const AssetATOM = assetFromStringEx('GAIA.ATOM')\nexport const AssetMAYA = assetFromStringEx('MAYA.CACAO')\nexport const AssetBSC = assetFromStringEx('BSC.BNB')\nexport const AssetRuneNative = assetFromStringEx('THOR.RUNE')\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'\n\nexport const isAssetRuneNative = (asset: Asset): boolean => assetToString(asset) === assetToString(AssetRuneNative)\n","import {\n // Address,\n Asset,\n Chain,\n baseAmount,\n eqAsset,\n} from '@xchainjs/xchain-util'\nimport { BigNumber } from 'bignumber.js'\n\nimport { CryptoAmount } from '../crypto-amount'\nimport { InboundDetail } from '../types'\n// eslint-disable-next-line ordered-imports/ordered-imports\nimport {\n AVAXChain,\n AssetATOM,\n AssetAVAX,\n AssetBCH,\n AssetBNB,\n AssetBSC,\n AssetBTC,\n AssetDOGE,\n AssetETH,\n AssetLTC,\n AssetMAYA,\n AssetRuneNative,\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\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 BNBChain:\n return AssetBNB\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 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: Asset): boolean => {\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: Asset, inbound: InboundDetail): CryptoAmount => {\n // synths are always 0.02R fee\n if (asset.synth) return new CryptoAmount(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 CryptoAmount(baseAmount(inbound.gasRate.multipliedBy(inbound.outboundTxSize)), AssetBTC)\n break\n case BCHChain:\n return new CryptoAmount(baseAmount(inbound.gasRate.multipliedBy(inbound.outboundTxSize)), AssetBCH)\n break\n case LTCChain:\n return new CryptoAmount(baseAmount(inbound.gasRate.multipliedBy(inbound.outboundTxSize)), AssetLTC)\n break\n case DOGEChain:\n // NOTE: UTXO chains estimate fees with a 250 byte size\n return new CryptoAmount(baseAmount(inbound.gasRate.multipliedBy(inbound.outboundTxSize)), AssetDOGE)\n break\n case BNBChain:\n //flat fee\n return new CryptoAmount(baseAmount(inbound.gasRate), AssetBNB)\n break\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 CryptoAmount(gasRateinETHWei.times(21000), AssetETH)\n } else {\n return new CryptoAmount(gasRateinETHWei.times(70000), AssetETH)\n }\n break\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 CryptoAmount(gasRateinAVAXWei.times(21000), AssetAVAX)\n } else {\n return new CryptoAmount(gasRateinAVAXWei.times(70000), AssetAVAX)\n }\n break\n case GAIAChain:\n return new CryptoAmount(baseAmount(inbound.gasRate), AssetATOM)\n break\n case THORChain:\n return new CryptoAmount(baseAmount(2000000), AssetRuneNative)\n break\n case BSCChain:\n return new CryptoAmount(baseAmount(inbound.gasRate), AssetBSC)\n break\n case MAYAChain:\n return new CryptoAmount(baseAmount(inbound.gasRate), AssetMAYA)\n break\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: Asset, inbound: InboundDetail): CryptoAmount => {\n if (asset.synth) return new CryptoAmount(baseAmount(2000000), AssetRuneNative)\n switch (asset.chain) {\n case BTCChain:\n return new CryptoAmount(baseAmount(inbound.outboundFee), AssetBTC)\n break\n case BCHChain:\n return new CryptoAmount(baseAmount(inbound.outboundFee), AssetBCH)\n break\n case LTCChain:\n return new CryptoAmount(baseAmount(inbound.outboundFee), AssetLTC)\n break\n case DOGEChain:\n // NOTE: UTXO chains estimate fees with a 250 byte size\n return new CryptoAmount(baseAmount(inbound.outboundFee), AssetDOGE)\n break\n case BNBChain:\n //flat fee\n return new CryptoAmount(baseAmount(inbound.outboundFee), AssetBNB)\n break\n case ETHChain:\n return new CryptoAmount(baseAmount(inbound.outboundFee.multipliedBy(10 ** 9), 18), AssetETH)\n break\n case AVAXChain:\n return new CryptoAmount(baseAmount(inbound.outboundFee.multipliedBy(10 ** 9), 18), AssetAVAX)\n break\n case GAIAChain:\n return new CryptoAmount(baseAmount(inbound.outboundFee), AssetATOM)\n break\n case BSCChain:\n return new CryptoAmount(baseAmount(inbound.outboundFee), AssetBSC)\n break\n case THORChain:\n return new CryptoAmount(baseAmount(2000000), AssetRuneNative)\n break\n case MAYAChain:\n return new CryptoAmount(baseAmount(2000000), AssetMAYA)\n break\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 default:\n throw Error('Unknown chain')\n }\n}\n","import { baseAmount } from '@xchainjs/xchain-util'\nimport { BigNumber } from 'bignumber.js'\n\nimport { CryptoAmount } from '../crypto-amount'\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.pool.liquidityUnits)\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.pool.liquidityUnits)\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 Action,\n Configuration,\n MemberDetails,\n MidgardApi,\n PoolDetail,\n PoolStatsDetail,\n THORNameDetails,\n} from '@xchainjs/xchain-midgard'\nimport axios from 'axios'\nimport axiosRetry from 'axios-retry'\n\nimport { MidgardConfig } from '../types'\n\nconst defaultMidgardConfig: Record<Network, MidgardConfig> = {\n mainnet: {\n apiRetries: 3,\n midgardBaseUrls: ['https://midgard.ninerealms.com'],\n },\n stagenet: {\n apiRetries: 3,\n midgardBaseUrls: ['https://stagenet-midgard.ninerealms.com'],\n },\n testnet: {\n apiRetries: 3,\n midgardBaseUrls: ['https://testnet.midgard.thorchain.info'],\n },\n}\n\nexport class Midgard {\n private config: MidgardConfig\n readonly network: Network\n private midgardApis: MidgardApi[]\n\n constructor(network: Network = Network.Mainnet, config?: MidgardConfig) {\n this.network = network\n this.config = config ?? defaultMidgardConfig[this.network]\n axiosRetry(axios, { retries: this.config.apiRetries, retryDelay: axiosRetry.exponentialDelay })\n this.midgardApis = this.config.midgardBaseUrls.map((url) => new MidgardApi(new Configuration({ basePath: url })))\n }\n\n /**\n *\n * @returns an array of Pools\n */\n async getPools(): Promise<PoolDetail[]> {\n for (const api of this.midgardApis) {\n try {\n return (await api.getPools()).data\n } catch (e) {\n //console.error(e)\n }\n }\n throw new Error(`Midgard not responding`)\n }\n\n /**\n * Gets the latest block using the Health endpoint within Midgard\n *\n * @returns\n */\n public async getLatestBlockHeight(): Promise<number> {\n for (const api of this.midgardApis) {\n try {\n const data = (await api.getHealth()).data\n return +data.scannerHeight\n } catch (e) {\n //console.error(e)\n }\n }\n throw Error(`Midgard not responding`)\n }\n /**\n * Gets actions object for any of the parameters\n * @param txHash transaction id\n * @returns Type Action array of objects\n */\n public async getActions(\n address?: string,\n txid?: string,\n asset?: string,\n type?: string,\n affiliate?: string,\n limit?: number,\n offset?: number,\n ): Promise<Action[]> {\n for (const api of this.midgardApis) {\n try {\n const actions = (await api.getActions(address, txid, asset, type, affiliate, limit, offset)).data.actions\n return actions\n } catch (e) {\n //console.error(e)\n }\n }\n throw Error(`Midgard not responding`)\n }\n\n /**\n * Function to return member details based on valid liquidity position\n * @param address - needed to query for Lp details\n * @returns - object type of Member Detail\n */\n public async getMember(address: string): Promise<MemberDetails> {\n for (const api of this.midgardApis) {\n try {\n const memberDetail = (await api.getMemberDetail(address)).data\n return memberDetail\n } catch (e) {\n //console.error(e)\n }\n }\n throw Error(`Midgard not responding`)\n }\n\n /**\n * Function to return pool statistics for a particular asset\n * @param asset - asset string to query its pool stats\n * @returns - type object poolstatsDetail\n */\n public async getPoolStats(asset: string): Promise<PoolStatsDetail> {\n for (const api of this.midgardApis) {\n try {\n const poolDetail = (await api.getPoolStats(asset)).data\n return poolDetail\n } catch (e) {\n //console.error(e)\n }\n }\n throw Error(`Midgard not responding`)\n }\n\n /**\n * Function to return THORNameDetails for a particular name\n * @param name - thorname string to query\n * @returns - type object THORNameDetails\n */\n public async getTHORNameDetails(name: string): Promise<THORNameDetails | undefined> {\n for (const api of this.midgardApis) {\n try {\n const resp = await api.getTHORNameDetail(name)\n if (resp.status == 404) {\n return undefined\n } else if (resp.status == 200) {\n return resp.data\n }\n } catch (e) {\n // if (resp.status == 404) {\n // return undefined\n // }\n //console.error(e)\n }\n }\n throw Error(`Midgard not responding`)\n }\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 QuoteSaverDepositResponse,\n QuoteSaverWithdrawResponse,\n QuoteSwapResponse,\n Saver,\n SaversApi,\n SaversResponse,\n TransactionsApi,\n TxDetailsResponse,\n TxOutItem,\n TxResponse,\n} from '@xchainjs/xchain-thornode'\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`, `https://thornode.thorswap.net`],\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\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 }\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.ticker}`,\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 fromAddress?: string,\n toleranceBps?: number,\n affiliateBps?: number,\n affiliate?: string,\n height?: number,\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 fromAddress,\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","import { Address, Asset, Chain, assetToString, baseAmount, eqAsset } from '@xchainjs/xchain-util'\nimport { BigNumber } from 'bignumber.js'\n\nimport { CryptoAmount } from './crypto-amount'\nimport { LiquidityPool } from './liquidity-pool'\nimport { InboundDetail, InboundDetailCache, NetworkValuesCache, PoolCache } from './types'\nimport { THORChain, isAssetRuneNative } from './utils'\nimport { Midgard } from './utils/midgard'\nimport { Thornode } from './utils/thornode'\n\nconst SAME_ASSET_EXCHANGE_RATE = new BigNumber(1)\nconst TEN_MINUTES = 10 * 60 * 1000\nconst DEFAULT_THORCHAIN_DECIMALS = 8\n// const USD_ASSETS: Record<Network, Asset[]> = {\n// mainnet: [\n// assetFromStringEx('BNB.BUSD-BD1'),\n// assetFromStringEx('ETH.USDC-0XA0B86991C6218B36C1D19D4A2E9EB0CE3606EB48'),\n// assetFromStringEx('ETH.USDT-0XDAC17F958D2EE523A2206206994597C13D831EC7'),\n// ],\n// stagenet: [assetFromStringEx('ETH.USDT-0XDAC17F958D2EE523A2206206994597C13D831EC7')],\n// testnet: [\n// assetFromStringEx('BNB.BUSD-74E'),\n// assetFromStringEx('ETH.USDT-0XA3910454BF2CB59B8B3A401589A3BACC5CA42306'),\n// ],\n// }\nconst defaultMidgard = new Midgard()\nconst defaultThornode = new Thornode()\n\n/**\n * This class manages retrieving information from up to date Thorchain\n */\nexport class ThorchainCache {\n readonly midgard: Midgard\n readonly thornode: Thornode\n private poolCache: PoolCache | undefined\n private inboundDetailCache: InboundDetailCache | undefined = undefined\n private networkValuesCache: NetworkValuesCache | undefined = undefined\n\n private expirePoolCacheMillis\n private expireInboundDetailsCacheMillis\n private expireNetworkValuesCacheMillis\n\n /**\n * Contrustor to create a ThorchainCache\n *\n * @param midgard - an instance of the midgard API (could be pointing to stagenet,testnet,mainnet)\n * @param expirePoolCacheMillis - how long should the pools be cached before expiry\n * @param expireAsgardCacheMillis - how long should the inboundAsgard Addresses be cached before expiry\n * @param expireInboundDetailsCacheMillis - how long should the InboundDetails be cached before expiry\n * @param expireNetworkValuesCacheMillis - how long should the Mimir/Constants be cached before expiry\n * @returns ThorchainCache\n */\n constructor(\n midgard = defaultMidgard,\n thornode = defaultThornode,\n expirePoolCacheMillis = 6000,\n expireInboundDetailsCacheMillis = 6000,\n expireNetworkValuesCacheMillis = TEN_MINUTES,\n ) {\n this.midgard = midgard\n this.thornode = thornode\n this.expirePoolCacheMillis = expirePoolCacheMillis\n this.expireInboundDetailsCacheMillis = expireInboundDetailsCacheMillis\n this.expireNetworkValuesCacheMillis = expireNetworkValuesCacheMillis\n\n //initialize the cache\n this.refreshPoolCache()\n }\n\n /**\n * Gets the exchange rate of the from asset in terms on the to asset\n *\n * @param asset - cannot be RUNE.\n * @returns Promise<BigNumber>\n */\n async getExchangeRate(from: Asset, to: Asset): 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 lpTo = await this.getPoolForAsset(to)\n exchangeRate = lpTo.assetToRuneRatio\n } else if (isAssetRuneNative(to)) {\n // Asset per rune\n const lpFrom = await this.getPoolForAsset(from)\n exchangeRate = lpFrom.runeToAssetRatio\n } else {\n // AssetA per AssetB\n const lpFrom = await this.getPoolForAsset(from)\n const lpTo = await this.getPoolForAsset(to)\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 *\n * @param asset - cannot be RUNE, since Rune is the other side of each pool.\n * @returns Promise<LiquidityPool>\n */\n async getPoolForAsset(asset: Asset): 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 wioll be re-fetched from midgard\n *\n * @returns Promise<Record<string, LiquidityPool>>\n */\n async getPools(): Promise<Record<string, LiquidityPool>> {\n const millisSinceLastRefeshed = Date.now() - (this.poolCache?.lastRefreshed || 0)\n if (millisSinceLastRefeshed > this.expirePoolCacheMillis) {\n try {\n await this.refreshPoolCache()\n } catch (e) {\n console.error(e)\n }\n }\n if (this.poolCache) {\n return this.poolCache?.pools\n } else {\n throw Error(`Could not refresh Pools `)\n }\n }\n /**\n * Refreshes the Pool Cache\n *\n * NOTE: do not call refreshPoolCache() directly, call getPools() instead\n * which will refresh the cache if it's expired\n */\n private async refreshPoolCache(): Promise<void> {\n try {\n const [thornodePools, midgardPools] = await Promise.all([this.thornode.getPools(), this.midgard.getPools()])\n const poolMap: Record<string, LiquidityPool> = {}\n\n if (midgardPools) {\n for (const pool of midgardPools) {\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(pool, thornodePool)\n poolMap[`${lp.asset.chain}.${lp.asset.ticker}`] = lp\n } catch (error) {\n console.log(error)\n }\n }\n\n this.poolCache = {\n lastRefreshed: Date.now(),\n pools: poolMap,\n }\n }\n } catch (error) {\n console.error('Error refreshing pool cache:', error)\n }\n }\n\n /**\n * Refreshes the InboundDetailCache Cache\n *\n * NOTE: do not call refereshInboundDetailCache() directly, call getInboundDetails() instead\n * which will refresh the cache if it's expired\n */\n private async refereshInboundDetailCache(): Promise<void> {\n const [mimirDetails, allInboundAddresses] = await Promise.all([\n this.thornode.getMimir(),\n this.thornode.getInboundAddresses(),\n ])\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\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 this.inboundDetailCache = {\n lastRefreshed: Date.now(),\n inboundDetails,\n }\n }\n /**\n * Refreshes the NetworkValuesCache Cache\n *\n * NOTE: do not call refereshNetworkValuesCache() directly, call getNetworkValuess() instead\n * which will refresh the cache if it's expired\n */\n private async refereshNetworkValuesCache(): Promise<void> {\n const networkValues = await this.thornode.getNetworkValues()\n\n this.networkValuesCache = {\n lastRefreshed: Date.now(),\n networkValues,\n }\n }\n\n /**\n * Returns the exchange of a CryptoAmount to a different Asset\n *\n * Ex. convert(input:100 BUSD, outAsset: BTC) -> 0.0001234 BTC\n *\n * @param input - amount/asset to convert to outAsset\n * @param outAsset - the Asset you want to convert to\n * @returns CryptoAmount of input\n */\n async convert(input: CryptoAmount, outAsset: Asset): Promise<CryptoAmount> {\n const exchangeRate = await this.getExchangeRate(input.asset, outAsset)\n const outDecimals = await this.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(amt, outAsset)\n // console.log(\n // `${input.formatedAssetString()} ${input.asset.ticker} = ${result.formatedAssetString()} ${outAsset.ticker}`,\n // )\n\n return result\n }\n private async getDecimalForAsset(asset: Asset): Promise<number> {\n if (!isAssetRuneNative(asset)) {\n const pool = await this.getPoolForAsset(asset)\n const decimals = Number(pool.pool.nativeDecimal)\n if (decimals > 0) return decimals\n else return DEFAULT_THORCHAIN_DECIMALS\n }\n return DEFAULT_THORCHAIN_DECIMALS\n }\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 *\n * @returns - inbound details\n */\n async getInboundDetails(): Promise<Record<string, InboundDetail>> {\n const millisSinceLastRefeshed = Date.now() - (this.inboundDetailCache?.lastRefreshed || 0)\n if (millisSinceLastRefeshed > this.expireInboundDetailsCacheMillis) {\n try {\n await this.refereshInboundDetailCache()\n } catch (e) {\n console.error(e)\n }\n }\n if (this.inboundDetailCache) {\n return this.inboundDetailCache.inboundDetails\n } else {\n throw Error(`Could not refereshInboundDetailCache `)\n }\n }\n /**\n *\n * @returns - network values\n */\n async getNetworkValues(): Promise<Record<string, number>> {\n const millisSinceLastRefeshed = Date.now() - (this.networkValuesCache?.lastRefreshed || 0)\n if (millisSinceLastRefeshed > this.expireNetworkValuesCacheMillis) {\n try {\n await this.refereshNetworkValuesCache()\n } catch (e) {\n console.error(e)\n }\n }\n if (this.networkValuesCache) {\n return this.networkValuesCache.networkValues\n } else {\n throw Error(`Could not refereshInboundDetailCache `)\n }\n }\n}\n","import { LastBlock } from '@xchainjs/xchain-thornode'\nimport {\n Asset,\n Chain,\n assetAmount,\n assetFromStringEx,\n assetToBase,\n assetToString,\n baseAmount,\n} from '@xchainjs/xchain-util'\nimport { BigNumber } from 'bignumber.js'\n\nimport { DefaultChainAttributes } from './chain-defaults'\nimport { CryptoAmount } from './crypto-amount'\nimport { ThorchainCache } from './thorchain-cache'\nimport {\n AddliquidityPosition,\n Block,\n ChainAttributes,\n DustValues,\n EstimateAddLP,\n EstimateAddSaver,\n EstimateWithdrawLP,\n EstimateWithdrawSaver,\n LiquidityPosition,\n PoolRatios,\n PostionDepositValue,\n QuoteSwapParams,\n SaverFees,\n SaversPosition,\n SaversWithdraw,\n TotalFees,\n TxDetails,\n UnitData,\n WithdrawLiquidityPosition,\n getSaver,\n} from './types'\nimport { AssetBNB, AssetRuneNative, BNBChain, GAIAChain, THORChain, isAssetRuneNative } 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 * THORChain 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 * Contructor to create a ThorchainAMM\n *\n * @param thorchainCache - an instance of the ThorchainCache (could be pointing to stagenet,testnet,mainnet)\n * @param chainAttributes - atrributes 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 /**\n *\n * @param quoteSwapParams - input params\n * @returns\n */\n public async quoteSwap({\n fromAsset,\n destinationAsset,\n amount,\n destinationAddress,\n fromAddress,\n toleranceBps,\n interfaceID = '555',\n affiliateBps,\n affiliateAddress,\n height,\n }: QuoteSwapParams): Promise<TxDetails> {\n const errors: string[] = []\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 fromAddress,\n toleranceBps,\n affiliateBps,\n affiliateAddress,\n height,\n )\n // error handling\n const response: { error?: string } = JSON.parse(JSON.stringify(swapQuote))\n if (response.error) errors.push(`Thornode request quote: ${response.error}`)\n\n if (errors.length > 0) {\n return {\n memo: ``,\n toAddress: ``,\n expiry: new Date(),\n txEstimate: {\n totalFees: {\n asset: destinationAsset,\n affiliateFee: new CryptoAmount(baseAmount(0), AssetRuneNative),\n outboundFee: new CryptoAmount(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 },\n }\n }\n\n // Return quote\n const feeAsset = assetFromStringEx(swapQuote.fees.asset)\n const txDetails: TxDetails = {\n memo: this.constructSwapMemo(`${swapQuote.memo}`, interfaceID),\n toAddress: `${swapQuote.inbound_address}`,\n expiry: new Date(swapQuote.expiry * 1000),\n txEstimate: {\n totalFees: {\n asset: fromAsset,\n affiliateFee: new CryptoAmount(baseAmount(swapQuote.fees.affiliate), feeAsset),\n outboundFee: new CryptoAmount(baseAmount(swapQuote.fees.outbound), feeAsset),\n },\n slipBasisPoints: swapQuote.slippage_bps,\n netOutput: new CryptoAmount(baseAmount(swapQuote.expected_amount_out), destinationAsset),\n outboundDelaySeconds: swapQuote.outbound_delay_seconds,\n inboundConfirmationSeconds: swapQuote.inbound_confirmation_seconds,\n canSwap: true,\n errors,\n },\n }\n return txDetails\n }\n\n /**\n *\n * @param params - swap object\n * @returns - constructed memo string\n */\n private constructSwapMemo(memo: string, interfaceID: string): string {\n const memoPart = memo.split(':')\n if (memoPart.length > 3) {\n memoPart[3] =\n memoPart[3].length >= 3 ? memoPart[3].substring(0, memoPart[3].length - 3).concat(interfaceID) : interfaceID\n let outmemo = ''\n for (let i = 0; i < memoPart.length; i++) {\n outmemo = outmemo.concat(`${memoPart[i]}:`)\n }\n return outmemo.substring(0, outmemo.length - 1)\n }\n return memo\n }\n\n /**\n * Works out how long an outbound Tx will be held by THORChain before sending.\n *\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): Promise<number> {\n const networkValues = await this.thorchainCache.getNetworkValues()\n const minTxOutVolumeThreshold = new CryptoAmount(\n baseAmount(networkValues['MINTXOUTVOLUMETHRESHOLD']),\n AssetRuneNative,\n )\n const maxTxOutOffset = networkValues['MAXTXOUTOFFSET']\n let txOutDelayRate = new CryptoAmount(baseAmount(networkValues['TXOUTDELAYRATE']), AssetRuneNative).assetAmount\n .amount()\n .toNumber()\n const getQueue = await this.thorchainCache.thornode.getQueue()\n const outboundValue = new CryptoAmount(baseAmount(getQueue.scheduled_outbound_value), AssetRuneNative)\n const thorChainblocktime = this.chainAttributes[THORChain].avgBlockTimeInSecs // blocks required to confirm tx\n // If asset is equal to Rune set runeValue as outbound amount else set it to the asset's value in rune\n const runeValue = await this.thorchainCache.convert(outboundAmount, AssetRuneNative)\n // Check rune value amount\n if (runeValue.lt(minTxOutVolumeThreshold)) {\n return thorChainblocktime\n }\n // Rune value in the outbound queue\n if (outboundValue == undefined) {\n throw new Error(`Could not return Scheduled Outbound Value`)\n }\n // Add OutboundAmount in rune to the oubound queue\n const outboundAmountTotal = runeValue.plus(outboundValue)\n // calculate the if outboundAmountTotal is over the volume threshold\n const volumeThreshold = outboundAmountTotal.div(minTxOutVolumeThreshold)\n // check delay rate\n txOutDelayRate = txOutDelayRate - volumeThreshold.assetAmount.amount().toNumber() <= 1 ? 1 : txOutDelayRate\n // calculate the minimum number of blocks in the future the txn has to be\n let minBlocks = runeValue.assetAmount.amount().toNumber() / txOutDelayRate\n minBlocks = minBlocks > maxTxOutOffset ? maxTxOutOffset : minBlocks\n return minBlocks * thorChainblocktime\n }\n\n /**\n * Convenience method to convert TotalFees to a different CryptoAmount\n *\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 *\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: Asset): Promise<TotalFees> {\n return {\n asset: fees.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 *\n * Ex. convert(input:100 BUSD, outAsset: BTC) -> 0.0001234 BTC\n *\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(input: CryptoAmount, outAsset: Asset): Promise<CryptoAmount> {\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 *\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 *\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 // RUNE, BNB and Synths have near instant finality, so no conf counting required. - need to make a BFT only case.\n if (\n isAssetRuneNative(inbound.asset) ||\n inbound.asset.chain == BNBChain ||\n inbound.asset.chain == GAIAChain ||\n inbound.asset.synth\n ) {\n return this.chainAttributes[THORChain].avgBlockTimeInSecs\n }\n // Get the gas asset for the inbound.asset.chain\n const chainGasAsset = getChainAsset(inbound.asset.chain)\n\n // check for chain asset, else need to convert asset value to chain asset.\n const amountInGasAsset = await this.thorchainCache.convert(inbound, chainGasAsset)\n // Convert to Asset Amount\n const amountInGasAssetInAsset = amountInGasAsset.assetAmount\n\n const confConfig = this.chainAttributes[inbound.asset.chain]\n // find the required confs\n const requiredConfs = Math.ceil(amountInGasAssetInAsset.amount().div(confConfig.blockReward).toNumber())\n // convert that into seconds\n return requiredConfs * confConfig.avgBlockTimeInSecs\n }\n\n /**\n * Estimates a liquidity position for given crypto amount value, both asymmetrical and symetrical\n * @param params - parameters needed for a estimated liquidity position\n * @returns - type object EstimateLP\n */\n public async estimateAddLP(params: AddliquidityPosition): Promise<EstimateAddLP> {\n const errors: string[] = []\n if (params.asset.asset.synth || params.rune.asset.synth) errors.push('you cannot add liquidity with a synth')\n if (!isAssetRuneNative(params.rune.asset)) errors.push('params.rune must be THOR.RUNE')\n\n const assetPool = await this.thorchainCache.getPoolForAsset(params.asset.asset)\n\n const lpUnits = getLiquidityUnits({ asset: params.asset, rune: params.rune }, assetPool)\n const inboundDetails = await this.thorchainCache.getInboundDetails()\n const unitData: UnitData = {\n liquidityUnits: lpUnits,\n totalUnits: new BigNumber(assetPool.pool.liquidityUnits),\n }\n const poolShare = getPoolShare(unitData, assetPool)\n const assetWaitTimeSeconds = await this.confCounting(params.asset)\n const runeWaitTimeSeconds = await this.confCounting(params.rune)\n const waitTimeSeconds = assetWaitTimeSeconds > runeWaitTimeSeconds ? assetWaitTimeSeconds : runeWaitTimeSeconds\n\n let assetInboundFee = new CryptoAmount(baseAmount(0), params.asset.asset)\n let runeInboundFee = new CryptoAmount(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 const totalFees = (await this.convert(assetInboundFee, AssetRuneNative)).plus(runeInboundFee)\n const slip = getSlipOnLiquidity({ asset: params.asset, rune: params.rune }, assetPool)\n const estimateLP: EstimateAddLP = {\n assetPool: assetPool.pool.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 - Type Object liquidityPosition\n */\n public async checkLiquidityPosition(asset: Asset, assetOrRuneAddress?: string): 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\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.pool.liquidityUnits),\n liquidityUnits: new BigNumber(liquidityProvider.units),\n }\n const networkValues = await this.thorchainCache.thornode.getNetworkValues()\n const block: Block = {\n current: blockData.thorchain,\n lastAdded: liquidityProvider.last_add_height,\n fullProtection: networkValues['FULLIMPLOSSPROTECTIONBLOCKS'],\n }\n //\n const currentLP: PostionDepositValue = {\n asset: baseAmount(liquidityProvider.asset_deposit_value),\n rune: baseAmount(liquidityProvider.rune_deposit_value),\n }\n\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 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 const lpGrowth = redeemLuvi - depositLuvi\n const currentLpGrowth = lpGrowth > 0 ? lpGrowth / depositLuvi : 0\n\n const impermanentLossProtection = getLiquidityProtectionData(currentLP, poolShare, block)\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): Promise<PoolRatios> {\n const assetPool = await this.thorchainCache.getPoolForAsset(asset)\n const poolRatio: PoolRatios = {\n assetToRune: assetPool.assetToRuneRatio,\n runeToAsset: assetPool.runeToAssetRatio,\n }\n return poolRatio\n }\n\n /**\n *\n * @param params\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 const memberDetail = await this.checkLiquidityPosition(params.asset, assetOrRuneAddress)\n const dustValues = await this.getDustValues(params.asset) // returns asset and rune dust values\n const assetPool = await this.thorchainCache.getPoolForAsset(params.asset)\n // get pool share from unit data\n const poolShare = getPoolShare(\n {\n liquidityUnits: new BigNumber(memberDetail.position.units),\n totalUnits: new BigNumber(assetPool.pool.liquidityUnits),\n },\n assetPool,\n )\n // get slip on liquidity removal\n const slip = getSlipOnLiquidity(\n {\n asset: poolShare.assetShare,\n rune: poolShare.runeShare,\n },\n assetPool,\n )\n // TODO make sure we compare wait times for withdrawing both rune and asset OR just rune OR just asset\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 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\n const estimateLP: EstimateWithdrawLP = {\n assetAddress: memberDetail.position.asset_address,\n runeAddress: memberDetail.position.rune_address,\n slipPercent: slip.times(100),\n inbound: {\n minToSend: {\n rune: dustValues.rune,\n asset: dustValues.asset,\n total: (await this.convert(dustValues.asset, AssetRuneNative)).plus(dustValues.rune),\n },\n fees: {\n rune: runeInbound,\n asset: assetInbound,\n total: (await this.convert(assetInbound, AssetRuneNative)).plus(runeInbound),\n },\n },\n outboundFee: {\n asset: assetOutbound,\n rune: runeOutbound,\n total: (await this.convert(assetOutbound, AssetRuneNative)).plus(runeOutbound),\n },\n assetAmount: poolShare.assetShare,\n runeAmount: poolShare.runeShare,\n lpGrowth: memberDetail.lpGrowth,\n estimatedWaitSeconds: waitTimeSeconds,\n impermanentLossProtection: memberDetail.impermanentLossProtection,\n assetPool: assetPool.pool.asset,\n }\n return estimateLP\n }\n /**\n * // can this become a quried constant? added to inbound_addresses or something\n * @param asset - asset needed to retrieve dust values\n * @returns - object type dust values\n */\n private async getDustValues(asset: Asset): Promise<DustValues> {\n let dustValues: DustValues\n switch (asset.chain) {\n case 'BNB':\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0.000001)), AssetBNB),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n case 'BTC':\n case `BCH`:\n case `LTC`:\n // 10k sats\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0.0001)), asset),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n case 'ETH':\n // 0 wei\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0)), asset),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n case 'THOR':\n // 0 Rune\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0)), asset),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n case 'GAIA':\n // 0 GAIA\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0)), asset),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n case 'DOGE':\n // 1 million sats\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0.01)), asset),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n case 'AVAX':\n // 0 AVAX\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0)), asset),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n case 'BSC':\n // 0 BSC\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0)), asset),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n case 'MAYA':\n // 0 MAYA\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0)), asset),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n default:\n throw Error('Unknown chain')\n }\n }\n\n // Savers Queries\n // Derrived from https://dev.thorchain.org/thorchain-dev/connection-guide/savers-guide\n public async estimateAddSaver(addAmount: CryptoAmount): Promise<EstimateAddSaver> {\n let errors: string[] = []\n // check for errors before sending quote\n errors = await this.getAddSaversEstimateErrors(addAmount)\n // request param amount should always be in 1e8 which is why we pass in adjusted 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),\n newAddAmount.toNumber(),\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}`)\n // Return errors if there is any\n if (errors.length > 0) {\n return {\n assetAmount: addAmount,\n estimatedDepositValue: new CryptoAmount(assetToBase(assetAmount(0)), addAmount.asset),\n fee: {\n affiliate: new CryptoAmount(assetToBase(assetAmount(0)), addAmount.asset),\n asset: addAmount.asset,\n outbound: new CryptoAmount(assetToBase(assetAmount(0)), addAmount.asset),\n },\n expiry: new Date(0),\n toAddress: '',\n memo: '',\n saverCapFilledPercent: -1,\n estimatedWaitTime: -1,\n slipBasisPoints: -1,\n canAddSaver: false,\n errors,\n }\n }\n // Calculate transaction expiry time of the vault address\n const currentDatetime = new Date()\n const minutesToAdd = 15\n const expiryDatetime = new Date(currentDatetime.getTime() + minutesToAdd * 60000)\n // Calculate seconds\n const estimatedWait = depositQuote.inbound_confirmation_seconds\n ? depositQuote.inbound_confirmation_seconds\n : await this.confCounting(addAmount)\n const pool = (await this.thorchainCache.getPoolForAsset(addAmount.asset)).pool\n // Organise fees\n const saverFees: SaverFees = {\n affiliate: new CryptoAmount(baseAmount(depositQuote.fees.affiliate), addAmount.asset),\n asset: assetFromStringEx(depositQuote.fees.asset),\n outbound: new CryptoAmount(baseAmount(depositQuote.fees.outbound), addAmount.asset),\n }\n // define savers cap\n const saverCap = 0.3 * +pool.assetDepth\n const saverCapFilledPercent = (+pool.saversDepth / saverCap) * 100\n const estimateAddSaver: EstimateAddSaver = {\n assetAmount: new CryptoAmount(baseAmount(depositQuote.expected_amount_out), addAmount.asset),\n estimatedDepositValue: new CryptoAmount(baseAmount(depositQuote.expected_amount_deposit), addAmount.asset),\n fee: saverFees,\n expiry: expiryDatetime,\n toAddress: depositQuote.inbound_address,\n memo: depositQuote.memo,\n estimatedWaitTime: estimatedWait,\n canAddSaver: errors.length === 0,\n slipBasisPoints: depositQuote.slippage_bps,\n saverCapFilledPercent,\n errors,\n }\n return estimateAddSaver\n }\n /**\n *\n * @param withdrawParams - height?, asset, address, withdrawalBasisPoints\n * @returns - savers withdrawal quote with extras\n */\n public async estimateWithdrawSaver(withdrawParams: SaversWithdraw): Promise<EstimateWithdrawSaver> {\n const errors: string[] = []\n // return error if Asset in is incorrect\n if (isAssetRuneNative(withdrawParams.asset) || withdrawParams.asset.synth)\n errors.push(`Native Rune and synth assets are not supported only L1's`)\n const inboundDetails = await this.thorchainCache.getInboundDetails()\n // Check to see if there is a position before calling withdraw quote\n const checkPositon = await this.getSaverPosition(withdrawParams)\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 expectedAssetAmount: new CryptoAmount(\n assetToBase(assetAmount(checkPositon.redeemableValue.assetAmount.amount())),\n withdrawParams.asset,\n ),\n fee: {\n affiliate: new CryptoAmount(assetToBase(assetAmount(0)), withdrawParams.asset),\n asset: withdrawParams.asset,\n outbound: new CryptoAmount(\n assetToBase(\n assetAmount(\n calcOutboundFee(withdrawParams.asset, inboundDetails[withdrawParams.asset.chain]).assetAmount.amount(),\n ),\n ),\n withdrawParams.asset,\n ),\n },\n expiry: new Date(0),\n toAddress: '',\n memo: '',\n estimatedWaitTime: -1,\n slipBasisPoints: -1,\n dustAmount: new CryptoAmount(baseAmount(0), withdrawParams.asset),\n errors,\n }\n }\n // Request withdraw quote\n const withdrawQuote = await this.thorchainCache.thornode.getSaversWithdrawQuote(withdrawParams)\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 {\n expectedAssetAmount: new CryptoAmount(assetToBase(assetAmount(0)), withdrawParams.asset),\n fee: {\n affiliate: new CryptoAmount(assetToBase(assetAmount(0)), withdrawParams.asset),\n asset: withdrawParams.asset,\n outbound: new CryptoAmount(assetToBase(assetAmount(0)), withdrawParams.asset),\n },\n expiry: new Date(0),\n toAddress: '',\n memo: '',\n estimatedWaitTime: -1,\n slipBasisPoints: -1,\n dustAmount: new CryptoAmount(baseAmount(0), withdrawParams.asset),\n errors,\n }\n }\n\n // Calculate transaction expiry time of the vault address\n const currentDatetime = new Date()\n const minutesToAdd = 15\n const expiryDatetime = new Date(currentDatetime.getTime() + minutesToAdd * 60000)\n\n const estimatedWait = +withdrawQuote.outbound_delay_seconds\n const withdrawAsset = assetFromStringEx(withdrawQuote.fees.asset)\n const estimateWithdrawSaver: EstimateWithdrawSaver = {\n expectedAssetAmount: new CryptoAmount(baseAmount(withdrawQuote.expected_amount_out), withdrawParams.asset),\n fee: {\n affiliate: new CryptoAmount(baseAmount(withdrawQuote.fees.affiliate), withdrawAsset),\n asset: withdrawAsset,\n outbound: new CryptoAmount(baseAmount(withdrawQuote.fees.outbound), withdrawAsset),\n },\n expiry: expiryDatetime,\n toAddress: withdrawQuote.inbound_address,\n memo: withdrawQuote.memo,\n estimatedWaitTime: estimatedWait,\n slipBasisPoints: withdrawQuote.slippage_bps,\n dustAmount: new CryptoAmount(baseAmount(withdrawQuote.dust_amount), withdrawParams.asset),\n errors,\n }\n return estimateWithdrawSaver\n }\n\n /**\n *\n * @param params - getSaver object > asset, addresss, height?\n * @returns - Savers position object\n */\n public async getSaverPosition(params: getSaver): Promise<SaversPosition> {\n const errors: string[] = []\n const inboundDetails = await this.thorchainCache.getInboundDetails()\n const blockData = (await this.thorchainCache.thornode.getLastBlock()).find(\n (item: LastBlock) => item.chain === params.asset.chain,\n )\n const savers = (await this.thorchainCache.thornode.getSavers(`${params.asset.chain}.${params.asset.ticker}`)).find(\n (item) => item.asset_address === params.address,\n )\n\n const pool = (await this.thorchainCache.getPoolForAsset(params.asset)).pool\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 const outboundFee = await calcOutboundFee(params.asset, inboundDetails[params.asset.chain])\n if (Number(savers?.asset_redeem_value) < outboundFee.baseAmount.amount().toNumber())\n errors.push(`Unlikely to withdraw balance as outbound fee is greater than redeemable amount`)\n const ownerUnits = Number(savers?.units)\n const lastAdded = Number(savers?.last_add_height)\n const saverUnits = Number(pool.saversUnits)\n const assetDepth = Number(pool.saversDepth)\n const redeemableValue = (ownerUnits / saverUnits) * assetDepth\n const depositAmount = new CryptoAmount(baseAmount(savers?.asset_deposit_value), params.asset)\n const redeemableAssetAmount = new CryptoAmount(baseAmount(redeemableValue), params.asset)\n const saversAge = (Number(blockData?.thorchain) - lastAdded) / ((365 * 86400) / 6)\n const saverGrowth = redeemableAssetAmount.minus(depositAmount).div(depositAmount).times(100)\n const saversPos: SaversPosition = {\n depositValue: depositAmount,\n redeemableValue: redeemableAssetAmount,\n lastAddHeight: Number(savers?.last_add_height),\n percentageGrowth: saverGrowth.assetAmount.amount().toNumber(),\n ageInYears: saversAge,\n ageInDays: saversAge * 365,\n errors,\n }\n return saversPos\n }\n\n private async getAddSaversEstimateErrors(addAmount: CryptoAmount): Promise<string[]> {\n const errors = []\n const pools = await this.thorchainCache.getPools()\n const saversPools = Object.values(pools).filter((i) => i.pool.saversDepth !== '0')\n const inboundDetails = await this.thorchainCache.getInboundDetails()\n const saverPool = saversPools.find((i) => assetToString(i.asset) === assetToString(addAmount.asset))\n if (!saverPool) errors.push(` ${assetToString(addAmount.asset)} does not have a saver's pool`)\n if (inboundDetails[addAmount.asset.chain].haltedChain) errors.push(`${addAmount.asset.chain} is halted, cannot add`)\n const pool = (await this.thorchainCache.getPoolForAsset(addAmount.asset)).pool\n if (pool.status.toLowerCase() !== 'available')\n errors.push(`Pool is not available for this asset ${assetToString(addAmount.asset)}`)\n const inboundFee = calcNetworkFee(addAmount.asset, inboundDetails[addAmount.asset.chain])\n if (addAmount.lte(inboundFee)) errors.push(`Add amount does not cover fees`)\n return errors\n }\n}\n","import { Saver, TxDetailsResponse, TxSignersResponse } from '@xchainjs/xchain-thornode'\nimport { Asset, Chain, assetFromStringEx, baseAmount } from '@xchainjs/xchain-util'\n\nimport { DefaultChainAttributes } from './chain-defaults'\nimport { CryptoAmount } from './crypto-amount'\nimport { ThorchainCache } from './thorchain-cache'\nimport { ChainAttributes } from './types'\nimport { AssetRuneNative, THORChain, isAssetRuneNative } from './utils'\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}\nexport enum InboundStatus {\n Observed_Consensus = 'Observed_Consensus',\n Observed_Incomplete = 'Observed_Incomplete',\n Unknown = 'Unknown',\n}\nexport enum SwapStatus {\n Complete = 'Complete',\n Complete_Refunded = 'Complete_Refunded',\n Complete_Below_Dust = 'Complete_Below_Dust',\n Incomplete = 'Incomplete',\n}\nexport enum AddLpStatus {\n Complete = 'Complete',\n Complete_Refunded = 'Complete_Refunded',\n Complete_Below_Dust = 'Complete_Below_Dust',\n Incomplete = 'Incomplete',\n}\nexport enum WithdrawStatus {\n Complete = 'Complete',\n Incomplete = 'Incomplete',\n Complete_Refunded = 'Complete_Refunded',\n}\nexport enum RefundStatus {\n Complete = 'Complete',\n Incomplete = 'Incomplete',\n Complete_Refunded = 'Complete_Refunded',\n}\nexport enum AddSaverStatus {\n Complete = 'Complete',\n Complete_Refunded = 'Complete_Refunded',\n Complete_Below_Dust = 'Complete_Below_Dust',\n Incomplete = 'Incomplete',\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}\nexport type AddLpInfo = {\n status: AddLpStatus\n isSymmetric: boolean\n assetTx?: InboundTx\n runeTx?: InboundTx\n assetConfirmationDate?: Date\n pool: Asset\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}\nexport type WithdrawInfo = {\n status: WithdrawStatus\n withdrawalAmount: CryptoAmount\n expectedConfirmationDate: Date\n thorchainHeight: number\n outboundHeight: number\n estimatedWaitTime: number\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\nexport type AddSaverInfo = {\n status: AddSaverStatus\n assetTx?: InboundTx\n saverPos?: Saver\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}\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\nexport class TransactionStage {\n readonly thorchainCache: ThorchainCache\n private chainAttributes: Record<Chain, ChainAttributes>\n\n constructor(thorchainCache: ThorchainCache, chainAttributes = DefaultChainAttributes) {\n this.thorchainCache = thorchainCache\n this.chainAttributes = chainAttributes\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 private async checkSwapProgress(txData: TxDetailsResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n const memo = txData.tx.tx.memo ?? ''\n const memoFields = this.parseSwapMemo(memo)\n const assetOut = assetFromStringEx(memoFields.asset.toUpperCase())\n //const assetIn = assetFromStringEx(txData.tx.tx.coins?.[0].asset)\n const swapStatus = txData.out_txs[0].memo?.match('OUT') ? SwapStatus.Complete : SwapStatus.Complete_Refunded\n // current height of thorchain, neeed for confirmations\n const chainHeight = await this.blockHeight(AssetRuneNative)\n\n // expected outbound height\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 const confirmations = chainHeight > outboundHeight ? chainHeight - outboundHeight : 0\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 // TODO get out tx\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 progress.swapInfo = swapInfo\n }\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 private async getCryptoAmount(baseAmt: string, asset: Asset): Promise<CryptoAmount> {\n const decimals =\n THORChain === asset.chain ? 8 : Number((await this.thorchainCache.getPoolForAsset(asset)).pool.nativeDecimal)\n return new CryptoAmount(baseAmount(baseAmt, decimals), asset)\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.tx.block_height)\n\n const finalizeBlock =\n txData.tx.tx.chain == THORChain ? Number(txData.finalised_height) : Number(txData.tx.finalise_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 private async checkAddLpProgress(txData: TxSignersResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n const memo = txData.tx.tx.memo ?? ''\n const memoFields = this.parseAddLpMemo(memo)\n const asset = assetFromStringEx(memoFields.asset)\n const isSymmetric = memoFields.pairedAddress ? true : false\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 private async checkWithdrawLpProgress(txData: TxSignersResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n const memo = txData.tx.tx.memo ?? ''\n const memoFields = this.parseWithdrawLpMemo(memo)\n const asset = assetFromStringEx(memoFields.asset)\n\n const lastBlockObj = await this.thorchainCache.thornode.getLastBlock()\n const currentHeight = lastBlockObj.find((obj) => obj)\n\n // find the date in which the asset should be seen in the wallet\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 // if the TC has process the block that the outbound tx was assigned to then its completed.\n const status = txData.tx.status === 'done' ? WithdrawStatus.Complete : WithdrawStatus.Incomplete\n\n const outAmount =\n status === WithdrawStatus.Complete ? JSON.stringify(txData.out_txs).split(`\"amount\":\"`)[1].split(`\"`) : ''\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 const withdrawalAmount = await this.getCryptoAmount(outAmount[0], asset)\n\n const withdrawLpInfo: WithdrawInfo = {\n status,\n withdrawalAmount,\n expectedConfirmationDate,\n thorchainHeight: currentTCHeight,\n outboundHeight: outboundBlock,\n estimatedWaitTime,\n }\n progress.withdrawLpInfo = withdrawLpInfo\n }\n }\n\n private async checkAddSaverProgress(txData: TxSignersResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n const assetTx = !isAssetRuneNative(progress.inboundObserved.amount.asset) ? progress.inboundObserved : undefined\n\n const checkSaverVaults = await this.thorchainCache.thornode.getSaver(\n txData.tx.tx.coins[0].asset,\n `${assetTx?.fromAddress}`,\n )\n const status = checkSaverVaults ? AddSaverStatus.Complete : AddSaverStatus.Incomplete\n const addSaverInfo: AddSaverInfo = {\n status: status,\n assetTx,\n saverPos: checkSaverVaults,\n }\n progress.addSaverInfo = addSaverInfo\n }\n }\n\n private async checkWithdrawSaverProgress(txData: TxSignersResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n const memo = txData.tx.tx.memo ?? ''\n const memoFields = this.parseWithdrawLpMemo(memo)\n const asset = assetFromStringEx(memoFields.asset)\n\n const lastBlockObj = await this.thorchainCache.thornode.getLastBlock()\n const currentHeight = lastBlockObj.find((obj) => obj)\n\n // find the date in which the asset should be seen in the wallet\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 const outAmount = txData.out_txs ? JSON.stringify(txData.out_txs).split(`\"amount\":\"`)[1].split(`\"`) : ''\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 // if the TC has process the block that the outbound tx was assigned to then its completed.\n const status = txData.out_txs ? WithdrawStatus.Complete : WithdrawStatus.Incomplete\n\n const withdrawalAmount = await this.getCryptoAmount(outAmount[0], asset)\n const withdrawSaverInfo: WithdrawSaverInfo = {\n status,\n withdrawalAmount,\n expectedConfirmationDate,\n thorchainHeight: currentTCHeight,\n finalisedHeight,\n outboundBlock,\n estimatedWaitTime,\n }\n progress.withdrawSaverInfo = withdrawSaverInfo\n }\n }\n\n private async checkRefund(txData: TxSignersResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n const lastBlockObj = await this.thorchainCache.thornode.getLastBlock()\n // find the date in which the asset should be seen in the wallet\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 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 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 private parseAddLpMemo(memo: string) {\n //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 private parseWithdrawLpMemo(memo: string) {\n //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 * Private function to return the date stamp from block height and chain\n * @param chain - input chain\n * @param txData - txResponse\n * @returns date()\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.tx.block_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 current block height of an asset's native chain\n * @param chain\n * @returns\n */\n private async blockHeight(asset: Asset) {\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 || asset.synth) {\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":["Configuration"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/chain-defaults.ts","../src/crypto-amount.ts","../src/liquidity-pool.ts","../src/utils/const.ts","../src/utils/utils.ts","../src/utils/liquidity.ts","../src/utils/midgard.ts","../src/utils/thornode.ts","../src/thorchain-cache.ts","../src/thorchain-query.ts","../src/thorchain-checktx.ts"],"sourcesContent":["import { Chain } from '@xchainjs/xchain-util'\n\nimport { ChainAttributes } from './types'\n\nconst DefaultChainAttributes: Record<Chain, ChainAttributes> = {\n BCH: {\n blockReward: 6.25,\n avgBlockTimeInSecs: 600,\n },\n BTC: {\n blockReward: 6.25,\n avgBlockTimeInSecs: 600,\n },\n ETH: {\n blockReward: 2,\n avgBlockTimeInSecs: 13,\n },\n AVAX: {\n blockReward: 2,\n avgBlockTimeInSecs: 3,\n },\n LTC: {\n blockReward: 12.5,\n avgBlockTimeInSecs: 150,\n },\n DOGE: {\n blockReward: 10000,\n avgBlockTimeInSecs: 60,\n },\n GAIA: {\n blockReward: 0,\n avgBlockTimeInSecs: 6,\n },\n BNB: {\n blockReward: 0,\n avgBlockTimeInSecs: 6,\n },\n THOR: {\n blockReward: 0,\n avgBlockTimeInSecs: 6,\n },\n BSC: {\n blockReward: 0,\n avgBlockTimeInSecs: 3,\n },\n MAYA: {\n blockReward: 0,\n avgBlockTimeInSecs: 6,\n },\n}\n\nexport { DefaultChainAttributes }\n","import {\n Asset,\n AssetAmount,\n BaseAmount,\n assetToBase,\n assetToString,\n baseToAsset,\n eqAsset,\n formatAssetAmountCurrency,\n} from '@xchainjs/xchain-util'\nimport { BigNumber } from 'bignumber.js'\n\ntype CryptoNumeric = CryptoAmount | number | BigNumber\n\n/**\n * Utility Class to combine an amount (asset/base) with the Asset\n *\n */\nexport class CryptoAmount {\n baseAmount: BaseAmount\n readonly asset: Asset\n constructor(amount: BaseAmount, asset: Asset) {\n this.asset = asset\n this.baseAmount = amount\n }\n plus(v: CryptoAmount): CryptoAmount {\n this.check(v)\n const assetAmountResult = assetToBase(this.assetAmount.plus(v.assetAmount))\n return new CryptoAmount(assetAmountResult, this.asset)\n }\n minus(v: CryptoAmount): CryptoAmount {\n this.check(v)\n const assetAmountResult = assetToBase(this.assetAmount.minus(v.assetAmount))\n return new CryptoAmount(assetAmountResult, this.asset)\n }\n times(v: CryptoNumeric): CryptoAmount {\n this.check(v)\n if (v instanceof CryptoAmount) {\n const assetAmountResult = assetToBase(this.assetAmount.times(v.assetAmount))\n return new CryptoAmount(assetAmountResult, this.asset)\n } else {\n const assetAmountResult = assetToBase(this.assetAmount.times(v))\n return new CryptoAmount(assetAmountResult, this.asset)\n }\n }\n div(v: CryptoNumeric): CryptoAmount {\n this.check(v)\n if (v instanceof CryptoAmount) {\n const assetAmountResult = assetToBase(this.assetAmount.div(v.assetAmount))\n return new CryptoAmount(assetAmountResult, this.asset)\n } else {\n const assetAmountResult = assetToBase(this.assetAmount.div(v))\n return new CryptoAmount(assetAmountResult, this.asset)\n }\n }\n lt(v: CryptoAmount): boolean {\n this.check(v)\n return this.assetAmount.lt(v.assetAmount)\n }\n lte(v: CryptoAmount): boolean {\n this.check(v)\n return this.assetAmount.lte(v.assetAmount)\n }\n gt(v: CryptoAmount): boolean {\n this.check(v)\n return this.assetAmount.gt(v.assetAmount)\n }\n gte(v: CryptoAmount): boolean {\n this.check(v)\n\n return this.assetAmount.gte(v.assetAmount)\n }\n eq(v: CryptoAmount): boolean {\n this.check(v)\n return this.assetAmount.eq(v.assetAmount)\n }\n formatedAssetString(): string {\n return formatAssetAmountCurrency({\n amount: this.assetAmount,\n asset: this.asset,\n trimZeros: true,\n })\n }\n assetAmountFixedString(): string {\n return this.assetAmount.amount().toFixed()\n }\n get assetAmount(): AssetAmount {\n return baseToAsset(this.baseAmount)\n }\n /**\n * This guard protects against trying to perform math with different assets\n *\n * Example.\n * const x = new CryptoAmount(assetAmount(1),AssetBTC)\n * const y = new CryptoAmount(assetAmount(1),AssetETH)\n *\n * x.plus(y) <- will throw error \"cannot perform math on 2 diff assets BTC.BTC ETH.ETH\n *\n * @param v - CryptoNumeric\n */\n private check(v: CryptoNumeric) {\n if (v instanceof CryptoAmount) {\n if (!eqAsset(this.asset, v.asset)) {\n throw Error(`cannot perform math on 2 diff assets ${assetToString(this.asset)} ${assetToString(v.asset)}`)\n }\n }\n }\n}\n","import { PoolDetail } from '@xchainjs/xchain-midgard/lib'\nimport { Pool } from '@xchainjs/xchain-thornode/lib'\nimport { Asset, BaseAmount, assetFromString, baseAmount } from '@xchainjs/xchain-util'\nimport { BigNumber } from 'bignumber.js'\n\n/**\n * Represent a Liquidity Pool in Thorchain\n */\nexport class LiquidityPool {\n readonly pool: PoolDetail\n readonly thornodeDetails: Pool\n readonly assetBalance: BaseAmount\n readonly runeBalance: BaseAmount\n // readonly decimals: number\n\n readonly asset: Asset\n readonly assetString: string\n readonly runeToAssetRatio: BigNumber\n readonly assetToRuneRatio: BigNumber\n\n constructor(pool: PoolDetail, thornodeDetails: Pool) {\n this.pool = pool\n this.thornodeDetails = thornodeDetails\n const asset = assetFromString(this.pool.asset)\n if (!asset) throw new Error(`could not parse ${this.pool.asset}`)\n\n this.asset = asset\n // this.decimals = decimals\n this.assetString = this.pool.asset\n this.assetBalance = baseAmount(this.pool.assetDepth)\n this.runeBalance = baseAmount(this.pool.runeDepth)\n\n this.runeToAssetRatio = this.runeBalance.amount().div(this.assetBalance.amount())\n this.assetToRuneRatio = this.assetBalance.amount().div(this.runeBalance.amount())\n }\n isAvailable(): boolean {\n return this.pool.status.toLowerCase() === 'available'\n }\n}\n","import { Asset, assetFromStringEx, assetToString } from '@xchainjs/xchain-util'\n\nexport const AssetBNB = assetFromStringEx('BNB.BNB')\nexport const AssetAVAX = assetFromStringEx('AVAX.AVAX')\nexport const AssetBTC = assetFromStringEx('BTC.BTC')\nexport const AssetBCH = assetFromStringEx('BCH.BCH')\nexport const AssetETH = assetFromStringEx('ETH.ETH')\nexport const AssetDOGE = assetFromStringEx('DOGE.DOGE')\nexport const AssetLTC = assetFromStringEx('LTC.LTC')\nexport const AssetATOM = assetFromStringEx('GAIA.ATOM')\nexport const AssetMAYA = assetFromStringEx('MAYA.CACAO')\nexport const AssetBSC = assetFromStringEx('BSC.BNB')\nexport const AssetRuneNative = assetFromStringEx('THOR.RUNE')\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'\n\nexport const isAssetRuneNative = (asset: Asset): boolean => assetToString(asset) === assetToString(AssetRuneNative)\n","import {\n // Address,\n Asset,\n Chain,\n baseAmount,\n eqAsset,\n} from '@xchainjs/xchain-util'\nimport { BigNumber } from 'bignumber.js'\n\nimport { CryptoAmount } from '../crypto-amount'\nimport { InboundDetail } from '../types'\n// eslint-disable-next-line ordered-imports/ordered-imports\nimport {\n AVAXChain,\n AssetATOM,\n AssetAVAX,\n AssetBCH,\n AssetBNB,\n AssetBSC,\n AssetBTC,\n AssetDOGE,\n AssetETH,\n AssetLTC,\n AssetMAYA,\n AssetRuneNative,\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\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 BNBChain:\n return AssetBNB\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 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: Asset): boolean => {\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: Asset, inbound: InboundDetail): CryptoAmount => {\n // synths are always 0.02R fee\n if (asset.synth) return new CryptoAmount(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 CryptoAmount(baseAmount(inbound.gasRate.multipliedBy(inbound.outboundTxSize)), AssetBTC)\n break\n case BCHChain:\n return new CryptoAmount(baseAmount(inbound.gasRate.multipliedBy(inbound.outboundTxSize)), AssetBCH)\n break\n case LTCChain:\n return new CryptoAmount(baseAmount(inbound.gasRate.multipliedBy(inbound.outboundTxSize)), AssetLTC)\n break\n case DOGEChain:\n // NOTE: UTXO chains estimate fees with a 250 byte size\n return new CryptoAmount(baseAmount(inbound.gasRate.multipliedBy(inbound.outboundTxSize)), AssetDOGE)\n break\n case BNBChain:\n //flat fee\n return new CryptoAmount(baseAmount(inbound.gasRate), AssetBNB)\n break\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 CryptoAmount(gasRateinETHWei.times(21000), AssetETH)\n } else {\n return new CryptoAmount(gasRateinETHWei.times(70000), AssetETH)\n }\n break\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 CryptoAmount(gasRateinAVAXWei.times(21000), AssetAVAX)\n } else {\n return new CryptoAmount(gasRateinAVAXWei.times(70000), AssetAVAX)\n }\n break\n case GAIAChain:\n return new CryptoAmount(baseAmount(inbound.gasRate), AssetATOM)\n break\n case THORChain:\n return new CryptoAmount(baseAmount(2000000), AssetRuneNative)\n break\n case BSCChain:\n return new CryptoAmount(baseAmount(inbound.gasRate), AssetBSC)\n break\n case MAYAChain:\n return new CryptoAmount(baseAmount(inbound.gasRate), AssetMAYA)\n break\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: Asset, inbound: InboundDetail): CryptoAmount => {\n if (asset.synth) return new CryptoAmount(baseAmount(2000000), AssetRuneNative)\n switch (asset.chain) {\n case BTCChain:\n return new CryptoAmount(baseAmount(inbound.outboundFee), AssetBTC)\n break\n case BCHChain:\n return new CryptoAmount(baseAmount(inbound.outboundFee), AssetBCH)\n break\n case LTCChain:\n return new CryptoAmount(baseAmount(inbound.outboundFee), AssetLTC)\n break\n case DOGEChain:\n // NOTE: UTXO chains estimate fees with a 250 byte size\n return new CryptoAmount(baseAmount(inbound.outboundFee), AssetDOGE)\n break\n case BNBChain:\n //flat fee\n return new CryptoAmount(baseAmount(inbound.outboundFee), AssetBNB)\n break\n case ETHChain:\n return new CryptoAmount(baseAmount(inbound.outboundFee.multipliedBy(10 ** 9), 18), AssetETH)\n break\n case AVAXChain:\n return new CryptoAmount(baseAmount(inbound.outboundFee.multipliedBy(10 ** 9), 18), AssetAVAX)\n break\n case GAIAChain:\n return new CryptoAmount(baseAmount(inbound.outboundFee), AssetATOM)\n break\n case BSCChain:\n return new CryptoAmount(baseAmount(inbound.outboundFee), AssetBSC)\n break\n case THORChain:\n return new CryptoAmount(baseAmount(2000000), AssetRuneNative)\n break\n case MAYAChain:\n return new CryptoAmount(baseAmount(2000000), AssetMAYA)\n break\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 default:\n throw Error('Unknown chain')\n }\n}\n","import { baseAmount } from '@xchainjs/xchain-util'\nimport { BigNumber } from 'bignumber.js'\n\nimport { CryptoAmount } from '../crypto-amount'\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.pool.liquidityUnits)\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.pool.liquidityUnits)\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 Action,\n Configuration,\n MemberDetails,\n MidgardApi,\n PoolDetail,\n PoolStatsDetail,\n THORNameDetails,\n} from '@xchainjs/xchain-midgard'\nimport axios from 'axios'\nimport axiosRetry from 'axios-retry'\n\nimport { MidgardConfig } from '../types'\n\nconst defaultMidgardConfig: Record<Network, MidgardConfig> = {\n mainnet: {\n apiRetries: 3,\n midgardBaseUrls: ['https://midgard.ninerealms.com'],\n },\n stagenet: {\n apiRetries: 3,\n midgardBaseUrls: ['https://stagenet-midgard.ninerealms.com'],\n },\n testnet: {\n apiRetries: 3,\n midgardBaseUrls: ['https://testnet.midgard.thorchain.info'],\n },\n}\n\nexport class Midgard {\n private config: MidgardConfig\n readonly network: Network\n private midgardApis: MidgardApi[]\n\n constructor(network: Network = Network.Mainnet, config?: MidgardConfig) {\n this.network = network\n this.config = config ?? defaultMidgardConfig[this.network]\n axiosRetry(axios, { retries: this.config.apiRetries, retryDelay: axiosRetry.exponentialDelay })\n this.midgardApis = this.config.midgardBaseUrls.map((url) => new MidgardApi(new Configuration({ basePath: url })))\n }\n\n /**\n *\n * @returns an array of Pools\n */\n async getPools(): Promise<PoolDetail[]> {\n for (const api of this.midgardApis) {\n try {\n return (await api.getPools()).data\n } catch (e) {\n //console.error(e)\n }\n }\n throw new Error(`Midgard not responding`)\n }\n\n /**\n * Gets the latest block using the Health endpoint within Midgard\n *\n * @returns\n */\n public async getLatestBlockHeight(): Promise<number> {\n for (const api of this.midgardApis) {\n try {\n const data = (await api.getHealth()).data\n return +data.scannerHeight\n } catch (e) {\n //console.error(e)\n }\n }\n throw Error(`Midgard not responding`)\n }\n /**\n * Gets actions object for any of the parameters\n * @param txHash transaction id\n * @returns Type Action array of objects\n */\n public async getActions(\n address?: string,\n txid?: string,\n asset?: string,\n type?: string,\n affiliate?: string,\n limit?: number,\n offset?: number,\n ): Promise<Action[]> {\n for (const api of this.midgardApis) {\n try {\n const actions = (await api.getActions(address, txid, asset, type, affiliate, limit, offset)).data.actions\n return actions\n } catch (e) {\n //console.error(e)\n }\n }\n throw Error(`Midgard not responding`)\n }\n\n /**\n * Function to return member details based on valid liquidity position\n * @param address - needed to query for Lp details\n * @returns - object type of Member Detail\n */\n public async getMember(address: string): Promise<MemberDetails> {\n for (const api of this.midgardApis) {\n try {\n const memberDetail = (await api.getMemberDetail(address)).data\n return memberDetail\n } catch (e) {\n //console.error(e)\n }\n }\n throw Error(`Midgard not responding`)\n }\n\n /**\n * Function to return pool statistics for a particular asset\n * @param asset - asset string to query its pool stats\n * @returns - type object poolstatsDetail\n */\n public async getPoolStats(asset: string): Promise<PoolStatsDetail> {\n for (const api of this.midgardApis) {\n try {\n const poolDetail = (await api.getPoolStats(asset)).data\n return poolDetail\n } catch (e) {\n //console.error(e)\n }\n }\n throw Error(`Midgard not responding`)\n }\n\n /**\n * Function to return THORNameDetails for a particular name\n * @param name - thorname string to query\n * @returns - type object THORNameDetails\n */\n public async getTHORNameDetails(name: string): Promise<THORNameDetails | undefined> {\n for (const api of this.midgardApis) {\n try {\n const resp = await api.getTHORNameDetail(name)\n if (resp.status == 404) {\n return undefined\n } else if (resp.status == 200) {\n return resp.data\n }\n } catch (e) {\n // if (resp.status == 404) {\n // return undefined\n // }\n //console.error(e)\n }\n }\n throw Error(`Midgard not responding`)\n }\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 QuoteSaverDepositResponse,\n QuoteSaverWithdrawResponse,\n QuoteSwapResponse,\n Saver,\n SaversApi,\n SaversResponse,\n TransactionsApi,\n TxDetailsResponse,\n TxOutItem,\n TxResponse,\n} from '@xchainjs/xchain-thornode'\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`, `https://thornode.thorswap.net`],\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\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 }\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.ticker}`,\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 fromAddress?: string,\n toleranceBps?: number,\n affiliateBps?: number,\n affiliate?: string,\n height?: number,\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 fromAddress,\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","import { Address, Asset, Chain, assetToString, baseAmount, eqAsset } from '@xchainjs/xchain-util'\nimport { BigNumber } from 'bignumber.js'\n\nimport { CryptoAmount } from './crypto-amount'\nimport { LiquidityPool } from './liquidity-pool'\nimport { InboundDetail, InboundDetailCache, NetworkValuesCache, PoolCache } from './types'\nimport { THORChain, isAssetRuneNative } from './utils'\nimport { Midgard } from './utils/midgard'\nimport { Thornode } from './utils/thornode'\n\nconst SAME_ASSET_EXCHANGE_RATE = new BigNumber(1)\nconst TEN_MINUTES = 10 * 60 * 1000\nconst DEFAULT_THORCHAIN_DECIMALS = 8\n// const USD_ASSETS: Record<Network, Asset[]> = {\n// mainnet: [\n// assetFromStringEx('BNB.BUSD-BD1'),\n// assetFromStringEx('ETH.USDC-0XA0B86991C6218B36C1D19D4A2E9EB0CE3606EB48'),\n// assetFromStringEx('ETH.USDT-0XDAC17F958D2EE523A2206206994597C13D831EC7'),\n// ],\n// stagenet: [assetFromStringEx('ETH.USDT-0XDAC17F958D2EE523A2206206994597C13D831EC7')],\n// testnet: [\n// assetFromStringEx('BNB.BUSD-74E'),\n// assetFromStringEx('ETH.USDT-0XA3910454BF2CB59B8B3A401589A3BACC5CA42306'),\n// ],\n// }\nconst defaultMidgard = new Midgard()\nconst defaultThornode = new Thornode()\n\n/**\n * This class manages retrieving information from up to date Thorchain\n */\nexport class ThorchainCache {\n readonly midgard: Midgard\n readonly thornode: Thornode\n private poolCache: PoolCache | undefined\n private inboundDetailCache: InboundDetailCache | undefined = undefined\n private networkValuesCache: NetworkValuesCache | undefined = undefined\n\n private expirePoolCacheMillis\n private expireInboundDetailsCacheMillis\n private expireNetworkValuesCacheMillis\n\n /**\n * Contrustor to create a ThorchainCache\n *\n * @param midgard - an instance of the midgard API (could be pointing to stagenet,testnet,mainnet)\n * @param expirePoolCacheMillis - how long should the pools be cached before expiry\n * @param expireAsgardCacheMillis - how long should the inboundAsgard Addresses be cached before expiry\n * @param expireInboundDetailsCacheMillis - how long should the InboundDetails be cached before expiry\n * @param expireNetworkValuesCacheMillis - how long should the Mimir/Constants be cached before expiry\n * @returns ThorchainCache\n */\n constructor(\n midgard = defaultMidgard,\n thornode = defaultThornode,\n expirePoolCacheMillis = 6000,\n expireInboundDetailsCacheMillis = 6000,\n expireNetworkValuesCacheMillis = TEN_MINUTES,\n ) {\n this.midgard = midgard\n this.thornode = thornode\n this.expirePoolCacheMillis = expirePoolCacheMillis\n this.expireInboundDetailsCacheMillis = expireInboundDetailsCacheMillis\n this.expireNetworkValuesCacheMillis = expireNetworkValuesCacheMillis\n\n //initialize the cache\n this.refreshPoolCache()\n }\n\n /**\n * Gets the exchange rate of the from asset in terms on the to asset\n *\n * @param asset - cannot be RUNE.\n * @returns Promise<BigNumber>\n */\n async getExchangeRate(from: Asset, to: Asset): 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 lpTo = await this.getPoolForAsset(to)\n exchangeRate = lpTo.assetToRuneRatio\n } else if (isAssetRuneNative(to)) {\n // Asset per rune\n const lpFrom = await this.getPoolForAsset(from)\n exchangeRate = lpFrom.runeToAssetRatio\n } else {\n // AssetA per AssetB\n const lpFrom = await this.getPoolForAsset(from)\n const lpTo = await this.getPoolForAsset(to)\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 *\n * @param asset - cannot be RUNE, since Rune is the other side of each pool.\n * @returns Promise<LiquidityPool>\n */\n async getPoolForAsset(asset: Asset): 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 wioll be re-fetched from midgard\n *\n * @returns Promise<Record<string, LiquidityPool>>\n */\n async getPools(): Promise<Record<string, LiquidityPool>> {\n const millisSinceLastRefeshed = Date.now() - (this.poolCache?.lastRefreshed || 0)\n if (millisSinceLastRefeshed > this.expirePoolCacheMillis) {\n try {\n await this.refreshPoolCache()\n } catch (e) {\n console.error(e)\n }\n }\n if (this.poolCache) {\n return this.poolCache?.pools\n } else {\n throw Error(`Could not refresh Pools `)\n }\n }\n /**\n * Refreshes the Pool Cache\n *\n * NOTE: do not call refreshPoolCache() directly, call getPools() instead\n * which will refresh the cache if it's expired\n */\n private async refreshPoolCache(): Promise<void> {\n try {\n const [thornodePools, midgardPools] = await Promise.all([this.thornode.getPools(), this.midgard.getPools()])\n const poolMap: Record<string, LiquidityPool> = {}\n\n if (midgardPools) {\n for (const pool of midgardPools) {\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(pool, thornodePool)\n poolMap[`${lp.asset.chain}.${lp.asset.ticker}`] = lp\n } catch (error) {\n console.log(error)\n }\n }\n\n this.poolCache = {\n lastRefreshed: Date.now(),\n pools: poolMap,\n }\n }\n } catch (error) {\n console.error('Error refreshing pool cache:', error)\n }\n }\n\n /**\n * Refreshes the InboundDetailCache Cache\n *\n * NOTE: do not call refereshInboundDetailCache() directly, call getInboundDetails() instead\n * which will refresh the cache if it's expired\n */\n private async refereshInboundDetailCache(): Promise<void> {\n const [mimirDetails, allInboundAddresses] = await Promise.all([\n this.thornode.getMimir(),\n this.thornode.getInboundAddresses(),\n ])\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\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 this.inboundDetailCache = {\n lastRefreshed: Date.now(),\n inboundDetails,\n }\n }\n /**\n * Refreshes the NetworkValuesCache Cache\n *\n * NOTE: do not call refereshNetworkValuesCache() directly, call getNetworkValuess() instead\n * which will refresh the cache if it's expired\n */\n private async refereshNetworkValuesCache(): Promise<void> {\n const networkValues = await this.thornode.getNetworkValues()\n\n this.networkValuesCache = {\n lastRefreshed: Date.now(),\n networkValues,\n }\n }\n\n /**\n * Returns the exchange of a CryptoAmount to a different Asset\n *\n * Ex. convert(input:100 BUSD, outAsset: BTC) -> 0.0001234 BTC\n *\n * @param input - amount/asset to convert to outAsset\n * @param outAsset - the Asset you want to convert to\n * @returns CryptoAmount of input\n */\n async convert(input: CryptoAmount, outAsset: Asset): Promise<CryptoAmount> {\n const exchangeRate = await this.getExchangeRate(input.asset, outAsset)\n const outDecimals = await this.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(amt, outAsset)\n // console.log(\n // `${input.formatedAssetString()} ${input.asset.ticker} = ${result.formatedAssetString()} ${outAsset.ticker}`,\n // )\n\n return result\n }\n private async getDecimalForAsset(asset: Asset): Promise<number> {\n if (!isAssetRuneNative(asset)) {\n const pool = await this.getPoolForAsset(asset)\n const decimals = Number(pool.pool.nativeDecimal)\n if (decimals > 0) return decimals\n else return DEFAULT_THORCHAIN_DECIMALS\n }\n return DEFAULT_THORCHAIN_DECIMALS\n }\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 *\n * @returns - inbound details\n */\n async getInboundDetails(): Promise<Record<string, InboundDetail>> {\n const millisSinceLastRefeshed = Date.now() - (this.inboundDetailCache?.lastRefreshed || 0)\n if (millisSinceLastRefeshed > this.expireInboundDetailsCacheMillis) {\n try {\n await this.refereshInboundDetailCache()\n } catch (e) {\n console.error(e)\n }\n }\n if (this.inboundDetailCache) {\n return this.inboundDetailCache.inboundDetails\n } else {\n throw Error(`Could not refereshInboundDetailCache `)\n }\n }\n /**\n *\n * @returns - network values\n */\n async getNetworkValues(): Promise<Record<string, number>> {\n const millisSinceLastRefeshed = Date.now() - (this.networkValuesCache?.lastRefreshed || 0)\n if (millisSinceLastRefeshed > this.expireNetworkValuesCacheMillis) {\n try {\n await this.refereshNetworkValuesCache()\n } catch (e) {\n console.error(e)\n }\n }\n if (this.networkValuesCache) {\n return this.networkValuesCache.networkValues\n } else {\n throw Error(`Could not refereshInboundDetailCache `)\n }\n }\n}\n","import { LastBlock } from '@xchainjs/xchain-thornode'\nimport {\n Asset,\n Chain,\n assetAmount,\n assetFromStringEx,\n assetToBase,\n assetToString,\n baseAmount,\n} from '@xchainjs/xchain-util'\nimport { BigNumber } from 'bignumber.js'\n\nimport { DefaultChainAttributes } from './chain-defaults'\nimport { CryptoAmount } from './crypto-amount'\nimport { ThorchainCache } from './thorchain-cache'\nimport {\n AddliquidityPosition,\n Block,\n ChainAttributes,\n DustValues,\n EstimateAddLP,\n EstimateAddSaver,\n EstimateWithdrawLP,\n EstimateWithdrawSaver,\n LiquidityPosition,\n PoolRatios,\n PostionDepositValue,\n QuoteSwapParams,\n SaverFees,\n SaversPosition,\n SaversWithdraw,\n TotalFees,\n TxDetails,\n UnitData,\n WithdrawLiquidityPosition,\n getSaver,\n} from './types'\nimport { AssetBNB, AssetRuneNative, BNBChain, GAIAChain, THORChain, isAssetRuneNative } 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 * THORChain 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 * Contructor to create a ThorchainAMM\n *\n * @param thorchainCache - an instance of the ThorchainCache (could be pointing to stagenet,testnet,mainnet)\n * @param chainAttributes - atrributes 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 /**\n *\n * @param quoteSwapParams - input params\n * @returns\n */\n public async quoteSwap({\n fromAsset,\n destinationAsset,\n amount,\n destinationAddress,\n fromAddress,\n toleranceBps,\n interfaceID = '555',\n affiliateBps,\n affiliateAddress,\n height,\n }: QuoteSwapParams): Promise<TxDetails> {\n const errors: string[] = []\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 fromAddress,\n toleranceBps,\n affiliateBps,\n affiliateAddress,\n height,\n )\n // error handling\n const response: { error?: string } = JSON.parse(JSON.stringify(swapQuote))\n if (response.error) errors.push(`Thornode request quote: ${response.error}`)\n\n if (errors.length > 0) {\n return {\n memo: ``,\n toAddress: ``,\n expiry: new Date(),\n txEstimate: {\n totalFees: {\n asset: destinationAsset,\n affiliateFee: new CryptoAmount(baseAmount(0), AssetRuneNative),\n outboundFee: new CryptoAmount(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 },\n }\n }\n\n // Return quote\n const feeAsset = assetFromStringEx(swapQuote.fees.asset)\n const txDetails: TxDetails = {\n memo: this.constructSwapMemo(`${swapQuote.memo}`, interfaceID),\n toAddress: `${swapQuote.inbound_address}`,\n expiry: new Date(swapQuote.expiry * 1000),\n txEstimate: {\n totalFees: {\n asset: fromAsset,\n affiliateFee: new CryptoAmount(baseAmount(swapQuote.fees.affiliate), feeAsset),\n outboundFee: new CryptoAmount(baseAmount(swapQuote.fees.outbound), feeAsset),\n },\n slipBasisPoints: swapQuote.slippage_bps,\n netOutput: new CryptoAmount(baseAmount(swapQuote.expected_amount_out), destinationAsset),\n outboundDelaySeconds: swapQuote.outbound_delay_seconds,\n inboundConfirmationSeconds: swapQuote.inbound_confirmation_seconds,\n canSwap: true,\n errors,\n },\n }\n return txDetails\n }\n\n /**\n *\n * @param params - swap object\n * @returns - constructed memo string\n */\n private constructSwapMemo(memo: string, interfaceID: string): string {\n const memoPart = memo.split(':')\n if (memoPart.length > 3) {\n memoPart[3] =\n memoPart[3].length >= 3 ? memoPart[3].substring(0, memoPart[3].length - 3).concat(interfaceID) : interfaceID\n let outmemo = ''\n for (let i = 0; i < memoPart.length; i++) {\n outmemo = outmemo.concat(`${memoPart[i]}:`)\n }\n return outmemo.substring(0, outmemo.length - 1)\n }\n return memo\n }\n\n /**\n * Works out how long an outbound Tx will be held by THORChain before sending.\n *\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): Promise<number> {\n const networkValues = await this.thorchainCache.getNetworkValues()\n const minTxOutVolumeThreshold = new CryptoAmount(\n baseAmount(networkValues['MINTXOUTVOLUMETHRESHOLD']),\n AssetRuneNative,\n )\n const maxTxOutOffset = networkValues['MAXTXOUTOFFSET']\n let txOutDelayRate = new CryptoAmount(baseAmount(networkValues['TXOUTDELAYRATE']), AssetRuneNative).assetAmount\n .amount()\n .toNumber()\n const getQueue = await this.thorchainCache.thornode.getQueue()\n const outboundValue = new CryptoAmount(baseAmount(getQueue.scheduled_outbound_value), AssetRuneNative)\n const thorChainblocktime = this.chainAttributes[THORChain].avgBlockTimeInSecs // blocks required to confirm tx\n // If asset is equal to Rune set runeValue as outbound amount else set it to the asset's value in rune\n const runeValue = await this.thorchainCache.convert(outboundAmount, AssetRuneNative)\n // Check rune value amount\n if (runeValue.lt(minTxOutVolumeThreshold)) {\n return thorChainblocktime\n }\n // Rune value in the outbound queue\n if (outboundValue == undefined) {\n throw new Error(`Could not return Scheduled Outbound Value`)\n }\n // Add OutboundAmount in rune to the oubound queue\n const outboundAmountTotal = runeValue.plus(outboundValue)\n // calculate the if outboundAmountTotal is over the volume threshold\n const volumeThreshold = outboundAmountTotal.div(minTxOutVolumeThreshold)\n // check delay rate\n txOutDelayRate = txOutDelayRate - volumeThreshold.assetAmount.amount().toNumber() <= 1 ? 1 : txOutDelayRate\n // calculate the minimum number of blocks in the future the txn has to be\n let minBlocks = runeValue.assetAmount.amount().toNumber() / txOutDelayRate\n minBlocks = minBlocks > maxTxOutOffset ? maxTxOutOffset : minBlocks\n return minBlocks * thorChainblocktime\n }\n\n /**\n * Convenience method to convert TotalFees to a different CryptoAmount\n *\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 *\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: Asset): Promise<TotalFees> {\n return {\n asset: fees.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 *\n * Ex. convert(input:100 BUSD, outAsset: BTC) -> 0.0001234 BTC\n *\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(input: CryptoAmount, outAsset: Asset): Promise<CryptoAmount> {\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 *\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 *\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 // RUNE, BNB and Synths have near instant finality, so no conf counting required. - need to make a BFT only case.\n if (\n isAssetRuneNative(inbound.asset) ||\n inbound.asset.chain == BNBChain ||\n inbound.asset.chain == GAIAChain ||\n inbound.asset.synth\n ) {\n return this.chainAttributes[THORChain].avgBlockTimeInSecs\n }\n // Get the gas asset for the inbound.asset.chain\n const chainGasAsset = getChainAsset(inbound.asset.chain)\n\n // check for chain asset, else need to convert asset value to chain asset.\n const amountInGasAsset = await this.thorchainCache.convert(inbound, chainGasAsset)\n // Convert to Asset Amount\n const amountInGasAssetInAsset = amountInGasAsset.assetAmount\n\n const confConfig = this.chainAttributes[inbound.asset.chain]\n // find the required confs\n const requiredConfs = Math.ceil(amountInGasAssetInAsset.amount().div(confConfig.blockReward).toNumber())\n // convert that into seconds\n return requiredConfs * confConfig.avgBlockTimeInSecs\n }\n\n /**\n * Estimates a liquidity position for given crypto amount value, both asymmetrical and symetrical\n * @param params - parameters needed for a estimated liquidity position\n * @returns - type object EstimateLP\n */\n public async estimateAddLP(params: AddliquidityPosition): Promise<EstimateAddLP> {\n const errors: string[] = []\n if (params.asset.asset.synth || params.rune.asset.synth) errors.push('you cannot add liquidity with a synth')\n if (!isAssetRuneNative(params.rune.asset)) errors.push('params.rune must be THOR.RUNE')\n\n const assetPool = await this.thorchainCache.getPoolForAsset(params.asset.asset)\n\n const lpUnits = getLiquidityUnits({ asset: params.asset, rune: params.rune }, assetPool)\n const inboundDetails = await this.thorchainCache.getInboundDetails()\n const unitData: UnitData = {\n liquidityUnits: lpUnits,\n totalUnits: new BigNumber(assetPool.pool.liquidityUnits),\n }\n const poolShare = getPoolShare(unitData, assetPool)\n const assetWaitTimeSeconds = await this.confCounting(params.asset)\n const runeWaitTimeSeconds = await this.confCounting(params.rune)\n const waitTimeSeconds = assetWaitTimeSeconds > runeWaitTimeSeconds ? assetWaitTimeSeconds : runeWaitTimeSeconds\n\n let assetInboundFee = new CryptoAmount(baseAmount(0), params.asset.asset)\n let runeInboundFee = new CryptoAmount(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 const totalFees = (await this.convert(assetInboundFee, AssetRuneNative)).plus(runeInboundFee)\n const slip = getSlipOnLiquidity({ asset: params.asset, rune: params.rune }, assetPool)\n const estimateLP: EstimateAddLP = {\n assetPool: assetPool.pool.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 - Type Object liquidityPosition\n */\n public async checkLiquidityPosition(asset: Asset, assetOrRuneAddress?: string): 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\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.pool.liquidityUnits),\n liquidityUnits: new BigNumber(liquidityProvider.units),\n }\n const networkValues = await this.thorchainCache.thornode.getNetworkValues()\n const block: Block = {\n current: blockData.thorchain,\n lastAdded: liquidityProvider.last_add_height,\n fullProtection: networkValues['FULLIMPLOSSPROTECTIONBLOCKS'],\n }\n //\n const currentLP: PostionDepositValue = {\n asset: baseAmount(liquidityProvider.asset_deposit_value),\n rune: baseAmount(liquidityProvider.rune_deposit_value),\n }\n\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 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 const lpGrowth = redeemLuvi - depositLuvi\n const currentLpGrowth = lpGrowth > 0 ? lpGrowth / depositLuvi : 0\n\n const impermanentLossProtection = getLiquidityProtectionData(currentLP, poolShare, block)\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): Promise<PoolRatios> {\n const assetPool = await this.thorchainCache.getPoolForAsset(asset)\n const poolRatio: PoolRatios = {\n assetToRune: assetPool.assetToRuneRatio,\n runeToAsset: assetPool.runeToAssetRatio,\n }\n return poolRatio\n }\n\n /**\n *\n * @param params\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 const memberDetail = await this.checkLiquidityPosition(params.asset, assetOrRuneAddress)\n const dustValues = await this.getDustValues(params.asset) // returns asset and rune dust values\n const assetPool = await this.thorchainCache.getPoolForAsset(params.asset)\n // get pool share from unit data\n const poolShare = getPoolShare(\n {\n liquidityUnits: new BigNumber(memberDetail.position.units),\n totalUnits: new BigNumber(assetPool.pool.liquidityUnits),\n },\n assetPool,\n )\n // get slip on liquidity removal\n const slip = getSlipOnLiquidity(\n {\n asset: poolShare.assetShare,\n rune: poolShare.runeShare,\n },\n assetPool,\n )\n // TODO make sure we compare wait times for withdrawing both rune and asset OR just rune OR just asset\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 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\n const estimateLP: EstimateWithdrawLP = {\n assetAddress: memberDetail.position.asset_address,\n runeAddress: memberDetail.position.rune_address,\n slipPercent: slip.times(100),\n inbound: {\n minToSend: {\n rune: dustValues.rune,\n asset: dustValues.asset,\n total: (await this.convert(dustValues.asset, AssetRuneNative)).plus(dustValues.rune),\n },\n fees: {\n rune: runeInbound,\n asset: assetInbound,\n total: (await this.convert(assetInbound, AssetRuneNative)).plus(runeInbound),\n },\n },\n outboundFee: {\n asset: assetOutbound,\n rune: runeOutbound,\n total: (await this.convert(assetOutbound, AssetRuneNative)).plus(runeOutbound),\n },\n assetAmount: poolShare.assetShare,\n runeAmount: poolShare.runeShare,\n lpGrowth: memberDetail.lpGrowth,\n estimatedWaitSeconds: waitTimeSeconds,\n impermanentLossProtection: memberDetail.impermanentLossProtection,\n assetPool: assetPool.pool.asset,\n }\n return estimateLP\n }\n /**\n * // can this become a quried constant? added to inbound_addresses or something\n * @param asset - asset needed to retrieve dust values\n * @returns - object type dust values\n */\n private async getDustValues(asset: Asset): Promise<DustValues> {\n let dustValues: DustValues\n switch (asset.chain) {\n case 'BNB':\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0.000001)), AssetBNB),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n case 'BTC':\n case `BCH`:\n case `LTC`:\n // 10k sats\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0.0001)), asset),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n case 'ETH':\n // 0 wei\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0)), asset),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n case 'THOR':\n // 0 Rune\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0)), asset),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n case 'GAIA':\n // 0 GAIA\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0)), asset),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n case 'DOGE':\n // 1 million sats\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0.01)), asset),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n case 'AVAX':\n // 0 AVAX\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0)), asset),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n case 'BSC':\n // 0 BSC\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0)), asset),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n case 'MAYA':\n // 0 MAYA\n dustValues = {\n asset: new CryptoAmount(assetToBase(assetAmount(0)), asset),\n rune: new CryptoAmount(assetToBase(assetAmount(0)), AssetRuneNative),\n }\n return dustValues\n default:\n throw Error('Unknown chain')\n }\n }\n\n // Savers Queries\n // Derrived from https://dev.thorchain.org/thorchain-dev/connection-guide/savers-guide\n public async estimateAddSaver(addAmount: CryptoAmount): Promise<EstimateAddSaver> {\n let errors: string[] = []\n // check for errors before sending quote\n errors = await this.getAddSaversEstimateErrors(addAmount)\n // request param amount should always be in 1e8 which is why we pass in adjusted 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),\n newAddAmount.toNumber(),\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}`)\n // Return errors if there is any\n if (errors.length > 0) {\n return {\n assetAmount: addAmount,\n estimatedDepositValue: new CryptoAmount(assetToBase(assetAmount(0)), addAmount.asset),\n fee: {\n affiliate: new CryptoAmount(assetToBase(assetAmount(0)), addAmount.asset),\n asset: addAmount.asset,\n outbound: new CryptoAmount(assetToBase(assetAmount(0)), addAmount.asset),\n },\n expiry: new Date(0),\n toAddress: '',\n memo: '',\n saverCapFilledPercent: -1,\n estimatedWaitTime: -1,\n slipBasisPoints: -1,\n canAddSaver: false,\n errors,\n }\n }\n // Calculate transaction expiry time of the vault address\n const currentDatetime = new Date()\n const minutesToAdd = 15\n const expiryDatetime = new Date(currentDatetime.getTime() + minutesToAdd * 60000)\n // Calculate seconds\n const estimatedWait = depositQuote.inbound_confirmation_seconds\n ? depositQuote.inbound_confirmation_seconds\n : await this.confCounting(addAmount)\n const pool = (await this.thorchainCache.getPoolForAsset(addAmount.asset)).pool\n // Organise fees\n const saverFees: SaverFees = {\n affiliate: new CryptoAmount(baseAmount(depositQuote.fees.affiliate), addAmount.asset),\n asset: assetFromStringEx(depositQuote.fees.asset),\n outbound: new CryptoAmount(baseAmount(depositQuote.fees.outbound), addAmount.asset),\n }\n // define savers filled capacity\n const saverCapFilledPercent = (+pool.synthSupply / +pool.assetDepth) * 100\n // return object\n const estimateAddSaver: EstimateAddSaver = {\n assetAmount: new CryptoAmount(baseAmount(depositQuote.expected_amount_out), addAmount.asset),\n estimatedDepositValue: new CryptoAmount(baseAmount(depositQuote.expected_amount_deposit), addAmount.asset),\n fee: saverFees,\n expiry: expiryDatetime,\n toAddress: depositQuote.inbound_address,\n memo: depositQuote.memo,\n estimatedWaitTime: estimatedWait,\n canAddSaver: errors.length === 0,\n slipBasisPoints: depositQuote.slippage_bps,\n saverCapFilledPercent,\n errors,\n }\n return estimateAddSaver\n }\n /**\n *\n * @param withdrawParams - height?, asset, address, withdrawalBasisPoints\n * @returns - savers withdrawal quote with extras\n */\n public async estimateWithdrawSaver(withdrawParams: SaversWithdraw): Promise<EstimateWithdrawSaver> {\n const errors: string[] = []\n // return error if Asset in is incorrect\n if (isAssetRuneNative(withdrawParams.asset) || withdrawParams.asset.synth)\n errors.push(`Native Rune and synth assets are not supported only L1's`)\n const inboundDetails = await this.thorchainCache.getInboundDetails()\n // Check to see if there is a position before calling withdraw quote\n const checkPositon = await this.getSaverPosition(withdrawParams)\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 expectedAssetAmount: new CryptoAmount(\n assetToBase(assetAmount(checkPositon.redeemableValue.assetAmount.amount())),\n withdrawParams.asset,\n ),\n fee: {\n affiliate: new CryptoAmount(assetToBase(assetAmount(0)), withdrawParams.asset),\n asset: withdrawParams.asset,\n outbound: new CryptoAmount(\n assetToBase(\n assetAmount(\n calcOutboundFee(withdrawParams.asset, inboundDetails[withdrawParams.asset.chain]).assetAmount.amount(),\n ),\n ),\n withdrawParams.asset,\n ),\n },\n expiry: new Date(0),\n toAddress: '',\n memo: '',\n estimatedWaitTime: -1,\n slipBasisPoints: -1,\n dustAmount: new CryptoAmount(baseAmount(0), withdrawParams.asset),\n errors,\n }\n }\n // Request withdraw quote\n const withdrawQuote = await this.thorchainCache.thornode.getSaversWithdrawQuote(withdrawParams)\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 {\n expectedAssetAmount: new CryptoAmount(assetToBase(assetAmount(0)), withdrawParams.asset),\n fee: {\n affiliate: new CryptoAmount(assetToBase(assetAmount(0)), withdrawParams.asset),\n asset: withdrawParams.asset,\n outbound: new CryptoAmount(assetToBase(assetAmount(0)), withdrawParams.asset),\n },\n expiry: new Date(0),\n toAddress: '',\n memo: '',\n estimatedWaitTime: -1,\n slipBasisPoints: -1,\n dustAmount: new CryptoAmount(baseAmount(0), withdrawParams.asset),\n errors,\n }\n }\n\n // Calculate transaction expiry time of the vault address\n const currentDatetime = new Date()\n const minutesToAdd = 15\n const expiryDatetime = new Date(currentDatetime.getTime() + minutesToAdd * 60000)\n\n const estimatedWait = +withdrawQuote.outbound_delay_seconds\n const withdrawAsset = assetFromStringEx(withdrawQuote.fees.asset)\n const estimateWithdrawSaver: EstimateWithdrawSaver = {\n expectedAssetAmount: new CryptoAmount(baseAmount(withdrawQuote.expected_amount_out), withdrawParams.asset),\n fee: {\n affiliate: new CryptoAmount(baseAmount(withdrawQuote.fees.affiliate), withdrawAsset),\n asset: withdrawAsset,\n outbound: new CryptoAmount(baseAmount(withdrawQuote.fees.outbound), withdrawAsset),\n },\n expiry: expiryDatetime,\n toAddress: withdrawQuote.inbound_address,\n memo: withdrawQuote.memo,\n estimatedWaitTime: estimatedWait,\n slipBasisPoints: withdrawQuote.slippage_bps,\n dustAmount: new CryptoAmount(baseAmount(withdrawQuote.dust_amount), withdrawParams.asset),\n errors,\n }\n return estimateWithdrawSaver\n }\n\n /**\n *\n * @param params - getSaver object > asset, addresss, height?\n * @returns - Savers position object\n */\n public async getSaverPosition(params: getSaver): Promise<SaversPosition> {\n const errors: string[] = []\n const inboundDetails = await this.thorchainCache.getInboundDetails()\n const blockData = (await this.thorchainCache.thornode.getLastBlock()).find(\n (item: LastBlock) => item.chain === params.asset.chain,\n )\n const savers = (await this.thorchainCache.thornode.getSavers(`${params.asset.chain}.${params.asset.ticker}`)).find(\n (item) => item.asset_address === params.address,\n )\n\n const pool = (await this.thorchainCache.getPoolForAsset(params.asset)).pool\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 const outboundFee = calcOutboundFee(params.asset, inboundDetails[params.asset.chain])\n const convertToBaseEight = getBaseAmountWithDiffDecimals(outboundFee, 8)\n // For comparison use 1e8 since asset_redeem_value is returned in 1e8\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 const ownerUnits = Number(savers?.units)\n const lastAdded = Number(savers?.last_add_height)\n const saverUnits = Number(pool.saversUnits)\n const assetDepth = Number(pool.saversDepth)\n const redeemableValue = (ownerUnits / saverUnits) * assetDepth\n const depositAmount = new CryptoAmount(baseAmount(savers?.asset_deposit_value), params.asset)\n const redeemableAssetAmount = new CryptoAmount(baseAmount(redeemableValue), params.asset)\n const saversAge = (Number(blockData?.thorchain) - lastAdded) / ((365 * 86400) / 6)\n const saverGrowth = redeemableAssetAmount.minus(depositAmount).div(depositAmount).times(100)\n const saversPos: SaversPosition = {\n depositValue: depositAmount,\n redeemableValue: redeemableAssetAmount,\n lastAddHeight: Number(savers?.last_add_height),\n percentageGrowth: saverGrowth.assetAmount.amount().toNumber(),\n ageInYears: saversAge,\n ageInDays: saversAge * 365,\n errors,\n }\n return saversPos\n }\n\n private async getAddSaversEstimateErrors(addAmount: CryptoAmount): Promise<string[]> {\n const errors = []\n const pools = await this.thorchainCache.getPools()\n const saversPools = Object.values(pools).filter((i) => i.pool.saversDepth !== '0')\n const inboundDetails = await this.thorchainCache.getInboundDetails()\n const saverPool = saversPools.find((i) => assetToString(i.asset) === assetToString(addAmount.asset))\n if (!saverPool) errors.push(` ${assetToString(addAmount.asset)} does not have a saver's pool`)\n if (inboundDetails[addAmount.asset.chain].haltedChain) errors.push(`${addAmount.asset.chain} is halted, cannot add`)\n const pool = (await this.thorchainCache.getPoolForAsset(addAmount.asset)).pool\n if (pool.status.toLowerCase() !== 'available')\n errors.push(`Pool is not available for this asset ${assetToString(addAmount.asset)}`)\n const inboundFee = calcNetworkFee(addAmount.asset, inboundDetails[addAmount.asset.chain])\n if (addAmount.lte(inboundFee)) errors.push(`Add amount does not cover fees`)\n return errors\n }\n}\n","import { Saver, TxDetailsResponse, TxSignersResponse } from '@xchainjs/xchain-thornode'\nimport { Asset, Chain, assetFromStringEx, baseAmount } from '@xchainjs/xchain-util'\n\nimport { DefaultChainAttributes } from './chain-defaults'\nimport { CryptoAmount } from './crypto-amount'\nimport { ThorchainCache } from './thorchain-cache'\nimport { ChainAttributes } from './types'\nimport { AssetRuneNative, THORChain, isAssetRuneNative } from './utils'\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}\nexport enum InboundStatus {\n Observed_Consensus = 'Observed_Consensus',\n Observed_Incomplete = 'Observed_Incomplete',\n Unknown = 'Unknown',\n}\nexport enum SwapStatus {\n Complete = 'Complete',\n Complete_Refunded = 'Complete_Refunded',\n Complete_Below_Dust = 'Complete_Below_Dust',\n Incomplete = 'Incomplete',\n}\nexport enum AddLpStatus {\n Complete = 'Complete',\n Complete_Refunded = 'Complete_Refunded',\n Complete_Below_Dust = 'Complete_Below_Dust',\n Incomplete = 'Incomplete',\n}\nexport enum WithdrawStatus {\n Complete = 'Complete',\n Incomplete = 'Incomplete',\n Complete_Refunded = 'Complete_Refunded',\n}\nexport enum RefundStatus {\n Complete = 'Complete',\n Incomplete = 'Incomplete',\n Complete_Refunded = 'Complete_Refunded',\n}\nexport enum AddSaverStatus {\n Complete = 'Complete',\n Complete_Refunded = 'Complete_Refunded',\n Complete_Below_Dust = 'Complete_Below_Dust',\n Incomplete = 'Incomplete',\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}\nexport type AddLpInfo = {\n status: AddLpStatus\n isSymmetric: boolean\n assetTx?: InboundTx\n runeTx?: InboundTx\n assetConfirmationDate?: Date\n pool: Asset\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}\nexport type WithdrawInfo = {\n status: WithdrawStatus\n withdrawalAmount: CryptoAmount\n expectedConfirmationDate: Date\n thorchainHeight: number\n outboundHeight: number\n estimatedWaitTime: number\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\nexport type AddSaverInfo = {\n status: AddSaverStatus\n assetTx?: InboundTx\n saverPos?: Saver\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}\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\nexport class TransactionStage {\n readonly thorchainCache: ThorchainCache\n private chainAttributes: Record<Chain, ChainAttributes>\n\n constructor(thorchainCache: ThorchainCache, chainAttributes = DefaultChainAttributes) {\n this.thorchainCache = thorchainCache\n this.chainAttributes = chainAttributes\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 private async checkSwapProgress(txData: TxDetailsResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n const memo = txData.tx.tx.memo ?? ''\n const memoFields = this.parseSwapMemo(memo)\n const assetOut = assetFromStringEx(memoFields.asset.toUpperCase())\n //const assetIn = assetFromStringEx(txData.tx.tx.coins?.[0].asset)\n const swapStatus = txData.out_txs[0].memo?.match('OUT') ? SwapStatus.Complete : SwapStatus.Complete_Refunded\n // current height of thorchain, neeed for confirmations\n const chainHeight = await this.blockHeight(AssetRuneNative)\n\n // expected outbound height\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 const confirmations = chainHeight > outboundHeight ? chainHeight - outboundHeight : 0\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 // TODO get out tx\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 progress.swapInfo = swapInfo\n }\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 private async getCryptoAmount(baseAmt: string, asset: Asset): Promise<CryptoAmount> {\n const decimals =\n THORChain === asset.chain ? 8 : Number((await this.thorchainCache.getPoolForAsset(asset)).pool.nativeDecimal)\n return new CryptoAmount(baseAmount(baseAmt, decimals), asset)\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.tx.block_height)\n\n const finalizeBlock =\n txData.tx.tx.chain == THORChain ? Number(txData.finalised_height) : Number(txData.tx.finalise_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 private async checkAddLpProgress(txData: TxSignersResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n const memo = txData.tx.tx.memo ?? ''\n const memoFields = this.parseAddLpMemo(memo)\n const asset = assetFromStringEx(memoFields.asset)\n const isSymmetric = memoFields.pairedAddress ? true : false\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 private async checkWithdrawLpProgress(txData: TxSignersResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n const memo = txData.tx.tx.memo ?? ''\n const memoFields = this.parseWithdrawLpMemo(memo)\n const asset = assetFromStringEx(memoFields.asset)\n\n const lastBlockObj = await this.thorchainCache.thornode.getLastBlock()\n const currentHeight = lastBlockObj.find((obj) => obj)\n\n // find the date in which the asset should be seen in the wallet\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 // if the TC has process the block that the outbound tx was assigned to then its completed.\n const status = txData.tx.status === 'done' ? WithdrawStatus.Complete : WithdrawStatus.Incomplete\n\n const outAmount =\n status === WithdrawStatus.Complete ? JSON.stringify(txData.out_txs).split(`\"amount\":\"`)[1].split(`\"`) : ''\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 const withdrawalAmount = await this.getCryptoAmount(outAmount[0], asset)\n\n const withdrawLpInfo: WithdrawInfo = {\n status,\n withdrawalAmount,\n expectedConfirmationDate,\n thorchainHeight: currentTCHeight,\n outboundHeight: outboundBlock,\n estimatedWaitTime,\n }\n progress.withdrawLpInfo = withdrawLpInfo\n }\n }\n\n private async checkAddSaverProgress(txData: TxSignersResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n const assetTx = !isAssetRuneNative(progress.inboundObserved.amount.asset) ? progress.inboundObserved : undefined\n\n const checkSaverVaults = await this.thorchainCache.thornode.getSaver(\n txData.tx.tx.coins[0].asset,\n `${assetTx?.fromAddress}`,\n )\n const status = checkSaverVaults ? AddSaverStatus.Complete : AddSaverStatus.Incomplete\n const addSaverInfo: AddSaverInfo = {\n status: status,\n assetTx,\n saverPos: checkSaverVaults,\n }\n progress.addSaverInfo = addSaverInfo\n }\n }\n\n private async checkWithdrawSaverProgress(txData: TxSignersResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n const memo = txData.tx.tx.memo ?? ''\n const memoFields = this.parseWithdrawLpMemo(memo)\n const asset = assetFromStringEx(memoFields.asset)\n\n const lastBlockObj = await this.thorchainCache.thornode.getLastBlock()\n const currentHeight = lastBlockObj.find((obj) => obj)\n\n // find the date in which the asset should be seen in the wallet\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 const outAmount = txData.out_txs ? JSON.stringify(txData.out_txs).split(`\"amount\":\"`)[1].split(`\"`) : ''\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 // if the TC has process the block that the outbound tx was assigned to then its completed.\n const status = txData.out_txs ? WithdrawStatus.Complete : WithdrawStatus.Incomplete\n\n const withdrawalAmount = await this.getCryptoAmount(outAmount[0], asset)\n const withdrawSaverInfo: WithdrawSaverInfo = {\n status,\n withdrawalAmount,\n expectedConfirmationDate,\n thorchainHeight: currentTCHeight,\n finalisedHeight,\n outboundBlock,\n estimatedWaitTime,\n }\n progress.withdrawSaverInfo = withdrawSaverInfo\n }\n }\n\n private async checkRefund(txData: TxSignersResponse, progress: TXProgress) {\n if (progress.inboundObserved) {\n const lastBlockObj = await this.thorchainCache.thornode.getLastBlock()\n // find the date in which the asset should be seen in the wallet\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 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 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 private parseAddLpMemo(memo: string) {\n //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 private parseWithdrawLpMemo(memo: string) {\n //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 * Private function to return the date stamp from block height and chain\n * @param chain - input chain\n * @param txData - txResponse\n * @returns date()\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.tx.block_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 current block height of an asset's native chain\n * @param chain\n * @returns\n */\n private async blockHeight(asset: Asset) {\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 || asset.synth) {\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":["Configuration"],"mappings":"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"}