@metamask-previews/bridge-controller 10.0.0-preview-e7013a54 → 10.0.0-preview-e56c504a

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 (96) hide show
  1. package/CHANGELOG.md +0 -18
  2. package/dist/bridge-controller.cjs +25 -96
  3. package/dist/bridge-controller.cjs.map +1 -1
  4. package/dist/bridge-controller.d.cts +5 -5
  5. package/dist/bridge-controller.d.cts.map +1 -1
  6. package/dist/bridge-controller.d.mts +5 -5
  7. package/dist/bridge-controller.d.mts.map +1 -1
  8. package/dist/bridge-controller.mjs +26 -97
  9. package/dist/bridge-controller.mjs.map +1 -1
  10. package/dist/constants/bridge.cjs +1 -2
  11. package/dist/constants/bridge.cjs.map +1 -1
  12. package/dist/constants/bridge.d.cts +1 -2
  13. package/dist/constants/bridge.d.cts.map +1 -1
  14. package/dist/constants/bridge.d.mts +1 -2
  15. package/dist/constants/bridge.d.mts.map +1 -1
  16. package/dist/constants/bridge.mjs +1 -2
  17. package/dist/constants/bridge.mjs.map +1 -1
  18. package/dist/constants/chains.cjs +12 -1
  19. package/dist/constants/chains.cjs.map +1 -1
  20. package/dist/constants/chains.d.cts +2 -0
  21. package/dist/constants/chains.d.cts.map +1 -1
  22. package/dist/constants/chains.d.mts +2 -0
  23. package/dist/constants/chains.d.mts.map +1 -1
  24. package/dist/constants/chains.mjs +11 -0
  25. package/dist/constants/chains.mjs.map +1 -1
  26. package/dist/constants/tokens.cjs +38 -61
  27. package/dist/constants/tokens.cjs.map +1 -1
  28. package/dist/constants/tokens.d.cts +48 -100
  29. package/dist/constants/tokens.d.cts.map +1 -1
  30. package/dist/constants/tokens.d.mts +48 -100
  31. package/dist/constants/tokens.d.mts.map +1 -1
  32. package/dist/constants/tokens.mjs +14 -37
  33. package/dist/constants/tokens.mjs.map +1 -1
  34. package/dist/index.cjs +1 -21
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.cts +4 -16
  37. package/dist/index.d.cts.map +1 -1
  38. package/dist/index.d.mts +4 -16
  39. package/dist/index.d.mts.map +1 -1
  40. package/dist/index.mjs +2 -11
  41. package/dist/index.mjs.map +1 -1
  42. package/dist/types.cjs +3 -4
  43. package/dist/types.cjs.map +1 -1
  44. package/dist/types.d.cts +54 -108
  45. package/dist/types.d.cts.map +1 -1
  46. package/dist/types.d.mts +54 -108
  47. package/dist/types.d.mts.map +1 -1
  48. package/dist/types.mjs +3 -4
  49. package/dist/types.mjs.map +1 -1
  50. package/dist/utils/balance.cjs +2 -2
  51. package/dist/utils/balance.cjs.map +1 -1
  52. package/dist/utils/balance.d.cts.map +1 -1
  53. package/dist/utils/balance.d.mts.map +1 -1
  54. package/dist/utils/balance.mjs +2 -2
  55. package/dist/utils/balance.mjs.map +1 -1
  56. package/dist/utils/bridge.cjs +5 -65
  57. package/dist/utils/bridge.cjs.map +1 -1
  58. package/dist/utils/bridge.d.cts +4 -27
  59. package/dist/utils/bridge.d.cts.map +1 -1
  60. package/dist/utils/bridge.d.mts +4 -27
  61. package/dist/utils/bridge.d.mts.map +1 -1
  62. package/dist/utils/bridge.mjs +5 -62
  63. package/dist/utils/bridge.mjs.map +1 -1
  64. package/dist/utils/fetch.cjs +26 -34
  65. package/dist/utils/fetch.cjs.map +1 -1
  66. package/dist/utils/fetch.d.cts +5 -6
  67. package/dist/utils/fetch.d.cts.map +1 -1
  68. package/dist/utils/fetch.d.mts +5 -6
  69. package/dist/utils/fetch.d.mts.map +1 -1
  70. package/dist/utils/fetch.mjs +24 -32
  71. package/dist/utils/fetch.mjs.map +1 -1
  72. package/dist/utils/quote.cjs +2 -12
  73. package/dist/utils/quote.cjs.map +1 -1
  74. package/dist/utils/quote.d.cts +2 -2
  75. package/dist/utils/quote.d.cts.map +1 -1
  76. package/dist/utils/quote.d.mts +2 -2
  77. package/dist/utils/quote.d.mts.map +1 -1
  78. package/dist/utils/quote.mjs +2 -12
  79. package/dist/utils/quote.mjs.map +1 -1
  80. package/dist/utils/validators.cjs +16 -15
  81. package/dist/utils/validators.cjs.map +1 -1
  82. package/dist/utils/validators.d.cts +3 -2
  83. package/dist/utils/validators.d.cts.map +1 -1
  84. package/dist/utils/validators.d.mts +3 -2
  85. package/dist/utils/validators.d.mts.map +1 -1
  86. package/dist/utils/validators.mjs +17 -16
  87. package/dist/utils/validators.mjs.map +1 -1
  88. package/package.json +2 -7
  89. package/dist/utils/caip-formatters.cjs +0 -102
  90. package/dist/utils/caip-formatters.cjs.map +0 -1
  91. package/dist/utils/caip-formatters.d.cts +0 -31
  92. package/dist/utils/caip-formatters.d.cts.map +0 -1
  93. package/dist/utils/caip-formatters.d.mts +0 -31
  94. package/dist/utils/caip-formatters.d.mts.map +0 -1
  95. package/dist/utils/caip-formatters.mjs +0 -95
  96. package/dist/utils/caip-formatters.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.cjs","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CaipChainId, Hex } from '@metamask/utils';\nimport { Duration } from '@metamask/utils';\n\nimport {\n formatAddressToCaipReference,\n formatChainIdToCaip,\n formatChainIdToDec,\n} from './caip-formatters';\nimport {\n validateFeatureFlagsResponse,\n validateQuoteResponse,\n validateSwapsTokenObject,\n} from './validators';\nimport { DEFAULT_FEATURE_FLAG_CONFIG } from '../constants/bridge';\nimport type {\n QuoteResponse,\n BridgeFeatureFlags,\n FetchFunction,\n ChainConfiguration,\n GenericQuoteRequest,\n QuoteRequest,\n BridgeAsset,\n} from '../types';\nimport { BridgeFlag, BridgeFeatureFlagsKey } from '../types';\n\nconst CACHE_REFRESH_TEN_MINUTES = 10 * Duration.Minute;\n\nexport const getClientIdHeader = (clientId: string) => ({\n 'X-Client-Id': clientId,\n});\n\n/**\n * Fetches the bridge feature flags\n *\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns The bridge feature flags\n */\nexport async function fetchBridgeFeatureFlags(\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<BridgeFeatureFlags> {\n const url = `${bridgeApiBaseUrl}/getAllFeatureFlags`;\n const rawFeatureFlags: unknown = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n cacheOptions: { cacheRefreshTime: CACHE_REFRESH_TEN_MINUTES },\n functionName: 'fetchBridgeFeatureFlags',\n });\n\n if (validateFeatureFlagsResponse(rawFeatureFlags)) {\n const getChainsObj = (chains: Record<number, ChainConfiguration>) =>\n Object.entries(chains).reduce(\n (acc, [chainId, value]) => ({\n ...acc,\n [formatChainIdToCaip(chainId)]: value,\n }),\n {},\n );\n\n return {\n [BridgeFeatureFlagsKey.EXTENSION_CONFIG]: {\n ...rawFeatureFlags[BridgeFlag.EXTENSION_CONFIG],\n chains: getChainsObj(\n rawFeatureFlags[BridgeFlag.EXTENSION_CONFIG].chains,\n ),\n },\n [BridgeFeatureFlagsKey.MOBILE_CONFIG]: {\n ...rawFeatureFlags[BridgeFlag.MOBILE_CONFIG],\n chains: getChainsObj(rawFeatureFlags[BridgeFlag.MOBILE_CONFIG].chains),\n },\n };\n }\n\n return {\n [BridgeFeatureFlagsKey.EXTENSION_CONFIG]: DEFAULT_FEATURE_FLAG_CONFIG,\n [BridgeFeatureFlagsKey.MOBILE_CONFIG]: DEFAULT_FEATURE_FLAG_CONFIG,\n };\n}\n\n/**\n * Returns a list of enabled (unblocked) tokens\n *\n * @param chainId - The chain ID to fetch tokens for\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns A list of enabled (unblocked) tokens\n */\nexport async function fetchBridgeTokens(\n chainId: Hex | CaipChainId,\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<Record<string, BridgeAsset>> {\n // TODO make token api v2 call\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: getClientIdHeader(clientId),\n cacheOptions: { cacheRefreshTime: CACHE_REFRESH_TEN_MINUTES },\n functionName: 'fetchBridgeTokens',\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 * then fetches quotes from the bridge-api\n *\n * @param request - The quote request\n * @param signal - The abort signal\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns A list of bridge tx quotes\n */\nexport async function fetchBridgeQuotes(\n request: GenericQuoteRequest,\n signal: AbortSignal,\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<QuoteResponse[]> {\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 };\n if (request.slippage !== undefined) {\n normalizedRequest.slippage = request.slippage;\n }\n\n const queryParams = new URLSearchParams();\n Object.entries(normalizedRequest).forEach(([key, value]) => {\n queryParams.append(key, value.toString());\n });\n const url = `${bridgeApiBaseUrl}/getQuote?${queryParams}`;\n const quotes: unknown[] = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n signal,\n cacheOptions: { cacheRefreshTime: 0 },\n functionName: 'fetchBridgeQuotes',\n });\n\n const filteredQuotes = quotes.filter((quoteResponse: unknown) => {\n return validateQuoteResponse(quoteResponse);\n });\n return filteredQuotes as QuoteResponse[];\n}\n"]}
1
+ {"version":3,"file":"fetch.cjs","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":";;;AACA,2CAA2D;AAE3D,yCAGkB;AAClB,iDAIsB;AACtB,oDAAkE;AAElE,oDAAsE;AAQtE,wCAA6D;AAE7D,iEAAiE;AACjE,0DAA0D;AAEnD,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC;IACtD,aAAa,EAAE,QAAQ;CACxB,CAAC,CAAC;AAFU,QAAA,iBAAiB,qBAE3B;AAEH;;;;;;;GAOG;AACI,KAAK,UAAU,uBAAuB,CAC3C,QAAgB,EAChB,OAAsB,EACtB,gBAAwB;IAExB,MAAM,GAAG,GAAG,GAAG,gBAAgB,qBAAqB,CAAC;IACrD,MAAM,eAAe,GAAY,MAAM,OAAO,CAAC,GAAG,EAAE;QAClD,OAAO,EAAE,IAAA,yBAAiB,EAAC,QAAQ,CAAC;KACrC,CAAC,CAAC;IAEH,IAAI,IAAA,yCAA4B,EAAC,eAAe,CAAC,EAAE;QACjD,MAAM,YAAY,GAAG,CAAC,MAA0C,EAAE,EAAE,CAClE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAC3B,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1B,GAAG,GAAG;YACN,CAAC,IAAA,mBAAW,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK;SACtC,CAAC,EACF,EAAE,CACH,CAAC;QAEJ,OAAO;YACL,CAAC,6BAAqB,CAAC,gBAAgB,CAAC,EAAE;gBACxC,GAAG,eAAe,CAAC,kBAAU,CAAC,gBAAgB,CAAC;gBAC/C,MAAM,EAAE,YAAY,CAClB,eAAe,CAAC,kBAAU,CAAC,gBAAgB,CAAC,CAAC,MAAM,CACpD;aACF;YACD,CAAC,6BAAqB,CAAC,aAAa,CAAC,EAAE;gBACrC,GAAG,eAAe,CAAC,kBAAU,CAAC,aAAa,CAAC;gBAC5C,MAAM,EAAE,YAAY,CAAC,eAAe,CAAC,kBAAU,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;aACvE;SACF,CAAC;KACH;IAED,OAAO;QACL,CAAC,6BAAqB,CAAC,gBAAgB,CAAC,EAAE,oCAA2B;QACrE,CAAC,6BAAqB,CAAC,aAAa,CAAC,EAAE,oCAA2B;KACnE,CAAC;AACJ,CAAC;AAtCD,0DAsCC;AAED;;;;;;;;GAQG;AACI,KAAK,UAAU,iBAAiB,CACrC,OAAY,EACZ,QAAgB,EAChB,OAAsB,EACtB,gBAAwB;IAExB,8BAA8B;IAC9B,MAAM,GAAG,GAAG,GAAG,gBAAgB,sBAAsB,IAAA,mBAAW,EAAC,OAAO,CAAC,EAAE,CAAC;IAE5E,uGAAuG;IACvG,uEAAuE;IACvE,6IAA6I;IAC7I,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;QAChC,OAAO,EAAE,IAAA,yBAAiB,EAAC,QAAQ,CAAC;KACrC,CAAC,CAAC;IAEH,MAAM,WAAW,GACf,wCAA+B,CAC7B,OAAuD,CACxD,CAAC;IAEJ,MAAM,iBAAiB,GAAqC,EAAE,CAAC;IAC/D,IAAI,WAAW,EAAE;QACf,iBAAiB,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC;KACtD;IAED,MAAM,CAAC,OAAO,CAAC,CAAC,KAAc,EAAE,EAAE;QAChC,IACE,IAAA,qCAAwB,EAAC,KAAK,CAAC;YAC/B,CAAC,CACC,IAAA,kCAAyB,EAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;gBAChD,IAAA,mCAA0B,EAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CACnD,EACD;YACA,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;SAC1C;IACH,CAAC,CAAC,CAAC;IACH,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAtCD,8CAsCC;AAED,qCAAqC;AACrC;;;;;;;;GAQG;AACI,KAAK,UAAU,iBAAiB,CACrC,OAAqB,EACrB,MAAmB,EACnB,QAAgB,EAChB,OAAsB,EACtB,gBAAwB;IAExB,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;QACtC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE;QACzC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE;QAC3C,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACrC,eAAe,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;QAC3D,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;KACxD,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,GAAG,gBAAgB,aAAa,WAAW,EAAE,CAAC;IAC1D,MAAM,MAAM,GAAc,MAAM,OAAO,CAAC,GAAG,EAAE;QAC3C,OAAO,EAAE,IAAA,yBAAiB,EAAC,QAAQ,CAAC;QACpC,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,aAAsB,EAAE,EAAE;QAC9D,OAAO,IAAA,kCAAqB,EAAC,aAAa,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IACH,OAAO,cAAiC,CAAC;AAC3C,CAAC;AA5BD,8CA4BC","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { hexToNumber, numberToHex } from '@metamask/utils';\n\nimport {\n isSwapsDefaultTokenAddress,\n isSwapsDefaultTokenSymbol,\n} from './bridge';\nimport {\n validateFeatureFlagsResponse,\n validateQuoteResponse,\n validateSwapsTokenObject,\n} from './validators';\nimport { DEFAULT_FEATURE_FLAG_CONFIG } from '../constants/bridge';\nimport type { SwapsTokenObject } from '../constants/tokens';\nimport { SWAPS_CHAINID_DEFAULT_TOKEN_MAP } from '../constants/tokens';\nimport type {\n QuoteRequest,\n QuoteResponse,\n BridgeFeatureFlags,\n FetchFunction,\n ChainConfiguration,\n} from '../types';\nimport { BridgeFlag, BridgeFeatureFlagsKey } from '../types';\n\n// TODO put this back in once we have a fetchWithCache equivalent\n// const CACHE_REFRESH_TEN_MINUTES = 10 * Duration.Minute;\n\nexport const getClientIdHeader = (clientId: string) => ({\n 'X-Client-Id': clientId,\n});\n\n/**\n * Fetches the bridge feature flags\n *\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns The bridge feature flags\n */\nexport async function fetchBridgeFeatureFlags(\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<BridgeFeatureFlags> {\n const url = `${bridgeApiBaseUrl}/getAllFeatureFlags`;\n const rawFeatureFlags: unknown = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n });\n\n if (validateFeatureFlagsResponse(rawFeatureFlags)) {\n const getChainsObj = (chains: Record<number, ChainConfiguration>) =>\n Object.entries(chains).reduce(\n (acc, [chainId, value]) => ({\n ...acc,\n [numberToHex(Number(chainId))]: value,\n }),\n {},\n );\n\n return {\n [BridgeFeatureFlagsKey.EXTENSION_CONFIG]: {\n ...rawFeatureFlags[BridgeFlag.EXTENSION_CONFIG],\n chains: getChainsObj(\n rawFeatureFlags[BridgeFlag.EXTENSION_CONFIG].chains,\n ),\n },\n [BridgeFeatureFlagsKey.MOBILE_CONFIG]: {\n ...rawFeatureFlags[BridgeFlag.MOBILE_CONFIG],\n chains: getChainsObj(rawFeatureFlags[BridgeFlag.MOBILE_CONFIG].chains),\n },\n };\n }\n\n return {\n [BridgeFeatureFlagsKey.EXTENSION_CONFIG]: DEFAULT_FEATURE_FLAG_CONFIG,\n [BridgeFeatureFlagsKey.MOBILE_CONFIG]: DEFAULT_FEATURE_FLAG_CONFIG,\n };\n}\n\n/**\n * Returns a list of enabled (unblocked) tokens\n *\n * @param chainId - The chain ID to fetch tokens for\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns A list of enabled (unblocked) tokens\n */\nexport async function fetchBridgeTokens(\n chainId: Hex,\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<Record<string, SwapsTokenObject>> {\n // TODO make token api v2 call\n const url = `${bridgeApiBaseUrl}/getTokens?chainId=${hexToNumber(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: getClientIdHeader(clientId),\n });\n\n const nativeToken =\n SWAPS_CHAINID_DEFAULT_TOKEN_MAP[\n chainId as keyof typeof SWAPS_CHAINID_DEFAULT_TOKEN_MAP\n ];\n\n const transformedTokens: Record<string, SwapsTokenObject> = {};\n if (nativeToken) {\n transformedTokens[nativeToken.address] = nativeToken;\n }\n\n tokens.forEach((token: unknown) => {\n if (\n validateSwapsTokenObject(token) &&\n !(\n isSwapsDefaultTokenSymbol(token.symbol, chainId) ||\n isSwapsDefaultTokenAddress(token.address, chainId)\n )\n ) {\n transformedTokens[token.address] = token;\n }\n });\n return transformedTokens;\n}\n\n// Returns a list of bridge tx quotes\n/**\n *\n * @param request - The quote request\n * @param signal - The abort signal\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns A list of bridge tx quotes\n */\nexport async function fetchBridgeQuotes(\n request: QuoteRequest,\n signal: AbortSignal,\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<QuoteResponse[]> {\n const queryParams = new URLSearchParams({\n walletAddress: request.walletAddress,\n srcChainId: request.srcChainId.toString(),\n destChainId: request.destChainId.toString(),\n srcTokenAddress: request.srcTokenAddress,\n destTokenAddress: request.destTokenAddress,\n srcTokenAmount: request.srcTokenAmount,\n slippage: request.slippage.toString(),\n insufficientBal: request.insufficientBal ? 'true' : 'false',\n resetApproval: request.resetApproval ? 'true' : 'false',\n });\n const url = `${bridgeApiBaseUrl}/getQuote?${queryParams}`;\n const quotes: unknown[] = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n signal,\n });\n\n const filteredQuotes = quotes.filter((quoteResponse: unknown) => {\n return validateQuoteResponse(quoteResponse);\n });\n return filteredQuotes as QuoteResponse[];\n}\n"]}
@@ -1,5 +1,6 @@
1
- import type { CaipChainId, Hex } from "@metamask/utils";
2
- import type { QuoteResponse, BridgeFeatureFlags, FetchFunction, GenericQuoteRequest, BridgeAsset } from "../types.cjs";
1
+ import type { Hex } from "@metamask/utils";
2
+ import type { SwapsTokenObject } from "../constants/tokens.cjs";
3
+ import type { QuoteRequest, QuoteResponse, BridgeFeatureFlags, FetchFunction } from "../types.cjs";
3
4
  export declare const getClientIdHeader: (clientId: string) => {
4
5
  'X-Client-Id': string;
5
6
  };
@@ -21,10 +22,8 @@ export declare function fetchBridgeFeatureFlags(clientId: string, fetchFn: Fetch
21
22
  * @param bridgeApiBaseUrl - The base URL for the bridge API
22
23
  * @returns A list of enabled (unblocked) tokens
23
24
  */
24
- export declare function fetchBridgeTokens(chainId: Hex | CaipChainId, clientId: string, fetchFn: FetchFunction, bridgeApiBaseUrl: string): Promise<Record<string, BridgeAsset>>;
25
+ export declare function fetchBridgeTokens(chainId: Hex, clientId: string, fetchFn: FetchFunction, bridgeApiBaseUrl: string): Promise<Record<string, SwapsTokenObject>>;
25
26
  /**
26
- * Converts the generic quote request to the type that the bridge-api expects
27
- * then fetches quotes from the bridge-api
28
27
  *
29
28
  * @param request - The quote request
30
29
  * @param signal - The abort signal
@@ -33,5 +32,5 @@ export declare function fetchBridgeTokens(chainId: Hex | CaipChainId, clientId:
33
32
  * @param bridgeApiBaseUrl - The base URL for the bridge API
34
33
  * @returns A list of bridge tx quotes
35
34
  */
36
- export declare function fetchBridgeQuotes(request: GenericQuoteRequest, signal: AbortSignal, clientId: string, fetchFn: FetchFunction, bridgeApiBaseUrl: string): Promise<QuoteResponse[]>;
35
+ export declare function fetchBridgeQuotes(request: QuoteRequest, signal: AbortSignal, clientId: string, fetchFn: FetchFunction, bridgeApiBaseUrl: string): Promise<QuoteResponse[]>;
37
36
  //# sourceMappingURL=fetch.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.d.cts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AAcxD,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,aAAa,EAEb,mBAAmB,EAEnB,WAAW,EACZ,qBAAiB;AAKlB,eAAO,MAAM,iBAAiB,aAAc,MAAM;;CAEhD,CAAC;AAEH;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAoC7B;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,GAAG,GAAG,WAAW,EAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAoBtC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,aAAa,EAAE,CAAC,CAkC1B"}
1
+ {"version":3,"file":"fetch.d.cts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAa3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,gCAA4B;AAE5D,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,aAAa,EAEd,qBAAiB;AAMlB,eAAO,MAAM,iBAAiB,aAAc,MAAM;;CAEhD,CAAC;AAEH;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAkC7B;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAiC3C;AAGD;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,aAAa,EAAE,CAAC,CAsB1B"}
@@ -1,5 +1,6 @@
1
- import type { CaipChainId, Hex } from "@metamask/utils";
2
- import type { QuoteResponse, BridgeFeatureFlags, FetchFunction, GenericQuoteRequest, BridgeAsset } from "../types.mjs";
1
+ import type { Hex } from "@metamask/utils";
2
+ import type { SwapsTokenObject } from "../constants/tokens.mjs";
3
+ import type { QuoteRequest, QuoteResponse, BridgeFeatureFlags, FetchFunction } from "../types.mjs";
3
4
  export declare const getClientIdHeader: (clientId: string) => {
4
5
  'X-Client-Id': string;
5
6
  };
@@ -21,10 +22,8 @@ export declare function fetchBridgeFeatureFlags(clientId: string, fetchFn: Fetch
21
22
  * @param bridgeApiBaseUrl - The base URL for the bridge API
22
23
  * @returns A list of enabled (unblocked) tokens
23
24
  */
24
- export declare function fetchBridgeTokens(chainId: Hex | CaipChainId, clientId: string, fetchFn: FetchFunction, bridgeApiBaseUrl: string): Promise<Record<string, BridgeAsset>>;
25
+ export declare function fetchBridgeTokens(chainId: Hex, clientId: string, fetchFn: FetchFunction, bridgeApiBaseUrl: string): Promise<Record<string, SwapsTokenObject>>;
25
26
  /**
26
- * Converts the generic quote request to the type that the bridge-api expects
27
- * then fetches quotes from the bridge-api
28
27
  *
29
28
  * @param request - The quote request
30
29
  * @param signal - The abort signal
@@ -33,5 +32,5 @@ export declare function fetchBridgeTokens(chainId: Hex | CaipChainId, clientId:
33
32
  * @param bridgeApiBaseUrl - The base URL for the bridge API
34
33
  * @returns A list of bridge tx quotes
35
34
  */
36
- export declare function fetchBridgeQuotes(request: GenericQuoteRequest, signal: AbortSignal, clientId: string, fetchFn: FetchFunction, bridgeApiBaseUrl: string): Promise<QuoteResponse[]>;
35
+ export declare function fetchBridgeQuotes(request: QuoteRequest, signal: AbortSignal, clientId: string, fetchFn: FetchFunction, bridgeApiBaseUrl: string): Promise<QuoteResponse[]>;
37
36
  //# sourceMappingURL=fetch.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.d.mts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AAcxD,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,aAAa,EAEb,mBAAmB,EAEnB,WAAW,EACZ,qBAAiB;AAKlB,eAAO,MAAM,iBAAiB,aAAc,MAAM;;CAEhD,CAAC;AAEH;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAoC7B;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,GAAG,GAAG,WAAW,EAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAoBtC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,aAAa,EAAE,CAAC,CAkC1B"}
1
+ {"version":3,"file":"fetch.d.mts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAa3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,gCAA4B;AAE5D,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,aAAa,EAEd,qBAAiB;AAMlB,eAAO,MAAM,iBAAiB,aAAc,MAAM;;CAEhD,CAAC;AAEH;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAkC7B;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAiC3C;AAGD;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,aAAa,EAAE,CAAC,CAsB1B"}
@@ -1,9 +1,11 @@
1
- import { Duration } from "@metamask/utils";
2
- import { formatAddressToCaipReference, formatChainIdToCaip, formatChainIdToDec } from "./caip-formatters.mjs";
1
+ import { hexToNumber, numberToHex } from "@metamask/utils";
2
+ import { isSwapsDefaultTokenAddress, isSwapsDefaultTokenSymbol } from "./bridge.mjs";
3
3
  import { validateFeatureFlagsResponse, validateQuoteResponse, validateSwapsTokenObject } from "./validators.mjs";
4
4
  import { DEFAULT_FEATURE_FLAG_CONFIG } from "../constants/bridge.mjs";
5
+ import { SWAPS_CHAINID_DEFAULT_TOKEN_MAP } from "../constants/tokens.mjs";
5
6
  import { BridgeFlag, BridgeFeatureFlagsKey } from "../types.mjs";
6
- const CACHE_REFRESH_TEN_MINUTES = 10 * Duration.Minute;
7
+ // TODO put this back in once we have a fetchWithCache equivalent
8
+ // const CACHE_REFRESH_TEN_MINUTES = 10 * Duration.Minute;
7
9
  export const getClientIdHeader = (clientId) => ({
8
10
  'X-Client-Id': clientId,
9
11
  });
@@ -19,13 +21,11 @@ export async function fetchBridgeFeatureFlags(clientId, fetchFn, bridgeApiBaseUr
19
21
  const url = `${bridgeApiBaseUrl}/getAllFeatureFlags`;
20
22
  const rawFeatureFlags = await fetchFn(url, {
21
23
  headers: getClientIdHeader(clientId),
22
- cacheOptions: { cacheRefreshTime: CACHE_REFRESH_TEN_MINUTES },
23
- functionName: 'fetchBridgeFeatureFlags',
24
24
  });
25
25
  if (validateFeatureFlagsResponse(rawFeatureFlags)) {
26
26
  const getChainsObj = (chains) => Object.entries(chains).reduce((acc, [chainId, value]) => ({
27
27
  ...acc,
28
- [formatChainIdToCaip(chainId)]: value,
28
+ [numberToHex(Number(chainId))]: value,
29
29
  }), {});
30
30
  return {
31
31
  [BridgeFeatureFlagsKey.EXTENSION_CONFIG]: {
@@ -54,26 +54,29 @@ export async function fetchBridgeFeatureFlags(clientId, fetchFn, bridgeApiBaseUr
54
54
  */
55
55
  export async function fetchBridgeTokens(chainId, clientId, fetchFn, bridgeApiBaseUrl) {
56
56
  // TODO make token api v2 call
57
- const url = `${bridgeApiBaseUrl}/getTokens?chainId=${formatChainIdToDec(chainId)}`;
57
+ const url = `${bridgeApiBaseUrl}/getTokens?chainId=${hexToNumber(chainId)}`;
58
58
  // TODO we will need to cache these. In Extension fetchWithCache is used. This is due to the following:
59
59
  // If we allow selecting dest networks which the user has not imported,
60
60
  // 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
61
61
  const tokens = await fetchFn(url, {
62
62
  headers: getClientIdHeader(clientId),
63
- cacheOptions: { cacheRefreshTime: CACHE_REFRESH_TEN_MINUTES },
64
- functionName: 'fetchBridgeTokens',
65
63
  });
64
+ const nativeToken = SWAPS_CHAINID_DEFAULT_TOKEN_MAP[chainId];
66
65
  const transformedTokens = {};
66
+ if (nativeToken) {
67
+ transformedTokens[nativeToken.address] = nativeToken;
68
+ }
67
69
  tokens.forEach((token) => {
68
- if (validateSwapsTokenObject(token)) {
70
+ if (validateSwapsTokenObject(token) &&
71
+ !(isSwapsDefaultTokenSymbol(token.symbol, chainId) ||
72
+ isSwapsDefaultTokenAddress(token.address, chainId))) {
69
73
  transformedTokens[token.address] = token;
70
74
  }
71
75
  });
72
76
  return transformedTokens;
73
77
  }
78
+ // Returns a list of bridge tx quotes
74
79
  /**
75
- * Converts the generic quote request to the type that the bridge-api expects
76
- * then fetches quotes from the bridge-api
77
80
  *
78
81
  * @param request - The quote request
79
82
  * @param signal - The abort signal
@@ -83,32 +86,21 @@ export async function fetchBridgeTokens(chainId, clientId, fetchFn, bridgeApiBas
83
86
  * @returns A list of bridge tx quotes
84
87
  */
85
88
  export async function fetchBridgeQuotes(request, signal, clientId, fetchFn, bridgeApiBaseUrl) {
86
- const destWalletAddress = request.destWalletAddress ?? request.walletAddress;
87
- // Transform the generic quote request into QuoteRequest
88
- const normalizedRequest = {
89
- walletAddress: formatAddressToCaipReference(request.walletAddress),
90
- destWalletAddress: formatAddressToCaipReference(destWalletAddress),
91
- srcChainId: formatChainIdToDec(request.srcChainId),
92
- destChainId: formatChainIdToDec(request.destChainId),
93
- srcTokenAddress: formatAddressToCaipReference(request.srcTokenAddress),
94
- destTokenAddress: formatAddressToCaipReference(request.destTokenAddress),
89
+ const queryParams = new URLSearchParams({
90
+ walletAddress: request.walletAddress,
91
+ srcChainId: request.srcChainId.toString(),
92
+ destChainId: request.destChainId.toString(),
93
+ srcTokenAddress: request.srcTokenAddress,
94
+ destTokenAddress: request.destTokenAddress,
95
95
  srcTokenAmount: request.srcTokenAmount,
96
- insufficientBal: Boolean(request.insufficientBal),
97
- resetApproval: Boolean(request.resetApproval),
98
- };
99
- if (request.slippage !== undefined) {
100
- normalizedRequest.slippage = request.slippage;
101
- }
102
- const queryParams = new URLSearchParams();
103
- Object.entries(normalizedRequest).forEach(([key, value]) => {
104
- queryParams.append(key, value.toString());
96
+ slippage: request.slippage.toString(),
97
+ insufficientBal: request.insufficientBal ? 'true' : 'false',
98
+ resetApproval: request.resetApproval ? 'true' : 'false',
105
99
  });
106
100
  const url = `${bridgeApiBaseUrl}/getQuote?${queryParams}`;
107
101
  const quotes = await fetchFn(url, {
108
102
  headers: getClientIdHeader(clientId),
109
103
  signal,
110
- cacheOptions: { cacheRefreshTime: 0 },
111
- functionName: 'fetchBridgeQuotes',
112
104
  });
113
105
  const filteredQuotes = quotes.filter((quoteResponse) => {
114
106
  return validateQuoteResponse(quoteResponse);
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.mjs","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CaipChainId, Hex } from '@metamask/utils';\nimport { Duration } from '@metamask/utils';\n\nimport {\n formatAddressToCaipReference,\n formatChainIdToCaip,\n formatChainIdToDec,\n} from './caip-formatters';\nimport {\n validateFeatureFlagsResponse,\n validateQuoteResponse,\n validateSwapsTokenObject,\n} from './validators';\nimport { DEFAULT_FEATURE_FLAG_CONFIG } from '../constants/bridge';\nimport type {\n QuoteResponse,\n BridgeFeatureFlags,\n FetchFunction,\n ChainConfiguration,\n GenericQuoteRequest,\n QuoteRequest,\n BridgeAsset,\n} from '../types';\nimport { BridgeFlag, BridgeFeatureFlagsKey } from '../types';\n\nconst CACHE_REFRESH_TEN_MINUTES = 10 * Duration.Minute;\n\nexport const getClientIdHeader = (clientId: string) => ({\n 'X-Client-Id': clientId,\n});\n\n/**\n * Fetches the bridge feature flags\n *\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns The bridge feature flags\n */\nexport async function fetchBridgeFeatureFlags(\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<BridgeFeatureFlags> {\n const url = `${bridgeApiBaseUrl}/getAllFeatureFlags`;\n const rawFeatureFlags: unknown = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n cacheOptions: { cacheRefreshTime: CACHE_REFRESH_TEN_MINUTES },\n functionName: 'fetchBridgeFeatureFlags',\n });\n\n if (validateFeatureFlagsResponse(rawFeatureFlags)) {\n const getChainsObj = (chains: Record<number, ChainConfiguration>) =>\n Object.entries(chains).reduce(\n (acc, [chainId, value]) => ({\n ...acc,\n [formatChainIdToCaip(chainId)]: value,\n }),\n {},\n );\n\n return {\n [BridgeFeatureFlagsKey.EXTENSION_CONFIG]: {\n ...rawFeatureFlags[BridgeFlag.EXTENSION_CONFIG],\n chains: getChainsObj(\n rawFeatureFlags[BridgeFlag.EXTENSION_CONFIG].chains,\n ),\n },\n [BridgeFeatureFlagsKey.MOBILE_CONFIG]: {\n ...rawFeatureFlags[BridgeFlag.MOBILE_CONFIG],\n chains: getChainsObj(rawFeatureFlags[BridgeFlag.MOBILE_CONFIG].chains),\n },\n };\n }\n\n return {\n [BridgeFeatureFlagsKey.EXTENSION_CONFIG]: DEFAULT_FEATURE_FLAG_CONFIG,\n [BridgeFeatureFlagsKey.MOBILE_CONFIG]: DEFAULT_FEATURE_FLAG_CONFIG,\n };\n}\n\n/**\n * Returns a list of enabled (unblocked) tokens\n *\n * @param chainId - The chain ID to fetch tokens for\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns A list of enabled (unblocked) tokens\n */\nexport async function fetchBridgeTokens(\n chainId: Hex | CaipChainId,\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<Record<string, BridgeAsset>> {\n // TODO make token api v2 call\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: getClientIdHeader(clientId),\n cacheOptions: { cacheRefreshTime: CACHE_REFRESH_TEN_MINUTES },\n functionName: 'fetchBridgeTokens',\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 * then fetches quotes from the bridge-api\n *\n * @param request - The quote request\n * @param signal - The abort signal\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns A list of bridge tx quotes\n */\nexport async function fetchBridgeQuotes(\n request: GenericQuoteRequest,\n signal: AbortSignal,\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<QuoteResponse[]> {\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 };\n if (request.slippage !== undefined) {\n normalizedRequest.slippage = request.slippage;\n }\n\n const queryParams = new URLSearchParams();\n Object.entries(normalizedRequest).forEach(([key, value]) => {\n queryParams.append(key, value.toString());\n });\n const url = `${bridgeApiBaseUrl}/getQuote?${queryParams}`;\n const quotes: unknown[] = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n signal,\n cacheOptions: { cacheRefreshTime: 0 },\n functionName: 'fetchBridgeQuotes',\n });\n\n const filteredQuotes = quotes.filter((quoteResponse: unknown) => {\n return validateQuoteResponse(quoteResponse);\n });\n return filteredQuotes as QuoteResponse[];\n}\n"]}
1
+ {"version":3,"file":"fetch.mjs","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { hexToNumber, numberToHex } from '@metamask/utils';\n\nimport {\n isSwapsDefaultTokenAddress,\n isSwapsDefaultTokenSymbol,\n} from './bridge';\nimport {\n validateFeatureFlagsResponse,\n validateQuoteResponse,\n validateSwapsTokenObject,\n} from './validators';\nimport { DEFAULT_FEATURE_FLAG_CONFIG } from '../constants/bridge';\nimport type { SwapsTokenObject } from '../constants/tokens';\nimport { SWAPS_CHAINID_DEFAULT_TOKEN_MAP } from '../constants/tokens';\nimport type {\n QuoteRequest,\n QuoteResponse,\n BridgeFeatureFlags,\n FetchFunction,\n ChainConfiguration,\n} from '../types';\nimport { BridgeFlag, BridgeFeatureFlagsKey } from '../types';\n\n// TODO put this back in once we have a fetchWithCache equivalent\n// const CACHE_REFRESH_TEN_MINUTES = 10 * Duration.Minute;\n\nexport const getClientIdHeader = (clientId: string) => ({\n 'X-Client-Id': clientId,\n});\n\n/**\n * Fetches the bridge feature flags\n *\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns The bridge feature flags\n */\nexport async function fetchBridgeFeatureFlags(\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<BridgeFeatureFlags> {\n const url = `${bridgeApiBaseUrl}/getAllFeatureFlags`;\n const rawFeatureFlags: unknown = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n });\n\n if (validateFeatureFlagsResponse(rawFeatureFlags)) {\n const getChainsObj = (chains: Record<number, ChainConfiguration>) =>\n Object.entries(chains).reduce(\n (acc, [chainId, value]) => ({\n ...acc,\n [numberToHex(Number(chainId))]: value,\n }),\n {},\n );\n\n return {\n [BridgeFeatureFlagsKey.EXTENSION_CONFIG]: {\n ...rawFeatureFlags[BridgeFlag.EXTENSION_CONFIG],\n chains: getChainsObj(\n rawFeatureFlags[BridgeFlag.EXTENSION_CONFIG].chains,\n ),\n },\n [BridgeFeatureFlagsKey.MOBILE_CONFIG]: {\n ...rawFeatureFlags[BridgeFlag.MOBILE_CONFIG],\n chains: getChainsObj(rawFeatureFlags[BridgeFlag.MOBILE_CONFIG].chains),\n },\n };\n }\n\n return {\n [BridgeFeatureFlagsKey.EXTENSION_CONFIG]: DEFAULT_FEATURE_FLAG_CONFIG,\n [BridgeFeatureFlagsKey.MOBILE_CONFIG]: DEFAULT_FEATURE_FLAG_CONFIG,\n };\n}\n\n/**\n * Returns a list of enabled (unblocked) tokens\n *\n * @param chainId - The chain ID to fetch tokens for\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns A list of enabled (unblocked) tokens\n */\nexport async function fetchBridgeTokens(\n chainId: Hex,\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<Record<string, SwapsTokenObject>> {\n // TODO make token api v2 call\n const url = `${bridgeApiBaseUrl}/getTokens?chainId=${hexToNumber(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: getClientIdHeader(clientId),\n });\n\n const nativeToken =\n SWAPS_CHAINID_DEFAULT_TOKEN_MAP[\n chainId as keyof typeof SWAPS_CHAINID_DEFAULT_TOKEN_MAP\n ];\n\n const transformedTokens: Record<string, SwapsTokenObject> = {};\n if (nativeToken) {\n transformedTokens[nativeToken.address] = nativeToken;\n }\n\n tokens.forEach((token: unknown) => {\n if (\n validateSwapsTokenObject(token) &&\n !(\n isSwapsDefaultTokenSymbol(token.symbol, chainId) ||\n isSwapsDefaultTokenAddress(token.address, chainId)\n )\n ) {\n transformedTokens[token.address] = token;\n }\n });\n return transformedTokens;\n}\n\n// Returns a list of bridge tx quotes\n/**\n *\n * @param request - The quote request\n * @param signal - The abort signal\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns A list of bridge tx quotes\n */\nexport async function fetchBridgeQuotes(\n request: QuoteRequest,\n signal: AbortSignal,\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<QuoteResponse[]> {\n const queryParams = new URLSearchParams({\n walletAddress: request.walletAddress,\n srcChainId: request.srcChainId.toString(),\n destChainId: request.destChainId.toString(),\n srcTokenAddress: request.srcTokenAddress,\n destTokenAddress: request.destTokenAddress,\n srcTokenAmount: request.srcTokenAmount,\n slippage: request.slippage.toString(),\n insufficientBal: request.insufficientBal ? 'true' : 'false',\n resetApproval: request.resetApproval ? 'true' : 'false',\n });\n const url = `${bridgeApiBaseUrl}/getQuote?${queryParams}`;\n const quotes: unknown[] = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n signal,\n });\n\n const filteredQuotes = quotes.filter((quoteResponse: unknown) => {\n return validateQuoteResponse(quoteResponse);\n });\n return filteredQuotes as QuoteResponse[];\n}\n"]}
@@ -2,21 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isValidQuoteRequest = void 0;
4
4
  const isValidQuoteRequest = (partialRequest, requireAmount = true) => {
5
- const stringFields = [
6
- 'srcTokenAddress',
7
- 'destTokenAddress',
8
- 'srcChainId',
9
- 'destChainId',
10
- 'walletAddress',
11
- ];
5
+ const stringFields = ['srcTokenAddress', 'destTokenAddress'];
12
6
  if (requireAmount) {
13
7
  stringFields.push('srcTokenAmount');
14
8
  }
15
- const numberFields = [];
16
- // if slippage is defined, require it to be a number
17
- if (partialRequest.slippage !== undefined) {
18
- numberFields.push('slippage');
19
- }
9
+ const numberFields = ['srcChainId', 'destChainId', 'slippage'];
20
10
  return (stringFields.every((field) => field in partialRequest &&
21
11
  typeof partialRequest[field] ===
22
12
  'string' &&
@@ -1 +1 @@
1
- {"version":3,"file":"quote.cjs","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":";;;AAEO,MAAM,mBAAmB,GAAG,CACjC,cAA4C,EAC5C,aAAa,GAAG,IAAI,EACmB,EAAE;IACzC,MAAM,YAAY,GAAG;QACnB,iBAAiB;QACjB,kBAAkB;QAClB,YAAY;QACZ,aAAa;QACb,eAAe;KAChB,CAAC;IACF,IAAI,aAAa,EAAE;QACjB,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;KACrC;IACD,MAAM,YAAY,GAAG,EAAE,CAAC;IACxB,oDAAoD;IACpD,IAAI,cAAc,CAAC,QAAQ,KAAK,SAAS,EAAE;QACzC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;KAC/B;IAED,OAAO,CACL,YAAY,CAAC,KAAK,CAChB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,IAAI,cAAc;QACvB,OAAO,cAAc,CAAC,KAAoC,CAAC;YACzD,QAAQ;QACV,cAAc,CAAC,KAAoC,CAAC,KAAK,SAAS;QAClE,cAAc,CAAC,KAAoC,CAAC,KAAK,EAAE;QAC3D,cAAc,CAAC,KAAoC,CAAC,KAAK,IAAI,CAChE;QACD,YAAY,CAAC,KAAK,CAChB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,IAAI,cAAc;YACvB,OAAO,cAAc,CAAC,KAAoC,CAAC;gBACzD,QAAQ;YACV,cAAc,CAAC,KAAoC,CAAC,KAAK,SAAS;YAClE,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,KAAoC,CAAC,CAAC,CAAC;YACpE,cAAc,CAAC,KAAoC,CAAC,KAAK,IAAI,CAChE;QACD,CAAC,aAAa;YACZ,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACrE,CAAC,CAAC,IAAI,CAAC,CACV,CAAC;AACJ,CAAC,CAAC;AA3CW,QAAA,mBAAmB,uBA2C9B","sourcesContent":["import type { GenericQuoteRequest } from '../types';\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 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"]}
1
+ {"version":3,"file":"quote.cjs","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":";;;AAEO,MAAM,mBAAmB,GAAG,CACjC,cAAqC,EACrC,aAAa,GAAG,IAAI,EACY,EAAE;IAClC,MAAM,YAAY,GAAG,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;IAC7D,IAAI,aAAa,EAAE;QACjB,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;KACrC;IACD,MAAM,YAAY,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IAE/D,OAAO,CACL,YAAY,CAAC,KAAK,CAChB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,IAAI,cAAc;QACvB,OAAO,cAAc,CAAC,KAAoC,CAAC;YACzD,QAAQ;QACV,cAAc,CAAC,KAAoC,CAAC,KAAK,SAAS;QAClE,cAAc,CAAC,KAAoC,CAAC,KAAK,EAAE;QAC3D,cAAc,CAAC,KAAoC,CAAC,KAAK,IAAI,CAChE;QACD,YAAY,CAAC,KAAK,CAChB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,IAAI,cAAc;YACvB,OAAO,cAAc,CAAC,KAAoC,CAAC;gBACzD,QAAQ;YACV,cAAc,CAAC,KAAoC,CAAC,KAAK,SAAS;YAClE,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,KAAoC,CAAC,CAAC,CAAC;YACpE,cAAc,CAAC,KAAoC,CAAC,KAAK,IAAI,CAChE;QACD,CAAC,aAAa;YACZ,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACrE,CAAC,CAAC,IAAI,CAAC,CACV,CAAC;AACJ,CAAC,CAAC;AAjCW,QAAA,mBAAmB,uBAiC9B","sourcesContent":["import type { QuoteRequest } from '../types';\n\nexport const isValidQuoteRequest = (\n partialRequest: Partial<QuoteRequest>,\n requireAmount = true,\n): partialRequest is QuoteRequest => {\n const stringFields = ['srcTokenAddress', 'destTokenAddress'];\n if (requireAmount) {\n stringFields.push('srcTokenAmount');\n }\n const numberFields = ['srcChainId', 'destChainId', 'slippage'];\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"]}
@@ -1,3 +1,3 @@
1
- import type { GenericQuoteRequest } from "../types.cjs";
2
- export declare const isValidQuoteRequest: (partialRequest: Partial<GenericQuoteRequest>, requireAmount?: boolean) => partialRequest is GenericQuoteRequest;
1
+ import type { QuoteRequest } from "../types.cjs";
2
+ export declare const isValidQuoteRequest: (partialRequest: Partial<QuoteRequest>, requireAmount?: boolean) => partialRequest is QuoteRequest;
3
3
  //# sourceMappingURL=quote.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"quote.d.cts","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAiB;AAEpD,eAAO,MAAM,mBAAmB,mBACd,QAAQ,mBAAmB,CAAC,mEA0C7C,CAAC"}
1
+ {"version":3,"file":"quote.d.cts","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAiB;AAE7C,eAAO,MAAM,mBAAmB,mBACd,QAAQ,YAAY,CAAC,4DAgCtC,CAAC"}
@@ -1,3 +1,3 @@
1
- import type { GenericQuoteRequest } from "../types.mjs";
2
- export declare const isValidQuoteRequest: (partialRequest: Partial<GenericQuoteRequest>, requireAmount?: boolean) => partialRequest is GenericQuoteRequest;
1
+ import type { QuoteRequest } from "../types.mjs";
2
+ export declare const isValidQuoteRequest: (partialRequest: Partial<QuoteRequest>, requireAmount?: boolean) => partialRequest is QuoteRequest;
3
3
  //# sourceMappingURL=quote.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"quote.d.mts","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAiB;AAEpD,eAAO,MAAM,mBAAmB,mBACd,QAAQ,mBAAmB,CAAC,mEA0C7C,CAAC"}
1
+ {"version":3,"file":"quote.d.mts","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAiB;AAE7C,eAAO,MAAM,mBAAmB,mBACd,QAAQ,YAAY,CAAC,4DAgCtC,CAAC"}
@@ -1,19 +1,9 @@
1
1
  export const isValidQuoteRequest = (partialRequest, requireAmount = true) => {
2
- const stringFields = [
3
- 'srcTokenAddress',
4
- 'destTokenAddress',
5
- 'srcChainId',
6
- 'destChainId',
7
- 'walletAddress',
8
- ];
2
+ const stringFields = ['srcTokenAddress', 'destTokenAddress'];
9
3
  if (requireAmount) {
10
4
  stringFields.push('srcTokenAmount');
11
5
  }
12
- const numberFields = [];
13
- // if slippage is defined, require it to be a number
14
- if (partialRequest.slippage !== undefined) {
15
- numberFields.push('slippage');
16
- }
6
+ const numberFields = ['srcChainId', 'destChainId', 'slippage'];
17
7
  return (stringFields.every((field) => field in partialRequest &&
18
8
  typeof partialRequest[field] ===
19
9
  'string' &&
@@ -1 +1 @@
1
- {"version":3,"file":"quote.mjs","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,cAA4C,EAC5C,aAAa,GAAG,IAAI,EACmB,EAAE;IACzC,MAAM,YAAY,GAAG;QACnB,iBAAiB;QACjB,kBAAkB;QAClB,YAAY;QACZ,aAAa;QACb,eAAe;KAChB,CAAC;IACF,IAAI,aAAa,EAAE;QACjB,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;KACrC;IACD,MAAM,YAAY,GAAG,EAAE,CAAC;IACxB,oDAAoD;IACpD,IAAI,cAAc,CAAC,QAAQ,KAAK,SAAS,EAAE;QACzC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;KAC/B;IAED,OAAO,CACL,YAAY,CAAC,KAAK,CAChB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,IAAI,cAAc;QACvB,OAAO,cAAc,CAAC,KAAoC,CAAC;YACzD,QAAQ;QACV,cAAc,CAAC,KAAoC,CAAC,KAAK,SAAS;QAClE,cAAc,CAAC,KAAoC,CAAC,KAAK,EAAE;QAC3D,cAAc,CAAC,KAAoC,CAAC,KAAK,IAAI,CAChE;QACD,YAAY,CAAC,KAAK,CAChB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,IAAI,cAAc;YACvB,OAAO,cAAc,CAAC,KAAoC,CAAC;gBACzD,QAAQ;YACV,cAAc,CAAC,KAAoC,CAAC,KAAK,SAAS;YAClE,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,KAAoC,CAAC,CAAC,CAAC;YACpE,cAAc,CAAC,KAAoC,CAAC,KAAK,IAAI,CAChE;QACD,CAAC,aAAa;YACZ,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACrE,CAAC,CAAC,IAAI,CAAC,CACV,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type { GenericQuoteRequest } from '../types';\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 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"]}
1
+ {"version":3,"file":"quote.mjs","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,cAAqC,EACrC,aAAa,GAAG,IAAI,EACY,EAAE;IAClC,MAAM,YAAY,GAAG,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;IAC7D,IAAI,aAAa,EAAE;QACjB,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;KACrC;IACD,MAAM,YAAY,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IAE/D,OAAO,CACL,YAAY,CAAC,KAAK,CAChB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,IAAI,cAAc;QACvB,OAAO,cAAc,CAAC,KAAoC,CAAC;YACzD,QAAQ;QACV,cAAc,CAAC,KAAoC,CAAC,KAAK,SAAS;QAClE,cAAc,CAAC,KAAoC,CAAC,KAAK,EAAE;QAC3D,cAAc,CAAC,KAAoC,CAAC,KAAK,IAAI,CAChE;QACD,YAAY,CAAC,KAAK,CAChB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,IAAI,cAAc;YACvB,OAAO,cAAc,CAAC,KAAoC,CAAC;gBACzD,QAAQ;YACV,cAAc,CAAC,KAAoC,CAAC,KAAK,SAAS;YAClE,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,KAAoC,CAAC,CAAC,CAAC;YACpE,cAAc,CAAC,KAAoC,CAAC,KAAK,IAAI,CAChE;QACD,CAAC,aAAa;YACZ,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACrE,CAAC,CAAC,IAAI,CAAC,CACV,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type { QuoteRequest } from '../types';\n\nexport const isValidQuoteRequest = (\n partialRequest: Partial<QuoteRequest>,\n requireAmount = true,\n): partialRequest is QuoteRequest => {\n const stringFields = ['srcTokenAddress', 'destTokenAddress'];\n if (requireAmount) {\n stringFields.push('srcTokenAmount');\n }\n const numberFields = ['srcChainId', 'destChainId', 'slippage'];\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"]}
@@ -10,23 +10,15 @@ const HexStringSchema = (0, superstruct_1.define)('HexString', (v) => (0, utils_
10
10
  const truthyString = (s) => Boolean(s?.length);
11
11
  exports.truthyString = truthyString;
12
12
  const TruthyDigitStringSchema = (0, superstruct_1.define)('TruthyDigitString', (v) => (0, exports.truthyString)(v) && Boolean(v.match(/^\d+$/u)));
13
- const ChainIdSchema = (0, superstruct_1.number)();
14
- const BridgeAssetSchema = (0, superstruct_1.type)({
15
- chainId: ChainIdSchema,
16
- address: (0, superstruct_1.string)(),
17
- assetId: (0, superstruct_1.string)(),
18
- symbol: (0, superstruct_1.string)(),
19
- name: (0, superstruct_1.string)(),
13
+ const SwapsTokenObjectSchema = (0, superstruct_1.type)({
20
14
  decimals: (0, superstruct_1.number)(),
21
- icon: (0, superstruct_1.optional)((0, superstruct_1.string)()),
22
- iconUrl: (0, superstruct_1.optional)((0, superstruct_1.string)()),
15
+ address: (0, superstruct_1.intersection)([(0, superstruct_1.string)(), HexAddressSchema]),
16
+ symbol: (0, superstruct_1.size)((0, superstruct_1.string)(), 1, 12),
23
17
  });
24
18
  const validateFeatureFlagsResponse = (data) => {
25
19
  const ChainConfigurationSchema = (0, superstruct_1.type)({
26
20
  isActiveSrc: (0, superstruct_1.boolean)(),
27
21
  isActiveDest: (0, superstruct_1.boolean)(),
28
- refreshRate: (0, superstruct_1.optional)((0, superstruct_1.number)()),
29
- topAssets: (0, superstruct_1.optional)((0, superstruct_1.array)((0, superstruct_1.string)())),
30
22
  });
31
23
  const ConfigSchema = (0, superstruct_1.type)({
32
24
  refreshRate: (0, superstruct_1.number)(),
@@ -43,10 +35,19 @@ const validateFeatureFlagsResponse = (data) => {
43
35
  };
44
36
  exports.validateFeatureFlagsResponse = validateFeatureFlagsResponse;
45
37
  const validateSwapsTokenObject = (data) => {
46
- return (0, superstruct_1.is)(data, BridgeAssetSchema);
38
+ return (0, superstruct_1.is)(data, SwapsTokenObjectSchema);
47
39
  };
48
40
  exports.validateSwapsTokenObject = validateSwapsTokenObject;
49
41
  const validateQuoteResponse = (data) => {
42
+ const ChainIdSchema = (0, superstruct_1.number)();
43
+ const BridgeAssetSchema = (0, superstruct_1.type)({
44
+ chainId: ChainIdSchema,
45
+ address: (0, superstruct_1.string)(),
46
+ symbol: (0, superstruct_1.string)(),
47
+ name: (0, superstruct_1.string)(),
48
+ decimals: (0, superstruct_1.number)(),
49
+ icon: (0, superstruct_1.optional)((0, superstruct_1.string)()),
50
+ });
50
51
  const FeeDataSchema = (0, superstruct_1.type)({
51
52
  amount: TruthyDigitStringSchema,
52
53
  asset: BridgeAssetSchema,
@@ -70,10 +71,10 @@ const validateQuoteResponse = (data) => {
70
71
  const QuoteSchema = (0, superstruct_1.type)({
71
72
  requestId: (0, superstruct_1.string)(),
72
73
  srcChainId: ChainIdSchema,
73
- srcAsset: BridgeAssetSchema,
74
+ srcAsset: SwapsTokenObjectSchema,
74
75
  srcTokenAmount: (0, superstruct_1.string)(),
75
76
  destChainId: ChainIdSchema,
76
- destAsset: BridgeAssetSchema,
77
+ destAsset: SwapsTokenObjectSchema,
77
78
  destTokenAmount: (0, superstruct_1.string)(),
78
79
  feeData: (0, superstruct_1.record)((0, superstruct_1.enums)(Object.values(types_1.FeeType)), FeeDataSchema),
79
80
  bridgeId: (0, superstruct_1.string)(),
@@ -92,7 +93,7 @@ const validateQuoteResponse = (data) => {
92
93
  const QuoteResponseSchema = (0, superstruct_1.type)({
93
94
  quote: QuoteSchema,
94
95
  approval: (0, superstruct_1.optional)(TxDataSchema),
95
- trade: (0, superstruct_1.union)([TxDataSchema, (0, superstruct_1.string)()]),
96
+ trade: TxDataSchema,
96
97
  estimatedProcessingTimeInSeconds: (0, superstruct_1.number)(),
97
98
  });
98
99
  return (0, superstruct_1.is)(data, QuoteResponseSchema);
@@ -1 +1 @@
1
- {"version":3,"file":"validators.cjs","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"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","sourcesContent":["import { isValidHexAddress } from '@metamask/controller-utils';\nimport {\n string,\n boolean,\n number,\n type,\n is,\n record,\n array,\n nullable,\n optional,\n enums,\n define,\n union,\n} from '@metamask/superstruct';\nimport { isStrictHexString } from '@metamask/utils';\n\nimport type { BridgeAsset, FeatureFlagResponse, QuoteResponse } from '../types';\nimport { ActionTypes, BridgeFlag, FeeType } from '../types';\n\nconst HexAddressSchema = define('HexAddress', (v: unknown) =>\n isValidHexAddress(v as string, { allowNonPrefixed: false }),\n);\n\nconst HexStringSchema = define('HexString', (v: unknown) =>\n isStrictHexString(v as string),\n);\n\nexport const truthyString = (s: string) => Boolean(s?.length);\nconst TruthyDigitStringSchema = define(\n 'TruthyDigitString',\n (v: unknown) =>\n truthyString(v as string) && Boolean((v as string).match(/^\\d+$/u)),\n);\n\nconst ChainIdSchema = number();\n\nconst BridgeAssetSchema = type({\n chainId: ChainIdSchema,\n address: string(),\n assetId: string(),\n symbol: string(),\n name: string(),\n decimals: number(),\n icon: optional(string()),\n iconUrl: optional(string()),\n});\n\nexport const validateFeatureFlagsResponse = (\n data: unknown,\n): data is FeatureFlagResponse => {\n const ChainConfigurationSchema = type({\n isActiveSrc: boolean(),\n isActiveDest: boolean(),\n refreshRate: optional(number()),\n topAssets: optional(array(string())),\n });\n\n const ConfigSchema = type({\n refreshRate: number(),\n maxRefreshCount: number(),\n support: boolean(),\n chains: record(string(), ChainConfigurationSchema),\n });\n\n // Create schema for FeatureFlagResponse\n const FeatureFlagResponseSchema = type({\n [BridgeFlag.EXTENSION_CONFIG]: ConfigSchema,\n [BridgeFlag.MOBILE_CONFIG]: ConfigSchema,\n });\n\n return is(data, FeatureFlagResponseSchema);\n};\n\nexport const validateSwapsTokenObject = (\n data: unknown,\n): data is BridgeAsset => {\n return is(data, BridgeAssetSchema);\n};\n\nexport const validateQuoteResponse = (data: unknown): data is QuoteResponse => {\n const FeeDataSchema = type({\n amount: TruthyDigitStringSchema,\n asset: BridgeAssetSchema,\n });\n\n const ProtocolSchema = type({\n name: string(),\n displayName: optional(string()),\n icon: optional(string()),\n });\n\n const StepSchema = type({\n action: enums(Object.values(ActionTypes)),\n srcChainId: ChainIdSchema,\n destChainId: optional(ChainIdSchema),\n srcAsset: BridgeAssetSchema,\n destAsset: BridgeAssetSchema,\n srcAmount: string(),\n destAmount: string(),\n protocol: ProtocolSchema,\n });\n\n const RefuelDataSchema = StepSchema;\n\n const QuoteSchema = type({\n requestId: string(),\n srcChainId: ChainIdSchema,\n srcAsset: BridgeAssetSchema,\n srcTokenAmount: string(),\n destChainId: ChainIdSchema,\n destAsset: BridgeAssetSchema,\n destTokenAmount: string(),\n feeData: record(enums(Object.values(FeeType)), FeeDataSchema),\n bridgeId: string(),\n bridges: array(string()),\n steps: array(StepSchema),\n refuel: optional(RefuelDataSchema),\n });\n\n const TxDataSchema = type({\n chainId: number(),\n to: HexAddressSchema,\n from: HexAddressSchema,\n value: HexStringSchema,\n data: HexStringSchema,\n gasLimit: nullable(number()),\n });\n\n const QuoteResponseSchema = type({\n quote: QuoteSchema,\n approval: optional(TxDataSchema),\n trade: union([TxDataSchema, string()]),\n estimatedProcessingTimeInSeconds: number(),\n });\n\n return is(data, QuoteResponseSchema);\n};\n"]}
1
+ {"version":3,"file":"validators.cjs","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"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","sourcesContent":["import { isValidHexAddress } from '@metamask/controller-utils';\nimport {\n string,\n boolean,\n number,\n type,\n is,\n record,\n array,\n nullable,\n optional,\n enums,\n define,\n intersection,\n size,\n} from '@metamask/superstruct';\nimport { isStrictHexString } from '@metamask/utils';\n\nimport type { SwapsTokenObject } from '../constants/tokens';\nimport type { FeatureFlagResponse, QuoteResponse } from '../types';\nimport { ActionTypes, BridgeFlag, FeeType } from '../types';\n\nconst HexAddressSchema = define('HexAddress', (v: unknown) =>\n isValidHexAddress(v as string, { allowNonPrefixed: false }),\n);\n\nconst HexStringSchema = define('HexString', (v: unknown) =>\n isStrictHexString(v as string),\n);\n\nexport const truthyString = (s: string) => Boolean(s?.length);\nconst TruthyDigitStringSchema = define(\n 'TruthyDigitString',\n (v: unknown) =>\n truthyString(v as string) && Boolean((v as string).match(/^\\d+$/u)),\n);\n\nconst SwapsTokenObjectSchema = type({\n decimals: number(),\n address: intersection([string(), HexAddressSchema]),\n symbol: size(string(), 1, 12),\n});\n\nexport const validateFeatureFlagsResponse = (\n data: unknown,\n): data is FeatureFlagResponse => {\n const ChainConfigurationSchema = type({\n isActiveSrc: boolean(),\n isActiveDest: boolean(),\n });\n\n const ConfigSchema = type({\n refreshRate: number(),\n maxRefreshCount: number(),\n support: boolean(),\n chains: record(string(), ChainConfigurationSchema),\n });\n\n // Create schema for FeatureFlagResponse\n const FeatureFlagResponseSchema = type({\n [BridgeFlag.EXTENSION_CONFIG]: ConfigSchema,\n [BridgeFlag.MOBILE_CONFIG]: ConfigSchema,\n });\n\n return is(data, FeatureFlagResponseSchema);\n};\n\nexport const validateSwapsTokenObject = (\n data: unknown,\n): data is SwapsTokenObject => {\n return is(data, SwapsTokenObjectSchema);\n};\n\nexport const validateQuoteResponse = (data: unknown): data is QuoteResponse => {\n const ChainIdSchema = number();\n\n const BridgeAssetSchema = type({\n chainId: ChainIdSchema,\n address: string(),\n symbol: string(),\n name: string(),\n decimals: number(),\n icon: optional(string()),\n });\n\n const FeeDataSchema = type({\n amount: TruthyDigitStringSchema,\n asset: BridgeAssetSchema,\n });\n\n const ProtocolSchema = type({\n name: string(),\n displayName: optional(string()),\n icon: optional(string()),\n });\n\n const StepSchema = type({\n action: enums(Object.values(ActionTypes)),\n srcChainId: ChainIdSchema,\n destChainId: optional(ChainIdSchema),\n srcAsset: BridgeAssetSchema,\n destAsset: BridgeAssetSchema,\n srcAmount: string(),\n destAmount: string(),\n protocol: ProtocolSchema,\n });\n\n const RefuelDataSchema = StepSchema;\n\n const QuoteSchema = type({\n requestId: string(),\n srcChainId: ChainIdSchema,\n srcAsset: SwapsTokenObjectSchema,\n srcTokenAmount: string(),\n destChainId: ChainIdSchema,\n destAsset: SwapsTokenObjectSchema,\n destTokenAmount: string(),\n feeData: record(enums(Object.values(FeeType)), FeeDataSchema),\n bridgeId: string(),\n bridges: array(string()),\n steps: array(StepSchema),\n refuel: optional(RefuelDataSchema),\n });\n\n const TxDataSchema = type({\n chainId: number(),\n to: HexAddressSchema,\n from: HexAddressSchema,\n value: HexStringSchema,\n data: HexStringSchema,\n gasLimit: nullable(number()),\n });\n\n const QuoteResponseSchema = type({\n quote: QuoteSchema,\n approval: optional(TxDataSchema),\n trade: TxDataSchema,\n estimatedProcessingTimeInSeconds: number(),\n });\n\n return is(data, QuoteResponseSchema);\n};\n"]}
@@ -1,6 +1,7 @@
1
- import type { BridgeAsset, FeatureFlagResponse, QuoteResponse } from "../types.cjs";
1
+ import type { SwapsTokenObject } from "../constants/tokens.cjs";
2
+ import type { FeatureFlagResponse, QuoteResponse } from "../types.cjs";
2
3
  export declare const truthyString: (s: string) => boolean;
3
4
  export declare const validateFeatureFlagsResponse: (data: unknown) => data is FeatureFlagResponse;
4
- export declare const validateSwapsTokenObject: (data: unknown) => data is BridgeAsset;
5
+ export declare const validateSwapsTokenObject: (data: unknown) => data is SwapsTokenObject;
5
6
  export declare const validateQuoteResponse: (data: unknown) => data is QuoteResponse;
6
7
  //# sourceMappingURL=validators.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.cts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,aAAa,EAAE,qBAAiB;AAWhF,eAAO,MAAM,YAAY,MAAO,MAAM,YAAuB,CAAC;AAoB9D,eAAO,MAAM,4BAA4B,SACjC,OAAO,gCAuBd,CAAC;AAEF,eAAO,MAAM,wBAAwB,SAC7B,OAAO,wBAGd,CAAC;AAEF,eAAO,MAAM,qBAAqB,SAAU,OAAO,0BAyDlD,CAAC"}
1
+ {"version":3,"file":"validators.d.cts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gCAA4B;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,qBAAiB;AAWnE,eAAO,MAAM,YAAY,MAAO,MAAM,YAAuB,CAAC;AAa9D,eAAO,MAAM,4BAA4B,SACjC,OAAO,gCAqBd,CAAC;AAEF,eAAO,MAAM,wBAAwB,SAC7B,OAAO,6BAGd,CAAC;AAEF,eAAO,MAAM,qBAAqB,SAAU,OAAO,0BAoElD,CAAC"}
@@ -1,6 +1,7 @@
1
- import type { BridgeAsset, FeatureFlagResponse, QuoteResponse } from "../types.mjs";
1
+ import type { SwapsTokenObject } from "../constants/tokens.mjs";
2
+ import type { FeatureFlagResponse, QuoteResponse } from "../types.mjs";
2
3
  export declare const truthyString: (s: string) => boolean;
3
4
  export declare const validateFeatureFlagsResponse: (data: unknown) => data is FeatureFlagResponse;
4
- export declare const validateSwapsTokenObject: (data: unknown) => data is BridgeAsset;
5
+ export declare const validateSwapsTokenObject: (data: unknown) => data is SwapsTokenObject;
5
6
  export declare const validateQuoteResponse: (data: unknown) => data is QuoteResponse;
6
7
  //# sourceMappingURL=validators.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.mts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,aAAa,EAAE,qBAAiB;AAWhF,eAAO,MAAM,YAAY,MAAO,MAAM,YAAuB,CAAC;AAoB9D,eAAO,MAAM,4BAA4B,SACjC,OAAO,gCAuBd,CAAC;AAEF,eAAO,MAAM,wBAAwB,SAC7B,OAAO,wBAGd,CAAC;AAEF,eAAO,MAAM,qBAAqB,SAAU,OAAO,0BAyDlD,CAAC"}
1
+ {"version":3,"file":"validators.d.mts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gCAA4B;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,qBAAiB;AAWnE,eAAO,MAAM,YAAY,MAAO,MAAM,YAAuB,CAAC;AAa9D,eAAO,MAAM,4BAA4B,SACjC,OAAO,gCAqBd,CAAC;AAEF,eAAO,MAAM,wBAAwB,SAC7B,OAAO,6BAGd,CAAC;AAEF,eAAO,MAAM,qBAAqB,SAAU,OAAO,0BAoElD,CAAC"}