@metamask/bridge-status-controller 66.0.2 → 67.0.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.
Files changed (40) hide show
  1. package/CHANGELOG.md +26 -1
  2. package/dist/bridge-status-controller.cjs +31 -11
  3. package/dist/bridge-status-controller.cjs.map +1 -1
  4. package/dist/bridge-status-controller.d.cts +5 -2
  5. package/dist/bridge-status-controller.d.cts.map +1 -1
  6. package/dist/bridge-status-controller.d.mts +5 -2
  7. package/dist/bridge-status-controller.d.mts.map +1 -1
  8. package/dist/bridge-status-controller.mjs +32 -12
  9. package/dist/bridge-status-controller.mjs.map +1 -1
  10. package/dist/types.cjs.map +1 -1
  11. package/dist/types.d.cts +9 -2
  12. package/dist/types.d.cts.map +1 -1
  13. package/dist/types.d.mts +9 -2
  14. package/dist/types.d.mts.map +1 -1
  15. package/dist/types.mjs.map +1 -1
  16. package/dist/utils/bridge-status.cjs +8 -12
  17. package/dist/utils/bridge-status.cjs.map +1 -1
  18. package/dist/utils/bridge-status.d.cts +1 -4
  19. package/dist/utils/bridge-status.d.cts.map +1 -1
  20. package/dist/utils/bridge-status.d.mts +1 -4
  21. package/dist/utils/bridge-status.d.mts.map +1 -1
  22. package/dist/utils/bridge-status.mjs +7 -10
  23. package/dist/utils/bridge-status.mjs.map +1 -1
  24. package/dist/utils/intent-api.cjs +4 -5
  25. package/dist/utils/intent-api.cjs.map +1 -1
  26. package/dist/utils/intent-api.d.cts +4 -4
  27. package/dist/utils/intent-api.d.cts.map +1 -1
  28. package/dist/utils/intent-api.d.mts +4 -4
  29. package/dist/utils/intent-api.d.mts.map +1 -1
  30. package/dist/utils/intent-api.mjs +5 -6
  31. package/dist/utils/intent-api.mjs.map +1 -1
  32. package/dist/utils/metrics.cjs +4 -2
  33. package/dist/utils/metrics.cjs.map +1 -1
  34. package/dist/utils/metrics.d.cts +4 -2
  35. package/dist/utils/metrics.d.cts.map +1 -1
  36. package/dist/utils/metrics.d.mts +4 -2
  37. package/dist/utils/metrics.d.mts.map +1 -1
  38. package/dist/utils/metrics.mjs +5 -3
  39. package/dist/utils/metrics.mjs.map +1 -1
  40. package/package.json +3 -2
@@ -9,8 +9,8 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _BridgeStatusController_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";
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_getJwt, _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, 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
@@ -381,7 +382,7 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
381
382
  if (isIntent) {
382
383
  const { srcChainId } = historyItem.quote;
383
384
  const intentApi = new IntentApiImpl(__classPrivateFieldGet(this, _BridgeStatusController_config, "f").customBridgeApiBaseUrl, __classPrivateFieldGet(this, _BridgeStatusController_fetchFn, "f"));
384
- const intentOrder = await intentApi.getOrderStatus(bridgeTxMetaId, historyItem.quote.intent?.protocol ?? '', srcChainId.toString(), __classPrivateFieldGet(this, _BridgeStatusController_clientId, "f"));
385
+ const intentOrder = await intentApi.getOrderStatus(bridgeTxMetaId, historyItem.quote.intent?.protocol ?? '', srcChainId.toString(), __classPrivateFieldGet(this, _BridgeStatusController_clientId, "f"), await __classPrivateFieldGet(this, _BridgeStatusController_getJwt, "f").call(this));
385
386
  intentOrderStatus = intentOrder.status;
386
387
  intentTranslation = translateIntentOrderToBridgeStatus(intentOrder, srcChainId, historyItem.status.srcChain.txHash);
387
388
  status = intentTranslation.status;
@@ -396,13 +397,14 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
396
397
  }
397
398
  __classPrivateFieldGet(this, _BridgeStatusController_updateSrcTxHash, "f").call(this, bridgeTxMetaId, srcTxHash);
398
399
  const statusRequest = getStatusRequestWithSrcTxHash(historyItem.quote, srcTxHash);
