@metamask-previews/bridge-controller 77.3.2-preview-bbd2df29f → 77.3.2-preview-34f2bcbf7

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 (195) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/bridge-controller.cjs.map +1 -1
  3. package/dist/bridge-controller.d.cts +3 -2
  4. package/dist/bridge-controller.d.cts.map +1 -1
  5. package/dist/bridge-controller.d.mts +3 -2
  6. package/dist/bridge-controller.d.mts.map +1 -1
  7. package/dist/bridge-controller.mjs +1 -1
  8. package/dist/bridge-controller.mjs.map +1 -1
  9. package/dist/index.cjs +36 -30
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.d.cts +14 -5
  12. package/dist/index.d.cts.map +1 -1
  13. package/dist/index.d.mts +14 -5
  14. package/dist/index.d.mts.map +1 -1
  15. package/dist/index.mjs +10 -4
  16. package/dist/index.mjs.map +1 -1
  17. package/dist/selectors.cjs.map +1 -1
  18. package/dist/selectors.d.cts +5971 -6520
  19. package/dist/selectors.d.cts.map +1 -1
  20. package/dist/selectors.d.mts +5971 -6520
  21. package/dist/selectors.d.mts.map +1 -1
  22. package/dist/selectors.mjs.map +1 -1
  23. package/dist/types.cjs +1 -12
  24. package/dist/types.cjs.map +1 -1
  25. package/dist/types.d.cts +21 -41
  26. package/dist/types.d.cts.map +1 -1
  27. package/dist/types.d.mts +21 -41
  28. package/dist/types.d.mts.map +1 -1
  29. package/dist/types.mjs +0 -11
  30. package/dist/types.mjs.map +1 -1
  31. package/dist/utils/bridge.cjs +1 -0
  32. package/dist/utils/bridge.cjs.map +1 -1
  33. package/dist/utils/bridge.d.cts +4 -3
  34. package/dist/utils/bridge.d.cts.map +1 -1
  35. package/dist/utils/bridge.d.mts +4 -3
  36. package/dist/utils/bridge.d.mts.map +1 -1
  37. package/dist/utils/bridge.mjs +1 -0
  38. package/dist/utils/bridge.mjs.map +1 -1
  39. package/dist/utils/feature-flags.cjs +2 -2
  40. package/dist/utils/feature-flags.cjs.map +1 -1
  41. package/dist/utils/feature-flags.d.cts +1 -1
  42. package/dist/utils/feature-flags.d.mts +1 -1
  43. package/dist/utils/feature-flags.mjs +1 -1
  44. package/dist/utils/feature-flags.mjs.map +1 -1
  45. package/dist/utils/fetch.cjs +16 -11
  46. package/dist/utils/fetch.cjs.map +1 -1
  47. package/dist/utils/fetch.d.cts +3 -1
  48. package/dist/utils/fetch.d.cts.map +1 -1
  49. package/dist/utils/fetch.d.mts +3 -1
  50. package/dist/utils/fetch.d.mts.map +1 -1
  51. package/dist/utils/fetch.mjs +9 -4
  52. package/dist/utils/fetch.mjs.map +1 -1
  53. package/dist/utils/metrics/properties.cjs +2 -2
  54. package/dist/utils/metrics/properties.cjs.map +1 -1
  55. package/dist/utils/metrics/properties.d.cts +4 -2
  56. package/dist/utils/metrics/properties.d.cts.map +1 -1
  57. package/dist/utils/metrics/properties.d.mts +4 -2
  58. package/dist/utils/metrics/properties.d.mts.map +1 -1
  59. package/dist/utils/metrics/properties.mjs +1 -1
  60. package/dist/utils/metrics/properties.mjs.map +1 -1
  61. package/dist/utils/metrics/types.cjs.map +1 -1
  62. package/dist/utils/metrics/types.d.cts +2 -1
  63. package/dist/utils/metrics/types.d.cts.map +1 -1
  64. package/dist/utils/metrics/types.d.mts +2 -1
  65. package/dist/utils/metrics/types.d.mts.map +1 -1
  66. package/dist/utils/metrics/types.mjs.map +1 -1
  67. package/dist/utils/quote-fees.cjs +2 -1
  68. package/dist/utils/quote-fees.cjs.map +1 -1
  69. package/dist/utils/quote-fees.d.cts +2 -1
  70. package/dist/utils/quote-fees.d.cts.map +1 -1
  71. package/dist/utils/quote-fees.d.mts +2 -1
  72. package/dist/utils/quote-fees.d.mts.map +1 -1
  73. package/dist/utils/quote-fees.mjs +2 -1
  74. package/dist/utils/quote-fees.mjs.map +1 -1
  75. package/dist/utils/quote.cjs +3 -3
  76. package/dist/utils/quote.cjs.map +1 -1
  77. package/dist/utils/quote.d.cts +5 -2
  78. package/dist/utils/quote.d.cts.map +1 -1
  79. package/dist/utils/quote.d.mts +5 -2
  80. package/dist/utils/quote.d.mts.map +1 -1
  81. package/dist/utils/quote.mjs +2 -2
  82. package/dist/utils/quote.mjs.map +1 -1
  83. package/dist/utils/struct-error.cjs +16 -0
  84. package/dist/utils/struct-error.cjs.map +1 -0
  85. package/dist/utils/struct-error.d.cts +11 -0
  86. package/dist/utils/struct-error.d.cts.map +1 -0
  87. package/dist/utils/struct-error.d.mts +11 -0
  88. package/dist/utils/struct-error.d.mts.map +1 -0
  89. package/dist/utils/struct-error.mjs +12 -0
  90. package/dist/utils/struct-error.mjs.map +1 -0
  91. package/dist/utils/trade-utils.cjs +7 -66
  92. package/dist/utils/trade-utils.cjs.map +1 -1
  93. package/dist/utils/trade-utils.d.cts +1 -54
  94. package/dist/utils/trade-utils.d.cts.map +1 -1
  95. package/dist/utils/trade-utils.d.mts +1 -54
  96. package/dist/utils/trade-utils.d.mts.map +1 -1
  97. package/dist/utils/trade-utils.mjs +1 -56
  98. package/dist/utils/trade-utils.mjs.map +1 -1
  99. package/dist/validators/batch-sell.cjs +39 -0
  100. package/dist/validators/batch-sell.cjs.map +1 -0
  101. package/dist/validators/batch-sell.d.cts +79 -0
  102. package/dist/validators/batch-sell.d.cts.map +1 -0
  103. package/dist/validators/batch-sell.d.mts +79 -0
  104. package/dist/validators/batch-sell.d.mts.map +1 -0
  105. package/dist/validators/batch-sell.mjs +35 -0
  106. package/dist/validators/batch-sell.mjs.map +1 -0
  107. package/dist/validators/bridge-asset.cjs +42 -0
  108. package/dist/validators/bridge-asset.cjs.map +1 -0
  109. package/dist/validators/bridge-asset.d.cts +52 -0
  110. package/dist/validators/bridge-asset.d.cts.map +1 -0
  111. package/dist/validators/bridge-asset.d.mts +52 -0
  112. package/dist/validators/bridge-asset.d.mts.map +1 -0
  113. package/dist/validators/bridge-asset.mjs +38 -0
  114. package/dist/validators/bridge-asset.mjs.map +1 -0
  115. package/dist/validators/feature-flags.cjs +110 -0
  116. package/dist/validators/feature-flags.cjs.map +1 -0
  117. package/dist/validators/feature-flags.d.cts +264 -0
  118. package/dist/validators/feature-flags.d.cts.map +1 -0
  119. package/dist/validators/feature-flags.d.mts +264 -0
  120. package/dist/validators/feature-flags.d.mts.map +1 -0
  121. package/dist/validators/feature-flags.mjs +106 -0
  122. package/dist/validators/feature-flags.mjs.map +1 -0
  123. package/dist/validators/intent.cjs +122 -0
  124. package/dist/validators/intent.cjs.map +1 -0
  125. package/dist/validators/intent.d.cts +231 -0
  126. package/dist/validators/intent.d.cts.map +1 -0
  127. package/dist/validators/intent.d.mts +231 -0
  128. package/dist/validators/intent.d.mts.map +1 -0
  129. package/dist/validators/intent.mjs +119 -0
  130. package/dist/validators/intent.mjs.map +1 -0
  131. package/dist/validators/number.cjs +8 -0
  132. package/dist/validators/number.cjs.map +1 -0
  133. package/dist/validators/number.d.cts +4 -0
  134. package/dist/validators/number.d.cts.map +1 -0
  135. package/dist/validators/number.d.mts +4 -0
  136. package/dist/validators/number.d.mts.map +1 -0
  137. package/dist/validators/number.mjs +5 -0
  138. package/dist/validators/number.mjs.map +1 -0
  139. package/dist/validators/quote-response-v1.cjs +31 -0
  140. package/dist/validators/quote-response-v1.cjs.map +1 -0
  141. package/dist/validators/quote-response-v1.d.cts +658 -0
  142. package/dist/validators/quote-response-v1.d.cts.map +1 -0
  143. package/dist/validators/quote-response-v1.d.mts +658 -0
  144. package/dist/validators/quote-response-v1.d.mts.map +1 -0
  145. package/dist/validators/quote-response-v1.mjs +27 -0
  146. package/dist/validators/quote-response-v1.mjs.map +1 -0
  147. package/dist/validators/quote-stream-complete.cjs +29 -0
  148. package/dist/validators/quote-stream-complete.cjs.map +1 -0
  149. package/dist/validators/quote-stream-complete.d.cts +39 -0
  150. package/dist/validators/quote-stream-complete.d.cts.map +1 -0
  151. package/dist/validators/quote-stream-complete.d.mts +39 -0
  152. package/dist/validators/quote-stream-complete.d.mts.map +1 -0
  153. package/dist/validators/quote-stream-complete.mjs +25 -0
  154. package/dist/validators/quote-stream-complete.mjs.map +1 -0
  155. package/dist/validators/quote.cjs +96 -0
  156. package/dist/validators/quote.cjs.map +1 -0
  157. package/dist/validators/quote.d.cts +230 -0
  158. package/dist/validators/quote.d.cts.map +1 -0
  159. package/dist/validators/quote.d.mts +230 -0
  160. package/dist/validators/quote.d.mts.map +1 -0
  161. package/dist/validators/quote.mjs +93 -0
  162. package/dist/validators/quote.mjs.map +1 -0
  163. package/dist/validators/step.cjs +20 -0
  164. package/dist/validators/step.cjs.map +1 -0
  165. package/dist/validators/step.d.cts +148 -0
  166. package/dist/validators/step.d.cts.map +1 -0
  167. package/dist/validators/step.d.mts +148 -0
  168. package/dist/validators/step.d.mts.map +1 -0
  169. package/dist/validators/step.mjs +17 -0
  170. package/dist/validators/step.mjs.map +1 -0
  171. package/dist/validators/token-feature.cjs +22 -0
  172. package/dist/validators/token-feature.cjs.map +1 -0
  173. package/dist/validators/token-feature.d.cts +26 -0
  174. package/dist/validators/token-feature.d.cts.map +1 -0
  175. package/dist/validators/token-feature.d.mts +26 -0
  176. package/dist/validators/token-feature.d.mts.map +1 -0
  177. package/dist/validators/token-feature.mjs +18 -0
  178. package/dist/validators/token-feature.mjs.map +1 -0
  179. package/dist/validators/trade.cjs +94 -0
  180. package/dist/validators/trade.cjs.map +1 -0
  181. package/dist/validators/trade.d.cts +121 -0
  182. package/dist/validators/trade.d.cts.map +1 -0
  183. package/dist/validators/trade.d.mts +121 -0
  184. package/dist/validators/trade.d.mts.map +1 -0
  185. package/dist/validators/trade.mjs +86 -0
  186. package/dist/validators/trade.mjs.map +1 -0
  187. package/package.json +4 -4
  188. package/dist/utils/validators.cjs +0 -471
  189. package/dist/utils/validators.cjs.map +0 -1
  190. package/dist/utils/validators.d.cts +0 -1765
  191. package/dist/utils/validators.d.cts.map +0 -1
  192. package/dist/utils/validators.d.mts +0 -1765
  193. package/dist/utils/validators.d.mts.map +0 -1
  194. package/dist/utils/validators.mjs +0 -461
  195. package/dist/utils/validators.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { DEFAULT_CHAIN_RANKING, DEFAULT_FEATURE_FLAG_CONFIG } from "../constants/bridge.mjs";
