@metamask-previews/bridge-status-controller 70.0.5-preview-af2c9f6c3 → 70.0.5-preview-02f91c63c

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CHANGELOG.md +0 -10
  2. package/dist/bridge-status-controller.cjs +114 -191
  3. package/dist/bridge-status-controller.cjs.map +1 -1
  4. package/dist/bridge-status-controller.d.cts.map +1 -1
  5. package/dist/bridge-status-controller.d.mts.map +1 -1
  6. package/dist/bridge-status-controller.mjs +118 -195
  7. package/dist/bridge-status-controller.mjs.map +1 -1
  8. package/dist/constants.cjs +1 -2
  9. package/dist/constants.cjs.map +1 -1
  10. package/dist/constants.d.cts +0 -1
  11. package/dist/constants.d.cts.map +1 -1
  12. package/dist/constants.d.mts +0 -1
  13. package/dist/constants.d.mts.map +1 -1
  14. package/dist/constants.mjs +0 -1
  15. package/dist/constants.mjs.map +1 -1
  16. package/dist/types.cjs.map +1 -1
  17. package/dist/types.d.cts +5 -6
  18. package/dist/types.d.cts.map +1 -1
  19. package/dist/types.d.mts +5 -6
  20. package/dist/types.d.mts.map +1 -1
  21. package/dist/types.mjs.map +1 -1
  22. package/dist/utils/bridge-status.cjs +1 -48
  23. package/dist/utils/bridge-status.cjs.map +1 -1
  24. package/dist/utils/bridge-status.d.cts +1 -2
  25. package/dist/utils/bridge-status.d.cts.map +1 -1
  26. package/dist/utils/bridge-status.d.mts +1 -2
  27. package/dist/utils/bridge-status.d.mts.map +1 -1
  28. package/dist/utils/bridge-status.mjs +1 -47
  29. package/dist/utils/bridge-status.mjs.map +1 -1
  30. package/dist/utils/history.cjs +2 -44
  31. package/dist/utils/history.cjs.map +1 -1
  32. package/dist/utils/history.d.cts +1 -19
  33. package/dist/utils/history.d.cts.map +1 -1
  34. package/dist/utils/history.d.mts +1 -19
  35. package/dist/utils/history.d.mts.map +1 -1
  36. package/dist/utils/history.mjs +2 -41
  37. package/dist/utils/history.mjs.map +1 -1
  38. package/dist/utils/metrics.cjs +2 -27
  39. package/dist/utils/metrics.cjs.map +1 -1
  40. package/dist/utils/metrics.d.cts +2 -25
  41. package/dist/utils/metrics.d.cts.map +1 -1
  42. package/dist/utils/metrics.d.mts +2 -25
  43. package/dist/utils/metrics.d.mts.map +1 -1
  44. package/dist/utils/metrics.mjs +1 -25
  45. package/dist/utils/metrics.mjs.map +1 -1
  46. package/dist/utils/network.cjs +1 -7
  47. package/dist/utils/network.cjs.map +1 -1
  48. package/dist/utils/network.d.cts +2 -4
  49. package/dist/utils/network.d.cts.map +1 -1
  50. package/dist/utils/network.d.mts +2 -4
  51. package/dist/utils/network.d.mts.map +1 -1
  52. package/dist/utils/network.mjs +0 -5
  53. package/dist/utils/network.mjs.map +1 -1
  54. package/dist/utils/transaction.cjs +8 -9
  55. package/dist/utils/transaction.cjs.map +1 -1
  56. package/dist/utils/transaction.d.cts +0 -1
  57. package/dist/utils/transaction.d.cts.map +1 -1
  58. package/dist/utils/transaction.d.mts +0 -1
  59. package/dist/utils/transaction.d.mts.map +1 -1
  60. package/dist/utils/transaction.mjs +7 -7
  61. package/dist/utils/transaction.mjs.map +1 -1
  62. package/package.json +1 -1
  63. package/dist/utils/feature-flags.cjs +0 -12
  64. package/dist/utils/feature-flags.cjs.map +0 -1
  65. package/dist/utils/feature-flags.d.cts +0 -3
  66. package/dist/utils/feature-flags.d.cts.map +0 -1
  67. package/dist/utils/feature-flags.d.mts +0 -3
  68. package/dist/utils/feature-flags.d.mts.map +0 -1
  69. package/dist/utils/feature-flags.mjs +0 -8
  70. package/dist/utils/feature-flags.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -9,7 +9,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  ### Added
11
11
 
