@metamask-previews/bridge-status-controller 70.0.5-preview-8e9c439 → 70.0.5-preview-4845f8918

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 (66) hide show
  1. package/CHANGELOG.md +0 -10
  2. package/dist/bridge-status-controller.cjs +135 -197
  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 +138 -200
  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 +3 -4
  18. package/dist/types.d.cts.map +1 -1
  19. package/dist/types.d.mts +3 -4
  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 -39
  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 -38
  29. package/dist/utils/bridge-status.mjs.map +1 -1
  30. package/dist/utils/history.cjs +2 -49
  31. package/dist/utils/history.cjs.map +1 -1
  32. package/dist/utils/history.d.cts +1 -12
  33. package/dist/utils/history.d.cts.map +1 -1
  34. package/dist/utils/history.d.mts +1 -12
  35. package/dist/utils/history.d.mts.map +1 -1
  36. package/dist/utils/history.mjs +2 -46
  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 +1 -1
  55. package/dist/utils/transaction.cjs.map +1 -1
  56. package/dist/utils/transaction.mjs +1 -1
  57. package/dist/utils/transaction.mjs.map +1 -1
  58. package/package.json +1 -1
  59. package/dist/utils/feature-flags.cjs +0 -12
  60. package/dist/utils/feature-flags.cjs.map +0 -1
  61. package/dist/utils/feature-flags.d.cts +0 -3
  62. package/dist/utils/feature-flags.d.cts.map +0 -1
  63. package/dist/utils/feature-flags.d.mts +0 -3
  64. package/dist/utils/feature-flags.d.mts.map +0 -1
  65. package/dist/utils/feature-flags.mjs +0 -8
  66. 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, polling backs off exponentially and also checks for the src tx hash's receipt. If there is no receipt, the history item's hash is presumed to be invalid and 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_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,45 +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, }) => {
74
- __classPrivateFieldGet(this, _BridgeStatusController_updateHistoryItem, "f").call(this, {
75
- historyKey,
76
- status: bridge_controller_1.StatusTypes.FAILED,
77
- txHash: txMeta.type &&
78
- [transaction_controller_1.TransactionType.bridge, transaction_controller_1.TransactionType.swap].includes(txMeta.type)
79
- ? txMeta.hash
80
- : undefined,
81
- });
82
- if (txMeta.status === transaction_controller_1.TransactionStatus.rejected) {
83
- 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
+ }
84
106
  }
85
- // Skip account lookup and tracking when featureId is set (e.g. PERPS)
86
- if (historyKey && this.state.txHistory[historyKey]?.featureId) {
107
+ });
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) {
87
121
  return;
88
122
  }
89
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Failed, historyKey, (0, metrics_1.getEVMTxPropertiesFromTransactionMeta)(txMeta));
90
- });
91
- // Only EVM txs
92
- _BridgeStatusController_onTransactionConfirmed.set(this, ({ txMeta, historyKey, }) => {
93
- __classPrivateFieldGet(this, _BridgeStatusController_updateHistoryItem, "f").call(this, {
94
- historyKey,
95
- txHash: txMeta.hash,
123
+ const key = txHistoryKey;
124
+ this.update((statusState) => {
125
+ statusState.txHistory[key].status.status = bridge_controller_1.StatusTypes.FAILED;
96
126
  });
97
- console.log('======TransactionController:transactionConfirmed', txMeta);
98
- switch (txMeta.type) {
99
- case transaction_controller_1.TransactionType.swap:
100
- __classPrivateFieldGet(this, _BridgeStatusController_updateHistoryItem, "f").call(this, {
101
- historyKey,
102
- status: bridge_controller_1.StatusTypes.COMPLETE,
103
- });
104
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Completed, historyKey);
105
- break;
106
- default:
107
- if (historyKey) {
108
- __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, historyKey);
109
- }
110
- break;
111
- }
112
127
  });
