@metamask-previews/bridge-controller 79.2.0-preview-9efd0b754 → 79.2.0-preview-4e64b66e8

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.
Files changed (74) hide show
  1. package/CHANGELOG.md +1 -6
  2. package/dist/coercers/quote-response-v1-to-v2.cjs +4 -4
  3. package/dist/coercers/quote-response-v1-to-v2.cjs.map +1 -1
  4. package/dist/coercers/quote-response-v1-to-v2.mjs +4 -4
  5. package/dist/coercers/quote-response-v1-to-v2.mjs.map +1 -1
  6. package/dist/index.cjs +9 -11
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.cts +1 -2
  9. package/dist/index.d.cts.map +1 -1
  10. package/dist/index.d.mts +1 -2
  11. package/dist/index.d.mts.map +1 -1
  12. package/dist/index.mjs +0 -1
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/selectors.cjs +4 -43
  15. package/dist/selectors.cjs.map +1 -1
  16. package/dist/selectors.d.cts +114 -1209
  17. package/dist/selectors.d.cts.map +1 -1
  18. package/dist/selectors.d.mts +114 -1209
  19. package/dist/selectors.d.mts.map +1 -1
  20. package/dist/selectors.mjs +4 -43
  21. package/dist/selectors.mjs.map +1 -1
  22. package/dist/utils/quote-metadata/calculators.cjs +14 -10
  23. package/dist/utils/quote-metadata/calculators.cjs.map +1 -1
  24. package/dist/utils/quote-metadata/calculators.d.cts.map +1 -1
  25. package/dist/utils/quote-metadata/calculators.d.mts.map +1 -1
  26. package/dist/utils/quote-metadata/calculators.mjs +14 -10
  27. package/dist/utils/quote-metadata/calculators.mjs.map +1 -1
  28. package/dist/utils/quote-metadata/merge.cjs +10 -36
  29. package/dist/utils/quote-metadata/merge.cjs.map +1 -1
  30. package/dist/utils/quote-metadata/merge.d.cts +3 -6
  31. package/dist/utils/quote-metadata/merge.d.cts.map +1 -1
  32. package/dist/utils/quote-metadata/merge.d.mts +3 -6
  33. package/dist/utils/quote-metadata/merge.d.mts.map +1 -1
  34. package/dist/utils/quote-metadata/merge.mjs +10 -36
  35. package/dist/utils/quote-metadata/merge.mjs.map +1 -1
  36. package/dist/utils/quote-metadata/to-quote-metadata-v1.cjs +16 -65
  37. package/dist/utils/quote-metadata/to-quote-metadata-v1.cjs.map +1 -1
  38. package/dist/utils/quote-metadata/to-quote-metadata-v1.d.cts +1 -3
  39. package/dist/utils/quote-metadata/to-quote-metadata-v1.d.cts.map +1 -1
  40. package/dist/utils/quote-metadata/to-quote-metadata-v1.d.mts +1 -3
  41. package/dist/utils/quote-metadata/to-quote-metadata-v1.d.mts.map +1 -1
  42. package/dist/utils/quote-metadata/to-quote-metadata-v1.mjs +16 -65
  43. package/dist/utils/quote-metadata/to-quote-metadata-v1.mjs.map +1 -1
  44. package/dist/utils/quote-metadata/to-quote-metadata-v2.cjs +45 -26
  45. package/dist/utils/quote-metadata/to-quote-metadata-v2.cjs.map +1 -1
  46. package/dist/utils/quote-metadata/to-quote-metadata-v2.d.cts.map +1 -1
  47. package/dist/utils/quote-metadata/to-quote-metadata-v2.d.mts.map +1 -1
  48. package/dist/utils/quote-metadata/to-quote-metadata-v2.mjs +45 -26
  49. package/dist/utils/quote-metadata/to-quote-metadata-v2.mjs.map +1 -1
  50. package/dist/utils/quote-metadata/types.cjs +0 -16
  51. package/dist/utils/quote-metadata/types.cjs.map +1 -1
  52. package/dist/utils/quote-metadata/types.d.cts +0 -21
  53. package/dist/utils/quote-metadata/types.d.cts.map +1 -1
  54. package/dist/utils/quote-metadata/types.d.mts +0 -21
  55. package/dist/utils/quote-metadata/types.d.mts.map +1 -1
  56. package/dist/utils/quote-metadata/types.mjs +1 -15
  57. package/dist/utils/quote-metadata/types.mjs.map +1 -1
  58. package/package.json +2 -2
  59. package/dist/utils/quote-metadata/include-if-truthy.cjs +0 -14
  60. package/dist/utils/quote-metadata/include-if-truthy.cjs.map +0 -1
  61. package/dist/utils/quote-metadata/include-if-truthy.d.cts +0 -2
  62. package/dist/utils/quote-metadata/include-if-truthy.d.cts.map +0 -1
  63. package/dist/utils/quote-metadata/include-if-truthy.d.mts +0 -2
  64. package/dist/utils/quote-metadata/include-if-truthy.d.mts.map +0 -1
  65. package/dist/utils/quote-metadata/include-if-truthy.mjs +0 -10
  66. package/dist/utils/quote-metadata/include-if-truthy.mjs.map +0 -1
  67. package/dist/utils/quote-metadata/to-currency-values.cjs +0 -60
  68. package/dist/utils/quote-metadata/to-currency-values.cjs.map +0 -1
  69. package/dist/utils/quote-metadata/to-currency-values.d.cts +0 -12
  70. package/dist/utils/quote-metadata/to-currency-values.d.cts.map +0 -1
  71. package/dist/utils/quote-metadata/to-currency-values.d.mts +0 -12
  72. package/dist/utils/quote-metadata/to-currency-values.d.mts.map +0 -1
  73. package/dist/utils/quote-metadata/to-currency-values.mjs +0 -56
  74. package/dist/utils/quote-metadata/to-currency-values.mjs.map +0 -1
@@ -4,10 +4,10 @@ import { is } from "@metamask/superstruct";
4
4
  import { BigNumber } from "bignumber.js";
5
5
  import { toQuoteResponseV1 } from "../../coercers/quote-response-v2-to-v1.mjs";
6
6
  import { FloatStringSchema } from "../../validators/number.mjs";
7
+ import { QuoteResponseSchemaV2 } from "../../validators/quote-response.mjs";
7
8
  import { assetIdsMatch } from "../assets.mjs";
8
9
  import { isEvmQuoteResponse, isNativeAddress } from "../bridge.mjs";
9
10
  import { calcNormalizedTokenAmount } from "../number-formatters.mjs";
