@metamask/bridge-controller 71.1.1 → 72.0.0

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 (66) hide show
  1. package/CHANGELOG.md +19 -1
  2. package/dist/bridge-controller.cjs +150 -102
  3. package/dist/bridge-controller.cjs.map +1 -1
  4. package/dist/bridge-controller.d.cts +14 -4
  5. package/dist/bridge-controller.d.cts.map +1 -1
  6. package/dist/bridge-controller.d.mts +14 -4
  7. package/dist/bridge-controller.d.mts.map +1 -1
  8. package/dist/bridge-controller.mjs +151 -103
  9. package/dist/bridge-controller.mjs.map +1 -1
  10. package/dist/constants/bridge.cjs +5 -3
  11. package/dist/constants/bridge.cjs.map +1 -1
  12. package/dist/constants/bridge.d.cts.map +1 -1
  13. package/dist/constants/bridge.d.mts.map +1 -1
  14. package/dist/constants/bridge.mjs +5 -3
  15. package/dist/constants/bridge.mjs.map +1 -1
  16. package/dist/constants/traces.cjs +1 -0
  17. package/dist/constants/traces.cjs.map +1 -1
  18. package/dist/constants/traces.d.cts +1 -0
  19. package/dist/constants/traces.d.cts.map +1 -1
  20. package/dist/constants/traces.d.mts +1 -0
  21. package/dist/constants/traces.d.mts.map +1 -1
  22. package/dist/constants/traces.mjs +1 -0
  23. package/dist/constants/traces.mjs.map +1 -1
  24. package/dist/index.cjs +4 -2
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.cts +2 -2
  27. package/dist/index.d.cts.map +1 -1
  28. package/dist/index.d.mts +2 -2
  29. package/dist/index.d.mts.map +1 -1
  30. package/dist/index.mjs +2 -2
  31. package/dist/index.mjs.map +1 -1
  32. package/dist/selectors.cjs +89 -33
  33. package/dist/selectors.cjs.map +1 -1
  34. package/dist/selectors.d.cts +7163 -76
  35. package/dist/selectors.d.cts.map +1 -1
  36. package/dist/selectors.d.mts +7163 -76
  37. package/dist/selectors.d.mts.map +1 -1
  38. package/dist/selectors.mjs +88 -32
  39. package/dist/selectors.mjs.map +1 -1
  40. package/dist/types.cjs.map +1 -1
  41. package/dist/types.d.cts +6 -1
  42. package/dist/types.d.cts.map +1 -1
  43. package/dist/types.d.mts +6 -1
  44. package/dist/types.d.mts.map +1 -1
  45. package/dist/types.mjs.map +1 -1
  46. package/dist/utils/fetch.cjs +61 -17
  47. package/dist/utils/fetch.cjs.map +1 -1
  48. package/dist/utils/fetch.d.cts +3 -4
  49. package/dist/utils/fetch.d.cts.map +1 -1
  50. package/dist/utils/fetch.d.mts +3 -4
  51. package/dist/utils/fetch.d.mts.map +1 -1
  52. package/dist/utils/fetch.mjs +62 -18
  53. package/dist/utils/fetch.mjs.map +1 -1
  54. package/dist/utils/metrics/properties.cjs +1 -1
  55. package/dist/utils/metrics/properties.cjs.map +1 -1
  56. package/dist/utils/metrics/properties.mjs +1 -1
  57. package/dist/utils/metrics/properties.mjs.map +1 -1
  58. package/dist/utils/quote.cjs +3 -1
  59. package/dist/utils/quote.cjs.map +1 -1
  60. package/dist/utils/quote.d.cts +1 -0
  61. package/dist/utils/quote.d.cts.map +1 -1
  62. package/dist/utils/quote.d.mts +1 -0
  63. package/dist/utils/quote.d.mts.map +1 -1
  64. package/dist/utils/quote.mjs +1 -0
  65. package/dist/utils/quote.mjs.map +1 -1
  66. package/package.json +3 -3
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable @typescript-eslint/explicit-function-return-type */
2
2
  import { StructError } from "@metamask/superstruct";
3
3
  import { getEthUsdtResetData } from "./bridge.mjs";
4
- import { formatAddressToCaipReference, formatChainIdToDec } from "./caip-formatters.mjs";
4
+ import { formatAddressToAssetId, formatAddressToCaipReference, formatChainIdToDec } from "./caip-formatters.mjs";
5
5
  import { fetchServerEvents } from "./fetch-server-events.mjs";
6
6
  import { isEvmTxData } from "./trade-utils.mjs";
7
7
  import { validateQuoteResponse, validateSwapsTokenObject, validateTokenFeature, validateQuoteStreamComplete } from "./validators.mjs";
@@ -40,12 +40,12 @@ export async function fetchBridgeTokens(chainId, clientId, jwt, fetchFn, bridgeA
40
40
  return transformedTokens;
41
41
  }
42
42
  /**
43
- * Converts the generic quote request to the type that the bridge-api expects
43
+ * Converts the generic quote request to QuoteRequest
44
44
  *
45
45
  * @param request - The quote request
46
- * @returns A URLSearchParams object with the query parameters
46
+ * @returns A QuoteRequest object
47
47
  */
