@metamask-previews/bridge-status-controller 72.1.0-preview-138a209ad → 72.2.0-preview-5588db68c

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.
package/CHANGELOG.md CHANGED
@@ -17,6 +17,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
17
17
  - Bump `@metamask/profile-sync-controller` from `^28.1.1` to `^28.2.0` ([#9119](https://github.com/MetaMask/core/pull/9119))
18
18
  - Bump `@metamask/keyring-controller` from `^27.0.0` to `^27.1.0` ([#9129](https://github.com/MetaMask/core/pull/9129))
19
19
 
20
+ ## [72.2.0]
21
+
22
+ ### Added
23
+
24
+ - Add input primary denomination to submitted bridge history and post-submit analytics ([#9147](https://github.com/MetaMask/core/pull/9147))
25
+
26
+ ### Changed
27
+
28
+ - Bump `@metamask/bridge-controller` from `^75.1.1` to `^75.2.0` ([#9147](https://github.com/MetaMask/core/pull/9147))
29
+
20
30
  ## [72.1.0]
21
31
 
22
32
  ### Added
@@ -1290,7 +1300,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1290
1300
 
1291
1301
  - Initial release ([#5317](https://github.com/MetaMask/core/pull/5317))
1292
1302
 
1293
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@72.1.0...HEAD
1303
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@72.2.0...HEAD
1304
+ [72.2.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@72.1.0...@metamask/bridge-status-controller@72.2.0
1294
1305
  [72.1.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@72.0.3...@metamask/bridge-status-controller@72.1.0
1295
1306
  [72.0.3]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@72.0.2...@metamask/bridge-status-controller@72.0.3
1296
1307
  [72.0.2]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@72.0.1...@metamask/bridge-status-controller@72.0.2
@@ -587,10 +587,11 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
587
587
  * @param activeAbTests - New A/B test context for `active_ab_tests` (migration target). Attributes events to specific experiments.
588
588
  * @param tokenSecurityTypeDestination - The security classification of the destination token, supplied by the client (e.g. from token security/scanning data). Pass `null` when no security data is available.
589
589
  * @param batchSellTrades - Contains transaction data for the quotes, provided by the obtainGaslessBatch API
590
+ * @param inputPrimaryDenomination - The denomination shown as the primary source amount input at submission time.
590
591
  * @returns The transaction meta
591
592
  * @throws An error if transaction submission fails before it gets published
592
593
  */
593
- this.submitTx = async (accountAddress, maybeQuoteResponses, isStxEnabled, quotesReceivedContext, location = bridge_controller_2.MetaMetricsSwapsEventSource.MainView, abTests, activeAbTests, tokenSecurityTypeDestination, batchSellTrades) => {
594
+ this.submitTx = async (accountAddress, maybeQuoteResponses, isStxEnabled, quotesReceivedContext, location = bridge_controller_2.MetaMetricsSwapsEventSource.MainView, abTests, activeAbTests, tokenSecurityTypeDestination, batchSellTrades, inputPrimaryDenomination) => {
594
595
  /**
595
596
  * If there are multiple quote responses, we assume that they all originate from the same src chain
596
597
  * and the same account. In this case its safe to use the first quote response's properties for
@@ -620,7 +621,10 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
620
621
  const preConfirmationProperties = (0, metrics_1.getPreConfirmationPropertiesFromQuote)(quoteResponse, isStxEnabled, accountHardwareType, location, abTests, activeAbTests, tokenSecurityTypeDestination, batchSellTrades, batchId);
621
622
  try {
622
623
  // Emit Submitted event after submit button is clicked
623
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Submitted, undefined, preConfirmationProperties);
624
+ __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Submitted, undefined, {
625
+ ...preConfirmationProperties,
626
+ input_primary_denomination: inputPrimaryDenomination ?? 'token_amount',
627
+ });
624
628
  /**
625
629
  * Check if the account is an EIP-7702 delegated account.
626
630
  * Delegated accounts only allow 1 in-flight tx, so approve + swap
@@ -651,6 +655,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
651
655
  abTests,
652
656
  activeAbTests,
653
657
  tokenSecurityTypeDestination,
658
+ inputPrimaryDenomination,
654
659
  }));
655
660
  }
656
661
  catch (error) {
@@ -672,15 +677,16 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
672
677
  * @param params.abTests - Legacy A/B test context for `ab_tests` (backward compatibility)
673
678
  * @param params.activeAbTests - New A/B test context for `active_ab_tests` (migration target). Attributes events to specific experiments.
674
679
  * @param params.tokenSecurityTypeDestination - The security classification of the destination token, supplied by the client (e.g. from token security/scanning data). Pass `null` when no security data is available.
680
+ * @param params.inputPrimaryDenomination - The denomination shown as the primary source amount input at submission time.
675
681
  * @param params.isStxEnabled - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension
676
682
  * @param params.quotesReceivedContext - The context for the QuotesReceived event
677
683
  * @returns A lightweight TransactionMeta-like object for history linking
678
684
  * @throws An error if intent or transaction submission fails before they get published
679
685
  */
680
686
  this.submitIntent = async (params) => {
681
- const { quoteResponse, accountAddress, location, abTests, activeAbTests, tokenSecurityTypeDestination, isStxEnabled = false, quotesReceivedContext, } = params;
687
+ const { quoteResponse, accountAddress, location, abTests, activeAbTests, tokenSecurityTypeDestination, inputPrimaryDenomination, isStxEnabled = false, quotesReceivedContext, } = params;
682
688
  // TODO add metrics context
683
- return await this.submitTx(accountAddress, quoteResponse, isStxEnabled, quotesReceivedContext, location, abTests, activeAbTests, tokenSecurityTypeDestination);
689
+ return await this.submitTx(accountAddress, quoteResponse, isStxEnabled, quotesReceivedContext, location, abTests, activeAbTests, tokenSecurityTypeDestination, undefined, inputPrimaryDenomination);
684
690
  };
685
691
  this.submitBatchSell = async (params) => {
686
692
  /**
@@ -782,6 +788,9 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
782
788
  ...(0, metrics_1.getTxStatusesFromHistory)(historyItem),
783
789
  ...(0, metrics_1.getFinalizedTxProperties)(historyItem, txMeta, approvalTxMeta),
784
790
  ...(0, metrics_1.getPriceImpactFromQuote)(quote),
791
+ ...(eventName === bridge_controller_2.UnifiedSwapBridgeEventName.Completed && {
792
+ input_primary_denomination: historyItem.inputPrimaryDenomination ?? 'token_amount',
793
+ }),
785
794
  };
786
795
  (0, bridge_1.trackMetricsEvent)({
787
796
  messenger: this.messenger,
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-status-controller.cjs","sourceRoot":"","sources":["../src/bridge-status-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StateMetadata } from '@metamask/base-controller';\nimport {\n QuoteMetadata,\n RequiredEventContextFromClient,\n QuoteResponse,\n Trade,\n FeatureId,\n BatchSellTradesResponse,\n} from '@metamask/bridge-controller';\nimport {\n isNonEvmChainId,\n StatusTypes,\n getAccountHardwareType,\n UnifiedSwapBridgeEventName,\n isCrossChain,\n MetricsActionType,\n MetaMetricsSwapsEventSource,\n PollingStatus,\n formatChainIdToHex,\n} from '@metamask/bridge-controller';\nimport type { TraceCallback } from '@metamask/controller-utils';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport {\n TransactionStatus,\n TransactionType,\n TransactionController,\n generateBatchId,\n} from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport { numberToHex } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport { IntentManager } from './bridge-status-controller.intent';\nimport {\n ALLOWED_FEATURE_IDS_FOR_STATUS_EVENTS,\n BRIDGE_PROD_API_BASE_URL,\n BRIDGE_STATUS_CONTROLLER_NAME,\n DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE,\n MAX_ATTEMPTS,\n REFRESH_INTERVAL_MS,\n} from './constants';\nimport executeSubmitStrategy from './strategy';\nimport { SubmitStep } from './strategy/types';\nimport type { SubmitStrategyParams } from './strategy/types';\nimport type {\n BridgeStatusControllerState,\n StartPollingForBridgeTxStatusArgsSerialized,\n FetchFunction,\n BridgeHistoryItem,\n} from './types';\nimport type { BridgeStatusControllerMessenger } from './types';\nimport { BridgeClientId } from './types';\nimport { getAccountByAddress } from './utils/accounts';\nimport { getJwt } from './utils/authentication';\nimport {\n getBatchSellTrades,\n stopPollingForQuotes,\n trackMetricsEvent,\n} from './utils/bridge';\nimport {\n fetchBridgeTxStatus,\n getStatusRequestWithSrcTxHash,\n shouldSkipFetchDueToFetchFailures,\n shouldWaitForFinalBridgeStatus,\n} from './utils/bridge-status';\nimport {\n getInitialHistoryItem,\n getMatchingHistoryEntryForTxMeta,\n rekeyHistoryItemInState,\n shouldPollHistoryItem,\n getMatchingHistoryEntryForApprovalTxMeta,\n} from './utils/history';\nimport {\n getFinalizedTxProperties,\n getPriceImpactFromQuote,\n getRequestMetadataFromHistory,\n getRequestParamFromHistory,\n getTradeDataFromHistory,\n getEVMTxPropertiesFromTransactionMeta,\n getTxStatusesFromHistory,\n getPreConfirmationPropertiesFromQuote,\n} from './utils/metrics';\nimport { getSelectedChainId } from './utils/network';\nimport { getTraceParams } from './utils/trace';\nimport {\n getTransactionMetaById,\n getTransactions,\n checkIsDelegatedAccount,\n isCrossChainTx,\n updateTransactionsInBatch,\n hasNestedSwapTransactions,\n} from './utils/transaction';\n\nconst metadata: StateMetadata<BridgeStatusControllerState> = {\n // We want to persist the bridge status state so that we can show the proper data for the Activity list\n // basically match the behavior of TransactionController\n txHistory: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\n/** The input to start polling for the {@link BridgeStatusController} */\ntype BridgeStatusPollingInput = FetchBridgeTxStatusArgs;\n\ntype SrcTxMetaId = string;\nexport type FetchBridgeTxStatusArgs = {\n bridgeTxMetaId: string;\n};\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'startPollingForBridgeTxStatus',\n 'wipeBridgeStatus',\n 'resetState',\n 'submitTx',\n 'submitIntent',\n 'submitBatchSell',\n 'restartPollingForFailedAttempts',\n 'getBridgeHistoryItemByTxMetaId',\n] as const;\n\nexport class BridgeStatusController extends StaticIntervalPollingController<BridgeStatusPollingInput>()<\n typeof BRIDGE_STATUS_CONTROLLER_NAME,\n BridgeStatusControllerState,\n BridgeStatusControllerMessenger\n> {\n #pollingTokensByTxMetaId: Record<SrcTxMetaId, string> = {};\n\n readonly #intentManager: IntentManager;\n\n readonly #clientId: BridgeClientId;\n\n readonly #fetchFn: FetchFunction;\n\n readonly #config: {\n customBridgeApiBaseUrl: string;\n };\n\n readonly #addTransactionBatchFn: typeof TransactionController.prototype.addTransactionBatch;\n\n readonly #trace: TraceCallback;\n\n constructor({\n messenger,\n state,\n clientId,\n fetchFn,\n addTransactionBatchFn,\n config,\n traceFn,\n }: {\n messenger: BridgeStatusControllerMessenger;\n state?: Partial<BridgeStatusControllerState>;\n clientId: BridgeClientId;\n fetchFn: FetchFunction;\n addTransactionBatchFn: typeof TransactionController.prototype.addTransactionBatch;\n config?: {\n customBridgeApiBaseUrl?: string;\n };\n traceFn?: TraceCallback;\n }) {\n super({\n name: BRIDGE_STATUS_CONTROLLER_NAME,\n metadata,\n messenger,\n // Restore the persisted state\n state: {\n ...DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE,\n ...state,\n },\n });\n\n this.#clientId = clientId;\n this.#fetchFn = fetchFn;\n this.#addTransactionBatchFn = addTransactionBatchFn;\n this.#config = {\n customBridgeApiBaseUrl:\n config?.customBridgeApiBaseUrl ?? BRIDGE_PROD_API_BASE_URL,\n };\n this.#trace = traceFn ?? (((_request, fn) => fn?.()) as TraceCallback);\n this.#intentManager = new IntentManager({\n messenger: this.messenger,\n customBridgeApiBaseUrl: this.#config.customBridgeApiBaseUrl,\n fetchFn: this.#fetchFn,\n });\n\n // Register action handlers\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n // Set interval\n this.setIntervalLength(REFRESH_INTERVAL_MS);\n\n this.messenger.subscribe<\n 'TransactionController:transactionStatusUpdated',\n {\n historyKey?: string;\n historyItem?: BridgeHistoryItem;\n txMeta: TransactionMeta;\n isApprovalTxMeta: boolean;\n }\n >(\n 'TransactionController:transactionStatusUpdated',\n ({ txMeta, historyKey, historyItem, isApprovalTxMeta }) => {\n if (!txMeta) {\n return;\n }\n const { type, status } = txMeta;\n\n // Allow event publishing if the txMeta is a swap/bridge OR if the\n // corresponding history item exists\n const isSwapOrBridgeTransaction = type && isCrossChainTx(type);\n if (!isSwapOrBridgeTransaction && !historyKey && !historyItem) {\n return;\n }\n\n switch (status) {\n case TransactionStatus.confirmed:\n this.#onTransactionConfirmed({\n txMeta,\n historyKey,\n isApprovalTxMeta,\n });\n break;\n case TransactionStatus.failed:\n case TransactionStatus.dropped:\n case TransactionStatus.rejected:\n this.#onTransactionFailed({ txMeta, historyKey, isApprovalTxMeta });\n break;\n default:\n break;\n }\n },\n ({ transactionMeta }) => {\n const entry = getMatchingHistoryEntryForTxMeta(\n this.state.txHistory,\n transactionMeta,\n );\n const approvalEntry = getMatchingHistoryEntryForApprovalTxMeta(\n this.state.txHistory,\n transactionMeta,\n );\n const entryToUse = entry ?? approvalEntry;\n\n return {\n historyKey: entryToUse?.[0],\n historyItem: entryToUse?.[1],\n txMeta: transactionMeta,\n isApprovalTxMeta:\n entryToUse?.[1]?.approvalTxId === transactionMeta.id,\n };\n },\n );\n\n // If you close the extension, but keep the browser open, the polling continues\n // If you close the browser, the polling stops\n // Check for historyItems that do not have a status of complete and restart polling\n this.#restartPollingForIncompleteHistoryItems();\n }\n\n readonly #onTransactionFailed = ({\n txMeta,\n historyKey,\n isApprovalTxMeta,\n }: {\n txMeta: TransactionMeta;\n historyKey?: string;\n isApprovalTxMeta: boolean;\n }): void => {\n // Check if the history item is already marked as a failure\n const isHistoryItemAlreadyFailed = historyKey\n ? this.state.txHistory[historyKey]?.status.status === StatusTypes.FAILED\n : false;\n\n this.#updateHistoryItem({\n historyKey,\n status: StatusTypes.FAILED,\n txHash: isApprovalTxMeta ? undefined : txMeta.hash,\n completionTime: Date.now(),\n });\n\n if (txMeta.status === TransactionStatus.rejected) {\n return;\n }\n\n // Skip tracking if this is a duplicate failed event for the same history item\n // This can happen if the transaction includes an approval tx that fails\n if (isHistoryItemAlreadyFailed) {\n return;\n }\n\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n historyKey,\n getEVMTxPropertiesFromTransactionMeta(txMeta),\n );\n };\n\n // Only EVM txs\n readonly #onTransactionConfirmed = ({\n txMeta,\n historyKey,\n isApprovalTxMeta,\n }: {\n txMeta: TransactionMeta;\n historyKey?: string;\n isApprovalTxMeta: boolean;\n }): void => {\n // Return early if the confirmed txMeta is for an approval since we\n // still need to wait for the trade to be confirmed\n if (isApprovalTxMeta) {\n return;\n }\n\n this.#updateHistoryItem({\n historyKey,\n txHash: txMeta.hash,\n });\n\n const isSwap =\n txMeta.type === TransactionType.swap || hasNestedSwapTransactions(txMeta);\n\n switch (isSwap) {\n case true:\n this.#updateHistoryItem({\n historyKey,\n status: StatusTypes.COMPLETE,\n completionTime: Date.now(),\n });\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n historyKey,\n );\n break;\n default:\n if (historyKey) {\n this.#startPollingForTxId(historyKey);\n }\n break;\n }\n };\n\n resetState = (): void => {\n this.update((state) => {\n state.txHistory = DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.txHistory;\n });\n };\n\n wipeBridgeStatus = ({\n address,\n ignoreNetwork,\n }: {\n address: string;\n ignoreNetwork: boolean;\n }): void => {\n // Wipe all networks for this address\n if (ignoreNetwork) {\n this.update((state) => {\n state.txHistory = DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.txHistory;\n });\n } else {\n const selectedChainId = getSelectedChainId(this.messenger);\n\n this.#wipeBridgeStatusByChainId(address, selectedChainId);\n }\n };\n\n /**\n * Resets the attempts counter for a bridge transaction history item\n * and restarts polling if it was previously stopped due to max attempts\n *\n * @param identifier - Object containing either txMetaId or txHash to identify the history item\n * @param identifier.txMetaId - The transaction meta ID\n * @param identifier.txHash - The transaction hash\n */\n restartPollingForFailedAttempts = (identifier: {\n txMetaId?: string;\n txHash?: string;\n }): void => {\n const { txMetaId, txHash } = identifier;\n\n if (!txMetaId && !txHash) {\n throw new Error('Either txMetaId or txHash must be provided');\n }\n\n // Find the history item by txMetaId or txHash\n let targetTxMetaId: string | undefined;\n\n if (txMetaId) {\n // Direct lookup by txMetaId\n if (this.state.txHistory[txMetaId]) {\n targetTxMetaId = txMetaId;\n }\n } else if (txHash) {\n // Search by txHash in status.srcChain.txHash\n targetTxMetaId = Object.keys(this.state.txHistory).find(\n (id) => this.state.txHistory[id].status.srcChain.txHash === txHash,\n );\n }\n\n if (!targetTxMetaId) {\n throw new Error(\n `No bridge transaction history found for ${\n txMetaId ? `txMetaId: ${txMetaId}` : `txHash: ${txHash}`\n }`,\n );\n }\n\n const historyItem = this.state.txHistory[targetTxMetaId];\n\n // Capture attempts count before resetting for metrics\n const previousAttempts = historyItem.attempts?.counter ?? 0;\n\n // Reset the attempts counter\n this.update((state) => {\n if (targetTxMetaId) {\n state.txHistory[targetTxMetaId].attempts = undefined;\n }\n });\n\n // Restart polling if it was stopped and this tx still needs status updates\n if (shouldPollHistoryItem(historyItem)) {\n // Check if polling was stopped (no active polling token)\n const existingPollingToken =\n this.#pollingTokensByTxMetaId[targetTxMetaId];\n\n if (!existingPollingToken) {\n // Restart polling\n this.#startPollingForTxId(targetTxMetaId);\n\n // Track polling manually restarted event\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.PollingStatusUpdated,\n targetTxMetaId,\n {\n polling_status: PollingStatus.ManuallyRestarted,\n retry_attempts: previousAttempts,\n },\n );\n }\n }\n };\n\n /**\n * Gets a bridge history item from the history by its transaction meta ID\n *\n * @param txMetaId - The transaction meta ID to look up\n * @returns The bridge history item if found, undefined otherwise\n */\n getBridgeHistoryItemByTxMetaId = (\n txMetaId: string,\n ): BridgeHistoryItem | undefined => {\n return this.state.txHistory[txMetaId];\n };\n\n /**\n * Restart polling for txs that are not in a final state\n * This is called during initialization\n */\n readonly #restartPollingForIncompleteHistoryItems = (): void => {\n // Check for historyItems that do not have a status of complete and restart polling\n const { txHistory } = this.state;\n const historyItems = Object.entries(txHistory);\n const incompleteHistoryItems = historyItems\n .filter(\n ([_, historyItem]) =>\n historyItem.status.status === StatusTypes.PENDING ||\n historyItem.status.status === StatusTypes.UNKNOWN,\n )\n // Only poll items with txMetaId (post-submission items)\n .filter(([_, historyItem]: [string, BridgeHistoryItem]) => {\n if (!historyItem.txMetaId) {\n return false;\n }\n // Check if we are already polling this tx, if so, skip restarting polling for that\n const pollingToken =\n this.#pollingTokensByTxMetaId[historyItem.txMetaId];\n return !pollingToken;\n })\n // Only restart polling for items that still require status updates\n .filter(([_, historyItem]: [string, BridgeHistoryItem]) => {\n return shouldPollHistoryItem(historyItem);\n });\n\n incompleteHistoryItems.forEach(\n ([historyKey, historyItem]: [string, BridgeHistoryItem]) => {\n const shouldSkipFetch = shouldSkipFetchDueToFetchFailures(\n historyItem.attempts,\n );\n if (shouldSkipFetch) {\n return;\n }\n\n // We manually call startPolling() here rather than go through startPollingForBridgeTxStatus()\n // because we don't want to overwrite the existing historyItem in state\n this.#startPollingForTxId(historyKey);\n },\n );\n };\n\n readonly #addTxToHistory = (\n historyKey: string,\n ...args: Parameters<typeof getInitialHistoryItem>\n ): string => {\n const txHistoryItem = getInitialHistoryItem(...args);\n this.update((state) => {\n state.txHistory[historyKey] = txHistoryItem;\n });\n return historyKey;\n };\n\n /**\n * Rekeys a history item from actionId to txMeta.id after successful submission.\n * Also updates txMetaId and srcTxHash which weren't available pre-submission.\n *\n * @param oldKey - The temporary key to use for the history item, usually the actionId\n * @param newKey - The new key to use, typcally the txmeta.id\n * @param txMeta - The transaction meta from the successful submission\n * @param txMeta.id - The transaction meta id to use as the new key\n * @param txMeta.hash - The transaction hash to set on the history item\n */\n readonly #rekeyHistoryItem = (\n oldKey: string,\n newKey: string,\n txMeta: { id: string; hash?: string },\n ): void => {\n this.update((state) => {\n rekeyHistoryItemInState(state, oldKey, newKey, txMeta);\n });\n };\n\n readonly #startPollingForTxId = (txId: string): void => {\n // If we are already polling for this tx, stop polling for it before restarting\n const existingPollingToken = this.#pollingTokensByTxMetaId[txId];\n if (existingPollingToken) {\n this.stopPollingByPollingToken(existingPollingToken);\n }\n\n const txHistoryItem = this.state.txHistory[txId];\n if (txHistoryItem && shouldPollHistoryItem(txHistoryItem)) {\n this.#pollingTokensByTxMetaId[txId] = this.startPolling({\n bridgeTxMetaId: txId,\n });\n }\n };\n\n /**\n * @deprecated For EVM/Solana swap/bridge txs we add tx to history in submitTx()\n * For Solana swap/bridge we start polling in submitTx()\n * For EVM bridge we listen for 'TransactionController:transactionConfirmed' and start polling there\n * No clients currently call this, safe to remove in future versions\n *\n * Adds tx to history and starts polling for the bridge tx status\n *\n * @param txHistoryMeta - The parameters for creating the history item\n */\n startPollingForBridgeTxStatus = (\n txHistoryMeta: StartPollingForBridgeTxStatusArgsSerialized,\n ): void => {\n const { bridgeTxMeta } = txHistoryMeta;\n\n if (!bridgeTxMeta?.id) {\n throw new Error(\n 'Cannot start polling: bridgeTxMeta.id is required for polling',\n );\n }\n\n const historyKey = this.#addTxToHistory(bridgeTxMeta.id, txHistoryMeta);\n this.#startPollingForTxId(historyKey);\n };\n\n // This will be called after you call this.startPolling()\n // The args passed in are the args you passed in to startPolling()\n _executePoll = async (\n pollingInput: BridgeStatusPollingInput,\n ): Promise<void> => {\n await this.#fetchBridgeTxStatus(pollingInput);\n };\n\n /**\n * Handles the failure to fetch the bridge tx status\n * We eventually stop polling for the tx if we fail too many times\n * Failures (500 errors) can be due to:\n * - The srcTxHash not being available immediately for STX\n * - The srcTxHash being invalid for the chain. This case will never resolve so we stop polling for it to avoid hammering the Bridge API forever.\n *\n * @param bridgeTxMetaId - The txMetaId of the bridge tx\n */\n readonly #handleFetchFailure = (bridgeTxMetaId: string): void => {\n const { attempts } = this.state.txHistory[bridgeTxMetaId];\n\n const newAttempts = attempts\n ? {\n counter: attempts.counter + 1,\n lastAttemptTime: Date.now(),\n }\n : {\n counter: 1,\n lastAttemptTime: Date.now(),\n };\n\n // If we've failed too many times, stop polling for the tx\n const pollingToken = this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n if (newAttempts.counter >= MAX_ATTEMPTS && pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n\n // Track max polling reached event\n const historyItem = this.state.txHistory[bridgeTxMetaId];\n if (historyItem) {\n // Track polling status updated event\n this.#trackPollingStatusUpdatedEvent(\n bridgeTxMetaId,\n PollingStatus.MaxPollingReached,\n );\n }\n }\n\n // Update the attempts counter\n this.#updateHistoryItem({\n historyKey: bridgeTxMetaId,\n attempts: newAttempts,\n });\n };\n\n /**\n * Checks if the history item should be preserved so its status can be fetched.\n *\n * @param bridgeTxMetaId - The txMetaId of the bridge tx\n */\n readonly #handleOldHistoryItem = async (\n bridgeTxMetaId: string,\n ): Promise<void> => {\n // Continue polling on next restart if the history item is valid\n if (\n this.state.txHistory[bridgeTxMetaId] &&\n (await shouldWaitForFinalBridgeStatus(\n this.messenger,\n this.state.txHistory[bridgeTxMetaId],\n ))\n ) {\n return;\n }\n\n const pollingToken = this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n\n // Track polling status updated event\n this.#trackPollingStatusUpdatedEvent(\n bridgeTxMetaId,\n PollingStatus.InvalidTransactionHash,\n );\n\n // If we've failed too many times, stop polling for the tx\n if (pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n }\n\n // Delete the history item so polling doesn't start over on the next restart\n this.#deleteHistoryItem(bridgeTxMetaId);\n };\n\n readonly #fetchBridgeTxStatus = async ({\n bridgeTxMetaId,\n }: FetchBridgeTxStatusArgs): Promise<void> => {\n // 1. Check for history item\n\n const { txHistory } = this.state;\n const historyItem = txHistory[bridgeTxMetaId];\n if (!historyItem) {\n return;\n }\n\n // 2. Check for previous failures\n\n if (shouldSkipFetchDueToFetchFailures(historyItem.attempts)) {\n return;\n }\n\n // 3. Fetch transaction status\n\n try {\n let status: BridgeHistoryItem['status'];\n let validationFailures: string[] = [];\n\n if (historyItem.quote.intent) {\n const intentTxStatus =\n await this.#intentManager.getIntentTransactionStatus(\n bridgeTxMetaId,\n historyItem.quote.srcChainId,\n historyItem.quote.intent.protocol,\n this.#clientId,\n historyItem.status.srcChain.txHash,\n );\n\n if (\n intentTxStatus?.bridgeStatus === null ||\n intentTxStatus?.bridgeStatus === undefined\n ) {\n return;\n }\n status = intentTxStatus.bridgeStatus.status;\n } else {\n // We try here because we receive 500 errors from Bridge API if we try to fetch immediately after submitting the source tx\n // Oddly mostly happens on Optimism, never on Arbitrum. By the 2nd fetch, the Bridge API responds properly.\n // Also srcTxHash may not be available immediately for STX, so we don't want to fetch in those cases\n const srcTxHash = this.#setAndGetSrcTxHash(bridgeTxMetaId);\n\n if (!srcTxHash) {\n return;\n }\n\n const statusRequest = getStatusRequestWithSrcTxHash(\n historyItem.quote,\n srcTxHash,\n );\n const response = await fetchBridgeTxStatus(\n statusRequest,\n this.#clientId,\n await getJwt(this.messenger),\n this.#fetchFn,\n this.#config.customBridgeApiBaseUrl,\n );\n status = response.status;\n validationFailures = response.validationFailures;\n }\n\n if (validationFailures.length > 0) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.StatusValidationFailed,\n bridgeTxMetaId,\n {\n failures: validationFailures,\n refresh_count: historyItem.attempts?.counter ?? 0,\n },\n );\n throw new Error(\n `Bridge status validation failed: ${validationFailures.join(', ')}`,\n );\n }\n\n // 4. Create bridge history item\n\n const newBridgeHistoryItem = {\n ...historyItem,\n status,\n completionTime:\n status.status === StatusTypes.COMPLETE ||\n status.status === StatusTypes.FAILED\n ? Date.now()\n : undefined, // TODO make this more accurate by looking up dest txHash block time\n attempts: undefined,\n };\n\n // No need to purge these on network change or account change, TransactionController does not purge either.\n // TODO In theory we can skip checking status if it's not the current account/network\n // we need to keep track of the account that this is associated with as well so that we don't show it in Activity list for other accounts\n // First stab at this will not stop polling when you are on a different account\n this.update((state) => {\n state.txHistory[bridgeTxMetaId] = newBridgeHistoryItem;\n });\n\n if (historyItem.quote.intent) {\n this.#intentManager.syncTransactionFromIntentStatus(\n bridgeTxMetaId,\n historyItem,\n );\n }\n\n // 5. After effects\n\n const pollingToken = this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n\n const isFinalStatus =\n status.status === StatusTypes.COMPLETE ||\n status.status === StatusTypes.FAILED;\n\n if (isFinalStatus && pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n\n if (status.status === StatusTypes.COMPLETE) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n bridgeTxMetaId,\n );\n this.messenger.publish(\n 'BridgeStatusController:destinationTransactionCompleted',\n historyItem.quote.destAsset.assetId,\n );\n }\n if (status.status === StatusTypes.FAILED) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n bridgeTxMetaId,\n );\n }\n }\n } catch (error) {\n console.warn('Failed to fetch bridge tx status', error);\n this.#handleFetchFailure(bridgeTxMetaId);\n } finally {\n await this.#handleOldHistoryItem(bridgeTxMetaId);\n }\n };\n\n /**\n * Returns the srcTxHash for a non-STX EVM tx, the hash from the bridge status api,\n * or the local hash from the TransactionController if the tx is in a finalized state\n *\n * @param bridgeTxMetaId - The bridge tx meta id\n * @returns The srcTxHash\n */\n readonly #setAndGetSrcTxHash = (\n bridgeTxMetaId: string,\n ): string | undefined => {\n const { txHistory } = this.state;\n // Prefer the srcTxHash from bridgeStatusState so we don't have to look up in TransactionController\n // But it is possible to have bridgeHistoryItem in state without the srcTxHash yet when it is an STX\n const srcTxHash = txHistory[bridgeTxMetaId].status.srcChain.txHash;\n\n if (\n srcTxHash ||\n isNonEvmChainId(txHistory[bridgeTxMetaId].quote.srcChainId)\n ) {\n return srcTxHash;\n }\n\n // Update history with TransactionController's hash if it has been updated\n const txMeta = getTransactionMetaById(this.messenger, bridgeTxMetaId);\n\n if (!txMeta) {\n return undefined;\n }\n\n // Wait for finalized status before updating the history item\n const localTxHash = [\n TransactionStatus.confirmed,\n TransactionStatus.dropped,\n TransactionStatus.rejected,\n TransactionStatus.failed,\n ].includes(txMeta.status)\n ? txMeta.hash\n : undefined;\n this.#updateHistoryItem({\n historyKey: bridgeTxMetaId,\n txHash: localTxHash,\n });\n\n return localTxHash;\n };\n\n readonly #updateHistoryItem = ({\n historyKey,\n status,\n txHash,\n attempts,\n completionTime,\n }: {\n historyKey?: string;\n status?: StatusTypes;\n txHash?: string;\n attempts?: BridgeHistoryItem['attempts'];\n completionTime?: BridgeHistoryItem['completionTime'];\n }): void => {\n if (!historyKey) {\n return;\n }\n this.update((currentState) => {\n if (status) {\n currentState.txHistory[historyKey].status.status = status;\n }\n if (txHash) {\n currentState.txHistory[historyKey].status.srcChain.txHash = txHash;\n }\n if (attempts) {\n currentState.txHistory[historyKey].attempts = attempts;\n }\n if (completionTime) {\n currentState.txHistory[historyKey].completionTime = completionTime;\n }\n });\n };\n\n readonly #deleteHistoryItem = (historyKey: string): void => {\n this.update((currentState) => {\n delete currentState.txHistory[historyKey];\n });\n };\n\n // Wipes the bridge status for the given address and chainId\n // Will match only source chainId to the selectedChainId\n readonly #wipeBridgeStatusByChainId = (\n address: string,\n selectedChainId: Hex,\n ): void => {\n const sourceTxMetaIdsToDelete = Object.keys(this.state.txHistory).filter(\n (txMetaId) => {\n const bridgeHistoryItem = this.state.txHistory[txMetaId];\n\n const hexSourceChainId = numberToHex(\n bridgeHistoryItem.quote.srcChainId,\n );\n\n return (\n bridgeHistoryItem.account === address &&\n hexSourceChainId === selectedChainId\n );\n },\n );\n\n sourceTxMetaIdsToDelete.forEach((sourceTxMetaId) => {\n const pollingToken = this.#pollingTokensByTxMetaId[sourceTxMetaId];\n\n if (pollingToken) {\n this.stopPollingByPollingToken(\n this.#pollingTokensByTxMetaId[sourceTxMetaId],\n );\n delete this.#pollingTokensByTxMetaId[sourceTxMetaId];\n }\n });\n\n this.update((state) => {\n state.txHistory = sourceTxMetaIdsToDelete.reduce(\n (acc, sourceTxMetaId) => {\n delete acc[sourceTxMetaId];\n return acc;\n },\n state.txHistory,\n );\n });\n };\n\n /**\n * ******************************************************\n * TX SUBMISSION HANDLING\n *******************************************************\n */\n\n readonly #executeSubmitStrategy = async (\n params: SubmitStrategyParams<Trade>,\n sharedHistoryItemProperties: {\n startTime: number;\n location: MetaMetricsSwapsEventSource;\n abTests?: Record<string, string>;\n activeAbTests?: { key: string; value: string }[];\n tokenSecurityTypeDestination?: string | null;\n },\n ): Promise<TransactionMeta> => {\n let tradeTxMeta!: TransactionMeta;\n\n const steps = executeSubmitStrategy(params);\n\n // Each submission strategy determines when to execute step, which means these actions can happen in any order\n for await (const { type, payload } of steps) {\n try {\n switch (type) {\n case SubmitStep.RekeyHistoryItem:\n this.#rekeyHistoryItem(\n payload.oldHistoryKey,\n payload.newHistoryKey,\n payload.tradeMeta,\n );\n break;\n\n case SubmitStep.UpdateBatchTransactions:\n updateTransactionsInBatch({\n messenger: this.messenger,\n allTradesWithMetadata: payload.quoteAndTxMetas,\n });\n break;\n\n case SubmitStep.SetTradeMeta:\n tradeTxMeta = payload.tradeMeta;\n break;\n\n case SubmitStep.AddHistoryItem:\n this.#addTxToHistory(payload.historyKey, {\n ...payload,\n ...sharedHistoryItemProperties,\n quoteResponse: payload.quoteResponse,\n accountAddress: params.selectedAccount.address,\n isStxEnabled: params.isStxEnabled,\n slippagePercentage: 0, // TODO include slippage provided by quote if using dynamic slippage, or slippage from quote request\n });\n break;\n\n case SubmitStep.StartPolling:\n this.#startPollingForTxId(payload.historyKey);\n break;\n\n case SubmitStep.PublishCompletedEvent:\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n payload.historyKey,\n );\n break;\n\n /* c8 ignore start */\n default:\n throw new Error(`Unknown submit step type: ${String(type)}`);\n /* c8 ignore end */\n }\n } catch (error) {\n console.error(\n 'Failed to add to bridge history and start polling.',\n error,\n );\n }\n }\n\n return tradeTxMeta;\n };\n\n /**\n * Submits a cross-chain swap transaction\n *\n * @param accountAddress - The address of the account to submit the transaction for\n * @param maybeQuoteResponses - A single quote response or an array of quote responses\n * @param isStxEnabled - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension\n * @param quotesReceivedContext - The context for the QuotesReceived event\n * @param location - The entry point from which the user initiated the swap or bridge (e.g. Main View, Token View, Trending Explore)\n * @param abTests - Legacy A/B test context for `ab_tests` (backward compatibility)\n * @param activeAbTests - New A/B test context for `active_ab_tests` (migration target). Attributes events to specific experiments.\n * @param tokenSecurityTypeDestination - The security classification of the destination token, supplied by the client (e.g. from token security/scanning data). Pass `null` when no security data is available.\n * @param batchSellTrades - Contains transaction data for the quotes, provided by the obtainGaslessBatch API\n * @returns The transaction meta\n * @throws An error if transaction submission fails before it gets published\n */\n submitTx = async (\n accountAddress: string,\n maybeQuoteResponses:\n | (QuoteResponse<Trade, Trade> & QuoteMetadata)\n | (QuoteResponse<Trade, Trade> & QuoteMetadata)[],\n isStxEnabled: boolean,\n quotesReceivedContext?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived],\n location: MetaMetricsSwapsEventSource = MetaMetricsSwapsEventSource.MainView,\n abTests?: Record<string, string>,\n activeAbTests?: { key: string; value: string }[],\n tokenSecurityTypeDestination?: string | null,\n batchSellTrades?: BatchSellTradesResponse | null,\n ): Promise<TransactionMeta> => {\n /**\n * If there are multiple quote responses, we assume that they all originate from the same src chain\n * and the same account. In this case its safe to use the first quote response's properties for\n * metrics and other pre-submission logic\n */\n const quoteResponses = Array.isArray(maybeQuoteResponses)\n ? maybeQuoteResponses\n : [maybeQuoteResponses];\n const quoteResponse = quoteResponses[0];\n\n const { quote } = quoteResponse;\n const startTime = Date.now();\n\n stopPollingForQuotes(this.messenger, quotesReceivedContext);\n\n const selectedAccount = getAccountByAddress(this.messenger, accountAddress);\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: undefined multichain account',\n );\n }\n const accountHardwareType = getAccountHardwareType(selectedAccount);\n\n /**\n * For hardware wallets on Mobile, this is fixes an issue where the Ledger does not get prompted for the 2nd approval.\n * Extension does not have this issue\n */\n const requireApproval =\n this.#clientId === BridgeClientId.MOBILE && accountHardwareType !== null;\n const isBridgeTx = isCrossChain(quote.srcChainId, quote.destChainId);\n\n const batchId = quoteResponses.some(\n ({ featureId: quoteFeatureId }) =>\n quoteFeatureId === FeatureId.BATCH_SELL,\n )\n ? generateBatchId()\n : undefined;\n\n const preConfirmationProperties = getPreConfirmationPropertiesFromQuote(\n quoteResponse,\n isStxEnabled,\n accountHardwareType,\n location,\n abTests,\n activeAbTests,\n tokenSecurityTypeDestination,\n batchSellTrades,\n batchId,\n );\n\n try {\n // Emit Submitted event after submit button is clicked\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Submitted,\n undefined,\n preConfirmationProperties,\n );\n\n /**\n * Check if the account is an EIP-7702 delegated account.\n * Delegated accounts only allow 1 in-flight tx, so approve + swap\n * must be batched into a single transaction\n */\n const isDelegatedAccount = isNonEvmChainId(quote.srcChainId)\n ? false\n : await checkIsDelegatedAccount(\n this.messenger,\n selectedAccount.address as Hex,\n [formatChainIdToHex(quote.srcChainId)],\n );\n\n const strategyParams: SubmitStrategyParams<Trade> = {\n messenger: this.messenger,\n quoteResponses,\n batchSellTrades,\n isStxEnabled,\n isBridgeTx,\n isDelegatedAccount,\n selectedAccount,\n requireApproval,\n clientId: this.#clientId,\n bridgeApiBaseUrl: this.#config.customBridgeApiBaseUrl,\n addTransactionBatchFn: this.#addTransactionBatchFn,\n fetchFn: this.#fetchFn,\n traceFn: this.#trace,\n batchId,\n };\n\n return await this.#trace(\n getTraceParams(quoteResponse, isStxEnabled),\n async () =>\n await this.#executeSubmitStrategy(strategyParams, {\n startTime,\n location,\n abTests,\n activeAbTests,\n tokenSecurityTypeDestination,\n }),\n );\n } catch (error) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n undefined,\n {\n error_message: (error as Error)?.message,\n ...preConfirmationProperties,\n },\n );\n throw error;\n }\n };\n\n /**\n * Submits an intent order and creates a synthetic history entry for UX.\n * The EIP-712 payload is always signed inside this controller via KeyringController.\n *\n * @param params - Object containing intent submission parameters\n * @param params.quoteResponse - Quote carrying intent data\n * @param params.accountAddress - The EOA submitting the order\n * @param params.location - The entry point from which the user initiated the swap or bridge\n * @param params.abTests - Legacy A/B test context for `ab_tests` (backward compatibility)\n * @param params.activeAbTests - New A/B test context for `active_ab_tests` (migration target). Attributes events to specific experiments.\n * @param params.tokenSecurityTypeDestination - The security classification of the destination token, supplied by the client (e.g. from token security/scanning data). Pass `null` when no security data is available.\n * @param params.isStxEnabled - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension\n * @param params.quotesReceivedContext - The context for the QuotesReceived event\n * @returns A lightweight TransactionMeta-like object for history linking\n * @throws An error if intent or transaction submission fails before they get published\n */\n submitIntent = async (params: {\n quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata;\n accountAddress: string;\n location?: MetaMetricsSwapsEventSource;\n abTests?: Record<string, string>;\n activeAbTests?: { key: string; value: string }[];\n tokenSecurityTypeDestination?: string | null;\n isStxEnabled?: boolean;\n quotesReceivedContext?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived];\n }): Promise<TransactionMeta> => {\n const {\n quoteResponse,\n accountAddress,\n location,\n abTests,\n activeAbTests,\n tokenSecurityTypeDestination,\n isStxEnabled = false,\n quotesReceivedContext,\n } = params;\n\n // TODO add metrics context\n return await this.submitTx(\n accountAddress,\n quoteResponse,\n isStxEnabled,\n quotesReceivedContext,\n location,\n abTests,\n activeAbTests,\n tokenSecurityTypeDestination,\n );\n };\n\n submitBatchSell = async (params: {\n quoteResponses: ((QuoteResponse<Trade, Trade> & QuoteMetadata) | null)[];\n accountAddress: string;\n location?: MetaMetricsSwapsEventSource;\n abTests?: Record<string, string>;\n activeAbTests?: { key: string; value: string }[];\n isStxEnabled?: boolean;\n quotesReceivedContext?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived];\n tokenSecurityTypeDestination?: string | null;\n }): Promise<TransactionMeta> => {\n /**\n * Retrieve the batch sell trades from the BridgeController's state to ensure we submit\n * the original response data from the bridge-api\n */\n const batchSellTrades = getBatchSellTrades(this.messenger);\n return await this.submitTx(\n params.accountAddress,\n params.quoteResponses.filter(\n (\n quoteResponse,\n ): quoteResponse is QuoteResponse<Trade, Trade> & QuoteMetadata =>\n quoteResponse !== null,\n ),\n params.isStxEnabled ?? false,\n params.quotesReceivedContext,\n params.location,\n params.abTests,\n params.activeAbTests,\n params.tokenSecurityTypeDestination,\n batchSellTrades,\n );\n };\n\n readonly #trackPollingStatusUpdatedEvent = (\n historyKey: string,\n pollingStatus: PollingStatus,\n ): void => {\n // Track polling status updated event\n const historyItem = this.state.txHistory[historyKey];\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.PollingStatusUpdated,\n historyKey,\n {\n polling_status: pollingStatus,\n retry_attempts: historyItem.attempts?.counter ?? 0,\n },\n );\n };\n\n /**\n * Tracks post-submission events for a cross-chain swap based on the history item\n *\n * @param eventName - The name of the event to track\n * @param txHistoryKey - The txMetaId, actionId or intentUid of the history item to track the event for\n * @param eventProperties - The properties for the event\n */\n readonly #trackUnifiedSwapBridgeEvent = <\n EventName extends\n | typeof UnifiedSwapBridgeEventName.Submitted\n | typeof UnifiedSwapBridgeEventName.Failed\n | typeof UnifiedSwapBridgeEventName.Completed\n | typeof UnifiedSwapBridgeEventName.StatusValidationFailed\n | typeof UnifiedSwapBridgeEventName.PollingStatusUpdated,\n EventProperties extends Omit<\n RequiredEventContextFromClient[EventName],\n 'feature_id'\n > & {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n feature_id?: FeatureId;\n },\n >(\n eventName: EventName,\n txHistoryKey?: string,\n eventProperties?: EventProperties,\n ): void => {\n const historyItem: BridgeHistoryItem | undefined = txHistoryKey\n ? this.state.txHistory[txHistoryKey]\n : undefined;\n\n const featureId =\n eventProperties?.feature_id ??\n historyItem?.featureId ??\n FeatureId.UNIFIED_SWAP_BRIDGE;\n\n if (\n !(\n ALLOWED_FEATURE_IDS_FOR_STATUS_EVENTS.includes(featureId) ||\n eventName === UnifiedSwapBridgeEventName.StatusValidationFailed\n )\n ) {\n return;\n }\n\n // Legacy/new metrics fields are intentionally kept independent during migration.\n const historyAbTests = txHistoryKey\n ? this.state.txHistory?.[txHistoryKey]?.abTests\n : undefined;\n const historyActiveAbTests = txHistoryKey\n ? this.state.txHistory?.[txHistoryKey]?.activeAbTests\n : undefined;\n const resolvedAbTests = eventProperties?.ab_tests ?? historyAbTests;\n const resolvedActiveAbTests =\n eventProperties?.active_ab_tests ?? historyActiveAbTests;\n\n const location =\n (txHistoryKey\n ? this.state.txHistory?.[txHistoryKey]?.location\n : undefined) ?? MetaMetricsSwapsEventSource.MainView;\n\n const baseProperties = {\n action_type: MetricsActionType.SWAPBRIDGE_V1,\n feature_id: featureId ?? FeatureId.UNIFIED_SWAP_BRIDGE,\n ...(historyItem?.batchId ? { batch_id: historyItem.batchId } : {}),\n ...(eventProperties ?? {}),\n location,\n ...(resolvedAbTests &&\n Object.keys(resolvedAbTests).length > 0 && {\n ab_tests: resolvedAbTests,\n }),\n ...(resolvedActiveAbTests &&\n resolvedActiveAbTests.length > 0 && {\n active_ab_tests: resolvedActiveAbTests,\n }),\n };\n\n // This will publish events for PERPS dropped tx failures as well\n if (!historyItem) {\n trackMetricsEvent({\n messenger: this.messenger,\n eventName,\n properties: baseProperties,\n });\n return;\n }\n\n const { approvalTxId, quote } = historyItem;\n const requestParamProperties = getRequestParamFromHistory(historyItem);\n\n if (eventName === UnifiedSwapBridgeEventName.StatusValidationFailed) {\n trackMetricsEvent({\n messenger: this.messenger,\n eventName,\n properties: {\n ...baseProperties,\n chain_id_source: requestParamProperties.chain_id_source,\n chain_id_destination: requestParamProperties.chain_id_destination,\n token_address_source: requestParamProperties.token_address_source,\n token_address_destination:\n requestParamProperties.token_address_destination,\n token_security_type_destination:\n requestParamProperties.token_security_type_destination,\n refresh_count: historyItem.attempts?.counter ?? 0,\n },\n });\n return;\n }\n\n const selectedAccount = getAccountByAddress(\n this.messenger,\n historyItem.account,\n );\n\n const transactions = getTransactions(this.messenger);\n const txMeta = transactions.find(\n (tx: TransactionMeta) => tx.id === txHistoryKey,\n );\n const approvalTxMeta = transactions.find(\n (tx: TransactionMeta) => tx.id === approvalTxId,\n );\n\n const requiredEventProperties = {\n ...baseProperties,\n ...requestParamProperties,\n ...getRequestMetadataFromHistory(historyItem, selectedAccount),\n ...getTradeDataFromHistory(historyItem),\n ...getTxStatusesFromHistory(historyItem),\n ...getFinalizedTxProperties(historyItem, txMeta, approvalTxMeta),\n ...getPriceImpactFromQuote(quote),\n };\n\n trackMetricsEvent({\n messenger: this.messenger,\n eventName,\n properties: requiredEventProperties,\n });\n };\n}\n"]}
1
+ {"version":3,"file":"bridge-status-controller.cjs","sourceRoot":"","sources":["../src/bridge-status-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StateMetadata } from '@metamask/base-controller';\nimport {\n QuoteMetadata,\n RequiredEventContextFromClient,\n QuoteResponse,\n Trade,\n FeatureId,\n BatchSellTradesResponse,\n InputPrimaryDenomination,\n} from '@metamask/bridge-controller';\nimport {\n isNonEvmChainId,\n StatusTypes,\n getAccountHardwareType,\n UnifiedSwapBridgeEventName,\n isCrossChain,\n MetricsActionType,\n MetaMetricsSwapsEventSource,\n PollingStatus,\n formatChainIdToHex,\n} from '@metamask/bridge-controller';\nimport type { TraceCallback } from '@metamask/controller-utils';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport {\n TransactionStatus,\n TransactionType,\n TransactionController,\n generateBatchId,\n} from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport { numberToHex } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport { IntentManager } from './bridge-status-controller.intent';\nimport {\n ALLOWED_FEATURE_IDS_FOR_STATUS_EVENTS,\n BRIDGE_PROD_API_BASE_URL,\n BRIDGE_STATUS_CONTROLLER_NAME,\n DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE,\n MAX_ATTEMPTS,\n REFRESH_INTERVAL_MS,\n} from './constants';\nimport executeSubmitStrategy from './strategy';\nimport { SubmitStep } from './strategy/types';\nimport type { SubmitStrategyParams } from './strategy/types';\nimport type {\n BridgeStatusControllerState,\n StartPollingForBridgeTxStatusArgsSerialized,\n FetchFunction,\n BridgeHistoryItem,\n} from './types';\nimport type { BridgeStatusControllerMessenger } from './types';\nimport { BridgeClientId } from './types';\nimport { getAccountByAddress } from './utils/accounts';\nimport { getJwt } from './utils/authentication';\nimport {\n getBatchSellTrades,\n stopPollingForQuotes,\n trackMetricsEvent,\n} from './utils/bridge';\nimport {\n fetchBridgeTxStatus,\n getStatusRequestWithSrcTxHash,\n shouldSkipFetchDueToFetchFailures,\n shouldWaitForFinalBridgeStatus,\n} from './utils/bridge-status';\nimport {\n getInitialHistoryItem,\n getMatchingHistoryEntryForTxMeta,\n rekeyHistoryItemInState,\n shouldPollHistoryItem,\n getMatchingHistoryEntryForApprovalTxMeta,\n} from './utils/history';\nimport {\n getFinalizedTxProperties,\n getPriceImpactFromQuote,\n getRequestMetadataFromHistory,\n getRequestParamFromHistory,\n getTradeDataFromHistory,\n getEVMTxPropertiesFromTransactionMeta,\n getTxStatusesFromHistory,\n getPreConfirmationPropertiesFromQuote,\n} from './utils/metrics';\nimport { getSelectedChainId } from './utils/network';\nimport { getTraceParams } from './utils/trace';\nimport {\n getTransactionMetaById,\n getTransactions,\n checkIsDelegatedAccount,\n isCrossChainTx,\n updateTransactionsInBatch,\n hasNestedSwapTransactions,\n} from './utils/transaction';\n\nconst metadata: StateMetadata<BridgeStatusControllerState> = {\n // We want to persist the bridge status state so that we can show the proper data for the Activity list\n // basically match the behavior of TransactionController\n txHistory: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\n/** The input to start polling for the {@link BridgeStatusController} */\ntype BridgeStatusPollingInput = FetchBridgeTxStatusArgs;\n\ntype SrcTxMetaId = string;\nexport type FetchBridgeTxStatusArgs = {\n bridgeTxMetaId: string;\n};\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'startPollingForBridgeTxStatus',\n 'wipeBridgeStatus',\n 'resetState',\n 'submitTx',\n 'submitIntent',\n 'submitBatchSell',\n 'restartPollingForFailedAttempts',\n 'getBridgeHistoryItemByTxMetaId',\n] as const;\n\nexport class BridgeStatusController extends StaticIntervalPollingController<BridgeStatusPollingInput>()<\n typeof BRIDGE_STATUS_CONTROLLER_NAME,\n BridgeStatusControllerState,\n BridgeStatusControllerMessenger\n> {\n #pollingTokensByTxMetaId: Record<SrcTxMetaId, string> = {};\n\n readonly #intentManager: IntentManager;\n\n readonly #clientId: BridgeClientId;\n\n readonly #fetchFn: FetchFunction;\n\n readonly #config: {\n customBridgeApiBaseUrl: string;\n };\n\n readonly #addTransactionBatchFn: typeof TransactionController.prototype.addTransactionBatch;\n\n readonly #trace: TraceCallback;\n\n constructor({\n messenger,\n state,\n clientId,\n fetchFn,\n addTransactionBatchFn,\n config,\n traceFn,\n }: {\n messenger: BridgeStatusControllerMessenger;\n state?: Partial<BridgeStatusControllerState>;\n clientId: BridgeClientId;\n fetchFn: FetchFunction;\n addTransactionBatchFn: typeof TransactionController.prototype.addTransactionBatch;\n config?: {\n customBridgeApiBaseUrl?: string;\n };\n traceFn?: TraceCallback;\n }) {\n super({\n name: BRIDGE_STATUS_CONTROLLER_NAME,\n metadata,\n messenger,\n // Restore the persisted state\n state: {\n ...DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE,\n ...state,\n },\n });\n\n this.#clientId = clientId;\n this.#fetchFn = fetchFn;\n this.#addTransactionBatchFn = addTransactionBatchFn;\n this.#config = {\n customBridgeApiBaseUrl:\n config?.customBridgeApiBaseUrl ?? BRIDGE_PROD_API_BASE_URL,\n };\n this.#trace = traceFn ?? (((_request, fn) => fn?.()) as TraceCallback);\n this.#intentManager = new IntentManager({\n messenger: this.messenger,\n customBridgeApiBaseUrl: this.#config.customBridgeApiBaseUrl,\n fetchFn: this.#fetchFn,\n });\n\n // Register action handlers\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n // Set interval\n this.setIntervalLength(REFRESH_INTERVAL_MS);\n\n this.messenger.subscribe<\n 'TransactionController:transactionStatusUpdated',\n {\n historyKey?: string;\n historyItem?: BridgeHistoryItem;\n txMeta: TransactionMeta;\n isApprovalTxMeta: boolean;\n }\n >(\n 'TransactionController:transactionStatusUpdated',\n ({ txMeta, historyKey, historyItem, isApprovalTxMeta }) => {\n if (!txMeta) {\n return;\n }\n const { type, status } = txMeta;\n\n // Allow event publishing if the txMeta is a swap/bridge OR if the\n // corresponding history item exists\n const isSwapOrBridgeTransaction = type && isCrossChainTx(type);\n if (!isSwapOrBridgeTransaction && !historyKey && !historyItem) {\n return;\n }\n\n switch (status) {\n case TransactionStatus.confirmed:\n this.#onTransactionConfirmed({\n txMeta,\n historyKey,\n isApprovalTxMeta,\n });\n break;\n case TransactionStatus.failed:\n case TransactionStatus.dropped:\n case TransactionStatus.rejected:\n this.#onTransactionFailed({ txMeta, historyKey, isApprovalTxMeta });\n break;\n default:\n break;\n }\n },\n ({ transactionMeta }) => {\n const entry = getMatchingHistoryEntryForTxMeta(\n this.state.txHistory,\n transactionMeta,\n );\n const approvalEntry = getMatchingHistoryEntryForApprovalTxMeta(\n this.state.txHistory,\n transactionMeta,\n );\n const entryToUse = entry ?? approvalEntry;\n\n return {\n historyKey: entryToUse?.[0],\n historyItem: entryToUse?.[1],\n txMeta: transactionMeta,\n isApprovalTxMeta:\n entryToUse?.[1]?.approvalTxId === transactionMeta.id,\n };\n },\n );\n\n // If you close the extension, but keep the browser open, the polling continues\n // If you close the browser, the polling stops\n // Check for historyItems that do not have a status of complete and restart polling\n this.#restartPollingForIncompleteHistoryItems();\n }\n\n readonly #onTransactionFailed = ({\n txMeta,\n historyKey,\n isApprovalTxMeta,\n }: {\n txMeta: TransactionMeta;\n historyKey?: string;\n isApprovalTxMeta: boolean;\n }): void => {\n // Check if the history item is already marked as a failure\n const isHistoryItemAlreadyFailed = historyKey\n ? this.state.txHistory[historyKey]?.status.status === StatusTypes.FAILED\n : false;\n\n this.#updateHistoryItem({\n historyKey,\n status: StatusTypes.FAILED,\n txHash: isApprovalTxMeta ? undefined : txMeta.hash,\n completionTime: Date.now(),\n });\n\n if (txMeta.status === TransactionStatus.rejected) {\n return;\n }\n\n // Skip tracking if this is a duplicate failed event for the same history item\n // This can happen if the transaction includes an approval tx that fails\n if (isHistoryItemAlreadyFailed) {\n return;\n }\n\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n historyKey,\n getEVMTxPropertiesFromTransactionMeta(txMeta),\n );\n };\n\n // Only EVM txs\n readonly #onTransactionConfirmed = ({\n txMeta,\n historyKey,\n isApprovalTxMeta,\n }: {\n txMeta: TransactionMeta;\n historyKey?: string;\n isApprovalTxMeta: boolean;\n }): void => {\n // Return early if the confirmed txMeta is for an approval since we\n // still need to wait for the trade to be confirmed\n if (isApprovalTxMeta) {\n return;\n }\n\n this.#updateHistoryItem({\n historyKey,\n txHash: txMeta.hash,\n });\n\n const isSwap =\n txMeta.type === TransactionType.swap || hasNestedSwapTransactions(txMeta);\n\n switch (isSwap) {\n case true:\n this.#updateHistoryItem({\n historyKey,\n status: StatusTypes.COMPLETE,\n completionTime: Date.now(),\n });\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n historyKey,\n );\n break;\n default:\n if (historyKey) {\n this.#startPollingForTxId(historyKey);\n }\n break;\n }\n };\n\n resetState = (): void => {\n this.update((state) => {\n state.txHistory = DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.txHistory;\n });\n };\n\n wipeBridgeStatus = ({\n address,\n ignoreNetwork,\n }: {\n address: string;\n ignoreNetwork: boolean;\n }): void => {\n // Wipe all networks for this address\n if (ignoreNetwork) {\n this.update((state) => {\n state.txHistory = DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.txHistory;\n });\n } else {\n const selectedChainId = getSelectedChainId(this.messenger);\n\n this.#wipeBridgeStatusByChainId(address, selectedChainId);\n }\n };\n\n /**\n * Resets the attempts counter for a bridge transaction history item\n * and restarts polling if it was previously stopped due to max attempts\n *\n * @param identifier - Object containing either txMetaId or txHash to identify the history item\n * @param identifier.txMetaId - The transaction meta ID\n * @param identifier.txHash - The transaction hash\n */\n restartPollingForFailedAttempts = (identifier: {\n txMetaId?: string;\n txHash?: string;\n }): void => {\n const { txMetaId, txHash } = identifier;\n\n if (!txMetaId && !txHash) {\n throw new Error('Either txMetaId or txHash must be provided');\n }\n\n // Find the history item by txMetaId or txHash\n let targetTxMetaId: string | undefined;\n\n if (txMetaId) {\n // Direct lookup by txMetaId\n if (this.state.txHistory[txMetaId]) {\n targetTxMetaId = txMetaId;\n }\n } else if (txHash) {\n // Search by txHash in status.srcChain.txHash\n targetTxMetaId = Object.keys(this.state.txHistory).find(\n (id) => this.state.txHistory[id].status.srcChain.txHash === txHash,\n );\n }\n\n if (!targetTxMetaId) {\n throw new Error(\n `No bridge transaction history found for ${\n txMetaId ? `txMetaId: ${txMetaId}` : `txHash: ${txHash}`\n }`,\n );\n }\n\n const historyItem = this.state.txHistory[targetTxMetaId];\n\n // Capture attempts count before resetting for metrics\n const previousAttempts = historyItem.attempts?.counter ?? 0;\n\n // Reset the attempts counter\n this.update((state) => {\n if (targetTxMetaId) {\n state.txHistory[targetTxMetaId].attempts = undefined;\n }\n });\n\n // Restart polling if it was stopped and this tx still needs status updates\n if (shouldPollHistoryItem(historyItem)) {\n // Check if polling was stopped (no active polling token)\n const existingPollingToken =\n this.#pollingTokensByTxMetaId[targetTxMetaId];\n\n if (!existingPollingToken) {\n // Restart polling\n this.#startPollingForTxId(targetTxMetaId);\n\n // Track polling manually restarted event\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.PollingStatusUpdated,\n targetTxMetaId,\n {\n polling_status: PollingStatus.ManuallyRestarted,\n retry_attempts: previousAttempts,\n },\n );\n }\n }\n };\n\n /**\n * Gets a bridge history item from the history by its transaction meta ID\n *\n * @param txMetaId - The transaction meta ID to look up\n * @returns The bridge history item if found, undefined otherwise\n */\n getBridgeHistoryItemByTxMetaId = (\n txMetaId: string,\n ): BridgeHistoryItem | undefined => {\n return this.state.txHistory[txMetaId];\n };\n\n /**\n * Restart polling for txs that are not in a final state\n * This is called during initialization\n */\n readonly #restartPollingForIncompleteHistoryItems = (): void => {\n // Check for historyItems that do not have a status of complete and restart polling\n const { txHistory } = this.state;\n const historyItems = Object.entries(txHistory);\n const incompleteHistoryItems = historyItems\n .filter(\n ([_, historyItem]) =>\n historyItem.status.status === StatusTypes.PENDING ||\n historyItem.status.status === StatusTypes.UNKNOWN,\n )\n // Only poll items with txMetaId (post-submission items)\n .filter(([_, historyItem]: [string, BridgeHistoryItem]) => {\n if (!historyItem.txMetaId) {\n return false;\n }\n // Check if we are already polling this tx, if so, skip restarting polling for that\n const pollingToken =\n this.#pollingTokensByTxMetaId[historyItem.txMetaId];\n return !pollingToken;\n })\n // Only restart polling for items that still require status updates\n .filter(([_, historyItem]: [string, BridgeHistoryItem]) => {\n return shouldPollHistoryItem(historyItem);\n });\n\n incompleteHistoryItems.forEach(\n ([historyKey, historyItem]: [string, BridgeHistoryItem]) => {\n const shouldSkipFetch = shouldSkipFetchDueToFetchFailures(\n historyItem.attempts,\n );\n if (shouldSkipFetch) {\n return;\n }\n\n // We manually call startPolling() here rather than go through startPollingForBridgeTxStatus()\n // because we don't want to overwrite the existing historyItem in state\n this.#startPollingForTxId(historyKey);\n },\n );\n };\n\n readonly #addTxToHistory = (\n historyKey: string,\n ...args: Parameters<typeof getInitialHistoryItem>\n ): string => {\n const txHistoryItem = getInitialHistoryItem(...args);\n this.update((state) => {\n state.txHistory[historyKey] = txHistoryItem;\n });\n return historyKey;\n };\n\n /**\n * Rekeys a history item from actionId to txMeta.id after successful submission.\n * Also updates txMetaId and srcTxHash which weren't available pre-submission.\n *\n * @param oldKey - The temporary key to use for the history item, usually the actionId\n * @param newKey - The new key to use, typcally the txmeta.id\n * @param txMeta - The transaction meta from the successful submission\n * @param txMeta.id - The transaction meta id to use as the new key\n * @param txMeta.hash - The transaction hash to set on the history item\n */\n readonly #rekeyHistoryItem = (\n oldKey: string,\n newKey: string,\n txMeta: { id: string; hash?: string },\n ): void => {\n this.update((state) => {\n rekeyHistoryItemInState(state, oldKey, newKey, txMeta);\n });\n };\n\n readonly #startPollingForTxId = (txId: string): void => {\n // If we are already polling for this tx, stop polling for it before restarting\n const existingPollingToken = this.#pollingTokensByTxMetaId[txId];\n if (existingPollingToken) {\n this.stopPollingByPollingToken(existingPollingToken);\n }\n\n const txHistoryItem = this.state.txHistory[txId];\n if (txHistoryItem && shouldPollHistoryItem(txHistoryItem)) {\n this.#pollingTokensByTxMetaId[txId] = this.startPolling({\n bridgeTxMetaId: txId,\n });\n }\n };\n\n /**\n * @deprecated For EVM/Solana swap/bridge txs we add tx to history in submitTx()\n * For Solana swap/bridge we start polling in submitTx()\n * For EVM bridge we listen for 'TransactionController:transactionConfirmed' and start polling there\n * No clients currently call this, safe to remove in future versions\n *\n * Adds tx to history and starts polling for the bridge tx status\n *\n * @param txHistoryMeta - The parameters for creating the history item\n */\n startPollingForBridgeTxStatus = (\n txHistoryMeta: StartPollingForBridgeTxStatusArgsSerialized,\n ): void => {\n const { bridgeTxMeta } = txHistoryMeta;\n\n if (!bridgeTxMeta?.id) {\n throw new Error(\n 'Cannot start polling: bridgeTxMeta.id is required for polling',\n );\n }\n\n const historyKey = this.#addTxToHistory(bridgeTxMeta.id, txHistoryMeta);\n this.#startPollingForTxId(historyKey);\n };\n\n // This will be called after you call this.startPolling()\n // The args passed in are the args you passed in to startPolling()\n _executePoll = async (\n pollingInput: BridgeStatusPollingInput,\n ): Promise<void> => {\n await this.#fetchBridgeTxStatus(pollingInput);\n };\n\n /**\n * Handles the failure to fetch the bridge tx status\n * We eventually stop polling for the tx if we fail too many times\n * Failures (500 errors) can be due to:\n * - The srcTxHash not being available immediately for STX\n * - The srcTxHash being invalid for the chain. This case will never resolve so we stop polling for it to avoid hammering the Bridge API forever.\n *\n * @param bridgeTxMetaId - The txMetaId of the bridge tx\n */\n readonly #handleFetchFailure = (bridgeTxMetaId: string): void => {\n const { attempts } = this.state.txHistory[bridgeTxMetaId];\n\n const newAttempts = attempts\n ? {\n counter: attempts.counter + 1,\n lastAttemptTime: Date.now(),\n }\n : {\n counter: 1,\n lastAttemptTime: Date.now(),\n };\n\n // If we've failed too many times, stop polling for the tx\n const pollingToken = this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n if (newAttempts.counter >= MAX_ATTEMPTS && pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n\n // Track max polling reached event\n const historyItem = this.state.txHistory[bridgeTxMetaId];\n if (historyItem) {\n // Track polling status updated event\n this.#trackPollingStatusUpdatedEvent(\n bridgeTxMetaId,\n PollingStatus.MaxPollingReached,\n );\n }\n }\n\n // Update the attempts counter\n this.#updateHistoryItem({\n historyKey: bridgeTxMetaId,\n attempts: newAttempts,\n });\n };\n\n /**\n * Checks if the history item should be preserved so its status can be fetched.\n *\n * @param bridgeTxMetaId - The txMetaId of the bridge tx\n */\n readonly #handleOldHistoryItem = async (\n bridgeTxMetaId: string,\n ): Promise<void> => {\n // Continue polling on next restart if the history item is valid\n if (\n this.state.txHistory[bridgeTxMetaId] &&\n (await shouldWaitForFinalBridgeStatus(\n this.messenger,\n this.state.txHistory[bridgeTxMetaId],\n ))\n ) {\n return;\n }\n\n const pollingToken = this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n\n // Track polling status updated event\n this.#trackPollingStatusUpdatedEvent(\n bridgeTxMetaId,\n PollingStatus.InvalidTransactionHash,\n );\n\n // If we've failed too many times, stop polling for the tx\n if (pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n }\n\n // Delete the history item so polling doesn't start over on the next restart\n this.#deleteHistoryItem(bridgeTxMetaId);\n };\n\n readonly #fetchBridgeTxStatus = async ({\n bridgeTxMetaId,\n }: FetchBridgeTxStatusArgs): Promise<void> => {\n // 1. Check for history item\n\n const { txHistory } = this.state;\n const historyItem = txHistory[bridgeTxMetaId];\n if (!historyItem) {\n return;\n }\n\n // 2. Check for previous failures\n\n if (shouldSkipFetchDueToFetchFailures(historyItem.attempts)) {\n return;\n }\n\n // 3. Fetch transaction status\n\n try {\n let status: BridgeHistoryItem['status'];\n let validationFailures: string[] = [];\n\n if (historyItem.quote.intent) {\n const intentTxStatus =\n await this.#intentManager.getIntentTransactionStatus(\n bridgeTxMetaId,\n historyItem.quote.srcChainId,\n historyItem.quote.intent.protocol,\n this.#clientId,\n historyItem.status.srcChain.txHash,\n );\n\n if (\n intentTxStatus?.bridgeStatus === null ||\n intentTxStatus?.bridgeStatus === undefined\n ) {\n return;\n }\n status = intentTxStatus.bridgeStatus.status;\n } else {\n // We try here because we receive 500 errors from Bridge API if we try to fetch immediately after submitting the source tx\n // Oddly mostly happens on Optimism, never on Arbitrum. By the 2nd fetch, the Bridge API responds properly.\n // Also srcTxHash may not be available immediately for STX, so we don't want to fetch in those cases\n const srcTxHash = this.#setAndGetSrcTxHash(bridgeTxMetaId);\n\n if (!srcTxHash) {\n return;\n }\n\n const statusRequest = getStatusRequestWithSrcTxHash(\n historyItem.quote,\n srcTxHash,\n );\n const response = await fetchBridgeTxStatus(\n statusRequest,\n this.#clientId,\n await getJwt(this.messenger),\n this.#fetchFn,\n this.#config.customBridgeApiBaseUrl,\n );\n status = response.status;\n validationFailures = response.validationFailures;\n }\n\n if (validationFailures.length > 0) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.StatusValidationFailed,\n bridgeTxMetaId,\n {\n failures: validationFailures,\n refresh_count: historyItem.attempts?.counter ?? 0,\n },\n );\n throw new Error(\n `Bridge status validation failed: ${validationFailures.join(', ')}`,\n );\n }\n\n // 4. Create bridge history item\n\n const newBridgeHistoryItem = {\n ...historyItem,\n status,\n completionTime:\n status.status === StatusTypes.COMPLETE ||\n status.status === StatusTypes.FAILED\n ? Date.now()\n : undefined, // TODO make this more accurate by looking up dest txHash block time\n attempts: undefined,\n };\n\n // No need to purge these on network change or account change, TransactionController does not purge either.\n // TODO In theory we can skip checking status if it's not the current account/network\n // we need to keep track of the account that this is associated with as well so that we don't show it in Activity list for other accounts\n // First stab at this will not stop polling when you are on a different account\n this.update((state) => {\n state.txHistory[bridgeTxMetaId] = newBridgeHistoryItem;\n });\n\n if (historyItem.quote.intent) {\n this.#intentManager.syncTransactionFromIntentStatus(\n bridgeTxMetaId,\n historyItem,\n );\n }\n\n // 5. After effects\n\n const pollingToken = this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n\n const isFinalStatus =\n status.status === StatusTypes.COMPLETE ||\n status.status === StatusTypes.FAILED;\n\n if (isFinalStatus && pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n\n if (status.status === StatusTypes.COMPLETE) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n bridgeTxMetaId,\n );\n this.messenger.publish(\n 'BridgeStatusController:destinationTransactionCompleted',\n historyItem.quote.destAsset.assetId,\n );\n }\n if (status.status === StatusTypes.FAILED) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n bridgeTxMetaId,\n );\n }\n }\n } catch (error) {\n console.warn('Failed to fetch bridge tx status', error);\n this.#handleFetchFailure(bridgeTxMetaId);\n } finally {\n await this.#handleOldHistoryItem(bridgeTxMetaId);\n }\n };\n\n /**\n * Returns the srcTxHash for a non-STX EVM tx, the hash from the bridge status api,\n * or the local hash from the TransactionController if the tx is in a finalized state\n *\n * @param bridgeTxMetaId - The bridge tx meta id\n * @returns The srcTxHash\n */\n readonly #setAndGetSrcTxHash = (\n bridgeTxMetaId: string,\n ): string | undefined => {\n const { txHistory } = this.state;\n // Prefer the srcTxHash from bridgeStatusState so we don't have to look up in TransactionController\n // But it is possible to have bridgeHistoryItem in state without the srcTxHash yet when it is an STX\n const srcTxHash = txHistory[bridgeTxMetaId].status.srcChain.txHash;\n\n if (\n srcTxHash ||\n isNonEvmChainId(txHistory[bridgeTxMetaId].quote.srcChainId)\n ) {\n return srcTxHash;\n }\n\n // Update history with TransactionController's hash if it has been updated\n const txMeta = getTransactionMetaById(this.messenger, bridgeTxMetaId);\n\n if (!txMeta) {\n return undefined;\n }\n\n // Wait for finalized status before updating the history item\n const localTxHash = [\n TransactionStatus.confirmed,\n TransactionStatus.dropped,\n TransactionStatus.rejected,\n TransactionStatus.failed,\n ].includes(txMeta.status)\n ? txMeta.hash\n : undefined;\n this.#updateHistoryItem({\n historyKey: bridgeTxMetaId,\n txHash: localTxHash,\n });\n\n return localTxHash;\n };\n\n readonly #updateHistoryItem = ({\n historyKey,\n status,\n txHash,\n attempts,\n completionTime,\n }: {\n historyKey?: string;\n status?: StatusTypes;\n txHash?: string;\n attempts?: BridgeHistoryItem['attempts'];\n completionTime?: BridgeHistoryItem['completionTime'];\n }): void => {\n if (!historyKey) {\n return;\n }\n this.update((currentState) => {\n if (status) {\n currentState.txHistory[historyKey].status.status = status;\n }\n if (txHash) {\n currentState.txHistory[historyKey].status.srcChain.txHash = txHash;\n }\n if (attempts) {\n currentState.txHistory[historyKey].attempts = attempts;\n }\n if (completionTime) {\n currentState.txHistory[historyKey].completionTime = completionTime;\n }\n });\n };\n\n readonly #deleteHistoryItem = (historyKey: string): void => {\n this.update((currentState) => {\n delete currentState.txHistory[historyKey];\n });\n };\n\n // Wipes the bridge status for the given address and chainId\n // Will match only source chainId to the selectedChainId\n readonly #wipeBridgeStatusByChainId = (\n address: string,\n selectedChainId: Hex,\n ): void => {\n const sourceTxMetaIdsToDelete = Object.keys(this.state.txHistory).filter(\n (txMetaId) => {\n const bridgeHistoryItem = this.state.txHistory[txMetaId];\n\n const hexSourceChainId = numberToHex(\n bridgeHistoryItem.quote.srcChainId,\n );\n\n return (\n bridgeHistoryItem.account === address &&\n hexSourceChainId === selectedChainId\n );\n },\n );\n\n sourceTxMetaIdsToDelete.forEach((sourceTxMetaId) => {\n const pollingToken = this.#pollingTokensByTxMetaId[sourceTxMetaId];\n\n if (pollingToken) {\n this.stopPollingByPollingToken(\n this.#pollingTokensByTxMetaId[sourceTxMetaId],\n );\n delete this.#pollingTokensByTxMetaId[sourceTxMetaId];\n }\n });\n\n this.update((state) => {\n state.txHistory = sourceTxMetaIdsToDelete.reduce(\n (acc, sourceTxMetaId) => {\n delete acc[sourceTxMetaId];\n return acc;\n },\n state.txHistory,\n );\n });\n };\n\n /**\n * ******************************************************\n * TX SUBMISSION HANDLING\n *******************************************************\n */\n\n readonly #executeSubmitStrategy = async (\n params: SubmitStrategyParams<Trade>,\n sharedHistoryItemProperties: {\n startTime: number;\n location: MetaMetricsSwapsEventSource;\n abTests?: Record<string, string>;\n activeAbTests?: { key: string; value: string }[];\n tokenSecurityTypeDestination?: string | null;\n inputPrimaryDenomination?: InputPrimaryDenomination;\n },\n ): Promise<TransactionMeta> => {\n let tradeTxMeta!: TransactionMeta;\n\n const steps = executeSubmitStrategy(params);\n\n // Each submission strategy determines when to execute step, which means these actions can happen in any order\n for await (const { type, payload } of steps) {\n try {\n switch (type) {\n case SubmitStep.RekeyHistoryItem:\n this.#rekeyHistoryItem(\n payload.oldHistoryKey,\n payload.newHistoryKey,\n payload.tradeMeta,\n );\n break;\n\n case SubmitStep.UpdateBatchTransactions:\n updateTransactionsInBatch({\n messenger: this.messenger,\n allTradesWithMetadata: payload.quoteAndTxMetas,\n });\n break;\n\n case SubmitStep.SetTradeMeta:\n tradeTxMeta = payload.tradeMeta;\n break;\n\n case SubmitStep.AddHistoryItem:\n this.#addTxToHistory(payload.historyKey, {\n ...payload,\n ...sharedHistoryItemProperties,\n quoteResponse: payload.quoteResponse,\n accountAddress: params.selectedAccount.address,\n isStxEnabled: params.isStxEnabled,\n slippagePercentage: 0, // TODO include slippage provided by quote if using dynamic slippage, or slippage from quote request\n });\n break;\n\n case SubmitStep.StartPolling:\n this.#startPollingForTxId(payload.historyKey);\n break;\n\n case SubmitStep.PublishCompletedEvent:\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n payload.historyKey,\n );\n break;\n\n /* c8 ignore start */\n default:\n throw new Error(`Unknown submit step type: ${String(type)}`);\n /* c8 ignore end */\n }\n } catch (error) {\n console.error(\n 'Failed to add to bridge history and start polling.',\n error,\n );\n }\n }\n\n return tradeTxMeta;\n };\n\n /**\n * Submits a cross-chain swap transaction\n *\n * @param accountAddress - The address of the account to submit the transaction for\n * @param maybeQuoteResponses - A single quote response or an array of quote responses\n * @param isStxEnabled - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension\n * @param quotesReceivedContext - The context for the QuotesReceived event\n * @param location - The entry point from which the user initiated the swap or bridge (e.g. Main View, Token View, Trending Explore)\n * @param abTests - Legacy A/B test context for `ab_tests` (backward compatibility)\n * @param activeAbTests - New A/B test context for `active_ab_tests` (migration target). Attributes events to specific experiments.\n * @param tokenSecurityTypeDestination - The security classification of the destination token, supplied by the client (e.g. from token security/scanning data). Pass `null` when no security data is available.\n * @param batchSellTrades - Contains transaction data for the quotes, provided by the obtainGaslessBatch API\n * @param inputPrimaryDenomination - The denomination shown as the primary source amount input at submission time.\n * @returns The transaction meta\n * @throws An error if transaction submission fails before it gets published\n */\n submitTx = async (\n accountAddress: string,\n maybeQuoteResponses:\n | (QuoteResponse<Trade, Trade> & QuoteMetadata)\n | (QuoteResponse<Trade, Trade> & QuoteMetadata)[],\n isStxEnabled: boolean,\n quotesReceivedContext?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived],\n location: MetaMetricsSwapsEventSource = MetaMetricsSwapsEventSource.MainView,\n abTests?: Record<string, string>,\n activeAbTests?: { key: string; value: string }[],\n tokenSecurityTypeDestination?: string | null,\n batchSellTrades?: BatchSellTradesResponse | null,\n inputPrimaryDenomination?: InputPrimaryDenomination,\n ): Promise<TransactionMeta> => {\n /**\n * If there are multiple quote responses, we assume that they all originate from the same src chain\n * and the same account. In this case its safe to use the first quote response's properties for\n * metrics and other pre-submission logic\n */\n const quoteResponses = Array.isArray(maybeQuoteResponses)\n ? maybeQuoteResponses\n : [maybeQuoteResponses];\n const quoteResponse = quoteResponses[0];\n\n const { quote } = quoteResponse;\n const startTime = Date.now();\n\n stopPollingForQuotes(this.messenger, quotesReceivedContext);\n\n const selectedAccount = getAccountByAddress(this.messenger, accountAddress);\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: undefined multichain account',\n );\n }\n const accountHardwareType = getAccountHardwareType(selectedAccount);\n\n /**\n * For hardware wallets on Mobile, this is fixes an issue where the Ledger does not get prompted for the 2nd approval.\n * Extension does not have this issue\n */\n const requireApproval =\n this.#clientId === BridgeClientId.MOBILE && accountHardwareType !== null;\n const isBridgeTx = isCrossChain(quote.srcChainId, quote.destChainId);\n\n const batchId = quoteResponses.some(\n ({ featureId: quoteFeatureId }) =>\n quoteFeatureId === FeatureId.BATCH_SELL,\n )\n ? generateBatchId()\n : undefined;\n\n const preConfirmationProperties = getPreConfirmationPropertiesFromQuote(\n quoteResponse,\n isStxEnabled,\n accountHardwareType,\n location,\n abTests,\n activeAbTests,\n tokenSecurityTypeDestination,\n batchSellTrades,\n batchId,\n );\n\n try {\n // Emit Submitted event after submit button is clicked\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Submitted,\n undefined,\n {\n ...preConfirmationProperties,\n input_primary_denomination:\n inputPrimaryDenomination ?? 'token_amount',\n },\n );\n\n /**\n * Check if the account is an EIP-7702 delegated account.\n * Delegated accounts only allow 1 in-flight tx, so approve + swap\n * must be batched into a single transaction\n */\n const isDelegatedAccount = isNonEvmChainId(quote.srcChainId)\n ? false\n : await checkIsDelegatedAccount(\n this.messenger,\n selectedAccount.address as Hex,\n [formatChainIdToHex(quote.srcChainId)],\n );\n\n const strategyParams: SubmitStrategyParams<Trade> = {\n messenger: this.messenger,\n quoteResponses,\n batchSellTrades,\n isStxEnabled,\n isBridgeTx,\n isDelegatedAccount,\n selectedAccount,\n requireApproval,\n clientId: this.#clientId,\n bridgeApiBaseUrl: this.#config.customBridgeApiBaseUrl,\n addTransactionBatchFn: this.#addTransactionBatchFn,\n fetchFn: this.#fetchFn,\n traceFn: this.#trace,\n batchId,\n };\n\n return await this.#trace(\n getTraceParams(quoteResponse, isStxEnabled),\n async () =>\n await this.#executeSubmitStrategy(strategyParams, {\n startTime,\n location,\n abTests,\n activeAbTests,\n tokenSecurityTypeDestination,\n inputPrimaryDenomination,\n }),\n );\n } catch (error) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n undefined,\n {\n error_message: (error as Error)?.message,\n ...preConfirmationProperties,\n },\n );\n throw error;\n }\n };\n\n /**\n * Submits an intent order and creates a synthetic history entry for UX.\n * The EIP-712 payload is always signed inside this controller via KeyringController.\n *\n * @param params - Object containing intent submission parameters\n * @param params.quoteResponse - Quote carrying intent data\n * @param params.accountAddress - The EOA submitting the order\n * @param params.location - The entry point from which the user initiated the swap or bridge\n * @param params.abTests - Legacy A/B test context for `ab_tests` (backward compatibility)\n * @param params.activeAbTests - New A/B test context for `active_ab_tests` (migration target). Attributes events to specific experiments.\n * @param params.tokenSecurityTypeDestination - The security classification of the destination token, supplied by the client (e.g. from token security/scanning data). Pass `null` when no security data is available.\n * @param params.inputPrimaryDenomination - The denomination shown as the primary source amount input at submission time.\n * @param params.isStxEnabled - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension\n * @param params.quotesReceivedContext - The context for the QuotesReceived event\n * @returns A lightweight TransactionMeta-like object for history linking\n * @throws An error if intent or transaction submission fails before they get published\n */\n submitIntent = async (params: {\n quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata;\n accountAddress: string;\n location?: MetaMetricsSwapsEventSource;\n abTests?: Record<string, string>;\n activeAbTests?: { key: string; value: string }[];\n tokenSecurityTypeDestination?: string | null;\n inputPrimaryDenomination?: InputPrimaryDenomination;\n isStxEnabled?: boolean;\n quotesReceivedContext?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived];\n }): Promise<TransactionMeta> => {\n const {\n quoteResponse,\n accountAddress,\n location,\n abTests,\n activeAbTests,\n tokenSecurityTypeDestination,\n inputPrimaryDenomination,\n isStxEnabled = false,\n quotesReceivedContext,\n } = params;\n\n // TODO add metrics context\n return await this.submitTx(\n accountAddress,\n quoteResponse,\n isStxEnabled,\n quotesReceivedContext,\n location,\n abTests,\n activeAbTests,\n tokenSecurityTypeDestination,\n undefined,\n inputPrimaryDenomination,\n );\n };\n\n submitBatchSell = async (params: {\n quoteResponses: ((QuoteResponse<Trade, Trade> & QuoteMetadata) | null)[];\n accountAddress: string;\n location?: MetaMetricsSwapsEventSource;\n abTests?: Record<string, string>;\n activeAbTests?: { key: string; value: string }[];\n isStxEnabled?: boolean;\n quotesReceivedContext?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived];\n tokenSecurityTypeDestination?: string | null;\n }): Promise<TransactionMeta> => {\n /**\n * Retrieve the batch sell trades from the BridgeController's state to ensure we submit\n * the original response data from the bridge-api\n */\n const batchSellTrades = getBatchSellTrades(this.messenger);\n return await this.submitTx(\n params.accountAddress,\n params.quoteResponses.filter(\n (\n quoteResponse,\n ): quoteResponse is QuoteResponse<Trade, Trade> & QuoteMetadata =>\n quoteResponse !== null,\n ),\n params.isStxEnabled ?? false,\n params.quotesReceivedContext,\n params.location,\n params.abTests,\n params.activeAbTests,\n params.tokenSecurityTypeDestination,\n batchSellTrades,\n );\n };\n\n readonly #trackPollingStatusUpdatedEvent = (\n historyKey: string,\n pollingStatus: PollingStatus,\n ): void => {\n // Track polling status updated event\n const historyItem = this.state.txHistory[historyKey];\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.PollingStatusUpdated,\n historyKey,\n {\n polling_status: pollingStatus,\n retry_attempts: historyItem.attempts?.counter ?? 0,\n },\n );\n };\n\n /**\n * Tracks post-submission events for a cross-chain swap based on the history item\n *\n * @param eventName - The name of the event to track\n * @param txHistoryKey - The txMetaId, actionId or intentUid of the history item to track the event for\n * @param eventProperties - The properties for the event\n */\n readonly #trackUnifiedSwapBridgeEvent = <\n EventName extends\n | typeof UnifiedSwapBridgeEventName.Submitted\n | typeof UnifiedSwapBridgeEventName.Failed\n | typeof UnifiedSwapBridgeEventName.Completed\n | typeof UnifiedSwapBridgeEventName.StatusValidationFailed\n | typeof UnifiedSwapBridgeEventName.PollingStatusUpdated,\n EventProperties extends Omit<\n RequiredEventContextFromClient[EventName],\n 'feature_id'\n > & {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n feature_id?: FeatureId;\n },\n >(\n eventName: EventName,\n txHistoryKey?: string,\n eventProperties?: EventProperties,\n ): void => {\n const historyItem: BridgeHistoryItem | undefined = txHistoryKey\n ? this.state.txHistory[txHistoryKey]\n : undefined;\n\n const featureId =\n eventProperties?.feature_id ??\n historyItem?.featureId ??\n FeatureId.UNIFIED_SWAP_BRIDGE;\n\n if (\n !(\n ALLOWED_FEATURE_IDS_FOR_STATUS_EVENTS.includes(featureId) ||\n eventName === UnifiedSwapBridgeEventName.StatusValidationFailed\n )\n ) {\n return;\n }\n\n // Legacy/new metrics fields are intentionally kept independent during migration.\n const historyAbTests = txHistoryKey\n ? this.state.txHistory?.[txHistoryKey]?.abTests\n : undefined;\n const historyActiveAbTests = txHistoryKey\n ? this.state.txHistory?.[txHistoryKey]?.activeAbTests\n : undefined;\n const resolvedAbTests = eventProperties?.ab_tests ?? historyAbTests;\n const resolvedActiveAbTests =\n eventProperties?.active_ab_tests ?? historyActiveAbTests;\n\n const location =\n (txHistoryKey\n ? this.state.txHistory?.[txHistoryKey]?.location\n : undefined) ?? MetaMetricsSwapsEventSource.MainView;\n\n const baseProperties = {\n action_type: MetricsActionType.SWAPBRIDGE_V1,\n feature_id: featureId ?? FeatureId.UNIFIED_SWAP_BRIDGE,\n ...(historyItem?.batchId ? { batch_id: historyItem.batchId } : {}),\n ...(eventProperties ?? {}),\n location,\n ...(resolvedAbTests &&\n Object.keys(resolvedAbTests).length > 0 && {\n ab_tests: resolvedAbTests,\n }),\n ...(resolvedActiveAbTests &&\n resolvedActiveAbTests.length > 0 && {\n active_ab_tests: resolvedActiveAbTests,\n }),\n };\n\n // This will publish events for PERPS dropped tx failures as well\n if (!historyItem) {\n trackMetricsEvent({\n messenger: this.messenger,\n eventName,\n properties: baseProperties,\n });\n return;\n }\n\n const { approvalTxId, quote } = historyItem;\n const requestParamProperties = getRequestParamFromHistory(historyItem);\n\n if (eventName === UnifiedSwapBridgeEventName.StatusValidationFailed) {\n trackMetricsEvent({\n messenger: this.messenger,\n eventName,\n properties: {\n ...baseProperties,\n chain_id_source: requestParamProperties.chain_id_source,\n chain_id_destination: requestParamProperties.chain_id_destination,\n token_address_source: requestParamProperties.token_address_source,\n token_address_destination:\n requestParamProperties.token_address_destination,\n token_security_type_destination:\n requestParamProperties.token_security_type_destination,\n refresh_count: historyItem.attempts?.counter ?? 0,\n },\n });\n return;\n }\n\n const selectedAccount = getAccountByAddress(\n this.messenger,\n historyItem.account,\n );\n\n const transactions = getTransactions(this.messenger);\n const txMeta = transactions.find(\n (tx: TransactionMeta) => tx.id === txHistoryKey,\n );\n const approvalTxMeta = transactions.find(\n (tx: TransactionMeta) => tx.id === approvalTxId,\n );\n\n const requiredEventProperties = {\n ...baseProperties,\n ...requestParamProperties,\n ...getRequestMetadataFromHistory(historyItem, selectedAccount),\n ...getTradeDataFromHistory(historyItem),\n ...getTxStatusesFromHistory(historyItem),\n ...getFinalizedTxProperties(historyItem, txMeta, approvalTxMeta),\n ...getPriceImpactFromQuote(quote),\n ...(eventName === UnifiedSwapBridgeEventName.Completed && {\n input_primary_denomination:\n historyItem.inputPrimaryDenomination ?? 'token_amount',\n }),\n };\n\n trackMetricsEvent({\n messenger: this.messenger,\n eventName,\n properties: requiredEventProperties,\n });\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { QuoteMetadata, RequiredEventContextFromClient, QuoteResponse, Trade, BatchSellTradesResponse } from "@metamask/bridge-controller";
1
+ import { QuoteMetadata, RequiredEventContextFromClient, QuoteResponse, Trade, BatchSellTradesResponse, InputPrimaryDenomination } from "@metamask/bridge-controller";
2
2
  import { UnifiedSwapBridgeEventName, MetaMetricsSwapsEventSource } from "@metamask/bridge-controller";
3
3
  import type { TraceCallback } from "@metamask/controller-utils";
4
4
  import { TransactionController } from "@metamask/transaction-controller";
@@ -88,13 +88,14 @@ export declare class BridgeStatusController extends BridgeStatusController_base<
88
88
  * @param activeAbTests - New A/B test context for `active_ab_tests` (migration target). Attributes events to specific experiments.
89
89
  * @param tokenSecurityTypeDestination - The security classification of the destination token, supplied by the client (e.g. from token security/scanning data). Pass `null` when no security data is available.
90
90
  * @param batchSellTrades - Contains transaction data for the quotes, provided by the obtainGaslessBatch API
91
+ * @param inputPrimaryDenomination - The denomination shown as the primary source amount input at submission time.
91
92
  * @returns The transaction meta
92
93
  * @throws An error if transaction submission fails before it gets published
93
94
  */
94
95
  submitTx: (accountAddress: string, maybeQuoteResponses: (QuoteResponse<Trade, Trade> & QuoteMetadata) | (QuoteResponse<Trade, Trade> & QuoteMetadata)[], isStxEnabled: boolean, quotesReceivedContext?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived], location?: MetaMetricsSwapsEventSource, abTests?: Record<string, string>, activeAbTests?: {
95
96
  key: string;
96
97
  value: string;
97
- }[], tokenSecurityTypeDestination?: string | null, batchSellTrades?: BatchSellTradesResponse | null) => Promise<TransactionMeta>;
98
+ }[], tokenSecurityTypeDestination?: string | null, batchSellTrades?: BatchSellTradesResponse | null, inputPrimaryDenomination?: InputPrimaryDenomination) => Promise<TransactionMeta>;
98
99
  /**
99
100
  * Submits an intent order and creates a synthetic history entry for UX.
100
101
  * The EIP-712 payload is always signed inside this controller via KeyringController.
@@ -106,6 +107,7 @@ export declare class BridgeStatusController extends BridgeStatusController_base<
106
107
  * @param params.abTests - Legacy A/B test context for `ab_tests` (backward compatibility)
107
108
  * @param params.activeAbTests - New A/B test context for `active_ab_tests` (migration target). Attributes events to specific experiments.
108
109
  * @param params.tokenSecurityTypeDestination - The security classification of the destination token, supplied by the client (e.g. from token security/scanning data). Pass `null` when no security data is available.
110
+ * @param params.inputPrimaryDenomination - The denomination shown as the primary source amount input at submission time.
109
111
  * @param params.isStxEnabled - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension
110
112
  * @param params.quotesReceivedContext - The context for the QuotesReceived event
111
113
  * @returns A lightweight TransactionMeta-like object for history linking
@@ -121,6 +123,7 @@ export declare class BridgeStatusController extends BridgeStatusController_base<
121
123
  value: string;
122
124
  }[];
123
125
  tokenSecurityTypeDestination?: string | null;
126
+ inputPrimaryDenomination?: InputPrimaryDenomination;
124
127
  isStxEnabled?: boolean;
125
128
  quotesReceivedContext?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived];
126
129
  }) => Promise<TransactionMeta>;
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-status-controller.d.cts","sourceRoot":"","sources":["../src/bridge-status-controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bridge-status-controller.d.cts","sourceRoot":"","sources":["../src/bridge-status-controller.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { QuoteMetadata, RequiredEventContextFromClient, QuoteResponse, Trade, BatchSellTradesResponse } from "@metamask/bridge-controller";
1
+ import { QuoteMetadata, RequiredEventContextFromClient, QuoteResponse, Trade, BatchSellTradesResponse, InputPrimaryDenomination } from "@metamask/bridge-controller";
2
2
  import { UnifiedSwapBridgeEventName, MetaMetricsSwapsEventSource } from "@metamask/bridge-controller";
3
3
  import type { TraceCallback } from "@metamask/controller-utils";
4
4
  import { TransactionController } from "@metamask/transaction-controller";
@@ -88,13 +88,14 @@ export declare class BridgeStatusController extends BridgeStatusController_base<
88
88
  * @param activeAbTests - New A/B test context for `active_ab_tests` (migration target). Attributes events to specific experiments.
89
89
  * @param tokenSecurityTypeDestination - The security classification of the destination token, supplied by the client (e.g. from token security/scanning data). Pass `null` when no security data is available.
90
90
  * @param batchSellTrades - Contains transaction data for the quotes, provided by the obtainGaslessBatch API
91
+ * @param inputPrimaryDenomination - The denomination shown as the primary source amount input at submission time.
91
92
  * @returns The transaction meta
92
93
  * @throws An error if transaction submission fails before it gets published
93
94
  */
94
95
  submitTx: (accountAddress: string, maybeQuoteResponses: (QuoteResponse<Trade, Trade> & QuoteMetadata) | (QuoteResponse<Trade, Trade> & QuoteMetadata)[], isStxEnabled: boolean, quotesReceivedContext?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived], location?: MetaMetricsSwapsEventSource, abTests?: Record<string, string>, activeAbTests?: {
95
96
  key: string;
96
97
  value: string;
97
- }[], tokenSecurityTypeDestination?: string | null, batchSellTrades?: BatchSellTradesResponse | null) => Promise<TransactionMeta>;
98
+ }[], tokenSecurityTypeDestination?: string | null, batchSellTrades?: BatchSellTradesResponse | null, inputPrimaryDenomination?: InputPrimaryDenomination) => Promise<TransactionMeta>;
98
99
  /**
99
100
  * Submits an intent order and creates a synthetic history entry for UX.
100
101
  * The EIP-712 payload is always signed inside this controller via KeyringController.
@@ -106,6 +107,7 @@ export declare class BridgeStatusController extends BridgeStatusController_base<
106
107
  * @param params.abTests - Legacy A/B test context for `ab_tests` (backward compatibility)
107
108
  * @param params.activeAbTests - New A/B test context for `active_ab_tests` (migration target). Attributes events to specific experiments.
108
109
  * @param params.tokenSecurityTypeDestination - The security classification of the destination token, supplied by the client (e.g. from token security/scanning data). Pass `null` when no security data is available.
110
+ * @param params.inputPrimaryDenomination - The denomination shown as the primary source amount input at submission time.
109
111
  * @param params.isStxEnabled - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension
110
112
  * @param params.quotesReceivedContext - The context for the QuotesReceived event
111
113
  * @returns A lightweight TransactionMeta-like object for history linking
@@ -121,6 +123,7 @@ export declare class BridgeStatusController extends BridgeStatusController_base<
121
123
  value: string;
122
124
  }[];
123
125
  tokenSecurityTypeDestination?: string | null;
126
+ inputPrimaryDenomination?: InputPrimaryDenomination;
124
127
  isStxEnabled?: boolean;
125
128
  quotesReceivedContext?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived];
126
129
  }) => Promise<TransactionMeta>;
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-status-controller.d.mts","sourceRoot":"","sources":["../src/bridge-status-controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bridge-status-controller.d.mts","sourceRoot":"","sources":["../src/bridge-status-controller.ts"],"names":[],"mappings":"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"}