@metamask/bridge-status-controller 70.0.5 → 71.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.
Files changed (98) hide show
  1. package/CHANGELOG.md +58 -8
  2. package/dist/bridge-status-controller-method-action-types.cjs +7 -0
  3. package/dist/bridge-status-controller-method-action-types.cjs.map +1 -0
  4. package/dist/bridge-status-controller-method-action-types.d.cts +38 -0
  5. package/dist/bridge-status-controller-method-action-types.d.cts.map +1 -0
  6. package/dist/bridge-status-controller-method-action-types.d.mts +38 -0
  7. package/dist/bridge-status-controller-method-action-types.d.mts.map +1 -0
  8. package/dist/bridge-status-controller-method-action-types.mjs +6 -0
  9. package/dist/bridge-status-controller-method-action-types.mjs.map +1 -0
  10. package/dist/bridge-status-controller.cjs +217 -123
  11. package/dist/bridge-status-controller.cjs.map +1 -1
  12. package/dist/bridge-status-controller.d.cts +4 -1
  13. package/dist/bridge-status-controller.d.cts.map +1 -1
  14. package/dist/bridge-status-controller.d.mts +4 -1
  15. package/dist/bridge-status-controller.d.mts.map +1 -1
  16. package/dist/bridge-status-controller.mjs +222 -128
  17. package/dist/bridge-status-controller.mjs.map +1 -1
  18. package/dist/constants.cjs +2 -1
  19. package/dist/constants.cjs.map +1 -1
  20. package/dist/constants.d.cts +1 -0
  21. package/dist/constants.d.cts.map +1 -1
  22. package/dist/constants.d.mts +1 -0
  23. package/dist/constants.d.mts.map +1 -1
  24. package/dist/constants.mjs +1 -0
  25. package/dist/constants.mjs.map +1 -1
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.cts +2 -1
  28. package/dist/index.d.cts.map +1 -1
  29. package/dist/index.d.mts +2 -1
  30. package/dist/index.d.mts.map +1 -1
  31. package/dist/index.mjs.map +1 -1
  32. package/dist/types.cjs +4 -0
  33. package/dist/types.cjs.map +1 -1
  34. package/dist/types.d.cts +21 -18
  35. package/dist/types.d.cts.map +1 -1
  36. package/dist/types.d.mts +21 -18
  37. package/dist/types.d.mts.map +1 -1
  38. package/dist/types.mjs +4 -0
  39. package/dist/types.mjs.map +1 -1
  40. package/dist/utils/accounts.d.cts +1 -1
  41. package/dist/utils/accounts.d.mts +1 -1
  42. package/dist/utils/bridge-status.cjs +49 -2
  43. package/dist/utils/bridge-status.cjs.map +1 -1
  44. package/dist/utils/bridge-status.d.cts +2 -1
  45. package/dist/utils/bridge-status.d.cts.map +1 -1
  46. package/dist/utils/bridge-status.d.mts +2 -1
  47. package/dist/utils/bridge-status.d.mts.map +1 -1
  48. package/dist/utils/bridge-status.mjs +48 -2
  49. package/dist/utils/bridge-status.mjs.map +1 -1
  50. package/dist/utils/feature-flags.cjs +12 -0
  51. package/dist/utils/feature-flags.cjs.map +1 -0
  52. package/dist/utils/feature-flags.d.cts +3 -0
  53. package/dist/utils/feature-flags.d.cts.map +1 -0
  54. package/dist/utils/feature-flags.d.mts +3 -0
  55. package/dist/utils/feature-flags.d.mts.map +1 -0
  56. package/dist/utils/feature-flags.mjs +8 -0
  57. package/dist/utils/feature-flags.mjs.map +1 -0
  58. package/dist/utils/history.cjs +48 -3
  59. package/dist/utils/history.cjs.map +1 -1
  60. package/dist/utils/history.d.cts +19 -1
  61. package/dist/utils/history.d.cts.map +1 -1
  62. package/dist/utils/history.d.mts +19 -1
  63. package/dist/utils/history.d.mts.map +1 -1
  64. package/dist/utils/history.mjs +45 -3
  65. package/dist/utils/history.mjs.map +1 -1
  66. package/dist/utils/intent-api.cjs.map +1 -1
  67. package/dist/utils/intent-api.d.cts +1 -1
  68. package/dist/utils/intent-api.d.cts.map +1 -1
  69. package/dist/utils/intent-api.d.mts +1 -1
  70. package/dist/utils/intent-api.d.mts.map +1 -1
  71. package/dist/utils/intent-api.mjs.map +1 -1
  72. package/dist/utils/metrics.cjs +45 -8
  73. package/dist/utils/metrics.cjs.map +1 -1
  74. package/dist/utils/metrics.d.cts +37 -6
  75. package/dist/utils/metrics.d.cts.map +1 -1
  76. package/dist/utils/metrics.d.mts +37 -6
  77. package/dist/utils/metrics.d.mts.map +1 -1
  78. package/dist/utils/metrics.mjs +44 -8
  79. package/dist/utils/metrics.mjs.map +1 -1
  80. package/dist/utils/network.cjs +7 -1
  81. package/dist/utils/network.cjs.map +1 -1
  82. package/dist/utils/network.d.cts +4 -2
  83. package/dist/utils/network.d.cts.map +1 -1
  84. package/dist/utils/network.d.mts +4 -2
  85. package/dist/utils/network.d.mts.map +1 -1
  86. package/dist/utils/network.mjs +5 -0
  87. package/dist/utils/network.mjs.map +1 -1
  88. package/dist/utils/transaction.cjs +10 -9
  89. package/dist/utils/transaction.cjs.map +1 -1
  90. package/dist/utils/transaction.d.cts +3 -0
  91. package/dist/utils/transaction.d.cts.map +1 -1
  92. package/dist/utils/transaction.d.mts +3 -0
  93. package/dist/utils/transaction.d.mts.map +1 -1
  94. package/dist/utils/transaction.mjs +8 -8
  95. package/dist/utils/transaction.mjs.map +1 -1
  96. package/dist/utils/validators.d.cts +2 -2
  97. package/dist/utils/validators.d.mts +2 -2
  98. package/package.json +22 -20
