@metamask/bridge-status-controller 66.0.1 → 66.1.0

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.
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
12
  var _BridgeStatusController_instances, _BridgeStatusController_pollingTokensByTxMetaId, _BridgeStatusController_intentStatusManager, _BridgeStatusController_clientId, _BridgeStatusController_fetchFn, _BridgeStatusController_config, _BridgeStatusController_addTransactionFn, _BridgeStatusController_addTransactionBatchFn, _BridgeStatusController_updateTransactionFn, _BridgeStatusController_estimateGasFeeFn, _BridgeStatusController_trace, _BridgeStatusController_markTxAsFailed, _BridgeStatusController_restartPollingForIncompleteHistoryItems, _BridgeStatusController_addTxToHistory, _BridgeStatusController_rekeyHistoryItem, _BridgeStatusController_startPollingForTxId, _BridgeStatusController_shouldPollHistoryItem, _BridgeStatusController_getMultichainSelectedAccount, _BridgeStatusController_handleFetchFailure, _BridgeStatusController_fetchBridgeTxStatus, _BridgeStatusController_getSrcTxHash, _BridgeStatusController_updateSrcTxHash, _BridgeStatusController_wipeBridgeStatusByChainId, _BridgeStatusController_handleNonEvmTx, _BridgeStatusController_waitForHashAndReturnFinalTxMeta, _BridgeStatusController_waitForTxConfirmation, _BridgeStatusController_handleApprovalTx, _BridgeStatusController_handleEvmTransaction, _BridgeStatusController_handleUSDTAllowanceReset, _BridgeStatusController_calculateGasFees, _BridgeStatusController_handleEvmTransactionBatch, _BridgeStatusController_trackUnifiedSwapBridgeEvent;
13
- import { formatChainIdToHex, isNonEvmChainId, StatusTypes, UnifiedSwapBridgeEventName, formatChainIdToCaip, isCrossChain, isTronChainId, isEvmTxData, isHardwareWallet, MetricsActionType, isBitcoinTrade, isTronTrade, AbortReason, PollingStatus } from "@metamask/bridge-controller";
13
+ import { formatChainIdToHex, isNonEvmChainId, StatusTypes, UnifiedSwapBridgeEventName, formatChainIdToCaip, isCrossChain, isTronChainId, isEvmTxData, isHardwareWallet, MetricsActionType, MetaMetricsSwapsEventSource, isBitcoinTrade, isTronTrade, AbortReason, PollingStatus } from "@metamask/bridge-controller";
14
14
  import { toHex } from "@metamask/controller-utils";
15
15
  import { StaticIntervalPollingController } from "@metamask/polling-controller";
16
16
  import { TransactionStatus, TransactionType } from "@metamask/transaction-controller";
@@ -204,7 +204,7 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
204
204
  });
205
205
  });
206
206
  _BridgeStatusController_addTxToHistory.set(this, (startPollingForBridgeTxStatusArgs, actionId) => {
207
- const { bridgeTxMeta, statusRequest, quoteResponse, startTime, slippagePercentage, initialDestAssetBalance, targetContractAddress, approvalTxId, isStxEnabled, accountAddress: selectedAddress, } = startPollingForBridgeTxStatusArgs;
207
+ const { bridgeTxMeta, statusRequest, quoteResponse, startTime, slippagePercentage, initialDestAssetBalance, targetContractAddress, approvalTxId, isStxEnabled, location, accountAddress: selectedAddress, } = startPollingForBridgeTxStatusArgs;
208
208
  // Determine the key for this history item:
209
209
  // - For pre-submission (non-batch EVM): use actionId
210
210
  // - For post-submission or other cases: use bridgeTxMeta.id
@@ -244,6 +244,7 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
244
244
  approvalTxId,
245
245
  isStxEnabled: isStxEnabled ?? false,
246
246
  featureId: quoteResponse.featureId,
247
+ location,
247
248
  };
248
249
  this.update((state) => {
249
250
  // Use actionId as key for pre-submission, or txMeta.id for post-submission
@@ -403,6 +404,7 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
403
404
  if (validationFailures.length > 0) {
404
405
  __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, UnifiedSwapBridgeEventName.StatusValidationFailed, bridgeTxMetaId, {
405
406
  failures: validationFailures,
407
+ refresh_count: historyItem.attempts?.counter ?? 0,
406
408
  });
407
409
  throw new Error(`Bridge status validation failed: ${validationFailures.join(', ')}`);
408
410
  }
@@ -698,9 +700,10 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
698
700
  * @param quoteResponse - The quote response
699
701
  * @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension
700
702
  * @param quotesReceivedContext - The context for the QuotesReceived event
703
+ * @param location - The entry point from which the user initiated the swap or bridge (e.g. Main View, Token View, Trending Explore)
701
704
  * @returns The transaction meta
702
705
  */
703
- this.submitTx = async (accountAddress, quoteResponse, isStxEnabledOnClient, quotesReceivedContext) => {
706
+ this.submitTx = async (accountAddress, quoteResponse, isStxEnabledOnClient, quotesReceivedContext, location = MetaMetricsSwapsEventSource.MainView) => {
704
707
  this.messenger.call('BridgeController:stopPollingForQuotes', AbortReason.TransactionSubmitted,
705
708
  // If trade is submitted before all quotes are loaded, the QuotesReceived event is published
706
709
  // 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
@@ -710,7 +713,7 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
710
713
  throw new Error('Failed to submit cross-chain swap transaction: undefined multichain account');
711
714
  }
712
715
  const isHardwareAccount = isHardwareWallet(selectedAccount);
713
- const preConfirmationProperties = getPreConfirmationPropertiesFromQuote(quoteResponse, isStxEnabledOnClient, isHardwareAccount);
716
+ const preConfirmationProperties = getPreConfirmationPropertiesFromQuote(quoteResponse, isStxEnabledOnClient, isHardwareAccount, location);
714
717
  // Emit Submitted event after submit button is clicked
715
718
  !quoteResponse.featureId &&
716
719
  __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, UnifiedSwapBridgeEventName.Submitted, undefined, preConfirmationProperties);
@@ -831,6 +834,7 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
831
834
  isStxEnabled: isStxEnabledOnClient,
832
835
  startTime,
833
836
  approvalTxId,
837
+ location,
834
838
  }, actionId);
835
839
  // Pass txFee when gasIncluded is true to use the quote's gas fees
836
840
  // instead of re-estimating (which would fail for max native token swaps)
@@ -870,6 +874,7 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
870
874
  isStxEnabled: isStxEnabledOnClient,
871
875
  startTime,
872
876
  approvalTxId,
877
+ location,
873
878
  });