10
- import { includeIfTruthy } from "./include-if-truthy.mjs";
11
11
  export const calcNonEvmTotalNetworkFee = (bridgeQuote, { exchangeRate, usdExchangeRate }) => {
12
12
  const { nonEvmFeesInNative } = bridgeQuote;
13
13
  // Fees are now stored directly in native units (SOL, BTC) without conversion
@@ -272,10 +272,8 @@ export const calcPriceImpact = (quote) => {
272
272
  */
273
273
  export const calcQuoteMetadata = (quote, options) => {
274
274
  const { bridgeFeesPerGas = {}, srcTokenExchangeRate = {}, destTokenExchangeRate = {}, nativeExchangeRate = {}, } = options;
275
- const isQuoteV2 = Object.prototype.hasOwnProperty.call(quote.quote ?? {}, 'src');
276
- const quoteV1 = isQuoteV2
277
- ? toQuoteResponseV1(quote)
278
- : quote;
275
+ const isQuoteV2 = is(quote, QuoteResponseSchemaV2);
276
+ const quoteV1 = isQuoteV2 ? toQuoteResponseV1(quote) : quote;
279
277
  const sentAmount = calcSentAmount(quoteV1.quote, srcTokenExchangeRate, isQuoteV2);
280
278
  const toTokenAmount = calcToAmount(quoteV1.quote.destTokenAmount, quoteV1.quote.destAsset, destTokenExchangeRate);
281
279
  const minToTokenAmount = calcToAmount(quoteV1.quote.minDestTokenAmount ?? quoteV1.quote.destTokenAmount, quoteV1.quote.destAsset, destTokenExchangeRate);
@@ -319,11 +317,17 @@ export const calcQuoteMetadata = (quote, options) => {
319
317
  Should only be used for display purposes.
320
318
  */
321
319
  gasFee,
322
- ...includeIfTruthy(adjustedReturn, { adjustedReturn }),
323
- ...includeIfTruthy(cost, { cost }),
324
- ...includeIfTruthy(includedTxFees, { includedTxFees }),
325
- ...includeIfTruthy(relayerFee, { relayerFee }),
326
- ...includeIfTruthy(priceImpact, { priceImpact }),
320
+ ...(adjustedReturn &&
321
+ Object.values(adjustedReturn).some(Boolean) && { adjustedReturn }),
322
+ ...(cost && Object.values(cost).some(Boolean) && { cost }),
323
+ ...(includedTxFees &&
324
+ Object.values(includedTxFees).some(Boolean) && { includedTxFees }),
325
+ ...(relayerFee &&
326
+ Object.values(relayerFee).some(Boolean) && { relayerFee }),
327
+ ...(priceImpact &&
328
+ Object.values(priceImpact).some(Boolean) && {
329
+ priceImpact,
330
+ }),
327
331
  };
328
332
  };
329
333
  //# sourceMappingURL=calculators.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"calculators.mjs","sourceRoot":"","sources":["../../../src/utils/quote-metadata/calculators.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 { is } from '@metamask/superstruct';\nimport { BigNumber } from 'bignumber.js';\n\nimport { toQuoteResponseV1 } from '../../coercers/quote-response-v2-to-v1.js';\nimport type {\n L1GasFees,\n ExchangeRate,\n NonEvmFees,\n DeepPartial,\n} from '../../types.js';\nimport type { BridgeAsset } from '../../validators/bridge-asset.js';\nimport { FloatStringSchema } from '../../validators/number.js';\nimport type { QuoteResponseV1 } from '../../validators/quote-response-v1.js';\nimport type { QuoteResponse } from '../../validators/quote-response.js';\nimport type { TxData } from '../../validators/trade.js';\nimport { assetIdsMatch } from '../assets.js';\nimport { isEvmQuoteResponse, isNativeAddress } from '../bridge.js';\nimport { calcNormalizedTokenAmount } from '../number-formatters.js';\nimport { includeIfTruthy } from './include-if-truthy.js';\nimport type { QuoteMetadata, TokenAmountValues } from './types.js';\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 = nonEvmFeesInNative\n ? new BigNumber(nonEvmFeesInNative)\n : undefined;\n\n return {\n amount: feeInNative?.toFixed(),\n valueInCurrency: exchangeRate && feeInNative?.times(exchangeRate).toFixed(),\n usd: usdExchangeRate && feeInNative?.times(usdExchangeRate).toFixed(),\n };\n};\n\nexport const calcToAmount = (\n destTokenAmount: string | undefined,\n destAsset: BridgeAsset,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const normalizedDestAmount = calcNormalizedTokenAmount(\n destTokenAmount,\n destAsset.decimals,\n );\n return {\n amount: normalizedDestAmount?.toFixed(),\n valueInCurrency:\n exchangeRate && normalizedDestAmount?.times(exchangeRate).toFixed(),\n usd:\n usdExchangeRate && normalizedDestAmount?.times(usdExchangeRate).toFixed(),\n };\n};\n\nexport const calcSentAmount = (\n { srcTokenAmount, srcAsset, feeData, intent }: QuoteResponseV1['quote'],\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n isQuoteV2: boolean = false,\n) => {\n // For intent-based swaps or converted V2 quote responses, 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 =\n intent || isQuoteV2\n ? new BigNumber(srcTokenAmount)\n : Object.values(feeData)\n .filter(\n (fee) =>\n fee?.amount &&\n assetIdsMatch(fee.asset?.assetId, srcAsset.assetId),\n )\n .reduce(\n (acc, { amount }) => acc.plus(amount),\n new BigNumber(srcTokenAmount),\n );\n const normalizedSentAmount = calcNormalizedTokenAmount(\n sentAmount,\n srcAsset.decimals,\n );\n return {\n amount: normalizedSentAmount?.toFixed(),\n valueInCurrency:\n exchangeRate && normalizedSentAmount?.times(exchangeRate).toFixed(),\n usd:\n usdExchangeRate && normalizedSentAmount?.times(usdExchangeRate).toFixed(),\n };\n};\n\nexport const calcBatchFees = (\n amount: string,\n asset: BridgeAsset,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const normalizedAmount = calcNormalizedTokenAmount(amount, asset.decimals);\n\n return {\n amount: normalizedAmount?.toFixed(),\n valueInCurrency: exchangeRate\n ? normalizedAmount?.times(exchangeRate).toFixed()\n : null,\n usd: usdExchangeRate\n ? normalizedAmount?.times(usdExchangeRate).toFixed()\n : null,\n asset,\n };\n};\n\nexport const calcRelayerFee = (\n sentAmount: ReturnType<typeof calcSentAmount>,\n quoteResponse: QuoteResponseV1<TxData>,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const { quote, trade } = quoteResponse;\n const relayerFeeAmount = trade.value\n ? new BigNumber(convertHexToDecimal(trade.value))\n : undefined;\n let relayerFeeInNative = relayerFeeAmount\n ? calcNormalizedTokenAmount(relayerFeeAmount, 18)\n : undefined;\n\n // Subtract srcAmount and other fees from trade value if srcAsset is native\n if (isNativeAddress(quote.srcAsset.assetId)) {\n relayerFeeInNative = relayerFeeInNative?.minus(sentAmount.amount ?? '0');\n }\n\n if (relayerFeeInNative?.lte(0)) {\n return undefined;\n }\n\n return {\n amount: relayerFeeInNative?.toFixed(),\n valueInCurrency:\n exchangeRate && relayerFeeInNative?.times(exchangeRate).toFixed(),\n usd:\n usdExchangeRate && relayerFeeInNative?.times(usdExchangeRate).toFixed(),\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 =\n tradeGasLimit || approvalGasLimit || resetApprovalGasLimit\n ? new BigNumber(tradeGasLimit?.toFixed() ?? '0')\n .plus(approvalGasLimit?.toFixed() ?? '0')\n .plus(resetApprovalGasLimit?.toFixed() ?? '0')\n : undefined;\n\n const l1GasFeesInDecGWei = l1GasFeesInHexWei\n ? weiHexToGweiDec(toHex(l1GasFeesInHexWei))\n : undefined;\n\n const gasFeesInDecGwei = totalGasLimitInDec\n ? totalGasLimitInDec\n ?.times(feePerGasInDecGwei ?? '0')\n ?.plus(l1GasFeesInDecGWei ?? '0')\n : undefined;\n const gasFeesInDecEth = gasFeesInDecGwei?.times(new BigNumber(10).pow(-9));\n\n const gasFeesInDisplayCurrency = nativeToDisplayCurrencyExchangeRate\n ? gasFeesInDecEth?.times(nativeToDisplayCurrencyExchangeRate)\n : undefined;\n const gasFeesInUSD = nativeToUsdExchangeRate\n ? gasFeesInDecEth?.times(nativeToUsdExchangeRate)\n : undefined;\n\n return {\n amount: gasFeesInDecEth?.toFixed(),\n valueInCurrency: gasFeesInDisplayCurrency?.toFixed(),\n usd: gasFeesInUSD?.toFixed(),\n };\n};\n\nexport const calcEstimatedAndMaxTotalGasFee = ({\n bridgeQuote: { approval, trade, l1GasFeesInHexWei, resetApproval },\n feePerGasInDecGwei,\n exchangeRate: nativeToDisplayCurrencyExchangeRate,\n usdExchangeRate: nativeToUsdExchangeRate,\n}: {\n bridgeQuote: QuoteResponseV1<TxData, TxData> & L1GasFees;\n feePerGasInDecGwei?: string;\n} & ExchangeRate) => {\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 return {\n total: {\n amount,\n valueInCurrency,\n usd,\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 gasFee: { total?: Partial<TokenAmountValues> } | undefined,\n relayerFee: ReturnType<typeof calcRelayerFee>,\n) => {\n const { total: gasFeeToDisplay } = gasFee ?? {};\n return {\n amount:\n (gasFeeToDisplay?.amount ?? relayerFee?.amount) &&\n new BigNumber(gasFeeToDisplay?.amount ?? '0')\n .plus(relayerFee?.amount ?? '0')\n .toFixed(),\n valueInCurrency:\n (gasFeeToDisplay?.valueInCurrency ?? relayerFee?.valueInCurrency) &&\n new BigNumber(gasFeeToDisplay?.valueInCurrency ?? '0')\n .plus(relayerFee?.valueInCurrency ?? '0')\n .toFixed(),\n usd:\n (gasFeeToDisplay?.usd ?? relayerFee?.usd) &&\n new BigNumber(gasFeeToDisplay?.usd ?? '0')\n .plus(relayerFee?.usd ?? '0')\n .toFixed(),\n };\n};\n\n// Gas is included for some swap quotes and this is the value displayed in the client\nexport const calcIncludedTxFees = (\n {\n gasIncluded,\n gasIncluded7702,\n srcAsset,\n feeData: { txFee },\n }: QuoteResponseV1['quote'],\n srcTokenExchangeRate: ExchangeRate,\n destTokenExchangeRate: ExchangeRate,\n) => {\n if (!txFee || !(gasIncluded || gasIncluded7702)) {\n return undefined;\n }\n // Use exchange rate of the token that is being used to pay for the transaction\n const { exchangeRate, usdExchangeRate } = assetIdsMatch(\n txFee?.asset?.assetId,\n srcAsset.assetId,\n )\n ? srcTokenExchangeRate\n : destTokenExchangeRate;\n const normalizedTxFeeAmount = calcNormalizedTokenAmount(\n txFee?.amount,\n txFee?.asset.decimals,\n );\n\n return {\n amount: normalizedTxFeeAmount?.toFixed(),\n valueInCurrency:\n exchangeRate && normalizedTxFeeAmount?.times(exchangeRate).toFixed(),\n usd:\n usdExchangeRate &&\n normalizedTxFeeAmount?.times(usdExchangeRate).toFixed(),\n };\n};\n\nexport const calcAdjustedReturn = (\n toTokenAmount: Partial<TokenAmountValues>,\n totalEstimatedNetworkFee: Partial<TokenAmountValues>,\n {\n feeData: { txFee },\n destAsset: { assetId: destAssetId },\n }: QuoteResponseV1['quote'],\n) => {\n // If gas is included and is taken from the dest token, don't subtract network fee from return\n if (assetIdsMatch(txFee?.asset?.assetId, destAssetId)) {\n return {\n valueInCurrency: toTokenAmount.valueInCurrency,\n usd: toTokenAmount.usd,\n };\n }\n return {\n valueInCurrency:\n toTokenAmount.valueInCurrency &&\n totalEstimatedNetworkFee.valueInCurrency &&\n new BigNumber(toTokenAmount.valueInCurrency)\n .minus(totalEstimatedNetworkFee.valueInCurrency)\n .toFixed(),\n usd:\n toTokenAmount.usd &&\n totalEstimatedNetworkFee.usd &&\n new BigNumber(toTokenAmount.usd)\n .minus(totalEstimatedNetworkFee.usd)\n .toFixed(),\n };\n};\n\nexport const calcSwapRate = (sentAmount?: string, destTokenAmount?: string) =>\n destTokenAmount && sentAmount\n ? new BigNumber(destTokenAmount).div(sentAmount).toFixed()\n : undefined;\n\nexport const calcCost = (\n adjustedReturn: ReturnType<typeof calcAdjustedReturn>,\n sentAmount: ReturnType<typeof calcSentAmount>,\n) => ({\n valueInCurrency:\n adjustedReturn.valueInCurrency &&\n sentAmount.valueInCurrency &&\n new BigNumber(sentAmount.valueInCurrency)\n .minus(adjustedReturn.valueInCurrency)\n .toFixed(),\n usd:\n adjustedReturn.usd &&\n sentAmount.usd &&\n new BigNumber(sentAmount.usd).minus(adjustedReturn.usd).toFixed(),\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 .toFixed();\n }\n\n if (cost.usd && sentAmount.usd) {\n return new BigNumber(cost.usd)\n .div(sentAmount.usd)\n .times(100)\n .abs()\n .toFixed();\n }\n\n return null;\n};\n\n/**\n * Returns the fiat price impact for a bridge quote — the difference between\n * the source input fiat amount and the destination output fiat amount\n *\n * @param quote - The active quote\n * @returns Formatted fiat impact string, or `undefined` when either fiat value is unavailable.\n */\nexport const calcPriceImpact = (\n quote?: DeepPartial<\n Pick<QuoteMetadata, 'sentAmount' | 'toTokenAmount'>\n > | null,\n) => {\n if (!quote?.sentAmount || !quote?.toTokenAmount) {\n return undefined;\n }\n\n const sourceFiat = quote.sentAmount.valueInCurrency;\n const destFiat = quote.toTokenAmount.valueInCurrency;\n const sourceUsd = quote.sentAmount.usd;\n const destUsd = quote.toTokenAmount.usd;\n\n const isSourceFiatValid = (value: unknown): value is string[] =>\n is(value, FloatStringSchema);\n\n const valueInCurrency =\n isSourceFiatValid(sourceFiat) && isSourceFiatValid(destFiat)\n ? new BigNumber(sourceFiat).minus(destFiat).abs().toFixed()\n : undefined;\n const usd =\n isSourceFiatValid(sourceUsd) && isSourceFiatValid(destUsd)\n ? new BigNumber(sourceUsd).minus(destUsd).abs().toFixed()\n : undefined;\n\n if (!valueInCurrency && !usd) {\n return undefined;\n }\n\n return {\n valueInCurrency,\n usd,\n };\n};\n\n/**\n * Calculates quote metadata, such as converted fiat amounts and fees,\n * based on the controller state and the quote response\n *\n * @param quote - The quote response to calculate the metadata for\n * @param options - The options for the calculation\n * @param options.bridgeFeesPerGas - The bridge fees per gas\n * @param options.srcTokenExchangeRate - The exchange rate for the source token\n * @param options.destTokenExchangeRate - The exchange rate for the destination token\n * @param options.nativeExchangeRate - The exchange rate for the native token\n * @returns The calculated metadata\n */\nexport const calcQuoteMetadata = (\n quote: QuoteResponseV1 | QuoteResponse,\n options: {\n bridgeFeesPerGas: null | {\n estimatedBaseFeeInDecGwei: string | null;\n feePerGasInDecGwei?: string;\n };\n srcTokenExchangeRate: ExchangeRate;\n destTokenExchangeRate: ExchangeRate;\n nativeExchangeRate: ExchangeRate;\n },\n): QuoteMetadata => {\n const {\n bridgeFeesPerGas = {},\n srcTokenExchangeRate = {},\n destTokenExchangeRate = {},\n nativeExchangeRate = {},\n } = options;\n\n const isQuoteV2 = Object.prototype.hasOwnProperty.call(\n quote.quote ?? {},\n 'src',\n );\n const quoteV1 = isQuoteV2\n ? toQuoteResponseV1(quote)\n : (quote as QuoteResponseV1);\n\n const sentAmount = calcSentAmount(\n quoteV1.quote,\n srcTokenExchangeRate,\n isQuoteV2,\n );\n\n const toTokenAmount = calcToAmount(\n quoteV1.quote.destTokenAmount,\n quoteV1.quote.destAsset,\n destTokenExchangeRate,\n );\n const minToTokenAmount = calcToAmount(\n quoteV1.quote.minDestTokenAmount ?? quoteV1.quote.destTokenAmount,\n quoteV1.quote.destAsset,\n destTokenExchangeRate,\n );\n\n const includedTxFees = calcIncludedTxFees(\n quoteV1.quote,\n srcTokenExchangeRate,\n destTokenExchangeRate,\n );\n\n let totalEstimatedNetworkFee, relayerFee, gasFee;\n\n if (isEvmQuoteResponse(quoteV1)) {\n relayerFee = calcRelayerFee(sentAmount, quoteV1, nativeExchangeRate);\n gasFee = calcEstimatedAndMaxTotalGasFee({\n bridgeQuote: quoteV1,\n ...bridgeFeesPerGas,\n ...nativeExchangeRate,\n });\n // Uses total gasFee to calculate the total estimated network fee\n totalEstimatedNetworkFee = calcTotalEstimatedNetworkFee(gasFee, relayerFee);\n } else {\n // Use the new generic function for all non-EVM chains\n totalEstimatedNetworkFee = calcNonEvmTotalNetworkFee(\n quoteV1,\n nativeExchangeRate,\n );\n gasFee = {\n total: totalEstimatedNetworkFee,\n };\n }\n\n const adjustedReturn = calcAdjustedReturn(\n toTokenAmount,\n totalEstimatedNetworkFee,\n quoteV1.quote,\n );\n const cost = calcCost(adjustedReturn, sentAmount);\n\n // The quote has not been updated at this point, so we need to calculate the price impact using sentAmount and toTokenAmount\n const priceImpact = calcPriceImpact({ sentAmount, toTokenAmount });\n\n return {\n sentAmount,\n toTokenAmount,\n minToTokenAmount,\n swapRate: calcSwapRate(sentAmount.amount, toTokenAmount.amount),\n /**\n This is the amount required to submit all the transactions.\n Includes the relayer fee or other native fees.\n Should be used for balance checks and tx submission.\n */\n totalNetworkFee: totalEstimatedNetworkFee,\n /**\n This contains gas fee estimates for the bridge transaction\n Does not include the relayer fee (if needed), just the gasLimit and effectiveGas returned by the bridge API.\n Should only be used for display purposes.\n */\n gasFee,\n ...includeIfTruthy(adjustedReturn, { adjustedReturn }),\n ...includeIfTruthy(cost, { cost }),\n ...includeIfTruthy(includedTxFees, { includedTxFees }),\n ...includeIfTruthy(relayerFee, { relayerFee }),\n ...includeIfTruthy(priceImpact, { priceImpact }),\n };\n};\n"]}
1
+ {"version":3,"file":"calculators.mjs","sourceRoot":"","sources":["../../../src/utils/quote-metadata/calculators.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 { is } from '@metamask/superstruct';\nimport { BigNumber } from 'bignumber.js';\n\nimport { toQuoteResponseV1 } from '../../coercers/quote-response-v2-to-v1.js';\nimport type {\n L1GasFees,\n ExchangeRate,\n NonEvmFees,\n DeepPartial,\n} from '../../types.js';\nimport type { BridgeAsset } from '../../validators/bridge-asset.js';\nimport { FloatStringSchema } from '../../validators/number.js';\nimport type { QuoteResponseV1 } from '../../validators/quote-response-v1.js';\nimport { QuoteResponseSchemaV2 } from '../../validators/quote-response.js';\nimport type { QuoteResponse } from '../../validators/quote-response.js';\nimport type { TxData } from '../../validators/trade.js';\nimport { assetIdsMatch } from '../assets.js';\nimport { isEvmQuoteResponse, isNativeAddress } from '../bridge.js';\nimport { calcNormalizedTokenAmount } from '../number-formatters.js';\nimport type { QuoteMetadata, TokenAmountValues } from './types.js';\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 = nonEvmFeesInNative\n ? new BigNumber(nonEvmFeesInNative)\n : undefined;\n\n return {\n amount: feeInNative?.toFixed(),\n valueInCurrency: exchangeRate && feeInNative?.times(exchangeRate).toFixed(),\n usd: usdExchangeRate && feeInNative?.times(usdExchangeRate).toFixed(),\n };\n};\n\nexport const calcToAmount = (\n destTokenAmount: string | undefined,\n destAsset: BridgeAsset,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const normalizedDestAmount = calcNormalizedTokenAmount(\n destTokenAmount,\n destAsset.decimals,\n );\n return {\n amount: normalizedDestAmount?.toFixed(),\n valueInCurrency:\n exchangeRate && normalizedDestAmount?.times(exchangeRate).toFixed(),\n usd:\n usdExchangeRate && normalizedDestAmount?.times(usdExchangeRate).toFixed(),\n };\n};\n\nexport const calcSentAmount = (\n { srcTokenAmount, srcAsset, feeData, intent }: QuoteResponseV1['quote'],\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n isQuoteV2: boolean = false,\n) => {\n // For intent-based swaps or converted V2 quote responses, 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 =\n intent || isQuoteV2\n ? new BigNumber(srcTokenAmount)\n : Object.values(feeData)\n .filter(\n (fee) =>\n fee?.amount &&\n assetIdsMatch(fee.asset?.assetId, srcAsset.assetId),\n )\n .reduce(\n (acc, { amount }) => acc.plus(amount),\n new BigNumber(srcTokenAmount),\n );\n const normalizedSentAmount = calcNormalizedTokenAmount(\n sentAmount,\n srcAsset.decimals,\n );\n return {\n amount: normalizedSentAmount?.toFixed(),\n valueInCurrency:\n exchangeRate && normalizedSentAmount?.times(exchangeRate).toFixed(),\n usd:\n usdExchangeRate && normalizedSentAmount?.times(usdExchangeRate).toFixed(),\n };\n};\n\nexport const calcBatchFees = (\n amount: string,\n asset: BridgeAsset,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const normalizedAmount = calcNormalizedTokenAmount(amount, asset.decimals);\n\n return {\n amount: normalizedAmount?.toFixed(),\n valueInCurrency: exchangeRate\n ? normalizedAmount?.times(exchangeRate).toFixed()\n : null,\n usd: usdExchangeRate\n ? normalizedAmount?.times(usdExchangeRate).toFixed()\n : null,\n asset,\n };\n};\n\nexport const calcRelayerFee = (\n sentAmount: ReturnType<typeof calcSentAmount>,\n quoteResponse: QuoteResponseV1<TxData>,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const { quote, trade } = quoteResponse;\n const relayerFeeAmount = trade.value\n ? new BigNumber(convertHexToDecimal(trade.value))\n : undefined;\n let relayerFeeInNative = relayerFeeAmount\n ? calcNormalizedTokenAmount(relayerFeeAmount, 18)\n : undefined;\n\n // Subtract srcAmount and other fees from trade value if srcAsset is native\n if (isNativeAddress(quote.srcAsset.assetId)) {\n relayerFeeInNative = relayerFeeInNative?.minus(sentAmount.amount ?? '0');\n }\n\n if (relayerFeeInNative?.lte(0)) {\n return undefined;\n }\n\n return {\n amount: relayerFeeInNative?.toFixed(),\n valueInCurrency:\n exchangeRate && relayerFeeInNative?.times(exchangeRate).toFixed(),\n usd:\n usdExchangeRate && relayerFeeInNative?.times(usdExchangeRate).toFixed(),\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 =\n tradeGasLimit || approvalGasLimit || resetApprovalGasLimit\n ? new BigNumber(tradeGasLimit?.toFixed() ?? '0')\n .plus(approvalGasLimit?.toFixed() ?? '0')\n .plus(resetApprovalGasLimit?.toFixed() ?? '0')\n : undefined;\n\n const l1GasFeesInDecGWei = l1GasFeesInHexWei\n ? weiHexToGweiDec(toHex(l1GasFeesInHexWei))\n : undefined;\n\n const gasFeesInDecGwei = totalGasLimitInDec\n ? totalGasLimitInDec\n ?.times(feePerGasInDecGwei ?? '0')\n ?.plus(l1GasFeesInDecGWei ?? '0')\n : undefined;\n const gasFeesInDecEth = gasFeesInDecGwei?.times(new BigNumber(10).pow(-9));\n\n const gasFeesInDisplayCurrency = nativeToDisplayCurrencyExchangeRate\n ? gasFeesInDecEth?.times(nativeToDisplayCurrencyExchangeRate)\n : undefined;\n const gasFeesInUSD = nativeToUsdExchangeRate\n ? gasFeesInDecEth?.times(nativeToUsdExchangeRate)\n : undefined;\n\n return {\n amount: gasFeesInDecEth?.toFixed(),\n valueInCurrency: gasFeesInDisplayCurrency?.toFixed(),\n usd: gasFeesInUSD?.toFixed(),\n };\n};\n\nexport const calcEstimatedAndMaxTotalGasFee = ({\n bridgeQuote: { approval, trade, l1GasFeesInHexWei, resetApproval },\n feePerGasInDecGwei,\n exchangeRate: nativeToDisplayCurrencyExchangeRate,\n usdExchangeRate: nativeToUsdExchangeRate,\n}: {\n bridgeQuote: QuoteResponseV1<TxData, TxData> & L1GasFees;\n feePerGasInDecGwei?: string;\n} & ExchangeRate) => {\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 return {\n total: {\n amount,\n valueInCurrency,\n usd,\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 gasFee: { total?: Partial<TokenAmountValues> } | undefined,\n relayerFee: ReturnType<typeof calcRelayerFee>,\n) => {\n const { total: gasFeeToDisplay } = gasFee ?? {};\n return {\n amount:\n (gasFeeToDisplay?.amount ?? relayerFee?.amount) &&\n new BigNumber(gasFeeToDisplay?.amount ?? '0')\n .plus(relayerFee?.amount ?? '0')\n .toFixed(),\n valueInCurrency:\n (gasFeeToDisplay?.valueInCurrency ?? relayerFee?.valueInCurrency) &&\n new BigNumber(gasFeeToDisplay?.valueInCurrency ?? '0')\n .plus(relayerFee?.valueInCurrency ?? '0')\n .toFixed(),\n usd:\n (gasFeeToDisplay?.usd ?? relayerFee?.usd) &&\n new BigNumber(gasFeeToDisplay?.usd ?? '0')\n .plus(relayerFee?.usd ?? '0')\n .toFixed(),\n };\n};\n\n// Gas is included for some swap quotes and this is the value displayed in the client\nexport const calcIncludedTxFees = (\n {\n gasIncluded,\n gasIncluded7702,\n srcAsset,\n feeData: { txFee },\n }: QuoteResponseV1['quote'],\n srcTokenExchangeRate: ExchangeRate,\n destTokenExchangeRate: ExchangeRate,\n) => {\n if (!txFee || !(gasIncluded || gasIncluded7702)) {\n return undefined;\n }\n // Use exchange rate of the token that is being used to pay for the transaction\n const { exchangeRate, usdExchangeRate } = assetIdsMatch(\n txFee?.asset?.assetId,\n srcAsset.assetId,\n )\n ? srcTokenExchangeRate\n : destTokenExchangeRate;\n const normalizedTxFeeAmount = calcNormalizedTokenAmount(\n txFee?.amount,\n txFee?.asset.decimals,\n );\n\n return {\n amount: normalizedTxFeeAmount?.toFixed(),\n valueInCurrency:\n exchangeRate && normalizedTxFeeAmount?.times(exchangeRate).toFixed(),\n usd:\n usdExchangeRate &&\n normalizedTxFeeAmount?.times(usdExchangeRate).toFixed(),\n };\n};\n\nexport const calcAdjustedReturn = (\n toTokenAmount: Partial<TokenAmountValues>,\n totalEstimatedNetworkFee: Partial<TokenAmountValues>,\n {\n feeData: { txFee },\n destAsset: { assetId: destAssetId },\n }: QuoteResponseV1['quote'],\n) => {\n // If gas is included and is taken from the dest token, don't subtract network fee from return\n if (assetIdsMatch(txFee?.asset?.assetId, destAssetId)) {\n return {\n valueInCurrency: toTokenAmount.valueInCurrency,\n usd: toTokenAmount.usd,\n };\n }\n return {\n valueInCurrency:\n toTokenAmount.valueInCurrency &&\n totalEstimatedNetworkFee.valueInCurrency &&\n new BigNumber(toTokenAmount.valueInCurrency)\n .minus(totalEstimatedNetworkFee.valueInCurrency)\n .toFixed(),\n usd:\n toTokenAmount.usd &&\n totalEstimatedNetworkFee.usd &&\n new BigNumber(toTokenAmount.usd)\n .minus(totalEstimatedNetworkFee.usd)\n .toFixed(),\n };\n};\n\nexport const calcSwapRate = (sentAmount?: string, destTokenAmount?: string) =>\n destTokenAmount && sentAmount\n ? new BigNumber(destTokenAmount).div(sentAmount).toFixed()\n : undefined;\n\nexport const calcCost = (\n adjustedReturn: ReturnType<typeof calcAdjustedReturn>,\n sentAmount: ReturnType<typeof calcSentAmount>,\n) => ({\n valueInCurrency:\n adjustedReturn.valueInCurrency &&\n sentAmount.valueInCurrency &&\n new BigNumber(sentAmount.valueInCurrency)\n .minus(adjustedReturn.valueInCurrency)\n .toFixed(),\n usd:\n adjustedReturn.usd &&\n sentAmount.usd &&\n new BigNumber(sentAmount.usd).minus(adjustedReturn.usd).toFixed(),\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 .toFixed();\n }\n\n if (cost.usd && sentAmount.usd) {\n return new BigNumber(cost.usd)\n .div(sentAmount.usd)\n .times(100)\n .abs()\n .toFixed();\n }\n\n return null;\n};\n\n/**\n * Returns the fiat price impact for a bridge quote — the difference between\n * the source input fiat amount and the destination output fiat amount\n *\n * @param quote - The active quote\n * @returns Formatted fiat impact string, or `undefined` when either fiat value is unavailable.\n */\nexport const calcPriceImpact = (\n quote?: DeepPartial<\n Pick<QuoteMetadata, 'sentAmount' | 'toTokenAmount'>\n > | null,\n) => {\n if (!quote?.sentAmount || !quote?.toTokenAmount) {\n return undefined;\n }\n\n const sourceFiat = quote.sentAmount.valueInCurrency;\n const destFiat = quote.toTokenAmount.valueInCurrency;\n const sourceUsd = quote.sentAmount.usd;\n const destUsd = quote.toTokenAmount.usd;\n\n const isSourceFiatValid = (value: unknown): value is string[] =>\n is(value, FloatStringSchema);\n\n const valueInCurrency =\n isSourceFiatValid(sourceFiat) && isSourceFiatValid(destFiat)\n ? new BigNumber(sourceFiat).minus(destFiat).abs().toFixed()\n : undefined;\n const usd =\n isSourceFiatValid(sourceUsd) && isSourceFiatValid(destUsd)\n ? new BigNumber(sourceUsd).minus(destUsd).abs().toFixed()\n : undefined;\n\n if (!valueInCurrency && !usd) {\n return undefined;\n }\n\n return {\n valueInCurrency,\n usd,\n };\n};\n\n/**\n * Calculates quote metadata, such as converted fiat amounts and fees,\n * based on the controller state and the quote response\n *\n * @param quote - The quote response to calculate the metadata for\n * @param options - The options for the calculation\n * @param options.bridgeFeesPerGas - The bridge fees per gas\n * @param options.srcTokenExchangeRate - The exchange rate for the source token\n * @param options.destTokenExchangeRate - The exchange rate for the destination token\n * @param options.nativeExchangeRate - The exchange rate for the native token\n * @returns The calculated metadata\n */\nexport const calcQuoteMetadata = (\n quote: QuoteResponseV1 | QuoteResponse,\n options: {\n bridgeFeesPerGas: null | {\n estimatedBaseFeeInDecGwei: string | null;\n feePerGasInDecGwei?: string;\n };\n srcTokenExchangeRate: ExchangeRate;\n destTokenExchangeRate: ExchangeRate;\n nativeExchangeRate: ExchangeRate;\n },\n): QuoteMetadata => {\n const {\n bridgeFeesPerGas = {},\n srcTokenExchangeRate = {},\n destTokenExchangeRate = {},\n nativeExchangeRate = {},\n } = options;\n\n const isQuoteV2 = is(quote, QuoteResponseSchemaV2);\n const quoteV1 = isQuoteV2 ? toQuoteResponseV1(quote) : quote;\n\n const sentAmount = calcSentAmount(\n quoteV1.quote,\n srcTokenExchangeRate,\n isQuoteV2,\n );\n\n const toTokenAmount = calcToAmount(\n quoteV1.quote.destTokenAmount,\n quoteV1.quote.destAsset,\n destTokenExchangeRate,\n );\n const minToTokenAmount = calcToAmount(\n quoteV1.quote.minDestTokenAmount ?? quoteV1.quote.destTokenAmount,\n quoteV1.quote.destAsset,\n destTokenExchangeRate,\n );\n\n const includedTxFees = calcIncludedTxFees(\n quoteV1.quote,\n srcTokenExchangeRate,\n destTokenExchangeRate,\n );\n\n let totalEstimatedNetworkFee, relayerFee, gasFee;\n\n if (isEvmQuoteResponse(quoteV1)) {\n relayerFee = calcRelayerFee(sentAmount, quoteV1, nativeExchangeRate);\n gasFee = calcEstimatedAndMaxTotalGasFee({\n bridgeQuote: quoteV1,\n ...bridgeFeesPerGas,\n ...nativeExchangeRate,\n });\n // Uses total gasFee to calculate the total estimated network fee\n totalEstimatedNetworkFee = calcTotalEstimatedNetworkFee(gasFee, relayerFee);\n } else {\n // Use the new generic function for all non-EVM chains\n totalEstimatedNetworkFee = calcNonEvmTotalNetworkFee(\n quoteV1,\n nativeExchangeRate,\n );\n gasFee = {\n total: totalEstimatedNetworkFee,\n };\n }\n\n const adjustedReturn = calcAdjustedReturn(\n toTokenAmount,\n totalEstimatedNetworkFee,\n quoteV1.quote,\n );\n const cost = calcCost(adjustedReturn, sentAmount);\n\n // The quote has not been updated at this point, so we need to calculate the price impact using sentAmount and toTokenAmount\n const priceImpact = calcPriceImpact({ sentAmount, toTokenAmount });\n\n return {\n sentAmount,\n toTokenAmount,\n minToTokenAmount,\n swapRate: calcSwapRate(sentAmount.amount, toTokenAmount.amount),\n /**\n This is the amount required to submit all the transactions.\n Includes the relayer fee or other native fees.\n Should be used for balance checks and tx submission.\n */\n totalNetworkFee: totalEstimatedNetworkFee,\n /**\n This contains gas fee estimates for the bridge transaction\n Does not include the relayer fee (if needed), just the gasLimit and effectiveGas returned by the bridge API.\n Should only be used for display purposes.\n */\n gasFee,\n ...(adjustedReturn &&\n Object.values(adjustedReturn).some(Boolean) && { adjustedReturn }),\n ...(cost && Object.values(cost).some(Boolean) && { cost }),\n ...(includedTxFees &&\n Object.values(includedTxFees).some(Boolean) && { includedTxFees }),\n ...(relayerFee &&\n Object.values(relayerFee).some(Boolean) && { relayerFee }),\n ...(priceImpact &&\n Object.values(priceImpact).some(Boolean) && {\n priceImpact,\n }),\n };\n};\n"]}
@@ -1,53 +1,27 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.mergeQuoteMetadata = void 0;
4
+ const superstruct_1 = require("@metamask/superstruct");
4
5
  const lodash_1 = require("lodash");
6
+ const quote_response_v1_js_1 = require("../../validators/quote-response-v1.cjs");
5
7
  const to_normalized_amounts_js_1 = require("./to-normalized-amounts.cjs");
6
8
  const to_quote_metadata_v2_js_1 = require("./to-quote-metadata-v2.cjs");
7
- const types_js_1 = require("./types.cjs");
8
- const include_if_truthy_js_1 = require("./include-if-truthy.cjs");
9
9
  /**
10
10
  * Merges legacy {@link QuoteMetadata} values into the {@link QuoteResponse}
11
11
  *
12
- * @param quoteResponse - The {@link QuoteResponse} to merge the metadata into
12
+ * @param quoteResponse - The {@link QuoteResponse} or {@link QuoteResponseV1} to merge the metadata into
13
13
  * @param legacyQuoteMetadata - The {@link QuoteMetadata} values to merge
14
- * @param migrationPhase - The active {@link QuoteMetadataMigrationPhase}
15
- * @param currencyValues - The amounts in the user's currency, derived from the backend's `usd` values
16
14
  * @returns The {@link QuoteResponse} with the metadata merged in
17
15
  */
18
- function mergeQuoteMetadata(quoteResponse, legacyQuoteMetadata = {}, migrationPhase = types_js_1.QuoteMetadataMigrationPhase.V1Data, currencyValues) {
19
- const normalizedAmounts = (0, to_normalized_amounts_js_1.toNormalizedAmounts)(quoteResponse);
20
- if (migrationPhase === types_js_1.QuoteMetadataMigrationPhase.V2Only) {
21
- return (0, lodash_1.merge)({}, quoteResponse, normalizedAmounts, currencyValues);
16
+ function mergeQuoteMetadata(quoteResponse, legacyQuoteMetadata) {
17
+ if ((0, superstruct_1.is)(quoteResponse, quote_response_v1_js_1.QuoteResponseSchemaV1)) {
18
+ return (0, lodash_1.merge)({}, quoteResponse, legacyQuoteMetadata);
22
19
  }
23
20
  const legacyQuoteMetadataV2 = (0, to_quote_metadata_v2_js_1.toQuoteMetadataV2)(legacyQuoteMetadata, quoteResponse);
24
- // legacyQuoteMetadata is returned for testing purposes only
25
- if (migrationPhase === types_js_1.QuoteMetadataMigrationPhase.V2WithV1Fallback) {
26
- return (0, lodash_1.merge)({}, legacyQuoteMetadataV2, legacyQuoteMetadata, quoteResponse, normalizedAmounts, currencyValues);
27
- }
28
- const { quote, ...restQuoteResponse } = quoteResponse;
29
- const { feeData, ...restQuote } = quote ?? {};
30
- const txFeeGasParams = (0, include_if_truthy_js_1.includeIfTruthy)(feeData?.txFee?.[0], {
31
- maxFeePerGas: feeData?.txFee?.[0]?.maxFeePerGas,
32
- maxPriorityFeePerGas: feeData?.txFee?.[0]?.maxPriorityFeePerGas,
33
- });
34
- // Omit fields that should be replaced with legacy metadata values
35
- const sanitizedQuoteResponseV2 = {
36
- quote: {
37
- ...restQuote,
38
- ...(feeData?.metabridge || feeData?.txFee
39
- ? {
40
- feeData: {
41
- metabridge: feeData.metabridge,
42
- ...(0, include_if_truthy_js_1.includeIfTruthy)(txFeeGasParams, {
43
- txFee: txFeeGasParams ? [txFeeGasParams] : undefined,
44
- }),
45
- },
46
- }
47
- : {}),
48
- },
49
- };
50
- return (0, lodash_1.merge)({}, restQuoteResponse, sanitizedQuoteResponseV2, (0, to_normalized_amounts_js_1.toNormalizedAmounts)(sanitizedQuoteResponseV2), legacyQuoteMetadataV2, legacyQuoteMetadata);
21
+ const normalizedAmounts = (0, to_normalized_amounts_js_1.toNormalizedAmounts)(quoteResponse);
22
+ // Phase 1 of migration uses calcQuoteMetadata's results
23
+ return (0, lodash_1.merge)({}, quoteResponse, normalizedAmounts, legacyQuoteMetadataV2, // legacy metadata in v2 format
24
+ legacyQuoteMetadata);
51
25
  }
52
26
  exports.mergeQuoteMetadata = mergeQuoteMetadata;
53
27
  //# sourceMappingURL=merge.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge.cjs","sourceRoot":"","sources":["../../../src/utils/quote-metadata/merge.ts"],"names":[],"mappings":";;;AAAA,mCAA+B;AAI/B,0EAAiE;AACjE,wEAA8D;AAE9D,0CAAyD;AACzD,kEAAyD;AAEzD;;;;;;;;GAQG;AACH,SAAgB,kBAAkB,CAChC,aAA4B,EAC5B,sBAAqC,EAAE,EACvC,iBAA8C,sCAA2B,CAAC,MAAM,EAChF,cAA2C;IAE3C,MAAM,iBAAiB,GAAG,IAAA,8CAAmB,EAAC,aAAa,CAAC,CAAC;IAE7D,IAAI,cAAc,KAAK,sCAA2B,CAAC,MAAM,EAAE,CAAC;QAC1D,OAAO,IAAA,cAAK,EAAC,EAAE,EAAE,aAAa,EAAE,iBAAiB,EAAE,cAAc,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,qBAAqB,GAAG,IAAA,2CAAiB,EAC7C,mBAAmB,EACnB,aAAa,CACd,CAAC;IAEF,4DAA4D;IAC5D,IAAI,cAAc,KAAK,sCAA2B,CAAC,gBAAgB,EAAE,CAAC;QACpE,OAAO,IAAA,cAAK,EACV,EAAE,EACF,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,cAAc,CACf,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,iBAAiB,EAAE,GAAG,aAAa,CAAC;IACtD,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;IAC9C,MAAM,cAAc,GAAG,IAAA,sCAAe,EAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;QAC1D,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY;QAC/C,oBAAoB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,oBAAoB;KAChE,CAAC,CAAC;IAEH,kEAAkE;IAClE,MAAM,wBAAwB,GAAG;QAC/B,KAAK,EAAE;YACL,GAAG,SAAS;YACZ,GAAG,CAAC,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,KAAK;gBACvC,CAAC,CAAC;oBACE,OAAO,EAAE;wBACP,UAAU,EAAE,OAAO,CAAC,UAAU;wBAC9B,GAAG,IAAA,sCAAe,EAAC,cAAc,EAAE;4BACjC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS;yBACrD,CAAC;qBACH;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;SACR;KACF,CAAC;IACF,OAAO,IAAA,cAAK,EACV,EAAE,EACF,iBAAiB,EACjB,wBAAwB,EACxB,IAAA,8CAAmB,EAAC,wBAAwB,CAAC,EAC7C,qBAAqB,EACrB,mBAAmB,CACpB,CAAC;AACJ,CAAC;AA5DD,gDA4DC","sourcesContent":["import { merge } from 'lodash';\n\nimport type { DeepPartial } from '../../types.js';\nimport type { QuoteResponse } from '../../validators/quote-response.js';\nimport { toNormalizedAmounts } from './to-normalized-amounts.js';\nimport { toQuoteMetadataV2 } from './to-quote-metadata-v2.js';\nimport type { QuoteMetadata } from './types.js';\nimport { QuoteMetadataMigrationPhase } from './types.js';\nimport { includeIfTruthy } from './include-if-truthy.js';\n\n/**\n * Merges legacy {@link QuoteMetadata} values into the {@link QuoteResponse}\n *\n * @param quoteResponse - The {@link QuoteResponse} to merge the metadata into\n * @param legacyQuoteMetadata - The {@link QuoteMetadata} values to merge\n * @param migrationPhase - The active {@link QuoteMetadataMigrationPhase}\n * @param currencyValues - The amounts in the user's currency, derived from the backend's `usd` values\n * @returns The {@link QuoteResponse} with the metadata merged in\n */\nexport function mergeQuoteMetadata(\n quoteResponse: QuoteResponse,\n legacyQuoteMetadata: QuoteMetadata = {},\n migrationPhase: QuoteMetadataMigrationPhase = QuoteMetadataMigrationPhase.V1Data,\n currencyValues?: DeepPartial<QuoteResponse>,\n): QuoteResponse & QuoteMetadata {\n const normalizedAmounts = toNormalizedAmounts(quoteResponse);\n\n if (migrationPhase === QuoteMetadataMigrationPhase.V2Only) {\n return merge({}, quoteResponse, normalizedAmounts, currencyValues);\n }\n\n const legacyQuoteMetadataV2 = toQuoteMetadataV2(\n legacyQuoteMetadata,\n quoteResponse,\n );\n\n // legacyQuoteMetadata is returned for testing purposes only\n if (migrationPhase === QuoteMetadataMigrationPhase.V2WithV1Fallback) {\n return merge(\n {},\n legacyQuoteMetadataV2,\n legacyQuoteMetadata,\n quoteResponse,\n normalizedAmounts,\n currencyValues,\n );\n }\n\n const { quote, ...restQuoteResponse } = quoteResponse;\n const { feeData, ...restQuote } = quote ?? {};\n const txFeeGasParams = includeIfTruthy(feeData?.txFee?.[0], {\n maxFeePerGas: feeData?.txFee?.[0]?.maxFeePerGas,\n maxPriorityFeePerGas: feeData?.txFee?.[0]?.maxPriorityFeePerGas,\n });\n\n // Omit fields that should be replaced with legacy metadata values\n const sanitizedQuoteResponseV2 = {\n quote: {\n ...restQuote,\n ...(feeData?.metabridge || feeData?.txFee\n ? {\n feeData: {\n metabridge: feeData.metabridge,\n ...includeIfTruthy(txFeeGasParams, {\n txFee: txFeeGasParams ? [txFeeGasParams] : undefined,\n }),\n },\n }\n : {}),\n },\n };\n return merge(\n {},\n restQuoteResponse,\n sanitizedQuoteResponseV2,\n toNormalizedAmounts(sanitizedQuoteResponseV2),\n legacyQuoteMetadataV2,\n legacyQuoteMetadata,\n );\n}\n"]}
1
+ {"version":3,"file":"merge.cjs","sourceRoot":"","sources":["../../../src/utils/quote-metadata/merge.ts"],"names":[],"mappings":";;;AAAA,uDAA2C;AAC3C,mCAA+B;AAE/B,iFAA8E;AAG9E,0EAAiE;AACjE,wEAA8D;AAG9D;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAGhC,aAAwB,EACxB,mBAAkC;IAElC,IAAI,IAAA,gBAAE,EAAC,aAAa,EAAE,4CAAqB,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAA,cAAK,EAAC,EAAE,EAAE,aAAa,EAAE,mBAAmB,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,qBAAqB,GAAG,IAAA,2CAAiB,EAC7C,mBAAmB,EACnB,aAAa,CACd,CAAC;IAEF,MAAM,iBAAiB,GAAG,IAAA,8CAAmB,EAAC,aAAa,CAAC,CAAC;IAE7D,wDAAwD;IACxD,OAAO,IAAA,cAAK,EACV,EAAE,EACF,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EAAE,+BAA+B;IACtD,mBAAmB,CACpB,CAAC;AACJ,CAAC;AAzBD,gDAyBC","sourcesContent":["import { is } from '@metamask/superstruct';\nimport { merge } from 'lodash';\n\nimport { QuoteResponseSchemaV1 } from '../../validators/quote-response-v1.js';\nimport type { QuoteResponseV1 } from '../../validators/quote-response-v1.js';\nimport type { QuoteResponse } from '../../validators/quote-response.js';\nimport { toNormalizedAmounts } from './to-normalized-amounts.js';\nimport { toQuoteMetadataV2 } from './to-quote-metadata-v2.js';\nimport type { QuoteMetadata } from './types.js';\n\n/**\n * Merges legacy {@link QuoteMetadata} values into the {@link QuoteResponse}\n *\n * @param quoteResponse - The {@link QuoteResponse} or {@link QuoteResponseV1} to merge the metadata into\n * @param legacyQuoteMetadata - The {@link QuoteMetadata} values to merge\n * @returns The {@link QuoteResponse} with the metadata merged in\n */\nexport function mergeQuoteMetadata<\n QuoteType extends QuoteResponse | QuoteResponseV1 = QuoteResponse,\n>(\n quoteResponse: QuoteType,\n legacyQuoteMetadata: QuoteMetadata,\n): QuoteType & QuoteMetadata {\n if (is(quoteResponse, QuoteResponseSchemaV1)) {\n return merge({}, quoteResponse, legacyQuoteMetadata);\n }\n\n const legacyQuoteMetadataV2 = toQuoteMetadataV2(\n legacyQuoteMetadata,\n quoteResponse,\n );\n\n const normalizedAmounts = toNormalizedAmounts(quoteResponse);\n\n // Phase 1 of migration uses calcQuoteMetadata's results\n return merge(\n {},\n quoteResponse,\n normalizedAmounts,\n legacyQuoteMetadataV2, // legacy metadata in v2 format\n legacyQuoteMetadata, // return legacy metadata for client testing\n );\n}\n"]}
@@ -1,15 +1,12 @@
1
- import type { DeepPartial } from "../../types.cjs";
1
+ import type { QuoteResponseV1 } from "../../validators/quote-response-v1.cjs";
2
2
  import type { QuoteResponse } from "../../validators/quote-response.cjs";
3
3
  import type { QuoteMetadata } from "./types.cjs";
4
- import { QuoteMetadataMigrationPhase } from "./types.cjs";
5
4
  /**
6
5
  * Merges legacy {@link QuoteMetadata} values into the {@link QuoteResponse}
7
6
  *
8
- * @param quoteResponse - The {@link QuoteResponse} to merge the metadata into
7
+ * @param quoteResponse - The {@link QuoteResponse} or {@link QuoteResponseV1} to merge the metadata into
9
8
  * @param legacyQuoteMetadata - The {@link QuoteMetadata} values to merge
10
- * @param migrationPhase - The active {@link QuoteMetadataMigrationPhase}
11
- * @param currencyValues - The amounts in the user's currency, derived from the backend's `usd` values
12
9
  * @returns The {@link QuoteResponse} with the metadata merged in
13
10
  */
14
- export declare function mergeQuoteMetadata(quoteResponse: QuoteResponse, legacyQuoteMetadata?: QuoteMetadata, migrationPhase?: QuoteMetadataMigrationPhase, currencyValues?: DeepPartial<QuoteResponse>): QuoteResponse & QuoteMetadata;
11
+ export declare function mergeQuoteMetadata<QuoteType extends QuoteResponse | QuoteResponseV1 = QuoteResponse>(quoteResponse: QuoteType, legacyQuoteMetadata: QuoteMetadata): QuoteType & QuoteMetadata;
15
12
  //# sourceMappingURL=merge.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge.d.cts","sourceRoot":"","sources":["../../../src/utils/quote-metadata/merge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,wBAAuB;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,4CAA2C;AAGxE,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAmB;AAChD,OAAO,EAAE,2BAA2B,EAAE,oBAAmB;AAGzD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,aAAa,EAC5B,mBAAmB,GAAE,aAAkB,EACvC,cAAc,GAAE,2BAAgE,EAChF,cAAc,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,GAC1C,aAAa,GAAG,aAAa,CAuD/B"}
1
+ {"version":3,"file":"merge.d.cts","sourceRoot":"","sources":["../../../src/utils/quote-metadata/merge.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,+CAA8C;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,4CAA2C;AAGxE,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAmB;AAEhD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,SAAS,aAAa,GAAG,eAAe,GAAG,aAAa,EAEjE,aAAa,EAAE,SAAS,EACxB,mBAAmB,EAAE,aAAa,GACjC,SAAS,GAAG,aAAa,CAoB3B"}
@@ -1,15 +1,12 @@
1
- import type { DeepPartial } from "../../types.mjs";
1
+ import type { QuoteResponseV1 } from "../../validators/quote-response-v1.mjs";
2
2
  import type { QuoteResponse } from "../../validators/quote-response.mjs";
3
3
  import type { QuoteMetadata } from "./types.mjs";
4
- import { QuoteMetadataMigrationPhase } from "./types.mjs";
5
4
  /**
6
5
  * Merges legacy {@link QuoteMetadata} values into the {@link QuoteResponse}
7
6
  *
8
- * @param quoteResponse - The {@link QuoteResponse} to merge the metadata into
7
+ * @param quoteResponse - The {@link QuoteResponse} or {@link QuoteResponseV1} to merge the metadata into
9
8
  * @param legacyQuoteMetadata - The {@link QuoteMetadata} values to merge
10
- * @param migrationPhase - The active {@link QuoteMetadataMigrationPhase}
11
- * @param currencyValues - The amounts in the user's currency, derived from the backend's `usd` values
12
9
  * @returns The {@link QuoteResponse} with the metadata merged in
13
10
  */
14
- export declare function mergeQuoteMetadata(quoteResponse: QuoteResponse, legacyQuoteMetadata?: QuoteMetadata, migrationPhase?: QuoteMetadataMigrationPhase, currencyValues?: DeepPartial<QuoteResponse>): QuoteResponse & QuoteMetadata;
11
+ export declare function mergeQuoteMetadata<QuoteType extends QuoteResponse | QuoteResponseV1 = QuoteResponse>(quoteResponse: QuoteType, legacyQuoteMetadata: QuoteMetadata): QuoteType & QuoteMetadata;
15
12
  //# sourceMappingURL=merge.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge.d.mts","sourceRoot":"","sources":["../../../src/utils/quote-metadata/merge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,wBAAuB;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,4CAA2C;AAGxE,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAmB;AAChD,OAAO,EAAE,2BAA2B,EAAE,oBAAmB;AAGzD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,aAAa,EAC5B,mBAAmB,GAAE,aAAkB,EACvC,cAAc,GAAE,2BAAgE,EAChF,cAAc,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,GAC1C,aAAa,GAAG,aAAa,CAuD/B"}
1
+ {"version":3,"file":"merge.d.mts","sourceRoot":"","sources":["../../../src/utils/quote-metadata/merge.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,+CAA8C;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,4CAA2C;AAGxE,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAmB;AAEhD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,SAAS,aAAa,GAAG,eAAe,GAAG,aAAa,EAEjE,aAAa,EAAE,SAAS,EACxB,mBAAmB,EAAE,aAAa,GACjC,SAAS,GAAG,aAAa,CAoB3B"}
@@ -1,50 +1,24 @@
1
+ import { is } from "@metamask/superstruct";
1
2
  import $lodash from "lodash";
2
3
  const { merge } = $lodash;
4
+ import { QuoteResponseSchemaV1 } from "../../validators/quote-response-v1.mjs";
3
5
  import { toNormalizedAmounts } from "./to-normalized-amounts.mjs";
4
6
  import { toQuoteMetadataV2 } from "./to-quote-metadata-v2.mjs";
5
- import { QuoteMetadataMigrationPhase } from "./types.mjs";
6
- import { includeIfTruthy } from "./include-if-truthy.mjs";
7
7
  /**
8
8
  * Merges legacy {@link QuoteMetadata} values into the {@link QuoteResponse}
9
9
  *
10
- * @param quoteResponse - The {@link QuoteResponse} to merge the metadata into
10
+ * @param quoteResponse - The {@link QuoteResponse} or {@link QuoteResponseV1} to merge the metadata into
11
11
  * @param legacyQuoteMetadata - The {@link QuoteMetadata} values to merge
12
- * @param migrationPhase - The active {@link QuoteMetadataMigrationPhase}
13
- * @param currencyValues - The amounts in the user's currency, derived from the backend's `usd` values
14
12
  * @returns The {@link QuoteResponse} with the metadata merged in
15
13
  */
16
- export function mergeQuoteMetadata(quoteResponse, legacyQuoteMetadata = {}, migrationPhase = QuoteMetadataMigrationPhase.V1Data, currencyValues) {
17
- const normalizedAmounts = toNormalizedAmounts(quoteResponse);
18
- if (migrationPhase === QuoteMetadataMigrationPhase.V2Only) {
19
- return merge({}, quoteResponse, normalizedAmounts, currencyValues);
14
+ export function mergeQuoteMetadata(quoteResponse, legacyQuoteMetadata) {
15
+ if (is(quoteResponse, QuoteResponseSchemaV1)) {
16
+ return merge({}, quoteResponse, legacyQuoteMetadata);
20
17
  }
21
18
  const legacyQuoteMetadataV2 = toQuoteMetadataV2(legacyQuoteMetadata, quoteResponse);
22
- // legacyQuoteMetadata is returned for testing purposes only
23
- if (migrationPhase === QuoteMetadataMigrationPhase.V2WithV1Fallback) {
24
- return merge({}, legacyQuoteMetadataV2, legacyQuoteMetadata, quoteResponse, normalizedAmounts, currencyValues);
25
- }
26
- const { quote, ...restQuoteResponse } = quoteResponse;
27
- const { feeData, ...restQuote } = quote ?? {};
28
- const txFeeGasParams = includeIfTruthy(feeData?.txFee?.[0], {
29
- maxFeePerGas: feeData?.txFee?.[0]?.maxFeePerGas,
30
- maxPriorityFeePerGas: feeData?.txFee?.[0]?.maxPriorityFeePerGas,
31
- });
32
- // Omit fields that should be replaced with legacy metadata values
33
- const sanitizedQuoteResponseV2 = {
34
- quote: {
35
- ...restQuote,
36
- ...(feeData?.metabridge || feeData?.txFee
37
- ? {
38
- feeData: {
39
- metabridge: feeData.metabridge,
40
- ...includeIfTruthy(txFeeGasParams, {
41
- txFee: txFeeGasParams ? [txFeeGasParams] : undefined,
42
- }),
43
- },
44
- }
45
- : {}),
46
- },
47
- };
48
- return merge({}, restQuoteResponse, sanitizedQuoteResponseV2, toNormalizedAmounts(sanitizedQuoteResponseV2), legacyQuoteMetadataV2, legacyQuoteMetadata);
19
+ const normalizedAmounts = toNormalizedAmounts(quoteResponse);
20
+ // Phase 1 of migration uses calcQuoteMetadata's results
21
+ return merge({}, quoteResponse, normalizedAmounts, legacyQuoteMetadataV2, // legacy metadata in v2 format
22
+ legacyQuoteMetadata);
49
23
  }
50
24
  //# sourceMappingURL=merge.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge.mjs","sourceRoot":"","sources":["../../../src/utils/quote-metadata/merge.ts"],"names":[],"mappings":";;AAIA,OAAO,EAAE,mBAAmB,EAAE,oCAAmC;AACjE,OAAO,EAAE,iBAAiB,EAAE,mCAAkC;AAE9D,OAAO,EAAE,2BAA2B,EAAE,oBAAmB;AACzD,OAAO,EAAE,eAAe,EAAE,gCAA+B;AAEzD;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAChC,aAA4B,EAC5B,sBAAqC,EAAE,EACvC,iBAA8C,2BAA2B,CAAC,MAAM,EAChF,cAA2C;IAE3C,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAE7D,IAAI,cAAc,KAAK,2BAA2B,CAAC,MAAM,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAC,EAAE,EAAE,aAAa,EAAE,iBAAiB,EAAE,cAAc,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,qBAAqB,GAAG,iBAAiB,CAC7C,mBAAmB,EACnB,aAAa,CACd,CAAC;IAEF,4DAA4D;IAC5D,IAAI,cAAc,KAAK,2BAA2B,CAAC,gBAAgB,EAAE,CAAC;QACpE,OAAO,KAAK,CACV,EAAE,EACF,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,cAAc,CACf,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,iBAAiB,EAAE,GAAG,aAAa,CAAC;IACtD,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;IAC9C,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;QAC1D,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY;QAC/C,oBAAoB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,oBAAoB;KAChE,CAAC,CAAC;IAEH,kEAAkE;IAClE,MAAM,wBAAwB,GAAG;QAC/B,KAAK,EAAE;YACL,GAAG,SAAS;YACZ,GAAG,CAAC,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,KAAK;gBACvC,CAAC,CAAC;oBACE,OAAO,EAAE;wBACP,UAAU,EAAE,OAAO,CAAC,UAAU;wBAC9B,GAAG,eAAe,CAAC,cAAc,EAAE;4BACjC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS;yBACrD,CAAC;qBACH;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;SACR;KACF,CAAC;IACF,OAAO,KAAK,CACV,EAAE,EACF,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,CAAC,wBAAwB,CAAC,EAC7C,qBAAqB,EACrB,mBAAmB,CACpB,CAAC;AACJ,CAAC","sourcesContent":["import { merge } from 'lodash';\n\nimport type { DeepPartial } from '../../types.js';\nimport type { QuoteResponse } from '../../validators/quote-response.js';\nimport { toNormalizedAmounts } from './to-normalized-amounts.js';\nimport { toQuoteMetadataV2 } from './to-quote-metadata-v2.js';\nimport type { QuoteMetadata } from './types.js';\nimport { QuoteMetadataMigrationPhase } from './types.js';\nimport { includeIfTruthy } from './include-if-truthy.js';\n\n/**\n * Merges legacy {@link QuoteMetadata} values into the {@link QuoteResponse}\n *\n * @param quoteResponse - The {@link QuoteResponse} to merge the metadata into\n * @param legacyQuoteMetadata - The {@link QuoteMetadata} values to merge\n * @param migrationPhase - The active {@link QuoteMetadataMigrationPhase}\n * @param currencyValues - The amounts in the user's currency, derived from the backend's `usd` values\n * @returns The {@link QuoteResponse} with the metadata merged in\n */\nexport function mergeQuoteMetadata(\n quoteResponse: QuoteResponse,\n legacyQuoteMetadata: QuoteMetadata = {},\n migrationPhase: QuoteMetadataMigrationPhase = QuoteMetadataMigrationPhase.V1Data,\n currencyValues?: DeepPartial<QuoteResponse>,\n): QuoteResponse & QuoteMetadata {\n const normalizedAmounts = toNormalizedAmounts(quoteResponse);\n\n if (migrationPhase === QuoteMetadataMigrationPhase.V2Only) {\n return merge({}, quoteResponse, normalizedAmounts, currencyValues);\n }\n\n const legacyQuoteMetadataV2 = toQuoteMetadataV2(\n legacyQuoteMetadata,\n quoteResponse,\n );\n\n // legacyQuoteMetadata is returned for testing purposes only\n if (migrationPhase === QuoteMetadataMigrationPhase.V2WithV1Fallback) {\n return merge(\n {},\n legacyQuoteMetadataV2,\n legacyQuoteMetadata,\n quoteResponse,\n normalizedAmounts,\n currencyValues,\n );\n }\n\n const { quote, ...restQuoteResponse } = quoteResponse;\n const { feeData, ...restQuote } = quote ?? {};\n const txFeeGasParams = includeIfTruthy(feeData?.txFee?.[0], {\n maxFeePerGas: feeData?.txFee?.[0]?.maxFeePerGas,\n maxPriorityFeePerGas: feeData?.txFee?.[0]?.maxPriorityFeePerGas,\n });\n\n // Omit fields that should be replaced with legacy metadata values\n const sanitizedQuoteResponseV2 = {\n quote: {\n ...restQuote,\n ...(feeData?.metabridge || feeData?.txFee\n ? {\n feeData: {\n metabridge: feeData.metabridge,\n ...includeIfTruthy(txFeeGasParams, {\n txFee: txFeeGasParams ? [txFeeGasParams] : undefined,\n }),\n },\n }\n : {}),\n },\n };\n return merge(\n {},\n restQuoteResponse,\n sanitizedQuoteResponseV2,\n toNormalizedAmounts(sanitizedQuoteResponseV2),\n legacyQuoteMetadataV2,\n legacyQuoteMetadata,\n );\n}\n"]}
1
+ {"version":3,"file":"merge.mjs","sourceRoot":"","sources":["../../../src/utils/quote-metadata/merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,8BAA8B;;;AAG3C,OAAO,EAAE,qBAAqB,EAAE,+CAA8C;AAG9E,OAAO,EAAE,mBAAmB,EAAE,oCAAmC;AACjE,OAAO,EAAE,iBAAiB,EAAE,mCAAkC;AAG9D;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAGhC,aAAwB,EACxB,mBAAkC;IAElC,IAAI,EAAE,CAAC,aAAa,EAAE,qBAAqB,CAAC,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC,EAAE,EAAE,aAAa,EAAE,mBAAmB,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,qBAAqB,GAAG,iBAAiB,CAC7C,mBAAmB,EACnB,aAAa,CACd,CAAC;IAEF,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAE7D,wDAAwD;IACxD,OAAO,KAAK,CACV,EAAE,EACF,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EAAE,+BAA+B;IACtD,mBAAmB,CACpB,CAAC;AACJ,CAAC","sourcesContent":["import { is } from '@metamask/superstruct';\nimport { merge } from 'lodash';\n\nimport { QuoteResponseSchemaV1 } from '../../validators/quote-response-v1.js';\nimport type { QuoteResponseV1 } from '../../validators/quote-response-v1.js';\nimport type { QuoteResponse } from '../../validators/quote-response.js';\nimport { toNormalizedAmounts } from './to-normalized-amounts.js';\nimport { toQuoteMetadataV2 } from './to-quote-metadata-v2.js';\nimport type { QuoteMetadata } from './types.js';\n\n/**\n * Merges legacy {@link QuoteMetadata} values into the {@link QuoteResponse}\n *\n * @param quoteResponse - The {@link QuoteResponse} or {@link QuoteResponseV1} to merge the metadata into\n * @param legacyQuoteMetadata - The {@link QuoteMetadata} values to merge\n * @returns The {@link QuoteResponse} with the metadata merged in\n */\nexport function mergeQuoteMetadata<\n QuoteType extends QuoteResponse | QuoteResponseV1 = QuoteResponse,\n>(\n quoteResponse: QuoteType,\n legacyQuoteMetadata: QuoteMetadata,\n): QuoteType & QuoteMetadata {\n if (is(quoteResponse, QuoteResponseSchemaV1)) {\n return merge({}, quoteResponse, legacyQuoteMetadata);\n }\n\n const legacyQuoteMetadataV2 = toQuoteMetadataV2(\n legacyQuoteMetadata,\n quoteResponse,\n );\n\n const normalizedAmounts = toNormalizedAmounts(quoteResponse);\n\n // Phase 1 of migration uses calcQuoteMetadata's results\n return merge(\n {},\n quoteResponse,\n normalizedAmounts,\n legacyQuoteMetadataV2, // legacy metadata in v2 format\n legacyQuoteMetadata, // return legacy metadata for client testing\n );\n}\n"]}
@@ -2,18 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.toQuoteMetadataV1 = void 0;
4
4
  const lodash_1 = require("lodash");
5
- const number_formatters_js_1 = require("../number-formatters.cjs");
6
- const include_if_truthy_js_1 = require("./include-if-truthy.cjs");
7
- const types_js_1 = require("./types.cjs");
8
5
  /**
9
6
  * Extracts legacy {@link QuoteMetadata} values from a {@link QuoteResponse} or {@link QuoteResponseV1}.
10
7
  * If a QuoteResponse is provided, this assumes that its `valueInCurrency` properties are set.
11
8
  *
12
9
  * @param quoteResponse - The quote to extract the metadata from
13
- * @param migrationPhase - The migration phase to use
14
10
  * @returns A partial {@link QuoteMetadata} object
15
11
  */
16
- const toQuoteMetadataV1 = (quoteResponse, migrationPhase = types_js_1.QuoteMetadataMigrationPhase.V1Data) => {
12
+ const toQuoteMetadataV1 = (quoteResponse) => {
17
13
  /* istanbul ignore if */
18
14
  if (!quoteResponse) {
19
15
  return {};
@@ -26,67 +22,22 @@ const toQuoteMetadataV1 = (quoteResponse, migrationPhase = types_js_1.QuoteMetad
26
22
  swapRate,
27
23
  gasFee,
28
24
  totalNetworkFee,
29
- ...(0, include_if_truthy_js_1.includeIfTruthy)(adjustedReturn, { adjustedReturn }),
30
- ...(0, include_if_truthy_js_1.includeIfTruthy)(cost, { cost }),
31
- ...(0, include_if_truthy_js_1.includeIfTruthy)(priceImpact, { priceImpact }),
32
- ...(0, include_if_truthy_js_1.includeIfTruthy)(relayerFee, { relayerFee }),
33
- ...(0, include_if_truthy_js_1.includeIfTruthy)(includedTxFees, { includedTxFees }),
25
+ ...(adjustedReturn && Object.values(adjustedReturn).some(Boolean)
26
+ ? { adjustedReturn }
27
+ : {}),
28
+ ...(cost && Object.values(cost).some(Boolean) ? { cost } : {}),
29
+ ...(priceImpact && Object.values(priceImpact).some(Boolean)
30
+ ? { priceImpact }
31
+ : {}),
32
+ ...(relayerFee && Object.values(relayerFee).some(Boolean)
33
+ ? { relayerFee }
34
+ : {}),
35
+ ...(includedTxFees && Object.values(includedTxFees).some(Boolean)
36
+ ? { includedTxFees }
37
+ : {}),
34
38
  };
35
- if (migrationPhase === types_js_1.QuoteMetadataMigrationPhase.V1Data ||
36
- // Shallow check for the presence of the `src` property
37
- !Object.prototype.hasOwnProperty.call(quoteResponse.quote ?? {}, 'src')) {
38
- return legacyMetadata;
39
- }
40
- const { quote: { src, dest, priceData, feeData: { network, relayer, txFee }, }, } = quoteResponse;
41
- const totalNetworkFeeV2 = (0, number_formatters_js_1.sumAmounts)(network, relayer);
42
- const toTokenAmountValues = (data) => {
43
- return {
44
- amount: data?.normalizedAmount,
45
- usd: data?.usd,
46
- valueInCurrency: data?.valueInCurrency,
47
- };
48
- };
49
- // Build V1 from V2 quote
50
- const v2Metadata = {
51
- ...(0, include_if_truthy_js_1.includeIfTruthy)(src, {
52
- sentAmount: toTokenAmountValues(src),
53
- }),
54
- ...(0, include_if_truthy_js_1.includeIfTruthy)(dest, {
55
- toTokenAmount: toTokenAmountValues(dest),
56
- minToTokenAmount: {
57
- amount: dest.minAmountNormalized,
58
- valueInCurrency: dest.minAmountValueInCurrency,
59
- usd: dest.minAmountUsd,
60
- },
61
- }),
62
- ...(priceData?.swapRate && { swapRate: priceData.swapRate }),
63
- ...(0, include_if_truthy_js_1.includeIfTruthy)(priceData?.adjustedReturn, {
64
- adjustedReturn: toTokenAmountValues(priceData?.adjustedReturn),
65
- }),
66
- ...(0, include_if_truthy_js_1.includeIfTruthy)(network?.[0], {
67
- gasFee: {
68
- total: toTokenAmountValues(network?.[0]),
69
- },
70
- }),
71
- ...(0, include_if_truthy_js_1.includeIfTruthy)(totalNetworkFeeV2, {
72
- totalNetworkFee: toTokenAmountValues(totalNetworkFeeV2),
73
- }),
74
- ...(priceData?.priceImpact && {
75
- priceImpact: toTokenAmountValues(priceData?.priceImpact),
76
- // Use priceImpact as cost
77
- cost: toTokenAmountValues(priceData?.priceImpact),
78
- }),
79
- ...(0, include_if_truthy_js_1.includeIfTruthy)(relayer?.[0], {
80
- relayerFee: toTokenAmountValues(relayer?.[0]),
81
- }),
82
- ...(0, include_if_truthy_js_1.includeIfTruthy)(txFee?.[0], {
83
- includedTxFees: toTokenAmountValues(txFee?.[0]),
84
- }),
85
- };
86
- if (migrationPhase === types_js_1.QuoteMetadataMigrationPhase.V2WithV1Fallback) {
87
- return (0, lodash_1.merge)({}, legacyMetadata, v2Metadata);
88
- }
89
- return v2Metadata;
39
+ // Phase 1 only uses legacyMetadata
40
+ return (0, lodash_1.merge)({}, legacyMetadata);
90
41
  };
91
42
  exports.toQuoteMetadataV1 = toQuoteMetadataV1;
92
43
  //# sourceMappingURL=to-quote-metadata-v1.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"to-quote-metadata-v1.cjs","sourceRoot":"","sources":["../../../src/utils/quote-metadata/to-quote-metadata-v1.ts"],"names":[],"mappings":"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","sourcesContent":["import { merge } from 'lodash';\n\nimport type { DeepPartial } from '../../types.js';\nimport type { AmountsAndAsset } from '../../validators/amount-and-asset.js';\nimport type { QuoteResponseV1 } from '../../validators/quote-response-v1.js';\nimport type { QuoteResponse } from '../../validators/quote-response.js';\nimport { sumAmounts } from '../number-formatters.js';\nimport { includeIfTruthy } from './include-if-truthy.js';\nimport type { QuoteMetadata, TokenAmountValues } from './types.js';\nimport { QuoteMetadataMigrationPhase } from './types.js';\n\n/**\n * Extracts legacy {@link QuoteMetadata} values from a {@link QuoteResponse} or {@link QuoteResponseV1}.\n * If a QuoteResponse is provided, this assumes that its `valueInCurrency` properties are set.\n *\n * @param quoteResponse - The quote to extract the metadata from\n * @param migrationPhase - The migration phase to use\n * @returns A partial {@link QuoteMetadata} object\n */\nexport const toQuoteMetadataV1 = (\n quoteResponse:\n | (DeepPartial<QuoteResponse | QuoteResponseV1> & QuoteMetadata)\n | null,\n migrationPhase: QuoteMetadataMigrationPhase = QuoteMetadataMigrationPhase.V1Data,\n): QuoteMetadata => {\n /* istanbul ignore if */\n if (!quoteResponse) {\n return {};\n }\n\n const {\n toTokenAmount,\n minToTokenAmount,\n sentAmount,\n swapRate,\n adjustedReturn,\n cost,\n includedTxFees,\n relayerFee,\n totalNetworkFee,\n gasFee,\n priceImpact,\n } = quoteResponse;\n\n const legacyMetadata = {\n sentAmount,\n toTokenAmount,\n minToTokenAmount,\n swapRate,\n gasFee,\n totalNetworkFee,\n ...includeIfTruthy(adjustedReturn, { adjustedReturn }),\n ...includeIfTruthy(cost, { cost }),\n ...includeIfTruthy(priceImpact, { priceImpact }),\n ...includeIfTruthy(relayerFee, { relayerFee }),\n ...includeIfTruthy(includedTxFees, { includedTxFees }),\n };\n\n if (\n migrationPhase === QuoteMetadataMigrationPhase.V1Data ||\n // Shallow check for the presence of the `src` property\n !Object.prototype.hasOwnProperty.call(quoteResponse.quote ?? {}, 'src')\n ) {\n return legacyMetadata;\n }\n\n const {\n quote: {\n src,\n dest,\n priceData,\n feeData: { network, relayer, txFee },\n },\n } = quoteResponse as QuoteResponse;\n\n const totalNetworkFeeV2 = sumAmounts(network, relayer);\n\n const toTokenAmountValues = (\n data?: Pick<\n AmountsAndAsset,\n 'normalizedAmount' | 'usd' | 'valueInCurrency'\n >,\n ): Partial<TokenAmountValues> => {\n return {\n amount: data?.normalizedAmount,\n usd: data?.usd,\n valueInCurrency: data?.valueInCurrency,\n };\n };\n\n // Build V1 from V2 quote\n const v2Metadata: QuoteMetadata = {\n ...includeIfTruthy(src, {\n sentAmount: toTokenAmountValues(src),\n }),\n ...includeIfTruthy(dest, {\n toTokenAmount: toTokenAmountValues(dest),\n minToTokenAmount: {\n amount: dest.minAmountNormalized,\n valueInCurrency: dest.minAmountValueInCurrency,\n usd: dest.minAmountUsd,\n },\n }),\n ...(priceData?.swapRate && { swapRate: priceData.swapRate }),\n ...includeIfTruthy(priceData?.adjustedReturn, {\n adjustedReturn: toTokenAmountValues(priceData?.adjustedReturn),\n }),\n ...includeIfTruthy(network?.[0], {\n gasFee: {\n total: toTokenAmountValues(network?.[0]),\n },\n }),\n ...includeIfTruthy(totalNetworkFeeV2, {\n totalNetworkFee: toTokenAmountValues(totalNetworkFeeV2),\n }),\n ...(priceData?.priceImpact && {\n priceImpact: toTokenAmountValues(priceData?.priceImpact),\n // Use priceImpact as cost\n cost: toTokenAmountValues(priceData?.priceImpact),\n }),\n ...includeIfTruthy(relayer?.[0], {\n relayerFee: toTokenAmountValues(relayer?.[0]),\n }),\n ...includeIfTruthy(txFee?.[0], {\n includedTxFees: toTokenAmountValues(txFee?.[0]),\n }),\n };\n\n if (migrationPhase === QuoteMetadataMigrationPhase.V2WithV1Fallback) {\n return merge({}, legacyMetadata, v2Metadata);\n }\n\n return v2Metadata;\n};\n"]}
1
+ {"version":3,"file":"to-quote-metadata-v1.cjs","sourceRoot":"","sources":["../../../src/utils/quote-metadata/to-quote-metadata-v1.ts"],"names":[],"mappings":";;;AAAA,mCAA+B;AAO/B;;;;;;GAMG;AACI,MAAM,iBAAiB,GAAG,CAC/B,aAEQ,EACO,EAAE;IACjB,wBAAwB;IACxB,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,EACJ,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,QAAQ,EACR,cAAc,EACd,IAAI,EACJ,cAAc,EACd,UAAU,EACV,eAAe,EACf,MAAM,EACN,WAAW,GACZ,GAAG,aAAa,CAAC;IAElB,MAAM,cAAc,GAAG;QACrB,UAAU;QACV,aAAa;QACb,gBAAgB;QAChB,QAAQ;QACR,MAAM;QACN,eAAe;QACf,GAAG,CAAC,cAAc,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YAC/D,CAAC,CAAC,EAAE,cAAc,EAAE;YACpB,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YACzD,CAAC,CAAC,EAAE,WAAW,EAAE;YACjB,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YACvD,CAAC,CAAC,EAAE,UAAU,EAAE;YAChB,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,cAAc,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YAC/D,CAAC,CAAC,EAAE,cAAc,EAAE;YACpB,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,mCAAmC;IACnC,OAAO,IAAA,cAAK,EAAC,EAAE,EAAE,cAAc,CAAC,CAAC;AACnC,CAAC,CAAC;AAhDW,QAAA,iBAAiB,qBAgD5B","sourcesContent":["import { merge } from 'lodash';\n\nimport type { DeepPartial } from '../../types.js';\nimport type { QuoteResponseV1 } from '../../validators/quote-response-v1.js';\nimport type { QuoteResponse } from '../../validators/quote-response.js';\nimport type { QuoteMetadata } from './types.js';\n\n/**\n * Extracts legacy {@link QuoteMetadata} values from a {@link QuoteResponse} or {@link QuoteResponseV1}.\n * If a QuoteResponse is provided, this assumes that its `valueInCurrency` properties are set.\n *\n * @param quoteResponse - The quote to extract the metadata from\n * @returns A partial {@link QuoteMetadata} object\n */\nexport const toQuoteMetadataV1 = (\n quoteResponse:\n | (DeepPartial<QuoteResponse | QuoteResponseV1> & QuoteMetadata)\n | null,\n): QuoteMetadata => {\n /* istanbul ignore if */\n if (!quoteResponse) {\n return {};\n }\n\n const {\n toTokenAmount,\n minToTokenAmount,\n sentAmount,\n swapRate,\n adjustedReturn,\n cost,\n includedTxFees,\n relayerFee,\n totalNetworkFee,\n gasFee,\n priceImpact,\n } = quoteResponse;\n\n const legacyMetadata = {\n sentAmount,\n toTokenAmount,\n minToTokenAmount,\n swapRate,\n gasFee,\n totalNetworkFee,\n ...(adjustedReturn && Object.values(adjustedReturn).some(Boolean)\n ? { adjustedReturn }\n : {}),\n ...(cost && Object.values(cost).some(Boolean) ? { cost } : {}),\n ...(priceImpact && Object.values(priceImpact).some(Boolean)\n ? { priceImpact }\n : {}),\n ...(relayerFee && Object.values(relayerFee).some(Boolean)\n ? { relayerFee }\n : {}),\n ...(includedTxFees && Object.values(includedTxFees).some(Boolean)\n ? { includedTxFees }\n : {}),\n };\n\n // Phase 1 only uses legacyMetadata\n return merge({}, legacyMetadata);\n};\n"]}
@@ -2,14 +2,12 @@ import type { DeepPartial } from "../../types.cjs";
2
2
  import type { QuoteResponseV1 } from "../../validators/quote-response-v1.cjs";
3
3
  import type { QuoteResponse } from "../../validators/quote-response.cjs";
4
4
  import type { QuoteMetadata } from "./types.cjs";
5
- import { QuoteMetadataMigrationPhase } from "./types.cjs";
6
5
  /**
7
6
  * Extracts legacy {@link QuoteMetadata} values from a {@link QuoteResponse} or {@link QuoteResponseV1}.
8
7
  * If a QuoteResponse is provided, this assumes that its `valueInCurrency` properties are set.
9
8
  *
10
9
  * @param quoteResponse - The quote to extract the metadata from
11
- * @param migrationPhase - The migration phase to use
12
10
  * @returns A partial {@link QuoteMetadata} object
13
11
  */
14
- export declare const toQuoteMetadataV1: (quoteResponse: (DeepPartial<QuoteResponse | QuoteResponseV1> & QuoteMetadata) | null, migrationPhase?: QuoteMetadataMigrationPhase) => QuoteMetadata;
12
+ export declare const toQuoteMetadataV1: (quoteResponse: (DeepPartial<QuoteResponse | QuoteResponseV1> & QuoteMetadata) | null) => QuoteMetadata;
15
13
  //# sourceMappingURL=to-quote-metadata-v1.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"to-quote-metadata-v1.d.cts","sourceRoot":"","sources":["../../../src/utils/quote-metadata/to-quote-metadata-v1.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,wBAAuB;AAElD,OAAO,KAAK,EAAE,eAAe,EAAE,+CAA8C;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,4CAA2C;AAGxE,OAAO,KAAK,EAAE,aAAa,EAAqB,oBAAmB;AACnE,OAAO,EAAE,2BAA2B,EAAE,oBAAmB;AAEzD;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,kBAExB,CAAC,YAAY,aAAa,GAAG,eAAe,CAAC,GAAG,aAAa,CAAC,GAC9D,IAAI,mBACQ,2BAA2B,KAC1C,aA6GF,CAAC"}
1
+ {"version":3,"file":"to-quote-metadata-v1.d.cts","sourceRoot":"","sources":["../../../src/utils/quote-metadata/to-quote-metadata-v1.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,wBAAuB;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,+CAA8C;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,4CAA2C;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAmB;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,kBAExB,CAAC,YAAY,aAAa,GAAG,eAAe,CAAC,GAAG,aAAa,CAAC,GAC9D,IAAI,KACP,aA4CF,CAAC"}
@@ -2,14 +2,12 @@ import type { DeepPartial } from "../../types.mjs";
2
2
  import type { QuoteResponseV1 } from "../../validators/quote-response-v1.mjs";
3
3
  import type { QuoteResponse } from "../../validators/quote-response.mjs";
4
4
  import type { QuoteMetadata } from "./types.mjs";
5
- import { QuoteMetadataMigrationPhase } from "./types.mjs";
6
5
  /**
7
6
  * Extracts legacy {@link QuoteMetadata} values from a {@link QuoteResponse} or {@link QuoteResponseV1}.
8
7
  * If a QuoteResponse is provided, this assumes that its `valueInCurrency` properties are set.
9
8
  *
10
9
  * @param quoteResponse - The quote to extract the metadata from
11
- * @param migrationPhase - The migration phase to use
12
10
  * @returns A partial {@link QuoteMetadata} object
13
11
  */
14
- export declare const toQuoteMetadataV1: (quoteResponse: (DeepPartial<QuoteResponse | QuoteResponseV1> & QuoteMetadata) | null, migrationPhase?: QuoteMetadataMigrationPhase) => QuoteMetadata;
12
+ export declare const toQuoteMetadataV1: (quoteResponse: (DeepPartial<QuoteResponse | QuoteResponseV1> & QuoteMetadata) | null) => QuoteMetadata;
15
13
  //# sourceMappingURL=to-quote-metadata-v1.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"to-quote-metadata-v1.d.mts","sourceRoot":"","sources":["../../../src/utils/quote-metadata/to-quote-metadata-v1.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,wBAAuB;AAElD,OAAO,KAAK,EAAE,eAAe,EAAE,+CAA8C;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,4CAA2C;AAGxE,OAAO,KAAK,EAAE,aAAa,EAAqB,oBAAmB;AACnE,OAAO,EAAE,2BAA2B,EAAE,oBAAmB;AAEzD;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,kBAExB,CAAC,YAAY,aAAa,GAAG,eAAe,CAAC,GAAG,aAAa,CAAC,GAC9D,IAAI,mBACQ,2BAA2B,KAC1C,aA6GF,CAAC"}
1
+ {"version":3,"file":"to-quote-metadata-v1.d.mts","sourceRoot":"","sources":["../../../src/utils/quote-metadata/to-quote-metadata-v1.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,wBAAuB;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,+CAA8C;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,4CAA2C;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAmB;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,kBAExB,CAAC,YAAY,aAAa,GAAG,eAAe,CAAC,GAAG,aAAa,CAAC,GAC9D,IAAI,KACP,aA4CF,CAAC"}