@@ -1 +1 @@
1
- {"version":3,"file":"intent-api.mjs","sourceRoot":"","sources":["../../src/utils/intent-api.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BridgeClientId,\n ChainId,\n getClientHeaders,\n Intent,\n QuoteResponse,\n StatusTypes,\n} from '@metamask/bridge-controller';\nimport { TransactionStatus } from '@metamask/transaction-controller';\n\nimport {\n IntentStatusResponse,\n IntentOrderStatus,\n validateIntentStatusResponse,\n} from './validators';\nimport type { FetchFunction, StatusResponse } from '../types';\n\nexport type IntentSubmissionParams = {\n srcChainId: ChainId;\n quoteId: string;\n signature: string;\n order: unknown;\n userAddress: string;\n aggregatorId: string;\n};\n\nexport type IntentApi = {\n getOrderStatus(\n orderId: string,\n aggregatorId: string,\n srcChainId: ChainId,\n clientId: BridgeClientId,\n ): Promise<IntentStatusResponse>;\n};\n\nexport type GetJwtFn = () => Promise<string | undefined>;\n\nexport class IntentApiImpl implements IntentApi {\n readonly #baseUrl: string;\n\n readonly #fetchFn: FetchFunction;\n\n readonly #getJwt: GetJwtFn;\n\n constructor(baseUrl: string, fetchFn: FetchFunction, getJwt: GetJwtFn) {\n this.#baseUrl = baseUrl;\n this.#fetchFn = fetchFn;\n this.#getJwt = getJwt;\n }\n\n async getOrderStatus(\n orderId: string,\n aggregatorId: string,\n srcChainId: ChainId,\n clientId: BridgeClientId,\n ): Promise<IntentStatusResponse> {\n const endpoint = `${this.#baseUrl}/getOrderStatus?orderId=${orderId}&aggregatorId=${encodeURIComponent(aggregatorId)}&srcChainId=${srcChainId}`;\n try {\n const jwt = await this.#getJwt();\n const response = await this.#fetchFn(endpoint, {\n method: 'GET',\n headers: getClientHeaders({ clientId, jwt }),\n });\n if (!validateIntentStatusResponse(response)) {\n throw new Error('Invalid getOrderStatus response');\n }\n return response;\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to get order status: ${error.message}`);\n }\n throw new Error('Failed to get order status');\n }\n }\n}\n\nexport type IntentBridgeStatus = {\n status: StatusResponse;\n txHash?: string;\n transactionStatus: TransactionStatus;\n};\n\nexport const translateIntentOrderToBridgeStatus = (\n intentOrder: IntentStatusResponse,\n srcChainId: number,\n fallbackTxHash?: string,\n): IntentBridgeStatus => {\n let statusType: StatusTypes;\n switch (intentOrder.status) {\n case IntentOrderStatus.CONFIRMED:\n case IntentOrderStatus.COMPLETED:\n statusType = StatusTypes.COMPLETE;\n break;\n case IntentOrderStatus.FAILED:\n case IntentOrderStatus.EXPIRED:\n case IntentOrderStatus.CANCELLED:\n statusType = StatusTypes.FAILED;\n break;\n case IntentOrderStatus.PENDING:\n statusType = StatusTypes.PENDING;\n break;\n case IntentOrderStatus.SUBMITTED:\n statusType = StatusTypes.SUBMITTED;\n break;\n default:\n statusType = StatusTypes.UNKNOWN;\n }\n\n const txHash = intentOrder.txHash ?? fallbackTxHash;\n const status: StatusResponse = {\n status: statusType,\n srcChain: {\n chainId: srcChainId,\n txHash,\n },\n };\n\n return {\n status,\n txHash,\n transactionStatus: mapIntentOrderStatusToTransactionStatus(\n intentOrder.status,\n ),\n };\n};\n\nexport function mapIntentOrderStatusToTransactionStatus(\n intentStatus: IntentOrderStatus,\n): TransactionStatus {\n switch (intentStatus) {\n case IntentOrderStatus.PENDING:\n case IntentOrderStatus.SUBMITTED:\n return TransactionStatus.submitted;\n case IntentOrderStatus.CONFIRMED:\n case IntentOrderStatus.COMPLETED:\n return TransactionStatus.confirmed;\n case IntentOrderStatus.FAILED:\n case IntentOrderStatus.EXPIRED:\n case IntentOrderStatus.CANCELLED:\n return TransactionStatus.failed;\n default:\n return TransactionStatus.submitted;\n }\n}\n\n/**\n * Extracts and validates the intent data from a quote response.\n *\n * @param quoteResponse - The quote response that may contain intent data\n * @returns The intent data from the quote\n * @throws Error if the quote does not contain intent data\n */\nexport function getIntentFromQuote(quoteResponse: QuoteResponse): Intent {\n const { intent } = quoteResponse.quote;\n if (!intent) {\n throw new Error('submitIntent: missing intent data');\n }\n return intent;\n}\n\nexport const postSubmitOrder = async ({\n params,\n clientId,\n jwt,\n fetchFn,\n bridgeApiBaseUrl,\n}: {\n params: IntentSubmissionParams;\n clientId: BridgeClientId;\n jwt: string | undefined;\n fetchFn: FetchFunction;\n bridgeApiBaseUrl: string;\n}): Promise<IntentStatusResponse> => {\n const endpoint = `${bridgeApiBaseUrl}/submitOrder`;\n try {\n const response = await fetchFn(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...getClientHeaders({ clientId, jwt }),\n },\n body: JSON.stringify(params),\n });\n if (!validateIntentStatusResponse(response)) {\n throw new Error('Invalid submitOrder response');\n }\n return response;\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to submit intent: ${error.message}`);\n }\n throw new Error('Failed to submit intent');\n }\n};\n"]}
1
+ {"version":3,"file":"intent-api.mjs","sourceRoot":"","sources":["../../src/utils/intent-api.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BridgeClientId,\n ChainId,\n getClientHeaders,\n Intent,\n QuoteResponse,\n StatusTypes,\n} from '@metamask/bridge-controller';\nimport { TransactionStatus } from '@metamask/transaction-controller';\n\nimport type { FetchFunction, StatusResponse } from '../types';\nimport {\n IntentStatusResponse,\n IntentOrderStatus,\n validateIntentStatusResponse,\n} from './validators';\n\nexport type IntentSubmissionParams = {\n srcChainId: ChainId;\n quoteId: string;\n signature: string;\n order: unknown;\n userAddress: string;\n aggregatorId: string;\n};\n\nexport type IntentApi = {\n getOrderStatus(\n orderId: string,\n aggregatorId: string,\n srcChainId: ChainId,\n clientId: BridgeClientId,\n ): Promise<IntentStatusResponse>;\n};\n\nexport type GetJwtFn = () => Promise<string | undefined>;\n\nexport class IntentApiImpl implements IntentApi {\n readonly #baseUrl: string;\n\n readonly #fetchFn: FetchFunction;\n\n readonly #getJwt: GetJwtFn;\n\n constructor(baseUrl: string, fetchFn: FetchFunction, getJwt: GetJwtFn) {\n this.#baseUrl = baseUrl;\n this.#fetchFn = fetchFn;\n this.#getJwt = getJwt;\n }\n\n async getOrderStatus(\n orderId: string,\n aggregatorId: string,\n srcChainId: ChainId,\n clientId: BridgeClientId,\n ): Promise<IntentStatusResponse> {\n const endpoint = `${this.#baseUrl}/getOrderStatus?orderId=${orderId}&aggregatorId=${encodeURIComponent(aggregatorId)}&srcChainId=${srcChainId}`;\n try {\n const jwt = await this.#getJwt();\n const response = await this.#fetchFn(endpoint, {\n method: 'GET',\n headers: getClientHeaders({ clientId, jwt }),\n });\n if (!validateIntentStatusResponse(response)) {\n throw new Error('Invalid getOrderStatus response');\n }\n return response;\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to get order status: ${error.message}`);\n }\n throw new Error('Failed to get order status');\n }\n }\n}\n\nexport type IntentBridgeStatus = {\n status: StatusResponse;\n txHash?: string;\n transactionStatus: TransactionStatus;\n};\n\nexport const translateIntentOrderToBridgeStatus = (\n intentOrder: IntentStatusResponse,\n srcChainId: number,\n fallbackTxHash?: string,\n): IntentBridgeStatus => {\n let statusType: StatusTypes;\n switch (intentOrder.status) {\n case IntentOrderStatus.CONFIRMED:\n case IntentOrderStatus.COMPLETED:\n statusType = StatusTypes.COMPLETE;\n break;\n case IntentOrderStatus.FAILED:\n case IntentOrderStatus.EXPIRED:\n case IntentOrderStatus.CANCELLED:\n statusType = StatusTypes.FAILED;\n break;\n case IntentOrderStatus.PENDING:\n statusType = StatusTypes.PENDING;\n break;\n case IntentOrderStatus.SUBMITTED:\n statusType = StatusTypes.SUBMITTED;\n break;\n default:\n statusType = StatusTypes.UNKNOWN;\n }\n\n const txHash = intentOrder.txHash ?? fallbackTxHash;\n const status: StatusResponse = {\n status: statusType,\n srcChain: {\n chainId: srcChainId,\n txHash,\n },\n };\n\n return {\n status,\n txHash,\n transactionStatus: mapIntentOrderStatusToTransactionStatus(\n intentOrder.status,\n ),\n };\n};\n\nexport function mapIntentOrderStatusToTransactionStatus(\n intentStatus: IntentOrderStatus,\n): TransactionStatus {\n switch (intentStatus) {\n case IntentOrderStatus.PENDING:\n case IntentOrderStatus.SUBMITTED:\n return TransactionStatus.submitted;\n case IntentOrderStatus.CONFIRMED:\n case IntentOrderStatus.COMPLETED:\n return TransactionStatus.confirmed;\n case IntentOrderStatus.FAILED:\n case IntentOrderStatus.EXPIRED:\n case IntentOrderStatus.CANCELLED:\n return TransactionStatus.failed;\n default:\n return TransactionStatus.submitted;\n }\n}\n\n/**\n * Extracts and validates the intent data from a quote response.\n *\n * @param quoteResponse - The quote response that may contain intent data\n * @returns The intent data from the quote\n * @throws Error if the quote does not contain intent data\n */\nexport function getIntentFromQuote(quoteResponse: QuoteResponse): Intent {\n const { intent } = quoteResponse.quote;\n if (!intent) {\n throw new Error('submitIntent: missing intent data');\n }\n return intent;\n}\n\nexport const postSubmitOrder = async ({\n params,\n clientId,\n jwt,\n fetchFn,\n bridgeApiBaseUrl,\n}: {\n params: IntentSubmissionParams;\n clientId: BridgeClientId;\n jwt: string | undefined;\n fetchFn: FetchFunction;\n bridgeApiBaseUrl: string;\n}): Promise<IntentStatusResponse> => {\n const endpoint = `${bridgeApiBaseUrl}/submitOrder`;\n try {\n const response = await fetchFn(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...getClientHeaders({ clientId, jwt }),\n },\n body: JSON.stringify(params),\n });\n if (!validateIntentStatusResponse(response)) {\n throw new Error('Invalid submitOrder response');\n }\n return response;\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to submit intent: ${error.message}`);\n }\n throw new Error('Failed to submit intent');\n }\n};\n"]}
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getEVMTxPropertiesFromTransactionMeta = exports.getRequestMetadataFromHistory = exports.getTradeDataFromHistory = exports.getPreConfirmationPropertiesFromQuote = exports.getPriceImpactFromQuote = exports.getTradeDataFromQuote = exports.getRequestParamFromHistory = exports.getFinalizedTxProperties = exports.getTxStatusesFromHistory = void 0;
3
+ exports.getPollingStatusUpdatedProperties = exports.getEVMTxPropertiesFromTransactionMeta = exports.getRequestMetadataFromHistory = exports.getTradeDataFromHistory = exports.getPreConfirmationPropertiesFromQuote = exports.getPriceImpactFromQuote = exports.getTradeDataFromQuote = exports.getRequestParamFromHistory = exports.getFinalizedTxProperties = exports.getTxStatusesFromHistory = void 0;
4
4
  const bridge_controller_1 = require("@metamask/bridge-controller");
5
5
  const transaction_controller_1 = require("@metamask/transaction-controller");
6
6
  const bignumber_js_1 = require("bignumber.js");
7
+ const accounts_1 = require("./accounts.cjs");
7
8
  const gas_1 = require("./gas.cjs");
8
9
  const swap_received_amount_1 = require("./swap-received-amount.cjs");
9
10
  const getTxStatusesFromHistory = ({ status, hasApprovalTx, approvalTxId, quote, }) => {
@@ -81,6 +82,7 @@ const getRequestParamFromHistory = (historyItem) => {
81
82
  chain_id_destination: (0, bridge_controller_1.formatChainIdToCaip)(historyItem.quote.destChainId),
82
83
  token_symbol_destination: historyItem.quote.destAsset.symbol,
83
84
  token_address_destination: historyItem.quote.destAsset.assetId,
85
+ token_security_type_destination: historyItem.tokenSecurityTypeDestination ?? null,
84
86
  };
85
87
  };
86
88
  exports.getRequestParamFromHistory = getRequestParamFromHistory;
@@ -105,22 +107,27 @@ exports.getPriceImpactFromQuote = getPriceImpactFromQuote;
105
107
  *
106
108
  * @param quoteResponse - The quote response
107
109
  * @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension
108
- * @param isHardwareAccount - whether the tx is submitted using a hardware wallet
110
+ * @param accountHardwareType - The hardware wallet type used to submit the tx, or null if not a hardware wallet
109
111
  * @param location - The entry point from which the user initiated the swap or bridge (e.g. Main View, Token View, Trending Explore)
110
112
  * @param abTests - Legacy A/B test context for `ab_tests` (backward compatibility)
111
113
  * @param activeAbTests - New A/B test context for `active_ab_tests` (migration target)
114
+ * @param tokenSecurityTypeDestination - The security classification of the destination token, supplied by the client (e.g. from token security/scanning data). Pass `null` when no security data is available.
112
115
  * @returns The properties for the pre-confirmation event
113
116
  */
