{"version":3,"file":"quote.mjs","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport {\n  convertHexToDecimal,\n  toHex,\n  weiHexToGweiDec,\n} from '@metamask/controller-utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport type {\n  BridgeAsset,\n  ExchangeRate,\n  GenericQuoteRequest,\n  L1GasFees,\n  Quote,\n  QuoteMetadata,\n  QuoteResponseV1,\n  NonEvmFees,\n  TxData,\n} from '../types';\nimport { FeatureId } from '../types';\nimport { isNativeAddress, isNonEvmChainId } from './bridge';\n\nexport const isValidQuoteRequest = (\n  partialRequest: Partial<GenericQuoteRequest>,\n  requireAmount = true,\n): partialRequest is GenericQuoteRequest => {\n  const stringFields = [\n    'srcTokenAddress',\n    'destTokenAddress',\n    'srcChainId',\n    'destChainId',\n    'walletAddress',\n  ];\n  if (requireAmount) {\n    stringFields.push('srcTokenAmount');\n  }\n  // If bridging between different chain types or different non-EVM chains, require dest wallet address\n  // Cases that need destWalletAddress:\n  // 1. EVM -> non-EVM\n  // 2. non-EVM -> EVM\n  // 3. non-EVM -> different non-EVM (e.g., SOL -> BTC)\n  // Only same-chain swaps don't need destWalletAddress\n  if (\n    partialRequest.destChainId &&\n    partialRequest.srcChainId &&\n    partialRequest.destChainId !== partialRequest.srcChainId && // Different chains\n    (isNonEvmChainId(partialRequest.destChainId) ||\n      isNonEvmChainId(partialRequest.srcChainId)) // At least one is non-EVM\n  ) {\n    stringFields.push('destWalletAddress');\n    if (!partialRequest.destWalletAddress) {\n      return false;\n    }\n  }\n  const numberFields = [];\n  // if slippage is defined, require it to be a number\n  if (partialRequest.slippage !== undefined) {\n    numberFields.push('slippage');\n  }\n\n  return (\n    stringFields.every(\n      (field) =>\n        field in partialRequest &&\n        typeof partialRequest[field as keyof typeof partialRequest] ===\n          'string' &&\n        partialRequest[field as keyof typeof partialRequest] !== undefined &&\n        partialRequest[field as keyof typeof partialRequest] !== '' &&\n        partialRequest[field as keyof typeof partialRequest] !== null,\n    ) &&\n    numberFields.every(\n      (field) =>\n        field in partialRequest &&\n        typeof partialRequest[field as keyof typeof partialRequest] ===\n          'number' &&\n        partialRequest[field as keyof typeof partialRequest] !== undefined &&\n        !isNaN(Number(partialRequest[field as keyof typeof partialRequest])) &&\n        partialRequest[field as keyof typeof partialRequest] !== null,\n    ) &&\n    (requireAmount\n      ? Boolean((partialRequest.srcTokenAmount ?? '').match(/^[1-9]\\d*$/u))\n      : true)\n  );\n};\n\nexport const isValidBatchSellQuoteRequest = (\n  quoteRequests: Partial<GenericQuoteRequest>[],\n  requireAmount = true,\n): quoteRequests is GenericQuoteRequest[] =>\n  quoteRequests.every((req) => isValidQuoteRequest(req, requireAmount));\n\n/**\n * Generates a pseudo-unique string that identifies each quote by aggregator, bridge, and steps\n *\n * @param quote - The quote to generate an identifier for\n * @returns A pseudo-unique string that identifies the quote\n */\nexport const getQuoteIdentifier = (quote: QuoteResponseV1['quote']) =>\n  `${quote.bridgeId}-${quote.bridges[0]}-${quote.steps.length}`;\n\nconst calcTokenAmount = (value: string | BigNumber, decimals: number) => {\n  const divisor = new BigNumber(10).pow(decimals ?? 0);\n  return new BigNumber(value).div(divisor);\n};\n\nexport const calcNonEvmTotalNetworkFee = (\n  bridgeQuote: QuoteResponseV1 & NonEvmFees,\n  { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n  const { nonEvmFeesInNative } = bridgeQuote;\n  // Fees are now stored directly in native units (SOL, BTC) without conversion\n  const feeInNative = new BigNumber(nonEvmFeesInNative ?? '0');\n\n  return {\n    amount: feeInNative.toString(),\n    valueInCurrency: exchangeRate\n      ? feeInNative.times(exchangeRate).toString()\n      : null,\n    usd: usdExchangeRate ? feeInNative.times(usdExchangeRate).toString() : null,\n  };\n};\n\nexport const calcToAmount = (\n  destTokenAmount: string,\n  destAsset: BridgeAsset,\n  { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n  const normalizedDestAmount = calcTokenAmount(\n    destTokenAmount,\n    destAsset.decimals,\n  );\n  return {\n    amount: normalizedDestAmount.toString(),\n    valueInCurrency: exchangeRate\n      ? normalizedDestAmount.times(exchangeRate).toString()\n      : null,\n    usd: usdExchangeRate\n      ? normalizedDestAmount.times(usdExchangeRate).toString()\n      : null,\n  };\n};\n\nexport const calcSentAmount = (\n  { srcTokenAmount, srcAsset, feeData, intent }: Quote,\n  { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n  // For intent-based swaps (e.g. CoW Protocol), srcTokenAmount is the total\n  // fixed commitment the user makes to the protocol — the protocol fee is\n  // already baked in. Adding feeData fees on top would double-count them.\n  // For conventional swaps, srcTokenAmount is the net routing amount (fees\n  // excluded), so the src-token fees must be added to get the wallet deduction.\n  const sentAmount = intent\n    ? new BigNumber(srcTokenAmount)\n    : Object.values(feeData)\n        .filter(\n          (fee) => fee && fee.amount && fee.asset?.assetId === srcAsset.assetId,\n        )\n        .reduce(\n          (acc, { amount }) => acc.plus(amount),\n          new BigNumber(srcTokenAmount),\n        );\n  const normalizedSentAmount = calcTokenAmount(sentAmount, srcAsset.decimals);\n  return {\n    amount: normalizedSentAmount.toString(),\n    valueInCurrency: exchangeRate\n      ? normalizedSentAmount.times(exchangeRate).toString()\n      : null,\n    usd: usdExchangeRate\n      ? normalizedSentAmount.times(usdExchangeRate).toString()\n      : null,\n  };\n};\n\nexport const calcBatchFees = (\n  amount: string,\n  asset: BridgeAsset,\n  { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n  const normalizedAmount = calcTokenAmount(amount, asset.decimals);\n\n  return {\n    amount: normalizedAmount.toString(),\n    valueInCurrency: exchangeRate\n      ? normalizedAmount.times(exchangeRate).toString()\n      : null,\n    usd: usdExchangeRate\n      ? normalizedAmount.times(usdExchangeRate).toString()\n      : null,\n    asset,\n  };\n};\n\nexport const calcRelayerFee = (\n  quoteResponse: QuoteResponseV1<TxData, TxData>,\n  { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n  const { quote, trade } = quoteResponse;\n  const relayerFeeAmount = new BigNumber(\n    convertHexToDecimal(trade.value || '0x0'),\n  );\n  let relayerFeeInNative = calcTokenAmount(relayerFeeAmount, 18);\n\n  // Subtract srcAmount and other fees from trade value if srcAsset is native\n  if (isNativeAddress(quote.srcAsset.address)) {\n    const sentAmountInNative = calcSentAmount(quote, {\n      exchangeRate,\n      usdExchangeRate,\n    }).amount;\n    relayerFeeInNative = relayerFeeInNative.minus(sentAmountInNative);\n  }\n\n  return {\n    amount: relayerFeeInNative,\n    valueInCurrency: exchangeRate\n      ? relayerFeeInNative.times(exchangeRate)\n      : null,\n    usd: usdExchangeRate ? relayerFeeInNative.times(usdExchangeRate) : null,\n  };\n};\n\nconst calcTotalGasFee = ({\n  approvalGasLimit,\n  resetApprovalGasLimit,\n  tradeGasLimit,\n  l1GasFeesInHexWei,\n  feePerGasInDecGwei,\n  nativeToDisplayCurrencyExchangeRate,\n  nativeToUsdExchangeRate,\n}: {\n  approvalGasLimit?: number | null;\n  resetApprovalGasLimit?: number | null;\n  tradeGasLimit?: number | null;\n  l1GasFeesInHexWei?: string | null;\n  feePerGasInDecGwei?: string;\n  nativeToDisplayCurrencyExchangeRate?: string;\n  nativeToUsdExchangeRate?: string;\n}) => {\n  const totalGasLimitInDec = new BigNumber(tradeGasLimit?.toString() ?? '0')\n    .plus(approvalGasLimit?.toString() ?? '0')\n    .plus(resetApprovalGasLimit?.toString() ?? '0');\n\n  const l1GasFeesInDecGWei = weiHexToGweiDec(toHex(l1GasFeesInHexWei ?? '0'));\n  const gasFeesInDecGwei = totalGasLimitInDec\n    .times(feePerGasInDecGwei ?? '0')\n    .plus(l1GasFeesInDecGWei);\n  const gasFeesInDecEth = gasFeesInDecGwei.times(new BigNumber(10).pow(-9));\n\n  const gasFeesInDisplayCurrency = nativeToDisplayCurrencyExchangeRate\n    ? gasFeesInDecEth.times(nativeToDisplayCurrencyExchangeRate.toString())\n    : null;\n  const gasFeesInUSD = nativeToUsdExchangeRate\n    ? gasFeesInDecEth.times(nativeToUsdExchangeRate.toString())\n    : null;\n\n  return {\n    amount: gasFeesInDecEth.toString(),\n    valueInCurrency: gasFeesInDisplayCurrency?.toString() ?? null,\n    usd: gasFeesInUSD?.toString() ?? null,\n  };\n};\n\nexport const calcEstimatedAndMaxTotalGasFee = ({\n  bridgeQuote: { approval, trade, l1GasFeesInHexWei, resetApproval },\n  feePerGasInDecGwei,\n  maxFeePerGasInDecGwei,\n  exchangeRate: nativeToDisplayCurrencyExchangeRate,\n  usdExchangeRate: nativeToUsdExchangeRate,\n}: {\n  bridgeQuote: QuoteResponseV1<TxData, TxData> & L1GasFees;\n  maxFeePerGasInDecGwei?: string;\n  feePerGasInDecGwei?: string;\n} & ExchangeRate): QuoteMetadata['gasFee'] => {\n  // Estimated gas fees spent after receiving refunds, this is shown to the user\n  const {\n    amount: amountEffective,\n    valueInCurrency: valueInCurrencyEffective,\n    usd: usdEffective,\n  } = calcTotalGasFee({\n    // Fallback to gasLimit if effectiveGas is not available\n    approvalGasLimit: approval?.effectiveGas ?? approval?.gasLimit,\n    resetApprovalGasLimit:\n      resetApproval?.effectiveGas ?? resetApproval?.gasLimit,\n    tradeGasLimit: trade?.effectiveGas ?? trade?.gasLimit,\n    l1GasFeesInHexWei,\n    feePerGasInDecGwei,\n    nativeToDisplayCurrencyExchangeRate,\n    nativeToUsdExchangeRate,\n  });\n\n  // Estimated total gas fee, including refunded fees (medium)\n  const { amount, valueInCurrency, usd } = calcTotalGasFee({\n    approvalGasLimit: approval?.gasLimit,\n    resetApprovalGasLimit: resetApproval?.gasLimit,\n    tradeGasLimit: trade?.gasLimit,\n    l1GasFeesInHexWei,\n    feePerGasInDecGwei,\n    nativeToDisplayCurrencyExchangeRate,\n    nativeToUsdExchangeRate,\n  });\n\n  // Max gas fee (high), used to disable submission of the transaction\n  const {\n    amount: amountMax,\n    valueInCurrency: valueInCurrencyMax,\n    usd: usdMax,\n  } = calcTotalGasFee({\n    approvalGasLimit: approval?.gasLimit,\n    resetApprovalGasLimit: resetApproval?.gasLimit,\n    tradeGasLimit: trade?.gasLimit,\n    l1GasFeesInHexWei,\n    feePerGasInDecGwei: maxFeePerGasInDecGwei,\n    nativeToDisplayCurrencyExchangeRate,\n    nativeToUsdExchangeRate,\n  });\n\n  return {\n    effective: {\n      amount: amountEffective,\n      valueInCurrency: valueInCurrencyEffective,\n      usd: usdEffective,\n    },\n    total: {\n      amount,\n      valueInCurrency,\n      usd,\n    },\n    max: {\n      amount: amountMax,\n      valueInCurrency: valueInCurrencyMax,\n      usd: usdMax,\n    },\n  };\n};\n\n/**\n * Calculates the total estimated network fees for the bridge transaction\n *\n * @param gasFee - The gas fee for the bridge transaction\n * @param gasFee.total - The fee to display to the user. If not available, this is equal to the gasLimit (total)\n * @param relayerFee - The relayer fee paid to bridge providers\n * @returns The total estimated network fee for the bridge transaction, including the relayer fee paid to bridge providers\n */\nexport const calcTotalEstimatedNetworkFee = (\n  { total: gasFeeToDisplay }: ReturnType<typeof calcEstimatedAndMaxTotalGasFee>,\n  relayerFee: ReturnType<typeof calcRelayerFee>,\n) => {\n  return {\n    amount: new BigNumber(gasFeeToDisplay?.amount ?? '0')\n      .plus(relayerFee.amount)\n      .toString(),\n    valueInCurrency: gasFeeToDisplay?.valueInCurrency\n      ? new BigNumber(gasFeeToDisplay.valueInCurrency)\n          .plus(relayerFee.valueInCurrency ?? '0')\n          .toString()\n      : null,\n    usd: gasFeeToDisplay?.usd\n      ? new BigNumber(gasFeeToDisplay.usd)\n          .plus(relayerFee.usd ?? '0')\n          .toString()\n      : null,\n  };\n};\n\nexport const calcTotalMaxNetworkFee = (\n  gasFee: ReturnType<typeof calcEstimatedAndMaxTotalGasFee>,\n  relayerFee: ReturnType<typeof calcRelayerFee>,\n) => {\n  return {\n    amount: new BigNumber(gasFee.max.amount).plus(relayerFee.amount).toString(),\n    valueInCurrency: gasFee.max.valueInCurrency\n      ? new BigNumber(gasFee.max.valueInCurrency)\n          .plus(relayerFee.valueInCurrency ?? '0')\n          .toString()\n      : null,\n    usd: gasFee.max.usd\n      ? new BigNumber(gasFee.max.usd).plus(relayerFee.usd ?? '0').toString()\n      : null,\n  };\n};\n\n// Gas is included for some swap quotes and this is the value displayed in the client\nexport const calcIncludedTxFees = (\n  { gasIncluded, gasIncluded7702, srcAsset, feeData: { txFee } }: Quote,\n  srcTokenExchangeRate: ExchangeRate,\n  destTokenExchangeRate: ExchangeRate,\n) => {\n  if (!txFee || !(gasIncluded || gasIncluded7702)) {\n    return null;\n  }\n  // Use exchange rate of the token that is being used to pay for the transaction\n  const { exchangeRate, usdExchangeRate } =\n    txFee.asset.assetId === srcAsset.assetId\n      ? srcTokenExchangeRate\n      : destTokenExchangeRate;\n  const normalizedTxFeeAmount = calcTokenAmount(\n    txFee.amount,\n    txFee.asset.decimals,\n  );\n\n  return {\n    amount: normalizedTxFeeAmount.toString(),\n    valueInCurrency: exchangeRate\n      ? normalizedTxFeeAmount.times(exchangeRate).toString()\n      : null,\n    usd: usdExchangeRate\n      ? normalizedTxFeeAmount.times(usdExchangeRate).toString()\n      : null,\n  };\n};\n\nexport const calcAdjustedReturn = (\n  toTokenAmount: ReturnType<typeof calcToAmount>,\n  totalEstimatedNetworkFee: ReturnType<typeof calcTotalEstimatedNetworkFee>,\n  { feeData: { txFee }, destAsset: { assetId: destAssetId } }: Quote,\n) => {\n  // If gas is included and is taken from the dest token, don't subtract network fee from return\n  if (txFee?.asset?.assetId === destAssetId) {\n    return {\n      valueInCurrency: toTokenAmount.valueInCurrency,\n      usd: toTokenAmount.usd,\n    };\n  }\n  return {\n    valueInCurrency:\n      toTokenAmount.valueInCurrency && totalEstimatedNetworkFee.valueInCurrency\n        ? new BigNumber(toTokenAmount.valueInCurrency)\n            .minus(totalEstimatedNetworkFee.valueInCurrency)\n            .toString()\n        : null,\n    usd:\n      toTokenAmount.usd && totalEstimatedNetworkFee.usd\n        ? new BigNumber(toTokenAmount.usd)\n            .minus(totalEstimatedNetworkFee.usd)\n            .toString()\n        : null,\n  };\n};\n\nexport const calcSwapRate = (sentAmount: string, destTokenAmount: string) =>\n  new BigNumber(destTokenAmount).div(sentAmount).toString();\n\nexport const calcCost = (\n  adjustedReturn: ReturnType<typeof calcAdjustedReturn>,\n  sentAmount: ReturnType<typeof calcSentAmount>,\n) => ({\n  valueInCurrency:\n    adjustedReturn.valueInCurrency && sentAmount.valueInCurrency\n      ? new BigNumber(sentAmount.valueInCurrency)\n          .minus(adjustedReturn.valueInCurrency)\n          .toString()\n      : null,\n  usd:\n    adjustedReturn.usd && sentAmount.usd\n      ? new BigNumber(sentAmount.usd).minus(adjustedReturn.usd).toString()\n      : null,\n});\n\n/**\n * Calculates the slippage absolute value percentage based on the adjusted return and sent amount.\n *\n * @param adjustedReturn - Adjusted return value\n * @param sentAmount - Sent amount value\n * @returns the slippage in percentage\n */\nexport const calcSlippagePercentage = (\n  adjustedReturn: ReturnType<typeof calcAdjustedReturn>,\n  sentAmount: ReturnType<typeof calcSentAmount>,\n): string | null => {\n  const cost = calcCost(adjustedReturn, sentAmount);\n\n  if (cost.valueInCurrency && sentAmount.valueInCurrency) {\n    return new BigNumber(cost.valueInCurrency)\n      .div(sentAmount.valueInCurrency)\n      .times(100)\n      .abs()\n      .toString();\n  }\n\n  if (cost.usd && sentAmount.usd) {\n    return new BigNumber(cost.usd)\n      .div(sentAmount.usd)\n      .times(100)\n      .abs()\n      .toString();\n  }\n\n  return null;\n};\n\nexport const formatEtaInMinutes = (\n  estimatedProcessingTimeInSeconds: number,\n) => {\n  if (estimatedProcessingTimeInSeconds < 60) {\n    return `< 1`;\n  }\n  return (estimatedProcessingTimeInSeconds / 60).toFixed();\n};\n\nexport const sortQuotes = (\n  quotes: QuoteResponseV1[],\n  featureId: FeatureId | null,\n) => {\n  // Sort perps quotes by increasing estimated processing time (fastest first)\n  if (featureId === FeatureId.PERPS) {\n    return quotes.sort((a, b) => {\n      return (\n        a.estimatedProcessingTimeInSeconds - b.estimatedProcessingTimeInSeconds\n      );\n    });\n  }\n  return quotes;\n};\n"]}