399
- const response = await fetchBridgeTxStatus(statusRequest, __classPrivateFieldGet(this, _BridgeStatusController_clientId, "f"), __classPrivateFieldGet(this, _BridgeStatusController_fetchFn, "f"), __classPrivateFieldGet(this, _BridgeStatusController_config, "f").customBridgeApiBaseUrl);
400
+ const response = await fetchBridgeTxStatus(statusRequest, __classPrivateFieldGet(this, _BridgeStatusController_clientId, "f"), await __classPrivateFieldGet(this, _BridgeStatusController_getJwt, "f").call(this), __classPrivateFieldGet(this, _BridgeStatusController_fetchFn, "f"), __classPrivateFieldGet(this, _BridgeStatusController_config, "f").customBridgeApiBaseUrl);
400
401
  status = response.status;
401
402
  validationFailures = response.validationFailures;
402
403
  }
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
  }
@@ -451,6 +453,16 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
451
453
  __classPrivateFieldGet(this, _BridgeStatusController_handleFetchFailure, "f").call(this, bridgeTxMetaId);
452
454
  }
453
455
  });
456
+ _BridgeStatusController_getJwt.set(this, async () => {
457
+ try {
458
+ const token = await this.messenger.call('AuthenticationController:getBearerToken');
459
+ return token;
460
+ }
461
+ catch (error) {
462
+ console.error('Error getting JWT token for bridge-api request', error);
463
+ return undefined;
464
+ }
465
+ });
454
466
  _BridgeStatusController_getSrcTxHash.set(this, (bridgeTxMetaId) => {
455
467
  const { txHistory } = this.state;
456
468
  // Prefer the srcTxHash from bridgeStatusState so we don't have to l ook up in TransactionController
@@ -698,9 +710,10 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
698
710
  * @param quoteResponse - The quote response
699
711
  * @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension
700
712
  * @param quotesReceivedContext - The context for the QuotesReceived event
713
+ * @param location - The entry point from which the user initiated the swap or bridge (e.g. Main View, Token View, Trending Explore)
701
714
  * @returns The transaction meta
702
715
  */
703
- this.submitTx = async (accountAddress, quoteResponse, isStxEnabledOnClient, quotesReceivedContext) => {
716
+ this.submitTx = async (accountAddress, quoteResponse, isStxEnabledOnClient, quotesReceivedContext, location = MetaMetricsSwapsEventSource.MainView) => {
704
717
  this.messenger.call('BridgeController:stopPollingForQuotes', AbortReason.TransactionSubmitted,
705
718
  // If trade is submitted before all quotes are loaded, the QuotesReceived event is published
706
719
  // 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 +723,7 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
710
723
  throw new Error('Failed to submit cross-chain swap transaction: undefined multichain account');
711
724
  }
712
725
  const isHardwareAccount = isHardwareWallet(selectedAccount);
713
- const preConfirmationProperties = getPreConfirmationPropertiesFromQuote(quoteResponse, isStxEnabledOnClient, isHardwareAccount);
726
+ const preConfirmationProperties = getPreConfirmationPropertiesFromQuote(quoteResponse, isStxEnabledOnClient, isHardwareAccount, location);
714
727
  // Emit Submitted event after submit button is clicked
715
728
  !quoteResponse.featureId &&
716
729
  __classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, UnifiedSwapBridgeEventName.Submitted, undefined, preConfirmationProperties);
@@ -831,6 +844,7 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
831
844
  isStxEnabled: isStxEnabledOnClient,
832
845
  startTime,
833
846
  approvalTxId,
847
+ location,
834
848
  }, actionId);
835
849
  // Pass txFee when gasIncluded is true to use the quote's gas fees
836
850
  // instead of re-estimating (which would fail for max native token swaps)
@@ -870,6 +884,7 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
870
884
  isStxEnabled: isStxEnabledOnClient,
871
885
  startTime,
872
886
  approvalTxId,
887
+ location,
873
888
  });
874
889
  }
