@metamask-previews/bridge-controller 75.1.1-preview-5e683f2 → 75.2.0-preview-be04faa3e

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 (48) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/dist/bridge-controller-method-action-types.cjs.map +1 -1
  3. package/dist/bridge-controller-method-action-types.d.cts +9 -5
  4. package/dist/bridge-controller-method-action-types.d.cts.map +1 -1
  5. package/dist/bridge-controller-method-action-types.d.mts +9 -5
  6. package/dist/bridge-controller-method-action-types.d.mts.map +1 -1
  7. package/dist/bridge-controller-method-action-types.mjs.map +1 -1
  8. package/dist/bridge-controller.cjs +28 -0
  9. package/dist/bridge-controller.cjs.map +1 -1
  10. package/dist/bridge-controller.d.cts +2 -1
  11. package/dist/bridge-controller.d.cts.map +1 -1
  12. package/dist/bridge-controller.d.mts +2 -1
  13. package/dist/bridge-controller.d.mts.map +1 -1
  14. package/dist/bridge-controller.mjs +28 -0
  15. package/dist/bridge-controller.mjs.map +1 -1
  16. package/dist/constants/bridge.cjs +1 -0
  17. package/dist/constants/bridge.cjs.map +1 -1
  18. package/dist/constants/bridge.d.cts.map +1 -1
  19. package/dist/constants/bridge.d.mts.map +1 -1
  20. package/dist/constants/bridge.mjs +1 -0
  21. package/dist/constants/bridge.mjs.map +1 -1
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.cts +3 -3
  24. package/dist/index.d.cts.map +1 -1
  25. package/dist/index.d.mts +3 -3
  26. package/dist/index.d.mts.map +1 -1
  27. package/dist/index.mjs.map +1 -1
  28. package/dist/types.cjs.map +1 -1
  29. package/dist/types.d.cts +7 -0
  30. package/dist/types.d.cts.map +1 -1
  31. package/dist/types.d.mts +7 -0
  32. package/dist/types.d.mts.map +1 -1
  33. package/dist/types.mjs.map +1 -1
  34. package/dist/utils/metrics/constants.cjs +1 -0
  35. package/dist/utils/metrics/constants.cjs.map +1 -1
  36. package/dist/utils/metrics/constants.d.cts +1 -0
  37. package/dist/utils/metrics/constants.d.cts.map +1 -1
  38. package/dist/utils/metrics/constants.d.mts +1 -0
  39. package/dist/utils/metrics/constants.d.mts.map +1 -1
  40. package/dist/utils/metrics/constants.mjs +1 -0
  41. package/dist/utils/metrics/constants.mjs.map +1 -1
  42. package/dist/utils/metrics/types.cjs.map +1 -1
  43. package/dist/utils/metrics/types.d.cts +19 -9
  44. package/dist/utils/metrics/types.d.cts.map +1 -1
  45. package/dist/utils/metrics/types.d.mts +19 -9
  46. package/dist/utils/metrics/types.d.mts.map +1 -1
  47. package/dist/utils/metrics/types.mjs.map +1 -1
  48. package/package.json +1 -1
@@ -3,7 +3,7 @@ import type { TransactionController } from "@metamask/transaction-controller";
3
3
  import type { BridgeClientId } from "./constants/bridge.cjs";
4
4
  import { BRIDGE_CONTROLLER_NAME } from "./constants/bridge.cjs";
5
5
  import { FeatureId } from "./types.cjs";
6
- import type { L1GasFees, GenericQuoteRequest, NonEvmFees, QuoteResponseV1, BridgeControllerState, BridgeControllerMessenger, FetchFunction } from "./types.cjs";
6
+ import type { L1GasFees, GenericQuoteRequest, NonEvmFees, QuoteResponseV1, BridgeControllerState, BridgeControllerMessenger, FetchFunction, InputPrimaryDenomination } from "./types.cjs";
7
7
  import { AbortReason, MetaMetricsSwapsEventSource, UnifiedSwapBridgeEventName } from "./utils/metrics/constants.cjs";
8
8
  import type { RequiredEventContextFromClient } from "./utils/metrics/types.cjs";
9
9
  import type { CrossChainSwapsEventProperties } from "./utils/metrics/types.cjs";
@@ -95,6 +95,7 @@ export declare class BridgeController extends BridgeController_base<typeof BRIDG
95
95
  * @param location - The entry point from which the user initiated the flow
96
96
  */
97
97
  setLocation: (location: MetaMetricsSwapsEventSource) => void;
98
+ setInputPrimaryDenomination: (inputPrimaryDenomination: InputPrimaryDenomination) => void;
98
99
  resetState: (reason?: AbortReason, quoteRequestIndex?: number | null, context?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived]) => void;
99
100
  /**
100
101
  * Sets the interval length based on the source chain
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-controller.d.cts","sourceRoot":"","sources":["../src/bridge-controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bridge-controller.d.cts","sourceRoot":"","sources":["../src/bridge-controller.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import type { TransactionController } from "@metamask/transaction-controller";
3
3
  import type { BridgeClientId } from "./constants/bridge.mjs";
4
4
  import { BRIDGE_CONTROLLER_NAME } from "./constants/bridge.mjs";
5
5
  import { FeatureId } from "./types.mjs";
6
- import type { L1GasFees, GenericQuoteRequest, NonEvmFees, QuoteResponseV1, BridgeControllerState, BridgeControllerMessenger, FetchFunction } from "./types.mjs";
6
+ import type { L1GasFees, GenericQuoteRequest, NonEvmFees, QuoteResponseV1, BridgeControllerState, BridgeControllerMessenger, FetchFunction, InputPrimaryDenomination } from "./types.mjs";
7
7
  import { AbortReason, MetaMetricsSwapsEventSource, UnifiedSwapBridgeEventName } from "./utils/metrics/constants.mjs";
8
8
  import type { RequiredEventContextFromClient } from "./utils/metrics/types.mjs";
9
9
  import type { CrossChainSwapsEventProperties } from "./utils/metrics/types.mjs";
@@ -95,6 +95,7 @@ export declare class BridgeController extends BridgeController_base<typeof BRIDG
95
95
  * @param location - The entry point from which the user initiated the flow
96
96
  */
97
97
  setLocation: (location: MetaMetricsSwapsEventSource) => void;
98
+ setInputPrimaryDenomination: (inputPrimaryDenomination: InputPrimaryDenomination) => void;
98
99
  resetState: (reason?: AbortReason, quoteRequestIndex?: number | null, context?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived]) => void;