114
- const getPreConfirmationPropertiesFromQuote = (quoteResponse, isStxEnabledOnClient, isHardwareAccount, location = bridge_controller_1.MetaMetricsSwapsEventSource.MainView, abTests, activeAbTests) => {
117
+ const getPreConfirmationPropertiesFromQuote = (quoteResponse, isStxEnabledOnClient, accountHardwareType, location = bridge_controller_1.MetaMetricsSwapsEventSource.MainView, abTests, activeAbTests, tokenSecurityTypeDestination) => {
115
118
  const { quote } = quoteResponse;
116
119
  return {
117
120
  ...(0, exports.getPriceImpactFromQuote)(quote),
118
121
  ...(0, exports.getTradeDataFromQuote)(quoteResponse),
119
122
  chain_id_source: (0, bridge_controller_1.formatChainIdToCaip)(quote.srcChainId),
120
123
  token_symbol_source: quote.srcAsset.symbol,
124
+ token_address_source: quote.srcAsset.assetId,
121
125
  chain_id_destination: (0, bridge_controller_1.formatChainIdToCaip)(quote.destChainId),
122
126
  token_symbol_destination: quote.destAsset.symbol,
123
- is_hardware_wallet: isHardwareAccount,
127
+ token_address_destination: quote.destAsset.assetId,
128
+ token_security_type_destination: tokenSecurityTypeDestination ?? null,
129
+ account_hardware_type: accountHardwareType,
130
+ is_hardware_wallet: accountHardwareType !== null,
124
131
  swap_type: (0, bridge_controller_1.getSwapType)(quoteResponse.quote.srcChainId, quoteResponse.quote.destChainId),
125
132
  usd_amount_source: Number(quoteResponse.sentAmount?.usd ?? 0),
126
133
  stx_enabled: isStxEnabledOnClient,
@@ -151,12 +158,14 @@ const getTradeDataFromHistory = (historyItem) => {
151
158
  exports.getTradeDataFromHistory = getTradeDataFromHistory;
152
159
  const getRequestMetadataFromHistory = (historyItem, account) => {
153
160
  const { quote, slippagePercentage, isStxEnabled } = historyItem;
161
+ const accountHardwareType = (0, bridge_controller_1.getAccountHardwareType)(account);
154
162
  return {
155
163
  slippage_limit: slippagePercentage,
156
164
  custom_slippage: (0, bridge_controller_1.isCustomSlippage)(slippagePercentage),
157
165
  usd_amount_source: Number(historyItem.pricingData?.amountSentInUsd ?? 0),
158
166
  swap_type: (0, bridge_controller_1.getSwapType)(quote.srcChainId, quote.destChainId),
159
- is_hardware_wallet: (0, bridge_controller_1.isHardwareWallet)(account),
167
+ account_hardware_type: accountHardwareType,
168
+ is_hardware_wallet: accountHardwareType !== null,
160
169
  stx_enabled: isStxEnabled ?? false,
161
170
  security_warnings: [],
162
171
  };
@@ -166,9 +175,11 @@ exports.getRequestMetadataFromHistory = getRequestMetadataFromHistory;
166
175
  * Get the properties for a swap transaction that is not in the txHistory
167
176
  *
168
177
  * @param transactionMeta - The transaction meta
178
+ * @param account - The account that submitted the transaction
169
179
  * @returns The properties for the swap transaction
170
180
  */
171
- const getEVMTxPropertiesFromTransactionMeta = (transactionMeta) => {
181
+ const getEVMTxPropertiesFromTransactionMeta = (transactionMeta, account) => {
182
+ const accountHardwareType = (0, bridge_controller_1.getAccountHardwareType)(account);
172
183
  return {
173
184
  source_transaction: [
174
185
  transaction_controller_1.TransactionStatus.failed,
@@ -177,7 +188,12 @@ const getEVMTxPropertiesFromTransactionMeta = (transactionMeta) => {
177
188
  ].includes(transactionMeta.status)
178
189
  ? bridge_controller_1.StatusTypes.FAILED
179
190
  : bridge_controller_1.StatusTypes.COMPLETE,
180
- error_message: transactionMeta.error?.message ?? '',
191
+ error_message: [
192
+ `Transaction ${transactionMeta.status}`,
193
+ transactionMeta.error?.message,
194
+ ]
195
+ .filter(Boolean)
196
+ .join('. '),
181
197
  chain_id_source: (0, bridge_controller_1.formatChainIdToCaip)(transactionMeta.chainId),
182
198
  chain_id_destination: (0, bridge_controller_1.formatChainIdToCaip)(transactionMeta.chainId),
183
199
  token_symbol_source: transactionMeta.sourceTokenSymbol ?? '',
@@ -186,8 +202,10 @@ const getEVMTxPropertiesFromTransactionMeta = (transactionMeta) => {
186
202
  stx_enabled: false,
187
203
  token_address_source: (0, bridge_controller_1.formatAddressToAssetId)(transactionMeta.sourceTokenAddress ?? '', transactionMeta.chainId) ?? '',
188
204
  token_address_destination: (0, bridge_controller_1.formatAddressToAssetId)(transactionMeta.destinationTokenAddress ?? '', transactionMeta.chainId) ?? '',
205
+ token_security_type_destination: null,
189
206
  custom_slippage: false,
190
- is_hardware_wallet: false,
207
+ account_hardware_type: accountHardwareType,
208
+ is_hardware_wallet: accountHardwareType !== null,
191
209
  swap_type: transactionMeta.type &&
192
210
  [transaction_controller_1.TransactionType.swap, transaction_controller_1.TransactionType.swapApproval].includes(transactionMeta.type)
193
211
  ? bridge_controller_1.MetricsSwapType.SINGLE
@@ -209,4 +227,23 @@ const getEVMTxPropertiesFromTransactionMeta = (transactionMeta) => {
209
227
  };
210
228
  };
211
229
  exports.getEVMTxPropertiesFromTransactionMeta = getEVMTxPropertiesFromTransactionMeta;
230
+ const getPollingStatusUpdatedProperties = (messenger, pollingStatus, historyItem) => {
231
+ const selectedAccount = (0, accounts_1.getAccountByAddress)(messenger, historyItem.account);
232
+ const requestParams = (0, exports.getRequestParamFromHistory)(historyItem);
233
+ const requestMetadata = (0, exports.getRequestMetadataFromHistory)(historyItem, selectedAccount);
234
+ const { security_warnings: _, ...metadataWithoutWarnings } = requestMetadata;
235
+ return {
236
+ ...(0, exports.getTradeDataFromHistory)(historyItem),
237
+ ...(0, exports.getPriceImpactFromQuote)(historyItem.quote),
238
+ ...metadataWithoutWarnings,
239
+ chain_id_source: requestParams.chain_id_source,
240
+ chain_id_destination: requestParams.chain_id_destination,
241
+ token_symbol_source: requestParams.token_symbol_source,
242
+ token_symbol_destination: requestParams.token_symbol_destination,
243
+ action_type: bridge_controller_1.MetricsActionType.SWAPBRIDGE_V1,
244
+ polling_status: pollingStatus,
245
+ retry_attempts: historyItem.attempts?.counter ?? 0,
246
+ };
247
+ };
248
+ exports.getPollingStatusUpdatedProperties = getPollingStatusUpdatedProperties;
212
249
  //# sourceMappingURL=metrics.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.cjs","sourceRoot":"","sources":["../../src/utils/metrics.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable camelcase */\n/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport {\n StatusTypes,\n formatChainIdToHex,\n isEthUsdt,\n formatChainIdToCaip,\n formatProviderLabel,\n isCustomSlippage,\n getSwapType,\n isHardwareWallet,\n formatAddressToAssetId,\n MetricsActionType,\n MetricsSwapType,\n MetaMetricsSwapsEventSource,\n} from '@metamask/bridge-controller';\nimport type {\n QuoteFetchData,\n QuoteMetadata,\n QuoteResponse,\n TxStatusData,\n RequestParams,\n TradeData,\n RequestMetadata,\n} from '@metamask/bridge-controller';\nimport {\n TransactionStatus,\n TransactionType,\n} from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { CaipAssetType } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { calcActualGasUsed } from './gas';\nimport {\n getActualBridgeReceivedAmount,\n getActualSwapReceivedAmount,\n} from './swap-received-amount';\nimport type { BridgeHistoryItem } from '../types';\n\nexport const getTxStatusesFromHistory = ({\n status,\n hasApprovalTx,\n approvalTxId,\n quote,\n}: BridgeHistoryItem): TxStatusData => {\n const source_transaction = status.srcChain.txHash\n ? StatusTypes.COMPLETE\n : StatusTypes.PENDING;\n const destination_transaction = status.destChain?.txHash\n ? status.status\n : StatusTypes.PENDING;\n\n const hexChainId = formatChainIdToHex(quote.srcChainId);\n const isEthUsdtTx = isEthUsdt(hexChainId, quote.srcAsset.address);\n const allowance_reset_transaction = status.srcChain.txHash\n ? StatusTypes.COMPLETE\n : undefined;\n const approval_transaction = status.srcChain.txHash\n ? StatusTypes.COMPLETE\n : StatusTypes.PENDING;\n\n return {\n allowance_reset_transaction: isEthUsdtTx\n ? allowance_reset_transaction\n : undefined,\n approval_transaction:\n hasApprovalTx || approvalTxId ? approval_transaction : undefined,\n source_transaction,\n destination_transaction:\n status.status === StatusTypes.FAILED\n ? StatusTypes.FAILED\n : destination_transaction,\n };\n};\n\n/**\n * Calculate the properties for a finalized transaction event based on the txHistory\n * and txMeta\n *\n * @param historyItem - The bridge history item\n * @param txMeta - The transaction meta from the TransactionController\n * @param approvalTxMeta - The approval transaction meta from the TransactionController\n * @returns The properties for the finalized transaction\n */\nexport const getFinalizedTxProperties = (\n historyItem: BridgeHistoryItem,\n txMeta?: TransactionMeta,\n approvalTxMeta?: TransactionMeta,\n) => {\n const startTime =\n approvalTxMeta?.submittedTime ??\n txMeta?.submittedTime ??\n historyItem.startTime;\n const completionTime =\n txMeta?.type === TransactionType.swap\n ? txMeta?.time\n : historyItem.completionTime;\n\n const actualGas = calcActualGasUsed(\n historyItem,\n txMeta?.txReceipt,\n approvalTxMeta?.txReceipt,\n );\n\n const actualReturn =\n txMeta?.type === TransactionType.swap\n ? getActualSwapReceivedAmount(historyItem, actualGas, txMeta)\n : getActualBridgeReceivedAmount(historyItem);\n\n const quotedVsUsedGasRatio =\n historyItem.pricingData?.quotedGasAmount && actualGas?.amount\n ? new BigNumber(historyItem.pricingData.quotedGasAmount)\n .multipliedBy(new BigNumber(10).pow(18))\n .div(actualGas.amount)\n .toNumber()\n : 0;\n\n const quoteVsExecutionRatio =\n historyItem.pricingData?.quotedReturnInUsd && actualReturn?.usd\n ? new BigNumber(historyItem.pricingData.quotedReturnInUsd)\n .div(actualReturn.usd)\n .toNumber()\n : 0;\n\n return {\n actual_time_minutes:\n completionTime && startTime ? (completionTime - startTime) / 60000 : 0,\n usd_actual_return: Number(actualReturn?.usd ?? 0),\n usd_actual_gas: actualGas?.usd ?? 0,\n quote_vs_execution_ratio: quoteVsExecutionRatio,\n quoted_vs_used_gas_ratio: quotedVsUsedGasRatio,\n };\n};\n\nexport const getRequestParamFromHistory = (\n historyItem: BridgeHistoryItem,\n): RequestParams => {\n return {\n chain_id_source: formatChainIdToCaip(historyItem.quote.srcChainId),\n token_symbol_source: historyItem.quote.srcAsset.symbol,\n token_address_source: historyItem.quote.srcAsset.assetId,\n chain_id_destination: formatChainIdToCaip(historyItem.quote.destChainId),\n token_symbol_destination: historyItem.quote.destAsset.symbol,\n token_address_destination: historyItem.quote.destAsset.assetId,\n };\n};\n\nexport const getTradeDataFromQuote = (\n quoteResponse: QuoteResponse & Partial<QuoteMetadata>,\n): TradeData => {\n return {\n usd_quoted_gas: Number(quoteResponse.gasFee?.effective?.usd ?? 0),\n gas_included: quoteResponse.quote.gasIncluded ?? false,\n gas_included_7702: quoteResponse.quote.gasIncluded7702 ?? false,\n provider: formatProviderLabel(quoteResponse.quote),\n quoted_time_minutes: Number(\n quoteResponse.estimatedProcessingTimeInSeconds / 60,\n ),\n usd_quoted_return: Number(quoteResponse.adjustedReturn?.usd ?? 0),\n };\n};\n\nexport const getPriceImpactFromQuote = (\n quote: QuoteResponse['quote'],\n): Pick<QuoteFetchData, 'price_impact'> => {\n return { price_impact: Number(quote.priceData?.priceImpact ?? '0') };\n};\n\n/**\n * Before the tx is confirmed, its data is not available in txHistory\n * The quote is used to populate event properties before confirmation\n *\n * @param quoteResponse - The quote response\n * @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension\n * @param isHardwareAccount - whether the tx is submitted using a hardware wallet\n * @param location - The entry point from which the user initiated the swap or bridge (e.g. Main View, Token View, Trending Explore)\n * @param abTests - Legacy A/B test context for `ab_tests` (backward compatibility)\n * @param activeAbTests - New A/B test context for `active_ab_tests` (migration target)\n * @returns The properties for the pre-confirmation event\n */\nexport const getPreConfirmationPropertiesFromQuote = (\n quoteResponse: QuoteResponse & Partial<QuoteMetadata>,\n isStxEnabledOnClient: boolean,\n isHardwareAccount: boolean,\n location: MetaMetricsSwapsEventSource = MetaMetricsSwapsEventSource.MainView,\n abTests?: Record<string, string>,\n activeAbTests?: { key: string; value: string }[],\n) => {\n const { quote } = quoteResponse;\n return {\n ...getPriceImpactFromQuote(quote),\n ...getTradeDataFromQuote(quoteResponse),\n chain_id_source: formatChainIdToCaip(quote.srcChainId),\n token_symbol_source: quote.srcAsset.symbol,\n chain_id_destination: formatChainIdToCaip(quote.destChainId),\n token_symbol_destination: quote.destAsset.symbol,\n is_hardware_wallet: isHardwareAccount,\n swap_type: getSwapType(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n ),\n usd_amount_source: Number(quoteResponse.sentAmount?.usd ?? 0),\n stx_enabled: isStxEnabledOnClient,\n action_type: MetricsActionType.SWAPBRIDGE_V1,\n custom_slippage: false, // TODO detect whether the user changed the default slippage\n location,\n ...(abTests &&\n Object.keys(abTests).length > 0 && {\n ab_tests: abTests,\n }),\n ...(activeAbTests &&\n activeAbTests.length > 0 && {\n active_ab_tests: activeAbTests,\n }),\n };\n};\n\nexport const getTradeDataFromHistory = (\n historyItem: BridgeHistoryItem,\n): TradeData => {\n return {\n usd_quoted_gas: Number(historyItem.pricingData?.quotedGasInUsd ?? 0),\n gas_included: historyItem.quote.gasIncluded ?? false,\n gas_included_7702: historyItem.quote.gasIncluded7702 ?? false,\n provider: formatProviderLabel(historyItem.quote),\n quoted_time_minutes: Number(\n historyItem.estimatedProcessingTimeInSeconds / 60,\n ),\n usd_quoted_return: Number(historyItem.pricingData?.quotedReturnInUsd ?? 0),\n };\n};\n\nexport const getRequestMetadataFromHistory = (\n historyItem: BridgeHistoryItem,\n account?: AccountsControllerState['internalAccounts']['accounts'][string],\n): RequestMetadata => {\n const { quote, slippagePercentage, isStxEnabled } = historyItem;\n\n return {\n slippage_limit: slippagePercentage,\n custom_slippage: isCustomSlippage(slippagePercentage),\n usd_amount_source: Number(historyItem.pricingData?.amountSentInUsd ?? 0),\n swap_type: getSwapType(quote.srcChainId, quote.destChainId),\n is_hardware_wallet: isHardwareWallet(account),\n stx_enabled: isStxEnabled ?? false,\n security_warnings: [],\n };\n};\n\n/**\n * Get the properties for a swap transaction that is not in the txHistory\n *\n * @param transactionMeta - The transaction meta\n * @returns The properties for the swap transaction\n */\nexport const getEVMTxPropertiesFromTransactionMeta = (\n transactionMeta: TransactionMeta,\n) => {\n return {\n source_transaction: [\n TransactionStatus.failed,\n TransactionStatus.dropped,\n TransactionStatus.rejected,\n ].includes(transactionMeta.status)\n ? StatusTypes.FAILED\n : StatusTypes.COMPLETE,\n error_message: transactionMeta.error?.message ?? '',\n chain_id_source: formatChainIdToCaip(transactionMeta.chainId),\n chain_id_destination: formatChainIdToCaip(transactionMeta.chainId),\n token_symbol_source: transactionMeta.sourceTokenSymbol ?? '',\n token_symbol_destination: transactionMeta.destinationTokenSymbol ?? '',\n usd_amount_source: 0,\n stx_enabled: false,\n token_address_source:\n formatAddressToAssetId(\n transactionMeta.sourceTokenAddress ?? '',\n transactionMeta.chainId,\n ) ?? ('' as CaipAssetType),\n token_address_destination:\n formatAddressToAssetId(\n transactionMeta.destinationTokenAddress ?? '',\n transactionMeta.chainId,\n ) ?? ('' as CaipAssetType),\n custom_slippage: false,\n is_hardware_wallet: false,\n swap_type:\n transactionMeta.type &&\n [TransactionType.swap, TransactionType.swapApproval].includes(\n transactionMeta.type,\n )\n ? MetricsSwapType.SINGLE\n : MetricsSwapType.CROSSCHAIN,\n security_warnings: [],\n price_impact: 0,\n usd_quoted_gas: 0,\n gas_included: false,\n gas_included_7702: false,\n quoted_time_minutes: 0,\n usd_quoted_return: 0,\n provider: '' as `${string}_${string}`,\n actual_time_minutes: 0,\n quote_vs_execution_ratio: 0,\n quoted_vs_used_gas_ratio: 0,\n usd_actual_return: 0,\n usd_actual_gas: 0,\n action_type: MetricsActionType.SWAPBRIDGE_V1,\n };\n};\n"]}
1
+ {"version":3,"file":"metrics.cjs","sourceRoot":"","sources":["../../src/utils/metrics.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable camelcase */\n/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport {\n StatusTypes,\n getAccountHardwareType,\n formatChainIdToHex,\n isEthUsdt,\n formatChainIdToCaip,\n formatProviderLabel,\n isCustomSlippage,\n getSwapType,\n formatAddressToAssetId,\n MetricsActionType,\n MetricsSwapType,\n MetaMetricsSwapsEventSource,\n} from '@metamask/bridge-controller';\nimport type {\n AccountHardwareType,\n QuoteFetchData,\n QuoteMetadata,\n QuoteResponse,\n TxStatusData,\n RequestParams,\n TradeData,\n RequestMetadata,\n PollingStatus,\n} from '@metamask/bridge-controller';\nimport {\n TransactionStatus,\n TransactionType,\n} from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { CaipAssetType } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport type {\n BridgeHistoryItem,\n BridgeStatusControllerMessenger,\n} from '../types';\nimport { getAccountByAddress } from './accounts';\nimport { calcActualGasUsed } from './gas';\nimport {\n getActualBridgeReceivedAmount,\n getActualSwapReceivedAmount,\n} from './swap-received-amount';\n\nexport const getTxStatusesFromHistory = ({\n status,\n hasApprovalTx,\n approvalTxId,\n quote,\n}: BridgeHistoryItem): TxStatusData => {\n const source_transaction = status.srcChain.txHash\n ? StatusTypes.COMPLETE\n : StatusTypes.PENDING;\n const destination_transaction = status.destChain?.txHash\n ? status.status\n : StatusTypes.PENDING;\n\n const hexChainId = formatChainIdToHex(quote.srcChainId);\n const isEthUsdtTx = isEthUsdt(hexChainId, quote.srcAsset.address);\n const allowance_reset_transaction = status.srcChain.txHash\n ? StatusTypes.COMPLETE\n : undefined;\n const approval_transaction = status.srcChain.txHash\n ? StatusTypes.COMPLETE\n : StatusTypes.PENDING;\n\n return {\n allowance_reset_transaction: isEthUsdtTx\n ? allowance_reset_transaction\n : undefined,\n approval_transaction:\n hasApprovalTx || approvalTxId ? approval_transaction : undefined,\n source_transaction,\n destination_transaction:\n status.status === StatusTypes.FAILED\n ? StatusTypes.FAILED\n : destination_transaction,\n };\n};\n\n/**\n * Calculate the properties for a finalized transaction event based on the txHistory\n * and txMeta\n *\n * @param historyItem - The bridge history item\n * @param txMeta - The transaction meta from the TransactionController\n * @param approvalTxMeta - The approval transaction meta from the TransactionController\n * @returns The properties for the finalized transaction\n */\nexport const getFinalizedTxProperties = (\n historyItem: BridgeHistoryItem,\n txMeta?: TransactionMeta,\n approvalTxMeta?: TransactionMeta,\n) => {\n const startTime =\n approvalTxMeta?.submittedTime ??\n txMeta?.submittedTime ??\n historyItem.startTime;\n const completionTime =\n txMeta?.type === TransactionType.swap\n ? txMeta?.time\n : historyItem.completionTime;\n\n const actualGas = calcActualGasUsed(\n historyItem,\n txMeta?.txReceipt,\n approvalTxMeta?.txReceipt,\n );\n\n const actualReturn =\n txMeta?.type === TransactionType.swap\n ? getActualSwapReceivedAmount(historyItem, actualGas, txMeta)\n : getActualBridgeReceivedAmount(historyItem);\n\n const quotedVsUsedGasRatio =\n historyItem.pricingData?.quotedGasAmount && actualGas?.amount\n ? new BigNumber(historyItem.pricingData.quotedGasAmount)\n .multipliedBy(new BigNumber(10).pow(18))\n .div(actualGas.amount)\n .toNumber()\n : 0;\n\n const quoteVsExecutionRatio =\n historyItem.pricingData?.quotedReturnInUsd && actualReturn?.usd\n ? new BigNumber(historyItem.pricingData.quotedReturnInUsd)\n .div(actualReturn.usd)\n .toNumber()\n : 0;\n\n return {\n actual_time_minutes:\n completionTime && startTime ? (completionTime - startTime) / 60000 : 0,\n usd_actual_return: Number(actualReturn?.usd ?? 0),\n usd_actual_gas: actualGas?.usd ?? 0,\n quote_vs_execution_ratio: quoteVsExecutionRatio,\n quoted_vs_used_gas_ratio: quotedVsUsedGasRatio,\n };\n};\n\nexport const getRequestParamFromHistory = (\n historyItem: BridgeHistoryItem,\n): RequestParams => {\n return {\n chain_id_source: formatChainIdToCaip(historyItem.quote.srcChainId),\n token_symbol_source: historyItem.quote.srcAsset.symbol,\n token_address_source: historyItem.quote.srcAsset.assetId,\n chain_id_destination: formatChainIdToCaip(historyItem.quote.destChainId),\n token_symbol_destination: historyItem.quote.destAsset.symbol,\n token_address_destination: historyItem.quote.destAsset.assetId,\n token_security_type_destination:\n historyItem.tokenSecurityTypeDestination ?? null,\n };\n};\n\nexport const getTradeDataFromQuote = (\n quoteResponse: QuoteResponse & Partial<QuoteMetadata>,\n): TradeData => {\n return {\n usd_quoted_gas: Number(quoteResponse.gasFee?.effective?.usd ?? 0),\n gas_included: quoteResponse.quote.gasIncluded ?? false,\n gas_included_7702: quoteResponse.quote.gasIncluded7702 ?? false,\n provider: formatProviderLabel(quoteResponse.quote),\n quoted_time_minutes: Number(\n quoteResponse.estimatedProcessingTimeInSeconds / 60,\n ),\n usd_quoted_return: Number(quoteResponse.adjustedReturn?.usd ?? 0),\n };\n};\n\nexport const getPriceImpactFromQuote = (\n quote: QuoteResponse['quote'],\n): Pick<QuoteFetchData, 'price_impact'> => {\n return { price_impact: Number(quote.priceData?.priceImpact ?? '0') };\n};\n\n/**\n * Before the tx is confirmed, its data is not available in txHistory\n * The quote is used to populate event properties before confirmation\n *\n * @param quoteResponse - The quote response\n * @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension\n * @param accountHardwareType - The hardware wallet type used to submit the tx, or null if not a hardware wallet\n * @param location - The entry point from which the user initiated the swap or bridge (e.g. Main View, Token View, Trending Explore)\n * @param abTests - Legacy A/B test context for `ab_tests` (backward compatibility)\n * @param activeAbTests - New A/B test context for `active_ab_tests` (migration target)\n * @param tokenSecurityTypeDestination - The security classification of the destination token, supplied by the client (e.g. from token security/scanning data). Pass `null` when no security data is available.\n * @returns The properties for the pre-confirmation event\n */\nexport const getPreConfirmationPropertiesFromQuote = (\n quoteResponse: QuoteResponse & Partial<QuoteMetadata>,\n isStxEnabledOnClient: boolean,\n accountHardwareType: AccountHardwareType,\n location: MetaMetricsSwapsEventSource = MetaMetricsSwapsEventSource.MainView,\n abTests?: Record<string, string>,\n activeAbTests?: { key: string; value: string }[],\n tokenSecurityTypeDestination?: string | null,\n) => {\n const { quote } = quoteResponse;\n return {\n ...getPriceImpactFromQuote(quote),\n ...getTradeDataFromQuote(quoteResponse),\n chain_id_source: formatChainIdToCaip(quote.srcChainId),\n token_symbol_source: quote.srcAsset.symbol,\n token_address_source: quote.srcAsset.assetId,\n chain_id_destination: formatChainIdToCaip(quote.destChainId),\n token_symbol_destination: quote.destAsset.symbol,\n token_address_destination: quote.destAsset.assetId,\n token_security_type_destination: tokenSecurityTypeDestination ?? null,\n account_hardware_type: accountHardwareType,\n is_hardware_wallet: accountHardwareType !== null,\n swap_type: getSwapType(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n ),\n usd_amount_source: Number(quoteResponse.sentAmount?.usd ?? 0),\n stx_enabled: isStxEnabledOnClient,\n action_type: MetricsActionType.SWAPBRIDGE_V1,\n custom_slippage: false, // TODO detect whether the user changed the default slippage\n location,\n ...(abTests &&\n Object.keys(abTests).length > 0 && {\n ab_tests: abTests,\n }),\n ...(activeAbTests &&\n activeAbTests.length > 0 && {\n active_ab_tests: activeAbTests,\n }),\n };\n};\n\nexport const getTradeDataFromHistory = (\n historyItem: BridgeHistoryItem,\n): TradeData => {\n return {\n usd_quoted_gas: Number(historyItem.pricingData?.quotedGasInUsd ?? 0),\n gas_included: historyItem.quote.gasIncluded ?? false,\n gas_included_7702: historyItem.quote.gasIncluded7702 ?? false,\n provider: formatProviderLabel(historyItem.quote),\n quoted_time_minutes: Number(\n historyItem.estimatedProcessingTimeInSeconds / 60,\n ),\n usd_quoted_return: Number(historyItem.pricingData?.quotedReturnInUsd ?? 0),\n };\n};\n\nexport const getRequestMetadataFromHistory = (\n historyItem: BridgeHistoryItem,\n account?: AccountsControllerState['internalAccounts']['accounts'][string],\n): RequestMetadata => {\n const { quote, slippagePercentage, isStxEnabled } = historyItem;\n const accountHardwareType = getAccountHardwareType(account);\n\n return {\n slippage_limit: slippagePercentage,\n custom_slippage: isCustomSlippage(slippagePercentage),\n usd_amount_source: Number(historyItem.pricingData?.amountSentInUsd ?? 0),\n swap_type: getSwapType(quote.srcChainId, quote.destChainId),\n account_hardware_type: accountHardwareType,\n is_hardware_wallet: accountHardwareType !== null,\n stx_enabled: isStxEnabled ?? false,\n security_warnings: [],\n };\n};\n\n/**\n * Get the properties for a swap transaction that is not in the txHistory\n *\n * @param transactionMeta - The transaction meta\n * @param account - The account that submitted the transaction\n * @returns The properties for the swap transaction\n */\nexport const getEVMTxPropertiesFromTransactionMeta = (\n transactionMeta: TransactionMeta,\n account?: AccountsControllerState['internalAccounts']['accounts'][string],\n) => {\n const accountHardwareType = getAccountHardwareType(account);\n\n return {\n source_transaction: [\n TransactionStatus.failed,\n TransactionStatus.dropped,\n TransactionStatus.rejected,\n ].includes(transactionMeta.status)\n ? StatusTypes.FAILED\n : StatusTypes.COMPLETE,\n error_message: [\n `Transaction ${transactionMeta.status}`,\n transactionMeta.error?.message,\n ]\n .filter(Boolean)\n .join('. '),\n chain_id_source: formatChainIdToCaip(transactionMeta.chainId),\n chain_id_destination: formatChainIdToCaip(transactionMeta.chainId),\n token_symbol_source: transactionMeta.sourceTokenSymbol ?? '',\n token_symbol_destination: transactionMeta.destinationTokenSymbol ?? '',\n usd_amount_source: 0,\n stx_enabled: false,\n token_address_source:\n formatAddressToAssetId(\n transactionMeta.sourceTokenAddress ?? '',\n transactionMeta.chainId,\n ) ?? ('' as CaipAssetType),\n token_address_destination:\n formatAddressToAssetId(\n transactionMeta.destinationTokenAddress ?? '',\n transactionMeta.chainId,\n ) ?? ('' as CaipAssetType),\n token_security_type_destination: null,\n custom_slippage: false,\n account_hardware_type: accountHardwareType,\n is_hardware_wallet: accountHardwareType !== null,\n swap_type:\n transactionMeta.type &&\n [TransactionType.swap, TransactionType.swapApproval].includes(\n transactionMeta.type,\n )\n ? MetricsSwapType.SINGLE\n : MetricsSwapType.CROSSCHAIN,\n security_warnings: [],\n price_impact: 0,\n usd_quoted_gas: 0,\n gas_included: false,\n gas_included_7702: false,\n quoted_time_minutes: 0,\n usd_quoted_return: 0,\n provider: '' as `${string}_${string}`,\n actual_time_minutes: 0,\n quote_vs_execution_ratio: 0,\n quoted_vs_used_gas_ratio: 0,\n usd_actual_return: 0,\n usd_actual_gas: 0,\n action_type: MetricsActionType.SWAPBRIDGE_V1,\n };\n};\n\nexport const getPollingStatusUpdatedProperties = (\n messenger: BridgeStatusControllerMessenger,\n pollingStatus: PollingStatus,\n historyItem: BridgeHistoryItem,\n) => {\n const selectedAccount = getAccountByAddress(messenger, historyItem.account);\n const requestParams = getRequestParamFromHistory(historyItem);\n const requestMetadata = getRequestMetadataFromHistory(\n historyItem,\n selectedAccount,\n );\n const { security_warnings: _, ...metadataWithoutWarnings } = requestMetadata;\n\n return {\n ...getTradeDataFromHistory(historyItem),\n ...getPriceImpactFromQuote(historyItem.quote),\n ...metadataWithoutWarnings,\n chain_id_source: requestParams.chain_id_source,\n chain_id_destination: requestParams.chain_id_destination,\n token_symbol_source: requestParams.token_symbol_source,\n token_symbol_destination: requestParams.token_symbol_destination,\n action_type: MetricsActionType.SWAPBRIDGE_V1,\n polling_status: pollingStatus,\n retry_attempts: historyItem.attempts?.counter ?? 0,\n };\n};\n"]}
@@ -1,8 +1,8 @@
1
1
  import type { AccountsControllerState } from "@metamask/accounts-controller";
2
2
  import { StatusTypes, MetricsActionType, MetricsSwapType, MetaMetricsSwapsEventSource } from "@metamask/bridge-controller";
3
- import type { QuoteFetchData, QuoteMetadata, QuoteResponse, TxStatusData, RequestParams, TradeData, RequestMetadata } from "@metamask/bridge-controller";
3
+ import type { AccountHardwareType, QuoteFetchData, QuoteMetadata, QuoteResponse, TxStatusData, RequestParams, TradeData, RequestMetadata, PollingStatus } from "@metamask/bridge-controller";
4
4
  import type { TransactionMeta } from "@metamask/transaction-controller";
5
- import type { BridgeHistoryItem } from "../types.cjs";
5
+ import type { BridgeHistoryItem, BridgeStatusControllerMessenger } from "../types.cjs";
6
6
  export declare const getTxStatusesFromHistory: ({ status, hasApprovalTx, approvalTxId, quote, }: BridgeHistoryItem) => TxStatusData;
7
7
  /**
8
8
  * Calculate the properties for a finalized transaction event based on the txHistory
@@ -29,16 +29,17 @@ export declare const getPriceImpactFromQuote: (quote: QuoteResponse['quote']) =>
29
29
  *
30
30
  * @param quoteResponse - The quote response
31
31
  * @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension
32
- * @param isHardwareAccount - whether the tx is submitted using a hardware wallet
32
+ * @param accountHardwareType - The hardware wallet type used to submit the tx, or null if not a hardware wallet
33
33
  * @param location - The entry point from which the user initiated the swap or bridge (e.g. Main View, Token View, Trending Explore)
34
34
  * @param abTests - Legacy A/B test context for `ab_tests` (backward compatibility)
35
35
  * @param activeAbTests - New A/B test context for `active_ab_tests` (migration target)
36
+ * @param tokenSecurityTypeDestination - The security classification of the destination token, supplied by the client (e.g. from token security/scanning data). Pass `null` when no security data is available.
36
37
  * @returns The properties for the pre-confirmation event
37
38
  */
38
- export declare const getPreConfirmationPropertiesFromQuote: (quoteResponse: QuoteResponse & Partial<QuoteMetadata>, isStxEnabledOnClient: boolean, isHardwareAccount: boolean, location?: MetaMetricsSwapsEventSource, abTests?: Record<string, string>, activeAbTests?: {
39
+ export declare const getPreConfirmationPropertiesFromQuote: (quoteResponse: QuoteResponse & Partial<QuoteMetadata>, isStxEnabledOnClient: boolean, accountHardwareType: AccountHardwareType, location?: MetaMetricsSwapsEventSource, abTests?: Record<string, string>, activeAbTests?: {
39
40
  key: string;
40
41
  value: string;
41
- }[]) => {
42
+ }[], tokenSecurityTypeDestination?: string | null) => {
42
43
  active_ab_tests?: {
43
44
  key: string;
44
45
  value: string;
@@ -46,8 +47,12 @@ export declare const getPreConfirmationPropertiesFromQuote: (quoteResponse: Quot
46
47
  ab_tests?: Record<string, string> | undefined;
47
48
  chain_id_source: `${string}:${string}`;
48
49
  token_symbol_source: string;
50
+ token_address_source: `${string}:${string}/${string}:${string}`;
49
51
  chain_id_destination: `${string}:${string}`;
50
52
  token_symbol_destination: string;
53
+ token_address_destination: `${string}:${string}/${string}:${string}`;
54
+ token_security_type_destination: string | null;
55
+ account_hardware_type: AccountHardwareType;
51
56
  is_hardware_wallet: boolean;
52
57
  swap_type: MetricsSwapType;
53
58
  usd_amount_source: number;
@@ -69,9 +74,10 @@ export declare const getRequestMetadataFromHistory: (historyItem: BridgeHistoryI
69
74
  * Get the properties for a swap transaction that is not in the txHistory
70
75
  *
71
76
  * @param transactionMeta - The transaction meta
77
+ * @param account - The account that submitted the transaction
72
78
  * @returns The properties for the swap transaction
73
79
  */
74
- export declare const getEVMTxPropertiesFromTransactionMeta: (transactionMeta: TransactionMeta) => {
80
+ export declare const getEVMTxPropertiesFromTransactionMeta: (transactionMeta: TransactionMeta, account?: AccountsControllerState['internalAccounts']['accounts'][string]) => {
75
81
  source_transaction: StatusTypes;
76
82
  error_message: string;
77
83
  chain_id_source: `${string}:${string}`;
@@ -82,7 +88,9 @@ export declare const getEVMTxPropertiesFromTransactionMeta: (transactionMeta: Tr
82
88
  stx_enabled: boolean;
83
89
  token_address_source: `${string}:${string}/${string}:${string}`;
84
90
  token_address_destination: `${string}:${string}/${string}:${string}`;
91
+ token_security_type_destination: null;
85
92
  custom_slippage: boolean;
93
+ account_hardware_type: AccountHardwareType;
86
94
  is_hardware_wallet: boolean;
87
95
  swap_type: MetricsSwapType;
88
96
  security_warnings: never[];
@@ -100,4 +108,27 @@ export declare const getEVMTxPropertiesFromTransactionMeta: (transactionMeta: Tr
100
108
  usd_actual_gas: number;
101
109
  action_type: MetricsActionType;
102
110
  };
111
+ export declare const getPollingStatusUpdatedProperties: (messenger: BridgeStatusControllerMessenger, pollingStatus: PollingStatus, historyItem: BridgeHistoryItem) => {
112
+ chain_id_source: `${string}:${string}`;
113
+ chain_id_destination: `${string}:${string}` | null;
114
+ token_symbol_source: string;
115
+ token_symbol_destination: string | null;
116
+ action_type: MetricsActionType;
117
+ polling_status: PollingStatus;
118
+ retry_attempts: number;
119
+ slippage_limit?: number | undefined;
120
+ custom_slippage: boolean;
121
+ usd_amount_source: number;
122
+ stx_enabled: boolean;
123
+ is_hardware_wallet: boolean;
124
+ account_hardware_type: AccountHardwareType;
125
+ swap_type: MetricsSwapType;
126
+ price_impact: number;
127
+ usd_quoted_gas: number;
128
+ gas_included: boolean;
129
+ gas_included_7702: boolean;
130
+ quoted_time_minutes: number;
131
+ usd_quoted_return: number;
132
+ provider: `${string}_${string}`;
133
+ };
103
134
  //# sourceMappingURL=metrics.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.cts","sourceRoot":"","sources":["../../src/utils/metrics.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,EACL,WAAW,EASX,iBAAiB,EACjB,eAAe,EACf,2BAA2B,EAC5B,oCAAoC;AACrC,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,SAAS,EACT,eAAe,EAChB,oCAAoC;AAKrC,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AASxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAiB;AAElD,eAAO,MAAM,wBAAwB,oDAKlC,iBAAiB,KAAG,YA6BtB,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,gBACtB,iBAAiB,WACrB,eAAe,mBACP,eAAe;;;;;;CA6CjC,CAAC;AAEF,eAAO,MAAM,0BAA0B,gBACxB,iBAAiB,KAC7B,aASF,CAAC;AAEF,eAAO,MAAM,qBAAqB,kBACjB,aAAa,GAAG,QAAQ,aAAa,CAAC,KACpD,SAWF,CAAC;AAEF,eAAO,MAAM,uBAAuB,UAC3B,aAAa,CAAC,OAAO,CAAC,KAC5B,KAAK,cAAc,EAAE,cAAc,CAErC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qCAAqC,kBACjC,aAAa,GAAG,QAAQ,aAAa,CAAC,wBAC/B,OAAO,qBACV,OAAO,aAChB,2BAA2B,YAC3B,OAAO,MAAM,EAAE,MAAM,CAAC,kBAChB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE;;aAAzB,MAAM;eAAS,MAAM;;;;;;;;;;;;;;;;;;;;;CA6B7C,CAAC;AAEF,eAAO,MAAM,uBAAuB,gBACrB,iBAAiB,KAC7B,SAWF,CAAC;AAEF,eAAO,MAAM,6BAA6B,gBAC3B,iBAAiB,YACpB,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KACxE,eAYF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qCAAqC,oBAC/B,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDjC,CAAC"}
1
+ {"version":3,"file":"metrics.d.cts","sourceRoot":"","sources":["../../src/utils/metrics.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,EACL,WAAW,EASX,iBAAiB,EACjB,eAAe,EACf,2BAA2B,EAC5B,oCAAoC;AACrC,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,SAAS,EACT,eAAe,EACf,aAAa,EACd,oCAAoC;AAKrC,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAIxE,OAAO,KAAK,EACV,iBAAiB,EACjB,+BAA+B,EAChC,qBAAiB;AAQlB,eAAO,MAAM,wBAAwB,oDAKlC,iBAAiB,KAAG,YA6BtB,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,gBACtB,iBAAiB,WACrB,eAAe,mBACP,eAAe;;;;;;CA6CjC,CAAC;AAEF,eAAO,MAAM,0BAA0B,gBACxB,iBAAiB,KAC7B,aAWF,CAAC;AAEF,eAAO,MAAM,qBAAqB,kBACjB,aAAa,GAAG,QAAQ,aAAa,CAAC,KACpD,SAWF,CAAC;AAEF,eAAO,MAAM,uBAAuB,UAC3B,aAAa,CAAC,OAAO,CAAC,KAC5B,KAAK,cAAc,EAAE,cAAc,CAErC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qCAAqC,kBACjC,aAAa,GAAG,QAAQ,aAAa,CAAC,wBAC/B,OAAO,uBACR,mBAAmB,aAC9B,2BAA2B,YAC3B,OAAO,MAAM,EAAE,MAAM,CAAC,kBAChB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,iCACjB,MAAM,GAAG,IAAI;;aADrB,MAAM;eAAS,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;CAkC7C,CAAC;AAEF,eAAO,MAAM,uBAAuB,gBACrB,iBAAiB,KAC7B,SAWF,CAAC;AAEF,eAAO,MAAM,6BAA6B,gBAC3B,iBAAiB,YACpB,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KACxE,eAcF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,qCAAqC,oBAC/B,eAAe,YACtB,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4D1E,CAAC;AAEF,eAAO,MAAM,iCAAiC,8DAE7B,aAAa,eACf,iBAAiB;;;;;;;;;;;;;;;;;;;;;;CAsB/B,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import type { AccountsControllerState } from "@metamask/accounts-controller";
2
2
  import { StatusTypes, MetricsActionType, MetricsSwapType, MetaMetricsSwapsEventSource } from "@metamask/bridge-controller";
3
- import type { QuoteFetchData, QuoteMetadata, QuoteResponse, TxStatusData, RequestParams, TradeData, RequestMetadata } from "@metamask/bridge-controller";
3
+ import type { AccountHardwareType, QuoteFetchData, QuoteMetadata, QuoteResponse, TxStatusData, RequestParams, TradeData, RequestMetadata, PollingStatus } from "@metamask/bridge-controller";
4
4
  import type { TransactionMeta } from "@metamask/transaction-controller";
5
- import type { BridgeHistoryItem } from "../types.mjs";
5
+ import type { BridgeHistoryItem, BridgeStatusControllerMessenger } from "../types.mjs";
6
6
  export declare const getTxStatusesFromHistory: ({ status, hasApprovalTx, approvalTxId, quote, }: BridgeHistoryItem) => TxStatusData;
7
7
  /**
8
8
  * Calculate the properties for a finalized transaction event based on the txHistory
@@ -29,16 +29,17 @@ export declare const getPriceImpactFromQuote: (quote: QuoteResponse['quote']) =>
29
29
  *
30
30
  * @param quoteResponse - The quote response
31
31
  * @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension
32
- * @param isHardwareAccount - whether the tx is submitted using a hardware wallet
32
+ * @param accountHardwareType - The hardware wallet type used to submit the tx, or null if not a hardware wallet
33
33
  * @param location - The entry point from which the user initiated the swap or bridge (e.g. Main View, Token View, Trending Explore)
34
34
  * @param abTests - Legacy A/B test context for `ab_tests` (backward compatibility)
35
35
  * @param activeAbTests - New A/B test context for `active_ab_tests` (migration target)
36
+ * @param tokenSecurityTypeDestination - The security classification of the destination token, supplied by the client (e.g. from token security/scanning data). Pass `null` when no security data is available.
36
37
  * @returns The properties for the pre-confirmation event
37
38
  */
38
- export declare const getPreConfirmationPropertiesFromQuote: (quoteResponse: QuoteResponse & Partial<QuoteMetadata>, isStxEnabledOnClient: boolean, isHardwareAccount: boolean, location?: MetaMetricsSwapsEventSource, abTests?: Record<string, string>, activeAbTests?: {
39
+ export declare const getPreConfirmationPropertiesFromQuote: (quoteResponse: QuoteResponse & Partial<QuoteMetadata>, isStxEnabledOnClient: boolean, accountHardwareType: AccountHardwareType, location?: MetaMetricsSwapsEventSource, abTests?: Record<string, string>, activeAbTests?: {
39
40
  key: string;
40
41
  value: string;
41
- }[]) => {
42
+ }[], tokenSecurityTypeDestination?: string | null) => {
42
43
  active_ab_tests?: {
43
44
  key: string;
44
45
  value: string;
@@ -46,8 +47,12 @@ export declare const getPreConfirmationPropertiesFromQuote: (quoteResponse: Quot
46
47
  ab_tests?: Record<string, string> | undefined;
47
48
  chain_id_source: `${string}:${string}`;
48
49
  token_symbol_source: string;
50
+ token_address_source: `${string}:${string}/${string}:${string}`;
49
51
  chain_id_destination: `${string}:${string}`;
50
52
  token_symbol_destination: string;
53
+ token_address_destination: `${string}:${string}/${string}:${string}`;
54
+ token_security_type_destination: string | null;
55
+ account_hardware_type: AccountHardwareType;
51
56
  is_hardware_wallet: boolean;
52
57
  swap_type: MetricsSwapType;
53
58
  usd_amount_source: number;
@@ -69,9 +74,10 @@ export declare const getRequestMetadataFromHistory: (historyItem: BridgeHistoryI
69
74
  * Get the properties for a swap transaction that is not in the txHistory
70
75
  *
71
76
  * @param transactionMeta - The transaction meta
77
+ * @param account - The account that submitted the transaction
72
78
  * @returns The properties for the swap transaction
73
79
  */
74
- export declare const getEVMTxPropertiesFromTransactionMeta: (transactionMeta: TransactionMeta) => {
80
+ export declare const getEVMTxPropertiesFromTransactionMeta: (transactionMeta: TransactionMeta, account?: AccountsControllerState['internalAccounts']['accounts'][string]) => {
75
81
  source_transaction: StatusTypes;
76
82
  error_message: string;
77
83
  chain_id_source: `${string}:${string}`;
@@ -82,7 +88,9 @@ export declare const getEVMTxPropertiesFromTransactionMeta: (transactionMeta: Tr
82
88
  stx_enabled: boolean;
83
89
  token_address_source: `${string}:${string}/${string}:${string}`;
84
90
  token_address_destination: `${string}:${string}/${string}:${string}`;
91
+ token_security_type_destination: null;
85
92
  custom_slippage: boolean;
93
+ account_hardware_type: AccountHardwareType;
86
94
  is_hardware_wallet: boolean;
87
95
  swap_type: MetricsSwapType;
88
96
  security_warnings: never[];
@@ -100,4 +108,27 @@ export declare const getEVMTxPropertiesFromTransactionMeta: (transactionMeta: Tr
100
108
  usd_actual_gas: number;
101
109
  action_type: MetricsActionType;
102
110
  };
111
+ export declare const getPollingStatusUpdatedProperties: (messenger: BridgeStatusControllerMessenger, pollingStatus: PollingStatus, historyItem: BridgeHistoryItem) => {
112
+ chain_id_source: `${string}:${string}`;
113
+ chain_id_destination: `${string}:${string}` | null;
114
+ token_symbol_source: string;
115
+ token_symbol_destination: string | null;
116
+ action_type: MetricsActionType;
117
+ polling_status: PollingStatus;
118
+ retry_attempts: number;
119
+ slippage_limit?: number | undefined;
120
+ custom_slippage: boolean;
121
+ usd_amount_source: number;
122
+ stx_enabled: boolean;
123
+ is_hardware_wallet: boolean;
124
+ account_hardware_type: AccountHardwareType;
125
+ swap_type: MetricsSwapType;
126
+ price_impact: number;
127
+ usd_quoted_gas: number;
128
+ gas_included: boolean;
129
+ gas_included_7702: boolean;
130
+ quoted_time_minutes: number;
131
+ usd_quoted_return: number;
132
+ provider: `${string}_${string}`;
133
+ };
103
134
  //# sourceMappingURL=metrics.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.mts","sourceRoot":"","sources":["../../src/utils/metrics.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,EACL,WAAW,EASX,iBAAiB,EACjB,eAAe,EACf,2BAA2B,EAC5B,oCAAoC;AACrC,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,SAAS,EACT,eAAe,EAChB,oCAAoC;AAKrC,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AASxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAiB;AAElD,eAAO,MAAM,wBAAwB,oDAKlC,iBAAiB,KAAG,YA6BtB,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,gBACtB,iBAAiB,WACrB,eAAe,mBACP,eAAe;;;;;;CA6CjC,CAAC;AAEF,eAAO,MAAM,0BAA0B,gBACxB,iBAAiB,KAC7B,aASF,CAAC;AAEF,eAAO,MAAM,qBAAqB,kBACjB,aAAa,GAAG,QAAQ,aAAa,CAAC,KACpD,SAWF,CAAC;AAEF,eAAO,MAAM,uBAAuB,UAC3B,aAAa,CAAC,OAAO,CAAC,KAC5B,KAAK,cAAc,EAAE,cAAc,CAErC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qCAAqC,kBACjC,aAAa,GAAG,QAAQ,aAAa,CAAC,wBAC/B,OAAO,qBACV,OAAO,aAChB,2BAA2B,YAC3B,OAAO,MAAM,EAAE,MAAM,CAAC,kBAChB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE;;aAAzB,MAAM;eAAS,MAAM;;;;;;;;;;;;;;;;;;;;;CA6B7C,CAAC;AAEF,eAAO,MAAM,uBAAuB,gBACrB,iBAAiB,KAC7B,SAWF,CAAC;AAEF,eAAO,MAAM,6BAA6B,gBAC3B,iBAAiB,YACpB,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KACxE,eAYF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qCAAqC,oBAC/B,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDjC,CAAC"}
1
+ {"version":3,"file":"metrics.d.mts","sourceRoot":"","sources":["../../src/utils/metrics.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,EACL,WAAW,EASX,iBAAiB,EACjB,eAAe,EACf,2BAA2B,EAC5B,oCAAoC;AACrC,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,SAAS,EACT,eAAe,EACf,aAAa,EACd,oCAAoC;AAKrC,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAIxE,OAAO,KAAK,EACV,iBAAiB,EACjB,+BAA+B,EAChC,qBAAiB;AAQlB,eAAO,MAAM,wBAAwB,oDAKlC,iBAAiB,KAAG,YA6BtB,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,gBACtB,iBAAiB,WACrB,eAAe,mBACP,eAAe;;;;;;CA6CjC,CAAC;AAEF,eAAO,MAAM,0BAA0B,gBACxB,iBAAiB,KAC7B,aAWF,CAAC;AAEF,eAAO,MAAM,qBAAqB,kBACjB,aAAa,GAAG,QAAQ,aAAa,CAAC,KACpD,SAWF,CAAC;AAEF,eAAO,MAAM,uBAAuB,UAC3B,aAAa,CAAC,OAAO,CAAC,KAC5B,KAAK,cAAc,EAAE,cAAc,CAErC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qCAAqC,kBACjC,aAAa,GAAG,QAAQ,aAAa,CAAC,wBAC/B,OAAO,uBACR,mBAAmB,aAC9B,2BAA2B,YAC3B,OAAO,MAAM,EAAE,MAAM,CAAC,kBAChB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,iCACjB,MAAM,GAAG,IAAI;;aADrB,MAAM;eAAS,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;CAkC7C,CAAC;AAEF,eAAO,MAAM,uBAAuB,gBACrB,iBAAiB,KAC7B,SAWF,CAAC;AAEF,eAAO,MAAM,6BAA6B,gBAC3B,iBAAiB,YACpB,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KACxE,eAcF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,qCAAqC,oBAC/B,eAAe,YACtB,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4D1E,CAAC;AAEF,eAAO,MAAM,iCAAiC,8DAE7B,aAAa,eACf,iBAAiB;;;;;;;;;;;;;;;;;;;;;;CAsB/B,CAAC"}
@@ -1,6 +1,7 @@
1
- import { StatusTypes, formatChainIdToHex, isEthUsdt, formatChainIdToCaip, formatProviderLabel, isCustomSlippage, getSwapType, isHardwareWallet, formatAddressToAssetId, MetricsActionType, MetricsSwapType, MetaMetricsSwapsEventSource } from "@metamask/bridge-controller";
1
+ import { StatusTypes, getAccountHardwareType, formatChainIdToHex, isEthUsdt, formatChainIdToCaip, formatProviderLabel, isCustomSlippage, getSwapType, formatAddressToAssetId, MetricsActionType, MetricsSwapType, MetaMetricsSwapsEventSource } from "@metamask/bridge-controller";
2
2
  import { TransactionStatus, TransactionType } from "@metamask/transaction-controller";
3
3
  import { BigNumber } from "bignumber.js";
4
+ import { getAccountByAddress } from "./accounts.mjs";
4
5
  import { calcActualGasUsed } from "./gas.mjs";
5
6
  import { getActualBridgeReceivedAmount, getActualSwapReceivedAmount } from "./swap-received-amount.mjs";
6
7
  export const getTxStatusesFromHistory = ({ status, hasApprovalTx, approvalTxId, quote, }) => {
@@ -76,6 +77,7 @@ export const getRequestParamFromHistory = (historyItem) => {
76
77
  chain_id_destination: formatChainIdToCaip(historyItem.quote.destChainId),
77
78
  token_symbol_destination: historyItem.quote.destAsset.symbol,
78
79
  token_address_destination: historyItem.quote.destAsset.assetId,
80
+ token_security_type_destination: historyItem.tokenSecurityTypeDestination ?? null,
79
81
  };
80
82
  };
81
83
  export const getTradeDataFromQuote = (quoteResponse) => {
@@ -97,22 +99,27 @@ export const getPriceImpactFromQuote = (quote) => {
97
99
  *
98
100
  * @param quoteResponse - The quote response
99
101
  * @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension
100
- * @param isHardwareAccount - whether the tx is submitted using a hardware wallet
102
+ * @param accountHardwareType - The hardware wallet type used to submit the tx, or null if not a hardware wallet
101
103
  * @param location - The entry point from which the user initiated the swap or bridge (e.g. Main View, Token View, Trending Explore)
102
104
  * @param abTests - Legacy A/B test context for `ab_tests` (backward compatibility)
103
105
  * @param activeAbTests - New A/B test context for `active_ab_tests` (migration target)
106
+ * @param tokenSecurityTypeDestination - The security classification of the destination token, supplied by the client (e.g. from token security/scanning data). Pass `null` when no security data is available.
104
107
  * @returns The properties for the pre-confirmation event
105
108
  */
106
- export const getPreConfirmationPropertiesFromQuote = (quoteResponse, isStxEnabledOnClient, isHardwareAccount, location = MetaMetricsSwapsEventSource.MainView, abTests, activeAbTests) => {
109
+ export const getPreConfirmationPropertiesFromQuote = (quoteResponse, isStxEnabledOnClient, accountHardwareType, location = MetaMetricsSwapsEventSource.MainView, abTests, activeAbTests, tokenSecurityTypeDestination) => {
107
110
  const { quote } = quoteResponse;
108
111
  return {
109
112
  ...getPriceImpactFromQuote(quote),
110
113
  ...getTradeDataFromQuote(quoteResponse),
111
114
  chain_id_source: formatChainIdToCaip(quote.srcChainId),
112
115
  token_symbol_source: quote.srcAsset.symbol,
116
+ token_address_source: quote.srcAsset.assetId,
113
117
  chain_id_destination: formatChainIdToCaip(quote.destChainId),
114
118
  token_symbol_destination: quote.destAsset.symbol,
115
- is_hardware_wallet: isHardwareAccount,
119
+ token_address_destination: quote.destAsset.assetId,
120
+ token_security_type_destination: tokenSecurityTypeDestination ?? null,
121
+ account_hardware_type: accountHardwareType,
122
+ is_hardware_wallet: accountHardwareType !== null,
116
123
  swap_type: getSwapType(quoteResponse.quote.srcChainId, quoteResponse.quote.destChainId),
117
124
  usd_amount_source: Number(quoteResponse.sentAmount?.usd ?? 0),
118
125
  stx_enabled: isStxEnabledOnClient,
@@ -141,12 +148,14 @@ export const getTradeDataFromHistory = (historyItem) => {
141
148
  };
142
149
  export const getRequestMetadataFromHistory = (historyItem, account) => {
143
150
  const { quote, slippagePercentage, isStxEnabled } = historyItem;
151
+ const accountHardwareType = getAccountHardwareType(account);
144
152
  return {
145
153
  slippage_limit: slippagePercentage,
146
154
  custom_slippage: isCustomSlippage(slippagePercentage),
147
155
  usd_amount_source: Number(historyItem.pricingData?.amountSentInUsd ?? 0),
148
156
  swap_type: getSwapType(quote.srcChainId, quote.destChainId),
149
- is_hardware_wallet: isHardwareWallet(account),
157
+ account_hardware_type: accountHardwareType,
158
+ is_hardware_wallet: accountHardwareType !== null,
150
159
  stx_enabled: isStxEnabled ?? false,
151
160
  security_warnings: [],
152
161
  };
@@ -155,9 +164,11 @@ export const getRequestMetadataFromHistory = (historyItem, account) => {
155
164
  * Get the properties for a swap transaction that is not in the txHistory
156
165
  *
157
166
  * @param transactionMeta - The transaction meta
167
+ * @param account - The account that submitted the transaction
158
168
  * @returns The properties for the swap transaction
159
169
  */
160
- export const getEVMTxPropertiesFromTransactionMeta = (transactionMeta) => {
170
+ export const getEVMTxPropertiesFromTransactionMeta = (transactionMeta, account) => {
171
+ const accountHardwareType = getAccountHardwareType(account);
161
172
  return {
162
173
  source_transaction: [
163
174
  TransactionStatus.failed,
@@ -166,7 +177,12 @@ export const getEVMTxPropertiesFromTransactionMeta = (transactionMeta) => {
166
177
  ].includes(transactionMeta.status)
167
178
  ? StatusTypes.FAILED
168
179
  : StatusTypes.COMPLETE,
169
- error_message: transactionMeta.error?.message ?? '',
180
+ error_message: [
181
+ `Transaction ${transactionMeta.status}`,
182
+ transactionMeta.error?.message,
183
+ ]
184
+ .filter(Boolean)
185
+ .join('. '),
170
186
  chain_id_source: formatChainIdToCaip(transactionMeta.chainId),
171
187
  chain_id_destination: formatChainIdToCaip(transactionMeta.chainId),
172
188
  token_symbol_source: transactionMeta.sourceTokenSymbol ?? '',
@@ -175,8 +191,10 @@ export const getEVMTxPropertiesFromTransactionMeta = (transactionMeta) => {
175
191
  stx_enabled: false,
176
192
  token_address_source: formatAddressToAssetId(transactionMeta.sourceTokenAddress ?? '', transactionMeta.chainId) ?? '',
177
193
  token_address_destination: formatAddressToAssetId(transactionMeta.destinationTokenAddress ?? '', transactionMeta.chainId) ?? '',
194
+ token_security_type_destination: null,
178
195
  custom_slippage: false,
179
- is_hardware_wallet: false,
196
+ account_hardware_type: accountHardwareType,
197
+ is_hardware_wallet: accountHardwareType !== null,
180
198
  swap_type: transactionMeta.type &&
181
199
  [TransactionType.swap, TransactionType.swapApproval].includes(transactionMeta.type)
182
200
  ? MetricsSwapType.SINGLE
@@ -197,4 +215,22 @@ export const getEVMTxPropertiesFromTransactionMeta = (transactionMeta) => {
197
215
  action_type: MetricsActionType.SWAPBRIDGE_V1,
198
216
  };
199
217
  };
218
+ export const getPollingStatusUpdatedProperties = (messenger, pollingStatus, historyItem) => {
219
+ const selectedAccount = getAccountByAddress(messenger, historyItem.account);
220
+ const requestParams = getRequestParamFromHistory(historyItem);
221
+ const requestMetadata = getRequestMetadataFromHistory(historyItem, selectedAccount);
222
+ const { security_warnings: _, ...metadataWithoutWarnings } = requestMetadata;
223
+ return {
224
+ ...getTradeDataFromHistory(historyItem),
225
+ ...getPriceImpactFromQuote(historyItem.quote),
226
+ ...metadataWithoutWarnings,
227
+ chain_id_source: requestParams.chain_id_source,
228
+ chain_id_destination: requestParams.chain_id_destination,
229
+ token_symbol_source: requestParams.token_symbol_source,
230
+ token_symbol_destination: requestParams.token_symbol_destination,
231
+ action_type: MetricsActionType.SWAPBRIDGE_V1,
232
+ polling_status: pollingStatus,
233
+ retry_attempts: historyItem.attempts?.counter ?? 0,
234
+ };
235
+ };
200
236
  //# sourceMappingURL=metrics.mjs.map