2
+ import { validateFeatureFlagsResponse } from "../validators/feature-flags.mjs";
2
3
  import { formatChainIdToCaip } from "./caip-formatters.mjs";
3
- import { validateFeatureFlagsResponse } from "./validators.mjs";
4
4
  export const formatFeatureFlags = (bridgeFeatureFlags) => {
5
5
  const getChainsObj = (chains) => Object.entries(chains).reduce((acc, [chainId, value]) => ({
6
6
  ...acc,
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags.mjs","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC5B,gCAA4B;AAE7B,OAAO,EAAE,mBAAmB,EAAE,8BAA0B;AACxD,OAAO,EAAE,4BAA4B,EAAE,yBAAqB;AAE5D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,kBAA8C,EAC9C,EAAE;IACF,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;QAC1B,GAAG,GAAG;QACN,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK;KACtC,CAAC,EACF,EAAE,CACH,CAAC;IAEJ,OAAO;QACL,GAAG,kBAAkB;QACrB,MAAM,EAAE,YAAY,CAAC,kBAAkB,CAAC,MAAM,CAAC;KAChD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,kBAA2B,EACC,EAAE;IAC9B,IAAI,4BAA4B,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACrD,MAAM,cAAc,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;QAC9D,sEAAsE;QACtE,IACE,CAAC,cAAc,CAAC,YAAY;YAC5B,cAAc,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EACxC,CAAC;YACD,OAAO;gBACL,GAAG,cAAc;gBACjB,YAAY,EAAE,CAAC,GAAG,qBAAqB,CAAC;aACzC,CAAC;QACJ,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,OAAO,2BAA2B,CAAC;AACrC,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAMnC,SAAY;IACZ,kGAAkG;IAClG,MAAM,gCAAgC,GAAG,SAAS,CAAC,IAAI,CACrD,sCAAsC,CACvC,CAAC;IAEF,wDAAwD;IACxD,2GAA2G;IAC3G,0FAA0F;IAC1F,2HAA2H;IAC3H,uHAAuH;IACvH,MAAM,cAAc,GAClB,gCAAgC,EAAE,kBAAkB,EAAE,cAAc,CAAC;IAEvE,uGAAuG;IACvG,MAAM,eAAe,GACnB,gCAAgC,EAAE,kBAAkB,EAAE,YAAY,CAAC;IAErE,OAAO,mBAAmB,CAAC,cAAc,IAAI,eAAe,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,aAAqB,EACrB,kBAA0B,EAC1B,EAAE;IACF,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,aAAa;SAC1D,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,MAAM,CAAC,CAAC;IACf,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,GAC1D,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAE5C,IAAI,WAAW,GAAG,gBAAgB,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,WAAW,KAAK,gBAAgB,IAAI,WAAW,GAAG,gBAAgB,EAAE,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CACL,WAAW,KAAK,gBAAgB;QAChC,WAAW,KAAK,gBAAgB;QAChC,WAAW,IAAI,gBAAgB,CAChC,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type { RemoteFeatureFlagControllerState } from '@metamask/remote-feature-flag-controller';\n\nimport {\n DEFAULT_CHAIN_RANKING,\n DEFAULT_FEATURE_FLAG_CONFIG,\n} from '../constants/bridge';\nimport type { FeatureFlagsPlatformConfig, ChainConfiguration } from '../types';\nimport { formatChainIdToCaip } from './caip-formatters';\nimport { validateFeatureFlagsResponse } from './validators';\n\nexport const formatFeatureFlags = (\n bridgeFeatureFlags: FeatureFlagsPlatformConfig,\n) => {\n const getChainsObj = (chains: Record<string, ChainConfiguration>) =>\n Object.entries(chains).reduce(\n (acc, [chainId, value]) => ({\n ...acc,\n [formatChainIdToCaip(chainId)]: value,\n }),\n {},\n );\n\n return {\n ...bridgeFeatureFlags,\n chains: getChainsObj(bridgeFeatureFlags.chains),\n };\n};\n\nexport const processFeatureFlags = (\n bridgeFeatureFlags: unknown,\n): FeatureFlagsPlatformConfig => {\n if (validateFeatureFlagsResponse(bridgeFeatureFlags)) {\n const formattedFlags = formatFeatureFlags(bridgeFeatureFlags);\n // If chainRanking is undefined or empty, use the default chainRanking\n if (\n !formattedFlags.chainRanking ||\n formattedFlags.chainRanking.length === 0\n ) {\n return {\n ...formattedFlags,\n chainRanking: [...DEFAULT_CHAIN_RANKING],\n };\n }\n return formattedFlags;\n }\n return DEFAULT_FEATURE_FLAG_CONFIG;\n};\n\n/**\n * Gets the bridge feature flags from the remote feature flag controller\n *\n * @param messenger - Any messenger with access to RemoteFeatureFlagController:getState\n * @returns The bridge feature flags\n */\nexport function getBridgeFeatureFlags<\n T extends {\n call(\n action: 'RemoteFeatureFlagController:getState',\n ): RemoteFeatureFlagControllerState;\n },\n>(messenger: T): FeatureFlagsPlatformConfig {\n // This will return the bridgeConfig for the current platform even without specifying the platform\n const remoteFeatureFlagControllerState = messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n\n // bridgeConfigV2 is the feature flag for the mobile app\n // bridgeConfig for Mobile has been deprecated since release of bridge and Solana in 7.46.0 was pushed back\n // and there's no way to turn on bridgeConfig for 7.47.0 without affecting 7.46.0 as well.\n // You will still get bridgeConfig returned from remoteFeatureFlagControllerState but you should use bridgeConfigV2 instead\n // Mobile's bridgeConfig will be permanently serving the disabled variation, so falling back to it in Mobile will be ok\n const rawMobileFlags =\n remoteFeatureFlagControllerState?.remoteFeatureFlags?.bridgeConfigV2;\n\n // Extension LaunchDarkly will not have the bridgeConfigV2 field, so we'll continue to use bridgeConfig\n const rawBridgeConfig =\n remoteFeatureFlagControllerState?.remoteFeatureFlags?.bridgeConfig;\n\n return processFeatureFlags(rawMobileFlags || rawBridgeConfig);\n}\n\n/**\n * Checks if the client version is greater than or equal to the minimum required version\n *\n * @param clientVersion - The client version\n * @param minRequiredVersion - The minimum required version\n * @returns True if the client version is greater than or equal to the minimum required version, false otherwise\n */\nexport const hasMinimumRequiredVersion = (\n clientVersion: string,\n minRequiredVersion: string,\n) => {\n const [clientMajor, clientMinor, clientPatch] = clientVersion\n .split('.')\n .map(Number);\n const [minRequiredMajor, minRequiredMinor, minRequiredPatch] =\n minRequiredVersion.split('.').map(Number);\n\n if (clientMajor > minRequiredMajor) {\n return true;\n }\n if (clientMajor === minRequiredMajor && clientMinor > minRequiredMinor) {\n return true;\n }\n return (\n clientMajor === minRequiredMajor &&\n clientMinor === minRequiredMinor &&\n clientPatch >= minRequiredPatch\n );\n};\n"]}
1
+ {"version":3,"file":"feature-flags.mjs","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC5B,gCAA4B;AAE7B,OAAO,EAAE,4BAA4B,EAAE,wCAAoC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,8BAA0B;AAExD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,kBAA8C,EAC9C,EAAE;IACF,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;QAC1B,GAAG,GAAG;QACN,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK;KACtC,CAAC,EACF,EAAE,CACH,CAAC;IAEJ,OAAO;QACL,GAAG,kBAAkB;QACrB,MAAM,EAAE,YAAY,CAAC,kBAAkB,CAAC,MAAM,CAAC;KAChD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,kBAA2B,EACC,EAAE;IAC9B,IAAI,4BAA4B,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACrD,MAAM,cAAc,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;QAC9D,sEAAsE;QACtE,IACE,CAAC,cAAc,CAAC,YAAY;YAC5B,cAAc,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EACxC,CAAC;YACD,OAAO;gBACL,GAAG,cAAc;gBACjB,YAAY,EAAE,CAAC,GAAG,qBAAqB,CAAC;aACzC,CAAC;QACJ,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,OAAO,2BAA2B,CAAC;AACrC,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAMnC,SAAY;IACZ,kGAAkG;IAClG,MAAM,gCAAgC,GAAG,SAAS,CAAC,IAAI,CACrD,sCAAsC,CACvC,CAAC;IAEF,wDAAwD;IACxD,2GAA2G;IAC3G,0FAA0F;IAC1F,2HAA2H;IAC3H,uHAAuH;IACvH,MAAM,cAAc,GAClB,gCAAgC,EAAE,kBAAkB,EAAE,cAAc,CAAC;IAEvE,uGAAuG;IACvG,MAAM,eAAe,GACnB,gCAAgC,EAAE,kBAAkB,EAAE,YAAY,CAAC;IAErE,OAAO,mBAAmB,CAAC,cAAc,IAAI,eAAe,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,aAAqB,EACrB,kBAA0B,EAC1B,EAAE;IACF,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,aAAa;SAC1D,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,MAAM,CAAC,CAAC;IACf,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,GAC1D,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAE5C,IAAI,WAAW,GAAG,gBAAgB,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,WAAW,KAAK,gBAAgB,IAAI,WAAW,GAAG,gBAAgB,EAAE,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CACL,WAAW,KAAK,gBAAgB;QAChC,WAAW,KAAK,gBAAgB;QAChC,WAAW,IAAI,gBAAgB,CAChC,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type { RemoteFeatureFlagControllerState } from '@metamask/remote-feature-flag-controller';\n\nimport {\n DEFAULT_CHAIN_RANKING,\n DEFAULT_FEATURE_FLAG_CONFIG,\n} from '../constants/bridge';\nimport type { FeatureFlagsPlatformConfig, ChainConfiguration } from '../types';\nimport { validateFeatureFlagsResponse } from '../validators/feature-flags';\nimport { formatChainIdToCaip } from './caip-formatters';\n\nexport const formatFeatureFlags = (\n bridgeFeatureFlags: FeatureFlagsPlatformConfig,\n) => {\n const getChainsObj = (chains: Record<string, ChainConfiguration>) =>\n Object.entries(chains).reduce(\n (acc, [chainId, value]) => ({\n ...acc,\n [formatChainIdToCaip(chainId)]: value,\n }),\n {},\n );\n\n return {\n ...bridgeFeatureFlags,\n chains: getChainsObj(bridgeFeatureFlags.chains),\n };\n};\n\nexport const processFeatureFlags = (\n bridgeFeatureFlags: unknown,\n): FeatureFlagsPlatformConfig => {\n if (validateFeatureFlagsResponse(bridgeFeatureFlags)) {\n const formattedFlags = formatFeatureFlags(bridgeFeatureFlags);\n // If chainRanking is undefined or empty, use the default chainRanking\n if (\n !formattedFlags.chainRanking ||\n formattedFlags.chainRanking.length === 0\n ) {\n return {\n ...formattedFlags,\n chainRanking: [...DEFAULT_CHAIN_RANKING],\n };\n }\n return formattedFlags;\n }\n return DEFAULT_FEATURE_FLAG_CONFIG;\n};\n\n/**\n * Gets the bridge feature flags from the remote feature flag controller\n *\n * @param messenger - Any messenger with access to RemoteFeatureFlagController:getState\n * @returns The bridge feature flags\n */\nexport function getBridgeFeatureFlags<\n T extends {\n call(\n action: 'RemoteFeatureFlagController:getState',\n ): RemoteFeatureFlagControllerState;\n },\n>(messenger: T): FeatureFlagsPlatformConfig {\n // This will return the bridgeConfig for the current platform even without specifying the platform\n const remoteFeatureFlagControllerState = messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n\n // bridgeConfigV2 is the feature flag for the mobile app\n // bridgeConfig for Mobile has been deprecated since release of bridge and Solana in 7.46.0 was pushed back\n // and there's no way to turn on bridgeConfig for 7.47.0 without affecting 7.46.0 as well.\n // You will still get bridgeConfig returned from remoteFeatureFlagControllerState but you should use bridgeConfigV2 instead\n // Mobile's bridgeConfig will be permanently serving the disabled variation, so falling back to it in Mobile will be ok\n const rawMobileFlags =\n remoteFeatureFlagControllerState?.remoteFeatureFlags?.bridgeConfigV2;\n\n // Extension LaunchDarkly will not have the bridgeConfigV2 field, so we'll continue to use bridgeConfig\n const rawBridgeConfig =\n remoteFeatureFlagControllerState?.remoteFeatureFlags?.bridgeConfig;\n\n return processFeatureFlags(rawMobileFlags || rawBridgeConfig);\n}\n\n/**\n * Checks if the client version is greater than or equal to the minimum required version\n *\n * @param clientVersion - The client version\n * @param minRequiredVersion - The minimum required version\n * @returns True if the client version is greater than or equal to the minimum required version, false otherwise\n */\nexport const hasMinimumRequiredVersion = (\n clientVersion: string,\n minRequiredVersion: string,\n) => {\n const [clientMajor, clientMinor, clientPatch] = clientVersion\n .split('.')\n .map(Number);\n const [minRequiredMajor, minRequiredMinor, minRequiredPatch] =\n minRequiredVersion.split('.').map(Number);\n\n if (clientMajor > minRequiredMajor) {\n return true;\n }\n if (clientMajor === minRequiredMajor && clientMinor > minRequiredMinor) {\n return true;\n }\n return (\n clientMajor === minRequiredMajor &&\n clientMinor === minRequiredMinor &&\n clientPatch >= minRequiredPatch\n );\n};\n"]}
@@ -3,11 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.fetchBatchSellTrades = exports.formatBatchSellTradesRequest = exports.fetchBridgeQuoteStream = exports.fetchAssetPrices = exports.fetchBridgeQuotes = exports.fetchBridgeTokens = exports.getClientHeaders = void 0;
4
4
  /* eslint-disable @typescript-eslint/explicit-function-return-type */
5
5
  const superstruct_1 = require("@metamask/superstruct");
6
+ const batch_sell_1 = require("../validators/batch-sell.cjs");
7
+ const bridge_asset_1 = require("../validators/bridge-asset.cjs");
8
+ const quote_response_v1_1 = require("../validators/quote-response-v1.cjs");
9
+ const quote_stream_complete_1 = require("../validators/quote-stream-complete.cjs");
10
+ const token_feature_1 = require("../validators/token-feature.cjs");
11
+ const trade_1 = require("../validators/trade.cjs");
6
12
  const bridge_1 = require("./bridge.cjs");
7
13
  const caip_formatters_1 = require("./caip-formatters.cjs");
8
14
  const fetch_server_events_1 = require("./fetch-server-events.cjs");
9
- const trade_utils_1 = require("./trade-utils.cjs");
10
- const validators_1 = require("./validators.cjs");
15
+ const struct_error_1 = require("./struct-error.cjs");
11
16
  const getClientHeaders = ({ clientId, clientVersion, jwt, }) => ({
12
17
  'X-Client-Id': clientId,
13
18
  ...(jwt ? { Authorization: `Bearer ${jwt}` } : {}),
@@ -37,7 +42,7 @@ async function fetchBridgeTokens(chainId, clientId, jwt, fetchFn, bridgeApiBaseU
37
42
  });
38
43
  const transformedTokens = {};
39
44
  tokens.forEach((token) => {
40
- if ((0, validators_1.validateSwapsTokenObject)(token)) {
45
+ if ((0, bridge_asset_1.validateBridgeAsset)(token)) {
41
46
  transformedTokens[token.address] = token;
42
47
  }
43
48
  });
@@ -118,7 +123,7 @@ async function fetchBridgeQuotes(request, signal, clientId, jwt, fetchFn, bridge
118
123
  const filteredQuotes = quotes
119
124
  .filter((quoteResponse) => {
120
125
  try {
121
- return (0, validators_1.validateQuoteResponseV1)(quoteResponse);
126
+ return (0, quote_response_v1_1.validateQuoteResponseV1)(quoteResponse);
122
127
  }
123
128
  catch (error) {
124
129
  if (error instanceof superstruct_1.StructError) {
@@ -140,7 +145,7 @@ async function fetchBridgeQuotes(request, signal, clientId, jwt, fetchFn, bridge
140
145
  featureId: featureId ?? undefined,
141
146
  // Append the reset approval data to the quote response if the request
142
147
  // has resetApproval set to true and the quote has an approval
143
- resetApproval: request.resetApproval && quote.approval && (0, trade_utils_1.isEvmTxData)(quote.approval)
148
+ resetApproval: request.resetApproval && quote.approval && (0, trade_1.isEvmTxData)(quote.approval)
144
149
  ? {
145
150
  ...quote.approval,
146
151
  data: (0, bridge_1.getEthUsdtResetData)(request.destChainId),
@@ -250,7 +255,7 @@ async function fetchBridgeQuoteStream(fetchFn, quoteRequests, signal, featureId,
250
255
  const onQuoteReceived = async (quoteResponse) => {
251
256
  const uniqueValidationFailures = new Set([]);
252
257
  try {
253
- if ((0, validators_1.validateQuoteResponseV1)(quoteResponse)) {
258
+ if ((0, quote_response_v1_1.validateQuoteResponseV1)(quoteResponse)) {
254
259
  // Fallback to 0 if the quote doesn't match any requests
255
260
  const matchedQuoteRequestIdx = Math.max(quoteRequestIds?.findIndex((id) => {
256
261
  return id === getQuoteResponseId(quoteResponse.quote);
@@ -262,7 +267,7 @@ async function fetchBridgeQuoteStream(fetchFn, quoteRequests, signal, featureId,
262
267
  // Append the reset approval data to the quote response if the request has resetApproval set to true and the quote has an approval
263
268
  resetApproval: matchingQuoteRequest.resetApproval &&
264
269
  quoteResponse.approval &&
265
- (0, trade_utils_1.isEvmTxData)(quoteResponse.approval)
270
+ (0, trade_1.isEvmTxData)(quoteResponse.approval)
266
271
  ? {
267
272
  ...quoteResponse.approval,
268
273
  data: (0, bridge_1.getEthUsdtResetData)(matchingQuoteRequest.destChainId),
@@ -276,6 +281,7 @@ async function fetchBridgeQuoteStream(fetchFn, quoteRequests, signal, featureId,
276
281
  }
277
282
  catch (error) {
278
283
  if (error instanceof superstruct_1.StructError) {
284
+ console.warn('Quote validation failed', (0, struct_error_1.formatStructErrors)(error));
279
285
  error.failures().forEach(({ branch, path }) => {
280
286
  const aggregatorId = branch?.[0]?.quote?.bridgeId ??
281
287
  branch?.[0]?.quote?.bridges?.[0] ??
@@ -288,7 +294,6 @@ async function fetchBridgeQuoteStream(fetchFn, quoteRequests, signal, featureId,
288
294
  }
289
295
  const validationFailures = Array.from(uniqueValidationFailures);
290
296
  if (uniqueValidationFailures.size > 0) {
291
- console.warn('Quote validation failed', validationFailures);
292
297
  return serverEventHandlers.onQuoteValidationFailure(validationFailures);
293
298
  }
294
299
  // Rethrow any unexpected errors
@@ -298,7 +303,7 @@ async function fetchBridgeQuoteStream(fetchFn, quoteRequests, signal, featureId,
298
303
  };
299
304
  const onTokenWarningReceived = (data) => {
300
305
  try {
301
- if ((0, validators_1.validateTokenFeature)(data)) {
306
+ if ((0, token_feature_1.validateTokenFeature)(data)) {
302
307
  serverEventHandlers.onTokenWarning(data);
303
308
  }
304
309
  }
@@ -308,7 +313,7 @@ async function fetchBridgeQuoteStream(fetchFn, quoteRequests, signal, featureId,
308
313
  };
309
314
  const onCompleteReceived = (data) => {
310
315
  try {
311
- if ((0, validators_1.validateQuoteStreamComplete)(data)) {
316
+ if ((0, quote_stream_complete_1.validateQuoteStreamComplete)(data)) {
312
317
  serverEventHandlers.onComplete(data);
313
318
  }
314
319
  }
@@ -411,7 +416,7 @@ async function fetchBatchSellTrades(quotes, stxEnabled, signal, clientId, jwt, f
411
416
  }
412
417
  try {
413
418
  const data = await batchSellTradesResponse.json();
414
- (0, validators_1.validateBatchSellTradesResponse)(data);
419
+ (0, batch_sell_1.validateBatchSellTradesResponse)(data);
415
420
  return data;
416
421
  }
417
422
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.cjs","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 QuoteResponseV1,\n FetchFunction,\n GenericQuoteRequest,\n QuoteRequest,\n BridgeAsset,\n TokenFeature,\n QuoteStreamCompleteData,\n BatchSellTradesRequest,\n BatchSellTradesResponse,\n FeatureId,\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 {\n validateQuoteResponseV1,\n validateSwapsTokenObject,\n validateTokenFeature,\n validateQuoteStreamComplete,\n validateBatchSellTradesResponse,\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: QuoteResponseV1[];\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 QuoteResponseV1 => {\n try {\n return validateQuoteResponseV1(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 QuoteResponseV1)?.quote?.bridgeId ??\n (quoteResponse as QuoteResponseV1)?.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 unknown 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}: QuoteResponseV1['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 featureId - The {@link FeatureId} for the experience that's requesting the quotes\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 featureId: FeatureId,\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: QuoteResponseV1) => 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 (validateQuoteResponseV1(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 featureId,\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 QuoteResponseV1)?.quote?.bridgeId ??\n ((quoteResponse as QuoteResponseV1)?.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\nexport const formatBatchSellTradesRequest = (\n quotes: (QuoteResponseV1 | null)[],\n stxEnabled: boolean,\n): BatchSellTradesRequest => ({\n quotes: quotes\n .filter((quote): quote is QuoteResponseV1 => quote !== null)\n .map(\n ({\n trade,\n approval,\n quote,\n estimatedProcessingTimeInSeconds,\n quoteId,\n }) => ({\n trade,\n approval,\n quote,\n estimatedProcessingTimeInSeconds,\n quoteId,\n }),\n ),\n stxEnabled,\n});\n\n/**\n * Fetches quotes from the bridge-api's getQuote endpoint\n *\n * @param quotes - The quotes to fetch the gasless transaction data and fees for. May contain null values if a quote is not available for a swap\n * @param stxEnabled - Flag to estimate gas cost more precisely for the batch sell feature.\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 clientVersion - The client version for metrics (optional)\n * @returns The batch sell trades and the total network fee\n */\nexport async function fetchBatchSellTrades(\n quotes: (QuoteResponseV1 | null)[],\n stxEnabled: boolean,\n signal: AbortSignal | null,\n clientId: string,\n jwt: string | undefined,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n clientVersion?: string,\n): Promise<BatchSellTradesResponse> {\n const url = `${bridgeApiBaseUrl}/obtainGaslessBatch`;\n const request: BatchSellTradesRequest = formatBatchSellTradesRequest(\n quotes,\n stxEnabled,\n );\n const batchSellTradesResponse = await fetchFn(url, {\n headers: {\n ...getClientHeaders({\n clientId,\n clientVersion,\n jwt,\n }),\n 'Content-Type': 'application/json',\n },\n signal,\n method: 'POST',\n body: JSON.stringify(request),\n });\n\n if (!batchSellTradesResponse.ok) {\n throw new Error(\n `Failed to fetch batch sell trades. ${batchSellTradesResponse.statusText}`,\n );\n }\n\n try {\n const data = await batchSellTradesResponse.json();\n validateBatchSellTradesResponse(data);\n return data;\n } catch (error: unknown) {\n // TODO validation failure event\n throw new Error(`Invalid batch simulation response. ${error?.toString()}`);\n }\n}\n"]}
1
+ {"version":3,"file":"fetch.cjs","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 FetchFunction,\n GenericQuoteRequest,\n QuoteRequest,\n BridgeAsset,\n TokenFeature,\n QuoteStreamCompleteData,\n BatchSellTradesRequest,\n BatchSellTradesResponse,\n} from '../types';\nimport { validateBatchSellTradesResponse } from '../validators/batch-sell';\nimport { validateBridgeAsset } from '../validators/bridge-asset';\nimport type { FeatureId } from '../validators/feature-flags';\nimport type { QuoteResponseV1 } from '../validators/quote-response-v1';\nimport { validateQuoteResponseV1 } from '../validators/quote-response-v1';\nimport { validateQuoteStreamComplete } from '../validators/quote-stream-complete';\nimport { validateTokenFeature } from '../validators/token-feature';\nimport { isEvmTxData } from '../validators/trade';\nimport { getEthUsdtResetData } from './bridge';\nimport {\n formatAddressToAssetId,\n formatAddressToCaipReference,\n formatChainIdToDec,\n} from './caip-formatters';\nimport { fetchServerEvents } from './fetch-server-events';\nimport { formatStructErrors } from './struct-error';\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 (validateBridgeAsset(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: QuoteResponseV1[];\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 QuoteResponseV1 => {\n try {\n return validateQuoteResponseV1(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 QuoteResponseV1)?.quote?.bridgeId ??\n (quoteResponse as QuoteResponseV1)?.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 unknown 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}: QuoteResponseV1['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 featureId - The {@link FeatureId} for the experience that's requesting the quotes\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 featureId: FeatureId,\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: QuoteResponseV1) => 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 (validateQuoteResponseV1(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 featureId,\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 console.warn('Quote validation failed', formatStructErrors(error));\n error.failures().forEach(({ branch, path }) => {\n const aggregatorId =\n branch?.[0]?.quote?.bridgeId ??\n branch?.[0]?.quote?.bridges?.[0] ??\n (quoteResponse as QuoteResponseV1)?.quote?.bridgeId ??\n ((quoteResponse as QuoteResponseV1)?.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 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\nexport const formatBatchSellTradesRequest = (\n quotes: (QuoteResponseV1 | null)[],\n stxEnabled: boolean,\n): BatchSellTradesRequest => ({\n quotes: quotes\n .filter((quote): quote is QuoteResponseV1 => quote !== null)\n .map(\n ({\n trade,\n approval,\n quote,\n estimatedProcessingTimeInSeconds,\n quoteId,\n }) => ({\n trade,\n approval,\n quote,\n estimatedProcessingTimeInSeconds,\n quoteId,\n }),\n ),\n stxEnabled,\n});\n\n/**\n * Fetches quotes from the bridge-api's getQuote endpoint\n *\n * @param quotes - The quotes to fetch the gasless transaction data and fees for. May contain null values if a quote is not available for a swap\n * @param stxEnabled - Flag to estimate gas cost more precisely for the batch sell feature.\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 clientVersion - The client version for metrics (optional)\n * @returns The batch sell trades and the total network fee\n */\nexport async function fetchBatchSellTrades(\n quotes: (QuoteResponseV1 | null)[],\n stxEnabled: boolean,\n signal: AbortSignal | null,\n clientId: string,\n jwt: string | undefined,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n clientVersion?: string,\n): Promise<BatchSellTradesResponse> {\n const url = `${bridgeApiBaseUrl}/obtainGaslessBatch`;\n const request: BatchSellTradesRequest = formatBatchSellTradesRequest(\n quotes,\n stxEnabled,\n );\n const batchSellTradesResponse = await fetchFn(url, {\n headers: {\n ...getClientHeaders({\n clientId,\n clientVersion,\n jwt,\n }),\n 'Content-Type': 'application/json',\n },\n signal,\n method: 'POST',\n body: JSON.stringify(request),\n });\n\n if (!batchSellTradesResponse.ok) {\n throw new Error(\n `Failed to fetch batch sell trades. ${batchSellTradesResponse.statusText}`,\n );\n }\n\n try {\n const data = await batchSellTradesResponse.json();\n validateBatchSellTradesResponse(data);\n return data;\n } catch (error: unknown) {\n // TODO validation failure event\n throw new Error(`Invalid batch simulation response. ${error?.toString()}`);\n }\n}\n"]}
@@ -1,5 +1,7 @@
1
1
  import type { CaipAssetType, CaipChainId, Hex } from "@metamask/utils";
2
- import type { QuoteResponseV1, FetchFunction, GenericQuoteRequest, BridgeAsset, TokenFeature, QuoteStreamCompleteData, BatchSellTradesRequest, BatchSellTradesResponse, FeatureId } from "../types.cjs";
2
+ import type { FetchFunction, GenericQuoteRequest, BridgeAsset, TokenFeature, QuoteStreamCompleteData, BatchSellTradesRequest, BatchSellTradesResponse } from "../types.cjs";
3
+ import type { FeatureId } from "../validators/feature-flags.cjs";
4
+ import type { QuoteResponseV1 } from "../validators/quote-response-v1.cjs";
3
5
  export declare const getClientHeaders: ({ clientId, clientVersion, jwt, }: {
4
6
  clientId: string;
5
7
  clientVersion?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.d.cts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetch.d.cts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import type { CaipAssetType, CaipChainId, Hex } from "@metamask/utils";
2
- import type { QuoteResponseV1, FetchFunction, GenericQuoteRequest, BridgeAsset, TokenFeature, QuoteStreamCompleteData, BatchSellTradesRequest, BatchSellTradesResponse, FeatureId } from "../types.mjs";
2
+ import type { FetchFunction, GenericQuoteRequest, BridgeAsset, TokenFeature, QuoteStreamCompleteData, BatchSellTradesRequest, BatchSellTradesResponse } from "../types.mjs";
3
+ import type { FeatureId } from "../validators/feature-flags.mjs";
4
+ import type { QuoteResponseV1 } from "../validators/quote-response-v1.mjs";
3
5
  export declare const getClientHeaders: ({ clientId, clientVersion, jwt, }: {
4
6
  clientId: string;
5
7
  clientVersion?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.d.mts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetch.d.mts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,15 @@
1
1
  /* eslint-disable @typescript-eslint/explicit-function-return-type */
2
2
  import { StructError } from "@metamask/superstruct";
3
+ import { validateBatchSellTradesResponse } from "../validators/batch-sell.mjs";
4
+ import { validateBridgeAsset } from "../validators/bridge-asset.mjs";
5
+ import { validateQuoteResponseV1 } from "../validators/quote-response-v1.mjs";
6
+ import { validateQuoteStreamComplete } from "../validators/quote-stream-complete.mjs";
7
+ import { validateTokenFeature } from "../validators/token-feature.mjs";
8
+ import { isEvmTxData } from "../validators/trade.mjs";
3
9
  import { getEthUsdtResetData } from "./bridge.mjs";
4
10
  import { formatAddressToAssetId, formatAddressToCaipReference, formatChainIdToDec } from "./caip-formatters.mjs";
5
11
  import { fetchServerEvents } from "./fetch-server-events.mjs";
6
- import { isEvmTxData } from "./trade-utils.mjs";
7
- import { validateQuoteResponseV1, validateSwapsTokenObject, validateTokenFeature, validateQuoteStreamComplete, validateBatchSellTradesResponse } from "./validators.mjs";
12
+ import { formatStructErrors } from "./struct-error.mjs";
8
13
  export const getClientHeaders = ({ clientId, clientVersion, jwt, }) => ({
9
14
  'X-Client-Id': clientId,
10
15
  ...(jwt ? { Authorization: `Bearer ${jwt}` } : {}),
@@ -33,7 +38,7 @@ export async function fetchBridgeTokens(chainId, clientId, jwt, fetchFn, bridgeA
33
38
  });
34
39
  const transformedTokens = {};
35
40
  tokens.forEach((token) => {
36
- if (validateSwapsTokenObject(token)) {
41
+ if (validateBridgeAsset(token)) {
37
42
  transformedTokens[token.address] = token;
38
43
  }
39
44
  });
@@ -269,6 +274,7 @@ export async function fetchBridgeQuoteStream(fetchFn, quoteRequests, signal, fea
269
274
  }
270
275
  catch (error) {
271
276
  if (error instanceof StructError) {
277
+ console.warn('Quote validation failed', formatStructErrors(error));
272
278
  error.failures().forEach(({ branch, path }) => {
273
279
  const aggregatorId = branch?.[0]?.quote?.bridgeId ??
274
280
  branch?.[0]?.quote?.bridges?.[0] ??
@@ -281,7 +287,6 @@ export async function fetchBridgeQuoteStream(fetchFn, quoteRequests, signal, fea
281
287
  }
282
288
  const validationFailures = Array.from(uniqueValidationFailures);
283
289
  if (uniqueValidationFailures.size > 0) {
284
- console.warn('Quote validation failed', validationFailures);
285
290
  return serverEventHandlers.onQuoteValidationFailure(validationFailures);
286
291
  }
287
292
  // Rethrow any unexpected errors
@@ -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 QuoteResponseV1,\n FetchFunction,\n GenericQuoteRequest,\n QuoteRequest,\n BridgeAsset,\n TokenFeature,\n QuoteStreamCompleteData,\n BatchSellTradesRequest,\n BatchSellTradesResponse,\n FeatureId,\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 {\n validateQuoteResponseV1,\n validateSwapsTokenObject,\n validateTokenFeature,\n validateQuoteStreamComplete,\n validateBatchSellTradesResponse,\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: QuoteResponseV1[];\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 QuoteResponseV1 => {\n try {\n return validateQuoteResponseV1(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 QuoteResponseV1)?.quote?.bridgeId ??\n (quoteResponse as QuoteResponseV1)?.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 unknown 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}: QuoteResponseV1['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 featureId - The {@link FeatureId} for the experience that's requesting the quotes\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 featureId: FeatureId,\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: QuoteResponseV1) => 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 (validateQuoteResponseV1(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 featureId,\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 QuoteResponseV1)?.quote?.bridgeId ??\n ((quoteResponse as QuoteResponseV1)?.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\nexport const formatBatchSellTradesRequest = (\n quotes: (QuoteResponseV1 | null)[],\n stxEnabled: boolean,\n): BatchSellTradesRequest => ({\n quotes: quotes\n .filter((quote): quote is QuoteResponseV1 => quote !== null)\n .map(\n ({\n trade,\n approval,\n quote,\n estimatedProcessingTimeInSeconds,\n quoteId,\n }) => ({\n trade,\n approval,\n quote,\n estimatedProcessingTimeInSeconds,\n quoteId,\n }),\n ),\n stxEnabled,\n});\n\n/**\n * Fetches quotes from the bridge-api's getQuote endpoint\n *\n * @param quotes - The quotes to fetch the gasless transaction data and fees for. May contain null values if a quote is not available for a swap\n * @param stxEnabled - Flag to estimate gas cost more precisely for the batch sell feature.\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 clientVersion - The client version for metrics (optional)\n * @returns The batch sell trades and the total network fee\n */\nexport async function fetchBatchSellTrades(\n quotes: (QuoteResponseV1 | null)[],\n stxEnabled: boolean,\n signal: AbortSignal | null,\n clientId: string,\n jwt: string | undefined,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n clientVersion?: string,\n): Promise<BatchSellTradesResponse> {\n const url = `${bridgeApiBaseUrl}/obtainGaslessBatch`;\n const request: BatchSellTradesRequest = formatBatchSellTradesRequest(\n quotes,\n stxEnabled,\n );\n const batchSellTradesResponse = await fetchFn(url, {\n headers: {\n ...getClientHeaders({\n clientId,\n clientVersion,\n jwt,\n }),\n 'Content-Type': 'application/json',\n },\n signal,\n method: 'POST',\n body: JSON.stringify(request),\n });\n\n if (!batchSellTradesResponse.ok) {\n throw new Error(\n `Failed to fetch batch sell trades. ${batchSellTradesResponse.statusText}`,\n );\n }\n\n try {\n const data = await batchSellTradesResponse.json();\n validateBatchSellTradesResponse(data);\n return data;\n } catch (error: unknown) {\n // TODO validation failure event\n throw new Error(`Invalid batch simulation response. ${error?.toString()}`);\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 FetchFunction,\n GenericQuoteRequest,\n QuoteRequest,\n BridgeAsset,\n TokenFeature,\n QuoteStreamCompleteData,\n BatchSellTradesRequest,\n BatchSellTradesResponse,\n} from '../types';\nimport { validateBatchSellTradesResponse } from '../validators/batch-sell';\nimport { validateBridgeAsset } from '../validators/bridge-asset';\nimport type { FeatureId } from '../validators/feature-flags';\nimport type { QuoteResponseV1 } from '../validators/quote-response-v1';\nimport { validateQuoteResponseV1 } from '../validators/quote-response-v1';\nimport { validateQuoteStreamComplete } from '../validators/quote-stream-complete';\nimport { validateTokenFeature } from '../validators/token-feature';\nimport { isEvmTxData } from '../validators/trade';\nimport { getEthUsdtResetData } from './bridge';\nimport {\n formatAddressToAssetId,\n formatAddressToCaipReference,\n formatChainIdToDec,\n} from './caip-formatters';\nimport { fetchServerEvents } from './fetch-server-events';\nimport { formatStructErrors } from './struct-error';\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 (validateBridgeAsset(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: QuoteResponseV1[];\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 QuoteResponseV1 => {\n try {\n return validateQuoteResponseV1(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 QuoteResponseV1)?.quote?.bridgeId ??\n (quoteResponse as QuoteResponseV1)?.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 unknown 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}: QuoteResponseV1['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 featureId - The {@link FeatureId} for the experience that's requesting the quotes\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 featureId: FeatureId,\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: QuoteResponseV1) => 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 (validateQuoteResponseV1(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 featureId,\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 console.warn('Quote validation failed', formatStructErrors(error));\n error.failures().forEach(({ branch, path }) => {\n const aggregatorId =\n branch?.[0]?.quote?.bridgeId ??\n branch?.[0]?.quote?.bridges?.[0] ??\n (quoteResponse as QuoteResponseV1)?.quote?.bridgeId ??\n ((quoteResponse as QuoteResponseV1)?.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 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\nexport const formatBatchSellTradesRequest = (\n quotes: (QuoteResponseV1 | null)[],\n stxEnabled: boolean,\n): BatchSellTradesRequest => ({\n quotes: quotes\n .filter((quote): quote is QuoteResponseV1 => quote !== null)\n .map(\n ({\n trade,\n approval,\n quote,\n estimatedProcessingTimeInSeconds,\n quoteId,\n }) => ({\n trade,\n approval,\n quote,\n estimatedProcessingTimeInSeconds,\n quoteId,\n }),\n ),\n stxEnabled,\n});\n\n/**\n * Fetches quotes from the bridge-api's getQuote endpoint\n *\n * @param quotes - The quotes to fetch the gasless transaction data and fees for. May contain null values if a quote is not available for a swap\n * @param stxEnabled - Flag to estimate gas cost more precisely for the batch sell feature.\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 clientVersion - The client version for metrics (optional)\n * @returns The batch sell trades and the total network fee\n */\nexport async function fetchBatchSellTrades(\n quotes: (QuoteResponseV1 | null)[],\n stxEnabled: boolean,\n signal: AbortSignal | null,\n clientId: string,\n jwt: string | undefined,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n clientVersion?: string,\n): Promise<BatchSellTradesResponse> {\n const url = `${bridgeApiBaseUrl}/obtainGaslessBatch`;\n const request: BatchSellTradesRequest = formatBatchSellTradesRequest(\n quotes,\n stxEnabled,\n );\n const batchSellTradesResponse = await fetchFn(url, {\n headers: {\n ...getClientHeaders({\n clientId,\n clientVersion,\n jwt,\n }),\n 'Content-Type': 'application/json',\n },\n signal,\n method: 'POST',\n body: JSON.stringify(request),\n });\n\n if (!batchSellTradesResponse.ok) {\n throw new Error(\n `Failed to fetch batch sell trades. ${batchSellTradesResponse.statusText}`,\n );\n }\n\n try {\n const data = await batchSellTradesResponse.json();\n validateBatchSellTradesResponse(data);\n return data;\n } catch (error: unknown) {\n // TODO validation failure event\n throw new Error(`Invalid batch simulation response. ${error?.toString()}`);\n }\n}\n"]}
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getQuotesReceivedProperties = exports.isCustomSlippage = exports.isHardwareWallet = exports.getAccountHardwareType = exports.getRequestParams = exports.formatProviderLabel = exports.getSwapTypeFromQuote = exports.getSwapType = exports.toInputChangedPropertyValue = exports.toInputChangedPropertyKey = void 0;
4
4
  const bridge_1 = require("../../constants/bridge.cjs");
5
5
  const types_1 = require("../../types.cjs");
6
- const types_2 = require("../../types.cjs");
6
+ const feature_flags_1 = require("../../validators/feature-flags.cjs");
7
7
  const bridge_2 = require("../bridge.cjs");
8
8
  const caip_formatters_1 = require("../caip-formatters.cjs");
9
9
  const constants_1 = require("./constants.cjs");
@@ -123,7 +123,7 @@ const getQuotesReceivedProperties = (activeQuote, warnings = [], isSubmittable =
123
123
  ...(hasSufficientGasForQuote !== undefined && {
124
124
  has_sufficient_gas_for_quote: hasSufficientGasForQuote,
125
125
  }),
126
- feature_id: activeQuote?.featureId ?? types_2.FeatureId.UNIFIED_SWAP_BRIDGE,
126
+ feature_id: activeQuote?.featureId ?? feature_flags_1.FeatureId.UNIFIED_SWAP_BRIDGE,
127
127
  };
128
128
  };
129
129
  exports.getQuotesReceivedProperties = getQuotesReceivedProperties;