48
- const formatQueryParams = (request) => {
48
+ const formatQuoteRequest = (request) => {
49
49
  const destWalletAddress = request.destWalletAddress ?? request.walletAddress;
50
50
  // Transform the generic quote request into QuoteRequest
51
51
  const normalizedRequest = {
@@ -73,6 +73,15 @@ const formatQueryParams = (request) => {
73
73
  if (request.bridgeIds && request.bridgeIds.length > 0) {
74
74
  normalizedRequest.bridgeIds = request.bridgeIds;
75
75
  }
76
+ return normalizedRequest;
77
+ };
78
+ /**
79
+ * Converts the generic quote request to the type that the bridge-api expects
80
+ *
81
+ * @param normalizedRequest - The normalized quote request
82
+ * @returns A URLSearchParams object with the query parameters
83
+ */
84
+ const formatQueryParams = (normalizedRequest) => {
76
85
  const queryParams = new URLSearchParams();
77
86
  Object.entries(normalizedRequest).forEach(([key, value]) => {
78
87
  queryParams.append(key, value.toString());
@@ -93,7 +102,8 @@ const formatQueryParams = (request) => {
93
102
  * @returns A list of bridge tx quotes
94
103
  */
95
104
  export async function fetchBridgeQuotes(request, signal, clientId, jwt, fetchFn, bridgeApiBaseUrl, featureId, clientVersion) {
96
- const queryParams = formatQueryParams(request);
105
+ const normalizedRequest = formatQuoteRequest(request);
106
+ const queryParams = formatQueryParams(normalizedRequest);
97
107
  const url = `${bridgeApiBaseUrl}/getQuote?${queryParams}`;
98
108
  const quotes = await fetchFn(url, {
99
109
  headers: getClientHeaders({ clientId, clientVersion, jwt }),
@@ -199,12 +209,13 @@ export const fetchAssetPrices = async (request) => {
199
209
  });
200
210
  return combinedPrices;
201
211
  };
212
+ const getQuoteRequestId = ({ srcChainId, destChainId, srcTokenAddress, destTokenAddress, }) => `${formatAddressToAssetId(srcTokenAddress, srcChainId)}-${formatAddressToAssetId(destTokenAddress, destChainId)}`;
213
+ const getQuoteResponseId = ({ srcAsset: { address: srcTokenAddress, chainId: srcChainId }, destAsset: { address: destTokenAddress, chainId: destChainId }, }) => `${formatAddressToAssetId(srcTokenAddress, srcChainId)}-${formatAddressToAssetId(destTokenAddress, destChainId)}`;
202
214
  /**
203
- * Converts the generic quote request to the type that the bridge-api expects
204
- * then fetches quotes from the bridge-api
215
+ * Fetches quotes from the bridge-api
205
216
  *
206
217
  * @param fetchFn - The fetch function to use
207
- * @param request - The quote request
218
+ * @param quoteRequests - An array of GenericQuoteRequest objects
208
219
  * @param signal - The abort signal
209
220
  * @param clientId - The client ID for metrics
210
221
  * @param jwt - The JWT token for authentication
@@ -218,23 +229,39 @@ export const fetchAssetPrices = async (request) => {
218
229
  * @param clientVersion - The client version for metrics (optional)
219
230
  * @returns A list of bridge tx quote promises
220
231
  */
221
- export async function fetchBridgeQuoteStream(fetchFn, request, signal, clientId, jwt, bridgeApiBaseUrl, serverEventHandlers, clientVersion) {
222
- const queryParams = formatQueryParams(request);
232
+ export async function fetchBridgeQuoteStream(fetchFn, quoteRequests, signal, clientId, jwt, bridgeApiBaseUrl, serverEventHandlers, clientVersion) {
233
+ /**
234
+ * If the request includes multiple quote requests, it is a batch sell request.
235
+ * A batch sell consists of multiple swaps that are executed in a single tx submission.
236
+ */
237
+ const isBatchSellRequest = quoteRequests.length > 1;
238
+ const normalizedQuoteRequests = quoteRequests.map(formatQuoteRequest);
239
+ const quoteRequestIds = isBatchSellRequest
240
+ ? normalizedQuoteRequests.map(getQuoteRequestId)
241
+ : undefined;
223
242
  const onQuoteReceived = async (quoteResponse) => {
224
243
  const uniqueValidationFailures = new Set([]);
225
244
  try {
226
245
  if (validateQuoteResponse(quoteResponse)) {
246
+ // Fallback to 0 if the quote doesn't match any requests
247
+ const matchedQuoteRequestIdx = Math.max(quoteRequestIds?.findIndex((id) => {
248
+ return id === getQuoteResponseId(quoteResponse.quote);
249
+ }) ?? 0, 0);
250
+ const matchingQuoteRequest = normalizedQuoteRequests[matchedQuoteRequestIdx];
227
251
  return await serverEventHandlers.onValidQuoteReceived({
228
252
  ...quoteResponse,
229
253
  // Append the reset approval data to the quote response if the request has resetApproval set to true and the quote has an approval
230
- resetApproval: request.resetApproval &&
254
+ resetApproval: matchingQuoteRequest.resetApproval &&
231
255
  quoteResponse.approval &&
232
256
  isEvmTxData(quoteResponse.approval)
233
257
  ? {
234
258
  ...quoteResponse.approval,
235
- data: getEthUsdtResetData(request.destChainId),
259
+ data: getEthUsdtResetData(matchingQuoteRequest.destChainId),
236
260
  }
237
261
  : undefined,
262
+ ...(isBatchSellRequest && {
263
+ quoteRequestIndex: matchedQuoteRequestIdx,
264
+ }),
238
265
  });
239
266
  }
240
267
  }
@@ -292,12 +319,7 @@ export async function fetchBridgeQuoteStream(fetchFn, request, signal, clientId,
292
319
  return undefined;
293
320
  }
294
321
  };
295
- const urlStream = `${bridgeApiBaseUrl}/getQuoteStream?${queryParams}`;
296
- await fetchServerEvents(urlStream, {
297
- headers: {
298
- ...getClientHeaders({ clientId, clientVersion, jwt }),
299
- 'Content-Type': 'text/event-stream',
300
- },
322
+ const sharedFetchOptions = {
301
323
  signal,
302
324
  onMessage,
303
325
  onError: (error) => {
@@ -308,6 +330,28 @@ export async function fetchBridgeQuoteStream(fetchFn, request, signal, clientId,
308
330
  await serverEventHandlers.onClose();
309
331
  },
310
332
  fetchFn,
333
+ };
334
+ if (isBatchSellRequest) {
335
+ const urlStream = `${bridgeApiBaseUrl}/getBatchQuoteStream`;
336
+ await fetchServerEvents(urlStream, {
337
+ method: 'POST',
338
+ body: JSON.stringify({ requests: normalizedQuoteRequests }),
339
+ headers: {
340
+ ...getClientHeaders({ clientId, clientVersion, jwt }),
341
+ 'Content-Type': 'application/json',
342
+ },
343
+ ...sharedFetchOptions,
344
+ });
345
+ return;
346
+ }
347
+ const queryParams = formatQueryParams(normalizedQuoteRequests[0]);
348
+ const urlStream = `${bridgeApiBaseUrl}/getQuoteStream?${queryParams}`;
349
+ await fetchServerEvents(urlStream, {
350
+ headers: {
351
+ ...getClientHeaders({ clientId, clientVersion, jwt }),
352
+ 'Content-Type': 'text/event-stream',
353
+ },
354
+ ...sharedFetchOptions,
311
355
  });
312
356
  }
313
357
  //# sourceMappingURL=fetch.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.mjs","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { StructError } from '@metamask/superstruct';\nimport type { CaipAssetType, CaipChainId, Hex } from '@metamask/utils';\n\nimport type {\n QuoteResponse,\n FetchFunction,\n GenericQuoteRequest,\n QuoteRequest,\n BridgeAsset,\n TokenFeature,\n QuoteStreamCompleteData,\n} from '../types';\nimport { getEthUsdtResetData } from './bridge';\nimport {\n formatAddressToCaipReference,\n formatChainIdToDec,\n} from './caip-formatters';\nimport { fetchServerEvents } from './fetch-server-events';\nimport { isEvmTxData } from './trade-utils';\nimport type { FeatureId } from './validators';\nimport {\n validateQuoteResponse,\n validateSwapsTokenObject,\n validateTokenFeature,\n validateQuoteStreamComplete,\n} from './validators';\n\nexport const getClientHeaders = ({\n clientId,\n clientVersion,\n jwt,\n}: {\n clientId: string;\n clientVersion?: string;\n jwt?: string;\n}) => ({\n 'X-Client-Id': clientId,\n ...(jwt ? { Authorization: `Bearer ${jwt}` } : {}),\n ...(clientVersion ? { 'Client-Version': clientVersion } : {}),\n});\n\n/**\n * Returns a list of enabled (unblocked) tokens\n *\n * @deprecated Use the popular and search bridge-api endpoints instead\n *\n * @param chainId - The chain ID to fetch tokens for\n * @param clientId - The client ID for metrics\n * @param jwt - The JWT token for authentication\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @param clientVersion - The client version for metrics (optional)\n * @returns A list of enabled (unblocked) tokens\n */\nexport async function fetchBridgeTokens(\n chainId: Hex | CaipChainId,\n clientId: string,\n jwt: string | undefined,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n clientVersion?: string,\n): Promise<Record<string, BridgeAsset>> {\n const url = `${bridgeApiBaseUrl}/getTokens?chainId=${formatChainIdToDec(chainId)}`;\n\n // TODO we will need to cache these. In Extension fetchWithCache is used. This is due to the following:\n // If we allow selecting dest networks which the user has not imported,\n // note that the Assets controller won't be able to provide tokens. In extension we fetch+cache the token list from bridge-api to handle this\n const tokens = await fetchFn(url, {\n headers: getClientHeaders({ clientId, clientVersion, jwt }),\n });\n\n const transformedTokens: Record<string, BridgeAsset> = {};\n tokens.forEach((token: unknown) => {\n if (validateSwapsTokenObject(token)) {\n transformedTokens[token.address] = token;\n }\n });\n return transformedTokens;\n}\n\n/**\n * Converts the generic quote request to the type that the bridge-api expects\n *\n * @param request - The quote request\n * @returns A URLSearchParams object with the query parameters\n */\nconst formatQueryParams = (request: GenericQuoteRequest): URLSearchParams => {\n const destWalletAddress = request.destWalletAddress ?? request.walletAddress;\n // Transform the generic quote request into QuoteRequest\n const normalizedRequest: QuoteRequest = {\n walletAddress: formatAddressToCaipReference(request.walletAddress),\n destWalletAddress: formatAddressToCaipReference(destWalletAddress),\n srcChainId: formatChainIdToDec(request.srcChainId),\n destChainId: formatChainIdToDec(request.destChainId),\n srcTokenAddress: formatAddressToCaipReference(request.srcTokenAddress),\n destTokenAddress: formatAddressToCaipReference(request.destTokenAddress),\n srcTokenAmount: request.srcTokenAmount,\n insufficientBal: Boolean(request.insufficientBal),\n resetApproval: Boolean(request.resetApproval),\n gasIncluded: Boolean(request.gasIncluded),\n gasIncluded7702: Boolean(request.gasIncluded7702),\n };\n if (request.slippage !== undefined) {\n normalizedRequest.slippage = request.slippage;\n }\n if (request.fee !== undefined) {\n normalizedRequest.fee = request.fee;\n }\n if (request.aggIds && request.aggIds.length > 0) {\n normalizedRequest.aggIds = request.aggIds;\n }\n if (request.bridgeIds && request.bridgeIds.length > 0) {\n normalizedRequest.bridgeIds = request.bridgeIds;\n }\n\n const queryParams = new URLSearchParams();\n Object.entries(normalizedRequest).forEach(([key, value]) => {\n queryParams.append(key, value.toString());\n });\n return queryParams;\n};\n\n/**\n * Fetches quotes from the bridge-api's getQuote endpoint\n *\n * @param request - The quote request\n * @param signal - The abort signal\n * @param clientId - The client ID for metrics\n * @param jwt - The JWT token for authentication\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @param featureId - The feature ID to append to each quote\n * @param clientVersion - The client version for metrics (optional)\n * @returns A list of bridge tx quotes\n */\nexport async function fetchBridgeQuotes(\n request: GenericQuoteRequest,\n signal: AbortSignal | null,\n clientId: string,\n jwt: string | undefined,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n featureId: FeatureId | null,\n clientVersion?: string,\n): Promise<{\n quotes: QuoteResponse[];\n validationFailures: string[];\n}> {\n const queryParams = formatQueryParams(request);\n\n const url = `${bridgeApiBaseUrl}/getQuote?${queryParams}`;\n const quotes: unknown[] = await fetchFn(url, {\n headers: getClientHeaders({ clientId, clientVersion, jwt }),\n signal,\n });\n\n const uniqueValidationFailures: Set<string> = new Set<string>([]);\n const filteredQuotes = quotes\n .filter((quoteResponse: unknown): quoteResponse is QuoteResponse => {\n try {\n return validateQuoteResponse(quoteResponse);\n } catch (error) {\n if (error instanceof StructError) {\n error.failures().forEach(({ branch, path }) => {\n const aggregatorId =\n branch?.[0]?.quote?.bridgeId ??\n branch?.[0]?.quote?.bridges?.[0] ??\n (quoteResponse as QuoteResponse)?.quote?.bridgeId ??\n (quoteResponse as QuoteResponse)?.quote?.bridges?.[0] ??\n 'unknown';\n const pathString = path?.join('.') || 'unknown';\n uniqueValidationFailures.add([aggregatorId, pathString].join('|'));\n });\n }\n return false;\n }\n })\n .map((quote) => ({\n ...quote,\n featureId: featureId ?? undefined,\n // Append the reset approval data to the quote response if the request\n // has resetApproval set to true and the quote has an approval\n resetApproval:\n request.resetApproval && quote.approval && isEvmTxData(quote.approval)\n ? {\n ...quote.approval,\n data: getEthUsdtResetData(request.destChainId),\n }\n : undefined,\n }));\n\n const validationFailures = Array.from(uniqueValidationFailures);\n if (uniqueValidationFailures.size > 0) {\n console.warn('Quote validation failed', validationFailures);\n }\n\n return {\n quotes: filteredQuotes,\n validationFailures,\n };\n}\n\nconst fetchAssetPricesForCurrency = async (request: {\n currency: string;\n assetIds: Set<CaipAssetType>;\n clientId: string;\n clientVersion?: string;\n fetchFn: FetchFunction;\n signal?: AbortSignal;\n}): Promise<Record<CaipAssetType, { [currency: string]: string }>> => {\n const { currency, assetIds, clientId, clientVersion, fetchFn, signal } =\n request;\n const validAssetIds = Array.from(assetIds).filter(Boolean);\n if (validAssetIds.length === 0) {\n return {};\n }\n\n const queryParams = new URLSearchParams({\n assetIds: validAssetIds.filter(Boolean).join(','),\n vsCurrency: currency,\n });\n const url = `https://price.api.cx.metamask.io/v3/spot-prices?${queryParams}`;\n const priceApiResponse = (await fetchFn(url, {\n headers: getClientHeaders({ clientId, clientVersion }),\n signal,\n })) as Record<CaipAssetType, { [currency: string]: number }>;\n if (!priceApiResponse || typeof priceApiResponse !== 'object') {\n return {};\n }\n\n return Object.entries(priceApiResponse).reduce<\n Record<CaipAssetType, { [currency: string]: string }>\n >((acc, [assetId, currencyToPrice]) => {\n if (!currencyToPrice) {\n return acc;\n }\n if (!acc[assetId as CaipAssetType]) {\n acc[assetId as CaipAssetType] = {};\n }\n if (currencyToPrice[currency]) {\n acc[assetId as CaipAssetType][currency] =\n currencyToPrice[currency].toString();\n }\n return acc;\n }, {});\n};\n\n/**\n * Fetches the asset prices from the price API for multiple currencies\n *\n * @param request - The request object\n * @returns The asset prices by assetId\n */\nexport const fetchAssetPrices = async (\n request: {\n currencies: Set<string>;\n } & Omit<Parameters<typeof fetchAssetPricesForCurrency>[0], 'currency'>,\n): Promise<\n Record<CaipAssetType, { [currency: string]: string } | undefined>\n> => {\n const { currencies, ...args } = request;\n\n const combinedPrices = await Promise.allSettled(\n Array.from(currencies).map(\n async (currency) =>\n await fetchAssetPricesForCurrency({ ...args, currency }),\n ),\n ).then((priceApiResponse) => {\n return priceApiResponse.reduce<\n Record<CaipAssetType, { [currency: string]: string }>\n >((acc, result) => {\n if (result.status === 'fulfilled') {\n Object.entries(result.value).forEach(([assetId, currencyToPrice]) => {\n const existingPrices = acc[assetId as CaipAssetType];\n if (!existingPrices) {\n acc[assetId as CaipAssetType] = {};\n }\n Object.entries(currencyToPrice).forEach(([currency, price]) => {\n acc[assetId as CaipAssetType][currency] = price;\n });\n });\n }\n return acc;\n }, {});\n });\n\n return combinedPrices;\n};\n\n/**\n * Converts the generic quote request to the type that the bridge-api expects\n * then fetches quotes from the bridge-api\n *\n * @param fetchFn - The fetch function to use\n * @param request - The quote request\n * @param signal - The abort signal\n * @param clientId - The client ID for metrics\n * @param jwt - The JWT token for authentication\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @param serverEventHandlers - The server event handlers\n * @param serverEventHandlers.onQuoteValidationFailure - The function to handle quote validation failures\n * @param serverEventHandlers.onValidQuoteReceived - The function to handle valid quotes\n * @param serverEventHandlers.onTokenWarning - The function to handle token warning events\n * @param serverEventHandlers.onComplete - The function to handle the complete event emitted when the stream finishes\n * @param serverEventHandlers.onClose - The function to run when the stream is closed and there are no thrown errors\n * @param clientVersion - The client version for metrics (optional)\n * @returns A list of bridge tx quote promises\n */\nexport async function fetchBridgeQuoteStream(\n fetchFn: FetchFunction,\n request: GenericQuoteRequest,\n signal: AbortSignal | undefined,\n clientId: string,\n jwt: string | undefined,\n bridgeApiBaseUrl: string,\n serverEventHandlers: {\n onClose: () => void | Promise<void>;\n onQuoteValidationFailure: (validationFailures: string[]) => void;\n onValidQuoteReceived: (quotes: QuoteResponse) => Promise<void>;\n onTokenWarning: (warning: TokenFeature) => void;\n onComplete: (data: QuoteStreamCompleteData) => void;\n },\n clientVersion?: string,\n): Promise<void> {\n const queryParams = formatQueryParams(request);\n\n const onQuoteReceived = async (quoteResponse: unknown): Promise<void> => {\n const uniqueValidationFailures: Set<string> = new Set<string>([]);\n\n try {\n if (validateQuoteResponse(quoteResponse)) {\n return await serverEventHandlers.onValidQuoteReceived({\n ...quoteResponse,\n // Append the reset approval data to the quote response if the request has resetApproval set to true and the quote has an approval\n resetApproval:\n request.resetApproval &&\n quoteResponse.approval &&\n isEvmTxData(quoteResponse.approval)\n ? {\n ...quoteResponse.approval,\n data: getEthUsdtResetData(request.destChainId),\n }\n : undefined,\n });\n }\n } catch (error) {\n if (error instanceof StructError) {\n error.failures().forEach(({ branch, path }) => {\n const aggregatorId =\n branch?.[0]?.quote?.bridgeId ??\n branch?.[0]?.quote?.bridges?.[0] ??\n (quoteResponse as QuoteResponse)?.quote?.bridgeId ??\n ((quoteResponse as QuoteResponse)?.quote?.bridges?.[0] ||\n ('unknown' as string));\n const pathString = path?.join('.') || 'unknown';\n uniqueValidationFailures.add([aggregatorId, pathString].join('|'));\n });\n }\n const validationFailures = Array.from(uniqueValidationFailures);\n if (uniqueValidationFailures.size > 0) {\n console.warn('Quote validation failed', validationFailures);\n return serverEventHandlers.onQuoteValidationFailure(validationFailures);\n }\n // Rethrow any unexpected errors\n throw error;\n }\n return undefined;\n };\n\n const onTokenWarningReceived = (data: unknown): void => {\n try {\n if (validateTokenFeature(data)) {\n serverEventHandlers.onTokenWarning(data);\n }\n } catch (error) {\n console.warn('Token warning validation failed', error);\n }\n };\n\n const onCompleteReceived = (data: unknown): void => {\n try {\n if (validateQuoteStreamComplete(data)) {\n serverEventHandlers.onComplete(data);\n }\n } catch (error) {\n console.warn('Quote stream complete validation failed', error);\n }\n };\n\n const onMessage = async (\n data: Record<string, unknown>,\n eventName?: string,\n ): Promise<void> => {\n switch (eventName) {\n case 'quote':\n return await onQuoteReceived(data);\n case 'token_warning':\n return onTokenWarningReceived(data);\n case 'complete':\n return onCompleteReceived(data);\n default:\n return undefined;\n }\n };\n\n const urlStream = `${bridgeApiBaseUrl}/getQuoteStream?${queryParams}`;\n await fetchServerEvents(urlStream, {\n headers: {\n ...getClientHeaders({ clientId, clientVersion, jwt }),\n 'Content-Type': 'text/event-stream',\n },\n signal,\n onMessage,\n onError: (error) => {\n // Rethrow error to prevent silent fetch failures\n throw error;\n },\n onClose: async () => {\n await serverEventHandlers.onClose();\n },\n fetchFn,\n });\n}\n"]}
1
+ {"version":3,"file":"fetch.mjs","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { StructError } from '@metamask/superstruct';\nimport type { CaipAssetType, CaipChainId, Hex } from '@metamask/utils';\n\nimport type {\n QuoteResponse,\n FetchFunction,\n GenericQuoteRequest,\n QuoteRequest,\n BridgeAsset,\n TokenFeature,\n QuoteStreamCompleteData,\n} from '../types';\nimport { getEthUsdtResetData } from './bridge';\nimport {\n formatAddressToAssetId,\n formatAddressToCaipReference,\n formatChainIdToDec,\n} from './caip-formatters';\nimport { fetchServerEvents } from './fetch-server-events';\nimport { isEvmTxData } from './trade-utils';\nimport type { FeatureId } from './validators';\nimport {\n validateQuoteResponse,\n validateSwapsTokenObject,\n validateTokenFeature,\n validateQuoteStreamComplete,\n} from './validators';\n\nexport const getClientHeaders = ({\n clientId,\n clientVersion,\n jwt,\n}: {\n clientId: string;\n clientVersion?: string;\n jwt?: string;\n}) => ({\n 'X-Client-Id': clientId,\n ...(jwt ? { Authorization: `Bearer ${jwt}` } : {}),\n ...(clientVersion ? { 'Client-Version': clientVersion } : {}),\n});\n\n/**\n * Returns a list of enabled (unblocked) tokens\n *\n * @deprecated Use the popular and search bridge-api endpoints instead\n *\n * @param chainId - The chain ID to fetch tokens for\n * @param clientId - The client ID for metrics\n * @param jwt - The JWT token for authentication\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @param clientVersion - The client version for metrics (optional)\n * @returns A list of enabled (unblocked) tokens\n */\nexport async function fetchBridgeTokens(\n chainId: Hex | CaipChainId,\n clientId: string,\n jwt: string | undefined,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n clientVersion?: string,\n): Promise<Record<string, BridgeAsset>> {\n const url = `${bridgeApiBaseUrl}/getTokens?chainId=${formatChainIdToDec(chainId)}`;\n\n // TODO we will need to cache these. In Extension fetchWithCache is used. This is due to the following:\n // If we allow selecting dest networks which the user has not imported,\n // note that the Assets controller won't be able to provide tokens. In extension we fetch+cache the token list from bridge-api to handle this\n const tokens = await fetchFn(url, {\n headers: getClientHeaders({ clientId, clientVersion, jwt }),\n });\n\n const transformedTokens: Record<string, BridgeAsset> = {};\n tokens.forEach((token: unknown) => {\n if (validateSwapsTokenObject(token)) {\n transformedTokens[token.address] = token;\n }\n });\n return transformedTokens;\n}\n\n/**\n * Converts the generic quote request to QuoteRequest\n *\n * @param request - The quote request\n * @returns A QuoteRequest object\n */\nconst formatQuoteRequest = (request: GenericQuoteRequest): QuoteRequest => {\n const destWalletAddress = request.destWalletAddress ?? request.walletAddress;\n // Transform the generic quote request into QuoteRequest\n const normalizedRequest: QuoteRequest = {\n walletAddress: formatAddressToCaipReference(request.walletAddress),\n destWalletAddress: formatAddressToCaipReference(destWalletAddress),\n srcChainId: formatChainIdToDec(request.srcChainId),\n destChainId: formatChainIdToDec(request.destChainId),\n srcTokenAddress: formatAddressToCaipReference(request.srcTokenAddress),\n destTokenAddress: formatAddressToCaipReference(request.destTokenAddress),\n srcTokenAmount: request.srcTokenAmount,\n insufficientBal: Boolean(request.insufficientBal),\n resetApproval: Boolean(request.resetApproval),\n gasIncluded: Boolean(request.gasIncluded),\n gasIncluded7702: Boolean(request.gasIncluded7702),\n };\n if (request.slippage !== undefined) {\n normalizedRequest.slippage = request.slippage;\n }\n if (request.fee !== undefined) {\n normalizedRequest.fee = request.fee;\n }\n if (request.aggIds && request.aggIds.length > 0) {\n normalizedRequest.aggIds = request.aggIds;\n }\n if (request.bridgeIds && request.bridgeIds.length > 0) {\n normalizedRequest.bridgeIds = request.bridgeIds;\n }\n\n return normalizedRequest;\n};\n\n/**\n * Converts the generic quote request to the type that the bridge-api expects\n *\n * @param normalizedRequest - The normalized quote request\n * @returns A URLSearchParams object with the query parameters\n */\nconst formatQueryParams = (\n normalizedRequest: QuoteRequest,\n): URLSearchParams => {\n const queryParams = new URLSearchParams();\n Object.entries(normalizedRequest).forEach(([key, value]) => {\n queryParams.append(key, value.toString());\n });\n return queryParams;\n};\n\n/**\n * Fetches quotes from the bridge-api's getQuote endpoint\n *\n * @param request - The quote request\n * @param signal - The abort signal\n * @param clientId - The client ID for metrics\n * @param jwt - The JWT token for authentication\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @param featureId - The feature ID to append to each quote\n * @param clientVersion - The client version for metrics (optional)\n * @returns A list of bridge tx quotes\n */\nexport async function fetchBridgeQuotes(\n request: GenericQuoteRequest,\n signal: AbortSignal | null,\n clientId: string,\n jwt: string | undefined,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n featureId: FeatureId | null,\n clientVersion?: string,\n): Promise<{\n quotes: QuoteResponse[];\n validationFailures: string[];\n}> {\n const normalizedRequest = formatQuoteRequest(request);\n const queryParams = formatQueryParams(normalizedRequest);\n\n const url = `${bridgeApiBaseUrl}/getQuote?${queryParams}`;\n const quotes: unknown[] = await fetchFn(url, {\n headers: getClientHeaders({ clientId, clientVersion, jwt }),\n signal,\n });\n\n const uniqueValidationFailures: Set<string> = new Set<string>([]);\n const filteredQuotes = quotes\n .filter((quoteResponse: unknown): quoteResponse is QuoteResponse => {\n try {\n return validateQuoteResponse(quoteResponse);\n } catch (error) {\n if (error instanceof StructError) {\n error.failures().forEach(({ branch, path }) => {\n const aggregatorId =\n branch?.[0]?.quote?.bridgeId ??\n branch?.[0]?.quote?.bridges?.[0] ??\n (quoteResponse as QuoteResponse)?.quote?.bridgeId ??\n (quoteResponse as QuoteResponse)?.quote?.bridges?.[0] ??\n 'unknown';\n const pathString = path?.join('.') || 'unknown';\n uniqueValidationFailures.add([aggregatorId, pathString].join('|'));\n });\n }\n return false;\n }\n })\n .map((quote) => ({\n ...quote,\n featureId: featureId ?? undefined,\n // Append the reset approval data to the quote response if the request\n // has resetApproval set to true and the quote has an approval\n resetApproval:\n request.resetApproval && quote.approval && isEvmTxData(quote.approval)\n ? {\n ...quote.approval,\n data: getEthUsdtResetData(request.destChainId),\n }\n : undefined,\n }));\n\n const validationFailures = Array.from(uniqueValidationFailures);\n if (uniqueValidationFailures.size > 0) {\n console.warn('Quote validation failed', validationFailures);\n }\n\n return {\n quotes: filteredQuotes,\n validationFailures,\n };\n}\n\nconst fetchAssetPricesForCurrency = async (request: {\n currency: string;\n assetIds: Set<CaipAssetType>;\n clientId: string;\n clientVersion?: string;\n fetchFn: FetchFunction;\n signal?: AbortSignal;\n}): Promise<Record<CaipAssetType, { [currency: string]: string }>> => {\n const { currency, assetIds, clientId, clientVersion, fetchFn, signal } =\n request;\n const validAssetIds = Array.from(assetIds).filter(Boolean);\n if (validAssetIds.length === 0) {\n return {};\n }\n\n const queryParams = new URLSearchParams({\n assetIds: validAssetIds.filter(Boolean).join(','),\n vsCurrency: currency,\n });\n const url = `https://price.api.cx.metamask.io/v3/spot-prices?${queryParams}`;\n const priceApiResponse = (await fetchFn(url, {\n headers: getClientHeaders({ clientId, clientVersion }),\n signal,\n })) as Record<CaipAssetType, { [currency: string]: number }>;\n if (!priceApiResponse || typeof priceApiResponse !== 'object') {\n return {};\n }\n\n return Object.entries(priceApiResponse).reduce<\n Record<CaipAssetType, { [currency: string]: string }>\n >((acc, [assetId, currencyToPrice]) => {\n if (!currencyToPrice) {\n return acc;\n }\n if (!acc[assetId as CaipAssetType]) {\n acc[assetId as CaipAssetType] = {};\n }\n if (currencyToPrice[currency]) {\n acc[assetId as CaipAssetType][currency] =\n currencyToPrice[currency].toString();\n }\n return acc;\n }, {});\n};\n\n/**\n * Fetches the asset prices from the price API for multiple currencies\n *\n * @param request - The request object\n * @returns The asset prices by assetId\n */\nexport const fetchAssetPrices = async (\n request: {\n currencies: Set<string>;\n } & Omit<Parameters<typeof fetchAssetPricesForCurrency>[0], 'currency'>,\n): Promise<\n Record<CaipAssetType, { [currency: string]: string } | undefined>\n> => {\n const { currencies, ...args } = request;\n\n const combinedPrices = await Promise.allSettled(\n Array.from(currencies).map(\n async (currency) =>\n await fetchAssetPricesForCurrency({ ...args, currency }),\n ),\n ).then((priceApiResponse) => {\n return priceApiResponse.reduce<\n Record<CaipAssetType, { [currency: string]: string }>\n >((acc, result) => {\n if (result.status === 'fulfilled') {\n Object.entries(result.value).forEach(([assetId, currencyToPrice]) => {\n const existingPrices = acc[assetId as CaipAssetType];\n if (!existingPrices) {\n acc[assetId as CaipAssetType] = {};\n }\n Object.entries(currencyToPrice).forEach(([currency, price]) => {\n acc[assetId as CaipAssetType][currency] = price;\n });\n });\n }\n return acc;\n }, {});\n });\n\n return combinedPrices;\n};\n\nconst getQuoteRequestId = ({\n srcChainId,\n destChainId,\n srcTokenAddress,\n destTokenAddress,\n}: QuoteRequest): string =>\n `${formatAddressToAssetId(srcTokenAddress, srcChainId)}-${formatAddressToAssetId(destTokenAddress, destChainId)}`;\n\nconst getQuoteResponseId = ({\n srcAsset: { address: srcTokenAddress, chainId: srcChainId },\n destAsset: { address: destTokenAddress, chainId: destChainId },\n}: QuoteResponse['quote']): string =>\n `${formatAddressToAssetId(srcTokenAddress, srcChainId)}-${formatAddressToAssetId(destTokenAddress, destChainId)}`;\n\n/**\n * Fetches quotes from the bridge-api\n *\n * @param fetchFn - The fetch function to use\n * @param quoteRequests - An array of GenericQuoteRequest objects\n * @param signal - The abort signal\n * @param clientId - The client ID for metrics\n * @param jwt - The JWT token for authentication\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @param serverEventHandlers - The server event handlers\n * @param serverEventHandlers.onQuoteValidationFailure - The function to handle quote validation failures\n * @param serverEventHandlers.onValidQuoteReceived - The function to handle valid quotes\n * @param serverEventHandlers.onTokenWarning - The function to handle token warning events\n * @param serverEventHandlers.onComplete - The function to handle the complete event emitted when the stream finishes\n * @param serverEventHandlers.onClose - The function to run when the stream is closed and there are no thrown errors\n * @param clientVersion - The client version for metrics (optional)\n * @returns A list of bridge tx quote promises\n */\nexport async function fetchBridgeQuoteStream(\n fetchFn: FetchFunction,\n quoteRequests: GenericQuoteRequest[],\n signal: AbortSignal | undefined,\n clientId: string,\n jwt: string | undefined,\n bridgeApiBaseUrl: string,\n serverEventHandlers: {\n onClose: () => void | Promise<void>;\n onQuoteValidationFailure: (validationFailures: string[]) => void;\n onValidQuoteReceived: (quotes: QuoteResponse) => Promise<void>;\n onTokenWarning: (warning: TokenFeature) => void;\n onComplete: (data: QuoteStreamCompleteData) => void;\n },\n clientVersion?: string,\n): Promise<void> {\n /**\n * If the request includes multiple quote requests, it is a batch sell request.\n * A batch sell consists of multiple swaps that are executed in a single tx submission.\n */\n const isBatchSellRequest = quoteRequests.length > 1;\n const normalizedQuoteRequests = quoteRequests.map(formatQuoteRequest);\n const quoteRequestIds = isBatchSellRequest\n ? normalizedQuoteRequests.map(getQuoteRequestId)\n : undefined;\n\n const onQuoteReceived = async (quoteResponse: unknown): Promise<void> => {\n const uniqueValidationFailures: Set<string> = new Set<string>([]);\n\n try {\n if (validateQuoteResponse(quoteResponse)) {\n // Fallback to 0 if the quote doesn't match any requests\n const matchedQuoteRequestIdx = Math.max(\n quoteRequestIds?.findIndex((id) => {\n return id === getQuoteResponseId(quoteResponse.quote);\n }) ?? 0,\n 0,\n );\n const matchingQuoteRequest =\n normalizedQuoteRequests[matchedQuoteRequestIdx];\n\n return await serverEventHandlers.onValidQuoteReceived({\n ...quoteResponse,\n // Append the reset approval data to the quote response if the request has resetApproval set to true and the quote has an approval\n resetApproval:\n matchingQuoteRequest.resetApproval &&\n quoteResponse.approval &&\n isEvmTxData(quoteResponse.approval)\n ? {\n ...quoteResponse.approval,\n data: getEthUsdtResetData(matchingQuoteRequest.destChainId),\n }\n : undefined,\n ...(isBatchSellRequest && {\n quoteRequestIndex: matchedQuoteRequestIdx,\n }),\n });\n }\n } catch (error) {\n if (error instanceof StructError) {\n error.failures().forEach(({ branch, path }) => {\n const aggregatorId =\n branch?.[0]?.quote?.bridgeId ??\n branch?.[0]?.quote?.bridges?.[0] ??\n (quoteResponse as QuoteResponse)?.quote?.bridgeId ??\n ((quoteResponse as QuoteResponse)?.quote?.bridges?.[0] ||\n ('unknown' as string));\n const pathString = path?.join('.') || 'unknown';\n uniqueValidationFailures.add([aggregatorId, pathString].join('|'));\n });\n }\n const validationFailures = Array.from(uniqueValidationFailures);\n if (uniqueValidationFailures.size > 0) {\n console.warn('Quote validation failed', validationFailures);\n return serverEventHandlers.onQuoteValidationFailure(validationFailures);\n }\n // Rethrow any unexpected errors\n throw error;\n }\n return undefined;\n };\n\n const onTokenWarningReceived = (data: unknown): void => {\n try {\n if (validateTokenFeature(data)) {\n serverEventHandlers.onTokenWarning(data);\n }\n } catch (error) {\n console.warn('Token warning validation failed', error);\n }\n };\n\n const onCompleteReceived = (data: unknown): void => {\n try {\n if (validateQuoteStreamComplete(data)) {\n serverEventHandlers.onComplete(data);\n }\n } catch (error) {\n console.warn('Quote stream complete validation failed', error);\n }\n };\n\n const onMessage = async (\n data: Record<string, unknown>,\n eventName?: string,\n ): Promise<void> => {\n switch (eventName) {\n case 'quote':\n return await onQuoteReceived(data);\n case 'token_warning':\n return onTokenWarningReceived(data);\n case 'complete':\n return onCompleteReceived(data);\n default:\n return undefined;\n }\n };\n\n const sharedFetchOptions = {\n signal,\n onMessage,\n onError: (error: unknown) => {\n // Rethrow error to prevent silent fetch failures\n throw error;\n },\n onClose: async () => {\n await serverEventHandlers.onClose();\n },\n fetchFn,\n };\n\n if (isBatchSellRequest) {\n const urlStream = `${bridgeApiBaseUrl}/getBatchQuoteStream`;\n await fetchServerEvents(urlStream, {\n method: 'POST',\n body: JSON.stringify({ requests: normalizedQuoteRequests }),\n headers: {\n ...getClientHeaders({ clientId, clientVersion, jwt }),\n 'Content-Type': 'application/json',\n },\n ...sharedFetchOptions,\n });\n return;\n }\n\n const queryParams = formatQueryParams(normalizedQuoteRequests[0]);\n const urlStream = `${bridgeApiBaseUrl}/getQuoteStream?${queryParams}`;\n await fetchServerEvents(urlStream, {\n headers: {\n ...getClientHeaders({ clientId, clientVersion, jwt }),\n 'Content-Type': 'text/event-stream',\n },\n ...sharedFetchOptions,\n });\n}\n"]}
@@ -95,7 +95,7 @@ exports.isHardwareWallet = isHardwareWallet;
95
95
  * @deprecated This function should not be used. Use {@link selectDefaultSlippagePercentage} instead.
96
96
  */
97
97
  const isCustomSlippage = (slippage) => {
98
- return slippage !== bridge_1.DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest.slippage;
98
+ return slippage !== bridge_1.DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest[0]?.slippage;
99
99
  };
100
100
  exports.isCustomSlippage = isCustomSlippage;
101
101
  const getQuotesReceivedProperties = (activeQuote, warnings = [], isSubmittable = true, recommendedQuote, usdBalanceSource) => {
@@ -1 +1 @@
1
- {"version":3,"file":"properties.cjs","sourceRoot":"","sources":["../../../src/utils/metrics/properties.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\n\nimport { DEFAULT_BRIDGE_CONTROLLER_STATE } from '../../constants/bridge';\nimport { ChainId } from '../../types';\nimport type {\n GenericQuoteRequest,\n QuoteMetadata,\n QuoteRequest,\n QuoteResponse,\n TxData,\n} from '../../types';\nimport { getNativeAssetForChainId, isCrossChain } from '../bridge';\nimport {\n formatAddressToAssetId,\n formatChainIdToCaip,\n} from '../caip-formatters';\nimport { MetricsSwapType } from './constants';\nimport type {\n AccountHardwareType,\n InputKeys,\n InputValues,\n QuoteWarning,\n RequestParams,\n} from './types';\n\nexport const toInputChangedPropertyKey: Partial<\n Record<keyof QuoteRequest, InputKeys>\n> = {\n srcTokenAddress: 'token_source',\n destTokenAddress: 'token_destination',\n srcChainId: 'chain_source',\n destChainId: 'chain_destination',\n slippage: 'slippage',\n};\n\nexport const toInputChangedPropertyValue: Partial<\n Record<\n keyof typeof toInputChangedPropertyKey,\n (\n input_value: Partial<GenericQuoteRequest>,\n ) => InputValues[keyof InputValues] | undefined\n >\n> = {\n srcTokenAddress: ({ srcTokenAddress, srcChainId }) =>\n srcChainId\n ? formatAddressToAssetId(srcTokenAddress ?? '', srcChainId)\n : undefined,\n destTokenAddress: ({ destTokenAddress, destChainId }) =>\n destChainId\n ? formatAddressToAssetId(destTokenAddress ?? '', destChainId)\n : undefined,\n srcChainId: ({ srcChainId }) =>\n srcChainId ? formatChainIdToCaip(srcChainId) : undefined,\n destChainId: ({ destChainId }) =>\n destChainId ? formatChainIdToCaip(destChainId) : undefined,\n slippage: ({ slippage }) => (slippage ? Number(slippage) : slippage),\n};\n\nexport const getSwapType = (\n srcChainId?: GenericQuoteRequest['srcChainId'],\n destChainId?: GenericQuoteRequest['destChainId'],\n) => {\n if (srcChainId && !isCrossChain(srcChainId, destChainId ?? srcChainId)) {\n return MetricsSwapType.SINGLE;\n }\n return MetricsSwapType.CROSSCHAIN;\n};\n\nexport const getSwapTypeFromQuote = (\n quoteRequest: Partial<GenericQuoteRequest>,\n) => {\n return getSwapType(quoteRequest.srcChainId, quoteRequest.destChainId);\n};\n\nexport const formatProviderLabel = ({\n bridgeId,\n bridges,\n}: QuoteResponse<TxData | string>['quote']): `${string}_${string}` =>\n `${bridgeId}_${bridges[0]}`;\n\n/**\n * @param quoteRequest - The current quote request used to derive chain and token identity fields.\n * @param quoteRequest.srcChainId - Source chain id of the quote request.\n * @param quoteRequest.destChainId - Destination chain id of the quote request.\n * @param quoteRequest.srcTokenAddress - Source token address of the quote request.\n * @param quoteRequest.destTokenAddress - Destination token address of the quote request.\n * @param tokenSecurityTypeDestination - The security classification of the destination token,\n * supplied by the client (e.g. from token security/scanning data). Pass `null` when no\n * security data is available for the selected destination token.\n * @returns The analytics request params derived from the quote request, minus token symbols\n * which the caller provides separately.\n */\nexport const getRequestParams = (\n {\n srcChainId,\n destChainId,\n srcTokenAddress,\n destTokenAddress,\n }: Partial<GenericQuoteRequest>,\n tokenSecurityTypeDestination: string | null,\n): Omit<RequestParams, 'token_symbol_source' | 'token_symbol_destination'> => {\n // Fallback to ETH if srcChainId is not defined. This is ok since the clients default to Ethereum as the source chain\n // This also doesn't happen at runtime since the quote request is validated before metrics are published\n const srcChainIdCaip = formatChainIdToCaip(srcChainId ?? ChainId.ETH);\n return {\n chain_id_source: srcChainIdCaip,\n chain_id_destination: destChainId ? formatChainIdToCaip(destChainId) : null,\n token_address_source: srcTokenAddress\n ? (formatAddressToAssetId(srcTokenAddress, srcChainIdCaip) ??\n getNativeAssetForChainId(srcChainIdCaip)?.assetId ??\n null)\n : (getNativeAssetForChainId(srcChainIdCaip)?.assetId ?? null),\n token_address_destination: destTokenAddress\n ? (formatAddressToAssetId(\n destTokenAddress,\n destChainId ?? srcChainIdCaip,\n ) ?? null)\n : null,\n token_security_type_destination: tokenSecurityTypeDestination,\n };\n};\n\nexport const getAccountHardwareType = (\n selectedAccount?: AccountsControllerState['internalAccounts']['accounts'][string],\n): AccountHardwareType => {\n // Unified bridge analytics only support the schema enum values for hardware accounts.\n switch (selectedAccount?.metadata?.keyring.type) {\n case 'Ledger Hardware':\n return 'Ledger';\n case 'Trezor Hardware':\n return 'Trezor';\n case 'QR Hardware Wallet Device':\n return 'QR Hardware';\n case 'Lattice Hardware':\n return 'Lattice';\n default:\n return null;\n }\n};\n\nexport const isHardwareWallet = (\n selectedAccount?: AccountsControllerState['internalAccounts']['accounts'][string],\n) => {\n return getAccountHardwareType(selectedAccount) !== null;\n};\n\n/**\n * @param slippage - The slippage percentage\n * @returns Whether the default slippage was overridden by the user\n *\n * @deprecated This function should not be used. Use {@link selectDefaultSlippagePercentage} instead.\n */\nexport const isCustomSlippage = (slippage: GenericQuoteRequest['slippage']) => {\n return slippage !== DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest.slippage;\n};\n\nexport const getQuotesReceivedProperties = (\n activeQuote: null | (QuoteResponse & Partial<QuoteMetadata>),\n warnings: QuoteWarning[] = [],\n isSubmittable: boolean = true,\n recommendedQuote?: null | (QuoteResponse & Partial<QuoteMetadata>),\n usdBalanceSource?: number,\n) => {\n const provider = activeQuote ? formatProviderLabel(activeQuote.quote) : '_';\n return {\n can_submit: isSubmittable,\n gas_included: Boolean(activeQuote?.quote?.gasIncluded),\n gas_included_7702: Boolean(activeQuote?.quote?.gasIncluded7702),\n quoted_time_minutes: activeQuote?.estimatedProcessingTimeInSeconds\n ? activeQuote.estimatedProcessingTimeInSeconds / 60\n : 0,\n usd_quoted_gas: Number(activeQuote?.gasFee?.effective?.usd ?? 0),\n usd_quoted_return: Number(activeQuote?.toTokenAmount?.usd ?? 0),\n usd_balance_source: usdBalanceSource ?? 0,\n best_quote_provider: recommendedQuote\n ? formatProviderLabel(recommendedQuote.quote)\n : provider,\n provider,\n warnings,\n price_impact: Number(activeQuote?.quote.priceData?.priceImpact ?? 0),\n };\n};\n"]}
1
+ {"version":3,"file":"properties.cjs","sourceRoot":"","sources":["../../../src/utils/metrics/properties.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\n\nimport { DEFAULT_BRIDGE_CONTROLLER_STATE } from '../../constants/bridge';\nimport { ChainId } from '../../types';\nimport type {\n GenericQuoteRequest,\n QuoteMetadata,\n QuoteRequest,\n QuoteResponse,\n TxData,\n} from '../../types';\nimport { getNativeAssetForChainId, isCrossChain } from '../bridge';\nimport {\n formatAddressToAssetId,\n formatChainIdToCaip,\n} from '../caip-formatters';\nimport { MetricsSwapType } from './constants';\nimport type {\n AccountHardwareType,\n InputKeys,\n InputValues,\n QuoteWarning,\n RequestParams,\n} from './types';\n\nexport const toInputChangedPropertyKey: Partial<\n Record<keyof QuoteRequest, InputKeys>\n> = {\n srcTokenAddress: 'token_source',\n destTokenAddress: 'token_destination',\n srcChainId: 'chain_source',\n destChainId: 'chain_destination',\n slippage: 'slippage',\n};\n\nexport const toInputChangedPropertyValue: Partial<\n Record<\n keyof typeof toInputChangedPropertyKey,\n (\n input_value: Partial<GenericQuoteRequest>,\n ) => InputValues[keyof InputValues] | undefined\n >\n> = {\n srcTokenAddress: ({ srcTokenAddress, srcChainId }) =>\n srcChainId\n ? formatAddressToAssetId(srcTokenAddress ?? '', srcChainId)\n : undefined,\n destTokenAddress: ({ destTokenAddress, destChainId }) =>\n destChainId\n ? formatAddressToAssetId(destTokenAddress ?? '', destChainId)\n : undefined,\n srcChainId: ({ srcChainId }) =>\n srcChainId ? formatChainIdToCaip(srcChainId) : undefined,\n destChainId: ({ destChainId }) =>\n destChainId ? formatChainIdToCaip(destChainId) : undefined,\n slippage: ({ slippage }) => (slippage ? Number(slippage) : slippage),\n};\n\nexport const getSwapType = (\n srcChainId?: GenericQuoteRequest['srcChainId'],\n destChainId?: GenericQuoteRequest['destChainId'],\n) => {\n if (srcChainId && !isCrossChain(srcChainId, destChainId ?? srcChainId)) {\n return MetricsSwapType.SINGLE;\n }\n return MetricsSwapType.CROSSCHAIN;\n};\n\nexport const getSwapTypeFromQuote = (\n quoteRequest: Partial<GenericQuoteRequest>,\n) => {\n return getSwapType(quoteRequest.srcChainId, quoteRequest.destChainId);\n};\n\nexport const formatProviderLabel = ({\n bridgeId,\n bridges,\n}: QuoteResponse<TxData | string>['quote']): `${string}_${string}` =>\n `${bridgeId}_${bridges[0]}`;\n\n/**\n * @param quoteRequest - The current quote request used to derive chain and token identity fields.\n * @param quoteRequest.srcChainId - Source chain id of the quote request.\n * @param quoteRequest.destChainId - Destination chain id of the quote request.\n * @param quoteRequest.srcTokenAddress - Source token address of the quote request.\n * @param quoteRequest.destTokenAddress - Destination token address of the quote request.\n * @param tokenSecurityTypeDestination - The security classification of the destination token,\n * supplied by the client (e.g. from token security/scanning data). Pass `null` when no\n * security data is available for the selected destination token.\n * @returns The analytics request params derived from the quote request, minus token symbols\n * which the caller provides separately.\n */\nexport const getRequestParams = (\n {\n srcChainId,\n destChainId,\n srcTokenAddress,\n destTokenAddress,\n }: Partial<GenericQuoteRequest>,\n tokenSecurityTypeDestination: string | null,\n): Omit<RequestParams, 'token_symbol_source' | 'token_symbol_destination'> => {\n // Fallback to ETH if srcChainId is not defined. This is ok since the clients default to Ethereum as the source chain\n // This also doesn't happen at runtime since the quote request is validated before metrics are published\n const srcChainIdCaip = formatChainIdToCaip(srcChainId ?? ChainId.ETH);\n return {\n chain_id_source: srcChainIdCaip,\n chain_id_destination: destChainId ? formatChainIdToCaip(destChainId) : null,\n token_address_source: srcTokenAddress\n ? (formatAddressToAssetId(srcTokenAddress, srcChainIdCaip) ??\n getNativeAssetForChainId(srcChainIdCaip)?.assetId ??\n null)\n : (getNativeAssetForChainId(srcChainIdCaip)?.assetId ?? null),\n token_address_destination: destTokenAddress\n ? (formatAddressToAssetId(\n destTokenAddress,\n destChainId ?? srcChainIdCaip,\n ) ?? null)\n : null,\n token_security_type_destination: tokenSecurityTypeDestination,\n };\n};\n\nexport const getAccountHardwareType = (\n selectedAccount?: AccountsControllerState['internalAccounts']['accounts'][string],\n): AccountHardwareType => {\n // Unified bridge analytics only support the schema enum values for hardware accounts.\n switch (selectedAccount?.metadata?.keyring.type) {\n case 'Ledger Hardware':\n return 'Ledger';\n case 'Trezor Hardware':\n return 'Trezor';\n case 'QR Hardware Wallet Device':\n return 'QR Hardware';\n case 'Lattice Hardware':\n return 'Lattice';\n default:\n return null;\n }\n};\n\nexport const isHardwareWallet = (\n selectedAccount?: AccountsControllerState['internalAccounts']['accounts'][string],\n) => {\n return getAccountHardwareType(selectedAccount) !== null;\n};\n\n/**\n * @param slippage - The slippage percentage\n * @returns Whether the default slippage was overridden by the user\n *\n * @deprecated This function should not be used. Use {@link selectDefaultSlippagePercentage} instead.\n */\nexport const isCustomSlippage = (slippage: GenericQuoteRequest['slippage']) => {\n return slippage !== DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest[0]?.slippage;\n};\n\nexport const getQuotesReceivedProperties = (\n activeQuote: null | (QuoteResponse & Partial<QuoteMetadata>),\n warnings: QuoteWarning[] = [],\n isSubmittable: boolean = true,\n recommendedQuote?: null | (QuoteResponse & Partial<QuoteMetadata>),\n usdBalanceSource?: number,\n) => {\n const provider = activeQuote ? formatProviderLabel(activeQuote.quote) : '_';\n return {\n can_submit: isSubmittable,\n gas_included: Boolean(activeQuote?.quote?.gasIncluded),\n gas_included_7702: Boolean(activeQuote?.quote?.gasIncluded7702),\n quoted_time_minutes: activeQuote?.estimatedProcessingTimeInSeconds\n ? activeQuote.estimatedProcessingTimeInSeconds / 60\n : 0,\n usd_quoted_gas: Number(activeQuote?.gasFee?.effective?.usd ?? 0),\n usd_quoted_return: Number(activeQuote?.toTokenAmount?.usd ?? 0),\n usd_balance_source: usdBalanceSource ?? 0,\n best_quote_provider: recommendedQuote\n ? formatProviderLabel(recommendedQuote.quote)\n : provider,\n provider,\n warnings,\n price_impact: Number(activeQuote?.quote.priceData?.priceImpact ?? 0),\n };\n};\n"]}
@@ -86,7 +86,7 @@ export const isHardwareWallet = (selectedAccount) => {
86
86
  * @deprecated This function should not be used. Use {@link selectDefaultSlippagePercentage} instead.
87
87
  */
88
88
  export const isCustomSlippage = (slippage) => {
89
- return slippage !== DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest.slippage;
89
+ return slippage !== DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest[0]?.slippage;
90
90
  };
91
91
  export const getQuotesReceivedProperties = (activeQuote, warnings = [], isSubmittable = true, recommendedQuote, usdBalanceSource) => {
92
92
  const provider = activeQuote ? formatProviderLabel(activeQuote.quote) : '_';
@@ -1 +1 @@
1
- {"version":3,"file":"properties.mjs","sourceRoot":"","sources":["../../../src/utils/metrics/properties.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\n\nimport { DEFAULT_BRIDGE_CONTROLLER_STATE } from '../../constants/bridge';\nimport { ChainId } from '../../types';\nimport type {\n GenericQuoteRequest,\n QuoteMetadata,\n QuoteRequest,\n QuoteResponse,\n TxData,\n} from '../../types';\nimport { getNativeAssetForChainId, isCrossChain } from '../bridge';\nimport {\n formatAddressToAssetId,\n formatChainIdToCaip,\n} from '../caip-formatters';\nimport { MetricsSwapType } from './constants';\nimport type {\n AccountHardwareType,\n InputKeys,\n InputValues,\n QuoteWarning,\n RequestParams,\n} from './types';\n\nexport const toInputChangedPropertyKey: Partial<\n Record<keyof QuoteRequest, InputKeys>\n> = {\n srcTokenAddress: 'token_source',\n destTokenAddress: 'token_destination',\n srcChainId: 'chain_source',\n destChainId: 'chain_destination',\n slippage: 'slippage',\n};\n\nexport const toInputChangedPropertyValue: Partial<\n Record<\n keyof typeof toInputChangedPropertyKey,\n (\n input_value: Partial<GenericQuoteRequest>,\n ) => InputValues[keyof InputValues] | undefined\n >\n> = {\n srcTokenAddress: ({ srcTokenAddress, srcChainId }) =>\n srcChainId\n ? formatAddressToAssetId(srcTokenAddress ?? '', srcChainId)\n : undefined,\n destTokenAddress: ({ destTokenAddress, destChainId }) =>\n destChainId\n ? formatAddressToAssetId(destTokenAddress ?? '', destChainId)\n : undefined,\n srcChainId: ({ srcChainId }) =>\n srcChainId ? formatChainIdToCaip(srcChainId) : undefined,\n destChainId: ({ destChainId }) =>\n destChainId ? formatChainIdToCaip(destChainId) : undefined,\n slippage: ({ slippage }) => (slippage ? Number(slippage) : slippage),\n};\n\nexport const getSwapType = (\n srcChainId?: GenericQuoteRequest['srcChainId'],\n destChainId?: GenericQuoteRequest['destChainId'],\n) => {\n if (srcChainId && !isCrossChain(srcChainId, destChainId ?? srcChainId)) {\n return MetricsSwapType.SINGLE;\n }\n return MetricsSwapType.CROSSCHAIN;\n};\n\nexport const getSwapTypeFromQuote = (\n quoteRequest: Partial<GenericQuoteRequest>,\n) => {\n return getSwapType(quoteRequest.srcChainId, quoteRequest.destChainId);\n};\n\nexport const formatProviderLabel = ({\n bridgeId,\n bridges,\n}: QuoteResponse<TxData | string>['quote']): `${string}_${string}` =>\n `${bridgeId}_${bridges[0]}`;\n\n/**\n * @param quoteRequest - The current quote request used to derive chain and token identity fields.\n * @param quoteRequest.srcChainId - Source chain id of the quote request.\n * @param quoteRequest.destChainId - Destination chain id of the quote request.\n * @param quoteRequest.srcTokenAddress - Source token address of the quote request.\n * @param quoteRequest.destTokenAddress - Destination token address of the quote request.\n * @param tokenSecurityTypeDestination - The security classification of the destination token,\n * supplied by the client (e.g. from token security/scanning data). Pass `null` when no\n * security data is available for the selected destination token.\n * @returns The analytics request params derived from the quote request, minus token symbols\n * which the caller provides separately.\n */\nexport const getRequestParams = (\n {\n srcChainId,\n destChainId,\n srcTokenAddress,\n destTokenAddress,\n }: Partial<GenericQuoteRequest>,\n tokenSecurityTypeDestination: string | null,\n): Omit<RequestParams, 'token_symbol_source' | 'token_symbol_destination'> => {\n // Fallback to ETH if srcChainId is not defined. This is ok since the clients default to Ethereum as the source chain\n // This also doesn't happen at runtime since the quote request is validated before metrics are published\n const srcChainIdCaip = formatChainIdToCaip(srcChainId ?? ChainId.ETH);\n return {\n chain_id_source: srcChainIdCaip,\n chain_id_destination: destChainId ? formatChainIdToCaip(destChainId) : null,\n token_address_source: srcTokenAddress\n ? (formatAddressToAssetId(srcTokenAddress, srcChainIdCaip) ??\n getNativeAssetForChainId(srcChainIdCaip)?.assetId ??\n null)\n : (getNativeAssetForChainId(srcChainIdCaip)?.assetId ?? null),\n token_address_destination: destTokenAddress\n ? (formatAddressToAssetId(\n destTokenAddress,\n destChainId ?? srcChainIdCaip,\n ) ?? null)\n : null,\n token_security_type_destination: tokenSecurityTypeDestination,\n };\n};\n\nexport const getAccountHardwareType = (\n selectedAccount?: AccountsControllerState['internalAccounts']['accounts'][string],\n): AccountHardwareType => {\n // Unified bridge analytics only support the schema enum values for hardware accounts.\n switch (selectedAccount?.metadata?.keyring.type) {\n case 'Ledger Hardware':\n return 'Ledger';\n case 'Trezor Hardware':\n return 'Trezor';\n case 'QR Hardware Wallet Device':\n return 'QR Hardware';\n case 'Lattice Hardware':\n return 'Lattice';\n default:\n return null;\n }\n};\n\nexport const isHardwareWallet = (\n selectedAccount?: AccountsControllerState['internalAccounts']['accounts'][string],\n) => {\n return getAccountHardwareType(selectedAccount) !== null;\n};\n\n/**\n * @param slippage - The slippage percentage\n * @returns Whether the default slippage was overridden by the user\n *\n * @deprecated This function should not be used. Use {@link selectDefaultSlippagePercentage} instead.\n */\nexport const isCustomSlippage = (slippage: GenericQuoteRequest['slippage']) => {\n return slippage !== DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest.slippage;\n};\n\nexport const getQuotesReceivedProperties = (\n activeQuote: null | (QuoteResponse & Partial<QuoteMetadata>),\n warnings: QuoteWarning[] = [],\n isSubmittable: boolean = true,\n recommendedQuote?: null | (QuoteResponse & Partial<QuoteMetadata>),\n usdBalanceSource?: number,\n) => {\n const provider = activeQuote ? formatProviderLabel(activeQuote.quote) : '_';\n return {\n can_submit: isSubmittable,\n gas_included: Boolean(activeQuote?.quote?.gasIncluded),\n gas_included_7702: Boolean(activeQuote?.quote?.gasIncluded7702),\n quoted_time_minutes: activeQuote?.estimatedProcessingTimeInSeconds\n ? activeQuote.estimatedProcessingTimeInSeconds / 60\n : 0,\n usd_quoted_gas: Number(activeQuote?.gasFee?.effective?.usd ?? 0),\n usd_quoted_return: Number(activeQuote?.toTokenAmount?.usd ?? 0),\n usd_balance_source: usdBalanceSource ?? 0,\n best_quote_provider: recommendedQuote\n ? formatProviderLabel(recommendedQuote.quote)\n : provider,\n provider,\n warnings,\n price_impact: Number(activeQuote?.quote.priceData?.priceImpact ?? 0),\n };\n};\n"]}
1
+ {"version":3,"file":"properties.mjs","sourceRoot":"","sources":["../../../src/utils/metrics/properties.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\n\nimport { DEFAULT_BRIDGE_CONTROLLER_STATE } from '../../constants/bridge';\nimport { ChainId } from '../../types';\nimport type {\n GenericQuoteRequest,\n QuoteMetadata,\n QuoteRequest,\n QuoteResponse,\n TxData,\n} from '../../types';\nimport { getNativeAssetForChainId, isCrossChain } from '../bridge';\nimport {\n formatAddressToAssetId,\n formatChainIdToCaip,\n} from '../caip-formatters';\nimport { MetricsSwapType } from './constants';\nimport type {\n AccountHardwareType,\n InputKeys,\n InputValues,\n QuoteWarning,\n RequestParams,\n} from './types';\n\nexport const toInputChangedPropertyKey: Partial<\n Record<keyof QuoteRequest, InputKeys>\n> = {\n srcTokenAddress: 'token_source',\n destTokenAddress: 'token_destination',\n srcChainId: 'chain_source',\n destChainId: 'chain_destination',\n slippage: 'slippage',\n};\n\nexport const toInputChangedPropertyValue: Partial<\n Record<\n keyof typeof toInputChangedPropertyKey,\n (\n input_value: Partial<GenericQuoteRequest>,\n ) => InputValues[keyof InputValues] | undefined\n >\n> = {\n srcTokenAddress: ({ srcTokenAddress, srcChainId }) =>\n srcChainId\n ? formatAddressToAssetId(srcTokenAddress ?? '', srcChainId)\n : undefined,\n destTokenAddress: ({ destTokenAddress, destChainId }) =>\n destChainId\n ? formatAddressToAssetId(destTokenAddress ?? '', destChainId)\n : undefined,\n srcChainId: ({ srcChainId }) =>\n srcChainId ? formatChainIdToCaip(srcChainId) : undefined,\n destChainId: ({ destChainId }) =>\n destChainId ? formatChainIdToCaip(destChainId) : undefined,\n slippage: ({ slippage }) => (slippage ? Number(slippage) : slippage),\n};\n\nexport const getSwapType = (\n srcChainId?: GenericQuoteRequest['srcChainId'],\n destChainId?: GenericQuoteRequest['destChainId'],\n) => {\n if (srcChainId && !isCrossChain(srcChainId, destChainId ?? srcChainId)) {\n return MetricsSwapType.SINGLE;\n }\n return MetricsSwapType.CROSSCHAIN;\n};\n\nexport const getSwapTypeFromQuote = (\n quoteRequest: Partial<GenericQuoteRequest>,\n) => {\n return getSwapType(quoteRequest.srcChainId, quoteRequest.destChainId);\n};\n\nexport const formatProviderLabel = ({\n bridgeId,\n bridges,\n}: QuoteResponse<TxData | string>['quote']): `${string}_${string}` =>\n `${bridgeId}_${bridges[0]}`;\n\n/**\n * @param quoteRequest - The current quote request used to derive chain and token identity fields.\n * @param quoteRequest.srcChainId - Source chain id of the quote request.\n * @param quoteRequest.destChainId - Destination chain id of the quote request.\n * @param quoteRequest.srcTokenAddress - Source token address of the quote request.\n * @param quoteRequest.destTokenAddress - Destination token address of the quote request.\n * @param tokenSecurityTypeDestination - The security classification of the destination token,\n * supplied by the client (e.g. from token security/scanning data). Pass `null` when no\n * security data is available for the selected destination token.\n * @returns The analytics request params derived from the quote request, minus token symbols\n * which the caller provides separately.\n */\nexport const getRequestParams = (\n {\n srcChainId,\n destChainId,\n srcTokenAddress,\n destTokenAddress,\n }: Partial<GenericQuoteRequest>,\n tokenSecurityTypeDestination: string | null,\n): Omit<RequestParams, 'token_symbol_source' | 'token_symbol_destination'> => {\n // Fallback to ETH if srcChainId is not defined. This is ok since the clients default to Ethereum as the source chain\n // This also doesn't happen at runtime since the quote request is validated before metrics are published\n const srcChainIdCaip = formatChainIdToCaip(srcChainId ?? ChainId.ETH);\n return {\n chain_id_source: srcChainIdCaip,\n chain_id_destination: destChainId ? formatChainIdToCaip(destChainId) : null,\n token_address_source: srcTokenAddress\n ? (formatAddressToAssetId(srcTokenAddress, srcChainIdCaip) ??\n getNativeAssetForChainId(srcChainIdCaip)?.assetId ??\n null)\n : (getNativeAssetForChainId(srcChainIdCaip)?.assetId ?? null),\n token_address_destination: destTokenAddress\n ? (formatAddressToAssetId(\n destTokenAddress,\n destChainId ?? srcChainIdCaip,\n ) ?? null)\n : null,\n token_security_type_destination: tokenSecurityTypeDestination,\n };\n};\n\nexport const getAccountHardwareType = (\n selectedAccount?: AccountsControllerState['internalAccounts']['accounts'][string],\n): AccountHardwareType => {\n // Unified bridge analytics only support the schema enum values for hardware accounts.\n switch (selectedAccount?.metadata?.keyring.type) {\n case 'Ledger Hardware':\n return 'Ledger';\n case 'Trezor Hardware':\n return 'Trezor';\n case 'QR Hardware Wallet Device':\n return 'QR Hardware';\n case 'Lattice Hardware':\n return 'Lattice';\n default:\n return null;\n }\n};\n\nexport const isHardwareWallet = (\n selectedAccount?: AccountsControllerState['internalAccounts']['accounts'][string],\n) => {\n return getAccountHardwareType(selectedAccount) !== null;\n};\n\n/**\n * @param slippage - The slippage percentage\n * @returns Whether the default slippage was overridden by the user\n *\n * @deprecated This function should not be used. Use {@link selectDefaultSlippagePercentage} instead.\n */\nexport const isCustomSlippage = (slippage: GenericQuoteRequest['slippage']) => {\n return slippage !== DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest[0]?.slippage;\n};\n\nexport const getQuotesReceivedProperties = (\n activeQuote: null | (QuoteResponse & Partial<QuoteMetadata>),\n warnings: QuoteWarning[] = [],\n isSubmittable: boolean = true,\n recommendedQuote?: null | (QuoteResponse & Partial<QuoteMetadata>),\n usdBalanceSource?: number,\n) => {\n const provider = activeQuote ? formatProviderLabel(activeQuote.quote) : '_';\n return {\n can_submit: isSubmittable,\n gas_included: Boolean(activeQuote?.quote?.gasIncluded),\n gas_included_7702: Boolean(activeQuote?.quote?.gasIncluded7702),\n quoted_time_minutes: activeQuote?.estimatedProcessingTimeInSeconds\n ? activeQuote.estimatedProcessingTimeInSeconds / 60\n : 0,\n usd_quoted_gas: Number(activeQuote?.gasFee?.effective?.usd ?? 0),\n usd_quoted_return: Number(activeQuote?.toTokenAmount?.usd ?? 0),\n usd_balance_source: usdBalanceSource ?? 0,\n best_quote_provider: recommendedQuote\n ? formatProviderLabel(recommendedQuote.quote)\n : provider,\n provider,\n warnings,\n price_impact: Number(activeQuote?.quote.priceData?.priceImpact ?? 0),\n };\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sortQuotes = exports.formatEtaInMinutes = exports.calcSlippagePercentage = exports.calcCost = exports.calcSwapRate = exports.calcAdjustedReturn = exports.calcIncludedTxFees = exports.calcTotalMaxNetworkFee = exports.calcTotalEstimatedNetworkFee = exports.calcEstimatedAndMaxTotalGasFee = exports.calcRelayerFee = exports.calcSentAmount = exports.calcToAmount = exports.calcNonEvmTotalNetworkFee = exports.getQuoteIdentifier = exports.isValidQuoteRequest = void 0;
3
+ exports.sortQuotes = exports.formatEtaInMinutes = exports.calcSlippagePercentage = exports.calcCost = exports.calcSwapRate = exports.calcAdjustedReturn = exports.calcIncludedTxFees = exports.calcTotalMaxNetworkFee = exports.calcTotalEstimatedNetworkFee = exports.calcEstimatedAndMaxTotalGasFee = exports.calcRelayerFee = exports.calcSentAmount = exports.calcToAmount = exports.calcNonEvmTotalNetworkFee = exports.getQuoteIdentifier = exports.isValidBatchSellQuoteRequest = exports.isValidQuoteRequest = void 0;
4
4
  /* eslint-disable @typescript-eslint/explicit-function-return-type */
5
5
  const controller_utils_1 = require("@metamask/controller-utils");
6
6
  const bignumber_js_1 = require("bignumber.js");
@@ -56,6 +56,8 @@ const isValidQuoteRequest = (partialRequest, requireAmount = true) => {
56
56
  : true));
57
57
  };
58
58
  exports.isValidQuoteRequest = isValidQuoteRequest;
59
+ const isValidBatchSellQuoteRequest = (quoteRequests, requireAmount = true) => quoteRequests.every((req) => (0, exports.isValidQuoteRequest)(req, requireAmount));
60
+ exports.isValidBatchSellQuoteRequest = isValidBatchSellQuoteRequest;
59
61
  /**
60
62
  * Generates a pseudo-unique string that identifies each quote by aggregator, bridge, and steps
61
63
  *
@@ -1 +1 @@
1
- {"version":3,"file":"quote.cjs","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport {\n convertHexToDecimal,\n toHex,\n weiHexToGweiDec,\n} from '@metamask/controller-utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport type {\n BridgeAsset,\n ExchangeRate,\n GenericQuoteRequest,\n L1GasFees,\n Quote,\n QuoteMetadata,\n QuoteResponse,\n NonEvmFees,\n TxData,\n} from '../types';\nimport { isNativeAddress, isNonEvmChainId } from './bridge';\nimport { FeatureId } from './validators';\n\nexport const isValidQuoteRequest = (\n partialRequest: Partial<GenericQuoteRequest>,\n requireAmount = true,\n): partialRequest is GenericQuoteRequest => {\n const stringFields = [\n 'srcTokenAddress',\n 'destTokenAddress',\n 'srcChainId',\n 'destChainId',\n 'walletAddress',\n ];\n if (requireAmount) {\n stringFields.push('srcTokenAmount');\n }\n // If bridging between different chain types or different non-EVM chains, require dest wallet address\n // Cases that need destWalletAddress:\n // 1. EVM -> non-EVM\n // 2. non-EVM -> EVM\n // 3. non-EVM -> different non-EVM (e.g., SOL -> BTC)\n // Only same-chain swaps don't need destWalletAddress\n if (\n partialRequest.destChainId &&\n partialRequest.srcChainId &&\n partialRequest.destChainId !== partialRequest.srcChainId && // Different chains\n (isNonEvmChainId(partialRequest.destChainId) ||\n isNonEvmChainId(partialRequest.srcChainId)) // At least one is non-EVM\n ) {\n stringFields.push('destWalletAddress');\n if (!partialRequest.destWalletAddress) {\n return false;\n }\n }\n const numberFields = [];\n // if slippage is defined, require it to be a number\n if (partialRequest.slippage !== undefined) {\n numberFields.push('slippage');\n }\n\n return (\n stringFields.every(\n (field) =>\n field in partialRequest &&\n typeof partialRequest[field as keyof typeof partialRequest] ===\n 'string' &&\n partialRequest[field as keyof typeof partialRequest] !== undefined &&\n partialRequest[field as keyof typeof partialRequest] !== '' &&\n partialRequest[field as keyof typeof partialRequest] !== null,\n ) &&\n numberFields.every(\n (field) =>\n field in partialRequest &&\n typeof partialRequest[field as keyof typeof partialRequest] ===\n 'number' &&\n partialRequest[field as keyof typeof partialRequest] !== undefined &&\n !isNaN(Number(partialRequest[field as keyof typeof partialRequest])) &&\n partialRequest[field as keyof typeof partialRequest] !== null,\n ) &&\n (requireAmount\n ? Boolean((partialRequest.srcTokenAmount ?? '').match(/^[1-9]\\d*$/u))\n : true)\n );\n};\n\n/**\n * Generates a pseudo-unique string that identifies each quote by aggregator, bridge, and steps\n *\n * @param quote - The quote to generate an identifier for\n * @returns A pseudo-unique string that identifies the quote\n */\nexport const getQuoteIdentifier = (quote: QuoteResponse['quote']) =>\n `${quote.bridgeId}-${quote.bridges[0]}-${quote.steps.length}`;\n\nconst calcTokenAmount = (value: string | BigNumber, decimals: number) => {\n const divisor = new BigNumber(10).pow(decimals ?? 0);\n return new BigNumber(value).div(divisor);\n};\n\nexport const calcNonEvmTotalNetworkFee = (\n bridgeQuote: QuoteResponse & NonEvmFees,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const { nonEvmFeesInNative } = bridgeQuote;\n // Fees are now stored directly in native units (SOL, BTC) without conversion\n const feeInNative = new BigNumber(nonEvmFeesInNative ?? '0');\n\n return {\n amount: feeInNative.toString(),\n valueInCurrency: exchangeRate\n ? feeInNative.times(exchangeRate).toString()\n : null,\n usd: usdExchangeRate ? feeInNative.times(usdExchangeRate).toString() : null,\n };\n};\n\nexport const calcToAmount = (\n destTokenAmount: string,\n destAsset: BridgeAsset,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const normalizedDestAmount = calcTokenAmount(\n destTokenAmount,\n destAsset.decimals,\n );\n return {\n amount: normalizedDestAmount.toString(),\n valueInCurrency: exchangeRate\n ? normalizedDestAmount.times(exchangeRate).toString()\n : null,\n usd: usdExchangeRate\n ? normalizedDestAmount.times(usdExchangeRate).toString()\n : null,\n };\n};\n\nexport const calcSentAmount = (\n { srcTokenAmount, srcAsset, feeData }: Quote,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n // Find all fees that will be taken from the src token\n const srcTokenFees = Object.values(feeData).filter(\n (fee) => fee && fee.amount && fee.asset?.assetId === srcAsset.assetId,\n );\n const sentAmount = srcTokenFees.reduce(\n (acc, { amount }) => acc.plus(amount),\n new BigNumber(srcTokenAmount),\n );\n const normalizedSentAmount = calcTokenAmount(sentAmount, srcAsset.decimals);\n return {\n amount: normalizedSentAmount.toString(),\n valueInCurrency: exchangeRate\n ? normalizedSentAmount.times(exchangeRate).toString()\n : null,\n usd: usdExchangeRate\n ? normalizedSentAmount.times(usdExchangeRate).toString()\n : null,\n };\n};\n\nexport const calcRelayerFee = (\n quoteResponse: QuoteResponse<TxData, TxData>,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const { quote, trade } = quoteResponse;\n const relayerFeeAmount = new BigNumber(\n convertHexToDecimal(trade.value || '0x0'),\n );\n let relayerFeeInNative = calcTokenAmount(relayerFeeAmount, 18);\n\n // Subtract srcAmount and other fees from trade value if srcAsset is native\n if (isNativeAddress(quote.srcAsset.address)) {\n const sentAmountInNative = calcSentAmount(quote, {\n exchangeRate,\n usdExchangeRate,\n }).amount;\n relayerFeeInNative = relayerFeeInNative.minus(sentAmountInNative);\n }\n\n return {\n amount: relayerFeeInNative,\n valueInCurrency: exchangeRate\n ? relayerFeeInNative.times(exchangeRate)\n : null,\n usd: usdExchangeRate ? relayerFeeInNative.times(usdExchangeRate) : null,\n };\n};\n\nconst calcTotalGasFee = ({\n approvalGasLimit,\n resetApprovalGasLimit,\n tradeGasLimit,\n l1GasFeesInHexWei,\n feePerGasInDecGwei,\n nativeToDisplayCurrencyExchangeRate,\n nativeToUsdExchangeRate,\n}: {\n approvalGasLimit?: number | null;\n resetApprovalGasLimit?: number | null;\n tradeGasLimit?: number | null;\n l1GasFeesInHexWei?: string | null;\n feePerGasInDecGwei?: string;\n nativeToDisplayCurrencyExchangeRate?: string;\n nativeToUsdExchangeRate?: string;\n}) => {\n const totalGasLimitInDec = new BigNumber(tradeGasLimit?.toString() ?? '0')\n .plus(approvalGasLimit?.toString() ?? '0')\n .plus(resetApprovalGasLimit?.toString() ?? '0');\n\n const l1GasFeesInDecGWei = weiHexToGweiDec(toHex(l1GasFeesInHexWei ?? '0'));\n const gasFeesInDecGwei = totalGasLimitInDec\n .times(feePerGasInDecGwei ?? '0')\n .plus(l1GasFeesInDecGWei);\n const gasFeesInDecEth = gasFeesInDecGwei.times(new BigNumber(10).pow(-9));\n\n const gasFeesInDisplayCurrency = nativeToDisplayCurrencyExchangeRate\n ? gasFeesInDecEth.times(nativeToDisplayCurrencyExchangeRate.toString())\n : null;\n const gasFeesInUSD = nativeToUsdExchangeRate\n ? gasFeesInDecEth.times(nativeToUsdExchangeRate.toString())\n : null;\n\n return {\n amount: gasFeesInDecEth.toString(),\n valueInCurrency: gasFeesInDisplayCurrency?.toString() ?? null,\n usd: gasFeesInUSD?.toString() ?? null,\n };\n};\n\nexport const calcEstimatedAndMaxTotalGasFee = ({\n bridgeQuote: { approval, trade, l1GasFeesInHexWei, resetApproval },\n feePerGasInDecGwei,\n maxFeePerGasInDecGwei,\n exchangeRate: nativeToDisplayCurrencyExchangeRate,\n usdExchangeRate: nativeToUsdExchangeRate,\n}: {\n bridgeQuote: QuoteResponse<TxData, TxData> & L1GasFees;\n maxFeePerGasInDecGwei?: string;\n feePerGasInDecGwei?: string;\n} & ExchangeRate): QuoteMetadata['gasFee'] => {\n // Estimated gas fees spent after receiving refunds, this is shown to the user\n const {\n amount: amountEffective,\n valueInCurrency: valueInCurrencyEffective,\n usd: usdEffective,\n } = calcTotalGasFee({\n // Fallback to gasLimit if effectiveGas is not available\n approvalGasLimit: approval?.effectiveGas ?? approval?.gasLimit,\n resetApprovalGasLimit:\n resetApproval?.effectiveGas ?? resetApproval?.gasLimit,\n tradeGasLimit: trade?.effectiveGas ?? trade?.gasLimit,\n l1GasFeesInHexWei,\n feePerGasInDecGwei,\n nativeToDisplayCurrencyExchangeRate,\n nativeToUsdExchangeRate,\n });\n\n // Estimated total gas fee, including refunded fees (medium)\n const { amount, valueInCurrency, usd } = calcTotalGasFee({\n approvalGasLimit: approval?.gasLimit,\n resetApprovalGasLimit: resetApproval?.gasLimit,\n tradeGasLimit: trade?.gasLimit,\n l1GasFeesInHexWei,\n feePerGasInDecGwei,\n nativeToDisplayCurrencyExchangeRate,\n nativeToUsdExchangeRate,\n });\n\n // Max gas fee (high), used to disable submission of the transaction\n const {\n amount: amountMax,\n valueInCurrency: valueInCurrencyMax,\n usd: usdMax,\n } = calcTotalGasFee({\n approvalGasLimit: approval?.gasLimit,\n resetApprovalGasLimit: resetApproval?.gasLimit,\n tradeGasLimit: trade?.gasLimit,\n l1GasFeesInHexWei,\n feePerGasInDecGwei: maxFeePerGasInDecGwei,\n nativeToDisplayCurrencyExchangeRate,\n nativeToUsdExchangeRate,\n });\n\n return {\n effective: {\n amount: amountEffective,\n valueInCurrency: valueInCurrencyEffective,\n usd: usdEffective,\n },\n total: {\n amount,\n valueInCurrency,\n usd,\n },\n max: {\n amount: amountMax,\n valueInCurrency: valueInCurrencyMax,\n usd: usdMax,\n },\n };\n};\n\n/**\n * Calculates the total estimated network fees for the bridge transaction\n *\n * @param gasFee - The gas fee for the bridge transaction\n * @param gasFee.total - The fee to display to the user. If not available, this is equal to the gasLimit (total)\n * @param relayerFee - The relayer fee paid to bridge providers\n * @returns The total estimated network fee for the bridge transaction, including the relayer fee paid to bridge providers\n */\nexport const calcTotalEstimatedNetworkFee = (\n { total: gasFeeToDisplay }: ReturnType<typeof calcEstimatedAndMaxTotalGasFee>,\n relayerFee: ReturnType<typeof calcRelayerFee>,\n) => {\n return {\n amount: new BigNumber(gasFeeToDisplay?.amount ?? '0')\n .plus(relayerFee.amount)\n .toString(),\n valueInCurrency: gasFeeToDisplay?.valueInCurrency\n ? new BigNumber(gasFeeToDisplay.valueInCurrency)\n .plus(relayerFee.valueInCurrency ?? '0')\n .toString()\n : null,\n usd: gasFeeToDisplay?.usd\n ? new BigNumber(gasFeeToDisplay.usd)\n .plus(relayerFee.usd ?? '0')\n .toString()\n : null,\n };\n};\n\nexport const calcTotalMaxNetworkFee = (\n gasFee: ReturnType<typeof calcEstimatedAndMaxTotalGasFee>,\n relayerFee: ReturnType<typeof calcRelayerFee>,\n) => {\n return {\n amount: new BigNumber(gasFee.max.amount).plus(relayerFee.amount).toString(),\n valueInCurrency: gasFee.max.valueInCurrency\n ? new BigNumber(gasFee.max.valueInCurrency)\n .plus(relayerFee.valueInCurrency ?? '0')\n .toString()\n : null,\n usd: gasFee.max.usd\n ? new BigNumber(gasFee.max.usd).plus(relayerFee.usd ?? '0').toString()\n : null,\n };\n};\n\n// Gas is included for some swap quotes and this is the value displayed in the client\nexport const calcIncludedTxFees = (\n { gasIncluded, gasIncluded7702, srcAsset, feeData: { txFee } }: Quote,\n srcTokenExchangeRate: ExchangeRate,\n destTokenExchangeRate: ExchangeRate,\n) => {\n if (!txFee || !(gasIncluded || gasIncluded7702)) {\n return null;\n }\n // Use exchange rate of the token that is being used to pay for the transaction\n const { exchangeRate, usdExchangeRate } =\n txFee.asset.assetId === srcAsset.assetId\n ? srcTokenExchangeRate\n : destTokenExchangeRate;\n const normalizedTxFeeAmount = calcTokenAmount(\n txFee.amount,\n txFee.asset.decimals,\n );\n\n return {\n amount: normalizedTxFeeAmount.toString(),\n valueInCurrency: exchangeRate\n ? normalizedTxFeeAmount.times(exchangeRate).toString()\n : null,\n usd: usdExchangeRate\n ? normalizedTxFeeAmount.times(usdExchangeRate).toString()\n : null,\n };\n};\n\nexport const calcAdjustedReturn = (\n toTokenAmount: ReturnType<typeof calcToAmount>,\n totalEstimatedNetworkFee: ReturnType<typeof calcTotalEstimatedNetworkFee>,\n { feeData: { txFee }, destAsset: { assetId: destAssetId } }: Quote,\n) => {\n // If gas is included and is taken from the dest token, don't subtract network fee from return\n if (txFee?.asset?.assetId === destAssetId) {\n return {\n valueInCurrency: toTokenAmount.valueInCurrency,\n usd: toTokenAmount.usd,\n };\n }\n return {\n valueInCurrency:\n toTokenAmount.valueInCurrency && totalEstimatedNetworkFee.valueInCurrency\n ? new BigNumber(toTokenAmount.valueInCurrency)\n .minus(totalEstimatedNetworkFee.valueInCurrency)\n .toString()\n : null,\n usd:\n toTokenAmount.usd && totalEstimatedNetworkFee.usd\n ? new BigNumber(toTokenAmount.usd)\n .minus(totalEstimatedNetworkFee.usd)\n .toString()\n : null,\n };\n};\n\nexport const calcSwapRate = (sentAmount: string, destTokenAmount: string) =>\n new BigNumber(destTokenAmount).div(sentAmount).toString();\n\nexport const calcCost = (\n adjustedReturn: ReturnType<typeof calcAdjustedReturn>,\n sentAmount: ReturnType<typeof calcSentAmount>,\n) => ({\n valueInCurrency:\n adjustedReturn.valueInCurrency && sentAmount.valueInCurrency\n ? new BigNumber(sentAmount.valueInCurrency)\n .minus(adjustedReturn.valueInCurrency)\n .toString()\n : null,\n usd:\n adjustedReturn.usd && sentAmount.usd\n ? new BigNumber(sentAmount.usd).minus(adjustedReturn.usd).toString()\n : null,\n});\n\n/**\n * Calculates the slippage absolute value percentage based on the adjusted return and sent amount.\n *\n * @param adjustedReturn - Adjusted return value\n * @param sentAmount - Sent amount value\n * @returns the slippage in percentage\n */\nexport const calcSlippagePercentage = (\n adjustedReturn: ReturnType<typeof calcAdjustedReturn>,\n sentAmount: ReturnType<typeof calcSentAmount>,\n): string | null => {\n const cost = calcCost(adjustedReturn, sentAmount);\n\n if (cost.valueInCurrency && sentAmount.valueInCurrency) {\n return new BigNumber(cost.valueInCurrency)\n .div(sentAmount.valueInCurrency)\n .times(100)\n .abs()\n .toString();\n }\n\n if (cost.usd && sentAmount.usd) {\n return new BigNumber(cost.usd)\n .div(sentAmount.usd)\n .times(100)\n .abs()\n .toString();\n }\n\n return null;\n};\n\nexport const formatEtaInMinutes = (\n estimatedProcessingTimeInSeconds: number,\n) => {\n if (estimatedProcessingTimeInSeconds < 60) {\n return `< 1`;\n }\n return (estimatedProcessingTimeInSeconds / 60).toFixed();\n};\n\nexport const sortQuotes = (\n quotes: QuoteResponse[],\n featureId: FeatureId | null,\n) => {\n // Sort perps quotes by increasing estimated processing time (fastest first)\n if (featureId === FeatureId.PERPS) {\n return quotes.sort((a, b) => {\n return (\n a.estimatedProcessingTimeInSeconds - b.estimatedProcessingTimeInSeconds\n );\n });\n }\n return quotes;\n};\n"]}
1
+ {"version":3,"file":"quote.cjs","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport {\n convertHexToDecimal,\n toHex,\n weiHexToGweiDec,\n} from '@metamask/controller-utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport type {\n BridgeAsset,\n ExchangeRate,\n GenericQuoteRequest,\n L1GasFees,\n Quote,\n QuoteMetadata,\n QuoteResponse,\n NonEvmFees,\n TxData,\n} from '../types';\nimport { isNativeAddress, isNonEvmChainId } from './bridge';\nimport { FeatureId } from './validators';\n\nexport const isValidQuoteRequest = (\n partialRequest: Partial<GenericQuoteRequest>,\n requireAmount = true,\n): partialRequest is GenericQuoteRequest => {\n const stringFields = [\n 'srcTokenAddress',\n 'destTokenAddress',\n 'srcChainId',\n 'destChainId',\n 'walletAddress',\n ];\n if (requireAmount) {\n stringFields.push('srcTokenAmount');\n }\n // If bridging between different chain types or different non-EVM chains, require dest wallet address\n // Cases that need destWalletAddress:\n // 1. EVM -> non-EVM\n // 2. non-EVM -> EVM\n // 3. non-EVM -> different non-EVM (e.g., SOL -> BTC)\n // Only same-chain swaps don't need destWalletAddress\n if (\n partialRequest.destChainId &&\n partialRequest.srcChainId &&\n partialRequest.destChainId !== partialRequest.srcChainId && // Different chains\n (isNonEvmChainId(partialRequest.destChainId) ||\n isNonEvmChainId(partialRequest.srcChainId)) // At least one is non-EVM\n ) {\n stringFields.push('destWalletAddress');\n if (!partialRequest.destWalletAddress) {\n return false;\n }\n }\n const numberFields = [];\n // if slippage is defined, require it to be a number\n if (partialRequest.slippage !== undefined) {\n numberFields.push('slippage');\n }\n\n return (\n stringFields.every(\n (field) =>\n field in partialRequest &&\n typeof partialRequest[field as keyof typeof partialRequest] ===\n 'string' &&\n partialRequest[field as keyof typeof partialRequest] !== undefined &&\n partialRequest[field as keyof typeof partialRequest] !== '' &&\n partialRequest[field as keyof typeof partialRequest] !== null,\n ) &&\n numberFields.every(\n (field) =>\n field in partialRequest &&\n typeof partialRequest[field as keyof typeof partialRequest] ===\n 'number' &&\n partialRequest[field as keyof typeof partialRequest] !== undefined &&\n !isNaN(Number(partialRequest[field as keyof typeof partialRequest])) &&\n partialRequest[field as keyof typeof partialRequest] !== null,\n ) &&\n (requireAmount\n ? Boolean((partialRequest.srcTokenAmount ?? '').match(/^[1-9]\\d*$/u))\n : true)\n );\n};\n\nexport const isValidBatchSellQuoteRequest = (\n quoteRequests: Partial<GenericQuoteRequest>[],\n requireAmount = true,\n): quoteRequests is GenericQuoteRequest[] =>\n quoteRequests.every((req) => isValidQuoteRequest(req, requireAmount));\n\n/**\n * Generates a pseudo-unique string that identifies each quote by aggregator, bridge, and steps\n *\n * @param quote - The quote to generate an identifier for\n * @returns A pseudo-unique string that identifies the quote\n */\nexport const getQuoteIdentifier = (quote: QuoteResponse['quote']) =>\n `${quote.bridgeId}-${quote.bridges[0]}-${quote.steps.length}`;\n\nconst calcTokenAmount = (value: string | BigNumber, decimals: number) => {\n const divisor = new BigNumber(10).pow(decimals ?? 0);\n return new BigNumber(value).div(divisor);\n};\n\nexport const calcNonEvmTotalNetworkFee = (\n bridgeQuote: QuoteResponse & NonEvmFees,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const { nonEvmFeesInNative } = bridgeQuote;\n // Fees are now stored directly in native units (SOL, BTC) without conversion\n const feeInNative = new BigNumber(nonEvmFeesInNative ?? '0');\n\n return {\n amount: feeInNative.toString(),\n valueInCurrency: exchangeRate\n ? feeInNative.times(exchangeRate).toString()\n : null,\n usd: usdExchangeRate ? feeInNative.times(usdExchangeRate).toString() : null,\n };\n};\n\nexport const calcToAmount = (\n destTokenAmount: string,\n destAsset: BridgeAsset,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const normalizedDestAmount = calcTokenAmount(\n destTokenAmount,\n destAsset.decimals,\n );\n return {\n amount: normalizedDestAmount.toString(),\n valueInCurrency: exchangeRate\n ? normalizedDestAmount.times(exchangeRate).toString()\n : null,\n usd: usdExchangeRate\n ? normalizedDestAmount.times(usdExchangeRate).toString()\n : null,\n };\n};\n\nexport const calcSentAmount = (\n { srcTokenAmount, srcAsset, feeData }: Quote,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n // Find all fees that will be taken from the src token\n const srcTokenFees = Object.values(feeData).filter(\n (fee) => fee && fee.amount && fee.asset?.assetId === srcAsset.assetId,\n );\n const sentAmount = srcTokenFees.reduce(\n (acc, { amount }) => acc.plus(amount),\n new BigNumber(srcTokenAmount),\n );\n const normalizedSentAmount = calcTokenAmount(sentAmount, srcAsset.decimals);\n return {\n amount: normalizedSentAmount.toString(),\n valueInCurrency: exchangeRate\n ? normalizedSentAmount.times(exchangeRate).toString()\n : null,\n usd: usdExchangeRate\n ? normalizedSentAmount.times(usdExchangeRate).toString()\n : null,\n };\n};\n\nexport const calcRelayerFee = (\n quoteResponse: QuoteResponse<TxData, TxData>,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const { quote, trade } = quoteResponse;\n const relayerFeeAmount = new BigNumber(\n convertHexToDecimal(trade.value || '0x0'),\n );\n let relayerFeeInNative = calcTokenAmount(relayerFeeAmount, 18);\n\n // Subtract srcAmount and other fees from trade value if srcAsset is native\n if (isNativeAddress(quote.srcAsset.address)) {\n const sentAmountInNative = calcSentAmount(quote, {\n exchangeRate,\n usdExchangeRate,\n }).amount;\n relayerFeeInNative = relayerFeeInNative.minus(sentAmountInNative);\n }\n\n return {\n amount: relayerFeeInNative,\n valueInCurrency: exchangeRate\n ? relayerFeeInNative.times(exchangeRate)\n : null,\n usd: usdExchangeRate ? relayerFeeInNative.times(usdExchangeRate) : null,\n };\n};\n\nconst calcTotalGasFee = ({\n approvalGasLimit,\n resetApprovalGasLimit,\n tradeGasLimit,\n l1GasFeesInHexWei,\n feePerGasInDecGwei,\n nativeToDisplayCurrencyExchangeRate,\n nativeToUsdExchangeRate,\n}: {\n approvalGasLimit?: number | null;\n resetApprovalGasLimit?: number | null;\n tradeGasLimit?: number | null;\n l1GasFeesInHexWei?: string | null;\n feePerGasInDecGwei?: string;\n nativeToDisplayCurrencyExchangeRate?: string;\n nativeToUsdExchangeRate?: string;\n}) => {\n const totalGasLimitInDec = new BigNumber(tradeGasLimit?.toString() ?? '0')\n .plus(approvalGasLimit?.toString() ?? '0')\n .plus(resetApprovalGasLimit?.toString() ?? '0');\n\n const l1GasFeesInDecGWei = weiHexToGweiDec(toHex(l1GasFeesInHexWei ?? '0'));\n const gasFeesInDecGwei = totalGasLimitInDec\n .times(feePerGasInDecGwei ?? '0')\n .plus(l1GasFeesInDecGWei);\n const gasFeesInDecEth = gasFeesInDecGwei.times(new BigNumber(10).pow(-9));\n\n const gasFeesInDisplayCurrency = nativeToDisplayCurrencyExchangeRate\n ? gasFeesInDecEth.times(nativeToDisplayCurrencyExchangeRate.toString())\n : null;\n const gasFeesInUSD = nativeToUsdExchangeRate\n ? gasFeesInDecEth.times(nativeToUsdExchangeRate.toString())\n : null;\n\n return {\n amount: gasFeesInDecEth.toString(),\n valueInCurrency: gasFeesInDisplayCurrency?.toString() ?? null,\n usd: gasFeesInUSD?.toString() ?? null,\n };\n};\n\nexport const calcEstimatedAndMaxTotalGasFee = ({\n bridgeQuote: { approval, trade, l1GasFeesInHexWei, resetApproval },\n feePerGasInDecGwei,\n maxFeePerGasInDecGwei,\n exchangeRate: nativeToDisplayCurrencyExchangeRate,\n usdExchangeRate: nativeToUsdExchangeRate,\n}: {\n bridgeQuote: QuoteResponse<TxData, TxData> & L1GasFees;\n maxFeePerGasInDecGwei?: string;\n feePerGasInDecGwei?: string;\n} & ExchangeRate): QuoteMetadata['gasFee'] => {\n // Estimated gas fees spent after receiving refunds, this is shown to the user\n const {\n amount: amountEffective,\n valueInCurrency: valueInCurrencyEffective,\n usd: usdEffective,\n } = calcTotalGasFee({\n // Fallback to gasLimit if effectiveGas is not available\n approvalGasLimit: approval?.effectiveGas ?? approval?.gasLimit,\n resetApprovalGasLimit:\n resetApproval?.effectiveGas ?? resetApproval?.gasLimit,\n tradeGasLimit: trade?.effectiveGas ?? trade?.gasLimit,\n l1GasFeesInHexWei,\n feePerGasInDecGwei,\n nativeToDisplayCurrencyExchangeRate,\n nativeToUsdExchangeRate,\n });\n\n // Estimated total gas fee, including refunded fees (medium)\n const { amount, valueInCurrency, usd } = calcTotalGasFee({\n approvalGasLimit: approval?.gasLimit,\n resetApprovalGasLimit: resetApproval?.gasLimit,\n tradeGasLimit: trade?.gasLimit,\n l1GasFeesInHexWei,\n feePerGasInDecGwei,\n nativeToDisplayCurrencyExchangeRate,\n nativeToUsdExchangeRate,\n });\n\n // Max gas fee (high), used to disable submission of the transaction\n const {\n amount: amountMax,\n valueInCurrency: valueInCurrencyMax,\n usd: usdMax,\n } = calcTotalGasFee({\n approvalGasLimit: approval?.gasLimit,\n resetApprovalGasLimit: resetApproval?.gasLimit,\n tradeGasLimit: trade?.gasLimit,\n l1GasFeesInHexWei,\n feePerGasInDecGwei: maxFeePerGasInDecGwei,\n nativeToDisplayCurrencyExchangeRate,\n nativeToUsdExchangeRate,\n });\n\n return {\n effective: {\n amount: amountEffective,\n valueInCurrency: valueInCurrencyEffective,\n usd: usdEffective,\n },\n total: {\n amount,\n valueInCurrency,\n usd,\n },\n max: {\n amount: amountMax,\n valueInCurrency: valueInCurrencyMax,\n usd: usdMax,\n },\n };\n};\n\n/**\n * Calculates the total estimated network fees for the bridge transaction\n *\n * @param gasFee - The gas fee for the bridge transaction\n * @param gasFee.total - The fee to display to the user. If not available, this is equal to the gasLimit (total)\n * @param relayerFee - The relayer fee paid to bridge providers\n * @returns The total estimated network fee for the bridge transaction, including the relayer fee paid to bridge providers\n */\nexport const calcTotalEstimatedNetworkFee = (\n { total: gasFeeToDisplay }: ReturnType<typeof calcEstimatedAndMaxTotalGasFee>,\n relayerFee: ReturnType<typeof calcRelayerFee>,\n) => {\n return {\n amount: new BigNumber(gasFeeToDisplay?.amount ?? '0')\n .plus(relayerFee.amount)\n .toString(),\n valueInCurrency: gasFeeToDisplay?.valueInCurrency\n ? new BigNumber(gasFeeToDisplay.valueInCurrency)\n .plus(relayerFee.valueInCurrency ?? '0')\n .toString()\n : null,\n usd: gasFeeToDisplay?.usd\n ? new BigNumber(gasFeeToDisplay.usd)\n .plus(relayerFee.usd ?? '0')\n .toString()\n : null,\n };\n};\n\nexport const calcTotalMaxNetworkFee = (\n gasFee: ReturnType<typeof calcEstimatedAndMaxTotalGasFee>,\n relayerFee: ReturnType<typeof calcRelayerFee>,\n) => {\n return {\n amount: new BigNumber(gasFee.max.amount).plus(relayerFee.amount).toString(),\n valueInCurrency: gasFee.max.valueInCurrency\n ? new BigNumber(gasFee.max.valueInCurrency)\n .plus(relayerFee.valueInCurrency ?? '0')\n .toString()\n : null,\n usd: gasFee.max.usd\n ? new BigNumber(gasFee.max.usd).plus(relayerFee.usd ?? '0').toString()\n : null,\n };\n};\n\n// Gas is included for some swap quotes and this is the value displayed in the client\nexport const calcIncludedTxFees = (\n { gasIncluded, gasIncluded7702, srcAsset, feeData: { txFee } }: Quote,\n srcTokenExchangeRate: ExchangeRate,\n destTokenExchangeRate: ExchangeRate,\n) => {\n if (!txFee || !(gasIncluded || gasIncluded7702)) {\n return null;\n }\n // Use exchange rate of the token that is being used to pay for the transaction\n const { exchangeRate, usdExchangeRate } =\n txFee.asset.assetId === srcAsset.assetId\n ? srcTokenExchangeRate\n : destTokenExchangeRate;\n const normalizedTxFeeAmount = calcTokenAmount(\n txFee.amount,\n txFee.asset.decimals,\n );\n\n return {\n amount: normalizedTxFeeAmount.toString(),\n valueInCurrency: exchangeRate\n ? normalizedTxFeeAmount.times(exchangeRate).toString()\n : null,\n usd: usdExchangeRate\n ? normalizedTxFeeAmount.times(usdExchangeRate).toString()\n : null,\n };\n};\n\nexport const calcAdjustedReturn = (\n toTokenAmount: ReturnType<typeof calcToAmount>,\n totalEstimatedNetworkFee: ReturnType<typeof calcTotalEstimatedNetworkFee>,\n { feeData: { txFee }, destAsset: { assetId: destAssetId } }: Quote,\n) => {\n // If gas is included and is taken from the dest token, don't subtract network fee from return\n if (txFee?.asset?.assetId === destAssetId) {\n return {\n valueInCurrency: toTokenAmount.valueInCurrency,\n usd: toTokenAmount.usd,\n };\n }\n return {\n valueInCurrency:\n toTokenAmount.valueInCurrency && totalEstimatedNetworkFee.valueInCurrency\n ? new BigNumber(toTokenAmount.valueInCurrency)\n .minus(totalEstimatedNetworkFee.valueInCurrency)\n .toString()\n : null,\n usd:\n toTokenAmount.usd && totalEstimatedNetworkFee.usd\n ? new BigNumber(toTokenAmount.usd)\n .minus(totalEstimatedNetworkFee.usd)\n .toString()\n : null,\n };\n};\n\nexport const calcSwapRate = (sentAmount: string, destTokenAmount: string) =>\n new BigNumber(destTokenAmount).div(sentAmount).toString();\n\nexport const calcCost = (\n adjustedReturn: ReturnType<typeof calcAdjustedReturn>,\n sentAmount: ReturnType<typeof calcSentAmount>,\n) => ({\n valueInCurrency:\n adjustedReturn.valueInCurrency && sentAmount.valueInCurrency\n ? new BigNumber(sentAmount.valueInCurrency)\n .minus(adjustedReturn.valueInCurrency)\n .toString()\n : null,\n usd:\n adjustedReturn.usd && sentAmount.usd\n ? new BigNumber(sentAmount.usd).minus(adjustedReturn.usd).toString()\n : null,\n});\n\n/**\n * Calculates the slippage absolute value percentage based on the adjusted return and sent amount.\n *\n * @param adjustedReturn - Adjusted return value\n * @param sentAmount - Sent amount value\n * @returns the slippage in percentage\n */\nexport const calcSlippagePercentage = (\n adjustedReturn: ReturnType<typeof calcAdjustedReturn>,\n sentAmount: ReturnType<typeof calcSentAmount>,\n): string | null => {\n const cost = calcCost(adjustedReturn, sentAmount);\n\n if (cost.valueInCurrency && sentAmount.valueInCurrency) {\n return new BigNumber(cost.valueInCurrency)\n .div(sentAmount.valueInCurrency)\n .times(100)\n .abs()\n .toString();\n }\n\n if (cost.usd && sentAmount.usd) {\n return new BigNumber(cost.usd)\n .div(sentAmount.usd)\n .times(100)\n .abs()\n .toString();\n }\n\n return null;\n};\n\nexport const formatEtaInMinutes = (\n estimatedProcessingTimeInSeconds: number,\n) => {\n if (estimatedProcessingTimeInSeconds < 60) {\n return `< 1`;\n }\n return (estimatedProcessingTimeInSeconds / 60).toFixed();\n};\n\nexport const sortQuotes = (\n quotes: QuoteResponse[],\n featureId: FeatureId | null,\n) => {\n // Sort perps quotes by increasing estimated processing time (fastest first)\n if (featureId === FeatureId.PERPS) {\n return quotes.sort((a, b) => {\n return (\n a.estimatedProcessingTimeInSeconds - b.estimatedProcessingTimeInSeconds\n );\n });\n }\n return quotes;\n};\n"]}
@@ -2,6 +2,7 @@ import { BigNumber } from "bignumber.js";
2
2
  import type { BridgeAsset, ExchangeRate, GenericQuoteRequest, L1GasFees, Quote, QuoteMetadata, QuoteResponse, NonEvmFees, TxData } from "../types.cjs";
3
3
  import { FeatureId } from "./validators.cjs";
4
4
  export declare const isValidQuoteRequest: (partialRequest: Partial<GenericQuoteRequest>, requireAmount?: boolean) => partialRequest is GenericQuoteRequest;
5
+ export declare const isValidBatchSellQuoteRequest: (quoteRequests: Partial<GenericQuoteRequest>[], requireAmount?: boolean) => quoteRequests is GenericQuoteRequest[];
5
6
  /**
6
7
  * Generates a pseudo-unique string that identifies each quote by aggregator, bridge, and steps
7
8
  *
@@ -1 +1 @@
1
- {"version":3,"file":"quote.d.cts","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,qBAAqB;AAEzC,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,KAAK,EACL,aAAa,EACb,aAAa,EACb,UAAU,EACV,MAAM,EACP,qBAAiB;AAElB,OAAO,EAAE,SAAS,EAAE,yBAAqB;AAEzC,eAAO,MAAM,mBAAmB,mBACd,QAAQ,mBAAmB,CAAC,mEA4D7C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,UAAW,aAAa,CAAC,OAAO,CAAC,WACD,CAAC;AAOhE,eAAO,MAAM,yBAAyB,gBACvB,aAAa,GAAG,UAAU,qCACJ,YAAY;;;;CAahD,CAAC;AAEF,eAAO,MAAM,YAAY,oBACN,MAAM,aACZ,WAAW,qCACa,YAAY;;;;CAehD,CAAC;AAEF,eAAO,MAAM,cAAc,0CACc,KAAK,qCACT,YAAY;;;;CAoBhD,CAAC;AAEF,eAAO,MAAM,cAAc,kBACV,cAAc,MAAM,EAAE,MAAM,CAAC,qCACT,YAAY;;;;CAwBhD,CAAC;AA2CF,eAAO,MAAM,8BAA8B;iBAO5B,cAAc,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS;;;qBAGrC,aAAa,CAAC,QAAQ,CA6DxC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,+BACX,WAAW,qCAAqC,CAAC,cACjE,WAAW,qBAAqB,CAAC;;;;CAiB9C,CAAC;AAEF,eAAO,MAAM,sBAAsB,WACzB,WAAW,qCAAqC,CAAC,cAC7C,WAAW,qBAAqB,CAAC;;;;CAa9C,CAAC;AAGF,eAAO,MAAM,kBAAkB,mEACmC,KAAK,wBAC/C,YAAY,yBACX,YAAY;;;;QAwBpC,CAAC;AAEF,eAAO,MAAM,kBAAkB,kBACd,WAAW,mBAAmB,CAAC,4BACpB,WAAW,mCAAmC,CAAC,+DACZ,KAAK;;;CAuBnE,CAAC;AAEF,eAAO,MAAM,YAAY,eAAgB,MAAM,mBAAmB,MAAM,WACb,CAAC;AAE5D,eAAO,MAAM,QAAQ,mBACH,WAAW,yBAAyB,CAAC,cACzC,WAAW,qBAAqB,CAAC;;;CAY7C,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,mBACjB,WAAW,yBAAyB,CAAC,cACzC,WAAW,qBAAqB,CAAC,KAC5C,MAAM,GAAG,IAoBX,CAAC;AAEF,eAAO,MAAM,kBAAkB,qCACK,MAAM,WAMzC,CAAC;AAEF,eAAO,MAAM,UAAU,WACb,aAAa,EAAE,aACZ,SAAS,GAAG,IAAI,oBAW5B,CAAC"}
1
+ {"version":3,"file":"quote.d.cts","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,qBAAqB;AAEzC,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,KAAK,EACL,aAAa,EACb,aAAa,EACb,UAAU,EACV,MAAM,EACP,qBAAiB;AAElB,OAAO,EAAE,SAAS,EAAE,yBAAqB;AAEzC,eAAO,MAAM,mBAAmB,mBACd,QAAQ,mBAAmB,CAAC,mEA4D7C,CAAC;AAEF,eAAO,MAAM,4BAA4B,kBACxB,QAAQ,mBAAmB,CAAC,EAAE,oEAGwB,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,UAAW,aAAa,CAAC,OAAO,CAAC,WACD,CAAC;AAOhE,eAAO,MAAM,yBAAyB,gBACvB,aAAa,GAAG,UAAU,qCACJ,YAAY;;;;CAahD,CAAC;AAEF,eAAO,MAAM,YAAY,oBACN,MAAM,aACZ,WAAW,qCACa,YAAY;;;;CAehD,CAAC;AAEF,eAAO,MAAM,cAAc,0CACc,KAAK,qCACT,YAAY;;;;CAoBhD,CAAC;AAEF,eAAO,MAAM,cAAc,kBACV,cAAc,MAAM,EAAE,MAAM,CAAC,qCACT,YAAY;;;;CAwBhD,CAAC;AA2CF,eAAO,MAAM,8BAA8B;iBAO5B,cAAc,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS;;;qBAGrC,aAAa,CAAC,QAAQ,CA6DxC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,+BACX,WAAW,qCAAqC,CAAC,cACjE,WAAW,qBAAqB,CAAC;;;;CAiB9C,CAAC;AAEF,eAAO,MAAM,sBAAsB,WACzB,WAAW,qCAAqC,CAAC,cAC7C,WAAW,qBAAqB,CAAC;;;;CAa9C,CAAC;AAGF,eAAO,MAAM,kBAAkB,mEACmC,KAAK,wBAC/C,YAAY,yBACX,YAAY;;;;QAwBpC,CAAC;AAEF,eAAO,MAAM,kBAAkB,kBACd,WAAW,mBAAmB,CAAC,4BACpB,WAAW,mCAAmC,CAAC,+DACZ,KAAK;;;CAuBnE,CAAC;AAEF,eAAO,MAAM,YAAY,eAAgB,MAAM,mBAAmB,MAAM,WACb,CAAC;AAE5D,eAAO,MAAM,QAAQ,mBACH,WAAW,yBAAyB,CAAC,cACzC,WAAW,qBAAqB,CAAC;;;CAY7C,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,mBACjB,WAAW,yBAAyB,CAAC,cACzC,WAAW,qBAAqB,CAAC,KAC5C,MAAM,GAAG,IAoBX,CAAC;AAEF,eAAO,MAAM,kBAAkB,qCACK,MAAM,WAMzC,CAAC;AAEF,eAAO,MAAM,UAAU,WACb,aAAa,EAAE,aACZ,SAAS,GAAG,IAAI,oBAW5B,CAAC"}
@@ -2,6 +2,7 @@ import { BigNumber } from "bignumber.js";
2
2
  import type { BridgeAsset, ExchangeRate, GenericQuoteRequest, L1GasFees, Quote, QuoteMetadata, QuoteResponse, NonEvmFees, TxData } from "../types.mjs";
3
3
  import { FeatureId } from "./validators.mjs";
4
4
  export declare const isValidQuoteRequest: (partialRequest: Partial<GenericQuoteRequest>, requireAmount?: boolean) => partialRequest is GenericQuoteRequest;
5
+ export declare const isValidBatchSellQuoteRequest: (quoteRequests: Partial<GenericQuoteRequest>[], requireAmount?: boolean) => quoteRequests is GenericQuoteRequest[];
5
6
  /**
6
7
  * Generates a pseudo-unique string that identifies each quote by aggregator, bridge, and steps
7
8
  *
@@ -1 +1 @@
1
- {"version":3,"file":"quote.d.mts","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,qBAAqB;AAEzC,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,KAAK,EACL,aAAa,EACb,aAAa,EACb,UAAU,EACV,MAAM,EACP,qBAAiB;AAElB,OAAO,EAAE,SAAS,EAAE,yBAAqB;AAEzC,eAAO,MAAM,mBAAmB,mBACd,QAAQ,mBAAmB,CAAC,mEA4D7C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,UAAW,aAAa,CAAC,OAAO,CAAC,WACD,CAAC;AAOhE,eAAO,MAAM,yBAAyB,gBACvB,aAAa,GAAG,UAAU,qCACJ,YAAY;;;;CAahD,CAAC;AAEF,eAAO,MAAM,YAAY,oBACN,MAAM,aACZ,WAAW,qCACa,YAAY;;;;CAehD,CAAC;AAEF,eAAO,MAAM,cAAc,0CACc,KAAK,qCACT,YAAY;;;;CAoBhD,CAAC;AAEF,eAAO,MAAM,cAAc,kBACV,cAAc,MAAM,EAAE,MAAM,CAAC,qCACT,YAAY;;;;CAwBhD,CAAC;AA2CF,eAAO,MAAM,8BAA8B;iBAO5B,cAAc,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS;;;qBAGrC,aAAa,CAAC,QAAQ,CA6DxC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,+BACX,WAAW,qCAAqC,CAAC,cACjE,WAAW,qBAAqB,CAAC;;;;CAiB9C,CAAC;AAEF,eAAO,MAAM,sBAAsB,WACzB,WAAW,qCAAqC,CAAC,cAC7C,WAAW,qBAAqB,CAAC;;;;CAa9C,CAAC;AAGF,eAAO,MAAM,kBAAkB,mEACmC,KAAK,wBAC/C,YAAY,yBACX,YAAY;;;;QAwBpC,CAAC;AAEF,eAAO,MAAM,kBAAkB,kBACd,WAAW,mBAAmB,CAAC,4BACpB,WAAW,mCAAmC,CAAC,+DACZ,KAAK;;;CAuBnE,CAAC;AAEF,eAAO,MAAM,YAAY,eAAgB,MAAM,mBAAmB,MAAM,WACb,CAAC;AAE5D,eAAO,MAAM,QAAQ,mBACH,WAAW,yBAAyB,CAAC,cACzC,WAAW,qBAAqB,CAAC;;;CAY7C,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,mBACjB,WAAW,yBAAyB,CAAC,cACzC,WAAW,qBAAqB,CAAC,KAC5C,MAAM,GAAG,IAoBX,CAAC;AAEF,eAAO,MAAM,kBAAkB,qCACK,MAAM,WAMzC,CAAC;AAEF,eAAO,MAAM,UAAU,WACb,aAAa,EAAE,aACZ,SAAS,GAAG,IAAI,oBAW5B,CAAC"}
1
+ {"version":3,"file":"quote.d.mts","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,qBAAqB;AAEzC,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,KAAK,EACL,aAAa,EACb,aAAa,EACb,UAAU,EACV,MAAM,EACP,qBAAiB;AAElB,OAAO,EAAE,SAAS,EAAE,yBAAqB;AAEzC,eAAO,MAAM,mBAAmB,mBACd,QAAQ,mBAAmB,CAAC,mEA4D7C,CAAC;AAEF,eAAO,MAAM,4BAA4B,kBACxB,QAAQ,mBAAmB,CAAC,EAAE,oEAGwB,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,UAAW,aAAa,CAAC,OAAO,CAAC,WACD,CAAC;AAOhE,eAAO,MAAM,yBAAyB,gBACvB,aAAa,GAAG,UAAU,qCACJ,YAAY;;;;CAahD,CAAC;AAEF,eAAO,MAAM,YAAY,oBACN,MAAM,aACZ,WAAW,qCACa,YAAY;;;;CAehD,CAAC;AAEF,eAAO,MAAM,cAAc,0CACc,KAAK,qCACT,YAAY;;;;CAoBhD,CAAC;AAEF,eAAO,MAAM,cAAc,kBACV,cAAc,MAAM,EAAE,MAAM,CAAC,qCACT,YAAY;;;;CAwBhD,CAAC;AA2CF,eAAO,MAAM,8BAA8B;iBAO5B,cAAc,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS;;;qBAGrC,aAAa,CAAC,QAAQ,CA6DxC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,+BACX,WAAW,qCAAqC,CAAC,cACjE,WAAW,qBAAqB,CAAC;;;;CAiB9C,CAAC;AAEF,eAAO,MAAM,sBAAsB,WACzB,WAAW,qCAAqC,CAAC,cAC7C,WAAW,qBAAqB,CAAC;;;;CAa9C,CAAC;AAGF,eAAO,MAAM,kBAAkB,mEACmC,KAAK,wBAC/C,YAAY,yBACX,YAAY;;;;QAwBpC,CAAC;AAEF,eAAO,MAAM,kBAAkB,kBACd,WAAW,mBAAmB,CAAC,4BACpB,WAAW,mCAAmC,CAAC,+DACZ,KAAK;;;CAuBnE,CAAC;AAEF,eAAO,MAAM,YAAY,eAAgB,MAAM,mBAAmB,MAAM,WACb,CAAC;AAE5D,eAAO,MAAM,QAAQ,mBACH,WAAW,yBAAyB,CAAC,cACzC,WAAW,qBAAqB,CAAC;;;CAY7C,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,mBACjB,WAAW,yBAAyB,CAAC,cACzC,WAAW,qBAAqB,CAAC,KAC5C,MAAM,GAAG,IAoBX,CAAC;AAEF,eAAO,MAAM,kBAAkB,qCACK,MAAM,WAMzC,CAAC;AAEF,eAAO,MAAM,UAAU,WACb,aAAa,EAAE,aACZ,SAAS,GAAG,IAAI,oBAW5B,CAAC"}