875
890
  if (isNonEvmChainId(quoteResponse.quote.srcChainId)) {
@@ -894,15 +909,16 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
894
909
  * @param params.quoteResponse - Quote carrying intent data
895
910
  * @param params.signature - Hex signature produced by eth_signTypedData_v4
896
911
  * @param params.accountAddress - The EOA submitting the order
912
+ * @param params.location - The entry point from which the user initiated the swap or bridge
897
913
  * @returns A lightweight TransactionMeta-like object for history linking
898
914
  */
899
915
  this.submitIntent = async (params) => {
900
- const { quoteResponse, signature, accountAddress } = params;
916
+ const { quoteResponse, signature, accountAddress, location } = params;
901
917
  this.messenger.call('BridgeController:stopPollingForQuotes', AbortReason.TransactionSubmitted);
902
918
  // Build pre-confirmation properties for error tracking parity with submitTx
903
919
  const account = __classPrivateFieldGet(this, _BridgeStatusController_instances, "m", _BridgeStatusController_getMultichainSelectedAccount).call(this, accountAddress);
904
920
  const isHardwareAccount = Boolean(account) && isHardwareWallet(account);
905
- const preConfirmationProperties = getPreConfirmationPropertiesFromQuote(quoteResponse, false, isHardwareAccount);
921
+ const preConfirmationProperties = getPreConfirmationPropertiesFromQuote(quoteResponse, false, isHardwareAccount, location);
906
922
  try {
907
923
  const intent = getIntentFromQuote(quoteResponse);
908
924
  // If backend provided an approval tx for this intent quote, submit it first (on-chain),
@@ -930,7 +946,7 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
930
946
  aggregatorId: intent.protocol,
931
947
  };
932
948
  const intentApi = new IntentApiImpl(__classPrivateFieldGet(this, _BridgeStatusController_config, "f").customBridgeApiBaseUrl, __classPrivateFieldGet(this, _BridgeStatusController_fetchFn, "f"));
933
- const intentOrder = await intentApi.submitIntent(submissionParams, __classPrivateFieldGet(this, _BridgeStatusController_clientId, "f"));
949
+ const intentOrder = await intentApi.submitIntent(submissionParams, __classPrivateFieldGet(this, _BridgeStatusController_clientId, "f"), await __classPrivateFieldGet(this, _BridgeStatusController_getJwt, "f").call(this));
934
950
  const orderUid = intentOrder.id;
935
951
  // Determine transaction type: swap for same-chain, bridge for cross-chain
936
952
  const isCrossChainTx = isCrossChain(quoteResponse.quote.srcChainId, quoteResponse.quote.destChainId);
@@ -997,6 +1013,7 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
997
1013
  isStxEnabled: false,
998
1014
  approvalTxId,
999
1015
  startTime,
1016
+ location,
1000
1017
  });
1001
1018
  // Start polling using the orderId key to route to intent manager
1002
1019
  __classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, bridgeHistoryKey);
@@ -1025,6 +1042,9 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
1025
1042
  _BridgeStatusController_trackUnifiedSwapBridgeEvent.set(this, (eventName, txMetaId, eventProperties) => {
1026
1043
  const baseProperties = {
1027
1044
  action_type: MetricsActionType.SWAPBRIDGE_V1,
1045
+ location: eventProperties?.location ??
1046
+ (txMetaId ? this.state.txHistory?.[txMetaId]?.location : undefined) ??
1047
+ MetaMetricsSwapsEventSource.MainView,
1028
1048
  ...(eventProperties ?? {}),
1029
1049
  };
1030
1050
  // This will publish events for PERPS dropped tx failures as well
@@ -1034,7 +1054,7 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
1034
1054
  }
1035
1055
  const historyItem = this.state.txHistory[txMetaId];
1036
1056
  if (!historyItem) {
1037
- this.messenger.call('BridgeController:trackUnifiedSwapBridgeEvent', eventName, eventProperties ?? {});
1057
+ this.messenger.call('BridgeController:trackUnifiedSwapBridgeEvent', eventName, baseProperties);
1038
1058
  return;
1039
1059
  }
1040
1060
  const requestParamProperties = getRequestParamFromHistory(historyItem);
@@ -1138,7 +1158,7 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
1138
1158
  __classPrivateFieldGet(this, _BridgeStatusController_restartPollingForIncompleteHistoryItems, "f").call(this);
1139
1159
  }
1140
1160
  }