99
100
  /**
100
101
  * Sets the interval length based on the source chain
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-controller.d.mts","sourceRoot":"","sources":["../src/bridge-controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bridge-controller.d.mts","sourceRoot":"","sources":["../src/bridge-controller.ts"],"names":[],"mappings":"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"}
@@ -100,6 +100,12 @@ const metadata = {
100
100
  includeInDebugSnapshot: false,
101
101
  usedInUi: true,
102
102
  },
103
+ inputPrimaryDenomination: {
104
+ includeInStateLogs: true,
105
+ persist: true,
106
+ includeInDebugSnapshot: false,
107
+ usedInUi: true,
108
+ },
103
109
  quoteStreamComplete: {
104
110
  includeInStateLogs: true,
105
111
  persist: false,
@@ -125,6 +131,7 @@ const MESSENGER_EXPOSED_METHODS = [
125
131
  'updateBatchSellTrades',
126
132
  'stopPollingForQuotes',
127
133
  'setLocation',
134
+ 'setInputPrimaryDenomination',
128
135
  'resetState',
129
136
  'setChainIntervalLength',
130
137
  'trackUnifiedSwapBridgeEvent',
@@ -435,6 +442,11 @@ export class BridgeController extends StaticIntervalPollingController() {
435
442
  this.setLocation = (location) => {
436
443
  __classPrivateFieldSet(this, _BridgeController_location, location, "f");
437
444
  };
445
+ this.setInputPrimaryDenomination = (inputPrimaryDenomination) => {
446
+ this.update((state) => {
447
+ state.inputPrimaryDenomination = inputPrimaryDenomination;
448
+ });
449
+ };
438
450
  this.resetState = (reason = AbortReason.ResetState, quoteRequestIndex = null, context) => {
439
451
  this.stopPollingForQuotes(reason, context);
440
452
  this.update((state) => {
@@ -730,6 +742,9 @@ export class BridgeController extends StaticIntervalPollingController() {
730
742
  location: clientProps?.location ?? __classPrivateFieldGet(this, _BridgeController_location, "f"),
731
743
  action_type: MetricsActionType.SWAPBRIDGE_V1,
732
744
  };
745
+ const inputPrimaryDenominationProperties = {
746
+ input_primary_denomination: this.state.inputPrimaryDenomination,
747
+ };
733
748
  const quoteRequest = this.state.quoteRequest[quoteRequestIndex];
734
749
  switch (eventName) {
735
750
  case UnifiedSwapBridgeEventName.ButtonClicked:
@@ -741,6 +756,13 @@ export class BridgeController extends StaticIntervalPollingController() {
741
756
  return {
742
757
  ...getRequestParams(quoteRequest, this.state.tokenSecurityTypeDestination),
743
758
  ...__classPrivateFieldGet(this, _BridgeController_getRequestMetadata, "f").call(this),
759
+ ...inputPrimaryDenominationProperties,
760
+ ...baseProperties,
761
+ };
762
+ case UnifiedSwapBridgeEventName.FiatCryptoToggleClicked:
763
+ return {
764
+ ...getRequestParams(quoteRequest, this.state.tokenSecurityTypeDestination),
765
+ swap_type: getSwapTypeFromQuote(quoteRequest),
744
766
  ...baseProperties,
745
767
  };
746
768
  case UnifiedSwapBridgeEventName.QuotesValidationFailed:
@@ -755,6 +777,7 @@ export class BridgeController extends StaticIntervalPollingController() {
755
777
  ...__classPrivateFieldGet(this, _BridgeController_getRequestMetadata, "f").call(this),
756
778
  ...__classPrivateFieldGet(this, _BridgeController_getQuoteFetchData, "f").call(this),
757
779
  refresh_count: this.state.quotesRefreshCount,
780
+ ...inputPrimaryDenominationProperties,
758
781
  ...baseProperties,
759
782
  };
760
783
  case UnifiedSwapBridgeEventName.QuotesRequested:
@@ -762,6 +785,7 @@ export class BridgeController extends StaticIntervalPollingController() {
762
785
  ...getRequestParams(quoteRequest, this.state.tokenSecurityTypeDestination),
763
786
  ...__classPrivateFieldGet(this, _BridgeController_getRequestMetadata, "f").call(this),
764
787
  has_sufficient_funds: !quoteRequest.insufficientBal,
788
+ ...inputPrimaryDenominationProperties,
765
789
  ...baseProperties,
766
790
  };
767
791
  case UnifiedSwapBridgeEventName.QuotesError:
@@ -808,6 +832,10 @@ export class BridgeController extends StaticIntervalPollingController() {
808
832
  case UnifiedSwapBridgeEventName.Completed:
809
833
  return propertiesFromClient;
810
834
  case UnifiedSwapBridgeEventName.InputChanged:
835
+ return {
836
+ ...inputPrimaryDenominationProperties,
837
+ ...baseProperties,
838
+ };
811
839
  default:
812
840
  return baseProperties;
813
841
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-controller.mjs","sourceRoot":"","sources":["../src/bridge-controller.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { BigNumber } from '@ethersproject/bignumber';\nimport { Contract } from '@ethersproject/contracts';\nimport { Web3Provider } from '@ethersproject/providers';\nimport type { StateMetadata } from '@metamask/base-controller';\nimport type { TraceCallback } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { abiERC20 } from '@metamask/metamask-eth-abis';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type { TransactionController } from '@metamask/transaction-controller';\nimport type { CaipAssetType, Hex } from '@metamask/utils';\n\nimport type { BridgeClientId } from './constants/bridge';\nimport {\n BRIDGE_CONTROLLER_NAME,\n BRIDGE_PROD_API_BASE_URL,\n DEFAULT_BRIDGE_CONTROLLER_STATE,\n METABRIDGE_ETHEREUM_ADDRESS,\n REFRESH_INTERVAL_MS,\n} from './constants/bridge';\nimport { CHAIN_IDS } from './constants/chains';\nimport { SWAPS_CONTRACT_ADDRESSES } from './constants/swaps';\nimport { TraceName } from './constants/traces';\nimport {\n ExchangeRateSourcesForLookup,\n selectIsAssetExchangeRateInState,\n} from './selectors';\nimport { FeatureId, RequestStatus } from './types';\nimport type {\n L1GasFees,\n GenericQuoteRequest,\n NonEvmFees,\n QuoteRequest,\n QuoteResponseV1,\n BridgeControllerState,\n BridgeControllerMessenger,\n FetchFunction,\n} from './types';\nimport { getAssetIdsForToken, toExchangeRates } from './utils/assets';\nimport { hasSufficientBalance } from './utils/balance';\nimport {\n getDefaultBridgeControllerState,\n isCrossChain,\n isEthUsdt,\n isNonEvmChainId,\n isSolanaChainId,\n} from './utils/bridge';\nimport {\n formatAddressToCaipReference,\n formatChainIdToCaip,\n formatChainIdToHex,\n} from './utils/caip-formatters';\nimport {\n getBridgeFeatureFlags,\n hasMinimumRequiredVersion,\n} from './utils/feature-flags';\nimport {\n fetchAssetPrices,\n fetchBridgeQuotes,\n fetchBridgeQuoteStream,\n fetchBatchSellTrades,\n} from './utils/fetch';\nimport {\n AbortReason,\n MetaMetricsSwapsEventSource,\n MetricsActionType,\n UnifiedSwapBridgeEventName,\n} from './utils/metrics/constants';\nimport {\n formatProviderLabel,\n getAccountHardwareType,\n getRequestParams,\n getSwapTypeFromQuote,\n isCustomSlippage,\n toInputChangedPropertyKey,\n toInputChangedPropertyValue,\n} from './utils/metrics/properties';\nimport type {\n QuoteFetchData,\n RequestMetadata,\n RequiredEventContextFromClient,\n} from './utils/metrics/types';\nimport type { CrossChainSwapsEventProperties } from './utils/metrics/types';\nimport {\n isValidQuoteRequest,\n isValidBatchSellQuoteRequest,\n sortQuotes,\n} from './utils/quote';\nimport { appendFeesToQuotes } from './utils/quote-fees';\nimport { getMinimumBalanceForRentExemptionInLamports } from './utils/snaps';\n\nconst metadata: StateMetadata<BridgeControllerState> = {\n quoteRequest: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n quotes: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n quotesInitialLoadTime: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n quotesLastFetched: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n quotesLoadingStatus: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n quoteFetchError: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n quotesRefreshCount: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n assetExchangeRates: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n minimumBalanceForRentExemptionInLamports: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n tokenWarnings: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n tokenSecurityTypeDestination: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n quoteStreamComplete: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n batchSellTrades: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n batchSellTradesLoadingStatus: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\n/**\n * The input to start polling for the {@link BridgeController}\n *\n * @param updatedQuoteRequest - The updated quote request\n * @param context - The context contains properties that can't be populated by the\n * controller and need to be provided by the client for analytics\n */\ntype BridgePollingInput = {\n quoteRequests: GenericQuoteRequest[];\n context: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesError] &\n RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesRequested];\n};\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'updateBridgeQuoteRequestParams',\n 'fetchQuotes',\n 'updateBatchSellTrades',\n 'stopPollingForQuotes',\n 'setLocation',\n 'resetState',\n 'setChainIntervalLength',\n 'trackUnifiedSwapBridgeEvent',\n] as const;\n\nexport class BridgeController extends StaticIntervalPollingController<BridgePollingInput>()<\n typeof BRIDGE_CONTROLLER_NAME,\n BridgeControllerState,\n BridgeControllerMessenger\n> {\n #abortController: AbortController | undefined;\n\n #batchSellTradesAbortController: AbortController | undefined;\n\n #quotesFirstFetched: number | undefined;\n\n /**\n * Stores the location/entry point from which the user initiated the swap or bridge flow.\n * Set via setLocation() before navigating to the swap/bridge flow.\n * Used as default for all subsequent internal events.\n */\n #location: MetaMetricsSwapsEventSource = MetaMetricsSwapsEventSource.MainView;\n\n readonly #clientId: BridgeClientId;\n\n readonly #clientVersion: string;\n\n readonly #getLayer1GasFee: typeof TransactionController.prototype.getLayer1GasFee;\n\n readonly #fetchFn: FetchFunction;\n\n readonly #trackMetaMetricsFn: <\n EventName extends\n (typeof UnifiedSwapBridgeEventName)[keyof typeof UnifiedSwapBridgeEventName],\n >(\n eventName: EventName,\n properties: CrossChainSwapsEventProperties<EventName>,\n ) => void;\n\n readonly #trace: TraceCallback;\n\n readonly #config: {\n customBridgeApiBaseUrl?: string;\n };\n\n /**\n * Returns whether to use AssetsController for exchange rates.\n * Set via constructor option getUseAssetsControllerForRates; defaults to false.\n *\n * @returns True when exchange rates should be read from AssetsController:getExchangeRatesForBridge.\n */\n readonly #getUseAssetsControllerForRates: () => boolean;\n\n constructor({\n messenger,\n state,\n clientId,\n clientVersion,\n getLayer1GasFee,\n fetchFn,\n config,\n trackMetaMetricsFn,\n traceFn,\n getUseAssetsControllerForRates,\n }: {\n messenger: BridgeControllerMessenger;\n state?: Partial<BridgeControllerState>;\n clientId: BridgeClientId;\n clientVersion: string;\n getLayer1GasFee: typeof TransactionController.prototype.getLayer1GasFee;\n fetchFn: FetchFunction;\n config?: {\n customBridgeApiBaseUrl?: string;\n };\n trackMetaMetricsFn: <\n EventName extends\n (typeof UnifiedSwapBridgeEventName)[keyof typeof UnifiedSwapBridgeEventName],\n >(\n eventName: EventName,\n properties: CrossChainSwapsEventProperties<EventName>,\n ) => void;\n traceFn?: TraceCallback;\n /**\n * When provided, called to determine whether to use AssetsController for exchange rates.\n * When true, rates are read from AssetsController:getExchangeRatesForBridge instead of\n * MultichainAssetsRatesController, TokenRatesController, and CurrencyRateController.\n */\n getUseAssetsControllerForRates?: () => boolean;\n }) {\n super({\n name: BRIDGE_CONTROLLER_NAME,\n metadata,\n messenger,\n state: {\n ...getDefaultBridgeControllerState(),\n ...state,\n },\n });\n\n this.setIntervalLength(REFRESH_INTERVAL_MS);\n\n this.#abortController = new AbortController();\n this.#getLayer1GasFee = getLayer1GasFee;\n this.#clientId = clientId;\n this.#clientVersion = clientVersion;\n this.#fetchFn = fetchFn;\n this.#trackMetaMetricsFn = trackMetaMetricsFn;\n this.#config = config ?? {};\n this.#trace = traceFn ?? (((_request, fn) => fn?.()) as TraceCallback);\n this.#getUseAssetsControllerForRates =\n getUseAssetsControllerForRates ?? (() => false);\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n _executePoll = async (pollingInput: BridgePollingInput) => {\n await this.#fetchBridgeQuotes(pollingInput);\n };\n\n /**\n * Updates the quote request at the specified index with the given parameters, then starts\n * polling for quotes.\n *\n * @param paramsToUpdate - The parameters to update in the quote request at the specified index\n * @param context - metrics context\n * @param quoteRequestIndex - The index of the quote request to update\n * @param quoteRequestCount - The number of quote requests in the UI\n */\n updateBridgeQuoteRequestParams = async (\n paramsToUpdate: Partial<GenericQuoteRequest> & {\n walletAddress: GenericQuoteRequest['walletAddress'];\n },\n context: BridgePollingInput['context'],\n quoteRequestIndex: number = 0,\n quoteRequestCount: number = 1,\n ) => {\n // Guard against updating a quote request that doesn't exist\n if (quoteRequestIndex >= quoteRequestCount) {\n return;\n }\n this.#trackInputChangedEvents(\n paramsToUpdate,\n context.feature_id,\n quoteRequestIndex,\n );\n this.resetState(AbortReason.QuoteRequestUpdated, quoteRequestIndex);\n this.update((state) => {\n // Update only the specified quote request and keep the rest of the quote requests unchanged\n state.quoteRequest = state.quoteRequest\n .slice(0, quoteRequestIndex)\n .concat({\n ...DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest[0],\n ...paramsToUpdate,\n })\n .concat(\n state.quoteRequest.slice(quoteRequestIndex + 1, quoteRequestCount),\n );\n state.tokenSecurityTypeDestination =\n context.token_security_type_destination ?? null;\n });\n\n // BatchSell and Unified swaps both use the same polling logic so both validations should pass\n if (\n isValidQuoteRequest(paramsToUpdate) &&\n isValidBatchSellQuoteRequest(this.state.quoteRequest)\n ) {\n this.#quotesFirstFetched = Date.now();\n // Update the insufficientBal and resetApproval params for the quote request\n const quoteWithInsufficientBalAndResetApproval =\n await this.#appendInsufficientBalAndResetApproval(paramsToUpdate);\n this.update((state) => {\n state.quoteRequest[quoteRequestIndex] =\n quoteWithInsufficientBalAndResetApproval;\n });\n\n // Set refresh rate based on the source chain before starting polling\n this.setChainIntervalLength();\n this.startPolling({\n quoteRequests: this.state.quoteRequest,\n context,\n });\n }\n };\n\n /**\n * Fetches quotes for specified request without updating the controller state\n * This method does not start polling for quotes and does not emit UnifiedSwapBridge events\n *\n * @param quoteRequest - The parameters for quote requests to fetch\n * @param featureId - The feature ID that maps to quoteParam overrides from LD\n * @param abortSignal - The abort signal to cancel all the requests\n * @returns A list of validated quotes\n */\n fetchQuotes = async (\n quoteRequest: GenericQuoteRequest,\n featureId: FeatureId,\n abortSignal: AbortSignal | null = null,\n ): Promise<(QuoteResponseV1 & L1GasFees & NonEvmFees)[]> => {\n const bridgeFeatureFlags = getBridgeFeatureFlags(this.messenger);\n const jwt = await this.#getJwt();\n // If featureId is specified, retrieve the quoteRequestOverrides for that featureId\n const quoteRequestOverrides = featureId\n ? bridgeFeatureFlags.quoteRequestOverrides?.[featureId]\n : undefined;\n const resetApproval = await this.#shouldResetApproval(quoteRequest);\n\n // If quoteRequestOverrides is specified, merge it with the quoteRequest\n const { quotes: baseQuotes, validationFailures } = await fetchBridgeQuotes(\n quoteRequestOverrides\n ? { ...quoteRequest, ...quoteRequestOverrides, resetApproval }\n : { ...quoteRequest, resetApproval },\n abortSignal,\n this.#clientId,\n jwt,\n this.#fetchFn,\n this.#config.customBridgeApiBaseUrl ?? BRIDGE_PROD_API_BASE_URL,\n featureId,\n this.#clientVersion,\n );\n\n this.#trackQuoteValidationFailures(validationFailures, featureId);\n\n const quotesWithFees = await appendFeesToQuotes(\n baseQuotes,\n this.messenger,\n this.#getLayer1GasFee,\n this.#getMultichainSelectedAccount(quoteRequest.walletAddress),\n );\n\n return sortQuotes(quotesWithFees, featureId);\n };\n\n /**\n * Fetches gasless transaction data and fees for BatchSell quotes.\n * To use this in the clients, add a listener for the recommendedQuotes and call\n * this handler whenever they change.\n *\n * @param quotes - The quotes to fetch the gasless transaction data and fees for\n * @param stxEnabled - Flag to estimate gas cost more precisely for the batch sell feature.\n */\n updateBatchSellTrades = async (\n quotes: (QuoteResponseV1 | null)[],\n stxEnabled: boolean,\n ): Promise<void> => {\n this.#batchSellTradesAbortController?.abort(\n AbortReason.GaslessTxBatchFetched,\n );\n this.#batchSellTradesAbortController = new AbortController();\n\n this.update((state) => {\n // Set loading status again if recommended quotes are re-ordered\n state.batchSellTradesLoadingStatus = RequestStatus.LOADING;\n });\n\n try {\n const batchSellTradesResponse = await fetchBatchSellTrades(\n quotes,\n stxEnabled,\n this.#batchSellTradesAbortController.signal,\n this.#clientId,\n await this.#getJwt(),\n this.#fetchFn,\n this.#config.customBridgeApiBaseUrl ?? BRIDGE_PROD_API_BASE_URL,\n this.#clientVersion,\n );\n\n this.update((state) => {\n state.batchSellTrades = batchSellTradesResponse;\n state.batchSellTradesLoadingStatus = RequestStatus.FETCHED;\n });\n\n // TODO if fee.asset.assetId is not in exchange rates, fetch the exchange rate and update the state\n } catch (error) {\n // Ignore abort errors\n if (\n (error as Error).toString().includes('AbortError') ||\n (error as Error).toString().includes('FetchRequestCanceledException') ||\n [\n AbortReason.ResetState,\n AbortReason.NewQuoteRequest,\n AbortReason.QuoteRequestUpdated,\n AbortReason.TransactionSubmitted,\n AbortReason.GaslessTxBatchFetched,\n ].includes(error as AbortReason)\n ) {\n // Exit the function early to prevent other state updates\n return;\n }\n\n this.update((state) => {\n // Reset the batch sell trades if the fetch fails to avoid showing stale data\n state.batchSellTrades = DEFAULT_BRIDGE_CONTROLLER_STATE.batchSellTrades;\n // Update loading status\n state.batchSellTradesLoadingStatus = RequestStatus.ERROR;\n });\n console.log(`Failed to fetch batch sell trades`, error);\n }\n };\n\n readonly #trackQuoteValidationFailures = (\n validationFailures: string[],\n featureId: FeatureId,\n ) => {\n if (validationFailures.length === 0) {\n return;\n }\n this.trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.QuotesValidationFailed,\n {\n feature_id: featureId,\n failures: validationFailures,\n location: this.#location,\n },\n );\n };\n\n readonly #getExchangeRateSources = (): ExchangeRateSourcesForLookup => {\n if (this.#getUseAssetsControllerForRates()) {\n return {\n ...this.messenger.call('AssetsController:getExchangeRatesForBridge'),\n historicalPrices: {},\n ...this.state,\n };\n }\n return {\n ...this.messenger.call('MultichainAssetsRatesController:getState'),\n ...this.messenger.call('CurrencyRateController:getState'),\n ...this.messenger.call('TokenRatesController:getState'),\n ...this.state,\n };\n };\n\n /**\n * Fetches the exchange rates for the assets in the quote request if they are not already in the state\n * In addition to the selected tokens, this also fetches the native asset for the source and destination chains\n *\n * @param quoteRequests - The quote requests to fetch the exchange rates for\n */\n readonly #fetchAssetExchangeRates = async (\n quoteRequests: GenericQuoteRequest[],\n ) => {\n const exchangeRateSources = this.#getExchangeRateSources();\n\n // Get unique assetIds for all quote requests\n const assetIds = new Set<CaipAssetType>(\n quoteRequests\n .flatMap((quoteRequest) =>\n [\n getAssetIdsForToken(\n quoteRequest.srcTokenAddress,\n quoteRequest.srcChainId,\n ),\n getAssetIdsForToken(\n quoteRequest.destTokenAddress,\n quoteRequest.destChainId,\n ),\n ].flat(),\n )\n .filter(\n (assetId: CaipAssetType | undefined): assetId is CaipAssetType =>\n !selectIsAssetExchangeRateInState(exchangeRateSources, assetId),\n ),\n );\n\n const currency = this.#getUseAssetsControllerForRates()\n ? this.messenger.call('AssetsController:getExchangeRatesForBridge')\n .currentCurrency\n : this.messenger.call('CurrencyRateController:getState').currentCurrency;\n\n if (assetIds.size === 0) {\n return;\n }\n\n const pricesByAssetId = await fetchAssetPrices({\n assetIds,\n currencies: new Set([currency]),\n clientId: this.#clientId,\n clientVersion: this.#clientVersion,\n fetchFn: this.#fetchFn,\n signal: this.#abortController?.signal,\n });\n const exchangeRates = toExchangeRates(currency, pricesByAssetId);\n this.update((state) => {\n state.assetExchangeRates = {\n ...state.assetExchangeRates,\n ...exchangeRates,\n };\n });\n };\n\n readonly #hasInsufficientBalance = async (\n quoteRequest: GenericQuoteRequest,\n ) => {\n try {\n const srcChainIdInHex = formatChainIdToHex(quoteRequest.srcChainId);\n const provider =\n this.#getNetworkClientByChainId(srcChainIdInHex)?.provider;\n const normalizedSrcTokenAddress = formatAddressToCaipReference(\n quoteRequest.srcTokenAddress,\n );\n\n return !(\n provider &&\n normalizedSrcTokenAddress &&\n quoteRequest.srcTokenAmount &&\n srcChainIdInHex &&\n (await hasSufficientBalance(\n provider,\n quoteRequest.walletAddress,\n normalizedSrcTokenAddress,\n quoteRequest.srcTokenAmount,\n srcChainIdInHex,\n ))\n );\n } catch (error) {\n console.warn('Failed to set insufficientBal', error);\n // Fall back to true so the backend returns quotes\n return true;\n }\n };\n\n readonly #appendInsufficientBalAndResetApproval = async (\n quoteRequest: GenericQuoteRequest,\n ) => {\n const isSrcChainNonEVM = isNonEvmChainId(quoteRequest.srcChainId);\n const providerConfig = isSrcChainNonEVM\n ? undefined\n : this.#getNetworkClientByChainId(\n formatChainIdToHex(quoteRequest.srcChainId),\n )?.configuration;\n\n let insufficientBal: boolean | undefined;\n let resetApproval: boolean = Boolean(quoteRequest.resetApproval);\n if (isSrcChainNonEVM) {\n // If the source chain is not an EVM network, use value from params\n insufficientBal = quoteRequest.insufficientBal;\n } else if (providerConfig?.rpcUrl?.includes('tenderly')) {\n // If the rpcUrl is a tenderly fork (e2e tests), set insufficientBal=true\n // The bridge-api filters out quotes if the balance on mainnet is insufficient so this override allows quotes to always be returned\n insufficientBal = true;\n } else {\n // Set loading status if RPC calls are made before the quotes are fetched\n this.update((state) => {\n state.quotesLoadingStatus = RequestStatus.LOADING;\n });\n resetApproval = await this.#shouldResetApproval(quoteRequest);\n // Otherwise query the src token balance from the RPC provider\n insufficientBal =\n quoteRequest.insufficientBal ??\n (await this.#hasInsufficientBalance(quoteRequest));\n }\n\n return {\n ...quoteRequest,\n insufficientBal,\n resetApproval,\n };\n };\n\n readonly #shouldResetApproval = async (quoteRequest: GenericQuoteRequest) => {\n if (isNonEvmChainId(quoteRequest.srcChainId)) {\n return false;\n }\n try {\n const normalizedSrcTokenAddress = formatAddressToCaipReference(\n quoteRequest.srcTokenAddress,\n );\n if (isEthUsdt(quoteRequest.srcChainId, normalizedSrcTokenAddress)) {\n const allowance = BigNumber.from(\n await this.#getUSDTMainnetAllowance(\n quoteRequest.walletAddress,\n normalizedSrcTokenAddress,\n quoteRequest.destChainId,\n ),\n );\n return allowance.lt(quoteRequest.srcTokenAmount) && allowance.gt(0);\n }\n return false;\n } catch (error) {\n console.warn('Failed to set resetApproval', error);\n // Fall back to true so the backend returns quotes\n return true;\n }\n };\n\n stopPollingForQuotes = (\n reason?: AbortReason,\n context?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived],\n ) => {\n this.stopAllPolling();\n // If polling is stopped before quotes finish loading, track QuotesReceived\n if (this.state.quotesLoadingStatus === RequestStatus.LOADING && context) {\n this.trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.QuotesReceived,\n context,\n );\n }\n // Clears quotes list in state\n this.#abortController?.abort(reason);\n this.#batchSellTradesAbortController?.abort(reason);\n };\n\n /**\n * Sets the location/entry point for the current swap or bridge flow.\n * Call this when the user enters the flow so that all internally-fired\n * events (InputChanged, QuotesRequested, etc.) carry the correct location.\n *\n * @param location - The entry point from which the user initiated the flow\n */\n setLocation = (location: MetaMetricsSwapsEventSource) => {\n this.#location = location;\n };\n\n resetState = (\n reason = AbortReason.ResetState,\n quoteRequestIndex: number | null = null,\n context?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived],\n ) => {\n this.stopPollingForQuotes(reason, context);\n this.update((state) => {\n // Cannot do direct assignment to state, i.e. state = {... }, need to manually assign each field\n if (quoteRequestIndex === null) {\n // Clear all requests if index is null\n state.quoteRequest = DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest;\n } else {\n // Otherwise only clear the specified request\n state.quoteRequest = state.quoteRequest\n .slice(0, quoteRequestIndex)\n .concat(DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest[0])\n .concat(state.quoteRequest.slice(quoteRequestIndex + 1));\n }\n state.quotesInitialLoadTime =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesInitialLoadTime;\n state.quotes = DEFAULT_BRIDGE_CONTROLLER_STATE.quotes;\n state.quotesLastFetched =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesLastFetched;\n state.quotesLoadingStatus =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesLoadingStatus;\n state.quoteFetchError = DEFAULT_BRIDGE_CONTROLLER_STATE.quoteFetchError;\n state.quotesRefreshCount =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesRefreshCount;\n state.assetExchangeRates =\n DEFAULT_BRIDGE_CONTROLLER_STATE.assetExchangeRates;\n state.minimumBalanceForRentExemptionInLamports =\n DEFAULT_BRIDGE_CONTROLLER_STATE.minimumBalanceForRentExemptionInLamports;\n state.tokenWarnings = DEFAULT_BRIDGE_CONTROLLER_STATE.tokenWarnings;\n state.tokenSecurityTypeDestination =\n DEFAULT_BRIDGE_CONTROLLER_STATE.tokenSecurityTypeDestination;\n state.quoteStreamComplete =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quoteStreamComplete;\n state.batchSellTrades = DEFAULT_BRIDGE_CONTROLLER_STATE.batchSellTrades;\n state.batchSellTradesLoadingStatus =\n DEFAULT_BRIDGE_CONTROLLER_STATE.batchSellTradesLoadingStatus;\n });\n };\n\n /**\n * Sets the interval length based on the source chain\n */\n setChainIntervalLength = () => {\n const { state } = this;\n // Assume that BatchSell quote requests all have the same source chain\n // Use the first one to determine refresh rate\n const { srcChainId } = state.quoteRequest[0];\n const bridgeFeatureFlags = getBridgeFeatureFlags(this.messenger);\n\n const refreshRateOverride = srcChainId\n ? bridgeFeatureFlags.chains[formatChainIdToCaip(srcChainId)]?.refreshRate\n : undefined;\n const defaultRefreshRate = bridgeFeatureFlags.refreshRate;\n this.setIntervalLength(refreshRateOverride ?? defaultRefreshRate);\n };\n\n readonly #fetchBridgeQuotes = async ({\n quoteRequests,\n context,\n }: BridgePollingInput) => {\n this.#abortController?.abort(AbortReason.NewQuoteRequest);\n this.#batchSellTradesAbortController?.abort(AbortReason.NewQuoteRequest);\n\n this.#abortController = new AbortController();\n\n this.#fetchAssetExchangeRates(quoteRequests).catch((error) =>\n console.warn('Failed to fetch asset exchange rates', error),\n );\n\n this.trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.QuotesRequested,\n context,\n );\n\n const { sse, maxRefreshCount } = getBridgeFeatureFlags(this.messenger);\n const shouldStream =\n sse?.enabled &&\n hasMinimumRequiredVersion(this.#clientVersion, sse.minimumVersion);\n const isBatchSellRequest = quoteRequests.length > 1;\n\n this.update((state) => {\n state.quoteFetchError = DEFAULT_BRIDGE_CONTROLLER_STATE.quoteFetchError;\n state.tokenWarnings = DEFAULT_BRIDGE_CONTROLLER_STATE.tokenWarnings;\n state.quoteStreamComplete =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quoteStreamComplete;\n state.quotesLastFetched = Date.now();\n state.quotesLoadingStatus = RequestStatus.LOADING;\n // Prevent clients from displaying stale batch sell fees\n if (quoteRequests.length > 1) {\n state.batchSellTradesLoadingStatus = RequestStatus.LOADING;\n state.batchSellTrades = DEFAULT_BRIDGE_CONTROLLER_STATE.batchSellTrades;\n }\n });\n\n const jwt = await this.#getJwt();\n\n try {\n const [firstQuoteRequest] = quoteRequests;\n\n const unifiedSwapTraceName = isCrossChain(\n firstQuoteRequest.srcChainId,\n firstQuoteRequest.destChainId,\n )\n ? TraceName.BridgeQuotesFetched\n : TraceName.SwapQuotesFetched;\n\n await this.#trace(\n {\n name: isBatchSellRequest\n ? TraceName.BatchSellQuotesFetched\n : unifiedSwapTraceName,\n data: {\n srcChainId: formatChainIdToCaip(firstQuoteRequest.srcChainId),\n destChainId: formatChainIdToCaip(firstQuoteRequest.destChainId),\n },\n },\n async () => {\n const selectedAccount = this.#getMultichainSelectedAccount(\n firstQuoteRequest.walletAddress,\n );\n // This call is not awaited to prevent blocking quote fetching if the snap takes too long to respond\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#setMinimumBalanceForRentExemptionInLamports(\n firstQuoteRequest.srcChainId,\n selectedAccount?.metadata?.snap?.id,\n );\n // Use SSE if enabled and return early\n if (shouldStream || isBatchSellRequest) {\n await this.#handleQuoteStreaming(\n quoteRequests,\n context.feature_id,\n jwt,\n selectedAccount,\n );\n return;\n }\n // Otherwise use regular fetch\n const quotes = await this.fetchQuotes(\n firstQuoteRequest,\n context.feature_id,\n this.#abortController?.signal,\n );\n this.update((state) => {\n // Set the initial load time if this is the first fetch\n if (\n state.quotesRefreshCount ===\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesRefreshCount &&\n this.#quotesFirstFetched\n ) {\n state.quotesInitialLoadTime =\n Date.now() - this.#quotesFirstFetched;\n }\n state.quotes = quotes;\n state.quotesLoadingStatus = RequestStatus.FETCHED;\n });\n },\n );\n } catch (error) {\n // Reset the quotes list if the fetch fails to avoid showing stale quotes\n this.update((state) => {\n state.quotes = DEFAULT_BRIDGE_CONTROLLER_STATE.quotes;\n });\n // Ignore abort errors\n if (\n (error as Error).toString().includes('AbortError') ||\n (error as Error).toString().includes('FetchRequestCanceledException') ||\n [\n AbortReason.ResetState,\n AbortReason.NewQuoteRequest,\n AbortReason.QuoteRequestUpdated,\n AbortReason.TransactionSubmitted,\n ].includes(error as AbortReason)\n ) {\n // Exit the function early to prevent other state updates\n return;\n }\n\n // Update loading status and error message\n this.update((state) => {\n // The error object reference is not guaranteed to exist on mobile so reading\n // the message directly could cause an error.\n let errorMessage;\n try {\n errorMessage =\n (error as Error)?.message ?? (error as Error).toString();\n } catch {\n // Intentionally empty\n } finally {\n state.quoteFetchError = errorMessage ?? 'Unknown error';\n }\n state.quotesLoadingStatus = RequestStatus.ERROR;\n });\n // Track event and log error\n this.trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.QuotesError,\n context,\n );\n console.log(\n `Failed to ${shouldStream ? 'stream' : 'fetch'} bridge quotes`,\n error,\n );\n }\n\n // Update refresh count after fetching, validation and fee calculation have completed\n this.update((state) => {\n state.quotesRefreshCount += 1;\n });\n const hasNoFundedQuoteRequests = quoteRequests.every(\n ({ insufficientBal }) => Boolean(insufficientBal),\n );\n\n if (\n hasNoFundedQuoteRequests\n ? // If all quote requests are insufficiently funded, stop polling\n // So if a BatchSell has at least 1 sufficiently funded quote request, polling continues\n true\n : // Otherwise continue polling until the maximum number of refreshes has been reached\n this.state.quotesRefreshCount >= maxRefreshCount\n ) {\n this.stopAllPolling();\n }\n };\n\n readonly #handleQuoteStreaming = async (\n quoteRequests: GenericQuoteRequest[],\n featureId: FeatureId,\n jwt?: string,\n selectedAccount?: InternalAccount,\n ) => {\n /**\n * Tracks the number of valid quotes received from the current stream, which is used\n * to determine when to clear the quotes list and set the initial load time\n */\n let validQuotesCounter = 0;\n /**\n * Tracks all pending promises from appendFeesToQuotes calls to ensure they complete\n * before setting quotesLoadingStatus to FETCHED\n */\n const pendingFeeAppendPromises = new Set<Promise<void>>();\n\n await fetchBridgeQuoteStream(\n this.#fetchFn,\n quoteRequests,\n this.#abortController?.signal,\n featureId,\n this.#clientId,\n jwt,\n this.#config.customBridgeApiBaseUrl ?? BRIDGE_PROD_API_BASE_URL,\n {\n onQuoteValidationFailure: (validationFailures) =>\n this.#trackQuoteValidationFailures(validationFailures, featureId),\n onValidQuoteReceived: async (quote: QuoteResponseV1) => {\n const feeAppendPromise = (async () => {\n const quotesWithFees = await appendFeesToQuotes(\n [quote],\n this.messenger,\n this.#getLayer1GasFee,\n selectedAccount,\n );\n if (quotesWithFees.length > 0) {\n validQuotesCounter += 1;\n }\n this.update((state) => {\n // Clear previous quotes and quotes load time when first quote in the current\n // polling loop is received\n // This enables clients to continue showing the previous quotes while new\n // quotes are loading\n // Note: If there are no valid quotes until the 2nd fetch, quotesInitialLoadTime will be > refreshRate\n if (validQuotesCounter === 1) {\n state.quotes = DEFAULT_BRIDGE_CONTROLLER_STATE.quotes;\n if (!state.quotesInitialLoadTime && this.#quotesFirstFetched) {\n // Set the initial load time after the first quote is received\n state.quotesInitialLoadTime =\n Date.now() - this.#quotesFirstFetched;\n }\n }\n state.quotes = [...state.quotes, ...quotesWithFees];\n });\n })();\n pendingFeeAppendPromises.add(feeAppendPromise);\n feeAppendPromise\n .catch((error) => {\n // Catch errors to prevent them from breaking stream processing\n // If appendFeesToQuotes throws, the state update never happens, so no invalid entry is added\n console.error('Error appending fees to quote', error);\n })\n .finally(() => {\n pendingFeeAppendPromises.delete(feeAppendPromise);\n });\n // Await the promise to ensure errors are caught and handled before continuing\n // The promise is also tracked in pendingFeeAppendPromises for onClose to wait for\n await feeAppendPromise;\n },\n onTokenWarning: (warning) => {\n this.update((state) => {\n const isDuplicate = state.tokenWarnings.some(\n (existing) => existing.feature_id === warning.feature_id,\n );\n if (!isDuplicate) {\n state.tokenWarnings = [...state.tokenWarnings, warning];\n }\n });\n },\n onComplete: (data) => {\n this.update((state) => {\n state.quoteStreamComplete = data;\n });\n },\n onClose: async () => {\n // Wait for all pending appendFeesToQuotes operations to complete\n // before setting quotesLoadingStatus to FETCHED\n await Promise.allSettled(Array.from(pendingFeeAppendPromises));\n this.update((state) => {\n // If there are no valid quotes in the current stream, clear the quotes list\n // to remove quotes from the previous stream\n if (validQuotesCounter === 0) {\n state.quotes = DEFAULT_BRIDGE_CONTROLLER_STATE.quotes;\n }\n state.quotesLoadingStatus = RequestStatus.FETCHED;\n });\n },\n },\n this.#clientVersion,\n );\n };\n\n readonly #setMinimumBalanceForRentExemptionInLamports = async (\n srcChainId: GenericQuoteRequest['srcChainId'],\n snapId?: string,\n ) => {\n if (!isSolanaChainId(srcChainId) || !snapId) {\n return;\n }\n const minimumBalanceForRentExemptionInLamports =\n await getMinimumBalanceForRentExemptionInLamports(snapId, this.messenger);\n this.update((state) => {\n state.minimumBalanceForRentExemptionInLamports =\n minimumBalanceForRentExemptionInLamports;\n });\n };\n\n #getMultichainSelectedAccount(\n walletAddress?: GenericQuoteRequest['walletAddress'],\n ) {\n // Assume that all quotes in a batch are for the same account\n const addressToUse =\n walletAddress ?? this.state.quoteRequest[0].walletAddress;\n if (!addressToUse) {\n throw new Error('Account address is required');\n }\n const selectedAccount = this.messenger.call(\n 'AccountsController:getAccountByAddress',\n addressToUse,\n );\n return selectedAccount;\n }\n\n #getNetworkClientByChainId(chainId: Hex) {\n const networkClientId = this.messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n if (!networkClientId) {\n throw new Error(`No network client found for chainId: ${chainId}`);\n }\n const networkClient = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n return networkClient;\n }\n\n readonly #getJwt = async (): Promise<string | undefined> => {\n try {\n const token = await this.messenger.call(\n 'AuthenticationController:getBearerToken',\n );\n return token;\n } catch (error) {\n console.error('Error getting JWT token for bridge-api request', error);\n return undefined;\n }\n };\n\n readonly #getRequestMetadata = (\n quoteRequestIndex: number = 0,\n ): Omit<\n RequestMetadata,\n 'stx_enabled' | 'usd_amount_source' | 'security_warnings'\n > => {\n const quoteRequest = this.state.quoteRequest[quoteRequestIndex];\n const { walletAddress } = quoteRequest;\n const accountHardwareType = getAccountHardwareType(\n walletAddress\n ? this.#getMultichainSelectedAccount(walletAddress)\n : undefined,\n );\n\n return {\n slippage_limit: quoteRequest.slippage,\n swap_type: getSwapTypeFromQuote(quoteRequest),\n custom_slippage: isCustomSlippage(quoteRequest.slippage),\n account_hardware_type: accountHardwareType,\n is_hardware_wallet: accountHardwareType !== null,\n };\n };\n\n readonly #getQuoteFetchData = (): Omit<\n QuoteFetchData,\n 'best_quote_provider' | 'price_impact' | 'can_submit'\n > => {\n return {\n quotes_count: this.state.quotes.length,\n quotes_list: this.state.quotes.map(({ quote }) =>\n formatProviderLabel(quote),\n ),\n initial_load_time_all_quotes: this.state.quotesInitialLoadTime ?? 0,\n has_gas_included_quote: this.state.quotes.some(\n ({ quote }) => quote.gasIncluded,\n ),\n };\n };\n\n readonly #getEventProperties = <\n EventName extends\n (typeof UnifiedSwapBridgeEventName)[keyof typeof UnifiedSwapBridgeEventName],\n >(\n eventName: EventName,\n propertiesFromClient: Pick<\n RequiredEventContextFromClient,\n EventName\n >[EventName],\n quoteRequestIndex: number = 0,\n ): CrossChainSwapsEventProperties<EventName> => {\n const clientProps = propertiesFromClient as Record<string, unknown>;\n const baseProperties = {\n ...propertiesFromClient,\n location: clientProps?.location ?? this.#location,\n action_type: MetricsActionType.SWAPBRIDGE_V1,\n };\n const quoteRequest = this.state.quoteRequest[quoteRequestIndex];\n switch (eventName) {\n case UnifiedSwapBridgeEventName.ButtonClicked:\n return {\n ...getRequestParams(\n quoteRequest,\n this.state.tokenSecurityTypeDestination,\n ),\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.PageViewed:\n return {\n ...getRequestParams(\n quoteRequest,\n this.state.tokenSecurityTypeDestination,\n ),\n ...this.#getRequestMetadata(),\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.QuotesValidationFailed:\n return {\n ...getRequestParams(\n quoteRequest,\n this.state.tokenSecurityTypeDestination,\n ),\n refresh_count: this.state.quotesRefreshCount,\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.QuotesReceived:\n return {\n ...getRequestParams(\n quoteRequest,\n this.state.tokenSecurityTypeDestination,\n ),\n ...this.#getRequestMetadata(),\n ...this.#getQuoteFetchData(),\n refresh_count: this.state.quotesRefreshCount,\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.QuotesRequested:\n return {\n ...getRequestParams(\n quoteRequest,\n this.state.tokenSecurityTypeDestination,\n ),\n ...this.#getRequestMetadata(),\n has_sufficient_funds: !quoteRequest.insufficientBal,\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.QuotesError:\n return {\n ...getRequestParams(\n quoteRequest,\n this.state.tokenSecurityTypeDestination,\n ),\n ...this.#getRequestMetadata(),\n error_message: this.state.quoteFetchError,\n has_sufficient_funds: !quoteRequest.insufficientBal,\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.AllQuotesOpened:\n case UnifiedSwapBridgeEventName.AllQuotesSorted:\n case UnifiedSwapBridgeEventName.QuoteSelected:\n return {\n ...getRequestParams(\n quoteRequest,\n this.state.tokenSecurityTypeDestination,\n ),\n ...this.#getRequestMetadata(),\n ...this.#getQuoteFetchData(),\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.Failed: {\n // Populate the properties that the error occurred before the tx was submitted\n return {\n ...baseProperties,\n ...getRequestParams(\n quoteRequest,\n this.state.tokenSecurityTypeDestination,\n ),\n ...this.#getRequestMetadata(),\n ...this.#getQuoteFetchData(),\n ...propertiesFromClient,\n };\n }\n case UnifiedSwapBridgeEventName.AssetDetailTooltipClicked:\n case UnifiedSwapBridgeEventName.AssetPickerOpened:\n return baseProperties;\n // Inject `token_security_type_destination` from controller state so the\n // field is always present on this event. `baseProperties` (which spreads\n // `propertiesFromClient`) wins if the client supplies a value explicitly.\n case UnifiedSwapBridgeEventName.InputSourceDestinationSwitched:\n return {\n token_security_type_destination:\n this.state.tokenSecurityTypeDestination,\n ...baseProperties,\n };\n // These events may be published after the bridge-controller state is reset\n // So the BridgeStatusController populates all the properties\n case UnifiedSwapBridgeEventName.Submitted:\n case UnifiedSwapBridgeEventName.Completed:\n return propertiesFromClient;\n case UnifiedSwapBridgeEventName.InputChanged:\n default:\n return baseProperties;\n }\n };\n\n readonly #trackInputChangedEvents = (\n paramsToUpdate: Partial<GenericQuoteRequest>,\n featureId: FeatureId,\n quoteRequestIndex: number = 0,\n ) => {\n Object.entries(paramsToUpdate).forEach(([key, value]) => {\n const inputKey = toInputChangedPropertyKey[key as keyof QuoteRequest];\n const inputValue =\n toInputChangedPropertyValue[key as keyof QuoteRequest]?.(\n paramsToUpdate,\n );\n if (\n inputKey &&\n inputValue !== undefined &&\n this.state.quoteRequest[quoteRequestIndex] &&\n value !==\n this.state.quoteRequest[quoteRequestIndex][\n key as keyof GenericQuoteRequest\n ]\n ) {\n this.trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.InputChanged,\n {\n input: inputKey,\n input_value: inputValue,\n location: this.#location,\n feature_id: featureId,\n },\n );\n }\n });\n };\n\n /**\n * This method tracks cross-chain swaps events\n *\n * @param eventName - The name of the event to track\n * @param propertiesFromClient - Properties that can't be calculated from the event name and need to be provided by the client\n * @param quoteRequestIndex - The index of the quote request to track the event for\n * @example\n * this.trackUnifiedSwapBridgeEvent(UnifiedSwapBridgeEventName.ActionOpened, {\n * location: MetaMetricsSwapsEventSource.MainView,\n * });\n */\n trackUnifiedSwapBridgeEvent = <\n EventName extends\n (typeof UnifiedSwapBridgeEventName)[keyof typeof UnifiedSwapBridgeEventName],\n >(\n eventName: EventName,\n propertiesFromClient: Pick<\n RequiredEventContextFromClient,\n EventName\n >[EventName],\n quoteRequestIndex: number = 0,\n ) => {\n try {\n const combinedPropertiesForEvent = this.#getEventProperties<EventName>(\n eventName,\n propertiesFromClient,\n quoteRequestIndex,\n );\n\n this.#trackMetaMetricsFn(eventName, combinedPropertiesForEvent);\n } catch (error) {\n console.error(\n `Error tracking cross-chain swaps MetaMetrics event ${eventName}`,\n error,\n );\n }\n };\n\n /**\n *\n * @param walletAddress - The address of the account to get the allowance for\n * @param contractAddress - The address of the ERC20 token contract on mainnet\n * @param destinationChainId - The chain ID of the destination network\n * @returns The atomic allowance of the ERC20 token contract\n */\n readonly #getUSDTMainnetAllowance = async (\n walletAddress: string,\n contractAddress: string,\n destinationChainId: GenericQuoteRequest['destChainId'],\n ): Promise<string> => {\n const networkClient = this.#getNetworkClientByChainId(CHAIN_IDS.MAINNET);\n const provider = networkClient?.provider;\n if (!provider) {\n throw new Error('No provider found');\n }\n\n const ethersProvider = new Web3Provider(provider);\n const contract = new Contract(contractAddress, abiERC20, ethersProvider);\n const spenderAddress = isCrossChain(CHAIN_IDS.MAINNET, destinationChainId)\n ? METABRIDGE_ETHEREUM_ADDRESS\n : SWAPS_CONTRACT_ADDRESSES[CHAIN_IDS.MAINNET];\n const allowance: BigNumber = await contract.allowance(\n walletAddress,\n spenderAddress,\n );\n return allowance.toString();\n };\n}\n"]}
1
+ {"version":3,"file":"bridge-controller.mjs","sourceRoot":"","sources":["../src/bridge-controller.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { BigNumber } from '@ethersproject/bignumber';\nimport { Contract } from '@ethersproject/contracts';\nimport { Web3Provider } from '@ethersproject/providers';\nimport type { StateMetadata } from '@metamask/base-controller';\nimport type { TraceCallback } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { abiERC20 } from '@metamask/metamask-eth-abis';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type { TransactionController } from '@metamask/transaction-controller';\nimport type { CaipAssetType, Hex } from '@metamask/utils';\n\nimport type { BridgeClientId } from './constants/bridge';\nimport {\n BRIDGE_CONTROLLER_NAME,\n BRIDGE_PROD_API_BASE_URL,\n DEFAULT_BRIDGE_CONTROLLER_STATE,\n METABRIDGE_ETHEREUM_ADDRESS,\n REFRESH_INTERVAL_MS,\n} from './constants/bridge';\nimport { CHAIN_IDS } from './constants/chains';\nimport { SWAPS_CONTRACT_ADDRESSES } from './constants/swaps';\nimport { TraceName } from './constants/traces';\nimport {\n ExchangeRateSourcesForLookup,\n selectIsAssetExchangeRateInState,\n} from './selectors';\nimport { FeatureId, RequestStatus } from './types';\nimport type {\n L1GasFees,\n GenericQuoteRequest,\n NonEvmFees,\n QuoteRequest,\n QuoteResponseV1,\n BridgeControllerState,\n BridgeControllerMessenger,\n FetchFunction,\n InputPrimaryDenomination,\n} from './types';\nimport { getAssetIdsForToken, toExchangeRates } from './utils/assets';\nimport { hasSufficientBalance } from './utils/balance';\nimport {\n getDefaultBridgeControllerState,\n isCrossChain,\n isEthUsdt,\n isNonEvmChainId,\n isSolanaChainId,\n} from './utils/bridge';\nimport {\n formatAddressToCaipReference,\n formatChainIdToCaip,\n formatChainIdToHex,\n} from './utils/caip-formatters';\nimport {\n getBridgeFeatureFlags,\n hasMinimumRequiredVersion,\n} from './utils/feature-flags';\nimport {\n fetchAssetPrices,\n fetchBridgeQuotes,\n fetchBridgeQuoteStream,\n fetchBatchSellTrades,\n} from './utils/fetch';\nimport {\n AbortReason,\n MetaMetricsSwapsEventSource,\n MetricsActionType,\n UnifiedSwapBridgeEventName,\n} from './utils/metrics/constants';\nimport {\n formatProviderLabel,\n getAccountHardwareType,\n getRequestParams,\n getSwapTypeFromQuote,\n isCustomSlippage,\n toInputChangedPropertyKey,\n toInputChangedPropertyValue,\n} from './utils/metrics/properties';\nimport type {\n QuoteFetchData,\n RequestMetadata,\n RequiredEventContextFromClient,\n} from './utils/metrics/types';\nimport type { CrossChainSwapsEventProperties } from './utils/metrics/types';\nimport {\n isValidQuoteRequest,\n isValidBatchSellQuoteRequest,\n sortQuotes,\n} from './utils/quote';\nimport { appendFeesToQuotes } from './utils/quote-fees';\nimport { getMinimumBalanceForRentExemptionInLamports } from './utils/snaps';\n\nconst metadata: StateMetadata<BridgeControllerState> = {\n quoteRequest: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n quotes: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n quotesInitialLoadTime: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n quotesLastFetched: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n quotesLoadingStatus: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n quoteFetchError: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n quotesRefreshCount: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n assetExchangeRates: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n minimumBalanceForRentExemptionInLamports: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n tokenWarnings: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n tokenSecurityTypeDestination: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n inputPrimaryDenomination: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n quoteStreamComplete: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n batchSellTrades: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n batchSellTradesLoadingStatus: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\n/**\n * The input to start polling for the {@link BridgeController}\n *\n * @param updatedQuoteRequest - The updated quote request\n * @param context - The context contains properties that can't be populated by the\n * controller and need to be provided by the client for analytics\n */\ntype BridgePollingInput = {\n quoteRequests: GenericQuoteRequest[];\n context: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesError] &\n RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesRequested];\n};\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'updateBridgeQuoteRequestParams',\n 'fetchQuotes',\n 'updateBatchSellTrades',\n 'stopPollingForQuotes',\n 'setLocation',\n 'setInputPrimaryDenomination',\n 'resetState',\n 'setChainIntervalLength',\n 'trackUnifiedSwapBridgeEvent',\n] as const;\n\nexport class BridgeController extends StaticIntervalPollingController<BridgePollingInput>()<\n typeof BRIDGE_CONTROLLER_NAME,\n BridgeControllerState,\n BridgeControllerMessenger\n> {\n #abortController: AbortController | undefined;\n\n #batchSellTradesAbortController: AbortController | undefined;\n\n #quotesFirstFetched: number | undefined;\n\n /**\n * Stores the location/entry point from which the user initiated the swap or bridge flow.\n * Set via setLocation() before navigating to the swap/bridge flow.\n * Used as default for all subsequent internal events.\n */\n #location: MetaMetricsSwapsEventSource = MetaMetricsSwapsEventSource.MainView;\n\n readonly #clientId: BridgeClientId;\n\n readonly #clientVersion: string;\n\n readonly #getLayer1GasFee: typeof TransactionController.prototype.getLayer1GasFee;\n\n readonly #fetchFn: FetchFunction;\n\n readonly #trackMetaMetricsFn: <\n EventName extends\n (typeof UnifiedSwapBridgeEventName)[keyof typeof UnifiedSwapBridgeEventName],\n >(\n eventName: EventName,\n properties: CrossChainSwapsEventProperties<EventName>,\n ) => void;\n\n readonly #trace: TraceCallback;\n\n readonly #config: {\n customBridgeApiBaseUrl?: string;\n };\n\n /**\n * Returns whether to use AssetsController for exchange rates.\n * Set via constructor option getUseAssetsControllerForRates; defaults to false.\n *\n * @returns True when exchange rates should be read from AssetsController:getExchangeRatesForBridge.\n */\n readonly #getUseAssetsControllerForRates: () => boolean;\n\n constructor({\n messenger,\n state,\n clientId,\n clientVersion,\n getLayer1GasFee,\n fetchFn,\n config,\n trackMetaMetricsFn,\n traceFn,\n getUseAssetsControllerForRates,\n }: {\n messenger: BridgeControllerMessenger;\n state?: Partial<BridgeControllerState>;\n clientId: BridgeClientId;\n clientVersion: string;\n getLayer1GasFee: typeof TransactionController.prototype.getLayer1GasFee;\n fetchFn: FetchFunction;\n config?: {\n customBridgeApiBaseUrl?: string;\n };\n trackMetaMetricsFn: <\n EventName extends\n (typeof UnifiedSwapBridgeEventName)[keyof typeof UnifiedSwapBridgeEventName],\n >(\n eventName: EventName,\n properties: CrossChainSwapsEventProperties<EventName>,\n ) => void;\n traceFn?: TraceCallback;\n /**\n * When provided, called to determine whether to use AssetsController for exchange rates.\n * When true, rates are read from AssetsController:getExchangeRatesForBridge instead of\n * MultichainAssetsRatesController, TokenRatesController, and CurrencyRateController.\n */\n getUseAssetsControllerForRates?: () => boolean;\n }) {\n super({\n name: BRIDGE_CONTROLLER_NAME,\n metadata,\n messenger,\n state: {\n ...getDefaultBridgeControllerState(),\n ...state,\n },\n });\n\n this.setIntervalLength(REFRESH_INTERVAL_MS);\n\n this.#abortController = new AbortController();\n this.#getLayer1GasFee = getLayer1GasFee;\n this.#clientId = clientId;\n this.#clientVersion = clientVersion;\n this.#fetchFn = fetchFn;\n this.#trackMetaMetricsFn = trackMetaMetricsFn;\n this.#config = config ?? {};\n this.#trace = traceFn ?? (((_request, fn) => fn?.()) as TraceCallback);\n this.#getUseAssetsControllerForRates =\n getUseAssetsControllerForRates ?? (() => false);\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n _executePoll = async (pollingInput: BridgePollingInput) => {\n await this.#fetchBridgeQuotes(pollingInput);\n };\n\n /**\n * Updates the quote request at the specified index with the given parameters, then starts\n * polling for quotes.\n *\n * @param paramsToUpdate - The parameters to update in the quote request at the specified index\n * @param context - metrics context\n * @param quoteRequestIndex - The index of the quote request to update\n * @param quoteRequestCount - The number of quote requests in the UI\n */\n updateBridgeQuoteRequestParams = async (\n paramsToUpdate: Partial<GenericQuoteRequest> & {\n walletAddress: GenericQuoteRequest['walletAddress'];\n },\n context: BridgePollingInput['context'],\n quoteRequestIndex: number = 0,\n quoteRequestCount: number = 1,\n ) => {\n // Guard against updating a quote request that doesn't exist\n if (quoteRequestIndex >= quoteRequestCount) {\n return;\n }\n this.#trackInputChangedEvents(\n paramsToUpdate,\n context.feature_id,\n quoteRequestIndex,\n );\n this.resetState(AbortReason.QuoteRequestUpdated, quoteRequestIndex);\n this.update((state) => {\n // Update only the specified quote request and keep the rest of the quote requests unchanged\n state.quoteRequest = state.quoteRequest\n .slice(0, quoteRequestIndex)\n .concat({\n ...DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest[0],\n ...paramsToUpdate,\n })\n .concat(\n state.quoteRequest.slice(quoteRequestIndex + 1, quoteRequestCount),\n );\n state.tokenSecurityTypeDestination =\n context.token_security_type_destination ?? null;\n });\n\n // BatchSell and Unified swaps both use the same polling logic so both validations should pass\n if (\n isValidQuoteRequest(paramsToUpdate) &&\n isValidBatchSellQuoteRequest(this.state.quoteRequest)\n ) {\n this.#quotesFirstFetched = Date.now();\n // Update the insufficientBal and resetApproval params for the quote request\n const quoteWithInsufficientBalAndResetApproval =\n await this.#appendInsufficientBalAndResetApproval(paramsToUpdate);\n this.update((state) => {\n state.quoteRequest[quoteRequestIndex] =\n quoteWithInsufficientBalAndResetApproval;\n });\n\n // Set refresh rate based on the source chain before starting polling\n this.setChainIntervalLength();\n this.startPolling({\n quoteRequests: this.state.quoteRequest,\n context,\n });\n }\n };\n\n /**\n * Fetches quotes for specified request without updating the controller state\n * This method does not start polling for quotes and does not emit UnifiedSwapBridge events\n *\n * @param quoteRequest - The parameters for quote requests to fetch\n * @param featureId - The feature ID that maps to quoteParam overrides from LD\n * @param abortSignal - The abort signal to cancel all the requests\n * @returns A list of validated quotes\n */\n fetchQuotes = async (\n quoteRequest: GenericQuoteRequest,\n featureId: FeatureId,\n abortSignal: AbortSignal | null = null,\n ): Promise<(QuoteResponseV1 & L1GasFees & NonEvmFees)[]> => {\n const bridgeFeatureFlags = getBridgeFeatureFlags(this.messenger);\n const jwt = await this.#getJwt();\n // If featureId is specified, retrieve the quoteRequestOverrides for that featureId\n const quoteRequestOverrides = featureId\n ? bridgeFeatureFlags.quoteRequestOverrides?.[featureId]\n : undefined;\n const resetApproval = await this.#shouldResetApproval(quoteRequest);\n\n // If quoteRequestOverrides is specified, merge it with the quoteRequest\n const { quotes: baseQuotes, validationFailures } = await fetchBridgeQuotes(\n quoteRequestOverrides\n ? { ...quoteRequest, ...quoteRequestOverrides, resetApproval }\n : { ...quoteRequest, resetApproval },\n abortSignal,\n this.#clientId,\n jwt,\n this.#fetchFn,\n this.#config.customBridgeApiBaseUrl ?? BRIDGE_PROD_API_BASE_URL,\n featureId,\n this.#clientVersion,\n );\n\n this.#trackQuoteValidationFailures(validationFailures, featureId);\n\n const quotesWithFees = await appendFeesToQuotes(\n baseQuotes,\n this.messenger,\n this.#getLayer1GasFee,\n this.#getMultichainSelectedAccount(quoteRequest.walletAddress),\n );\n\n return sortQuotes(quotesWithFees, featureId);\n };\n\n /**\n * Fetches gasless transaction data and fees for BatchSell quotes.\n * To use this in the clients, add a listener for the recommendedQuotes and call\n * this handler whenever they change.\n *\n * @param quotes - The quotes to fetch the gasless transaction data and fees for\n * @param stxEnabled - Flag to estimate gas cost more precisely for the batch sell feature.\n */\n updateBatchSellTrades = async (\n quotes: (QuoteResponseV1 | null)[],\n stxEnabled: boolean,\n ): Promise<void> => {\n this.#batchSellTradesAbortController?.abort(\n AbortReason.GaslessTxBatchFetched,\n );\n this.#batchSellTradesAbortController = new AbortController();\n\n this.update((state) => {\n // Set loading status again if recommended quotes are re-ordered\n state.batchSellTradesLoadingStatus = RequestStatus.LOADING;\n });\n\n try {\n const batchSellTradesResponse = await fetchBatchSellTrades(\n quotes,\n stxEnabled,\n this.#batchSellTradesAbortController.signal,\n this.#clientId,\n await this.#getJwt(),\n this.#fetchFn,\n this.#config.customBridgeApiBaseUrl ?? BRIDGE_PROD_API_BASE_URL,\n this.#clientVersion,\n );\n\n this.update((state) => {\n state.batchSellTrades = batchSellTradesResponse;\n state.batchSellTradesLoadingStatus = RequestStatus.FETCHED;\n });\n\n // TODO if fee.asset.assetId is not in exchange rates, fetch the exchange rate and update the state\n } catch (error) {\n // Ignore abort errors\n if (\n (error as Error).toString().includes('AbortError') ||\n (error as Error).toString().includes('FetchRequestCanceledException') ||\n [\n AbortReason.ResetState,\n AbortReason.NewQuoteRequest,\n AbortReason.QuoteRequestUpdated,\n AbortReason.TransactionSubmitted,\n AbortReason.GaslessTxBatchFetched,\n ].includes(error as AbortReason)\n ) {\n // Exit the function early to prevent other state updates\n return;\n }\n\n this.update((state) => {\n // Reset the batch sell trades if the fetch fails to avoid showing stale data\n state.batchSellTrades = DEFAULT_BRIDGE_CONTROLLER_STATE.batchSellTrades;\n // Update loading status\n state.batchSellTradesLoadingStatus = RequestStatus.ERROR;\n });\n console.log(`Failed to fetch batch sell trades`, error);\n }\n };\n\n readonly #trackQuoteValidationFailures = (\n validationFailures: string[],\n featureId: FeatureId,\n ) => {\n if (validationFailures.length === 0) {\n return;\n }\n this.trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.QuotesValidationFailed,\n {\n feature_id: featureId,\n failures: validationFailures,\n location: this.#location,\n },\n );\n };\n\n readonly #getExchangeRateSources = (): ExchangeRateSourcesForLookup => {\n if (this.#getUseAssetsControllerForRates()) {\n return {\n ...this.messenger.call('AssetsController:getExchangeRatesForBridge'),\n historicalPrices: {},\n ...this.state,\n };\n }\n return {\n ...this.messenger.call('MultichainAssetsRatesController:getState'),\n ...this.messenger.call('CurrencyRateController:getState'),\n ...this.messenger.call('TokenRatesController:getState'),\n ...this.state,\n };\n };\n\n /**\n * Fetches the exchange rates for the assets in the quote request if they are not already in the state\n * In addition to the selected tokens, this also fetches the native asset for the source and destination chains\n *\n * @param quoteRequests - The quote requests to fetch the exchange rates for\n */\n readonly #fetchAssetExchangeRates = async (\n quoteRequests: GenericQuoteRequest[],\n ) => {\n const exchangeRateSources = this.#getExchangeRateSources();\n\n // Get unique assetIds for all quote requests\n const assetIds = new Set<CaipAssetType>(\n quoteRequests\n .flatMap((quoteRequest) =>\n [\n getAssetIdsForToken(\n quoteRequest.srcTokenAddress,\n quoteRequest.srcChainId,\n ),\n getAssetIdsForToken(\n quoteRequest.destTokenAddress,\n quoteRequest.destChainId,\n ),\n ].flat(),\n )\n .filter(\n (assetId: CaipAssetType | undefined): assetId is CaipAssetType =>\n !selectIsAssetExchangeRateInState(exchangeRateSources, assetId),\n ),\n );\n\n const currency = this.#getUseAssetsControllerForRates()\n ? this.messenger.call('AssetsController:getExchangeRatesForBridge')\n .currentCurrency\n : this.messenger.call('CurrencyRateController:getState').currentCurrency;\n\n if (assetIds.size === 0) {\n return;\n }\n\n const pricesByAssetId = await fetchAssetPrices({\n assetIds,\n currencies: new Set([currency]),\n clientId: this.#clientId,\n clientVersion: this.#clientVersion,\n fetchFn: this.#fetchFn,\n signal: this.#abortController?.signal,\n });\n const exchangeRates = toExchangeRates(currency, pricesByAssetId);\n this.update((state) => {\n state.assetExchangeRates = {\n ...state.assetExchangeRates,\n ...exchangeRates,\n };\n });\n };\n\n readonly #hasInsufficientBalance = async (\n quoteRequest: GenericQuoteRequest,\n ) => {\n try {\n const srcChainIdInHex = formatChainIdToHex(quoteRequest.srcChainId);\n const provider =\n this.#getNetworkClientByChainId(srcChainIdInHex)?.provider;\n const normalizedSrcTokenAddress = formatAddressToCaipReference(\n quoteRequest.srcTokenAddress,\n );\n\n return !(\n provider &&\n normalizedSrcTokenAddress &&\n quoteRequest.srcTokenAmount &&\n srcChainIdInHex &&\n (await hasSufficientBalance(\n provider,\n quoteRequest.walletAddress,\n normalizedSrcTokenAddress,\n quoteRequest.srcTokenAmount,\n srcChainIdInHex,\n ))\n );\n } catch (error) {\n console.warn('Failed to set insufficientBal', error);\n // Fall back to true so the backend returns quotes\n return true;\n }\n };\n\n readonly #appendInsufficientBalAndResetApproval = async (\n quoteRequest: GenericQuoteRequest,\n ) => {\n const isSrcChainNonEVM = isNonEvmChainId(quoteRequest.srcChainId);\n const providerConfig = isSrcChainNonEVM\n ? undefined\n : this.#getNetworkClientByChainId(\n formatChainIdToHex(quoteRequest.srcChainId),\n )?.configuration;\n\n let insufficientBal: boolean | undefined;\n let resetApproval: boolean = Boolean(quoteRequest.resetApproval);\n if (isSrcChainNonEVM) {\n // If the source chain is not an EVM network, use value from params\n insufficientBal = quoteRequest.insufficientBal;\n } else if (providerConfig?.rpcUrl?.includes('tenderly')) {\n // If the rpcUrl is a tenderly fork (e2e tests), set insufficientBal=true\n // The bridge-api filters out quotes if the balance on mainnet is insufficient so this override allows quotes to always be returned\n insufficientBal = true;\n } else {\n // Set loading status if RPC calls are made before the quotes are fetched\n this.update((state) => {\n state.quotesLoadingStatus = RequestStatus.LOADING;\n });\n resetApproval = await this.#shouldResetApproval(quoteRequest);\n // Otherwise query the src token balance from the RPC provider\n insufficientBal =\n quoteRequest.insufficientBal ??\n (await this.#hasInsufficientBalance(quoteRequest));\n }\n\n return {\n ...quoteRequest,\n insufficientBal,\n resetApproval,\n };\n };\n\n readonly #shouldResetApproval = async (quoteRequest: GenericQuoteRequest) => {\n if (isNonEvmChainId(quoteRequest.srcChainId)) {\n return false;\n }\n try {\n const normalizedSrcTokenAddress = formatAddressToCaipReference(\n quoteRequest.srcTokenAddress,\n );\n if (isEthUsdt(quoteRequest.srcChainId, normalizedSrcTokenAddress)) {\n const allowance = BigNumber.from(\n await this.#getUSDTMainnetAllowance(\n quoteRequest.walletAddress,\n normalizedSrcTokenAddress,\n quoteRequest.destChainId,\n ),\n );\n return allowance.lt(quoteRequest.srcTokenAmount) && allowance.gt(0);\n }\n return false;\n } catch (error) {\n console.warn('Failed to set resetApproval', error);\n // Fall back to true so the backend returns quotes\n return true;\n }\n };\n\n stopPollingForQuotes = (\n reason?: AbortReason,\n context?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived],\n ) => {\n this.stopAllPolling();\n // If polling is stopped before quotes finish loading, track QuotesReceived\n if (this.state.quotesLoadingStatus === RequestStatus.LOADING && context) {\n this.trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.QuotesReceived,\n context,\n );\n }\n // Clears quotes list in state\n this.#abortController?.abort(reason);\n this.#batchSellTradesAbortController?.abort(reason);\n };\n\n /**\n * Sets the location/entry point for the current swap or bridge flow.\n * Call this when the user enters the flow so that all internally-fired\n * events (InputChanged, QuotesRequested, etc.) carry the correct location.\n *\n * @param location - The entry point from which the user initiated the flow\n */\n setLocation = (location: MetaMetricsSwapsEventSource) => {\n this.#location = location;\n };\n\n setInputPrimaryDenomination = (\n inputPrimaryDenomination: InputPrimaryDenomination,\n ) => {\n this.update((state) => {\n state.inputPrimaryDenomination = inputPrimaryDenomination;\n });\n };\n\n resetState = (\n reason = AbortReason.ResetState,\n quoteRequestIndex: number | null = null,\n context?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived],\n ) => {\n this.stopPollingForQuotes(reason, context);\n this.update((state) => {\n // Cannot do direct assignment to state, i.e. state = {... }, need to manually assign each field\n if (quoteRequestIndex === null) {\n // Clear all requests if index is null\n state.quoteRequest = DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest;\n } else {\n // Otherwise only clear the specified request\n state.quoteRequest = state.quoteRequest\n .slice(0, quoteRequestIndex)\n .concat(DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest[0])\n .concat(state.quoteRequest.slice(quoteRequestIndex + 1));\n }\n state.quotesInitialLoadTime =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesInitialLoadTime;\n state.quotes = DEFAULT_BRIDGE_CONTROLLER_STATE.quotes;\n state.quotesLastFetched =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesLastFetched;\n state.quotesLoadingStatus =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesLoadingStatus;\n state.quoteFetchError = DEFAULT_BRIDGE_CONTROLLER_STATE.quoteFetchError;\n state.quotesRefreshCount =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesRefreshCount;\n state.assetExchangeRates =\n DEFAULT_BRIDGE_CONTROLLER_STATE.assetExchangeRates;\n state.minimumBalanceForRentExemptionInLamports =\n DEFAULT_BRIDGE_CONTROLLER_STATE.minimumBalanceForRentExemptionInLamports;\n state.tokenWarnings = DEFAULT_BRIDGE_CONTROLLER_STATE.tokenWarnings;\n state.tokenSecurityTypeDestination =\n DEFAULT_BRIDGE_CONTROLLER_STATE.tokenSecurityTypeDestination;\n state.quoteStreamComplete =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quoteStreamComplete;\n state.batchSellTrades = DEFAULT_BRIDGE_CONTROLLER_STATE.batchSellTrades;\n state.batchSellTradesLoadingStatus =\n DEFAULT_BRIDGE_CONTROLLER_STATE.batchSellTradesLoadingStatus;\n });\n };\n\n /**\n * Sets the interval length based on the source chain\n */\n setChainIntervalLength = () => {\n const { state } = this;\n // Assume that BatchSell quote requests all have the same source chain\n // Use the first one to determine refresh rate\n const { srcChainId } = state.quoteRequest[0];\n const bridgeFeatureFlags = getBridgeFeatureFlags(this.messenger);\n\n const refreshRateOverride = srcChainId\n ? bridgeFeatureFlags.chains[formatChainIdToCaip(srcChainId)]?.refreshRate\n : undefined;\n const defaultRefreshRate = bridgeFeatureFlags.refreshRate;\n this.setIntervalLength(refreshRateOverride ?? defaultRefreshRate);\n };\n\n readonly #fetchBridgeQuotes = async ({\n quoteRequests,\n context,\n }: BridgePollingInput) => {\n this.#abortController?.abort(AbortReason.NewQuoteRequest);\n this.#batchSellTradesAbortController?.abort(AbortReason.NewQuoteRequest);\n\n this.#abortController = new AbortController();\n\n this.#fetchAssetExchangeRates(quoteRequests).catch((error) =>\n console.warn('Failed to fetch asset exchange rates', error),\n );\n\n this.trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.QuotesRequested,\n context,\n );\n\n const { sse, maxRefreshCount } = getBridgeFeatureFlags(this.messenger);\n const shouldStream =\n sse?.enabled &&\n hasMinimumRequiredVersion(this.#clientVersion, sse.minimumVersion);\n const isBatchSellRequest = quoteRequests.length > 1;\n\n this.update((state) => {\n state.quoteFetchError = DEFAULT_BRIDGE_CONTROLLER_STATE.quoteFetchError;\n state.tokenWarnings = DEFAULT_BRIDGE_CONTROLLER_STATE.tokenWarnings;\n state.quoteStreamComplete =\n DEFAULT_BRIDGE_CONTROLLER_STATE.quoteStreamComplete;\n state.quotesLastFetched = Date.now();\n state.quotesLoadingStatus = RequestStatus.LOADING;\n // Prevent clients from displaying stale batch sell fees\n if (quoteRequests.length > 1) {\n state.batchSellTradesLoadingStatus = RequestStatus.LOADING;\n state.batchSellTrades = DEFAULT_BRIDGE_CONTROLLER_STATE.batchSellTrades;\n }\n });\n\n const jwt = await this.#getJwt();\n\n try {\n const [firstQuoteRequest] = quoteRequests;\n\n const unifiedSwapTraceName = isCrossChain(\n firstQuoteRequest.srcChainId,\n firstQuoteRequest.destChainId,\n )\n ? TraceName.BridgeQuotesFetched\n : TraceName.SwapQuotesFetched;\n\n await this.#trace(\n {\n name: isBatchSellRequest\n ? TraceName.BatchSellQuotesFetched\n : unifiedSwapTraceName,\n data: {\n srcChainId: formatChainIdToCaip(firstQuoteRequest.srcChainId),\n destChainId: formatChainIdToCaip(firstQuoteRequest.destChainId),\n },\n },\n async () => {\n const selectedAccount = this.#getMultichainSelectedAccount(\n firstQuoteRequest.walletAddress,\n );\n // This call is not awaited to prevent blocking quote fetching if the snap takes too long to respond\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#setMinimumBalanceForRentExemptionInLamports(\n firstQuoteRequest.srcChainId,\n selectedAccount?.metadata?.snap?.id,\n );\n // Use SSE if enabled and return early\n if (shouldStream || isBatchSellRequest) {\n await this.#handleQuoteStreaming(\n quoteRequests,\n context.feature_id,\n jwt,\n selectedAccount,\n );\n return;\n }\n // Otherwise use regular fetch\n const quotes = await this.fetchQuotes(\n firstQuoteRequest,\n context.feature_id,\n this.#abortController?.signal,\n );\n this.update((state) => {\n // Set the initial load time if this is the first fetch\n if (\n state.quotesRefreshCount ===\n DEFAULT_BRIDGE_CONTROLLER_STATE.quotesRefreshCount &&\n this.#quotesFirstFetched\n ) {\n state.quotesInitialLoadTime =\n Date.now() - this.#quotesFirstFetched;\n }\n state.quotes = quotes;\n state.quotesLoadingStatus = RequestStatus.FETCHED;\n });\n },\n );\n } catch (error) {\n // Reset the quotes list if the fetch fails to avoid showing stale quotes\n this.update((state) => {\n state.quotes = DEFAULT_BRIDGE_CONTROLLER_STATE.quotes;\n });\n // Ignore abort errors\n if (\n (error as Error).toString().includes('AbortError') ||\n (error as Error).toString().includes('FetchRequestCanceledException') ||\n [\n AbortReason.ResetState,\n AbortReason.NewQuoteRequest,\n AbortReason.QuoteRequestUpdated,\n AbortReason.TransactionSubmitted,\n ].includes(error as AbortReason)\n ) {\n // Exit the function early to prevent other state updates\n return;\n }\n\n // Update loading status and error message\n this.update((state) => {\n // The error object reference is not guaranteed to exist on mobile so reading\n // the message directly could cause an error.\n let errorMessage;\n try {\n errorMessage =\n (error as Error)?.message ?? (error as Error).toString();\n } catch {\n // Intentionally empty\n } finally {\n state.quoteFetchError = errorMessage ?? 'Unknown error';\n }\n state.quotesLoadingStatus = RequestStatus.ERROR;\n });\n // Track event and log error\n this.trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.QuotesError,\n context,\n );\n console.log(\n `Failed to ${shouldStream ? 'stream' : 'fetch'} bridge quotes`,\n error,\n );\n }\n\n // Update refresh count after fetching, validation and fee calculation have completed\n this.update((state) => {\n state.quotesRefreshCount += 1;\n });\n const hasNoFundedQuoteRequests = quoteRequests.every(\n ({ insufficientBal }) => Boolean(insufficientBal),\n );\n\n if (\n hasNoFundedQuoteRequests\n ? // If all quote requests are insufficiently funded, stop polling\n // So if a BatchSell has at least 1 sufficiently funded quote request, polling continues\n true\n : // Otherwise continue polling until the maximum number of refreshes has been reached\n this.state.quotesRefreshCount >= maxRefreshCount\n ) {\n this.stopAllPolling();\n }\n };\n\n readonly #handleQuoteStreaming = async (\n quoteRequests: GenericQuoteRequest[],\n featureId: FeatureId,\n jwt?: string,\n selectedAccount?: InternalAccount,\n ) => {\n /**\n * Tracks the number of valid quotes received from the current stream, which is used\n * to determine when to clear the quotes list and set the initial load time\n */\n let validQuotesCounter = 0;\n /**\n * Tracks all pending promises from appendFeesToQuotes calls to ensure they complete\n * before setting quotesLoadingStatus to FETCHED\n */\n const pendingFeeAppendPromises = new Set<Promise<void>>();\n\n await fetchBridgeQuoteStream(\n this.#fetchFn,\n quoteRequests,\n this.#abortController?.signal,\n featureId,\n this.#clientId,\n jwt,\n this.#config.customBridgeApiBaseUrl ?? BRIDGE_PROD_API_BASE_URL,\n {\n onQuoteValidationFailure: (validationFailures) =>\n this.#trackQuoteValidationFailures(validationFailures, featureId),\n onValidQuoteReceived: async (quote: QuoteResponseV1) => {\n const feeAppendPromise = (async () => {\n const quotesWithFees = await appendFeesToQuotes(\n [quote],\n this.messenger,\n this.#getLayer1GasFee,\n selectedAccount,\n );\n if (quotesWithFees.length > 0) {\n validQuotesCounter += 1;\n }\n this.update((state) => {\n // Clear previous quotes and quotes load time when first quote in the current\n // polling loop is received\n // This enables clients to continue showing the previous quotes while new\n // quotes are loading\n // Note: If there are no valid quotes until the 2nd fetch, quotesInitialLoadTime will be > refreshRate\n if (validQuotesCounter === 1) {\n state.quotes = DEFAULT_BRIDGE_CONTROLLER_STATE.quotes;\n if (!state.quotesInitialLoadTime && this.#quotesFirstFetched) {\n // Set the initial load time after the first quote is received\n state.quotesInitialLoadTime =\n Date.now() - this.#quotesFirstFetched;\n }\n }\n state.quotes = [...state.quotes, ...quotesWithFees];\n });\n })();\n pendingFeeAppendPromises.add(feeAppendPromise);\n feeAppendPromise\n .catch((error) => {\n // Catch errors to prevent them from breaking stream processing\n // If appendFeesToQuotes throws, the state update never happens, so no invalid entry is added\n console.error('Error appending fees to quote', error);\n })\n .finally(() => {\n pendingFeeAppendPromises.delete(feeAppendPromise);\n });\n // Await the promise to ensure errors are caught and handled before continuing\n // The promise is also tracked in pendingFeeAppendPromises for onClose to wait for\n await feeAppendPromise;\n },\n onTokenWarning: (warning) => {\n this.update((state) => {\n const isDuplicate = state.tokenWarnings.some(\n (existing) => existing.feature_id === warning.feature_id,\n );\n if (!isDuplicate) {\n state.tokenWarnings = [...state.tokenWarnings, warning];\n }\n });\n },\n onComplete: (data) => {\n this.update((state) => {\n state.quoteStreamComplete = data;\n });\n },\n onClose: async () => {\n // Wait for all pending appendFeesToQuotes operations to complete\n // before setting quotesLoadingStatus to FETCHED\n await Promise.allSettled(Array.from(pendingFeeAppendPromises));\n this.update((state) => {\n // If there are no valid quotes in the current stream, clear the quotes list\n // to remove quotes from the previous stream\n if (validQuotesCounter === 0) {\n state.quotes = DEFAULT_BRIDGE_CONTROLLER_STATE.quotes;\n }\n state.quotesLoadingStatus = RequestStatus.FETCHED;\n });\n },\n },\n this.#clientVersion,\n );\n };\n\n readonly #setMinimumBalanceForRentExemptionInLamports = async (\n srcChainId: GenericQuoteRequest['srcChainId'],\n snapId?: string,\n ) => {\n if (!isSolanaChainId(srcChainId) || !snapId) {\n return;\n }\n const minimumBalanceForRentExemptionInLamports =\n await getMinimumBalanceForRentExemptionInLamports(snapId, this.messenger);\n this.update((state) => {\n state.minimumBalanceForRentExemptionInLamports =\n minimumBalanceForRentExemptionInLamports;\n });\n };\n\n #getMultichainSelectedAccount(\n walletAddress?: GenericQuoteRequest['walletAddress'],\n ) {\n // Assume that all quotes in a batch are for the same account\n const addressToUse =\n walletAddress ?? this.state.quoteRequest[0].walletAddress;\n if (!addressToUse) {\n throw new Error('Account address is required');\n }\n const selectedAccount = this.messenger.call(\n 'AccountsController:getAccountByAddress',\n addressToUse,\n );\n return selectedAccount;\n }\n\n #getNetworkClientByChainId(chainId: Hex) {\n const networkClientId = this.messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n if (!networkClientId) {\n throw new Error(`No network client found for chainId: ${chainId}`);\n }\n const networkClient = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n return networkClient;\n }\n\n readonly #getJwt = async (): Promise<string | undefined> => {\n try {\n const token = await this.messenger.call(\n 'AuthenticationController:getBearerToken',\n );\n return token;\n } catch (error) {\n console.error('Error getting JWT token for bridge-api request', error);\n return undefined;\n }\n };\n\n readonly #getRequestMetadata = (\n quoteRequestIndex: number = 0,\n ): Omit<\n RequestMetadata,\n 'stx_enabled' | 'usd_amount_source' | 'security_warnings'\n > => {\n const quoteRequest = this.state.quoteRequest[quoteRequestIndex];\n const { walletAddress } = quoteRequest;\n const accountHardwareType = getAccountHardwareType(\n walletAddress\n ? this.#getMultichainSelectedAccount(walletAddress)\n : undefined,\n );\n\n return {\n slippage_limit: quoteRequest.slippage,\n swap_type: getSwapTypeFromQuote(quoteRequest),\n custom_slippage: isCustomSlippage(quoteRequest.slippage),\n account_hardware_type: accountHardwareType,\n is_hardware_wallet: accountHardwareType !== null,\n };\n };\n\n readonly #getQuoteFetchData = (): Omit<\n QuoteFetchData,\n 'best_quote_provider' | 'price_impact' | 'can_submit'\n > => {\n return {\n quotes_count: this.state.quotes.length,\n quotes_list: this.state.quotes.map(({ quote }) =>\n formatProviderLabel(quote),\n ),\n initial_load_time_all_quotes: this.state.quotesInitialLoadTime ?? 0,\n has_gas_included_quote: this.state.quotes.some(\n ({ quote }) => quote.gasIncluded,\n ),\n };\n };\n\n readonly #getEventProperties = <\n EventName extends\n (typeof UnifiedSwapBridgeEventName)[keyof typeof UnifiedSwapBridgeEventName],\n >(\n eventName: EventName,\n propertiesFromClient: Pick<\n RequiredEventContextFromClient,\n EventName\n >[EventName],\n quoteRequestIndex: number = 0,\n ): CrossChainSwapsEventProperties<EventName> => {\n const clientProps = propertiesFromClient as Record<string, unknown>;\n const baseProperties = {\n ...propertiesFromClient,\n location: clientProps?.location ?? this.#location,\n action_type: MetricsActionType.SWAPBRIDGE_V1,\n };\n const inputPrimaryDenominationProperties = {\n input_primary_denomination: this.state.inputPrimaryDenomination,\n };\n const quoteRequest = this.state.quoteRequest[quoteRequestIndex];\n switch (eventName) {\n case UnifiedSwapBridgeEventName.ButtonClicked:\n return {\n ...getRequestParams(\n quoteRequest,\n this.state.tokenSecurityTypeDestination,\n ),\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.PageViewed:\n return {\n ...getRequestParams(\n quoteRequest,\n this.state.tokenSecurityTypeDestination,\n ),\n ...this.#getRequestMetadata(),\n ...inputPrimaryDenominationProperties,\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.FiatCryptoToggleClicked:\n return {\n ...getRequestParams(\n quoteRequest,\n this.state.tokenSecurityTypeDestination,\n ),\n swap_type: getSwapTypeFromQuote(quoteRequest),\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.QuotesValidationFailed:\n return {\n ...getRequestParams(\n quoteRequest,\n this.state.tokenSecurityTypeDestination,\n ),\n refresh_count: this.state.quotesRefreshCount,\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.QuotesReceived:\n return {\n ...getRequestParams(\n quoteRequest,\n this.state.tokenSecurityTypeDestination,\n ),\n ...this.#getRequestMetadata(),\n ...this.#getQuoteFetchData(),\n refresh_count: this.state.quotesRefreshCount,\n ...inputPrimaryDenominationProperties,\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.QuotesRequested:\n return {\n ...getRequestParams(\n quoteRequest,\n this.state.tokenSecurityTypeDestination,\n ),\n ...this.#getRequestMetadata(),\n has_sufficient_funds: !quoteRequest.insufficientBal,\n ...inputPrimaryDenominationProperties,\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.QuotesError:\n return {\n ...getRequestParams(\n quoteRequest,\n this.state.tokenSecurityTypeDestination,\n ),\n ...this.#getRequestMetadata(),\n error_message: this.state.quoteFetchError,\n has_sufficient_funds: !quoteRequest.insufficientBal,\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.AllQuotesOpened:\n case UnifiedSwapBridgeEventName.AllQuotesSorted:\n case UnifiedSwapBridgeEventName.QuoteSelected:\n return {\n ...getRequestParams(\n quoteRequest,\n this.state.tokenSecurityTypeDestination,\n ),\n ...this.#getRequestMetadata(),\n ...this.#getQuoteFetchData(),\n ...baseProperties,\n };\n case UnifiedSwapBridgeEventName.Failed: {\n // Populate the properties that the error occurred before the tx was submitted\n return {\n ...baseProperties,\n ...getRequestParams(\n quoteRequest,\n this.state.tokenSecurityTypeDestination,\n ),\n ...this.#getRequestMetadata(),\n ...this.#getQuoteFetchData(),\n ...propertiesFromClient,\n };\n }\n case UnifiedSwapBridgeEventName.AssetDetailTooltipClicked:\n case UnifiedSwapBridgeEventName.AssetPickerOpened:\n return baseProperties;\n // Inject `token_security_type_destination` from controller state so the\n // field is always present on this event. `baseProperties` (which spreads\n // `propertiesFromClient`) wins if the client supplies a value explicitly.\n case UnifiedSwapBridgeEventName.InputSourceDestinationSwitched:\n return {\n token_security_type_destination:\n this.state.tokenSecurityTypeDestination,\n ...baseProperties,\n };\n // These events may be published after the bridge-controller state is reset\n // So the BridgeStatusController populates all the properties\n case UnifiedSwapBridgeEventName.Submitted:\n case UnifiedSwapBridgeEventName.Completed:\n return propertiesFromClient;\n case UnifiedSwapBridgeEventName.InputChanged:\n return {\n ...inputPrimaryDenominationProperties,\n ...baseProperties,\n };\n default:\n return baseProperties;\n }\n };\n\n readonly #trackInputChangedEvents = (\n paramsToUpdate: Partial<GenericQuoteRequest>,\n featureId: FeatureId,\n quoteRequestIndex: number = 0,\n ) => {\n Object.entries(paramsToUpdate).forEach(([key, value]) => {\n const inputKey = toInputChangedPropertyKey[key as keyof QuoteRequest];\n const inputValue =\n toInputChangedPropertyValue[key as keyof QuoteRequest]?.(\n paramsToUpdate,\n );\n if (\n inputKey &&\n inputValue !== undefined &&\n this.state.quoteRequest[quoteRequestIndex] &&\n value !==\n this.state.quoteRequest[quoteRequestIndex][\n key as keyof GenericQuoteRequest\n ]\n ) {\n this.trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.InputChanged,\n {\n input: inputKey,\n input_value: inputValue,\n location: this.#location,\n feature_id: featureId,\n },\n );\n }\n });\n };\n\n /**\n * This method tracks cross-chain swaps events\n *\n * @param eventName - The name of the event to track\n * @param propertiesFromClient - Properties that can't be calculated from the event name and need to be provided by the client\n * @param quoteRequestIndex - The index of the quote request to track the event for\n * @example\n * this.trackUnifiedSwapBridgeEvent(UnifiedSwapBridgeEventName.ActionOpened, {\n * location: MetaMetricsSwapsEventSource.MainView,\n * });\n */\n trackUnifiedSwapBridgeEvent = <\n EventName extends\n (typeof UnifiedSwapBridgeEventName)[keyof typeof UnifiedSwapBridgeEventName],\n >(\n eventName: EventName,\n propertiesFromClient: Pick<\n RequiredEventContextFromClient,\n EventName\n >[EventName],\n quoteRequestIndex: number = 0,\n ) => {\n try {\n const combinedPropertiesForEvent = this.#getEventProperties<EventName>(\n eventName,\n propertiesFromClient,\n quoteRequestIndex,\n );\n\n this.#trackMetaMetricsFn(eventName, combinedPropertiesForEvent);\n } catch (error) {\n console.error(\n `Error tracking cross-chain swaps MetaMetrics event ${eventName}`,\n error,\n );\n }\n };\n\n /**\n *\n * @param walletAddress - The address of the account to get the allowance for\n * @param contractAddress - The address of the ERC20 token contract on mainnet\n * @param destinationChainId - The chain ID of the destination network\n * @returns The atomic allowance of the ERC20 token contract\n */\n readonly #getUSDTMainnetAllowance = async (\n walletAddress: string,\n contractAddress: string,\n destinationChainId: GenericQuoteRequest['destChainId'],\n ): Promise<string> => {\n const networkClient = this.#getNetworkClientByChainId(CHAIN_IDS.MAINNET);\n const provider = networkClient?.provider;\n if (!provider) {\n throw new Error('No provider found');\n }\n\n const ethersProvider = new Web3Provider(provider);\n const contract = new Contract(contractAddress, abiERC20, ethersProvider);\n const spenderAddress = isCrossChain(CHAIN_IDS.MAINNET, destinationChainId)\n ? METABRIDGE_ETHEREUM_ADDRESS\n : SWAPS_CONTRACT_ADDRESSES[CHAIN_IDS.MAINNET];\n const allowance: BigNumber = await contract.allowance(\n walletAddress,\n spenderAddress,\n );\n return allowance.toString();\n };\n}\n"]}
@@ -82,6 +82,7 @@ exports.DEFAULT_BRIDGE_CONTROLLER_STATE = {
82
82
  minimumBalanceForRentExemptionInLamports: '0',
83
83
  tokenWarnings: [],
84
84
  tokenSecurityTypeDestination: null,
85
+ inputPrimaryDenomination: 'token_amount',
85
86
  quoteStreamComplete: null,
86
87
  batchSellTrades: null,
87
88
  batchSellTradesLoadingStatus: null,
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.cjs","sourceRoot":"","sources":["../../src/constants/bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import { AddressZero } from '@ethersproject/constants';\nimport { BtcScope, SolScope, TrxScope } from '@metamask/keyring-api';\nimport type { Hex } from '@metamask/utils';\n\nimport type {\n BridgeControllerState,\n FeatureFlagsPlatformConfig,\n} from '../types';\nimport { CHAIN_IDS } from './chains';\n\nexport const ALLOWED_BRIDGE_CHAIN_IDS = [\n CHAIN_IDS.MAINNET,\n CHAIN_IDS.BSC,\n CHAIN_IDS.POLYGON,\n CHAIN_IDS.ZKSYNC_ERA,\n CHAIN_IDS.AVALANCHE,\n CHAIN_IDS.OPTIMISM,\n CHAIN_IDS.ARBITRUM,\n CHAIN_IDS.LINEA_MAINNET,\n CHAIN_IDS.BASE,\n CHAIN_IDS.SEI,\n CHAIN_IDS.MONAD,\n CHAIN_IDS.HYPEREVM,\n CHAIN_IDS.MEGAETH,\n CHAIN_IDS.ARC,\n SolScope.Mainnet,\n BtcScope.Mainnet,\n TrxScope.Mainnet,\n] as const;\n\nexport type AllowedBridgeChainIds = (typeof ALLOWED_BRIDGE_CHAIN_IDS)[number];\n\nexport const BRIDGE_DEV_API_BASE_URL = 'https://bridge.dev-api.cx.metamask.io';\nexport const BRIDGE_PROD_API_BASE_URL = 'https://bridge.api.cx.metamask.io';\n\nexport enum BridgeClientId {\n EXTENSION = 'extension',\n MOBILE = 'mobile',\n}\n\nexport const ETH_USDT_ADDRESS = '0xdac17f958d2ee523a2206206994597c13d831ec7';\nexport const METABRIDGE_ETHEREUM_ADDRESS =\n '0x0439e60F02a8900a951603950d8D4527f400C3f1';\nexport const BRIDGE_QUOTE_MAX_ETA_SECONDS = 60 * 60; // 1 hour\nexport const BRIDGE_QUOTE_MAX_RETURN_DIFFERENCE_PERCENTAGE = 0.5; // if a quote returns in x times less return than the best quote, ignore it\n\nexport const BRIDGE_PREFERRED_GAS_ESTIMATE = 'medium';\nexport const BRIDGE_MM_FEE_RATE = 0.875;\nexport const REFRESH_INTERVAL_MS = 30 * 1000;\nexport const DEFAULT_MAX_REFRESH_COUNT = 5;\n\nexport const BRIDGE_CONTROLLER_NAME = 'BridgeController';\n\nexport const DEFAULT_CHAIN_RANKING = [\n { chainId: 'eip155:1', name: 'Ethereum' },\n { chainId: 'eip155:56', name: 'BNB' },\n { chainId: 'bip122:000000000019d6689c085ae165831e93', name: 'BTC' },\n { chainId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', name: 'Solana' },\n { chainId: 'tron:728126428', name: 'Tron' },\n { chainId: 'eip155:8453', name: 'Base' },\n { chainId: 'eip155:42161', name: 'Arbitrum' },\n { chainId: 'eip155:59144', name: 'Linea' },\n { chainId: 'eip155:137', name: 'Polygon' },\n { chainId: 'eip155:43114', name: 'Avalanche' },\n { chainId: 'eip155:10', name: 'Optimism' },\n { chainId: 'eip155:143', name: 'Monad' },\n { chainId: 'eip155:1329', name: 'Sei' },\n { chainId: 'eip155:999', name: 'HyperEVM' },\n { chainId: 'eip155:4326', name: 'MegaETH' },\n { chainId: 'eip155:5042', name: 'Arc' },\n { chainId: 'eip155:324', name: 'zkSync' },\n] as const;\n\nexport const DEFAULT_FEATURE_FLAG_CONFIG: FeatureFlagsPlatformConfig = {\n minimumVersion: '0.0.0',\n refreshRate: REFRESH_INTERVAL_MS,\n maxRefreshCount: DEFAULT_MAX_REFRESH_COUNT,\n support: false,\n chains: {},\n chainRanking: [...DEFAULT_CHAIN_RANKING],\n};\n\nexport const DEFAULT_BRIDGE_CONTROLLER_STATE: BridgeControllerState = {\n quoteRequest: [\n {\n srcTokenAddress: AddressZero,\n },\n ],\n quotesInitialLoadTime: null,\n quotes: [],\n quotesLastFetched: null,\n quotesLoadingStatus: null,\n quoteFetchError: null,\n quotesRefreshCount: 0,\n assetExchangeRates: {},\n minimumBalanceForRentExemptionInLamports: '0',\n tokenWarnings: [],\n tokenSecurityTypeDestination: null,\n quoteStreamComplete: null,\n batchSellTrades: null,\n batchSellTradesLoadingStatus: null,\n};\n\nexport const METABRIDGE_CHAIN_TO_ADDRESS_MAP: Record<Hex, string> = {\n [CHAIN_IDS.MAINNET]: METABRIDGE_ETHEREUM_ADDRESS,\n};\n"]}
1
+ {"version":3,"file":"bridge.cjs","sourceRoot":"","sources":["../../src/constants/bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import { AddressZero } from '@ethersproject/constants';\nimport { BtcScope, SolScope, TrxScope } from '@metamask/keyring-api';\nimport type { Hex } from '@metamask/utils';\n\nimport type {\n BridgeControllerState,\n FeatureFlagsPlatformConfig,\n} from '../types';\nimport { CHAIN_IDS } from './chains';\n\nexport const ALLOWED_BRIDGE_CHAIN_IDS = [\n CHAIN_IDS.MAINNET,\n CHAIN_IDS.BSC,\n CHAIN_IDS.POLYGON,\n CHAIN_IDS.ZKSYNC_ERA,\n CHAIN_IDS.AVALANCHE,\n CHAIN_IDS.OPTIMISM,\n CHAIN_IDS.ARBITRUM,\n CHAIN_IDS.LINEA_MAINNET,\n CHAIN_IDS.BASE,\n CHAIN_IDS.SEI,\n CHAIN_IDS.MONAD,\n CHAIN_IDS.HYPEREVM,\n CHAIN_IDS.MEGAETH,\n CHAIN_IDS.ARC,\n SolScope.Mainnet,\n BtcScope.Mainnet,\n TrxScope.Mainnet,\n] as const;\n\nexport type AllowedBridgeChainIds = (typeof ALLOWED_BRIDGE_CHAIN_IDS)[number];\n\nexport const BRIDGE_DEV_API_BASE_URL = 'https://bridge.dev-api.cx.metamask.io';\nexport const BRIDGE_PROD_API_BASE_URL = 'https://bridge.api.cx.metamask.io';\n\nexport enum BridgeClientId {\n EXTENSION = 'extension',\n MOBILE = 'mobile',\n}\n\nexport const ETH_USDT_ADDRESS = '0xdac17f958d2ee523a2206206994597c13d831ec7';\nexport const METABRIDGE_ETHEREUM_ADDRESS =\n '0x0439e60F02a8900a951603950d8D4527f400C3f1';\nexport const BRIDGE_QUOTE_MAX_ETA_SECONDS = 60 * 60; // 1 hour\nexport const BRIDGE_QUOTE_MAX_RETURN_DIFFERENCE_PERCENTAGE = 0.5; // if a quote returns in x times less return than the best quote, ignore it\n\nexport const BRIDGE_PREFERRED_GAS_ESTIMATE = 'medium';\nexport const BRIDGE_MM_FEE_RATE = 0.875;\nexport const REFRESH_INTERVAL_MS = 30 * 1000;\nexport const DEFAULT_MAX_REFRESH_COUNT = 5;\n\nexport const BRIDGE_CONTROLLER_NAME = 'BridgeController';\n\nexport const DEFAULT_CHAIN_RANKING = [\n { chainId: 'eip155:1', name: 'Ethereum' },\n { chainId: 'eip155:56', name: 'BNB' },\n { chainId: 'bip122:000000000019d6689c085ae165831e93', name: 'BTC' },\n { chainId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', name: 'Solana' },\n { chainId: 'tron:728126428', name: 'Tron' },\n { chainId: 'eip155:8453', name: 'Base' },\n { chainId: 'eip155:42161', name: 'Arbitrum' },\n { chainId: 'eip155:59144', name: 'Linea' },\n { chainId: 'eip155:137', name: 'Polygon' },\n { chainId: 'eip155:43114', name: 'Avalanche' },\n { chainId: 'eip155:10', name: 'Optimism' },\n { chainId: 'eip155:143', name: 'Monad' },\n { chainId: 'eip155:1329', name: 'Sei' },\n { chainId: 'eip155:999', name: 'HyperEVM' },\n { chainId: 'eip155:4326', name: 'MegaETH' },\n { chainId: 'eip155:5042', name: 'Arc' },\n { chainId: 'eip155:324', name: 'zkSync' },\n] as const;\n\nexport const DEFAULT_FEATURE_FLAG_CONFIG: FeatureFlagsPlatformConfig = {\n minimumVersion: '0.0.0',\n refreshRate: REFRESH_INTERVAL_MS,\n maxRefreshCount: DEFAULT_MAX_REFRESH_COUNT,\n support: false,\n chains: {},\n chainRanking: [...DEFAULT_CHAIN_RANKING],\n};\n\nexport const DEFAULT_BRIDGE_CONTROLLER_STATE: BridgeControllerState = {\n quoteRequest: [\n {\n srcTokenAddress: AddressZero,\n },\n ],\n quotesInitialLoadTime: null,\n quotes: [],\n quotesLastFetched: null,\n quotesLoadingStatus: null,\n quoteFetchError: null,\n quotesRefreshCount: 0,\n assetExchangeRates: {},\n minimumBalanceForRentExemptionInLamports: '0',\n tokenWarnings: [],\n tokenSecurityTypeDestination: null,\n inputPrimaryDenomination: 'token_amount',\n quoteStreamComplete: null,\n batchSellTrades: null,\n batchSellTradesLoadingStatus: null,\n};\n\nexport const METABRIDGE_CHAIN_TO_ADDRESS_MAP: Record<Hex, string> = {\n [CHAIN_IDS.MAINNET]: METABRIDGE_ETHEREUM_ADDRESS,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.cts","sourceRoot":"","sources":["../../src/constants/bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,8BAA8B;AACrE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EACV,qBAAqB,EACrB,0BAA0B,EAC3B,qBAAiB;AAGlB,eAAO,MAAM,wBAAwB,8LAkB3B,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9E,eAAO,MAAM,uBAAuB,0CAA0C,CAAC;AAC/E,eAAO,MAAM,wBAAwB,sCAAsC,CAAC;AAE5E,oBAAY,cAAc;IACxB,SAAS,cAAc;IACvB,MAAM,WAAW;CAClB;AAED,eAAO,MAAM,gBAAgB,+CAA+C,CAAC;AAC7E,eAAO,MAAM,2BAA2B,+CACM,CAAC;AAC/C,eAAO,MAAM,4BAA4B,QAAU,CAAC;AACpD,eAAO,MAAM,6CAA6C,MAAM,CAAC;AAEjE,eAAO,MAAM,6BAA6B,WAAW,CAAC;AACtD,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AACxC,eAAO,MAAM,mBAAmB,QAAY,CAAC;AAC7C,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AAEzD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBxB,CAAC;AAEX,eAAO,MAAM,2BAA2B,EAAE,0BAOzC,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,qBAmB7C,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAE/D,CAAC"}
1
+ {"version":3,"file":"bridge.d.cts","sourceRoot":"","sources":["../../src/constants/bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,8BAA8B;AACrE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EACV,qBAAqB,EACrB,0BAA0B,EAC3B,qBAAiB;AAGlB,eAAO,MAAM,wBAAwB,8LAkB3B,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9E,eAAO,MAAM,uBAAuB,0CAA0C,CAAC;AAC/E,eAAO,MAAM,wBAAwB,sCAAsC,CAAC;AAE5E,oBAAY,cAAc;IACxB,SAAS,cAAc;IACvB,MAAM,WAAW;CAClB;AAED,eAAO,MAAM,gBAAgB,+CAA+C,CAAC;AAC7E,eAAO,MAAM,2BAA2B,+CACM,CAAC;AAC/C,eAAO,MAAM,4BAA4B,QAAU,CAAC;AACpD,eAAO,MAAM,6CAA6C,MAAM,CAAC;AAEjE,eAAO,MAAM,6BAA6B,WAAW,CAAC;AACtD,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AACxC,eAAO,MAAM,mBAAmB,QAAY,CAAC;AAC7C,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AAEzD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBxB,CAAC;AAEX,eAAO,MAAM,2BAA2B,EAAE,0BAOzC,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,qBAoB7C,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAE/D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.mts","sourceRoot":"","sources":["../../src/constants/bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,8BAA8B;AACrE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EACV,qBAAqB,EACrB,0BAA0B,EAC3B,qBAAiB;AAGlB,eAAO,MAAM,wBAAwB,8LAkB3B,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9E,eAAO,MAAM,uBAAuB,0CAA0C,CAAC;AAC/E,eAAO,MAAM,wBAAwB,sCAAsC,CAAC;AAE5E,oBAAY,cAAc;IACxB,SAAS,cAAc;IACvB,MAAM,WAAW;CAClB;AAED,eAAO,MAAM,gBAAgB,+CAA+C,CAAC;AAC7E,eAAO,MAAM,2BAA2B,+CACM,CAAC;AAC/C,eAAO,MAAM,4BAA4B,QAAU,CAAC;AACpD,eAAO,MAAM,6CAA6C,MAAM,CAAC;AAEjE,eAAO,MAAM,6BAA6B,WAAW,CAAC;AACtD,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AACxC,eAAO,MAAM,mBAAmB,QAAY,CAAC;AAC7C,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AAEzD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBxB,CAAC;AAEX,eAAO,MAAM,2BAA2B,EAAE,0BAOzC,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,qBAmB7C,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAE/D,CAAC"}
1
+ {"version":3,"file":"bridge.d.mts","sourceRoot":"","sources":["../../src/constants/bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,8BAA8B;AACrE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EACV,qBAAqB,EACrB,0BAA0B,EAC3B,qBAAiB;AAGlB,eAAO,MAAM,wBAAwB,8LAkB3B,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9E,eAAO,MAAM,uBAAuB,0CAA0C,CAAC;AAC/E,eAAO,MAAM,wBAAwB,sCAAsC,CAAC;AAE5E,oBAAY,cAAc;IACxB,SAAS,cAAc;IACvB,MAAM,WAAW;CAClB;AAED,eAAO,MAAM,gBAAgB,+CAA+C,CAAC;AAC7E,eAAO,MAAM,2BAA2B,+CACM,CAAC;AAC/C,eAAO,MAAM,4BAA4B,QAAU,CAAC;AACpD,eAAO,MAAM,6CAA6C,MAAM,CAAC;AAEjE,eAAO,MAAM,6BAA6B,WAAW,CAAC;AACtD,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AACxC,eAAO,MAAM,mBAAmB,QAAY,CAAC;AAC7C,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AAEzD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBxB,CAAC;AAEX,eAAO,MAAM,2BAA2B,EAAE,0BAOzC,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,qBAoB7C,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAE/D,CAAC"}
@@ -79,6 +79,7 @@ export const DEFAULT_BRIDGE_CONTROLLER_STATE = {
79
79
  minimumBalanceForRentExemptionInLamports: '0',
80
80
  tokenWarnings: [],
81
81
  tokenSecurityTypeDestination: null,
82
+ inputPrimaryDenomination: 'token_amount',
82
83
  quoteStreamComplete: null,
83
84
  batchSellTrades: null,
84
85
  batchSellTradesLoadingStatus: null,