874
879
  }
875
880
  if (isNonEvmChainId(quoteResponse.quote.srcChainId)) {
@@ -894,15 +899,16 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
894
899
  * @param params.quoteResponse - Quote carrying intent data
895
900
  * @param params.signature - Hex signature produced by eth_signTypedData_v4
896
901
  * @param params.accountAddress - The EOA submitting the order
902
+ * @param params.location - The entry point from which the user initiated the swap or bridge
897
903
  * @returns A lightweight TransactionMeta-like object for history linking
898
904
  */
899
905
  this.submitIntent = async (params) => {
900
- const { quoteResponse, signature, accountAddress } = params;
906
+ const { quoteResponse, signature, accountAddress, location } = params;
901
907
  this.messenger.call('BridgeController:stopPollingForQuotes', AbortReason.TransactionSubmitted);
902
908
  // Build pre-confirmation properties for error tracking parity with submitTx
903
909
  const account = __classPrivateFieldGet(this, _BridgeStatusController_instances, "m", _BridgeStatusController_getMultichainSelectedAccount).call(this, accountAddress);
904
910
  const isHardwareAccount = Boolean(account) && isHardwareWallet(account);
905
- const preConfirmationProperties = getPreConfirmationPropertiesFromQuote(quoteResponse, false, isHardwareAccount);
911
+ const preConfirmationProperties = getPreConfirmationPropertiesFromQuote(quoteResponse, false, isHardwareAccount, location);
906
912
  try {
907
913
  const intent = getIntentFromQuote(quoteResponse);
908
914
  // If backend provided an approval tx for this intent quote, submit it first (on-chain),
@@ -997,6 +1003,7 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
997
1003
  isStxEnabled: false,
998
1004
  approvalTxId,
999
1005
  startTime,
1006
+ location,
1000
1007
  });
1001
1008
  // Start polling using the orderId key to route to intent manager
1002
1009
  __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, bridgeHistoryKey);
@@ -1025,6 +1032,9 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
1025
1032
  _BridgeStatusController_trackUnifiedSwapBridgeEvent.set(this, (eventName, txMetaId, eventProperties) => {
1026
1033
  const baseProperties = {
1027
1034
  action_type: MetricsActionType.SWAPBRIDGE_V1,
1035
+ location: eventProperties?.location ??
1036
+ (txMetaId ? this.state.txHistory?.[txMetaId]?.location : undefined) ??
1037
+ MetaMetricsSwapsEventSource.MainView,
1028
1038
  ...(eventProperties ?? {}),
1029
1039
  };
1030
1040
  // This will publish events for PERPS dropped tx failures as well
@@ -1034,7 +1044,7 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
1034
1044
  }
1035
1045
  const historyItem = this.state.txHistory[txMetaId];
1036
1046
  if (!historyItem) {
1037
- this.messenger.call('BridgeController:trackUnifiedSwapBridgeEvent', eventName, eventProperties ?? {});
1047
+ this.messenger.call('BridgeController:trackUnifiedSwapBridgeEvent', eventName, baseProperties);
1038
1048
  return;
1039
1049
  }
1040
1050
  const requestParamProperties = getRequestParamFromHistory(historyItem);