@metamask-previews/bridge-status-controller 63.0.0-preview-ecf10eb2 → 63.0.0-preview-a5935709

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
@@ -9,8 +9,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  ### Changed
11
11
 
12
- - Improve type safety by replacing tx data type assertions with type predicates ([#7228](https://github.com/MetaMask/core/pull/7228))
13
- - Submit `resetApproval` tx before the tx approval if it is included in the quoteResponse ([#7228](https://github.com/MetaMask/core/pull/7228))
14
12
  - Move peer dependencies for controller and service packages to direct dependencies ([#7209](https://github.com/MetaMask/core/pull/7209), [#7220](https://github.com/MetaMask/core/pull/7220), [#7236](https://github.com/MetaMask/core/pull/7236))
15
13
  - The dependencies moved are:
16
14
  - `@metamask/accounts-controller` (^35.0.0)
@@ -24,6 +22,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
24
22
  - Note, however, that the versions specified in the client's `package.json` always "win", and you are expected to keep them up to date so as not to break controller and service intercommunication.
25
23
  - Bump `@metamask/bridge-controller` from `^63.0.0` to `^63.1.0` ([#7238](https://github.com/MetaMask/core/pull/7238))
26
24
 
25
+ ### Removed
26
+
27
+ - Remove direct QuotesReceived event publishing to avoid race conditions that can happen when clients navigate and reset state. Update `submitTx` to accept quotesReceivedContext (replace isLoading/warnings) and propagate context to the BridgeController through the `stopPollingForQuotes call ([#7242](https://github.com/MetaMask/core/pull/7242))
28
+
27
29
  ## [63.0.0]
28
30
 
29
31
  ### Changed
@@ -14,7 +14,6 @@ var _BridgeStatusController_instances, _BridgeStatusController_pollingTokensByTx
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.BridgeStatusController = void 0;
16
16
  const bridge_controller_1 = require("@metamask/bridge-controller");
17
- const bridge_controller_2 = require("@metamask/bridge-controller");
18
17
  const controller_utils_1 = require("@metamask/controller-utils");
19
18
  const polling_controller_1 = require("@metamask/polling-controller");
20
19
  const transaction_controller_1 = require("@metamask/transaction-controller");
@@ -66,7 +65,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
66
65
  return;
67
66
  }
68
67
  this.update((statusState) => {
69
- statusState.txHistory[txHistoryKey].status.status = bridge_controller_2.StatusTypes.FAILED;
68
+ statusState.txHistory[txHistoryKey].status.status = bridge_controller_1.StatusTypes.FAILED;
70
69
  });
71
70
  });
72
71
  this.resetState = () => {
@@ -124,7 +123,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
124
123
  }
125
124
  });
126
125
  // Restart polling if it was stopped and this is a bridge transaction
127
- const isBridgeTx = (0, bridge_controller_2.isCrossChain)(historyItem.quote.srcChainId, historyItem.quote.destChainId);
126
+ const isBridgeTx = (0, bridge_controller_1.isCrossChain)(historyItem.quote.srcChainId, historyItem.quote.destChainId);
128
127
  if (isBridgeTx) {
129
128
  // Check if polling was stopped (no active polling token)
130
129
  const existingPollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[targetTxMetaId];
@@ -152,8 +151,8 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
152
151
  const { txHistory } = this.state;
153
152
  const historyItems = Object.values(txHistory);
154
153
  const incompleteHistoryItems = historyItems
155
- .filter((historyItem) => historyItem.status.status === bridge_controller_2.StatusTypes.PENDING ||
156
- historyItem.status.status === bridge_controller_2.StatusTypes.UNKNOWN)
154
+ .filter((historyItem) => historyItem.status.status === bridge_controller_1.StatusTypes.PENDING ||
155
+ historyItem.status.status === bridge_controller_1.StatusTypes.UNKNOWN)
157
156
  .filter((historyItem) => {
158
157
  // Check if we are already polling this tx, if so, skip restarting polling for that
159
158
  const pollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[historyItem.txMetaId];
@@ -161,7 +160,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
161
160
  })
162
161
  // Swap txs don't need to have their statuses polled
163
162
  .filter((historyItem) => {
164
- const isBridgeTx = (0, bridge_controller_2.isCrossChain)(historyItem.quote.srcChainId, historyItem.quote.destChainId);
163
+ const isBridgeTx = (0, bridge_controller_1.isCrossChain)(historyItem.quote.srcChainId, historyItem.quote.destChainId);
165
164
  return isBridgeTx;
166
165
  });
167
166
  incompleteHistoryItems.forEach((historyItem) => {
@@ -199,7 +198,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
199
198
  status: {
200
199
  // We always have a PENDING status when we start polling for a tx, don't need the Bridge API for that
201
200
  // Also we know the bare minimum fields for status at this point in time
202
- status: bridge_controller_2.StatusTypes.PENDING,
201
+ status: bridge_controller_1.StatusTypes.PENDING,
203
202
  srcChain: {
204
203
  chainId: statusRequest.srcChainId,
205
204
  txHash: statusRequest.srcTxHash,
@@ -226,7 +225,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
226
225
  return;
227
226
  }
228
227
  const { quote } = txHistoryItem;
229
- const isBridgeTx = (0, bridge_controller_2.isCrossChain)(quote.srcChainId, quote.destChainId);
228
+ const isBridgeTx = (0, bridge_controller_1.isCrossChain)(quote.srcChainId, quote.destChainId);
230
229
  if (isBridgeTx) {
231
230
  __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[txId] = this.startPolling({
232
231
  bridgeTxMetaId: txId,
@@ -302,7 +301,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
302
301
  const statusRequest = (0, bridge_status_1.getStatusRequestWithSrcTxHash)(historyItem.quote, srcTxHash);
303
302
  const { status, validationFailures } = await (0, bridge_status_1.fetchBridgeTxStatus)(statusRequest, __classPrivateFieldGet(this, _BridgeStatusController_clientId, "f"), __classPrivateFieldGet(this, _BridgeStatusController_fetchFn, "f"), __classPrivateFieldGet(this, _BridgeStatusController_config, "f").customBridgeApiBaseUrl);
304
303
  if (validationFailures.length > 0) {
305
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.StatusValidationFailed, bridgeTxMetaId, {
304
+ __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.StatusValidationFailed, bridgeTxMetaId, {
306
305
  failures: validationFailures,
307
306
  });
308
307
  throw new Error(`Bridge status validation failed: ${validationFailures.join(', ')}`);
@@ -310,8 +309,8 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
310
309
  const newBridgeHistoryItem = {
311
310
  ...historyItem,
312
311
  status,
313
- completionTime: status.status === bridge_controller_2.StatusTypes.COMPLETE ||
314
- status.status === bridge_controller_2.StatusTypes.FAILED
312
+ completionTime: status.status === bridge_controller_1.StatusTypes.COMPLETE ||
313
+ status.status === bridge_controller_1.StatusTypes.FAILED
315
314
  ? Date.now()
316
315
  : undefined, // TODO make this more accurate by looking up dest txHash block time
317
316
  attempts: undefined,
@@ -324,8 +323,8 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
324
323
  state.txHistory[bridgeTxMetaId] = newBridgeHistoryItem;
325
324
  });
326
325
  const pollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[bridgeTxMetaId];
327
- const isFinalStatus = status.status === bridge_controller_2.StatusTypes.COMPLETE ||
328
- status.status === bridge_controller_2.StatusTypes.FAILED;
326
+ const isFinalStatus = status.status === bridge_controller_1.StatusTypes.COMPLETE ||
327
+ status.status === bridge_controller_1.StatusTypes.FAILED;
329
328
  if (isFinalStatus && pollingToken) {
330
329
  this.stopPollingByPollingToken(pollingToken);
331
330
  delete __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[bridgeTxMetaId];
@@ -333,12 +332,12 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
333
332
  if (historyItem.featureId) {
334
333
  return;
335
334
  }
336
- if (status.status === bridge_controller_2.StatusTypes.COMPLETE) {
337
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Completed, bridgeTxMetaId);
335
+ if (status.status === bridge_controller_1.StatusTypes.COMPLETE) {
336
+ __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Completed, bridgeTxMetaId);
338
337
  this.messenger.publish('BridgeStatusController:destinationTransactionCompleted', historyItem.quote.destAsset.assetId);
339
338
  }
340
- if (status.status === bridge_controller_2.StatusTypes.FAILED) {
341
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Failed, bridgeTxMetaId);
339
+ if (status.status === bridge_controller_1.StatusTypes.FAILED) {
340
+ __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Failed, bridgeTxMetaId);
342
341
  }
343
342
  }
344
343
  }
@@ -434,10 +433,11 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
434
433
  }
435
434
  return finalTransactionMeta;
436
435
  });
437
- _BridgeStatusController_handleApprovalTx.set(this, async (isBridgeTx, srcChainId, approval, resetApproval, requireApproval) => {
436
+ _BridgeStatusController_handleApprovalTx.set(this, async (isBridgeTx, quoteResponse, requireApproval) => {
437
+ const { approval } = quoteResponse;
438
438
  if (approval) {
439
439
  const approveTx = async () => {
440
- await __classPrivateFieldGet(this, _BridgeStatusController_handleUSDTAllowanceReset, "f").call(this, resetApproval);
440
+ await __classPrivateFieldGet(this, _BridgeStatusController_handleUSDTAllowanceReset, "f").call(this, quoteResponse);
441
441
  const approvalTxMeta = await __classPrivateFieldGet(this, _BridgeStatusController_handleEvmTransaction, "f").call(this, {
442
442
  transactionType: isBridgeTx
443
443
  ? transaction_controller_1.TransactionType.bridgeApproval
@@ -445,7 +445,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
445
445
  trade: approval,
446
446
  requireApproval,
447
447
  });
448
- await (0, transaction_1.handleApprovalDelay)(srcChainId);
448
+ await (0, transaction_1.handleApprovalDelay)(quoteResponse);
449
449
  return approvalTxMeta;
450
450
  };
451
451
  return await __classPrivateFieldGet(this, _BridgeStatusController_trace, "f").call(this, {
@@ -453,7 +453,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
453
453
  ? constants_1.TraceName.BridgeTransactionApprovalCompleted
454
454
  : constants_1.TraceName.SwapTransactionApprovalCompleted,
455
455
  data: {
456
- srcChainId: (0, bridge_controller_2.formatChainIdToCaip)(srcChainId),
456
+ srcChainId: (0, bridge_controller_1.formatChainIdToCaip)(quoteResponse.quote.srcChainId),
457
457
  stxEnabled: false,
458
458
  },
459
459
  }, approveTx);
@@ -475,7 +475,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
475
475
  if (!selectedAccount) {
476
476
  throw new Error('Failed to submit cross-chain swap transaction: unknown account in trade data');
477
477
  }
478
- const hexChainId = (0, bridge_controller_2.formatChainIdToHex)(trade.chainId);
478
+ const hexChainId = (0, bridge_controller_1.formatChainIdToHex)(trade.chainId);
479
479
  const networkClientId = this.messenger.call('NetworkController:findNetworkClientIdByChainId', hexChainId);
480
480
  const requestOptions = {
481
481
  actionId,
@@ -497,7 +497,8 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
497
497
  const { result } = await __classPrivateFieldGet(this, _BridgeStatusController_addTransactionFn, "f").call(this, transactionParamsWithMaxGas, requestOptions);
498
498
  return await __classPrivateFieldGet(this, _BridgeStatusController_waitForHashAndReturnFinalTxMeta, "f").call(this, result);
499
499
  });
500
- _BridgeStatusController_handleUSDTAllowanceReset.set(this, async (resetApproval) => {
500
+ _BridgeStatusController_handleUSDTAllowanceReset.set(this, async (quoteResponse) => {
501
+ const resetApproval = await (0, transaction_1.getUSDTAllowanceResetTx)(this.messenger, quoteResponse);
501
502
  if (resetApproval) {
502
503
  await __classPrivateFieldGet(this, _BridgeStatusController_handleEvmTransaction, "f").call(this, {
503
504
  transactionType: transaction_controller_1.TransactionType.bridgeApproval,
@@ -565,51 +566,50 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
565
566
  * @param accountAddress - The address of the account to submit the transaction for
566
567
  * @param quoteResponse - The quote response
567
568
  * @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension
568
- * @param isLoading - Whether the trade is submitted before all quotes are loaded, publish QuotesReceived event if true
569
- * @param warnings - The warnings to publish with the QuotesReceived event
569
+ * @param quotesReceivedContext - The context for the QuotesReceived event
570
570
  * @returns The transaction meta
571
571
  */
572
- this.submitTx = async (accountAddress, quoteResponse, isStxEnabledOnClient, isLoading = false, warnings = []) => {
573
- // If trade is submitted before all quotes are loaded, publish QuotesReceived event
574
- if (isLoading) {
575
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.QuotesReceived, undefined, (0, bridge_controller_1.getQuotesReceivedProperties)(quoteResponse, warnings));
576
- }
577
- this.messenger.call('BridgeController:stopPollingForQuotes');
572
+ this.submitTx = async (accountAddress, quoteResponse, isStxEnabledOnClient, quotesReceivedContext) => {
573
+ this.messenger.call('BridgeController:stopPollingForQuotes', bridge_controller_1.AbortReason.TransactionSubmitted,
574
+ // If trade is submitted before all quotes are loaded, the QuotesReceived event is published
575
+ // If the trade has a featureId, it means it was submitted outside of the Unified Swap and Bridge experience, so no QuotesReceived event is published
576
+ quoteResponse.featureId ? undefined : quotesReceivedContext);
578
577
  const selectedAccount = __classPrivateFieldGet(this, _BridgeStatusController_instances, "m", _BridgeStatusController_getMultichainSelectedAccount).call(this, accountAddress);
579
578
  if (!selectedAccount) {
580
579
  throw new Error('Failed to submit cross-chain swap transaction: undefined multichain account');
581
580
  }
582
- const isHardwareAccount = (0, bridge_controller_2.isHardwareWallet)(selectedAccount);
581
+ const isHardwareAccount = (0, bridge_controller_1.isHardwareWallet)(selectedAccount);
583
582
  const preConfirmationProperties = (0, metrics_1.getPreConfirmationPropertiesFromQuote)(quoteResponse, isStxEnabledOnClient, isHardwareAccount);
584
583
  // Emit Submitted event after submit button is clicked
585
584
  !quoteResponse.featureId &&
586
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Submitted, undefined, preConfirmationProperties);
585
+ __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Submitted, undefined, preConfirmationProperties);
587
586
  let txMeta;
588
587
  let approvalTxId;
589
588
  const startTime = Date.now();
590
- const isBridgeTx = (0, bridge_controller_2.isCrossChain)(quoteResponse.quote.srcChainId, quoteResponse.quote.destChainId);
589
+ const isBridgeTx = (0, bridge_controller_1.isCrossChain)(quoteResponse.quote.srcChainId, quoteResponse.quote.destChainId);
591
590
  // Submit non-EVM tx (Solana, BTC, Tron)
592
- if ((0, bridge_controller_2.isNonEvmChainId)(quoteResponse.quote.srcChainId)) {
591
+ const isNonEvmTrade = (0, bridge_controller_1.isNonEvmChainId)(quoteResponse.quote.srcChainId) &&
592
+ (typeof quoteResponse.trade === 'string' ||
593
+ (0, bridge_controller_1.isBitcoinTrade)(quoteResponse.trade) ||
594
+ (0, bridge_controller_1.isTronTrade)(quoteResponse.trade));
595
+ if (isNonEvmTrade) {
593
596
  // Handle non-EVM approval if present (e.g., Tron token approvals)
594
- if (quoteResponse.approval && (0, bridge_controller_2.isTronTrade)(quoteResponse.approval)) {
597
+ if (quoteResponse.approval) {
595
598
  const approvalTxMeta = await __classPrivateFieldGet(this, _BridgeStatusController_trace, "f").call(this, {
596
599
  name: isBridgeTx
597
600
  ? constants_1.TraceName.BridgeTransactionApprovalCompleted
598
601
  : constants_1.TraceName.SwapTransactionApprovalCompleted,
599
602
  data: {
600
- srcChainId: (0, bridge_controller_2.formatChainIdToCaip)(quoteResponse.quote.srcChainId),
603
+ srcChainId: (0, bridge_controller_1.formatChainIdToCaip)(quoteResponse.quote.srcChainId),
601
604
  stxEnabled: false,
602
605
  },
603
606
  }, async () => {
604
607
  try {
605
- return quoteResponse.approval &&
606
- (0, bridge_controller_2.isTronTrade)(quoteResponse.approval)
607
- ? await __classPrivateFieldGet(this, _BridgeStatusController_handleNonEvmTx, "f").call(this, quoteResponse.approval, quoteResponse, selectedAccount)
608
- : undefined;
608
+ return await __classPrivateFieldGet(this, _BridgeStatusController_handleNonEvmTx, "f").call(this, quoteResponse.approval, quoteResponse, selectedAccount);
609
609
  }
610
610
  catch (error) {
611
611
  !quoteResponse.featureId &&
612
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Failed, undefined, {
612
+ __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Failed, undefined, {
613
613
  error_message: error?.message,
614
614
  ...preConfirmationProperties,
615
615
  });
@@ -618,28 +618,23 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
618
618
  });
619
619
  approvalTxId = approvalTxMeta?.id;
620
620
  // Add delay after approval similar to EVM flow
621
- await (0, transaction_1.handleApprovalDelay)(quoteResponse.quote.srcChainId);
621
+ await (0, transaction_1.handleApprovalDelay)(quoteResponse);
622
622
  }
623
623
  txMeta = await __classPrivateFieldGet(this, _BridgeStatusController_trace, "f").call(this, {
624
624
  name: isBridgeTx
625
625
  ? constants_1.TraceName.BridgeTransactionCompleted
626
626
  : constants_1.TraceName.SwapTransactionCompleted,
627
627
  data: {
628
- srcChainId: (0, bridge_controller_2.formatChainIdToCaip)(quoteResponse.quote.srcChainId),
628
+ srcChainId: (0, bridge_controller_1.formatChainIdToCaip)(quoteResponse.quote.srcChainId),
629
629
  stxEnabled: false,
630
630
  },
631
631
  }, async () => {
632
632
  try {
633
- if (!((0, bridge_controller_2.isTronTrade)(quoteResponse.trade) ||
634
- (0, bridge_controller_2.isBitcoinTrade)(quoteResponse.trade) ||
635
- typeof quoteResponse.trade === 'string')) {
636
- throw new Error('Failed to submit cross-chain swap transaction: trade is not a non-EVM transaction');
637
- }
638
633
  return await __classPrivateFieldGet(this, _BridgeStatusController_handleNonEvmTx, "f").call(this, quoteResponse.trade, quoteResponse, selectedAccount);
639
634
  }
640
635
  catch (error) {
641
636
  !quoteResponse.featureId &&
642
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Failed, txMeta?.id, {
637
+ __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Failed, txMeta?.id, {
643
638
  error_message: error?.message,
644
639
  ...preConfirmationProperties,
645
640
  });
@@ -658,20 +653,15 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
658
653
  ? constants_1.TraceName.BridgeTransactionCompleted
659
654
  : constants_1.TraceName.SwapTransactionCompleted,
660
655
  data: {
661
- srcChainId: (0, bridge_controller_2.formatChainIdToCaip)(quoteResponse.quote.srcChainId),
656
+ srcChainId: (0, bridge_controller_1.formatChainIdToCaip)(quoteResponse.quote.srcChainId),
662
657
  stxEnabled: isStxEnabledOnClient,
663
658
  },
664
659
  }, async () => {
665
- if (!(0, bridge_controller_1.isEvmTxData)(quoteResponse.trade)) {
666
- throw new Error('Failed to submit cross-chain swap transaction: trade is not an EVM transaction');
667
- }
668
660
  if (isStxEnabledOnClient || quoteResponse.quote.gasIncluded7702) {
669
661
  const { tradeMeta, approvalMeta } = await __classPrivateFieldGet(this, _BridgeStatusController_handleEvmTransactionBatch, "f").call(this, {
670
662
  isBridgeTx,
671
- resetApproval: quoteResponse.resetApproval,
672
- approval: quoteResponse.approval && (0, bridge_controller_1.isEvmTxData)(quoteResponse.approval)
673
- ? quoteResponse.approval
674
- : undefined,
663
+ resetApproval: (await (0, transaction_1.getUSDTAllowanceResetTx)(this.messenger, quoteResponse)),
664
+ approval: quoteResponse.approval,
675
665
  trade: quoteResponse.trade,
676
666
  quoteResponse,
677
667
  requireApproval,
@@ -680,12 +670,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
680
670
  return tradeMeta;
681
671
  }
682
672
  // Set approval time and id if an approval tx is needed
683
- const approvalTxMeta = await __classPrivateFieldGet(this, _BridgeStatusController_handleApprovalTx, "f").call(this, isBridgeTx, quoteResponse.quote.srcChainId, quoteResponse.approval && (0, bridge_controller_1.isEvmTxData)(quoteResponse.approval)
684
- ? quoteResponse.approval
685
- : undefined, quoteResponse.resetApproval &&
686
- (0, bridge_controller_1.isEvmTxData)(quoteResponse.resetApproval)
687
- ? quoteResponse.resetApproval
688
- : undefined, requireApproval);
673
+ const approvalTxMeta = await __classPrivateFieldGet(this, _BridgeStatusController_handleApprovalTx, "f").call(this, isBridgeTx, quoteResponse, requireApproval);
689
674
  approvalTxId = approvalTxMeta?.id;
690
675
  await (0, transaction_1.handleMobileHardwareWalletDelay)(requireApproval);
691
676
  return await __classPrivateFieldGet(this, _BridgeStatusController_handleEvmTransaction, "f").call(this, {
@@ -712,12 +697,12 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
712
697
  startTime,
713
698
  approvalTxId,
714
699
  });
715
- if ((0, bridge_controller_2.isNonEvmChainId)(quoteResponse.quote.srcChainId)) {
700
+ if ((0, bridge_controller_1.isNonEvmChainId)(quoteResponse.quote.srcChainId)) {
716
701
  // Start polling for bridge tx status
717
702
  __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, txMeta.id);
718
703
  // Track non-EVM Swap completed event
719
704
  if (!isBridgeTx) {
720
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Completed, txMeta.id);
705
+ __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Completed, txMeta.id);
721
706
  }
722
707
  }
723
708
  }
@@ -735,7 +720,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
735
720
  */
736
721
  _BridgeStatusController_trackUnifiedSwapBridgeEvent.set(this, (eventName, txMetaId, eventProperties) => {
737
722
  const baseProperties = {
738
- action_type: bridge_controller_2.MetricsActionType.SWAPBRIDGE_V1,
723
+ action_type: bridge_controller_1.MetricsActionType.SWAPBRIDGE_V1,
739
724
  ...(eventProperties ?? {}),
740
725
  };
741
726
  // This will publish events for PERPS dropped tx failures as well
@@ -750,7 +735,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
750
735
  }
751
736
  const requestParamProperties = (0, metrics_1.getRequestParamFromHistory)(historyItem);
752
737
  // Always publish StatusValidationFailed event, regardless of featureId
753
- if (eventName === bridge_controller_2.UnifiedSwapBridgeEventName.StatusValidationFailed) {
738
+ if (eventName === bridge_controller_1.UnifiedSwapBridgeEventName.StatusValidationFailed) {
754
739
  const { chain_id_source, chain_id_destination, token_address_source, token_address_destination, } = requestParamProperties;
755
740
  this.messenger.call('BridgeController:trackUnifiedSwapBridgeEvent', eventName, {
756
741
  ...baseProperties,
@@ -818,16 +803,16 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
818
803
  __classPrivateFieldGet(this, _BridgeStatusController_markTxAsFailed, "f").call(this, transactionMeta);
819
804
  // Track failed event
820
805
  if (status !== transaction_controller_1.TransactionStatus.rejected) {
821
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Failed, id, (0, metrics_1.getEVMTxPropertiesFromTransactionMeta)(transactionMeta));
806
+ __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Failed, id, (0, metrics_1.getEVMTxPropertiesFromTransactionMeta)(transactionMeta));
822
807
  }
823
808
  }
824
809
  });
825
810
  this.messenger.subscribe('TransactionController:transactionConfirmed', (transactionMeta) => {
826
811
  const { type, id, chainId } = transactionMeta;
827
812
  if (type === transaction_controller_1.TransactionType.swap) {
828
- __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Completed, id);
813
+ __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Completed, id);
829
814
  }
830
- if (type === transaction_controller_1.TransactionType.bridge && !(0, bridge_controller_2.isNonEvmChainId)(chainId)) {
815
+ if (type === transaction_controller_1.TransactionType.bridge && !(0, bridge_controller_1.isNonEvmChainId)(chainId)) {
831
816
  __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, id);
832
817
  }
833
818
  });