@metamask-previews/bridge-status-controller 74.0.2-preview-6fc64deac → 74.0.2-preview-8b115b211

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
@@ -10,11 +10,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
10
10
  ### Added
11
11
 
12
12
  - Source transaction status from the `/getQuoteStatus` backend during polling for history items with an associated `quoteId`, falling back to the `/getTxStatus` bridge-api endpoint when no quote-status backend status is available yet or the QuoteStatusManager is disabled. ([#9389](https://github.com/MetaMask/core/pull/9389))
13
+ - Seed missing quote-status entries from persisted transaction history on startup, so quotes submitted before the client closed still get their status reported to the backend. Entries are rebuilt from the history item's `quoteId`, source transaction hash (falling back to the transaction's hash), and `txMetaId`; history items older than the quote-status entry TTL are skipped. ([#9405](https://github.com/MetaMask/core/pull/9405))
13
14
 
14
15
  ### Changed
15
16
 
16
17
  - Bump `@metamask/bridge-controller` from `^77.3.1` to `^77.3.2` ([#9372](https://github.com/MetaMask/core/pull/9372))
17
- - Bump `@metamask/messenger` from `^1.2.0` to `^2.0.0` ([#9392](https://github.com/MetaMask/core/pull/9392))
18
18
 
19
19
  ### Fixed
20
20
 
@@ -13,7 +13,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
13
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
15
  };
16
- var _BridgeStatusController_pollingTokensByTxMetaId, _BridgeStatusController_intentManager, _BridgeStatusController_quoteStatusManager, _BridgeStatusController_clientId, _BridgeStatusController_fetchFn, _BridgeStatusController_config, _BridgeStatusController_addTransactionBatchFn, _BridgeStatusController_trace, _BridgeStatusController_onTransactionFailed, _BridgeStatusController_onTransactionConfirmed, _BridgeStatusController_reportSubmittedForNonEvmTx, _BridgeStatusController_reportSubmittedOnce, _BridgeStatusController_restartPollingForIncompleteHistoryItems, _BridgeStatusController_addTxToHistory, _BridgeStatusController_rekeyHistoryItem, _BridgeStatusController_startPollingForTxId, _BridgeStatusController_handleFetchFailure, _BridgeStatusController_handleOldHistoryItem, _BridgeStatusController_fetchBridgeTxStatus, _BridgeStatusController_setAndGetSrcTxHash, _BridgeStatusController_updateHistoryItem, _BridgeStatusController_deleteHistoryItem, _BridgeStatusController_wipeBridgeStatusByChainId, _BridgeStatusController_executeSubmitStrategy, _BridgeStatusController_trackPollingStatusUpdatedEvent, _BridgeStatusController_trackUnifiedSwapBridgeEvent;
16
+ var _BridgeStatusController_pollingTokensByTxMetaId, _BridgeStatusController_intentManager, _BridgeStatusController_quoteStatusManager, _BridgeStatusController_clientId, _BridgeStatusController_fetchFn, _BridgeStatusController_config, _BridgeStatusController_addTransactionBatchFn, _BridgeStatusController_trace, _BridgeStatusController_onTransactionFailed, _BridgeStatusController_onTransactionConfirmed, _BridgeStatusController_reportSubmittedForNonEvmTx, _BridgeStatusController_reportSubmittedOnce, _BridgeStatusController_seedQuoteStatusEntriesFromHistory, _BridgeStatusController_restartPollingForIncompleteHistoryItems, _BridgeStatusController_addTxToHistory, _BridgeStatusController_rekeyHistoryItem, _BridgeStatusController_startPollingForTxId, _BridgeStatusController_handleFetchFailure, _BridgeStatusController_handleOldHistoryItem, _BridgeStatusController_fetchBridgeTxStatus, _BridgeStatusController_setAndGetSrcTxHash, _BridgeStatusController_updateHistoryItem, _BridgeStatusController_deleteHistoryItem, _BridgeStatusController_wipeBridgeStatusByChainId, _BridgeStatusController_executeSubmitStrategy, _BridgeStatusController_trackPollingStatusUpdatedEvent, _BridgeStatusController_trackUnifiedSwapBridgeEvent;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.BridgeStatusController = void 0;
19
19
  const bridge_controller_1 = require("@metamask/bridge-controller");
@@ -195,6 +195,9 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
195
195
  if (!historyItem?.quoteId) {
196
196
  return;
197
197
  }
198
+ // `reportedSubmittedTxHash` is set once `reportSubmitted` is called.
199
+ // This avoids processing multiple `eportSubmitted` for the
200
+ // same swap/bridge.
198
201
  if (historyItem.reportedSubmittedTxHash === srcTxHash) {
199
202
  return;
200
203
  }
@@ -287,6 +290,47 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
287
290
  this.getBridgeHistoryItemByTxMetaId = (txMetaId) => {
288
291
  return this.state.txHistory[txMetaId];
289
292
  };
293
+ /**
294
+ * Seeds missing quote-status entries from persisted history on startup.
295
+ *
296
+ * The deferred quote-status entry (keyed by `${quoteId}:${srcTxHash}`) is only
297
+ * created when `reportSubmitted` runs. If the client closes after a swap/bridge
298
+ * is submitted but before that happens, the entry is never created and
299
+ * `QuoteStatusManager.init()` has nothing to reconcile. The persisted history
300
+ * item carries the `quoteId`, source tx hash, and `txMetaId` needed to rebuild
301
+ * the entry, so we replay `reportSubmitted` here (idempotent via
302
+ * `#reportSubmittedOnce`) before `init()` runs.
303
+ */
304
+ _BridgeStatusController_seedQuoteStatusEntriesFromHistory.set(this, () => {
305
+ if (!__classPrivateFieldGet(this, _BridgeStatusController_quoteStatusManager, "f").enabled) {
306
+ // Skip seeding to prevent `#reportSubmittedOnce` from persisting
307
+ // `reportedSubmittedTxHash` so recent bridge history cannot be marked as
308
+ // already reported with no store entry or backend update.
309
+ return;
310
+ }
311
+ for (const [historyKey, historyItem] of Object.entries(this.state.txHistory)) {
312
+ const { quoteId, txMetaId } = historyItem;
313
+ if (!quoteId || !txMetaId) {
314
+ continue;
315
+ }
316
+ // Skip items older than the entry TTL: the backend would reject them, so
317
+ // there is no point creating an entry or making a request.
318
+ if (Date.now() - historyItem.startTime > constants_2.QUOTE_STATUS_UPDATE_ENTRY_TTL) {
319
+ continue;
320
+ }
321
+ // Prefer the history hash; fall back to the tx hash (covers STX swaps
322
+ // confirmed while closed, where the history hash was never written).
323
+ const srcTxHash = historyItem.status.srcChain.txHash ??
324
+ (0, transaction_1.getTransactionMetaById)(this.messenger, txMetaId)?.hash;
325
+ if (!srcTxHash) {
326
+ continue;
327
+ }
328
+ // Call `reportSubmittedOnce` for each history item that satisfies
329
+ // the above criteria. The method will then take care the rest
330
+ // (ie. if it actually needs to be reported or not because it already has been).
331
+ __classPrivateFieldGet(this, _BridgeStatusController_reportSubmittedOnce, "f").call(this, historyKey, srcTxHash, txMetaId);
332
+ }
333
+ });
290
334
  /**
291
335
  * Restart polling for txs that are not in a final state
292
336
  * This is called during initialization
@@ -1001,6 +1045,11 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
1001
1045
  isApprovalTxMeta: entryToUse?.[1]?.approvalTxId === transactionMeta.id,
1002
1046
  };
1003
1047
  });
1048
+ // Seed any missing quote-status entries from persisted history before
1049
+ // init(), so init()'s reconciliation loop can finalize quotes whose
1050
+ // deferred entry was never created (e.g. the client closed before
1051
+ // reportSubmitted ran).
1052
+ __classPrivateFieldGet(this, _BridgeStatusController_seedQuoteStatusEntriesFromHistory, "f").call(this);
1004
1053
  // Replay swap/bridge finalizations that resolved while the client was
1005
1054
  // closed, before resuming polling (which recovers in-flight bridges).
1006
1055
  __classPrivateFieldGet(this, _BridgeStatusController_quoteStatusManager, "f").init();
@@ -1011,5 +1060,5 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
1011
1060
  }
1012
1061
  }
1013
1062
  exports.BridgeStatusController = BridgeStatusController;
1014
- _BridgeStatusController_pollingTokensByTxMetaId = new WeakMap(), _BridgeStatusController_intentManager = new WeakMap(), _BridgeStatusController_quoteStatusManager = new WeakMap(), _BridgeStatusController_clientId = new WeakMap(), _BridgeStatusController_fetchFn = new WeakMap(), _BridgeStatusController_config = new WeakMap(), _BridgeStatusController_addTransactionBatchFn = new WeakMap(), _BridgeStatusController_trace = new WeakMap(), _BridgeStatusController_onTransactionFailed = new WeakMap(), _BridgeStatusController_onTransactionConfirmed = new WeakMap(), _BridgeStatusController_reportSubmittedForNonEvmTx = new WeakMap(), _BridgeStatusController_reportSubmittedOnce = new WeakMap(), _BridgeStatusController_restartPollingForIncompleteHistoryItems = new WeakMap(), _BridgeStatusController_addTxToHistory = new WeakMap(), _BridgeStatusController_rekeyHistoryItem = new WeakMap(), _BridgeStatusController_startPollingForTxId = new WeakMap(), _BridgeStatusController_handleFetchFailure = new WeakMap(), _BridgeStatusController_handleOldHistoryItem = new WeakMap(), _BridgeStatusController_fetchBridgeTxStatus = new WeakMap(), _BridgeStatusController_setAndGetSrcTxHash = new WeakMap(), _BridgeStatusController_updateHistoryItem = new WeakMap(), _BridgeStatusController_deleteHistoryItem = new WeakMap(), _BridgeStatusController_wipeBridgeStatusByChainId = new WeakMap(), _BridgeStatusController_executeSubmitStrategy = new WeakMap(), _BridgeStatusController_trackPollingStatusUpdatedEvent = new WeakMap(), _BridgeStatusController_trackUnifiedSwapBridgeEvent = new WeakMap();
1063
+ _BridgeStatusController_pollingTokensByTxMetaId = new WeakMap(), _BridgeStatusController_intentManager = new WeakMap(), _BridgeStatusController_quoteStatusManager = new WeakMap(), _BridgeStatusController_clientId = new WeakMap(), _BridgeStatusController_fetchFn = new WeakMap(), _BridgeStatusController_config = new WeakMap(), _BridgeStatusController_addTransactionBatchFn = new WeakMap(), _BridgeStatusController_trace = new WeakMap(), _BridgeStatusController_onTransactionFailed = new WeakMap(), _BridgeStatusController_onTransactionConfirmed = new WeakMap(), _BridgeStatusController_reportSubmittedForNonEvmTx = new WeakMap(), _BridgeStatusController_reportSubmittedOnce = new WeakMap(), _BridgeStatusController_seedQuoteStatusEntriesFromHistory = new WeakMap(), _BridgeStatusController_restartPollingForIncompleteHistoryItems = new WeakMap(), _BridgeStatusController_addTxToHistory = new WeakMap(), _BridgeStatusController_rekeyHistoryItem = new WeakMap(), _BridgeStatusController_startPollingForTxId = new WeakMap(), _BridgeStatusController_handleFetchFailure = new WeakMap(), _BridgeStatusController_handleOldHistoryItem = new WeakMap(), _BridgeStatusController_fetchBridgeTxStatus = new WeakMap(), _BridgeStatusController_setAndGetSrcTxHash = new WeakMap(), _BridgeStatusController_updateHistoryItem = new WeakMap(), _BridgeStatusController_deleteHistoryItem = new WeakMap(), _BridgeStatusController_wipeBridgeStatusByChainId = new WeakMap(), _BridgeStatusController_executeSubmitStrategy = new WeakMap(), _BridgeStatusController_trackPollingStatusUpdatedEvent = new WeakMap(), _BridgeStatusController_trackUnifiedSwapBridgeEvent = new WeakMap();
1015
1064
  //# sourceMappingURL=bridge-status-controller.cjs.map
@@ -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 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 {\n QUOTE_STATUS_UPDATE_ENTRY_TTL,\n QUOTE_STATUS_UPDATE_RETRY_INTERVAL_MS,\n} from './quote-status-manager/constants';\nimport {\n QuoteStatusGetError,\n QuoteStatusUpdateError,\n} from './quote-status-manager/errors';\nimport { QuoteStatusManager } from './quote-status-manager/quotes-status-manager';\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 fetchBridgeQuoteStatus,\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 // Deferred status updates used by QuoteStatusUpdateManager\n quoteUpdateStatusStore: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: false,\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 #quoteStatusManager: QuoteStatusManager;\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 clientProduct,\n clientVersion,\n fetchFn,\n addTransactionBatchFn,\n config,\n traceFn,\n onQuoteStatusManagerError,\n isQuoteStatusManagerEnabled,\n }: {\n messenger: BridgeStatusControllerMessenger;\n state?: Partial<BridgeStatusControllerState>;\n clientId: BridgeClientId;\n clientProduct: string;\n clientVersion?: string;\n fetchFn: FetchFunction;\n addTransactionBatchFn: typeof TransactionController.prototype.addTransactionBatch;\n config?: {\n customBridgeApiBaseUrl?: string;\n };\n traceFn?: TraceCallback;\n onQuoteStatusManagerError?: (\n error: QuoteStatusUpdateError | QuoteStatusGetError,\n ) => void;\n isQuoteStatusManagerEnabled?: () => boolean;\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 this.#quoteStatusManager = new QuoteStatusManager({\n messenger: this.messenger,\n clientId: this.#clientId,\n clientProduct,\n clientVersion,\n apiBaseUrl: this.#config.customBridgeApiBaseUrl,\n initialData: this.state.quoteUpdateStatusStore,\n onPersistUpdates: (updates): void => {\n this.update((draft) => {\n draft.quoteUpdateStatusStore = updates;\n });\n },\n entryTtlMs: QUOTE_STATUS_UPDATE_ENTRY_TTL,\n updateIntervalMs: QUOTE_STATUS_UPDATE_RETRY_INTERVAL_MS,\n onError: onQuoteStatusManagerError,\n isEnabled: isQuoteStatusManagerEnabled,\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.submitted:\n // EVM txs report SUBMITTED here (not via transactionSubmitted) so hash\n // replacements before confirmation still reach the Bridge API.\n if (\n txMeta.hash &&\n txMeta.type &&\n isCrossChainTx(txMeta.type) &&\n !isApprovalTxMeta &&\n historyKey\n ) {\n this.#reportSubmittedOnce(historyKey, txMeta.hash, txMeta.id);\n }\n break;\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 // Replay swap/bridge finalizations that resolved while the client was\n // closed, before resuming polling (which recovers in-flight bridges).\n this.#quoteStatusManager.init();\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 // Report finalized failure for swap/bridge transactions.\n // Note: TransactionStatus.rejected means the user cancelled signing, so the tx was never broadcast.\n // `hasNestedSwapTransactions` also covers batch/7702 swaps whose type may\n // still read as `batch` rather than `swap`.\n if (\n (txMeta.type && isCrossChainTx(txMeta.type)) ||\n hasNestedSwapTransactions(txMeta)\n ) {\n this.#quoteStatusManager.reportFinalised(txMeta.id, false);\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 if (isSwap) {\n this.#updateHistoryItem({\n historyKey,\n status: StatusTypes.COMPLETE,\n completionTime: Date.now(),\n });\n\n // For EVM intent-based swaps the synthetic tx transitions\n // submitted→confirmed in a single update that carries the CoW\n // settlement hash, so the submitted status handler never has a hash\n // and reportSubmitted is never called. Call it here (before\n // reportFinalised) so the deferred-queue entry is created.\n const historyItem = historyKey\n ? this.state.txHistory[historyKey]\n : undefined;\n if (\n historyKey &&\n historyItem &&\n txMeta.hash &&\n !isNonEvmChainId(historyItem.quote.srcChainId)\n ) {\n this.#reportSubmittedOnce(historyKey, txMeta.hash, txMeta.id);\n }\n this.#quoteStatusManager.reportFinalised(txMeta.id, true);\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n historyKey,\n );\n } else if (historyKey) {\n this.#startPollingForTxId(historyKey);\n }\n };\n\n /**\n * Reports the SUBMITTED quote status for non-EVM transactions.\n *\n * EVM transactions report SUBMITTED via the\n * `TransactionController:transactionStatusUpdated` subscription, which also\n * picks up hash replacements (speed-up/cancel) and the late hash assignment\n * of smart/batch transactions. Non-EVM transactions (Solana, Bitcoin, Tron)\n * are submitted through Snaps and never emit TransactionController lifecycle\n * events, so they are reported here once the history item exists and the\n * source tx hash is known.\n *\n * @param historyKey - The key of the history item in `txHistory`\n * @param txMeta - The submitted trade transaction's id and hash\n * @param txMeta.id - The transaction meta id, used for finalization matching\n * @param txMeta.hash - The source chain transaction hash\n */\n readonly #reportSubmittedForNonEvmTx = (\n historyKey: string,\n txMeta?: { id?: string; hash?: string },\n ): void => {\n if (!txMeta?.id || !txMeta.hash) {\n return;\n }\n const historyItem = this.state.txHistory[historyKey];\n if (!historyItem || !isNonEvmChainId(historyItem.quote.srcChainId)) {\n return;\n }\n this.#reportSubmittedOnce(historyKey, txMeta.hash, txMeta.id);\n };\n\n /**\n * Reports a SUBMITTED quote status update exactly once per source tx hash.\n *\n * SUBMITTED can be triggered from several code paths (submission, the first\n * poll where the hash is known, and the final-status branch) and the poll\n * path runs on every interval.\n *\n * @param historyKey - The key of the history item in `txHistory`\n * @param srcTxHash - The source chain transaction hash\n * @param txMetaId - The transaction meta id, used for finalization matching\n */\n readonly #reportSubmittedOnce = (\n historyKey: string,\n srcTxHash: string,\n txMetaId: string,\n ): void => {\n const historyItem = this.state.txHistory[historyKey];\n if (!historyItem?.quoteId) {\n return;\n }\n if (historyItem.reportedSubmittedTxHash === srcTxHash) {\n return;\n }\n this.#quoteStatusManager.reportSubmitted(\n historyItem.quoteId,\n srcTxHash,\n txMetaId,\n );\n this.update((state) => {\n const item = state.txHistory[historyKey];\n if (item) {\n item.reportedSubmittedTxHash = srcTxHash;\n }\n });\n };\n\n resetState = (): void => {\n this.#quoteStatusManager.destroy();\n this.update((state) => {\n state.txHistory = DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.txHistory;\n state.quoteUpdateStatusStore =\n DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.quoteUpdateStatusStore;\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 // Report finalization as a failure here, this is the only place that\n // permanently ends polling, so it's the correct and non-duplicative point\n // to emit the final status.\n this.#quoteStatusManager.reportFinalised(bridgeTxMetaId, false);\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\n // Report SUBMITTED as soon as the intent's source/settlement hash is\n // known at poll time, before the order reaches a terminal status.\n const intentSrcTxHash = status.srcChain.txHash;\n if (intentSrcTxHash) {\n this.#reportSubmittedOnce(\n bridgeTxMetaId,\n intentSrcTxHash,\n bridgeTxMetaId,\n );\n }\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 // Report SUBMITTED as soon as a srcTxHash is known at poll time, for\n // every chain not just non-EVM sources.\n this.#reportSubmittedOnce(bridgeTxMetaId, srcTxHash, bridgeTxMetaId);\n\n const statusRequest = getStatusRequestWithSrcTxHash(\n historyItem.quote,\n srcTxHash,\n );\n const response =\n (historyItem.quoteId\n ? await fetchBridgeQuoteStatus(\n this.#quoteStatusManager,\n historyItem.quoteId,\n )\n : null) ??\n (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) {\n if (pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n }\n\n // Ensure a deferred entry exists before reportFinalised is called.\n const settlementTxHash = newBridgeHistoryItem.status.srcChain.txHash;\n if (settlementTxHash) {\n this.#reportSubmittedOnce(\n bridgeTxMetaId,\n settlementTxHash,\n bridgeTxMetaId,\n );\n }\n\n this.#quoteStatusManager.reportFinalised(\n bridgeTxMetaId,\n status.status === StatusTypes.COMPLETE,\n );\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 // Report SUBMITTED as soon as the trade hash is known at submission\n // time, instead of waiting for the delayed transactionStatusUpdated\n // (submitted) event.\n if (payload.tradeMeta.hash) {\n this.#reportSubmittedOnce(\n payload.newHistoryKey,\n payload.tradeMeta.hash,\n payload.tradeMeta.id,\n );\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 this.#reportSubmittedForNonEvmTx(\n payload.historyKey,\n payload.bridgeTxMeta,\n );\n break;\n\n case SubmitStep.StartPolling:\n this.#startPollingForTxId(payload.historyKey);\n break;\n\n case SubmitStep.PublishCompletedEvent:\n this.#quoteStatusManager.reportFinalised(payload.historyKey, true);\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.Unknown,\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 ...(inputPrimaryDenomination && {\n input_primary_denomination: inputPrimaryDenomination,\n }),\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 historyItem?.location ??\n eventProperties?.location ??\n MetaMetricsSwapsEventSource.Unknown;\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 historyItem.inputPrimaryDenomination && {\n input_primary_denomination: historyItem.inputPrimaryDenomination,\n }),\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 {\n QUOTE_STATUS_UPDATE_ENTRY_TTL,\n QUOTE_STATUS_UPDATE_RETRY_INTERVAL_MS,\n} from './quote-status-manager/constants';\nimport {\n QuoteStatusGetError,\n QuoteStatusUpdateError,\n} from './quote-status-manager/errors';\nimport { QuoteStatusManager } from './quote-status-manager/quotes-status-manager';\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 fetchBridgeQuoteStatus,\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 // Deferred status updates used by QuoteStatusUpdateManager\n quoteUpdateStatusStore: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: false,\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 #quoteStatusManager: QuoteStatusManager;\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 clientProduct,\n clientVersion,\n fetchFn,\n addTransactionBatchFn,\n config,\n traceFn,\n onQuoteStatusManagerError,\n isQuoteStatusManagerEnabled,\n }: {\n messenger: BridgeStatusControllerMessenger;\n state?: Partial<BridgeStatusControllerState>;\n clientId: BridgeClientId;\n clientProduct: string;\n clientVersion?: string;\n fetchFn: FetchFunction;\n addTransactionBatchFn: typeof TransactionController.prototype.addTransactionBatch;\n config?: {\n customBridgeApiBaseUrl?: string;\n };\n traceFn?: TraceCallback;\n onQuoteStatusManagerError?: (\n error: QuoteStatusUpdateError | QuoteStatusGetError,\n ) => void;\n isQuoteStatusManagerEnabled?: () => boolean;\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 this.#quoteStatusManager = new QuoteStatusManager({\n messenger: this.messenger,\n clientId: this.#clientId,\n clientProduct,\n clientVersion,\n apiBaseUrl: this.#config.customBridgeApiBaseUrl,\n initialData: this.state.quoteUpdateStatusStore,\n onPersistUpdates: (updates): void => {\n this.update((draft) => {\n draft.quoteUpdateStatusStore = updates;\n });\n },\n entryTtlMs: QUOTE_STATUS_UPDATE_ENTRY_TTL,\n updateIntervalMs: QUOTE_STATUS_UPDATE_RETRY_INTERVAL_MS,\n onError: onQuoteStatusManagerError,\n isEnabled: isQuoteStatusManagerEnabled,\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.submitted:\n // EVM txs report SUBMITTED here (not via transactionSubmitted) so hash\n // replacements before confirmation still reach the Bridge API.\n if (\n txMeta.hash &&\n txMeta.type &&\n isCrossChainTx(txMeta.type) &&\n !isApprovalTxMeta &&\n historyKey\n ) {\n this.#reportSubmittedOnce(historyKey, txMeta.hash, txMeta.id);\n }\n break;\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 // Seed any missing quote-status entries from persisted history before\n // init(), so init()'s reconciliation loop can finalize quotes whose\n // deferred entry was never created (e.g. the client closed before\n // reportSubmitted ran).\n this.#seedQuoteStatusEntriesFromHistory();\n\n // Replay swap/bridge finalizations that resolved while the client was\n // closed, before resuming polling (which recovers in-flight bridges).\n this.#quoteStatusManager.init();\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 // Report finalized failure for swap/bridge transactions.\n // Note: TransactionStatus.rejected means the user cancelled signing, so the tx was never broadcast.\n // `hasNestedSwapTransactions` also covers batch/7702 swaps whose type may\n // still read as `batch` rather than `swap`.\n if (\n (txMeta.type && isCrossChainTx(txMeta.type)) ||\n hasNestedSwapTransactions(txMeta)\n ) {\n this.#quoteStatusManager.reportFinalised(txMeta.id, false);\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 if (isSwap) {\n this.#updateHistoryItem({\n historyKey,\n status: StatusTypes.COMPLETE,\n completionTime: Date.now(),\n });\n\n // For EVM intent-based swaps the synthetic tx transitions\n // submitted→confirmed in a single update that carries the CoW\n // settlement hash, so the submitted status handler never has a hash\n // and reportSubmitted is never called. Call it here (before\n // reportFinalised) so the deferred-queue entry is created.\n const historyItem = historyKey\n ? this.state.txHistory[historyKey]\n : undefined;\n if (\n historyKey &&\n historyItem &&\n txMeta.hash &&\n !isNonEvmChainId(historyItem.quote.srcChainId)\n ) {\n this.#reportSubmittedOnce(historyKey, txMeta.hash, txMeta.id);\n }\n this.#quoteStatusManager.reportFinalised(txMeta.id, true);\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n historyKey,\n );\n } else if (historyKey) {\n this.#startPollingForTxId(historyKey);\n }\n };\n\n /**\n * Reports the SUBMITTED quote status for non-EVM transactions.\n *\n * EVM transactions report SUBMITTED via the\n * `TransactionController:transactionStatusUpdated` subscription, which also\n * picks up hash replacements (speed-up/cancel) and the late hash assignment\n * of smart/batch transactions. Non-EVM transactions (Solana, Bitcoin, Tron)\n * are submitted through Snaps and never emit TransactionController lifecycle\n * events, so they are reported here once the history item exists and the\n * source tx hash is known.\n *\n * @param historyKey - The key of the history item in `txHistory`\n * @param txMeta - The submitted trade transaction's id and hash\n * @param txMeta.id - The transaction meta id, used for finalization matching\n * @param txMeta.hash - The source chain transaction hash\n */\n readonly #reportSubmittedForNonEvmTx = (\n historyKey: string,\n txMeta?: { id?: string; hash?: string },\n ): void => {\n if (!txMeta?.id || !txMeta.hash) {\n return;\n }\n const historyItem = this.state.txHistory[historyKey];\n if (!historyItem || !isNonEvmChainId(historyItem.quote.srcChainId)) {\n return;\n }\n this.#reportSubmittedOnce(historyKey, txMeta.hash, txMeta.id);\n };\n\n /**\n * Reports a SUBMITTED quote status update exactly once per source tx hash.\n *\n * SUBMITTED can be triggered from several code paths (submission, the first\n * poll where the hash is known, and the final-status branch) and the poll\n * path runs on every interval.\n *\n * @param historyKey - The key of the history item in `txHistory`\n * @param srcTxHash - The source chain transaction hash\n * @param txMetaId - The transaction meta id, used for finalization matching\n */\n readonly #reportSubmittedOnce = (\n historyKey: string,\n srcTxHash: string,\n txMetaId: string,\n ): void => {\n const historyItem = this.state.txHistory[historyKey];\n if (!historyItem?.quoteId) {\n return;\n }\n // `reportedSubmittedTxHash` is set once `reportSubmitted` is called.\n // This avoids processing multiple `eportSubmitted` for the\n // same swap/bridge.\n if (historyItem.reportedSubmittedTxHash === srcTxHash) {\n return;\n }\n this.#quoteStatusManager.reportSubmitted(\n historyItem.quoteId,\n srcTxHash,\n txMetaId,\n );\n this.update((state) => {\n const item = state.txHistory[historyKey];\n if (item) {\n item.reportedSubmittedTxHash = srcTxHash;\n }\n });\n };\n\n resetState = (): void => {\n this.#quoteStatusManager.destroy();\n this.update((state) => {\n state.txHistory = DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.txHistory;\n state.quoteUpdateStatusStore =\n DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.quoteUpdateStatusStore;\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 * Seeds missing quote-status entries from persisted history on startup.\n *\n * The deferred quote-status entry (keyed by `${quoteId}:${srcTxHash}`) is only\n * created when `reportSubmitted` runs. If the client closes after a swap/bridge\n * is submitted but before that happens, the entry is never created and\n * `QuoteStatusManager.init()` has nothing to reconcile. The persisted history\n * item carries the `quoteId`, source tx hash, and `txMetaId` needed to rebuild\n * the entry, so we replay `reportSubmitted` here (idempotent via\n * `#reportSubmittedOnce`) before `init()` runs.\n */\n readonly #seedQuoteStatusEntriesFromHistory = (): void => {\n if (!this.#quoteStatusManager.enabled) {\n // Skip seeding to prevent `#reportSubmittedOnce` from persisting\n // `reportedSubmittedTxHash` so recent bridge history cannot be marked as\n // already reported with no store entry or backend update.\n return;\n }\n\n for (const [historyKey, historyItem] of Object.entries(\n this.state.txHistory,\n )) {\n const { quoteId, txMetaId } = historyItem;\n if (!quoteId || !txMetaId) {\n continue;\n }\n\n // Skip items older than the entry TTL: the backend would reject them, so\n // there is no point creating an entry or making a request.\n if (Date.now() - historyItem.startTime > QUOTE_STATUS_UPDATE_ENTRY_TTL) {\n continue;\n }\n\n // Prefer the history hash; fall back to the tx hash (covers STX swaps\n // confirmed while closed, where the history hash was never written).\n const srcTxHash =\n historyItem.status.srcChain.txHash ??\n getTransactionMetaById(this.messenger, txMetaId)?.hash;\n if (!srcTxHash) {\n continue;\n }\n\n // Call `reportSubmittedOnce` for each history item that satisfies\n // the above criteria. The method will then take care the rest\n // (ie. if it actually needs to be reported or not because it already has been).\n this.#reportSubmittedOnce(historyKey, srcTxHash, txMetaId);\n }\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 // Report finalization as a failure here, this is the only place that\n // permanently ends polling, so it's the correct and non-duplicative point\n // to emit the final status.\n this.#quoteStatusManager.reportFinalised(bridgeTxMetaId, false);\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\n // Report SUBMITTED as soon as the intent's source/settlement hash is\n // known at poll time, before the order reaches a terminal status.\n const intentSrcTxHash = status.srcChain.txHash;\n if (intentSrcTxHash) {\n this.#reportSubmittedOnce(\n bridgeTxMetaId,\n intentSrcTxHash,\n bridgeTxMetaId,\n );\n }\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 // Report SUBMITTED as soon as a srcTxHash is known at poll time, for\n // every chain not just non-EVM sources.\n this.#reportSubmittedOnce(bridgeTxMetaId, srcTxHash, bridgeTxMetaId);\n\n const statusRequest = getStatusRequestWithSrcTxHash(\n historyItem.quote,\n srcTxHash,\n );\n const response =\n (historyItem.quoteId\n ? await fetchBridgeQuoteStatus(\n this.#quoteStatusManager,\n historyItem.quoteId,\n )\n : null) ??\n (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) {\n if (pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n }\n\n // Ensure a deferred entry exists before reportFinalised is called.\n const settlementTxHash = newBridgeHistoryItem.status.srcChain.txHash;\n if (settlementTxHash) {\n this.#reportSubmittedOnce(\n bridgeTxMetaId,\n settlementTxHash,\n bridgeTxMetaId,\n );\n }\n\n this.#quoteStatusManager.reportFinalised(\n bridgeTxMetaId,\n status.status === StatusTypes.COMPLETE,\n );\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 // Report SUBMITTED as soon as the trade hash is known at submission\n // time, instead of waiting for the delayed transactionStatusUpdated\n // (submitted) event.\n if (payload.tradeMeta.hash) {\n this.#reportSubmittedOnce(\n payload.newHistoryKey,\n payload.tradeMeta.hash,\n payload.tradeMeta.id,\n );\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 this.#reportSubmittedForNonEvmTx(\n payload.historyKey,\n payload.bridgeTxMeta,\n );\n break;\n\n case SubmitStep.StartPolling:\n this.#startPollingForTxId(payload.historyKey);\n break;\n\n case SubmitStep.PublishCompletedEvent:\n this.#quoteStatusManager.reportFinalised(payload.historyKey, true);\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.Unknown,\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 ...(inputPrimaryDenomination && {\n input_primary_denomination: inputPrimaryDenomination,\n }),\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 historyItem?.location ??\n eventProperties?.location ??\n MetaMetricsSwapsEventSource.Unknown;\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 historyItem.inputPrimaryDenomination && {\n input_primary_denomination: historyItem.inputPrimaryDenomination,\n }),\n };\n\n trackMetricsEvent({\n messenger: this.messenger,\n eventName,\n properties: requiredEventProperties,\n });\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-status-controller.d.cts","sourceRoot":"","sources":["../src/bridge-status-controller.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,8BAA8B,EAC9B,aAAa,EACb,KAAK,EAEL,uBAAuB,EACvB,wBAAwB,EACzB,oCAAoC;AACrC,OAAO,EAIL,0BAA0B,EAG1B,2BAA2B,EAG5B,oCAAoC;AACrC,OAAO,KAAK,EAAE,aAAa,EAAE,mCAAmC;AAEhE,OAAO,EAGL,qBAAqB,EAEtB,yCAAyC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAKxE,OAAO,EAGL,6BAA6B,EAI9B,wBAAoB;AAKrB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACvB,0CAAsC;AAKvC,OAAO,KAAK,EACV,2BAA2B,EAC3B,2CAA2C,EAC3C,aAAa,EACb,iBAAiB,EAClB,oBAAgB;AACjB,OAAO,KAAK,EAAE,+BAA+B,EAAE,oBAAgB;AAC/D,OAAO,EAAE,cAAc,EAAE,oBAAgB;AA6DzC,wEAAwE;AACxE,KAAK,wBAAwB,GAAG,uBAAuB,CAAC;AAGxD,MAAM,MAAM,uBAAuB,GAAG;IACpC,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;;;;;;;;;;;;;;;;AAaF,qBAAa,sBAAuB,SAAQ,4BAC1C,OAAO,6BAA6B,EACpC,2BAA2B,EAC3B,+BAA+B,CAChC;;gBAmBa,EACV,SAAS,EACT,KAAK,EACL,QAAQ,EACR,aAAa,EACb,aAAa,EACb,OAAO,EACP,qBAAqB,EACrB,MAAM,EACN,OAAO,EACP,yBAAyB,EACzB,2BAA2B,GAC5B,EAAE;QACD,SAAS,EAAE,+BAA+B,CAAC;QAC3C,KAAK,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAC7C,QAAQ,EAAE,cAAc,CAAC;QACzB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,aAAa,CAAC;QACvB,qBAAqB,EAAE,OAAO,qBAAqB,CAAC,SAAS,CAAC,mBAAmB,CAAC;QAClF,MAAM,CAAC,EAAE;YACP,sBAAsB,CAAC,EAAE,MAAM,CAAC;SACjC,CAAC;QACF,OAAO,CAAC,EAAE,aAAa,CAAC;QACxB,yBAAyB,CAAC,EAAE,CAC1B,KAAK,EAAE,sBAAsB,GAAG,mBAAmB,KAChD,IAAI,CAAC;QACV,2BAA2B,CAAC,EAAE,MAAM,OAAO,CAAC;KAC7C;IAoTD,UAAU,QAAO,IAAI,CAOnB;IAEF,gBAAgB;iBAIL,MAAM;uBACA,OAAO;UACpB,IAAI,CAWN;IAEF;;;;;;;OAOG;IACH,+BAA+B,eAAgB;QAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,KAAG,IAAI,CA+DN;IAEF;;;;;OAKG;IACH,8BAA8B,aAClB,MAAM,KACf,iBAAiB,GAAG,SAAS,CAE9B;IA6FF;;;;;;;;;OASG;IACH,6BAA6B,kBACZ,2CAA2C,KACzD,IAAI,CAWL;IAIF,YAAY,iBACI,wBAAwB,KACrC,QAAQ,IAAI,CAAC,CAEd;IAgfF;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,mBACU,MAAM,uBAElB,CAAC,cAAc,KAAK,EAAE,KAAK,CAAC,GAAG,aAAa,CAAC,GAC7C,CAAC,cAAc,KAAK,EAAE,KAAK,CAAC,GAAG,aAAa,CAAC,EAAE,gBACrC,OAAO,0BACG,8BAA8B,CAAC,2BAA2B,cAAc,CAAC,aACvF,2BAA2B,YAC3B,OAAO,MAAM,EAAE,MAAM,CAAC,kBAChB;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,iCACjB,MAAM,GAAG,IAAI,oBAC1B,uBAAuB,GAAG,IAAI,6BACrB,wBAAwB,KAClD,QAAQ,eAAe,CAAC,CAqHzB;IAEF;;;;;;;;;;;;;;;;OAgBG;IACH,YAAY,WAAkB;QAC5B,aAAa,EAAE,cAAc,KAAK,EAAE,KAAK,CAAC,GAAG,aAAa,CAAC;QAC3D,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,2BAA2B,CAAC;QACvC,OAAO,CAAC,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,aAAa,CAAC,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACjD,4BAA4B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7C,wBAAwB,CAAC,EAAE,wBAAwB,CAAC;QACpD,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,qBAAqB,CAAC,EAAE,8BAA8B,CAAC,2BAA2B,cAAc,CAAC,CAAC;KACnG,KAAG,QAAQ,eAAe,CAAC,CA0B1B;IAEF,eAAe,WAAkB;QAC/B,cAAc,EAAE,CAAC,CAAC,cAAc,KAAK,EAAE,KAAK,CAAC,GAAG,aAAa,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;QACzE,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,2BAA2B,CAAC;QACvC,OAAO,CAAC,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,aAAa,CAAC,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACjD,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,qBAAqB,CAAC,EAAE,8BAA8B,CAAC,2BAA2B,cAAc,CAAC,CAAC;QAClG,4BAA4B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9C,KAAG,QAAQ,eAAe,CAAC,CAsB1B;CA+JH"}
1
+ {"version":3,"file":"bridge-status-controller.d.cts","sourceRoot":"","sources":["../src/bridge-status-controller.ts"],"names":[],"mappings":"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"}
@@ -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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"}
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _BridgeStatusController_pollingTokensByTxMetaId, _BridgeStatusController_intentManager, _BridgeStatusController_quoteStatusManager, _BridgeStatusController_clientId, _BridgeStatusController_fetchFn, _BridgeStatusController_config, _BridgeStatusController_addTransactionBatchFn, _BridgeStatusController_trace, _BridgeStatusController_onTransactionFailed, _BridgeStatusController_onTransactionConfirmed, _BridgeStatusController_reportSubmittedForNonEvmTx, _BridgeStatusController_reportSubmittedOnce, _BridgeStatusController_restartPollingForIncompleteHistoryItems, _BridgeStatusController_addTxToHistory, _BridgeStatusController_rekeyHistoryItem, _BridgeStatusController_startPollingForTxId, _BridgeStatusController_handleFetchFailure, _BridgeStatusController_handleOldHistoryItem, _BridgeStatusController_fetchBridgeTxStatus, _BridgeStatusController_setAndGetSrcTxHash, _BridgeStatusController_updateHistoryItem, _BridgeStatusController_deleteHistoryItem, _BridgeStatusController_wipeBridgeStatusByChainId, _BridgeStatusController_executeSubmitStrategy, _BridgeStatusController_trackPollingStatusUpdatedEvent, _BridgeStatusController_trackUnifiedSwapBridgeEvent;
12
+ var _BridgeStatusController_pollingTokensByTxMetaId, _BridgeStatusController_intentManager, _BridgeStatusController_quoteStatusManager, _BridgeStatusController_clientId, _BridgeStatusController_fetchFn, _BridgeStatusController_config, _BridgeStatusController_addTransactionBatchFn, _BridgeStatusController_trace, _BridgeStatusController_onTransactionFailed, _BridgeStatusController_onTransactionConfirmed, _BridgeStatusController_reportSubmittedForNonEvmTx, _BridgeStatusController_reportSubmittedOnce, _BridgeStatusController_seedQuoteStatusEntriesFromHistory, _BridgeStatusController_restartPollingForIncompleteHistoryItems, _BridgeStatusController_addTxToHistory, _BridgeStatusController_rekeyHistoryItem, _BridgeStatusController_startPollingForTxId, _BridgeStatusController_handleFetchFailure, _BridgeStatusController_handleOldHistoryItem, _BridgeStatusController_fetchBridgeTxStatus, _BridgeStatusController_setAndGetSrcTxHash, _BridgeStatusController_updateHistoryItem, _BridgeStatusController_deleteHistoryItem, _BridgeStatusController_wipeBridgeStatusByChainId, _BridgeStatusController_executeSubmitStrategy, _BridgeStatusController_trackPollingStatusUpdatedEvent, _BridgeStatusController_trackUnifiedSwapBridgeEvent;
13
13
  import { FeatureId } from "@metamask/bridge-controller";
14
14
  import { isNonEvmChainId, StatusTypes, getAccountHardwareType, UnifiedSwapBridgeEventName, isCrossChain, MetricsActionType, MetaMetricsSwapsEventSource, PollingStatus, formatChainIdToHex } from "@metamask/bridge-controller";
15
15
  import { StaticIntervalPollingController } from "@metamask/polling-controller";
@@ -189,6 +189,9 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
189
189
  if (!historyItem?.quoteId) {
190
190
  return;
191
191
  }
192
+ // `reportedSubmittedTxHash` is set once `reportSubmitted` is called.
193
+ // This avoids processing multiple `eportSubmitted` for the
194
+ // same swap/bridge.
192
195
  if (historyItem.reportedSubmittedTxHash === srcTxHash) {
193
196
  return;
194
197
  }
@@ -281,6 +284,47 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
281
284
  this.getBridgeHistoryItemByTxMetaId = (txMetaId) => {
282
285
  return this.state.txHistory[txMetaId];
283
286
  };
287
+ /**
288
+ * Seeds missing quote-status entries from persisted history on startup.
289
+ *
290
+ * The deferred quote-status entry (keyed by `${quoteId}:${srcTxHash}`) is only
291
+ * created when `reportSubmitted` runs. If the client closes after a swap/bridge
292
+ * is submitted but before that happens, the entry is never created and
293
+ * `QuoteStatusManager.init()` has nothing to reconcile. The persisted history
294
+ * item carries the `quoteId`, source tx hash, and `txMetaId` needed to rebuild
295
+ * the entry, so we replay `reportSubmitted` here (idempotent via
296
+ * `#reportSubmittedOnce`) before `init()` runs.
297
+ */
298
+ _BridgeStatusController_seedQuoteStatusEntriesFromHistory.set(this, () => {
299
+ if (!__classPrivateFieldGet(this, _BridgeStatusController_quoteStatusManager, "f").enabled) {
300
+ // Skip seeding to prevent `#reportSubmittedOnce` from persisting
301
+ // `reportedSubmittedTxHash` so recent bridge history cannot be marked as
302
+ // already reported with no store entry or backend update.
303
+ return;
304
+ }
305
+ for (const [historyKey, historyItem] of Object.entries(this.state.txHistory)) {
306
+ const { quoteId, txMetaId } = historyItem;
307
+ if (!quoteId || !txMetaId) {
308
+ continue;
309
+ }
310
+ // Skip items older than the entry TTL: the backend would reject them, so
311
+ // there is no point creating an entry or making a request.
312
+ if (Date.now() - historyItem.startTime > QUOTE_STATUS_UPDATE_ENTRY_TTL) {
313
+ continue;
314
+ }
315
+ // Prefer the history hash; fall back to the tx hash (covers STX swaps
316
+ // confirmed while closed, where the history hash was never written).
317
+ const srcTxHash = historyItem.status.srcChain.txHash ??
318
+ getTransactionMetaById(this.messenger, txMetaId)?.hash;
319
+ if (!srcTxHash) {
320
+ continue;
321
+ }
322
+ // Call `reportSubmittedOnce` for each history item that satisfies
323
+ // the above criteria. The method will then take care the rest
324
+ // (ie. if it actually needs to be reported or not because it already has been).
325
+ __classPrivateFieldGet(this, _BridgeStatusController_reportSubmittedOnce, "f").call(this, historyKey, srcTxHash, txMetaId);
326
+ }
327
+ });
284
328
  /**
285
329
  * Restart polling for txs that are not in a final state
286
330
  * This is called during initialization
@@ -995,6 +1039,11 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
995
1039
  isApprovalTxMeta: entryToUse?.[1]?.approvalTxId === transactionMeta.id,
996
1040
  };
997
1041
  });
1042
+ // Seed any missing quote-status entries from persisted history before
1043
+ // init(), so init()'s reconciliation loop can finalize quotes whose
1044
+ // deferred entry was never created (e.g. the client closed before
1045
+ // reportSubmitted ran).
1046
+ __classPrivateFieldGet(this, _BridgeStatusController_seedQuoteStatusEntriesFromHistory, "f").call(this);
998
1047
  // Replay swap/bridge finalizations that resolved while the client was
999
1048
  // closed, before resuming polling (which recovers in-flight bridges).
1000
1049
  __classPrivateFieldGet(this, _BridgeStatusController_quoteStatusManager, "f").init();
@@ -1004,5 +1053,5 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
1004
1053
  __classPrivateFieldGet(this, _BridgeStatusController_restartPollingForIncompleteHistoryItems, "f").call(this);
1005
1054
  }
1006
1055
  }
1007
- _BridgeStatusController_pollingTokensByTxMetaId = new WeakMap(), _BridgeStatusController_intentManager = new WeakMap(), _BridgeStatusController_quoteStatusManager = new WeakMap(), _BridgeStatusController_clientId = new WeakMap(), _BridgeStatusController_fetchFn = new WeakMap(), _BridgeStatusController_config = new WeakMap(), _BridgeStatusController_addTransactionBatchFn = new WeakMap(), _BridgeStatusController_trace = new WeakMap(), _BridgeStatusController_onTransactionFailed = new WeakMap(), _BridgeStatusController_onTransactionConfirmed = new WeakMap(), _BridgeStatusController_reportSubmittedForNonEvmTx = new WeakMap(), _BridgeStatusController_reportSubmittedOnce = new WeakMap(), _BridgeStatusController_restartPollingForIncompleteHistoryItems = new WeakMap(), _BridgeStatusController_addTxToHistory = new WeakMap(), _BridgeStatusController_rekeyHistoryItem = new WeakMap(), _BridgeStatusController_startPollingForTxId = new WeakMap(), _BridgeStatusController_handleFetchFailure = new WeakMap(), _BridgeStatusController_handleOldHistoryItem = new WeakMap(), _BridgeStatusController_fetchBridgeTxStatus = new WeakMap(), _BridgeStatusController_setAndGetSrcTxHash = new WeakMap(), _BridgeStatusController_updateHistoryItem = new WeakMap(), _BridgeStatusController_deleteHistoryItem = new WeakMap(), _BridgeStatusController_wipeBridgeStatusByChainId = new WeakMap(), _BridgeStatusController_executeSubmitStrategy = new WeakMap(), _BridgeStatusController_trackPollingStatusUpdatedEvent = new WeakMap(), _BridgeStatusController_trackUnifiedSwapBridgeEvent = new WeakMap();
1056
+ _BridgeStatusController_pollingTokensByTxMetaId = new WeakMap(), _BridgeStatusController_intentManager = new WeakMap(), _BridgeStatusController_quoteStatusManager = new WeakMap(), _BridgeStatusController_clientId = new WeakMap(), _BridgeStatusController_fetchFn = new WeakMap(), _BridgeStatusController_config = new WeakMap(), _BridgeStatusController_addTransactionBatchFn = new WeakMap(), _BridgeStatusController_trace = new WeakMap(), _BridgeStatusController_onTransactionFailed = new WeakMap(), _BridgeStatusController_onTransactionConfirmed = new WeakMap(), _BridgeStatusController_reportSubmittedForNonEvmTx = new WeakMap(), _BridgeStatusController_reportSubmittedOnce = new WeakMap(), _BridgeStatusController_seedQuoteStatusEntriesFromHistory = new WeakMap(), _BridgeStatusController_restartPollingForIncompleteHistoryItems = new WeakMap(), _BridgeStatusController_addTxToHistory = new WeakMap(), _BridgeStatusController_rekeyHistoryItem = new WeakMap(), _BridgeStatusController_startPollingForTxId = new WeakMap(), _BridgeStatusController_handleFetchFailure = new WeakMap(), _BridgeStatusController_handleOldHistoryItem = new WeakMap(), _BridgeStatusController_fetchBridgeTxStatus = new WeakMap(), _BridgeStatusController_setAndGetSrcTxHash = new WeakMap(), _BridgeStatusController_updateHistoryItem = new WeakMap(), _BridgeStatusController_deleteHistoryItem = new WeakMap(), _BridgeStatusController_wipeBridgeStatusByChainId = new WeakMap(), _BridgeStatusController_executeSubmitStrategy = new WeakMap(), _BridgeStatusController_trackPollingStatusUpdatedEvent = new WeakMap(), _BridgeStatusController_trackUnifiedSwapBridgeEvent = new WeakMap();
1008
1057
  //# sourceMappingURL=bridge-status-controller.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-status-controller.mjs","sourceRoot":"","sources":["../src/bridge-status-controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAKL,SAAS,EAGV,oCAAoC;AACrC,OAAO,EACL,eAAe,EACf,WAAW,EACX,sBAAsB,EACtB,0BAA0B,EAC1B,YAAY,EACZ,iBAAiB,EACjB,2BAA2B,EAC3B,aAAa,EACb,kBAAkB,EACnB,oCAAoC;AAErC,OAAO,EAAE,+BAA+B,EAAE,qCAAqC;AAC/E,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,eAAe,EAChB,yCAAyC;AAE1C,OAAO,EAAE,WAAW,EAAE,wBAAwB;AAG9C,OAAO,EAAE,aAAa,EAAE,8CAA0C;AAClE,OAAO,EACL,qCAAqC,EACrC,wBAAwB,EACxB,6BAA6B,EAC7B,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,EACpB,wBAAoB;AACrB,OAAO,EACL,6BAA6B,EAC7B,qCAAqC,EACtC,6CAAyC;AAC1C,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACvB,0CAAsC;AACvC,OAAO,EAAE,kBAAkB,EAAE,yDAAqD;AAClF,OAAO,qBAAqB,6BAAmB;AAC/C,OAAO,EAAE,UAAU,EAAE,6BAAyB;AAS9C,OAAO,EAAE,cAAc,EAAE,oBAAgB;AACzC,OAAO,EAAE,mBAAmB,EAAE,6BAAyB;AACvD,OAAO,EAAE,MAAM,EAAE,mCAA+B;AAChD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EAClB,2BAAuB;AACxB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,6BAA6B,EAC7B,iCAAiC,EACjC,8BAA8B,EAC/B,kCAA8B;AAC/B,OAAO,EACL,qBAAqB,EACrB,gCAAgC,EAChC,uBAAuB,EACvB,qBAAqB,EACrB,wCAAwC,EACzC,4BAAwB;AACzB,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,qCAAqC,EACrC,wBAAwB,EACxB,qCAAqC,EACtC,4BAAwB;AACzB,OAAO,EAAE,kBAAkB,EAAE,4BAAwB;AACrD,OAAO,EAAE,cAAc,EAAE,0BAAsB;AAC/C,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,uBAAuB,EACvB,cAAc,EACd,yBAAyB,EACzB,yBAAyB,EAC1B,gCAA4B;AAE7B,MAAM,QAAQ,GAA+C;IAC3D,uGAAuG;IACvG,wDAAwD;IACxD,SAAS,EAAE;QACT,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;IACD,2DAA2D;IAC3D,sBAAsB,EAAE;QACtB,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,KAAK;KAChB;CACF,CAAC;AAUF,MAAM,yBAAyB,GAAG;IAChC,+BAA+B;IAC/B,kBAAkB;IAClB,YAAY;IACZ,UAAU;IACV,cAAc;IACd,iBAAiB;IACjB,iCAAiC;IACjC,gCAAgC;CACxB,CAAC;AAEX,MAAM,OAAO,sBAAuB,SAAQ,+BAA+B,EAI1E;IAmBC,YAAY,EACV,SAAS,EACT,KAAK,EACL,QAAQ,EACR,aAAa,EACb,aAAa,EACb,OAAO,EACP,qBAAqB,EACrB,MAAM,EACN,OAAO,EACP,yBAAyB,EACzB,2BAA2B,GAiB5B;QACC,KAAK,CAAC;YACJ,IAAI,EAAE,6BAA6B;YACnC,QAAQ;YACR,SAAS;YACT,8BAA8B;YAC9B,KAAK,EAAE;gBACL,GAAG,sCAAsC;gBACzC,GAAG,KAAK;aACT;SACF,CAAC,CAAC;QAxDL,0DAAwD,EAAE,EAAC;QAElD,wDAA8B;QAE9B,6DAAwC;QAExC,mDAA0B;QAE1B,kDAAwB;QAExB,iDAEP;QAEO,gEAAmF;QAEnF,gDAAsB;QAsKtB,sDAAuB,CAAC,EAC/B,MAAM,EACN,UAAU,EACV,gBAAgB,GAKjB,EAAQ,EAAE;YACT,2DAA2D;YAC3D,MAAM,0BAA0B,GAAG,UAAU;gBAC3C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM;gBACxE,CAAC,CAAC,KAAK,CAAC;YAEV,uBAAA,IAAI,iDAAmB,MAAvB,IAAI,EAAoB;gBACtB,UAAU;gBACV,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI;gBAClD,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE;aAC3B,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,MAAM,KAAK,iBAAiB,CAAC,QAAQ,EAAE,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,8EAA8E;YAC9E,wEAAwE;YACxE,IAAI,0BAA0B,EAAE,CAAC;gBAC/B,OAAO;YACT,CAAC;YAED,yDAAyD;YACzD,oGAAoG;YACpG,0EAA0E;YAC1E,4CAA4C;YAC5C,IACE,CAAC,MAAM,CAAC,IAAI,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC5C,yBAAyB,CAAC,MAAM,CAAC,EACjC,CAAC;gBACD,uBAAA,IAAI,kDAAoB,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC7D,CAAC;YAED,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,MAAM,EACjC,UAAU,EACV,qCAAqC,CAAC,MAAM,CAAC,CAC9C,CAAC;QACJ,CAAC,EAAC;QAEF,eAAe;QACN,yDAA0B,CAAC,EAClC,MAAM,EACN,UAAU,EACV,gBAAgB,GAKjB,EAAQ,EAAE;YACT,mEAAmE;YACnE,mDAAmD;YACnD,IAAI,gBAAgB,EAAE,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,uBAAA,IAAI,iDAAmB,MAAvB,IAAI,EAAoB;gBACtB,UAAU;gBACV,MAAM,EAAE,MAAM,CAAC,IAAI;aACpB,CAAC,CAAC;YAEH,MAAM,MAAM,GACV,MAAM,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,IAAI,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAE5E,IAAI,MAAM,EAAE,CAAC;gBACX,uBAAA,IAAI,iDAAmB,MAAvB,IAAI,EAAoB;oBACtB,UAAU;oBACV,MAAM,EAAE,WAAW,CAAC,QAAQ;oBAC5B,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE;iBAC3B,CAAC,CAAC;gBAEH,0DAA0D;gBAC1D,8DAA8D;gBAC9D,oEAAoE;gBACpE,4DAA4D;gBAC5D,2DAA2D;gBAC3D,MAAM,WAAW,GAAG,UAAU;oBAC5B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC;oBAClC,CAAC,CAAC,SAAS,CAAC;gBACd,IACE,UAAU;oBACV,WAAW;oBACX,MAAM,CAAC,IAAI;oBACX,CAAC,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,EAC9C,CAAC;oBACD,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;gBAChE,CAAC;gBACD,uBAAA,IAAI,kDAAoB,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC1D,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,SAAS,EACpC,UAAU,CACX,CAAC;YACJ,CAAC;iBAAM,IAAI,UAAU,EAAE,CAAC;gBACtB,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,UAAU,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,EAAC;QAEF;;;;;;;;;;;;;;;WAeG;QACM,6DAA8B,CACrC,UAAkB,EAClB,MAAuC,EACjC,EAAE;YACR,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChC,OAAO;YACT,CAAC;YACD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACrD,IAAI,CAAC,WAAW,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBACnE,OAAO;YACT,CAAC;YACD,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC,EAAC;QAEF;;;;;;;;;;WAUG;QACM,sDAAuB,CAC9B,UAAkB,EAClB,SAAiB,EACjB,QAAgB,EACV,EAAE;YACR,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACrD,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,IAAI,WAAW,CAAC,uBAAuB,KAAK,SAAS,EAAE,CAAC;gBACtD,OAAO;YACT,CAAC;YACD,uBAAA,IAAI,kDAAoB,CAAC,eAAe,CACtC,WAAW,CAAC,OAAO,EACnB,SAAS,EACT,QAAQ,CACT,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBACzC,IAAI,IAAI,EAAE,CAAC;oBACT,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC;gBAC3C,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,EAAC;QAEF,eAAU,GAAG,GAAS,EAAE;YACtB,uBAAA,IAAI,kDAAoB,CAAC,OAAO,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,SAAS,GAAG,sCAAsC,CAAC,SAAS,CAAC;gBACnE,KAAK,CAAC,sBAAsB;oBAC1B,sCAAsC,CAAC,sBAAsB,CAAC;YAClE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,qBAAgB,GAAG,CAAC,EAClB,OAAO,EACP,aAAa,GAId,EAAQ,EAAE;YACT,qCAAqC;YACrC,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,KAAK,CAAC,SAAS,GAAG,sCAAsC,CAAC,SAAS,CAAC;gBACrE,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,eAAe,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAE3D,uBAAA,IAAI,yDAA2B,MAA/B,IAAI,EAA4B,OAAO,EAAE,eAAe,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,CAAC;QAEF;;;;;;;WAOG;QACH,oCAA+B,GAAG,CAAC,UAGlC,EAAQ,EAAE;YACT,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC;YAExC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAChE,CAAC;YAED,8CAA8C;YAC9C,IAAI,cAAkC,CAAC;YAEvC,IAAI,QAAQ,EAAE,CAAC;gBACb,4BAA4B;gBAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACnC,cAAc,GAAG,QAAQ,CAAC;gBAC5B,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,EAAE,CAAC;gBAClB,6CAA6C;gBAC7C,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CACrD,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,MAAM,CACnE,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CACb,2CACE,QAAQ,CAAC,CAAC,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC,CAAC,WAAW,MAAM,EACxD,EAAE,CACH,CAAC;YACJ,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAEzD,sDAAsD;YACtD,MAAM,gBAAgB,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC,CAAC;YAE5D,6BAA6B;YAC7B,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,IAAI,cAAc,EAAE,CAAC;oBACnB,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,GAAG,SAAS,CAAC;gBACvD,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,2EAA2E;YAC3E,IAAI,qBAAqB,CAAC,WAAW,CAAC,EAAE,CAAC;gBACvC,yDAAyD;gBACzD,MAAM,oBAAoB,GACxB,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;gBAEhD,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC1B,kBAAkB;oBAClB,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,cAAc,CAAC,CAAC;oBAE1C,yCAAyC;oBACzC,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,oBAAoB,EAC/C,cAAc,EACd;wBACE,cAAc,EAAE,aAAa,CAAC,iBAAiB;wBAC/C,cAAc,EAAE,gBAAgB;qBACjC,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF;;;;;WAKG;QACH,mCAA8B,GAAG,CAC/B,QAAgB,EACe,EAAE;YACjC,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC,CAAC;QAEF;;;WAGG;QACM,0EAA2C,GAAS,EAAE;YAC7D,mFAAmF;YACnF,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YACjC,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,sBAAsB,GAAG,YAAY;iBACxC,MAAM,CACL,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,EAAE,CACnB,WAAW,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO;gBACjD,WAAW,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO,CACpD;gBACD,wDAAwD;iBACvD,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAA8B,EAAE,EAAE;gBACxD,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;oBAC1B,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,mFAAmF;gBACnF,MAAM,YAAY,GAChB,uBAAA,IAAI,uDAAyB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACtD,OAAO,CAAC,YAAY,CAAC;YACvB,CAAC,CAAC;gBACF,mEAAmE;iBAClE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAA8B,EAAE,EAAE;gBACxD,OAAO,qBAAqB,CAAC,WAAW,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;YAEL,sBAAsB,CAAC,OAAO,CAC5B,CAAC,CAAC,UAAU,EAAE,WAAW,CAA8B,EAAE,EAAE;gBACzD,MAAM,eAAe,GAAG,iCAAiC,CACvD,WAAW,CAAC,QAAQ,CACrB,CAAC;gBACF,IAAI,eAAe,EAAE,CAAC;oBACpB,OAAO;gBACT,CAAC;gBAED,8FAA8F;gBAC9F,uEAAuE;gBACvE,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,UAAU,CAAC,CAAC;YACxC,CAAC,CACF,CAAC;QACJ,CAAC,EAAC;QAEO,iDAAkB,CACzB,UAAkB,EAClB,GAAG,IAA8C,EACzC,EAAE;YACV,MAAM,aAAa,GAAG,qBAAqB,CAAC,GAAG,IAAI,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,aAAa,CAAC;YAC9C,CAAC,CAAC,CAAC;YACH,OAAO,UAAU,CAAC;QACpB,CAAC,EAAC;QAEF;;;;;;;;;WASG;QACM,mDAAoB,CAC3B,MAAc,EACd,MAAc,EACd,MAAqC,EAC/B,EAAE;YACR,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC;QACL,CAAC,EAAC;QAEO,sDAAuB,CAAC,IAAY,EAAQ,EAAE;YACrD,+EAA+E;YAC/E,MAAM,oBAAoB,GAAG,uBAAA,IAAI,uDAAyB,CAAC,IAAI,CAAC,CAAC;YACjE,IAAI,oBAAoB,EAAE,CAAC;gBACzB,IAAI,CAAC,yBAAyB,CAAC,oBAAoB,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,aAAa,IAAI,qBAAqB,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC1D,uBAAA,IAAI,uDAAyB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;oBACtD,cAAc,EAAE,IAAI;iBACrB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,EAAC;QAEF;;;;;;;;;WASG;QACH,kCAA6B,GAAG,CAC9B,aAA0D,EACpD,EAAE;YACR,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC;YAEvC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;YACJ,CAAC;YAED,MAAM,UAAU,GAAG,uBAAA,IAAI,8CAAgB,MAApB,IAAI,EAAiB,YAAY,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YACxE,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,UAAU,CAAC,CAAC;QACxC,CAAC,CAAC;QAEF,yDAAyD;QACzD,kEAAkE;QAClE,iBAAY,GAAG,KAAK,EAClB,YAAsC,EACvB,EAAE;YACjB,MAAM,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,YAAY,CAAC,CAAC;QAChD,CAAC,CAAC;QAEF;;;;;;;;WAQG;QACM,qDAAsB,CAAC,cAAsB,EAAQ,EAAE;YAC9D,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAE1D,MAAM,WAAW,GAAG,QAAQ;gBAC1B,CAAC,CAAC;oBACE,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,CAAC;oBAC7B,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE;iBAC5B;gBACH,CAAC,CAAC;oBACE,OAAO,EAAE,CAAC;oBACV,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE;iBAC5B,CAAC;YAEN,0DAA0D;YAC1D,MAAM,YAAY,GAAG,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;YACnE,IAAI,WAAW,CAAC,OAAO,IAAI,YAAY,IAAI,YAAY,EAAE,CAAC;gBACxD,IAAI,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC;gBAC7C,OAAO,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;gBAErD,kCAAkC;gBAClC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;gBACzD,IAAI,WAAW,EAAE,CAAC;oBAChB,qCAAqC;oBACrC,uBAAA,IAAI,8DAAgC,MAApC,IAAI,EACF,cAAc,EACd,aAAa,CAAC,iBAAiB,CAChC,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,8BAA8B;YAC9B,uBAAA,IAAI,iDAAmB,MAAvB,IAAI,EAAoB;gBACtB,UAAU,EAAE,cAAc;gBAC1B,QAAQ,EAAE,WAAW;aACtB,CAAC,CAAC;QACL,CAAC,EAAC;QAEF;;;;WAIG;QACM,uDAAwB,KAAK,EACpC,cAAsB,EACP,EAAE;YACjB,gEAAgE;YAChE,IACE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC;gBACpC,CAAC,MAAM,8BAA8B,CACnC,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CACrC,CAAC,EACF,CAAC;gBACD,OAAO;YACT,CAAC;YAED,MAAM,YAAY,GAAG,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;YAEnE,qCAAqC;YACrC,uBAAA,IAAI,8DAAgC,MAApC,IAAI,EACF,cAAc,EACd,aAAa,CAAC,sBAAsB,CACrC,CAAC;YAEF,0DAA0D;YAC1D,IAAI,YAAY,EAAE,CAAC;gBACjB,IAAI,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC;gBAC7C,OAAO,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;YACvD,CAAC;YAED,6EAA6E;YAC7E,qEAAqE;YACrE,0EAA0E;YAC1E,4BAA4B;YAC5B,uBAAA,IAAI,kDAAoB,CAAC,eAAe,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YAChE,uBAAA,IAAI,iDAAmB,MAAvB,IAAI,EAAoB,cAAc,CAAC,CAAC;QAC1C,CAAC,EAAC;QAEO,sDAAuB,KAAK,EAAE,EACrC,cAAc,GACU,EAAiB,EAAE;YAC3C,4BAA4B;YAE5B,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YACjC,MAAM,WAAW,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC;YAC9C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,iCAAiC;YAEjC,IAAI,iCAAiC,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5D,OAAO;YACT,CAAC;YAED,8BAA8B;YAE9B,IAAI,CAAC;gBACH,IAAI,MAAmC,CAAC;gBACxC,IAAI,kBAAkB,GAAa,EAAE,CAAC;gBAEtC,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,MAAM,cAAc,GAClB,MAAM,uBAAA,IAAI,6CAAe,CAAC,0BAA0B,CAClD,cAAc,EACd,WAAW,CAAC,KAAK,CAAC,UAAU,EAC5B,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EACjC,uBAAA,IAAI,wCAAU,EACd,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CACnC,CAAC;oBAEJ,IACE,cAAc,EAAE,YAAY,KAAK,IAAI;wBACrC,cAAc,EAAE,YAAY,KAAK,SAAS,EAC1C,CAAC;wBACD,OAAO;oBACT,CAAC;oBACD,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC;oBAE5C,qEAAqE;oBACrE,kEAAkE;oBAClE,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAC/C,IAAI,eAAe,EAAE,CAAC;wBACpB,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EACF,cAAc,EACd,eAAe,EACf,cAAc,CACf,CAAC;oBACJ,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,0HAA0H;oBAC1H,2GAA2G;oBAC3G,oGAAoG;oBACpG,MAAM,SAAS,GAAG,uBAAA,IAAI,kDAAoB,MAAxB,IAAI,EAAqB,cAAc,CAAC,CAAC;oBAE3D,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,OAAO;oBACT,CAAC;oBAED,qEAAqE;oBACrE,wCAAwC;oBACxC,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,cAAc,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;oBAErE,MAAM,aAAa,GAAG,6BAA6B,CACjD,WAAW,CAAC,KAAK,EACjB,SAAS,CACV,CAAC;oBACF,MAAM,QAAQ,GACZ,CAAC,WAAW,CAAC,OAAO;wBAClB,CAAC,CAAC,MAAM,sBAAsB,CAC1B,uBAAA,IAAI,kDAAoB,EACxB,WAAW,CAAC,OAAO,CACpB;wBACH,CAAC,CAAC,IAAI,CAAC;wBACT,CAAC,MAAM,mBAAmB,CACxB,aAAa,EACb,uBAAA,IAAI,wCAAU,EACd,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAC5B,uBAAA,IAAI,uCAAS,EACb,uBAAA,IAAI,sCAAQ,CAAC,sBAAsB,CACpC,CAAC,CAAC;oBACL,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;oBACzB,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,CAAC;gBACnD,CAAC;gBAED,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAClC,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,sBAAsB,EACjD,cAAc,EACd;wBACE,QAAQ,EAAE,kBAAkB;wBAC5B,aAAa,EAAE,WAAW,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC;qBAClD,CACF,CAAC;oBACF,MAAM,IAAI,KAAK,CACb,oCAAoC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpE,CAAC;gBACJ,CAAC;gBAED,gCAAgC;gBAEhC,MAAM,oBAAoB,GAAG;oBAC3B,GAAG,WAAW;oBACd,MAAM;oBACN,cAAc,EACZ,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,QAAQ;wBACtC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM;wBAClC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;wBACZ,CAAC,CAAC,SAAS,EAAE,oEAAoE;oBACrF,QAAQ,EAAE,SAAS;iBACpB,CAAC;gBAEF,2GAA2G;gBAC3G,qFAAqF;gBACrF,yIAAyI;gBACzI,+EAA+E;gBAC/E,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,oBAAoB,CAAC;gBACzD,CAAC,CAAC,CAAC;gBAEH,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC7B,uBAAA,IAAI,6CAAe,CAAC,+BAA+B,CACjD,cAAc,EACd,WAAW,CACZ,CAAC;gBACJ,CAAC;gBAED,mBAAmB;gBAEnB,MAAM,YAAY,GAAG,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;gBAEnE,MAAM,aAAa,GACjB,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,QAAQ;oBACtC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,CAAC;gBAEvC,IAAI,aAAa,EAAE,CAAC;oBAClB,IAAI,YAAY,EAAE,CAAC;wBACjB,IAAI,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC;wBAC7C,OAAO,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;oBACvD,CAAC;oBAED,mEAAmE;oBACnE,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACrE,IAAI,gBAAgB,EAAE,CAAC;wBACrB,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EACF,cAAc,EACd,gBAAgB,EAChB,cAAc,CACf,CAAC;oBACJ,CAAC;oBAED,uBAAA,IAAI,kDAAoB,CAAC,eAAe,CACtC,cAAc,EACd,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,QAAQ,CACvC,CAAC;oBAEF,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,QAAQ,EAAE,CAAC;wBAC3C,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,SAAS,EACpC,cAAc,CACf,CAAC;wBACF,IAAI,CAAC,SAAS,CAAC,OAAO,CACpB,wDAAwD,EACxD,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CACpC,CAAC;oBACJ,CAAC;oBACD,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;wBACzC,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,MAAM,EACjC,cAAc,CACf,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;gBACxD,uBAAA,IAAI,kDAAoB,MAAxB,IAAI,EAAqB,cAAc,CAAC,CAAC;YAC3C,CAAC;oBAAS,CAAC;gBACT,MAAM,uBAAA,IAAI,oDAAsB,MAA1B,IAAI,EAAuB,cAAc,CAAC,CAAC;YACnD,CAAC;QACH,CAAC,EAAC;QAEF;;;;;;WAMG;QACM,qDAAsB,CAC7B,cAAsB,EACF,EAAE;YACtB,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YACjC,mGAAmG;YACnG,oGAAoG;YACpG,MAAM,SAAS,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAEnE,IACE,SAAS;gBACT,eAAe,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,EAC3D,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,0EAA0E;YAC1E,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAEtE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,6DAA6D;YAC7D,MAAM,WAAW,GAAG;gBAClB,iBAAiB,CAAC,SAAS;gBAC3B,iBAAiB,CAAC,OAAO;gBACzB,iBAAiB,CAAC,QAAQ;gBAC1B,iBAAiB,CAAC,MAAM;aACzB,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;gBACvB,CAAC,CAAC,MAAM,CAAC,IAAI;gBACb,CAAC,CAAC,SAAS,CAAC;YACd,uBAAA,IAAI,iDAAmB,MAAvB,IAAI,EAAoB;gBACtB,UAAU,EAAE,cAAc;gBAC1B,MAAM,EAAE,WAAW;aACpB,CAAC,CAAC;YAEH,OAAO,WAAW,CAAC;QACrB,CAAC,EAAC;QAEO,oDAAqB,CAAC,EAC7B,UAAU,EACV,MAAM,EACN,MAAM,EACN,QAAQ,EACR,cAAc,GAOf,EAAQ,EAAE;YACT,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE;gBAC3B,IAAI,MAAM,EAAE,CAAC;oBACX,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;gBAC5D,CAAC;gBACD,IAAI,MAAM,EAAE,CAAC;oBACX,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;gBACrE,CAAC;gBACD,IAAI,QAAQ,EAAE,CAAC;oBACb,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBACzD,CAAC;gBACD,IAAI,cAAc,EAAE,CAAC;oBACnB,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,cAAc,GAAG,cAAc,CAAC;gBACrE,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,EAAC;QAEO,oDAAqB,CAAC,UAAkB,EAAQ,EAAE;YACzD,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE;gBAC3B,OAAO,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;QACL,CAAC,EAAC;QAEF,4DAA4D;QAC5D,wDAAwD;QAC/C,4DAA6B,CACpC,OAAe,EACf,eAAoB,EACd,EAAE;YACR,MAAM,uBAAuB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CACtE,CAAC,QAAQ,EAAE,EAAE;gBACX,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAEzD,MAAM,gBAAgB,GAAG,WAAW,CAClC,iBAAiB,CAAC,KAAK,CAAC,UAAU,CACnC,CAAC;gBAEF,OAAO,CACL,iBAAiB,CAAC,OAAO,KAAK,OAAO;oBACrC,gBAAgB,KAAK,eAAe,CACrC,CAAC;YACJ,CAAC,CACF,CAAC;YAEF,uBAAuB,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;gBACjD,MAAM,YAAY,GAAG,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;gBAEnE,IAAI,YAAY,EAAE,CAAC;oBACjB,IAAI,CAAC,yBAAyB,CAC5B,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAC9C,CAAC;oBACF,OAAO,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,SAAS,GAAG,uBAAuB,CAAC,MAAM,CAC9C,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE;oBACtB,OAAO,GAAG,CAAC,cAAc,CAAC,CAAC;oBAC3B,OAAO,GAAG,CAAC;gBACb,CAAC,EACD,KAAK,CAAC,SAAS,CAChB,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,EAAC;QAEF;;;;WAIG;QAEM,wDAAyB,KAAK,EACrC,MAAmC,EACnC,2BAOC,EACyB,EAAE;YAC5B,IAAI,WAA6B,CAAC;YAElC,MAAM,KAAK,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAE5C,8GAA8G;YAC9G,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,KAAK,EAAE,CAAC;gBAC5C,IAAI,CAAC;oBACH,QAAQ,IAAI,EAAE,CAAC;wBACb,KAAK,UAAU,CAAC,gBAAgB;4BAC9B,uBAAA,IAAI,gDAAkB,MAAtB,IAAI,EACF,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,SAAS,CAClB,CAAC;4BACF,oEAAoE;4BACpE,oEAAoE;4BACpE,qBAAqB;4BACrB,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gCAC3B,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EACF,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,SAAS,CAAC,IAAI,EACtB,OAAO,CAAC,SAAS,CAAC,EAAE,CACrB,CAAC;4BACJ,CAAC;4BACD,MAAM;wBAER,KAAK,UAAU,CAAC,uBAAuB;4BACrC,yBAAyB,CAAC;gCACxB,SAAS,EAAE,IAAI,CAAC,SAAS;gCACzB,qBAAqB,EAAE,OAAO,CAAC,eAAe;6BAC/C,CAAC,CAAC;4BACH,MAAM;wBAER,KAAK,UAAU,CAAC,YAAY;4BAC1B,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC;4BAChC,MAAM;wBAER,KAAK,UAAU,CAAC,cAAc;4BAC5B,uBAAA,IAAI,8CAAgB,MAApB,IAAI,EAAiB,OAAO,CAAC,UAAU,EAAE;gCACvC,GAAG,OAAO;gCACV,GAAG,2BAA2B;gCAC9B,aAAa,EAAE,OAAO,CAAC,aAAa;gCACpC,cAAc,EAAE,MAAM,CAAC,eAAe,CAAC,OAAO;gCAC9C,YAAY,EAAE,MAAM,CAAC,YAAY;gCACjC,kBAAkB,EAAE,CAAC,EAAE,oGAAoG;6BAC5H,CAAC,CAAC;4BACH,uBAAA,IAAI,0DAA4B,MAAhC,IAAI,EACF,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,YAAY,CACrB,CAAC;4BACF,MAAM;wBAER,KAAK,UAAU,CAAC,YAAY;4BAC1B,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,OAAO,CAAC,UAAU,CAAC,CAAC;4BAC9C,MAAM;wBAER,KAAK,UAAU,CAAC,qBAAqB;4BACnC,uBAAA,IAAI,kDAAoB,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;4BACnE,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,SAAS,EACpC,OAAO,CAAC,UAAU,CACnB,CAAC;4BACF,MAAM;wBAER,qBAAqB;wBACrB;4BACE,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAC/D,mBAAmB;oBACrB,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CACX,oDAAoD,EACpD,KAAK,CACN,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,OAAO,WAAW,CAAC;QACrB,CAAC,EAAC;QAEF;;;;;;;;;;;;;;;WAeG;QACH,aAAQ,GAAG,KAAK,EACd,cAAsB,EACtB,mBAEmD,EACnD,YAAqB,EACrB,qBAAiG,EACjG,WAAwC,2BAA2B,CAAC,OAAO,EAC3E,OAAgC,EAChC,aAAgD,EAChD,4BAA4C,EAC5C,eAAgD,EAChD,wBAAmD,EACzB,EAAE;YAC5B;;;;eAIG;YACH,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC;gBACvD,CAAC,CAAC,mBAAmB;gBACrB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;YAC1B,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YAExC,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC;YAChC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE7B,oBAAoB,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;YAE5D,MAAM,eAAe,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAC5E,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;YACJ,CAAC;YACD,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,eAAe,CAAC,CAAC;YAEpE;;;eAGG;YACH,MAAM,eAAe,GACnB,uBAAA,IAAI,wCAAU,KAAK,cAAc,CAAC,MAAM,IAAI,mBAAmB,KAAK,IAAI,CAAC;YAC3E,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YAErE,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CACjC,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,EAAE,CAChC,cAAc,KAAK,SAAS,CAAC,UAAU,CAC1C;gBACC,CAAC,CAAC,eAAe,EAAE;gBACnB,CAAC,CAAC,SAAS,CAAC;YAEd,MAAM,yBAAyB,GAAG,qCAAqC,CACrE,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,QAAQ,EACR,OAAO,EACP,aAAa,EACb,4BAA4B,EAC5B,eAAe,EACf,OAAO,CACR,CAAC;YAEF,IAAI,CAAC;gBACH,sDAAsD;gBACtD,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,SAAS,EACpC,SAAS,EACT;oBACE,GAAG,yBAAyB;oBAC5B,GAAG,CAAC,wBAAwB,IAAI;wBAC9B,0BAA0B,EAAE,wBAAwB;qBACrD,CAAC;iBACH,CACF,CAAC;gBAEF;;;;mBAIG;gBACH,MAAM,kBAAkB,GAAG,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC;oBAC1D,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,MAAM,uBAAuB,CAC3B,IAAI,CAAC,SAAS,EACd,eAAe,CAAC,OAAc,EAC9B,CAAC,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CACvC,CAAC;gBAEN,MAAM,cAAc,GAAgC;oBAClD,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,cAAc;oBACd,eAAe;oBACf,YAAY;oBACZ,UAAU;oBACV,kBAAkB;oBAClB,eAAe;oBACf,eAAe;oBACf,QAAQ,EAAE,uBAAA,IAAI,wCAAU;oBACxB,gBAAgB,EAAE,uBAAA,IAAI,sCAAQ,CAAC,sBAAsB;oBACrD,qBAAqB,EAAE,uBAAA,IAAI,qDAAuB;oBAClD,OAAO,EAAE,uBAAA,IAAI,uCAAS;oBACtB,OAAO,EAAE,uBAAA,IAAI,qCAAO;oBACpB,OAAO;iBACR,CAAC;gBAEF,OAAO,MAAM,uBAAA,IAAI,qCAAO,MAAX,IAAI,EACf,cAAc,CAAC,aAAa,EAAE,YAAY,CAAC,EAC3C,KAAK,IAAI,EAAE,CACT,MAAM,uBAAA,IAAI,qDAAuB,MAA3B,IAAI,EAAwB,cAAc,EAAE;oBAChD,SAAS;oBACT,QAAQ;oBACR,OAAO;oBACP,aAAa;oBACb,4BAA4B;oBAC5B,wBAAwB;iBACzB,CAAC,CACL,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,MAAM,EACjC,SAAS,EACT;oBACE,aAAa,EAAG,KAAe,EAAE,OAAO;oBACxC,GAAG,yBAAyB;iBAC7B,CACF,CAAC;gBACF,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,CAAC;QAEF;;;;;;;;;;;;;;;;WAgBG;QACH,iBAAY,GAAG,KAAK,EAAE,MAUrB,EAA4B,EAAE;YAC7B,MAAM,EACJ,aAAa,EACb,cAAc,EACd,QAAQ,EACR,OAAO,EACP,aAAa,EACb,4BAA4B,EAC5B,wBAAwB,EACxB,YAAY,GAAG,KAAK,EACpB,qBAAqB,GACtB,GAAG,MAAM,CAAC;YAEX,2BAA2B;YAC3B,OAAO,MAAM,IAAI,CAAC,QAAQ,CACxB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,QAAQ,EACR,OAAO,EACP,aAAa,EACb,4BAA4B,EAC5B,SAAS,EACT,wBAAwB,CACzB,CAAC;QACJ,CAAC,CAAC;QAEF,oBAAe,GAAG,KAAK,EAAE,MASxB,EAA4B,EAAE;YAC7B;;;eAGG;YACH,MAAM,eAAe,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3D,OAAO,MAAM,IAAI,CAAC,QAAQ,CACxB,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,cAAc,CAAC,MAAM,CAC1B,CACE,aAAa,EACiD,EAAE,CAChE,aAAa,KAAK,IAAI,CACzB,EACD,MAAM,CAAC,YAAY,IAAI,KAAK,EAC5B,MAAM,CAAC,qBAAqB,EAC5B,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,4BAA4B,EACnC,eAAe,CAChB,CAAC;QACJ,CAAC,CAAC;QAEO,iEAAkC,CACzC,UAAkB,EAClB,aAA4B,EACtB,EAAE;YACR,qCAAqC;YACrC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACrD,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,oBAAoB,EAC/C,UAAU,EACV;gBACE,cAAc,EAAE,aAAa;gBAC7B,cAAc,EAAE,WAAW,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC;aACnD,CACF,CAAC;QACJ,CAAC,EAAC;QAEF;;;;;;WAMG;QACM,8DAA+B,CAetC,SAAoB,EACpB,YAAqB,EACrB,eAAiC,EAC3B,EAAE;YACR,MAAM,WAAW,GAAkC,YAAY;gBAC7D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC;gBACpC,CAAC,CAAC,SAAS,CAAC;YAEd,MAAM,SAAS,GACb,eAAe,EAAE,UAAU;gBAC3B,WAAW,EAAE,SAAS;gBACtB,SAAS,CAAC,mBAAmB,CAAC;YAEhC,IACE,CAAC,CACC,qCAAqC,CAAC,QAAQ,CAAC,SAAS,CAAC;gBACzD,SAAS,KAAK,0BAA0B,CAAC,sBAAsB,CAChE,EACD,CAAC;gBACD,OAAO;YACT,CAAC;YAED,iFAAiF;YACjF,MAAM,cAAc,GAAG,YAAY;gBACjC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO;gBAC/C,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,oBAAoB,GAAG,YAAY;gBACvC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,aAAa;gBACrD,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,eAAe,GAAG,eAAe,EAAE,QAAQ,IAAI,cAAc,CAAC;YACpE,MAAM,qBAAqB,GACzB,eAAe,EAAE,eAAe,IAAI,oBAAoB,CAAC;YAE3D,MAAM,QAAQ,GACZ,WAAW,EAAE,QAAQ;gBACrB,eAAe,EAAE,QAAQ;gBACzB,2BAA2B,CAAC,OAAO,CAAC;YAEtC,MAAM,cAAc,GAAG;gBACrB,WAAW,EAAE,iBAAiB,CAAC,aAAa;gBAC5C,UAAU,EAAE,SAAS,IAAI,SAAS,CAAC,mBAAmB;gBACtD,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;gBAC1B,QAAQ;gBACR,GAAG,CAAC,eAAe;oBACjB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI;oBACzC,QAAQ,EAAE,eAAe;iBAC1B,CAAC;gBACJ,GAAG,CAAC,qBAAqB;oBACvB,qBAAqB,CAAC,MAAM,GAAG,CAAC,IAAI;oBAClC,eAAe,EAAE,qBAAqB;iBACvC,CAAC;aACL,CAAC;YAEF,iEAAiE;YACjE,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,iBAAiB,CAAC;oBAChB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,SAAS;oBACT,UAAU,EAAE,cAAc;iBAC3B,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC;YAC5C,MAAM,sBAAsB,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAC;YAEvE,IAAI,SAAS,KAAK,0BAA0B,CAAC,sBAAsB,EAAE,CAAC;gBACpE,iBAAiB,CAAC;oBAChB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,SAAS;oBACT,UAAU,EAAE;wBACV,GAAG,cAAc;wBACjB,eAAe,EAAE,sBAAsB,CAAC,eAAe;wBACvD,oBAAoB,EAAE,sBAAsB,CAAC,oBAAoB;wBACjE,oBAAoB,EAAE,sBAAsB,CAAC,oBAAoB;wBACjE,yBAAyB,EACvB,sBAAsB,CAAC,yBAAyB;wBAClD,+BAA+B,EAC7B,sBAAsB,CAAC,+BAA+B;wBACxD,aAAa,EAAE,WAAW,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC;qBAClD;iBACF,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,eAAe,GAAG,mBAAmB,CACzC,IAAI,CAAC,SAAS,EACd,WAAW,CAAC,OAAO,CACpB,CAAC;YAEF,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAC9B,CAAC,EAAmB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,YAAY,CAChD,CAAC;YACF,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CACtC,CAAC,EAAmB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,YAAY,CAChD,CAAC;YAEF,MAAM,uBAAuB,GAAG;gBAC9B,GAAG,cAAc;gBACjB,GAAG,sBAAsB;gBACzB,GAAG,6BAA6B,CAAC,WAAW,EAAE,eAAe,CAAC;gBAC9D,GAAG,uBAAuB,CAAC,WAAW,CAAC;gBACvC,GAAG,wBAAwB,CAAC,WAAW,CAAC;gBACxC,GAAG,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,CAAC;gBAChE,GAAG,uBAAuB,CAAC,KAAK,CAAC;gBACjC,GAAG,CAAC,SAAS,KAAK,0BAA0B,CAAC,SAAS;oBACpD,WAAW,CAAC,wBAAwB,IAAI;oBACtC,0BAA0B,EAAE,WAAW,CAAC,wBAAwB;iBACjE,CAAC;aACL,CAAC;YAEF,iBAAiB,CAAC;gBAChB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS;gBACT,UAAU,EAAE,uBAAuB;aACpC,CAAC,CAAC;QACL,CAAC,EAAC;QA94CA,uBAAA,IAAI,oCAAa,QAAQ,MAAA,CAAC;QAC1B,uBAAA,IAAI,mCAAY,OAAO,MAAA,CAAC;QACxB,uBAAA,IAAI,iDAA0B,qBAAqB,MAAA,CAAC;QACpD,uBAAA,IAAI,kCAAW;YACb,sBAAsB,EACpB,MAAM,EAAE,sBAAsB,IAAI,wBAAwB;SAC7D,MAAA,CAAC;QACF,uBAAA,IAAI,iCAAU,OAAO,IAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAmB,MAAA,CAAC;QACvE,uBAAA,IAAI,yCAAkB,IAAI,aAAa,CAAC;YACtC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,sBAAsB,EAAE,uBAAA,IAAI,sCAAQ,CAAC,sBAAsB;YAC3D,OAAO,EAAE,uBAAA,IAAI,uCAAS;SACvB,CAAC,MAAA,CAAC;QACH,uBAAA,IAAI,8CAAuB,IAAI,kBAAkB,CAAC;YAChD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,uBAAA,IAAI,wCAAU;YACxB,aAAa;YACb,aAAa;YACb,UAAU,EAAE,uBAAA,IAAI,sCAAQ,CAAC,sBAAsB;YAC/C,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,sBAAsB;YAC9C,gBAAgB,EAAE,CAAC,OAAO,EAAQ,EAAE;gBAClC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,KAAK,CAAC,sBAAsB,GAAG,OAAO,CAAC;gBACzC,CAAC,CAAC,CAAC;YACL,CAAC;YACD,UAAU,EAAE,6BAA6B;YACzC,gBAAgB,EAAE,qCAAqC;YACvD,OAAO,EAAE,yBAAyB;YAClC,SAAS,EAAE,2BAA2B;SACvC,CAAC,MAAA,CAAC;QAEH,2BAA2B;QAC3B,IAAI,CAAC,SAAS,CAAC,4BAA4B,CACzC,IAAI,EACJ,yBAAyB,CAC1B,CAAC;QAEF,eAAe;QACf,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QAE5C,IAAI,CAAC,SAAS,CAAC,SAAS,CAStB,gDAAgD,EAChD,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,EAAE,EAAE;YACxD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YACD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;YAEhC,kEAAkE;YAClE,oCAAoC;YACpC,MAAM,yBAAyB,GAAG,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;YAC/D,IAAI,CAAC,yBAAyB,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC9D,OAAO;YACT,CAAC;YAED,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,iBAAiB,CAAC,SAAS;oBAC9B,uEAAuE;oBACvE,+DAA+D;oBAC/D,IACE,MAAM,CAAC,IAAI;wBACX,MAAM,CAAC,IAAI;wBACX,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC;wBAC3B,CAAC,gBAAgB;wBACjB,UAAU,EACV,CAAC;wBACD,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;oBAChE,CAAC;oBACD,MAAM;gBACR,KAAK,iBAAiB,CAAC,SAAS;oBAC9B,uBAAA,IAAI,sDAAwB,MAA5B,IAAI,EAAyB;wBAC3B,MAAM;wBACN,UAAU;wBACV,gBAAgB;qBACjB,CAAC,CAAC;oBACH,MAAM;gBACR,KAAK,iBAAiB,CAAC,MAAM,CAAC;gBAC9B,KAAK,iBAAiB,CAAC,OAAO,CAAC;gBAC/B,KAAK,iBAAiB,CAAC,QAAQ;oBAC7B,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC;oBACpE,MAAM;gBACR;oBACE,MAAM;YACV,CAAC;QACH,CAAC,EACD,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE;YACtB,MAAM,KAAK,GAAG,gCAAgC,CAC5C,IAAI,CAAC,KAAK,CAAC,SAAS,EACpB,eAAe,CAChB,CAAC;YACF,MAAM,aAAa,GAAG,wCAAwC,CAC5D,IAAI,CAAC,KAAK,CAAC,SAAS,EACpB,eAAe,CAChB,CAAC;YACF,MAAM,UAAU,GAAG,KAAK,IAAI,aAAa,CAAC;YAE1C,OAAO;gBACL,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC3B,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC5B,MAAM,EAAE,eAAe;gBACvB,gBAAgB,EACd,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,KAAK,eAAe,CAAC,EAAE;aACvD,CAAC;QACJ,CAAC,CACF,CAAC;QAEF,sEAAsE;QACtE,sEAAsE;QACtE,uBAAA,IAAI,kDAAoB,CAAC,IAAI,EAAE,CAAC;QAEhC,+EAA+E;QAC/E,8CAA8C;QAC9C,mFAAmF;QACnF,uBAAA,IAAI,uEAAyC,MAA7C,IAAI,CAA2C,CAAC;IAClD,CAAC;CAqxCF","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 {\n QUOTE_STATUS_UPDATE_ENTRY_TTL,\n QUOTE_STATUS_UPDATE_RETRY_INTERVAL_MS,\n} from './quote-status-manager/constants';\nimport {\n QuoteStatusGetError,\n QuoteStatusUpdateError,\n} from './quote-status-manager/errors';\nimport { QuoteStatusManager } from './quote-status-manager/quotes-status-manager';\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 fetchBridgeQuoteStatus,\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 // Deferred status updates used by QuoteStatusUpdateManager\n quoteUpdateStatusStore: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: false,\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 #quoteStatusManager: QuoteStatusManager;\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 clientProduct,\n clientVersion,\n fetchFn,\n addTransactionBatchFn,\n config,\n traceFn,\n onQuoteStatusManagerError,\n isQuoteStatusManagerEnabled,\n }: {\n messenger: BridgeStatusControllerMessenger;\n state?: Partial<BridgeStatusControllerState>;\n clientId: BridgeClientId;\n clientProduct: string;\n clientVersion?: string;\n fetchFn: FetchFunction;\n addTransactionBatchFn: typeof TransactionController.prototype.addTransactionBatch;\n config?: {\n customBridgeApiBaseUrl?: string;\n };\n traceFn?: TraceCallback;\n onQuoteStatusManagerError?: (\n error: QuoteStatusUpdateError | QuoteStatusGetError,\n ) => void;\n isQuoteStatusManagerEnabled?: () => boolean;\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 this.#quoteStatusManager = new QuoteStatusManager({\n messenger: this.messenger,\n clientId: this.#clientId,\n clientProduct,\n clientVersion,\n apiBaseUrl: this.#config.customBridgeApiBaseUrl,\n initialData: this.state.quoteUpdateStatusStore,\n onPersistUpdates: (updates): void => {\n this.update((draft) => {\n draft.quoteUpdateStatusStore = updates;\n });\n },\n entryTtlMs: QUOTE_STATUS_UPDATE_ENTRY_TTL,\n updateIntervalMs: QUOTE_STATUS_UPDATE_RETRY_INTERVAL_MS,\n onError: onQuoteStatusManagerError,\n isEnabled: isQuoteStatusManagerEnabled,\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.submitted:\n // EVM txs report SUBMITTED here (not via transactionSubmitted) so hash\n // replacements before confirmation still reach the Bridge API.\n if (\n txMeta.hash &&\n txMeta.type &&\n isCrossChainTx(txMeta.type) &&\n !isApprovalTxMeta &&\n historyKey\n ) {\n this.#reportSubmittedOnce(historyKey, txMeta.hash, txMeta.id);\n }\n break;\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 // Replay swap/bridge finalizations that resolved while the client was\n // closed, before resuming polling (which recovers in-flight bridges).\n this.#quoteStatusManager.init();\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 // Report finalized failure for swap/bridge transactions.\n // Note: TransactionStatus.rejected means the user cancelled signing, so the tx was never broadcast.\n // `hasNestedSwapTransactions` also covers batch/7702 swaps whose type may\n // still read as `batch` rather than `swap`.\n if (\n (txMeta.type && isCrossChainTx(txMeta.type)) ||\n hasNestedSwapTransactions(txMeta)\n ) {\n this.#quoteStatusManager.reportFinalised(txMeta.id, false);\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 if (isSwap) {\n this.#updateHistoryItem({\n historyKey,\n status: StatusTypes.COMPLETE,\n completionTime: Date.now(),\n });\n\n // For EVM intent-based swaps the synthetic tx transitions\n // submitted→confirmed in a single update that carries the CoW\n // settlement hash, so the submitted status handler never has a hash\n // and reportSubmitted is never called. Call it here (before\n // reportFinalised) so the deferred-queue entry is created.\n const historyItem = historyKey\n ? this.state.txHistory[historyKey]\n : undefined;\n if (\n historyKey &&\n historyItem &&\n txMeta.hash &&\n !isNonEvmChainId(historyItem.quote.srcChainId)\n ) {\n this.#reportSubmittedOnce(historyKey, txMeta.hash, txMeta.id);\n }\n this.#quoteStatusManager.reportFinalised(txMeta.id, true);\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n historyKey,\n );\n } else if (historyKey) {\n this.#startPollingForTxId(historyKey);\n }\n };\n\n /**\n * Reports the SUBMITTED quote status for non-EVM transactions.\n *\n * EVM transactions report SUBMITTED via the\n * `TransactionController:transactionStatusUpdated` subscription, which also\n * picks up hash replacements (speed-up/cancel) and the late hash assignment\n * of smart/batch transactions. Non-EVM transactions (Solana, Bitcoin, Tron)\n * are submitted through Snaps and never emit TransactionController lifecycle\n * events, so they are reported here once the history item exists and the\n * source tx hash is known.\n *\n * @param historyKey - The key of the history item in `txHistory`\n * @param txMeta - The submitted trade transaction's id and hash\n * @param txMeta.id - The transaction meta id, used for finalization matching\n * @param txMeta.hash - The source chain transaction hash\n */\n readonly #reportSubmittedForNonEvmTx = (\n historyKey: string,\n txMeta?: { id?: string; hash?: string },\n ): void => {\n if (!txMeta?.id || !txMeta.hash) {\n return;\n }\n const historyItem = this.state.txHistory[historyKey];\n if (!historyItem || !isNonEvmChainId(historyItem.quote.srcChainId)) {\n return;\n }\n this.#reportSubmittedOnce(historyKey, txMeta.hash, txMeta.id);\n };\n\n /**\n * Reports a SUBMITTED quote status update exactly once per source tx hash.\n *\n * SUBMITTED can be triggered from several code paths (submission, the first\n * poll where the hash is known, and the final-status branch) and the poll\n * path runs on every interval.\n *\n * @param historyKey - The key of the history item in `txHistory`\n * @param srcTxHash - The source chain transaction hash\n * @param txMetaId - The transaction meta id, used for finalization matching\n */\n readonly #reportSubmittedOnce = (\n historyKey: string,\n srcTxHash: string,\n txMetaId: string,\n ): void => {\n const historyItem = this.state.txHistory[historyKey];\n if (!historyItem?.quoteId) {\n return;\n }\n if (historyItem.reportedSubmittedTxHash === srcTxHash) {\n return;\n }\n this.#quoteStatusManager.reportSubmitted(\n historyItem.quoteId,\n srcTxHash,\n txMetaId,\n );\n this.update((state) => {\n const item = state.txHistory[historyKey];\n if (item) {\n item.reportedSubmittedTxHash = srcTxHash;\n }\n });\n };\n\n resetState = (): void => {\n this.#quoteStatusManager.destroy();\n this.update((state) => {\n state.txHistory = DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.txHistory;\n state.quoteUpdateStatusStore =\n DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.quoteUpdateStatusStore;\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 // Report finalization as a failure here, this is the only place that\n // permanently ends polling, so it's the correct and non-duplicative point\n // to emit the final status.\n this.#quoteStatusManager.reportFinalised(bridgeTxMetaId, false);\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\n // Report SUBMITTED as soon as the intent's source/settlement hash is\n // known at poll time, before the order reaches a terminal status.\n const intentSrcTxHash = status.srcChain.txHash;\n if (intentSrcTxHash) {\n this.#reportSubmittedOnce(\n bridgeTxMetaId,\n intentSrcTxHash,\n bridgeTxMetaId,\n );\n }\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 // Report SUBMITTED as soon as a srcTxHash is known at poll time, for\n // every chain not just non-EVM sources.\n this.#reportSubmittedOnce(bridgeTxMetaId, srcTxHash, bridgeTxMetaId);\n\n const statusRequest = getStatusRequestWithSrcTxHash(\n historyItem.quote,\n srcTxHash,\n );\n const response =\n (historyItem.quoteId\n ? await fetchBridgeQuoteStatus(\n this.#quoteStatusManager,\n historyItem.quoteId,\n )\n : null) ??\n (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) {\n if (pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n }\n\n // Ensure a deferred entry exists before reportFinalised is called.\n const settlementTxHash = newBridgeHistoryItem.status.srcChain.txHash;\n if (settlementTxHash) {\n this.#reportSubmittedOnce(\n bridgeTxMetaId,\n settlementTxHash,\n bridgeTxMetaId,\n );\n }\n\n this.#quoteStatusManager.reportFinalised(\n bridgeTxMetaId,\n status.status === StatusTypes.COMPLETE,\n );\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 // Report SUBMITTED as soon as the trade hash is known at submission\n // time, instead of waiting for the delayed transactionStatusUpdated\n // (submitted) event.\n if (payload.tradeMeta.hash) {\n this.#reportSubmittedOnce(\n payload.newHistoryKey,\n payload.tradeMeta.hash,\n payload.tradeMeta.id,\n );\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 this.#reportSubmittedForNonEvmTx(\n payload.historyKey,\n payload.bridgeTxMeta,\n );\n break;\n\n case SubmitStep.StartPolling:\n this.#startPollingForTxId(payload.historyKey);\n break;\n\n case SubmitStep.PublishCompletedEvent:\n this.#quoteStatusManager.reportFinalised(payload.historyKey, true);\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.Unknown,\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 ...(inputPrimaryDenomination && {\n input_primary_denomination: inputPrimaryDenomination,\n }),\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 historyItem?.location ??\n eventProperties?.location ??\n MetaMetricsSwapsEventSource.Unknown;\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 historyItem.inputPrimaryDenomination && {\n input_primary_denomination: historyItem.inputPrimaryDenomination,\n }),\n };\n\n trackMetricsEvent({\n messenger: this.messenger,\n eventName,\n properties: requiredEventProperties,\n });\n };\n}\n"]}
1
+ {"version":3,"file":"bridge-status-controller.mjs","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 {\n QUOTE_STATUS_UPDATE_ENTRY_TTL,\n QUOTE_STATUS_UPDATE_RETRY_INTERVAL_MS,\n} from './quote-status-manager/constants';\nimport {\n QuoteStatusGetError,\n QuoteStatusUpdateError,\n} from './quote-status-manager/errors';\nimport { QuoteStatusManager } from './quote-status-manager/quotes-status-manager';\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 fetchBridgeQuoteStatus,\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 // Deferred status updates used by QuoteStatusUpdateManager\n quoteUpdateStatusStore: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: false,\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 #quoteStatusManager: QuoteStatusManager;\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 clientProduct,\n clientVersion,\n fetchFn,\n addTransactionBatchFn,\n config,\n traceFn,\n onQuoteStatusManagerError,\n isQuoteStatusManagerEnabled,\n }: {\n messenger: BridgeStatusControllerMessenger;\n state?: Partial<BridgeStatusControllerState>;\n clientId: BridgeClientId;\n clientProduct: string;\n clientVersion?: string;\n fetchFn: FetchFunction;\n addTransactionBatchFn: typeof TransactionController.prototype.addTransactionBatch;\n config?: {\n customBridgeApiBaseUrl?: string;\n };\n traceFn?: TraceCallback;\n onQuoteStatusManagerError?: (\n error: QuoteStatusUpdateError | QuoteStatusGetError,\n ) => void;\n isQuoteStatusManagerEnabled?: () => boolean;\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 this.#quoteStatusManager = new QuoteStatusManager({\n messenger: this.messenger,\n clientId: this.#clientId,\n clientProduct,\n clientVersion,\n apiBaseUrl: this.#config.customBridgeApiBaseUrl,\n initialData: this.state.quoteUpdateStatusStore,\n onPersistUpdates: (updates): void => {\n this.update((draft) => {\n draft.quoteUpdateStatusStore = updates;\n });\n },\n entryTtlMs: QUOTE_STATUS_UPDATE_ENTRY_TTL,\n updateIntervalMs: QUOTE_STATUS_UPDATE_RETRY_INTERVAL_MS,\n onError: onQuoteStatusManagerError,\n isEnabled: isQuoteStatusManagerEnabled,\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.submitted:\n // EVM txs report SUBMITTED here (not via transactionSubmitted) so hash\n // replacements before confirmation still reach the Bridge API.\n if (\n txMeta.hash &&\n txMeta.type &&\n isCrossChainTx(txMeta.type) &&\n !isApprovalTxMeta &&\n historyKey\n ) {\n this.#reportSubmittedOnce(historyKey, txMeta.hash, txMeta.id);\n }\n break;\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 // Seed any missing quote-status entries from persisted history before\n // init(), so init()'s reconciliation loop can finalize quotes whose\n // deferred entry was never created (e.g. the client closed before\n // reportSubmitted ran).\n this.#seedQuoteStatusEntriesFromHistory();\n\n // Replay swap/bridge finalizations that resolved while the client was\n // closed, before resuming polling (which recovers in-flight bridges).\n this.#quoteStatusManager.init();\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 // Report finalized failure for swap/bridge transactions.\n // Note: TransactionStatus.rejected means the user cancelled signing, so the tx was never broadcast.\n // `hasNestedSwapTransactions` also covers batch/7702 swaps whose type may\n // still read as `batch` rather than `swap`.\n if (\n (txMeta.type && isCrossChainTx(txMeta.type)) ||\n hasNestedSwapTransactions(txMeta)\n ) {\n this.#quoteStatusManager.reportFinalised(txMeta.id, false);\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 if (isSwap) {\n this.#updateHistoryItem({\n historyKey,\n status: StatusTypes.COMPLETE,\n completionTime: Date.now(),\n });\n\n // For EVM intent-based swaps the synthetic tx transitions\n // submitted→confirmed in a single update that carries the CoW\n // settlement hash, so the submitted status handler never has a hash\n // and reportSubmitted is never called. Call it here (before\n // reportFinalised) so the deferred-queue entry is created.\n const historyItem = historyKey\n ? this.state.txHistory[historyKey]\n : undefined;\n if (\n historyKey &&\n historyItem &&\n txMeta.hash &&\n !isNonEvmChainId(historyItem.quote.srcChainId)\n ) {\n this.#reportSubmittedOnce(historyKey, txMeta.hash, txMeta.id);\n }\n this.#quoteStatusManager.reportFinalised(txMeta.id, true);\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n historyKey,\n );\n } else if (historyKey) {\n this.#startPollingForTxId(historyKey);\n }\n };\n\n /**\n * Reports the SUBMITTED quote status for non-EVM transactions.\n *\n * EVM transactions report SUBMITTED via the\n * `TransactionController:transactionStatusUpdated` subscription, which also\n * picks up hash replacements (speed-up/cancel) and the late hash assignment\n * of smart/batch transactions. Non-EVM transactions (Solana, Bitcoin, Tron)\n * are submitted through Snaps and never emit TransactionController lifecycle\n * events, so they are reported here once the history item exists and the\n * source tx hash is known.\n *\n * @param historyKey - The key of the history item in `txHistory`\n * @param txMeta - The submitted trade transaction's id and hash\n * @param txMeta.id - The transaction meta id, used for finalization matching\n * @param txMeta.hash - The source chain transaction hash\n */\n readonly #reportSubmittedForNonEvmTx = (\n historyKey: string,\n txMeta?: { id?: string; hash?: string },\n ): void => {\n if (!txMeta?.id || !txMeta.hash) {\n return;\n }\n const historyItem = this.state.txHistory[historyKey];\n if (!historyItem || !isNonEvmChainId(historyItem.quote.srcChainId)) {\n return;\n }\n this.#reportSubmittedOnce(historyKey, txMeta.hash, txMeta.id);\n };\n\n /**\n * Reports a SUBMITTED quote status update exactly once per source tx hash.\n *\n * SUBMITTED can be triggered from several code paths (submission, the first\n * poll where the hash is known, and the final-status branch) and the poll\n * path runs on every interval.\n *\n * @param historyKey - The key of the history item in `txHistory`\n * @param srcTxHash - The source chain transaction hash\n * @param txMetaId - The transaction meta id, used for finalization matching\n */\n readonly #reportSubmittedOnce = (\n historyKey: string,\n srcTxHash: string,\n txMetaId: string,\n ): void => {\n const historyItem = this.state.txHistory[historyKey];\n if (!historyItem?.quoteId) {\n return;\n }\n // `reportedSubmittedTxHash` is set once `reportSubmitted` is called.\n // This avoids processing multiple `eportSubmitted` for the\n // same swap/bridge.\n if (historyItem.reportedSubmittedTxHash === srcTxHash) {\n return;\n }\n this.#quoteStatusManager.reportSubmitted(\n historyItem.quoteId,\n srcTxHash,\n txMetaId,\n );\n this.update((state) => {\n const item = state.txHistory[historyKey];\n if (item) {\n item.reportedSubmittedTxHash = srcTxHash;\n }\n });\n };\n\n resetState = (): void => {\n this.#quoteStatusManager.destroy();\n this.update((state) => {\n state.txHistory = DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.txHistory;\n state.quoteUpdateStatusStore =\n DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.quoteUpdateStatusStore;\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 * Seeds missing quote-status entries from persisted history on startup.\n *\n * The deferred quote-status entry (keyed by `${quoteId}:${srcTxHash}`) is only\n * created when `reportSubmitted` runs. If the client closes after a swap/bridge\n * is submitted but before that happens, the entry is never created and\n * `QuoteStatusManager.init()` has nothing to reconcile. The persisted history\n * item carries the `quoteId`, source tx hash, and `txMetaId` needed to rebuild\n * the entry, so we replay `reportSubmitted` here (idempotent via\n * `#reportSubmittedOnce`) before `init()` runs.\n */\n readonly #seedQuoteStatusEntriesFromHistory = (): void => {\n if (!this.#quoteStatusManager.enabled) {\n // Skip seeding to prevent `#reportSubmittedOnce` from persisting\n // `reportedSubmittedTxHash` so recent bridge history cannot be marked as\n // already reported with no store entry or backend update.\n return;\n }\n\n for (const [historyKey, historyItem] of Object.entries(\n this.state.txHistory,\n )) {\n const { quoteId, txMetaId } = historyItem;\n if (!quoteId || !txMetaId) {\n continue;\n }\n\n // Skip items older than the entry TTL: the backend would reject them, so\n // there is no point creating an entry or making a request.\n if (Date.now() - historyItem.startTime > QUOTE_STATUS_UPDATE_ENTRY_TTL) {\n continue;\n }\n\n // Prefer the history hash; fall back to the tx hash (covers STX swaps\n // confirmed while closed, where the history hash was never written).\n const srcTxHash =\n historyItem.status.srcChain.txHash ??\n getTransactionMetaById(this.messenger, txMetaId)?.hash;\n if (!srcTxHash) {\n continue;\n }\n\n // Call `reportSubmittedOnce` for each history item that satisfies\n // the above criteria. The method will then take care the rest\n // (ie. if it actually needs to be reported or not because it already has been).\n this.#reportSubmittedOnce(historyKey, srcTxHash, txMetaId);\n }\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 // Report finalization as a failure here, this is the only place that\n // permanently ends polling, so it's the correct and non-duplicative point\n // to emit the final status.\n this.#quoteStatusManager.reportFinalised(bridgeTxMetaId, false);\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\n // Report SUBMITTED as soon as the intent's source/settlement hash is\n // known at poll time, before the order reaches a terminal status.\n const intentSrcTxHash = status.srcChain.txHash;\n if (intentSrcTxHash) {\n this.#reportSubmittedOnce(\n bridgeTxMetaId,\n intentSrcTxHash,\n bridgeTxMetaId,\n );\n }\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 // Report SUBMITTED as soon as a srcTxHash is known at poll time, for\n // every chain not just non-EVM sources.\n this.#reportSubmittedOnce(bridgeTxMetaId, srcTxHash, bridgeTxMetaId);\n\n const statusRequest = getStatusRequestWithSrcTxHash(\n historyItem.quote,\n srcTxHash,\n );\n const response =\n (historyItem.quoteId\n ? await fetchBridgeQuoteStatus(\n this.#quoteStatusManager,\n historyItem.quoteId,\n )\n : null) ??\n (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) {\n if (pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n }\n\n // Ensure a deferred entry exists before reportFinalised is called.\n const settlementTxHash = newBridgeHistoryItem.status.srcChain.txHash;\n if (settlementTxHash) {\n this.#reportSubmittedOnce(\n bridgeTxMetaId,\n settlementTxHash,\n bridgeTxMetaId,\n );\n }\n\n this.#quoteStatusManager.reportFinalised(\n bridgeTxMetaId,\n status.status === StatusTypes.COMPLETE,\n );\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 // Report SUBMITTED as soon as the trade hash is known at submission\n // time, instead of waiting for the delayed transactionStatusUpdated\n // (submitted) event.\n if (payload.tradeMeta.hash) {\n this.#reportSubmittedOnce(\n payload.newHistoryKey,\n payload.tradeMeta.hash,\n payload.tradeMeta.id,\n );\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 this.#reportSubmittedForNonEvmTx(\n payload.historyKey,\n payload.bridgeTxMeta,\n );\n break;\n\n case SubmitStep.StartPolling:\n this.#startPollingForTxId(payload.historyKey);\n break;\n\n case SubmitStep.PublishCompletedEvent:\n this.#quoteStatusManager.reportFinalised(payload.historyKey, true);\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.Unknown,\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 ...(inputPrimaryDenomination && {\n input_primary_denomination: inputPrimaryDenomination,\n }),\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 historyItem?.location ??\n eventProperties?.location ??\n MetaMetricsSwapsEventSource.Unknown;\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 historyItem.inputPrimaryDenomination && {\n input_primary_denomination: historyItem.inputPrimaryDenomination,\n }),\n };\n\n trackMetricsEvent({\n messenger: this.messenger,\n eventName,\n properties: requiredEventProperties,\n });\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/bridge-status-controller",
3
- "version": "74.0.2-preview-6fc64deac",
3
+ "version": "74.0.2-preview-8b115b211",
4
4
  "description": "Manages bridge-related status fetching functionality for MetaMask",
5
5
  "keywords": [
6
6
  "Ethereum",
@@ -58,7 +58,7 @@
58
58
  "@metamask/controller-utils": "^12.3.0",
59
59
  "@metamask/gas-fee-controller": "^26.2.4",
60
60
  "@metamask/keyring-controller": "^27.1.0",
61
- "@metamask/messenger": "^2.0.0",
61
+ "@metamask/messenger": "^1.2.0",
62
62
  "@metamask/network-controller": "^34.0.0",
63
63
  "@metamask/polling-controller": "^16.0.8",
64
64
  "@metamask/profile-sync-controller": "^28.2.0",