113
128
  this.resetState = () => {
114
129
  this.update((state) => {
@@ -209,31 +224,30 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
209
224
  _BridgeStatusController_restartPollingForIncompleteHistoryItems.set(this, () => {
210
225
  // Check for historyItems that do not have a status of complete and restart polling
211
226
  const { txHistory } = this.state;
212
- const historyItems = Object.entries(txHistory);
227
+ const historyItems = Object.values(txHistory);
213
228
  const incompleteHistoryItems = historyItems
214
- .filter(([_, historyItem]) => historyItem.status.status === bridge_controller_1.StatusTypes.PENDING ||
229
+ .filter((historyItem) => historyItem.status.status === bridge_controller_1.StatusTypes.PENDING ||
215
230
  historyItem.status.status === bridge_controller_1.StatusTypes.UNKNOWN)
216
231
  // Only poll items with txMetaId (post-submission items)
217
- .filter(([_, historyItem]) => {
218
- if (!historyItem.txMetaId) {
219
- return false;
220
- }
232
+ .filter((historyItem) => Boolean(historyItem.txMetaId))
233
+ .filter((historyItem) => {
221
234
  // Check if we are already polling this tx, if so, skip restarting polling for that
222
235
  const pollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[historyItem.txMetaId];
223
236
  return !pollingToken;
224
237
  })
225
238
  // Only restart polling for items that still require status updates
226
- .filter(([_, historyItem]) => {
239
+ .filter((historyItem) => {
227
240
  return (0, history_1.shouldPollHistoryItem)(historyItem);
228
241
  });
229
- incompleteHistoryItems.forEach(([historyKey, historyItem]) => {
242
+ incompleteHistoryItems.forEach((historyItem) => {
243
+ const bridgeTxMetaId = historyItem.txMetaId;
230
244
  const shouldSkipFetch = (0, bridge_status_1.shouldSkipFetchDueToFetchFailures)(historyItem.attempts);
231
245
  if (shouldSkipFetch) {
232
246
  return;
233
247
  }
234
248
  // We manually call startPolling() here rather than go through startPollingForBridgeTxStatus()
235
249
  // because we don't want to overwrite the existing historyItem in state
236
- __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, historyKey);
250
+ __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, bridgeTxMetaId);
237
251
  });
238
252
  });
239
253
  _BridgeStatusController_addTxToHistory.set(this, (...args) => {
@@ -242,7 +256,6 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
242
256
  // Use actionId as key for pre-submission, or txMeta.id for post-submission
243
257
  state.txHistory[historyKey] = txHistoryItem;
244
258
  });
245
- return historyKey;
246
259
  });
247
260
  /**
248
261
  * Rekeys a history item from actionId to txMeta.id after successful submission.
@@ -265,6 +278,9 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
265
278
  this.stopPollingByPollingToken(existingPollingToken);
266
279
  }
267
280
  const txHistoryItem = this.state.txHistory[txId];
281
+ if (!txHistoryItem) {
282
+ return;
283
+ }
268
284
  if ((0, history_1.shouldPollHistoryItem)(txHistoryItem)) {
269
285
  __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[txId] = this.startPolling({
270
286
  bridgeTxMetaId: txId,
@@ -286,8 +302,8 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
286
302
  if (!bridgeTxMeta?.id) {
287
303
  throw new Error('Cannot start polling: bridgeTxMeta.id is required for polling');
288
304
  }
289
- const historyKey = __classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, txHistoryMeta);
290
- __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);
291
307
  };
292
308
  // This will be called after you call this.startPolling()
293
309
  // The args passed in are the args you passed in to startPolling()
@@ -295,45 +311,55 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
295
311
  await __classPrivateFieldGet(this, _BridgeStatusController_fetchBridgeTxStatus, "f").call(this, pollingInput);
296
312
  };
297
313
  /**
298
- * Handles the failure to fetch the bridge tx status or recognize the transaction hash
299
- * We eventually stop polling for the tx if we fail too many times or if the transaction is stale
314
+ * Handles the failure to fetch the bridge tx status
315
+ * We eventually stop polling for the tx if we fail too many times
300
316
  * Failures (500 errors) can be due to:
301
317
  * - The srcTxHash not being available immediately for STX
302
318
  * - 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.
303
319
  *
304
320
  * @param bridgeTxMetaId - The txMetaId of the bridge tx
305
321
  */
306
- _BridgeStatusController_handleFetchFailure.set(this, async (bridgeTxMetaId) => {
307
- // Increment the polling attempts counter
308
- const newAttempts = (0, history_1.incrementPollingAttempts)(this.state.txHistory[bridgeTxMetaId]);
309
- __classPrivateFieldGet(this, _BridgeStatusController_updateHistoryItem, "f").call(this, {
310
- historyKey: bridgeTxMetaId,
311
- attempts: newAttempts,
312
- });
313
- // Continue polling every 10s until the max attempts is reached
314
- if (newAttempts.counter < constants_1.MAX_ATTEMPTS) {
315
- return;
316
- }
322
+ _BridgeStatusController_handleFetchFailure.set(this, (bridgeTxMetaId) => {
323
+ const { attempts } = this.state.txHistory[bridgeTxMetaId];
324
+ const newAttempts = attempts
325
+ ? {
326
+ counter: attempts.counter + 1,
327
+ lastAttemptTime: Date.now(),
328
+ }
329
+ : {
330
+ counter: 1,
331
+ lastAttemptTime: Date.now(),
332
+ };
333
+ // If we've failed too many times, stop polling for the tx
317
334
  const pollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[bridgeTxMetaId];
318
- // After the attempts exceed the max, keep polling with exponential backoff
319
- // If the historyItem age is less than the configured maxPendingHistoryItemAgeMs flag, wait for a valid srcTxHash
320
- if (await (0, bridge_status_1.shouldWaitForFinalBridgeStatus)(this.messenger, this.state.txHistory[bridgeTxMetaId])) {
321
- return;
322
- }
323
- // If we've failed too many times and the srcTxHash is invalid, stop polling for the tx
324
- if (pollingToken) {
335
+ if (newAttempts.counter >= constants_1.MAX_ATTEMPTS && pollingToken) {
325
336
  this.stopPollingByPollingToken(pollingToken);
326
337
  delete __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[bridgeTxMetaId];
338
+ // Track max polling reached event
339
+ const historyItem = this.state.txHistory[bridgeTxMetaId];
340
+ if (historyItem && !historyItem.featureId) {
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
+ });
357
+ }
327
358
  }
328
- // Track polling status updated event
329
- if (newAttempts.counter === constants_1.MAX_ATTEMPTS) {
330
- __classPrivateFieldGet(this, _BridgeStatusController_trackPollingStatusUpdatedEvent, "f").call(this, bridgeTxMetaId, bridge_controller_1.PollingStatus.MaxPollingReached);
331
- }
332
- else {
333
- __classPrivateFieldGet(this, _BridgeStatusController_trackPollingStatusUpdatedEvent, "f").call(this, bridgeTxMetaId, bridge_controller_1.PollingStatus.StaleTransactionHash);
334
- // Delete the history item so polling doesn't start over on the next restart
335
- __classPrivateFieldGet(this, _BridgeStatusController_deleteHistoryItem, "f").call(this, bridgeTxMetaId);
336
- }
359
+ // Update the attempts counter
360
+ this.update((state) => {
361
+ state.txHistory[bridgeTxMetaId].attempts = newAttempts;
362
+ });
337
363
  });
338
364
  _BridgeStatusController_fetchBridgeTxStatus.set(this, async ({ bridgeTxMetaId, }) => {
339
365
  // 1. Check for history item
@@ -362,14 +388,11 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
362
388
  // We try here because we receive 500 errors from Bridge API if we try to fetch immediately after submitting the source tx
363
389
  // Oddly mostly happens on Optimism, never on Arbitrum. By the 2nd fetch, the Bridge API responds properly.
364
390
  // Also srcTxHash may not be available immediately for STX, so we don't want to fetch in those cases
365
- const srcTxHash = __classPrivateFieldGet(this, _BridgeStatusController_setAndGetSrcTxHash, "f").call(this, bridgeTxMetaId);
366
- // Throw errors to increase polling attempts counter
367
- if ((0, history_1.isHistoryItemTooOld)(this.messenger, historyItem)) {
368
- throw new Error(`History item is too old: ${bridgeTxMetaId}}`);
369
- }
391
+ const srcTxHash = __classPrivateFieldGet(this, _BridgeStatusController_getSrcTxHash, "f").call(this, bridgeTxMetaId);
370
392
  if (!srcTxHash) {
371
393
  return;
372
394
  }
395
+ __classPrivateFieldGet(this, _BridgeStatusController_updateSrcTxHash, "f").call(this, bridgeTxMetaId, srcTxHash);
373
396
  const statusRequest = (0, bridge_status_1.getStatusRequestWithSrcTxHash)(historyItem.quote, srcTxHash);
374
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);
375
398
  status = response.status;
@@ -424,65 +447,28 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
424
447
  }
425
448
  catch (error) {
426
449
  console.warn('Failed to fetch bridge tx status', error);
427
- await __classPrivateFieldGet(this, _BridgeStatusController_handleFetchFailure, "f").call(this, bridgeTxMetaId);
450
+ __classPrivateFieldGet(this, _BridgeStatusController_handleFetchFailure, "f").call(this, bridgeTxMetaId);
428
451
  }
429
452
  });
430
- /**
431
- * Returns the srcTxHash for a non-STX EVM tx, the hash from the bridge status api,
432
- * or the local hash from the TransactionController if the tx is in a finalized state
433
- *
434
- * @param bridgeTxMetaId - The bridge tx meta id
435
- * @returns The srcTxHash
436
- */
437
- _BridgeStatusController_setAndGetSrcTxHash.set(this, (bridgeTxMetaId) => {
453
+ _BridgeStatusController_getSrcTxHash.set(this, (bridgeTxMetaId) => {
438
454
  const { txHistory } = this.state;
439
- // 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
440
456
  // But it is possible to have bridgeHistoryItem in state without the srcTxHash yet when it is an STX
441
457
  const srcTxHash = txHistory[bridgeTxMetaId].status.srcChain.txHash;
442
- if (srcTxHash ||
443
- (0, bridge_controller_1.isNonEvmChainId)(txHistory[bridgeTxMetaId].quote.srcChainId)) {
444
- // throw new Error(`Src tx hash not found for non-EVM chain: ${srcTxHash}`);
458
+ if (srcTxHash) {
445
459
  return srcTxHash;
446
460
  }
447
- // Update history with TransactionController's hash if it has been updated
461
+ // Look up in TransactionController if txMeta has been updated with the srcTxHash
448
462
  const txMeta = (0, transaction_1.getTransactionMetaById)(this.messenger, bridgeTxMetaId);
449
- if (!txMeta) {
450
- return undefined;
451
- }
452
- // Wait for finalized status before updating the history item
453
- const localTxHash = [
454
- transaction_controller_1.TransactionStatus.confirmed,
455
- transaction_controller_1.TransactionStatus.dropped,
456
- transaction_controller_1.TransactionStatus.rejected,
457
- transaction_controller_1.TransactionStatus.failed,
458
- ].includes(txMeta.status)
459
- ? txMeta.hash
460
- : undefined;
461
- __classPrivateFieldGet(this, _BridgeStatusController_updateHistoryItem, "f").call(this, {
462
- historyKey: bridgeTxMetaId,
463
- txHash: localTxHash,
464
- });
465
- return localTxHash;
463
+ return txMeta?.hash;
466
464
  });
467
- _BridgeStatusController_updateHistoryItem.set(this, ({ historyKey, status, txHash, attempts, }) => {
468
- if (!historyKey) {
465
+ _BridgeStatusController_updateSrcTxHash.set(this, (bridgeTxMetaId, srcTxHash) => {
466
+ const { txHistory } = this.state;
467
+ if (txHistory[bridgeTxMetaId].status.srcChain.txHash) {
469
468
  return;
470
469
  }
471
- this.update((currentState) => {
472
- if (status) {
473
- currentState.txHistory[historyKey].status.status = status;
474
- }
475
- if (txHash) {
476
- currentState.txHistory[historyKey].status.srcChain.txHash = txHash;
477
- }
478
- if (attempts) {
479
- currentState.txHistory[historyKey].attempts = attempts;
480
- }
481
- });
482
- });
483
- _BridgeStatusController_deleteHistoryItem.set(this, (historyKey) => {
484
- this.update((currentState) => {
485
- delete currentState.txHistory[historyKey];
470
+ this.update((state) => {
471
+ state.txHistory[bridgeTxMetaId].status.srcChain.txHash = srcTxHash;
486
472
  });
487
473
  });
488
474
  // Wipes the bridge status for the given address and chainId
@@ -498,7 +484,6 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
498
484
  const pollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[sourceTxMetaId];
499
485
  if (pollingToken) {
500
486
  this.stopPollingByPollingToken(__classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[sourceTxMetaId]);
501
- delete __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[sourceTxMetaId];
502
487
  }
503
488
  });
504
489
  this.update((state) => {
@@ -665,7 +650,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
665
650
  const actionId = (0, transaction_1.generateActionId)().toString();
666
651
  // Add pre-submission history keyed by actionId
667
652
  // This ensures we have quote data available if transaction fails during submission
668
- const historyKey = __classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, {
653
+ __classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, {
669
654
  accountAddress: selectedAccount.address,
670
655
  quoteResponse,
671
656
  slippagePercentage: 0,
@@ -692,7 +677,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
692
677
  actionId,
693
678
  });
694
679
  // On success, rekey from actionId to txMeta.id and update srcTxHash
695
- __classPrivateFieldGet(this, _BridgeStatusController_rekeyHistoryItem, "f").call(this, historyKey, tradeTxMeta);
680
+ __classPrivateFieldGet(this, _BridgeStatusController_rekeyHistoryItem, "f").call(this, actionId, tradeTxMeta);
696
681
  return tradeTxMeta;
697
682
  });
698
683
  }
@@ -712,12 +697,11 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
712
697
  !isStxEnabledOnClient &&
713
698
  !quoteResponse.quote.gasIncluded7702 &&
714
699
  !isDelegatedAccount;
715
- let historyKey = txMeta.id;
716
700
  if (!isNonBatchEvm) {
717
701
  // Add swap or bridge tx to history
718
- historyKey = __classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, {
702
+ __classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, {
719
703
  accountAddress: selectedAccount.address,
720
- 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
721
705
  quoteResponse,
722
706
  slippagePercentage: 0, // TODO include slippage provided by quote if using dynamic slippage, or slippage from quote request
723
707
  isStxEnabled: isStxEnabledOnClient,
@@ -730,10 +714,10 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
730
714
  }
731
715
  if ((0, bridge_controller_1.isNonEvmChainId)(quoteResponse.quote.srcChainId)) {
732
716
  // Start polling for bridge tx status
733
- __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, historyKey);
717
+ __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, txMeta.id);
734
718
  // Track non-EVM Swap completed event
735
719
  if (!(isBridgeTx || isTronTx)) {
736
- __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);
737
721
  }
738
722
  }
739
723
  }
@@ -832,14 +816,15 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
832
816
  };
833
817
  // Record in bridge history with actual transaction metadata
834
818
  try {
819
+ // Use orderId as the history key for intent transactions
820
+ const bridgeHistoryKey = orderUid;
835
821
  // Create a bridge transaction metadata that includes the original txId
836
822
  const bridgeTxMetaForHistory = {
837
823
  ...syntheticMeta,
838
- id: orderUid,
824
+ id: bridgeHistoryKey,
839
825
  originalTransactionId: syntheticMeta.id, // Keep original txId for TransactionController updates
840
826
  };
841
- // Use orderId as the history key for intent transactions
842
- const historyKey = __classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, {
827
+ __classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, {
843
828
  accountAddress,
844
829
  bridgeTxMeta: bridgeTxMetaForHistory,
845
830
  quoteResponse,
@@ -852,7 +837,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
852
837
  activeAbTests,
853
838
  });
854
839
  // Start polling using the orderId key to route to intent manager
855
- __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, historyKey);
840
+ __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, bridgeHistoryKey);
856
841
  }
857
842
  catch (error) {
858
843
  console.error('📝 [submitIntent] Failed to add to bridge history', error);
@@ -868,13 +853,6 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
868
853
  throw error;
869
854
  }
870
855
  };
871
- _BridgeStatusController_trackPollingStatusUpdatedEvent.set(this, (historyKey, pollingStatus) => {
872
- // Track polling status updated event
873
- const historyItem = this.state.txHistory[historyKey];
874
- if (historyItem && !historyItem.featureId) {
875
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.PollingStatusUpdated, historyKey, (0, metrics_1.getPollingStatusUpdatedProperties)(this.messenger, pollingStatus, historyItem));
876
- }
877
- });
878
856
  /**
879
857
  * Tracks post-submission events for a cross-chain swap based on the history item
880
858
  *
@@ -982,55 +960,15 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
982
960
  this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
983
961
  // Set interval
984
962
  this.setIntervalLength(constants_1.REFRESH_INTERVAL_MS);
985
- this.messenger.subscribe('TransactionController:transactionStatusUpdated', ({ txMeta, historyKey, historyItem }) => {
986
- if (!txMeta) {
987
- console.error('======TransactionController:transactionStatusUpdated NOT FOUND');
988
- return;
989
- }
990
- const { type, hash, status, id, actionId, batchId } = txMeta;
991
- console.error('======TransactionController:transactionStatusUpdated', {
992
- type,
993
- hash,
994
- status,
995
- id,
996
- actionId,
997
- batchId,
998
- });
999
- // Allow event publishing if the txMeta is a swap/bridge OR if the
1000
- // corresponding history item exists
1001
- const isSwapOrBridgeTransaction = type &&
1002
- [
1003
- transaction_controller_1.TransactionType.swap,
1004
- transaction_controller_1.TransactionType.bridge,
1005
- transaction_controller_1.TransactionType.swapApproval,
1006
- transaction_controller_1.TransactionType.bridgeApproval,
1007
- ].includes(type);
1008
- const isApprovalConfirmation = txMeta.id === historyItem?.approvalTxId &&
1009
- status === transaction_controller_1.TransactionStatus.confirmed;
1010
- if ((!isSwapOrBridgeTransaction && !historyKey && !historyItem) ||
1011
- isApprovalConfirmation) {
1012
- console.error('======approval tx confirmed');
1013
- 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);
1014
968
  }
1015
- switch (status) {
1016
- case transaction_controller_1.TransactionStatus.confirmed:
1017
- __classPrivateFieldGet(this, _BridgeStatusController_onTransactionConfirmed, "f").call(this, { txMeta, historyKey });
1018
- break;
1019
- case transaction_controller_1.TransactionStatus.failed:
1020
- case transaction_controller_1.TransactionStatus.dropped:
1021
- case transaction_controller_1.TransactionStatus.rejected:
1022
- __classPrivateFieldGet(this, _BridgeStatusController_onTransactionFailed, "f").call(this, { txMeta, historyKey });
1023
- break;
1024
- default:
1025
- break;
969
+ if (type === transaction_controller_1.TransactionType.bridge && !(0, bridge_controller_1.isNonEvmChainId)(chainId)) {
970
+ __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, txMetaId);
1026
971
  }
1027
- }, ({ transactionMeta }) => {
1028
- const entry = (0, history_1.getMatchingHistoryEntryForTxMeta)(this.state.txHistory, transactionMeta);
1029
- return {
1030
- historyKey: entry?.[0],
1031
- historyItem: entry?.[1],
1032
- txMeta: transactionMeta,
1033
- };
1034
972
  });
1035
973
  // If you close the extension, but keep the browser open, the polling continues
1036
974
  // If you close the browser, the polling stops
@@ -1039,5 +977,5 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
1039
977
  }
1040
978
  }
1041
979
  exports.BridgeStatusController = BridgeStatusController;
1042
- _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_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();
1043
981
  //# sourceMappingURL=bridge-status-controller.cjs.map