1141
- _BridgeStatusController_pollingTokensByTxMetaId = new WeakMap(), _BridgeStatusController_intentStatusManager = new WeakMap(), _BridgeStatusController_clientId = new WeakMap(), _BridgeStatusController_fetchFn = new WeakMap(), _BridgeStatusController_config = new WeakMap(), _BridgeStatusController_addTransactionFn = new WeakMap(), _BridgeStatusController_addTransactionBatchFn = new WeakMap(), _BridgeStatusController_updateTransactionFn = new WeakMap(), _BridgeStatusController_estimateGasFeeFn = new WeakMap(), _BridgeStatusController_trace = new WeakMap(), _BridgeStatusController_markTxAsFailed = new WeakMap(), _BridgeStatusController_restartPollingForIncompleteHistoryItems = new WeakMap(), _BridgeStatusController_addTxToHistory = new WeakMap(), _BridgeStatusController_rekeyHistoryItem = new WeakMap(), _BridgeStatusController_startPollingForTxId = new WeakMap(), _BridgeStatusController_shouldPollHistoryItem = new WeakMap(), _BridgeStatusController_handleFetchFailure = new WeakMap(), _BridgeStatusController_fetchBridgeTxStatus = new WeakMap(), _BridgeStatusController_getSrcTxHash = new WeakMap(), _BridgeStatusController_updateSrcTxHash = new WeakMap(), _BridgeStatusController_wipeBridgeStatusByChainId = new WeakMap(), _BridgeStatusController_handleNonEvmTx = new WeakMap(), _BridgeStatusController_waitForHashAndReturnFinalTxMeta = new WeakMap(), _BridgeStatusController_waitForTxConfirmation = new WeakMap(), _BridgeStatusController_handleApprovalTx = new WeakMap(), _BridgeStatusController_handleEvmTransaction = new WeakMap(), _BridgeStatusController_handleUSDTAllowanceReset = new WeakMap(), _BridgeStatusController_calculateGasFees = new WeakMap(), _BridgeStatusController_handleEvmTransactionBatch = new WeakMap(), _BridgeStatusController_trackUnifiedSwapBridgeEvent = new WeakMap(), _BridgeStatusController_instances = new WeakSet(), _BridgeStatusController_getMultichainSelectedAccount = function _BridgeStatusController_getMultichainSelectedAccount(accountAddress) {
1161
+ _BridgeStatusController_pollingTokensByTxMetaId = new WeakMap(), _BridgeStatusController_intentStatusManager = new WeakMap(), _BridgeStatusController_clientId = new WeakMap(), _BridgeStatusController_fetchFn = new WeakMap(), _BridgeStatusController_config = new WeakMap(), _BridgeStatusController_addTransactionFn = new WeakMap(), _BridgeStatusController_addTransactionBatchFn = new WeakMap(), _BridgeStatusController_updateTransactionFn = new WeakMap(), _BridgeStatusController_estimateGasFeeFn = new WeakMap(), _BridgeStatusController_trace = new WeakMap(), _BridgeStatusController_markTxAsFailed = new WeakMap(), _BridgeStatusController_restartPollingForIncompleteHistoryItems = new WeakMap(), _BridgeStatusController_addTxToHistory = new WeakMap(), _BridgeStatusController_rekeyHistoryItem = new WeakMap(), _BridgeStatusController_startPollingForTxId = new WeakMap(), _BridgeStatusController_shouldPollHistoryItem = new WeakMap(), _BridgeStatusController_handleFetchFailure = new WeakMap(), _BridgeStatusController_fetchBridgeTxStatus = new WeakMap(), _BridgeStatusController_getJwt = new WeakMap(), _BridgeStatusController_getSrcTxHash = new WeakMap(), _BridgeStatusController_updateSrcTxHash = new WeakMap(), _BridgeStatusController_wipeBridgeStatusByChainId = new WeakMap(), _BridgeStatusController_handleNonEvmTx = new WeakMap(), _BridgeStatusController_waitForHashAndReturnFinalTxMeta = new WeakMap(), _BridgeStatusController_waitForTxConfirmation = new WeakMap(), _BridgeStatusController_handleApprovalTx = new WeakMap(), _BridgeStatusController_handleEvmTransaction = new WeakMap(), _BridgeStatusController_handleUSDTAllowanceReset = new WeakMap(), _BridgeStatusController_calculateGasFees = new WeakMap(), _BridgeStatusController_handleEvmTransactionBatch = new WeakMap(), _BridgeStatusController_trackUnifiedSwapBridgeEvent = new WeakMap(), _BridgeStatusController_instances = new WeakSet(), _BridgeStatusController_getMultichainSelectedAccount = function _BridgeStatusController_getMultichainSelectedAccount(accountAddress) {
1142
1162
  return this.messenger.call('AccountsController:getAccountByAddress', accountAddress);
1143
1163
  };
1144
1164
  //# sourceMappingURL=bridge-status-controller.mjs.map