12
- - Remove stale bridge transactions from `txHistory` to prevent excessive polling. Once a history item exceeds the configured maximum age, the status is fetched once, then the src tx hash's receipt is retrieved. If there is no receipt, the history item's hash is presumed to be invalid and the entry is deleted from state. ([#8479](https://github.com/MetaMask/core/pull/8479))
13
12
  - Add missing action types for public `BridgeStatusController` methods ([#8367](https://github.com/MetaMask/core/pull/8367))
14
13
  - The following types are now available:
15
14
  - `BridgeStatusControllerSubmitTxAction`
@@ -18,8 +17,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
18
17
 
19
18
  ### Changed
20
19
 
21
- - **BREAKING:** Replace `transactionFailed` and `transactionConfirmed` event subscriptions with `TransactionController:transactionStatusUpdated` ([#8479](https://github.com/MetaMask/core/pull/8479))
22
- - **BREAKING:** Add `RemoteFeatureFlags:getState` to allowed actions to retrieve max history item age config ([#8479](https://github.com/MetaMask/core/pull/8479))
23
20
  - Add `account_hardware_type` field to all cross-chain swap analytics events ([#8503](https://github.com/MetaMask/core/pull/8503))
24
21
  - `account_hardware_type` carries the specific hardware wallet brand (e.g. `'Ledger'`, `'QR Hardware'`) or `null` for software wallets
25
22
  - `is_hardware_wallet` is now derived from `account_hardware_type !== null`, keeping both fields in sync
@@ -31,13 +28,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
31
28
  - Bump `@metamask/base-controller` from `^9.0.1` to `^9.1.0` ([#8457](https://github.com/MetaMask/core/pull/8457))
32
29
  - Bump `@metamask/bridge-controller` from `^70.0.1` to `^70.1.1` ([#8466](https://github.com/MetaMask/core/pull/8466), [#8474](https://github.com/MetaMask/core/pull/8474))
33
30
 
34
- ### Fixed
35
-
36
- - Prevent invalid src hashes from being persisted in `txHistory` ([#8479](https://github.com/MetaMask/core/pull/8479))
37
- - Make transaction status subscribers generic so that `txHistory` items get updated if there are any transaction updates matching by actionId, txMetaId, hash or type
38
- - Skip saving smart transaction hashes on transaction submission. This used to make it possible for invalid src hashes to be stored in state and polled indefinitely. Instead, the txHistory item will now be updated with the confirmed tx hash when the `transactionStatusUpdated` event is published
39
- - If there is no srcTxHash in state, attempt to set it based on the local TransactionController state
40
-
41
31
  ## [70.0.5]
42
32
 
43
33
  ### Changed
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  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");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _BridgeStatusController_pollingTokensByTxMetaId, _BridgeStatusController_intentManager, _BridgeStatusController_clientId, _BridgeStatusController_fetchFn, _BridgeStatusController_config, _BridgeStatusController_addTransactionBatchFn, _BridgeStatusController_trace, _BridgeStatusController_onTransactionFailed, _BridgeStatusController_onTransactionConfirmed, _BridgeStatusController_restartPollingForIncompleteHistoryItems, _BridgeStatusController_addTxToHistory, _BridgeStatusController_rekeyHistoryItem, _BridgeStatusController_startPollingForTxId, _BridgeStatusController_handleFetchFailure, _BridgeStatusController_handleOldHistoryItem, _BridgeStatusController_fetchBridgeTxStatus, _BridgeStatusController_setAndGetSrcTxHash, _BridgeStatusController_updateHistoryItem, _BridgeStatusController_deleteHistoryItem, _BridgeStatusController_wipeBridgeStatusByChainId, _BridgeStatusController_handleApprovalTx, _BridgeStatusController_handleEvmTransactionBatch, _BridgeStatusController_trackPollingStatusUpdatedEvent, _BridgeStatusController_trackUnifiedSwapBridgeEvent;
13
+ var _BridgeStatusController_pollingTokensByTxMetaId, _BridgeStatusController_intentManager, _BridgeStatusController_clientId, _BridgeStatusController_fetchFn, _BridgeStatusController_config, _BridgeStatusController_addTransactionBatchFn, _BridgeStatusController_trace, _BridgeStatusController_onTransactionFailed, _BridgeStatusController_markTxAsFailed, _BridgeStatusController_restartPollingForIncompleteHistoryItems, _BridgeStatusController_addTxToHistory, _BridgeStatusController_rekeyHistoryItem, _BridgeStatusController_startPollingForTxId, _BridgeStatusController_handleFetchFailure, _BridgeStatusController_fetchBridgeTxStatus, _BridgeStatusController_getSrcTxHash, _BridgeStatusController_updateSrcTxHash, _BridgeStatusController_wipeBridgeStatusByChainId, _BridgeStatusController_handleApprovalTx, _BridgeStatusController_handleEvmTransactionBatch, _BridgeStatusController_trackUnifiedSwapBridgeEvent;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.BridgeStatusController = void 0;
16
16
  const bridge_controller_1 = require("@metamask/bridge-controller");
@@ -70,55 +70,60 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
70
70
  _BridgeStatusController_config.set(this, void 0);
71
71
  _BridgeStatusController_addTransactionBatchFn.set(this, void 0);
72
72
  _BridgeStatusController_trace.set(this, void 0);
73
- _BridgeStatusController_onTransactionFailed.set(this, ({ txMeta, historyKey, isApprovalTxMeta, }) => {
74
- // Check if the history item is already marked as a failure
75
- const isHistoryItemAlreadyFailed = historyKey
76
- ? this.state.txHistory[historyKey]?.status.status === bridge_controller_1.StatusTypes.FAILED
77
- : false;
78
- __classPrivateFieldGet(this, _BridgeStatusController_updateHistoryItem, "f").call(this, {
79
- historyKey,
80
- status: bridge_controller_1.StatusTypes.FAILED,
81
- txHash: isApprovalTxMeta ? undefined : txMeta.hash,
82
- });
83
- if (txMeta.status === transaction_controller_1.TransactionStatus.rejected) {
84
- return;
85
- }
86
- // Skip account lookup and tracking when featureId is set (e.g. PERPS)
87
- if (historyKey && this.state.txHistory[historyKey]?.featureId) {
88
- return;
89
- }
90
- // Skip tracking if this is a duplicate failed event for the same history item
91
- // This can happen if the transaction includes an approval tx that fails
92
- if (isHistoryItemAlreadyFailed) {
93
- return;
73
+ _BridgeStatusController_onTransactionFailed.set(this, ({ transactionMeta, }) => {
74
+ const { type, status, id: txMetaId, actionId } = transactionMeta;
75
+ if (type &&
76
+ [
77
+ transaction_controller_1.TransactionType.bridge,
78
+ transaction_controller_1.TransactionType.swap,
79
+ transaction_controller_1.TransactionType.bridgeApproval,
80
+ transaction_controller_1.TransactionType.swapApproval,
81
+ ].includes(type) &&
82
+ [
83
+ transaction_controller_1.TransactionStatus.failed,
84
+ transaction_controller_1.TransactionStatus.dropped,
85
+ transaction_controller_1.TransactionStatus.rejected,
86
+ ].includes(status)) {
87
+ __classPrivateFieldGet(this, _BridgeStatusController_markTxAsFailed, "f").call(this, transactionMeta);
88
+ if (status !== transaction_controller_1.TransactionStatus.rejected) {
89
+ let historyKey;
90
+ if (this.state.txHistory[txMetaId]) {
91
+ historyKey = txMetaId;
92
+ }
93
+ else if (actionId && this.state.txHistory[actionId]) {
94
+ historyKey = actionId;
95
+ }
96
+ const activeHistoryKey = historyKey ?? txMetaId;
97
+ // Skip account lookup and tracking when featureId is set (e.g. PERPS)
98
+ if (this.state.txHistory[activeHistoryKey]?.featureId) {
99
+ return;
100
+ }
101
+ const from = transactionMeta.txParams?.from;
102
+ __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Failed, activeHistoryKey, (0, metrics_1.getEVMTxPropertiesFromTransactionMeta)(transactionMeta, from
103
+ ? this.messenger.call('AccountsController:getAccountByAddress', from)
104
+ : undefined));
105
+ }
94
106
  }
95
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Failed, historyKey, (0, metrics_1.getEVMTxPropertiesFromTransactionMeta)(txMeta));
96
107
  });
97
- // Only EVM txs
98
- _BridgeStatusController_onTransactionConfirmed.set(this, ({ txMeta, historyKey, isApprovalTxMeta, }) => {
99
- // Return early if the confirmed txMeta is for an approval since we
100
- // still need to wait for the trade to be confirmed
101
- if (isApprovalTxMeta) {
108
+ // Mark tx as failed in txHistory if either the approval or trade fails
109
+ _BridgeStatusController_markTxAsFailed.set(this, ({ id: txMetaId, actionId, }) => {
110
+ // Look up by txMetaId first
111
+ let txHistoryKey = this.state.txHistory[txMetaId]
112
+ ? txMetaId
113
+ : undefined;
114
+ // If not found by txMetaId, try looking up by actionId (for pre-submission failures)
115
+ if (!txHistoryKey && actionId && this.state.txHistory[actionId]) {
116
+ txHistoryKey = actionId;
117
+ }
118
+ // If still not found, try looking up by approvalTxId
119
+ txHistoryKey ?? (txHistoryKey = Object.keys(this.state.txHistory).find((key) => this.state.txHistory[key].approvalTxId === txMetaId));
120
+ if (!txHistoryKey) {
102
121
  return;
103
122
  }
104
- __classPrivateFieldGet(this, _BridgeStatusController_updateHistoryItem, "f").call(this, {
105
- historyKey,
106
- txHash: txMeta.hash,
123
+ const key = txHistoryKey;
124
+ this.update((statusState) => {
125
+ statusState.txHistory[key].status.status = bridge_controller_1.StatusTypes.FAILED;
107
126
  });
108
- switch (txMeta.type) {
109
- case transaction_controller_1.TransactionType.swap:
110
- __classPrivateFieldGet(this, _BridgeStatusController_updateHistoryItem, "f").call(this, {
111
- historyKey,
112
- status: bridge_controller_1.StatusTypes.COMPLETE,
113
- });
114
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Completed, historyKey);
115
- break;
116
- default:
117
- if (historyKey) {
118
- __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, historyKey);
119
- }
120
- break;
121
- }
122
127
  });
123
128
  this.resetState = () => {
124
129
  this.update((state) => {
@@ -219,31 +224,30 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
219
224
  _BridgeStatusController_restartPollingForIncompleteHistoryItems.set(this, () => {
220
225
  // Check for historyItems that do not have a status of complete and restart polling
221
226
  const { txHistory } = this.state;
222
- const historyItems = Object.entries(txHistory);
227
+ const historyItems = Object.values(txHistory);
223
228
  const incompleteHistoryItems = historyItems
224
- .filter(([_, historyItem]) => historyItem.status.status === bridge_controller_1.StatusTypes.PENDING ||
229
+ .filter((historyItem) => historyItem.status.status === bridge_controller_1.StatusTypes.PENDING ||
225
230
  historyItem.status.status === bridge_controller_1.StatusTypes.UNKNOWN)
226
231
  // Only poll items with txMetaId (post-submission items)
227
- .filter(([_, historyItem]) => {
228
- if (!historyItem.txMetaId) {
229
- return false;
230
- }
232
+ .filter((historyItem) => Boolean(historyItem.txMetaId))
233
+ .filter((historyItem) => {
231
234
  // Check if we are already polling this tx, if so, skip restarting polling for that
232
235
  const pollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[historyItem.txMetaId];
233
236
  return !pollingToken;
234
237
  })
235
238
  // Only restart polling for items that still require status updates
236
- .filter(([_, historyItem]) => {
239
+ .filter((historyItem) => {
237
240
  return (0, history_1.shouldPollHistoryItem)(historyItem);
238
241
  });
239
- incompleteHistoryItems.forEach(([historyKey, historyItem]) => {
242
+ incompleteHistoryItems.forEach((historyItem) => {
243
+ const bridgeTxMetaId = historyItem.txMetaId;
240
244
  const shouldSkipFetch = (0, bridge_status_1.shouldSkipFetchDueToFetchFailures)(historyItem.attempts);
241
245
  if (shouldSkipFetch) {
242
246
  return;
243
247
  }
244
248
  // We manually call startPolling() here rather than go through startPollingForBridgeTxStatus()
245
249
  // because we don't want to overwrite the existing historyItem in state
246
- __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, historyKey);
250
+ __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, bridgeTxMetaId);
247
251
  });
248
252
  });
249
253
  _BridgeStatusController_addTxToHistory.set(this, (...args) => {
@@ -252,7 +256,6 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
252
256
  // Use actionId as key for pre-submission, or txMeta.id for post-submission
253
257
  state.txHistory[historyKey] = txHistoryItem;
254
258
  });
255
- return historyKey;
256
259
  });
257
260
  /**
258
261
  * Rekeys a history item from actionId to txMeta.id after successful submission.
@@ -275,7 +278,10 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
275
278
  this.stopPollingByPollingToken(existingPollingToken);
276
279
  }
277
280
  const txHistoryItem = this.state.txHistory[txId];
278
- if (txHistoryItem && (0, history_1.shouldPollHistoryItem)(txHistoryItem)) {
281
+ if (!txHistoryItem) {
282
+ return;
283
+ }
284
+ if ((0, history_1.shouldPollHistoryItem)(txHistoryItem)) {
279
285
  __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[txId] = this.startPolling({
280
286
  bridgeTxMetaId: txId,
281
287
  });
@@ -296,8 +302,8 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
296
302
  if (!bridgeTxMeta?.id) {
297
303
  throw new Error('Cannot start polling: bridgeTxMeta.id is required for polling');
298
304
  }
299
- const historyKey = __classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, txHistoryMeta);
300
- __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, historyKey);
305
+ __classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, txHistoryMeta);
306
+ __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, bridgeTxMeta.id);
301
307
  };
302
308
  // This will be called after you call this.startPolling()
303
309
  // The args passed in are the args you passed in to startPolling()
@@ -332,38 +338,29 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
332
338
  // Track max polling reached event
333
339
  const historyItem = this.state.txHistory[bridgeTxMetaId];
334
340
  if (historyItem && !historyItem.featureId) {
335
- // Track polling status updated event
336
- __classPrivateFieldGet(this, _BridgeStatusController_trackPollingStatusUpdatedEvent, "f").call(this, bridgeTxMetaId, bridge_controller_1.PollingStatus.MaxPollingReached);
341
+ const selectedAccount = (0, accounts_1.getAccountByAddress)(this.messenger, historyItem.account);
342
+ const requestParams = (0, metrics_1.getRequestParamFromHistory)(historyItem);
343
+ const requestMetadata = (0, metrics_1.getRequestMetadataFromHistory)(historyItem, selectedAccount);
344
+ const { security_warnings: _, ...metadataWithoutWarnings } = requestMetadata;
345
+ __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.PollingStatusUpdated, bridgeTxMetaId, {
346
+ ...(0, metrics_1.getTradeDataFromHistory)(historyItem),
347
+ ...(0, metrics_1.getPriceImpactFromQuote)(historyItem.quote),
348
+ ...metadataWithoutWarnings,
349
+ chain_id_source: requestParams.chain_id_source,
350
+ chain_id_destination: requestParams.chain_id_destination,
351
+ token_symbol_source: requestParams.token_symbol_source,
352
+ token_symbol_destination: requestParams.token_symbol_destination,
353
+ action_type: bridge_controller_1.MetricsActionType.SWAPBRIDGE_V1,
354
+ polling_status: bridge_controller_1.PollingStatus.MaxPollingReached,
355
+ retry_attempts: newAttempts.counter,
356
+ });
337
357
  }
338
358
  }
339
359
  // Update the attempts counter
340
- __classPrivateFieldGet(this, _BridgeStatusController_updateHistoryItem, "f").call(this, {
341
- historyKey: bridgeTxMetaId,
342
- attempts: newAttempts,
360
+ this.update((state) => {
361
+ state.txHistory[bridgeTxMetaId].attempts = newAttempts;
343
362
  });
344
363
  });
345
- /**
346
- * Checks if the history item should be preserved so its status can be fetched.
347
- *
348
- * @param bridgeTxMetaId - The txMetaId of the bridge tx
349
- */
350
- _BridgeStatusController_handleOldHistoryItem.set(this, async (bridgeTxMetaId) => {
351
- // Continue polling on next restart if the history item is valid
352
- if (this.state.txHistory[bridgeTxMetaId] &&
353
- (await (0, bridge_status_1.shouldWaitForFinalBridgeStatus)(this.messenger, this.state.txHistory[bridgeTxMetaId]))) {
354
- return;
355
- }
356
- const pollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[bridgeTxMetaId];
357
- // Track polling status updated event
358
- __classPrivateFieldGet(this, _BridgeStatusController_trackPollingStatusUpdatedEvent, "f").call(this, bridgeTxMetaId, bridge_controller_1.PollingStatus.InvalidTransactionHash);
359
- // If we've failed too many times, stop polling for the tx
360
- if (pollingToken) {
361
- this.stopPollingByPollingToken(pollingToken);
362
- delete __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[bridgeTxMetaId];
363
- }
364
- // Delete the history item so polling doesn't start over on the next restart
365
- __classPrivateFieldGet(this, _BridgeStatusController_deleteHistoryItem, "f").call(this, bridgeTxMetaId);
366
- });
367
364
  _BridgeStatusController_fetchBridgeTxStatus.set(this, async ({ bridgeTxMetaId, }) => {
368
365
  // 1. Check for history item
369
366
  const { txHistory } = this.state;
@@ -375,7 +372,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
375
372
  if ((0, bridge_status_1.shouldSkipFetchDueToFetchFailures)(historyItem.attempts)) {
376
373
  return;
377
374
  }
378
- // 3. Fetch transaction status
375
+ // 3. Fetch transcation status
379
376
  try {
380
377
  let status;
381
378
  let validationFailures = [];
@@ -391,10 +388,11 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
391
388
  // We try here because we receive 500 errors from Bridge API if we try to fetch immediately after submitting the source tx
392
389
  // Oddly mostly happens on Optimism, never on Arbitrum. By the 2nd fetch, the Bridge API responds properly.
393
390
  // Also srcTxHash may not be available immediately for STX, so we don't want to fetch in those cases
394
- const srcTxHash = __classPrivateFieldGet(this, _BridgeStatusController_setAndGetSrcTxHash, "f").call(this, bridgeTxMetaId);
391
+ const srcTxHash = __classPrivateFieldGet(this, _BridgeStatusController_getSrcTxHash, "f").call(this, bridgeTxMetaId);
395
392
  if (!srcTxHash) {
396
393
  return;
397
394
  }
395
+ __classPrivateFieldGet(this, _BridgeStatusController_updateSrcTxHash, "f").call(this, bridgeTxMetaId, srcTxHash);
398
396
  const statusRequest = (0, bridge_status_1.getStatusRequestWithSrcTxHash)(historyItem.quote, srcTxHash);
399
397
  const response = await (0, bridge_status_1.fetchBridgeTxStatus)(statusRequest, __classPrivateFieldGet(this, _BridgeStatusController_clientId, "f"), await (0, authentication_1.getJwt)(this.messenger), __classPrivateFieldGet(this, _BridgeStatusController_fetchFn, "f"), __classPrivateFieldGet(this, _BridgeStatusController_config, "f").customBridgeApiBaseUrl);
400
398
  status = response.status;
@@ -451,65 +449,26 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
451
449
  console.warn('Failed to fetch bridge tx status', error);
452
450
  __classPrivateFieldGet(this, _BridgeStatusController_handleFetchFailure, "f").call(this, bridgeTxMetaId);
453
451
  }
454
- finally {
455
- await __classPrivateFieldGet(this, _BridgeStatusController_handleOldHistoryItem, "f").call(this, bridgeTxMetaId);
456
- }
457
452
  });
458
- /**
459
- * Returns the srcTxHash for a non-STX EVM tx, the hash from the bridge status api,
460
- * or the local hash from the TransactionController if the tx is in a finalized state
461
- *
462
- * @param bridgeTxMetaId - The bridge tx meta id
463
- * @returns The srcTxHash
464
- */
465
- _BridgeStatusController_setAndGetSrcTxHash.set(this, (bridgeTxMetaId) => {
453
+ _BridgeStatusController_getSrcTxHash.set(this, (bridgeTxMetaId) => {
466
454
  const { txHistory } = this.state;
467
- // Prefer the srcTxHash from bridgeStatusState so we don't have to look up in TransactionController
455
+ // Prefer the srcTxHash from bridgeStatusState so we don't have to l ook up in TransactionController
468
456
  // But it is possible to have bridgeHistoryItem in state without the srcTxHash yet when it is an STX
469
457
  const srcTxHash = txHistory[bridgeTxMetaId].status.srcChain.txHash;
470
- if (srcTxHash ||
471
- (0, bridge_controller_1.isNonEvmChainId)(txHistory[bridgeTxMetaId].quote.srcChainId)) {
458
+ if (srcTxHash) {
472
459
  return srcTxHash;
473
460
  }
474
- // Update history with TransactionController's hash if it has been updated
461
+ // Look up in TransactionController if txMeta has been updated with the srcTxHash
475
462
  const txMeta = (0, transaction_1.getTransactionMetaById)(this.messenger, bridgeTxMetaId);
476
- if (!txMeta) {
477
- return undefined;
478
- }
479
- // Wait for finalized status before updating the history item
480
- const localTxHash = [
481
- transaction_controller_1.TransactionStatus.confirmed,
482
- transaction_controller_1.TransactionStatus.dropped,
483
- transaction_controller_1.TransactionStatus.rejected,
484
- transaction_controller_1.TransactionStatus.failed,
485
- ].includes(txMeta.status)
486
- ? txMeta.hash
487
- : undefined;
488
- __classPrivateFieldGet(this, _BridgeStatusController_updateHistoryItem, "f").call(this, {
489
- historyKey: bridgeTxMetaId,
490
- txHash: localTxHash,
491
- });
492
- return localTxHash;
463
+ return txMeta?.hash;
493
464
  });
494
- _BridgeStatusController_updateHistoryItem.set(this, ({ historyKey, status, txHash, attempts, }) => {
495
- if (!historyKey) {
465
+ _BridgeStatusController_updateSrcTxHash.set(this, (bridgeTxMetaId, srcTxHash) => {
466
+ const { txHistory } = this.state;
467
+ if (txHistory[bridgeTxMetaId].status.srcChain.txHash) {
496
468
  return;
497
469
  }
498
- this.update((currentState) => {
499
- if (status) {
500
- currentState.txHistory[historyKey].status.status = status;
501
- }
502
- if (txHash) {
503
- currentState.txHistory[historyKey].status.srcChain.txHash = txHash;
504
- }
505
- if (attempts) {
506
- currentState.txHistory[historyKey].attempts = attempts;
507
- }
508
- });
509
- });
510
- _BridgeStatusController_deleteHistoryItem.set(this, (historyKey) => {
511
- this.update((currentState) => {
512
- delete currentState.txHistory[historyKey];
470
+ this.update((state) => {
471
+ state.txHistory[bridgeTxMetaId].status.srcChain.txHash = srcTxHash;
513
472
  });
514
473
  });
515
474
  // Wipes the bridge status for the given address and chainId
@@ -525,7 +484,6 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
525
484
  const pollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[sourceTxMetaId];
526
485
  if (pollingToken) {
527
486
  this.stopPollingByPollingToken(__classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[sourceTxMetaId]);
528
- delete __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[sourceTxMetaId];
529
487
  }
530
488
  });
531
489
  this.update((state) => {
@@ -692,7 +650,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
692
650
  const actionId = (0, transaction_1.generateActionId)().toString();
693
651
  // Add pre-submission history keyed by actionId
694
652
  // This ensures we have quote data available if transaction fails during submission
695
- const historyKey = __classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, {
653
+ __classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, {
696
654
  accountAddress: selectedAccount.address,
697
655
  quoteResponse,
698
656
  slippagePercentage: 0,
@@ -719,7 +677,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
719
677
  actionId,
720
678
  });
721
679
  // On success, rekey from actionId to txMeta.id and update srcTxHash
722
- __classPrivateFieldGet(this, _BridgeStatusController_rekeyHistoryItem, "f").call(this, historyKey, tradeTxMeta);
680
+ __classPrivateFieldGet(this, _BridgeStatusController_rekeyHistoryItem, "f").call(this, actionId, tradeTxMeta);
723
681
  return tradeTxMeta;
724
682
  });
725
683
  }
@@ -739,12 +697,11 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
739
697
  !isStxEnabledOnClient &&
740
698
  !quoteResponse.quote.gasIncluded7702 &&
741
699
  !isDelegatedAccount;
742
- let historyKey = txMeta.id;
743
700
  if (!isNonBatchEvm) {
744
701
  // Add swap or bridge tx to history
745
- historyKey = __classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, {
702
+ __classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, {
746
703
  accountAddress: selectedAccount.address,
747
- bridgeTxMeta: txMeta, // Only the id and hash fields are used by the BridgeStatusController
704
+ bridgeTxMeta: txMeta, // Only the id field is used by the BridgeStatusController
748
705
  quoteResponse,
749
706
  slippagePercentage: 0, // TODO include slippage provided by quote if using dynamic slippage, or slippage from quote request
750
707
  isStxEnabled: isStxEnabledOnClient,
@@ -757,10 +714,10 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
757
714
  }
758
715
  if ((0, bridge_controller_1.isNonEvmChainId)(quoteResponse.quote.srcChainId)) {
759
716
  // Start polling for bridge tx status
760
- __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, historyKey);
717
+ __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, txMeta.id);
761
718
  // Track non-EVM Swap completed event
762
719
  if (!(isBridgeTx || isTronTx)) {
763
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Completed, historyKey);
720
+ __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Completed, txMeta.id);
764
721
  }
765
722
  }
766
723
  }
@@ -859,14 +816,15 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
859
816
  };
860
817
  // Record in bridge history with actual transaction metadata
861
818
  try {
819
+ // Use orderId as the history key for intent transactions
820
+ const bridgeHistoryKey = orderUid;
862
821
  // Create a bridge transaction metadata that includes the original txId
863
822
  const bridgeTxMetaForHistory = {
864
823
  ...syntheticMeta,
865
- id: orderUid,
824
+ id: bridgeHistoryKey,
866
825
  originalTransactionId: syntheticMeta.id, // Keep original txId for TransactionController updates
867
826
  };
868
- // Use orderId as the history key for intent transactions
869
- const historyKey = __classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, {
827
+ __classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, {
870
828
  accountAddress,
871
829
  bridgeTxMeta: bridgeTxMetaForHistory,
872
830
  quoteResponse,
@@ -879,7 +837,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
879
837
  activeAbTests,
880
838
  });
881
839
  // Start polling using the orderId key to route to intent manager
882
- __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, historyKey);
840
+ __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, bridgeHistoryKey);
883
841
  }
884
842
  catch (error) {
885
843
  console.error('📝 [submitIntent] Failed to add to bridge history', error);
@@ -895,13 +853,6 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
895
853
  throw error;
896
854
  }
897
855
  };
898
- _BridgeStatusController_trackPollingStatusUpdatedEvent.set(this, (historyKey, pollingStatus) => {
899
- // Track polling status updated event
900
- const historyItem = this.state.txHistory[historyKey];
901
- if (historyItem && !historyItem.featureId) {
902
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.PollingStatusUpdated, historyKey, (0, metrics_1.getPollingStatusUpdatedProperties)(this.messenger, pollingStatus, historyItem));
903
- }
904
- });
905
856
  /**
906
857
  * Tracks post-submission events for a cross-chain swap based on the history item
907
858
  *
@@ -1009,43 +960,15 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
1009
960
  this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
1010
961
  // Set interval
1011
962
  this.setIntervalLength(constants_1.REFRESH_INTERVAL_MS);
1012
- this.messenger.subscribe('TransactionController:transactionStatusUpdated', ({ txMeta, historyKey, historyItem, isApprovalTxMeta }) => {
1013
- if (!txMeta) {
1014
- return;
963
+ this.messenger.subscribe('TransactionController:transactionFailed', __classPrivateFieldGet(this, _BridgeStatusController_onTransactionFailed, "f"));
964
+ this.messenger.subscribe('TransactionController:transactionConfirmed', (transactionMeta) => {
965
+ const { type, id: txMetaId, chainId } = transactionMeta;
966
+ if (type === transaction_controller_1.TransactionType.swap) {
967
+ __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Completed, txMetaId);
1015
968
  }
1016
- const { type, status } = txMeta;
1017
- // Allow event publishing if the txMeta is a swap/bridge OR if the
1018
- // corresponding history item exists
1019
- const isSwapOrBridgeTransaction = type && (0, transaction_1.isCrossChainTx)(type);
1020
- if (!isSwapOrBridgeTransaction && !historyKey && !historyItem) {
1021
- return;
969
+ if (type === transaction_controller_1.TransactionType.bridge && !(0, bridge_controller_1.isNonEvmChainId)(chainId)) {
970
+ __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, txMetaId);
1022
971
  }
1023
- switch (status) {
1024
- case transaction_controller_1.TransactionStatus.confirmed:
1025
- __classPrivateFieldGet(this, _BridgeStatusController_onTransactionConfirmed, "f").call(this, {
1026
- txMeta,
1027
- historyKey,
1028
- isApprovalTxMeta,
1029
- });
1030
- break;
1031
- case transaction_controller_1.TransactionStatus.failed:
1032
- case transaction_controller_1.TransactionStatus.dropped:
1033
- case transaction_controller_1.TransactionStatus.rejected:
1034
- __classPrivateFieldGet(this, _BridgeStatusController_onTransactionFailed, "f").call(this, { txMeta, historyKey, isApprovalTxMeta });
1035
- break;
1036
- default:
1037
- break;
1038
- }
1039
- }, ({ transactionMeta }) => {
1040
- const entry = (0, history_1.getMatchingHistoryEntryForTxMeta)(this.state.txHistory, transactionMeta);
1041
- const approvalEntry = (0, history_1.getMatchingHistoryEntryForApprovalTxMeta)(this.state.txHistory, transactionMeta);
1042
- const entryToUse = entry ?? approvalEntry;
1043
- return {
1044
- historyKey: entryToUse?.[0],
1045
- historyItem: entryToUse?.[1],
1046
- txMeta: transactionMeta,
1047
- isApprovalTxMeta: entryToUse?.[1]?.approvalTxId === transactionMeta.id,
1048
- };
1049
972
  });
1050
973
  // If you close the extension, but keep the browser open, the polling continues
1051
974
  // If you close the browser, the polling stops
@@ -1054,5 +977,5 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
1054
977
  }
1055
978
  }
1056
979
  exports.BridgeStatusController = BridgeStatusController;
1057
- _BridgeStatusController_pollingTokensByTxMetaId = new WeakMap(), _BridgeStatusController_intentManager = 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_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_handleApprovalTx = new WeakMap(), _BridgeStatusController_handleEvmTransactionBatch = new WeakMap(), _BridgeStatusController_trackPollingStatusUpdatedEvent = new WeakMap(), _BridgeStatusController_trackUnifiedSwapBridgeEvent = new WeakMap();
980
+ _BridgeStatusController_pollingTokensByTxMetaId = new WeakMap(), _BridgeStatusController_intentManager = 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_markTxAsFailed = new WeakMap(), _BridgeStatusController_restartPollingForIncompleteHistoryItems = new WeakMap(), _BridgeStatusController_addTxToHistory = new WeakMap(), _BridgeStatusController_rekeyHistoryItem = new WeakMap(), _BridgeStatusController_startPollingForTxId = new WeakMap(), _BridgeStatusController_handleFetchFailure = new WeakMap(), _BridgeStatusController_fetchBridgeTxStatus = new WeakMap(), _BridgeStatusController_getSrcTxHash = new WeakMap(), _BridgeStatusController_updateSrcTxHash = new WeakMap(), _BridgeStatusController_wipeBridgeStatusByChainId = new WeakMap(), _BridgeStatusController_handleApprovalTx = new WeakMap(), _BridgeStatusController_handleEvmTransactionBatch = new WeakMap(), _BridgeStatusController_trackUnifiedSwapBridgeEvent = new WeakMap();
1058
981
  //# sourceMappingURL=bridge-status-controller.cjs.map