{"version":3,"file":"bridge-quotes.cjs","sourceRoot":"","sources":["../../../src/strategy/bridge/bridge-quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n  FeatureId,\n  type GenericQuoteRequest,\n} from '@metamask/bridge-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport type { QuoteResponse } from '@metamask/bridge-controller';\nimport { toChecksumHexAddress, toHex } from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type { BatchTransaction } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { orderBy } from 'lodash';\n\nimport type {\n  BridgeFeatureFlags,\n  TransactionPayBridgeQuote,\n  BridgeQuoteRequest,\n} from './types';\nimport { TransactionPayStrategy } from '../..';\nimport { projectLogger } from '../../logger';\nimport type {\n  FiatRates,\n  FiatValue,\n  PayStrategyGetBatchRequest,\n  PayStrategyGetQuotesRequest,\n  PayStrategyGetRefreshIntervalRequest,\n  QuoteRequest,\n  TransactionPayControllerMessenger,\n  TransactionPayQuote,\n} from '../../types';\nimport { calculateGasCost, getGasFee } from '../../utils/gas';\nimport { getTokenFiatRate } from '../../utils/token';\n\nconst ERROR_MESSAGE_NO_QUOTES = 'No quotes found';\nconst ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM = 'All quotes under minimum';\nconst ATTEMPTS_MAX_DEFAULT = 5;\nconst BUFFER_INITIAL_DEFAULT = 0.04;\nconst BUFFER_STEP_DEFAULT = 0.04;\nconst BUFFER_SUBSEQUENT_DEFAULT = 0.05;\nconst SLIPPAGE_DEFAULT = 0.005;\n\nconst FEATURE_ID_BY_TRANSACTION_TYPE = new Map<TransactionType, FeatureId>([\n  [TransactionType.perpsDeposit, FeatureId.PERPS],\n]);\n\nconst log = createModuleLogger(projectLogger, 'bridge-strategy');\n\n/**\n * Fetch bridge quotes for multiple requests.\n *\n * @param request - Request object.\n * @returns An array of bridge quotes.\n */\nexport async function getBridgeQuotes(\n  request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<TransactionPayBridgeQuote>[]> {\n  log('Fetching quotes', request);\n\n  const { requests, messenger, transaction } = request;\n\n  const finalRequests = getFinalRequests(requests, messenger);\n\n  const quotes = await Promise.all(\n    finalRequests.map((r, index) =>\n      getSufficientSingleBridgeQuote(r, index, request),\n    ),\n  );\n\n  return quotes.map((quote, index) =>\n    normalizeQuote(quote, finalRequests[index], messenger, transaction),\n  );\n}\n\n/**\n * Get bridge batch transactions if needed by the quotes.\n *\n * @param request - Request object.\n * @returns Array of batch transactions.\n */\nexport async function getBridgeBatchTransactions(\n  request: PayStrategyGetBatchRequest<TransactionPayBridgeQuote>,\n): Promise<BatchTransaction[]> {\n  const { quotes } = request;\n  const firstQuote = quotes[0]?.original?.quote;\n\n  if (firstQuote?.srcChainId !== firstQuote?.destChainId) {\n    log('No batch transactions needed for bridge quotes');\n    return [];\n  }\n\n  return quotes\n    .map((q) => q.original)\n    .flatMap((quote) => {\n      const result = [];\n\n      if (quote.approval) {\n        result.push({\n          ...getBatchTransaction(quote.approval),\n          type: TransactionType.swapApproval,\n        });\n      }\n\n      result.push({\n        ...getBatchTransaction(quote.trade as TxData),\n        type: TransactionType.swap,\n      });\n\n      return result;\n    });\n}\n\n/**\n * Get the refresh interval for bridge quotes.\n *\n * @param request - Request object.\n * @returns Refresh interval in milliseconds.\n */\nexport function getBridgeRefreshInterval(\n  request: PayStrategyGetRefreshIntervalRequest,\n): number | undefined {\n  const { chainId, messenger } = request;\n\n  const bridgeFeatureFlags = messenger.call(\n    'RemoteFeatureFlagController:getState',\n  ).remoteFeatureFlags.bridgeConfigV2 as BridgeFeatureFlags | undefined;\n\n  const chainInterval =\n    bridgeFeatureFlags?.chains?.[parseInt(chainId, 16)]?.refreshRate;\n\n  const globalInterval = bridgeFeatureFlags?.refreshRate;\n\n  return chainInterval ?? globalInterval;\n}\n\n/**\n * Get a fresh quote for a previously fetched bridge quote to avoid expiration.\n *\n * @param quote  - Original quote.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Fresh quote response.\n */\nexport async function refreshQuote(\n  quote: TransactionPayQuote<TransactionPayBridgeQuote>,\n  messenger: TransactionPayControllerMessenger,\n  transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n  const newQuote = await getSingleBridgeQuote(\n    { ...quote.original.request, attemptsMax: 1 },\n    messenger,\n    transaction,\n  );\n\n  log('Refreshed quote', { old: quote, new: newQuote });\n\n  return newQuote;\n}\n\n/**\n * Convert a quote trade or approval to a batch transaction.\n *\n * @param transaction - Quote trade or approval.\n * @returns Batch transaction.\n */\nfunction getBatchTransaction(transaction: TxData): BatchTransaction {\n  const data = transaction.data as Hex;\n  const gas = transaction.gasLimit ? toHex(transaction.gasLimit) : undefined;\n  const to = transaction.to as Hex;\n  const value = transaction.value as Hex;\n\n  return {\n    data,\n    gas,\n    isAfter: false,\n    to,\n    value,\n  };\n}\n\n/**\n * Retry fetching a single bridge quote until it meets the minimum target amount.\n *\n * @param quoteRequest - Original quote request.\n * @param index - Index of the request in the array.\n * @param request - Full quotes request.\n * @returns The sufficient bridge quote.\n */\nasync function getSufficientSingleBridgeQuote(\n  quoteRequest: BridgeQuoteRequest,\n  index: number,\n  request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayBridgeQuote> {\n  const {\n    attemptsMax,\n    bufferInitial,\n    bufferStep,\n    bufferSubsequent,\n    sourceBalanceRaw,\n    sourceTokenAmount,\n    targetAmountMinimum,\n    targetTokenAddress,\n  } = quoteRequest;\n\n  const sourceAmountValue = new BigNumber(sourceTokenAmount);\n  const buffer = index === 0 ? bufferInitial : bufferSubsequent;\n  const originalSourceAmount = sourceAmountValue.div(1 + buffer);\n  const start = Date.now();\n\n  let currentSourceAmount = sourceTokenAmount;\n\n  for (let i = 0; i < attemptsMax; i++) {\n    const currentRequest = {\n      ...quoteRequest,\n      sourceTokenAmount: currentSourceAmount,\n    };\n\n    try {\n      log('Attempt', {\n        attempt: i + 1,\n        attemptsMax,\n        bufferInitial,\n        bufferStep,\n        currentSourceAmount,\n        target: targetTokenAddress,\n      });\n\n      const result = await getSingleBridgeQuote(\n        currentRequest,\n        request.messenger,\n        request.transaction,\n      );\n\n      const dust = new BigNumber(result.quote.minDestTokenAmount)\n        .minus(targetAmountMinimum)\n        .toString(10);\n\n      log('Found valid quote', {\n        attempt: i + 1,\n        target: targetTokenAddress,\n        targetAmount: result.quote.minDestTokenAmount,\n        goalAmount: targetAmountMinimum,\n        dust,\n        quote: result,\n      });\n\n      return {\n        ...result,\n        metrics: {\n          attempts: i + 1,\n          buffer: buffer + bufferStep * i,\n          latency: Date.now() - start,\n        },\n      };\n    } catch (error) {\n      const errorMessage = (error as { message: string }).message;\n\n      if (errorMessage !== ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM) {\n        throw error;\n      }\n    }\n\n    if (\n      new BigNumber(currentSourceAmount).isGreaterThanOrEqualTo(\n        sourceBalanceRaw,\n      )\n    ) {\n      log('Reached balance limit', targetTokenAddress);\n      break;\n    }\n\n    const newSourceAmount = originalSourceAmount.multipliedBy(\n      1 + buffer + bufferStep * (i + 1),\n    );\n\n    currentSourceAmount = newSourceAmount.isLessThan(sourceBalanceRaw)\n      ? newSourceAmount.toFixed(0)\n      : sourceBalanceRaw;\n  }\n\n  log('All attempts failed', targetTokenAddress);\n\n  throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n}\n\n/**\n * Fetch a single bridge quote.\n *\n * @param quoteRequest - Quote request parameters.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns The bridge quote.\n */\nasync function getSingleBridgeQuote(\n  quoteRequest: BridgeQuoteRequest,\n  messenger: TransactionPayControllerMessenger,\n  transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n  const {\n    from,\n    slippage,\n    sourceChainId,\n    sourceTokenAddress,\n    sourceTokenAmount,\n    targetChainId,\n    targetTokenAddress,\n  } = quoteRequest;\n\n  const { type } = transaction;\n  const featureId = FEATURE_ID_BY_TRANSACTION_TYPE.get(type as TransactionType);\n\n  const bridgeRequest: GenericQuoteRequest = {\n    destChainId: targetChainId,\n    destTokenAddress: toChecksumHexAddress(targetTokenAddress),\n    destWalletAddress: from,\n    gasIncluded: false,\n    gasIncluded7702: false,\n    insufficientBal: false,\n    slippage: slippage * 100,\n    srcChainId: sourceChainId,\n    srcTokenAddress: toChecksumHexAddress(sourceTokenAddress),\n    srcTokenAmount: sourceTokenAmount,\n    walletAddress: from,\n  };\n\n  const quotes = await messenger.call(\n    'BridgeController:fetchQuotes',\n    bridgeRequest,\n    undefined,\n    featureId,\n  );\n\n  if (!quotes.length) {\n    throw new Error(ERROR_MESSAGE_NO_QUOTES);\n  }\n\n  const result = getBestQuote(quotes, quoteRequest);\n\n  return {\n    ...result,\n    request: quoteRequest,\n  };\n}\n\n/**\n * Select the best quote from a list of quotes.\n *\n * @param quotes - List of quotes.\n * @param request - Original quote request.\n * @returns The best quote.\n */\nfunction getBestQuote(\n  quotes: QuoteResponse[],\n  request: BridgeQuoteRequest,\n): QuoteResponse {\n  const fastestQuotes = orderBy(\n    quotes,\n    (quote) => quote.estimatedProcessingTimeInSeconds,\n    'asc',\n  ).slice(0, 3);\n\n  const quotesOverMinimumTarget = fastestQuotes.filter((quote) =>\n    new BigNumber(quote.quote.minDestTokenAmount).isGreaterThanOrEqualTo(\n      request.targetAmountMinimum,\n    ),\n  );\n\n  log('Finding best quote', {\n    allQuotes: quotes,\n    fastestQuotes,\n    quotesOverMinimumTarget,\n  });\n\n  if (!quotesOverMinimumTarget.length) {\n    throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n  }\n\n  const cheapestQuote = orderBy(\n    quotesOverMinimumTarget,\n    (quote) => BigNumber(quote.quote.minDestTokenAmount).toNumber(),\n    'desc',\n  )[0];\n\n  return cheapestQuote;\n}\n\n/**\n * Get the final bridge quote requests.\n * Subtracts subsequent source amounts from the available balance.\n *\n * @param requests - List of bridge quote requests.\n * @param messenger - Controller messenger.\n * @returns The final bridge quote requests.\n */\nfunction getFinalRequests(\n  requests: QuoteRequest[],\n  messenger: TransactionPayControllerMessenger,\n): BridgeQuoteRequest[] {\n  const featureFlags = getFeatureFlags(messenger);\n\n  return requests\n    .map((request) => ({ ...request, ...featureFlags }))\n    .map((request, index) => {\n      const isFirstRequest = index === 0;\n      const attemptsMax = isFirstRequest ? request.attemptsMax : 1;\n\n      const sourceBalanceRaw = requests\n        .reduce((acc, value, j) => {\n          const isSameSource =\n            value.sourceTokenAddress.toLowerCase() ===\n              request.sourceTokenAddress.toLowerCase() &&\n            value.sourceChainId === request.sourceChainId;\n\n          if (isFirstRequest && j > index && isSameSource) {\n            return acc.minus(value.sourceTokenAmount);\n          }\n\n          return acc;\n        }, new BigNumber(request.sourceBalanceRaw))\n        .toFixed(0);\n\n      return {\n        ...request,\n        attemptsMax,\n        sourceBalanceRaw,\n      };\n    });\n}\n\n/**\n * Get feature flags for bridge quotes.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nfunction getFeatureFlags(messenger: TransactionPayControllerMessenger) {\n  const featureFlags = messenger.call('RemoteFeatureFlagController:getState')\n    .remoteFeatureFlags.confirmation_pay as Record<string, number> | undefined;\n\n  return {\n    attemptsMax: featureFlags?.attemptsMax ?? ATTEMPTS_MAX_DEFAULT,\n    bufferInitial: featureFlags?.bufferInitial ?? BUFFER_INITIAL_DEFAULT,\n    bufferStep: featureFlags?.bufferStep ?? BUFFER_STEP_DEFAULT,\n    bufferSubsequent:\n      featureFlags?.bufferSubsequent ?? BUFFER_SUBSEQUENT_DEFAULT,\n    slippage: featureFlags?.slippage ?? SLIPPAGE_DEFAULT,\n  };\n}\n\n/**\n * Convert a bridge specific quote response to a normalized transaction pay quote.\n *\n * @param quote - Bridge quote response.\n * @param request - Request\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Normalized transaction pay quote.\n */\nfunction normalizeQuote(\n  quote: TransactionPayBridgeQuote,\n  request: BridgeQuoteRequest,\n  messenger: TransactionPayControllerMessenger,\n  transaction: TransactionMeta,\n): TransactionPayQuote<TransactionPayBridgeQuote> {\n  const targetFiatRate = getTokenFiatRate(\n    messenger,\n    quote.quote.destAsset.address as Hex,\n    toHex(quote.quote.destChainId),\n  );\n\n  const sourceFiatRate = getTokenFiatRate(\n    messenger,\n    quote.quote.srcAsset.address as Hex,\n    toHex(quote.quote.srcChainId),\n  );\n\n  if (sourceFiatRate === undefined || targetFiatRate === undefined) {\n    throw new Error('Fiat rate not found for source or target token');\n  }\n\n  const targetAmountMinimumFiat = calculateFiatValue(\n    quote.quote.minDestTokenAmount,\n    quote.quote.destAsset.decimals,\n    targetFiatRate.fiatRate,\n    targetFiatRate.usdRate,\n  );\n\n  const sourceAmountFiat = calculateFiatValue(\n    quote.quote.srcTokenAmount,\n    quote.quote.srcAsset.decimals,\n    sourceFiatRate.fiatRate,\n    sourceFiatRate.usdRate,\n  );\n\n  const targetAmountGoal = calculateFiatValue(\n    request.targetAmountMinimum,\n    quote.quote.destAsset.decimals,\n    targetFiatRate.fiatRate,\n    targetFiatRate.usdRate,\n  );\n\n  const targetNetwork = calculateGasCost(transaction, messenger);\n\n  const sourceNetwork = calculateSourceNetworkFee(\n    quote,\n    sourceFiatRate,\n    messenger,\n  );\n\n  return {\n    estimatedDuration: quote.estimatedProcessingTimeInSeconds,\n    dust: {\n      fiat: new BigNumber(targetAmountMinimumFiat.fiat)\n        .minus(targetAmountGoal.fiat)\n        .toString(10),\n      usd: new BigNumber(targetAmountMinimumFiat.usd)\n        .minus(targetAmountGoal.usd)\n        .toString(10),\n    },\n    fees: {\n      provider: {\n        fiat: new BigNumber(sourceAmountFiat.fiat)\n          .minus(targetAmountMinimumFiat.fiat)\n          .toString(10),\n        usd: new BigNumber(sourceAmountFiat.usd)\n          .minus(targetAmountMinimumFiat.usd)\n          .toString(10),\n      },\n      sourceNetwork,\n      targetNetwork,\n    },\n    original: quote,\n    request,\n    strategy: TransactionPayStrategy.Bridge,\n  };\n}\n\n/**\n * Calculate fiat value from amount and fiat rates.\n *\n * @param amount - Amount to convert.\n * @param decimals - Token decimals.\n * @param fiatRateFiat - Fiat rate.\n * @param fiatRateUsd - USD rate.\n * @returns Fiat value.\n */\nfunction calculateFiatValue(\n  amount: string,\n  decimals: number,\n  fiatRateFiat: string,\n  fiatRateUsd: string,\n): FiatValue {\n  const amountHuman = new BigNumber(amount).shiftedBy(-decimals);\n  const usd = amountHuman.multipliedBy(fiatRateUsd).toString(10);\n  const fiat = amountHuman.multipliedBy(fiatRateFiat).toString(10);\n\n  return { fiat, usd };\n}\n\n/**\n * Calculate the source network fee for a bridge quote.\n *\n * @param quote - Bridge quote response.\n * @param sourceFiatRate - Fiat rate for the source token.\n * @param messenger - Controller messenger.\n * @returns Estimated gas cost for the source network.\n */\nfunction calculateSourceNetworkFee(\n  quote: TransactionPayBridgeQuote,\n  sourceFiatRate: FiatRates,\n  messenger: TransactionPayControllerMessenger,\n): FiatValue {\n  const { approval, trade } = quote;\n\n  const approvalCost = approval\n    ? calculateSourceGasCost(approval, sourceFiatRate, messenger)\n    : { fiat: '0', usd: '0' };\n\n  const tradeCost = calculateSourceGasCost(\n    trade as TxData,\n    sourceFiatRate,\n    messenger,\n  );\n\n  return {\n    fiat: new BigNumber(approvalCost.fiat).plus(tradeCost.fiat).toString(10),\n    usd: new BigNumber(approvalCost.usd).plus(tradeCost.usd).toString(10),\n  };\n}\n\n/**\n * Calculate the gas cost on the source chain for a bridge transaction.\n *\n * @param params - Transaction params.\n * @param sourceFiatRate - Fiat rate for the source token.\n * @param messenger - Controller messenger.\n * @returns Estimated gas cost for the transaction.\n */\nfunction calculateSourceGasCost(\n  params: TxData,\n  sourceFiatRate: FiatRates,\n  messenger: TransactionPayControllerMessenger,\n): FiatValue {\n  const { chainId: chainIdNumber, effectiveGas, gasLimit } = params;\n  const chainId = toHex(chainIdNumber);\n\n  const { estimatedBaseFee, maxFeePerGas, maxPriorityFeePerGas } = getGasFee(\n    chainId,\n    messenger,\n  );\n\n  const gas = new BigNumber(effectiveGas || gasLimit || '0x0');\n\n  const feePerGas =\n    estimatedBaseFee && maxPriorityFeePerGas\n      ? new BigNumber(estimatedBaseFee).plus(maxPriorityFeePerGas)\n      : new BigNumber(maxFeePerGas || '0x0');\n\n  const gasCostNative = gas.multipliedBy(feePerGas).shiftedBy(-18);\n  const usd = gasCostNative.multipliedBy(sourceFiatRate.usdRate).toString(10);\n  const fiat = gasCostNative.multipliedBy(sourceFiatRate.fiatRate).toString(10);\n\n  return {\n    usd,\n    fiat,\n  };\n}\n"]}