diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index c37b87d75fe..fc00b6e954d 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -50,6 +50,7 @@ import { CommonSelectorsIDs } from '../../../../e2e/selectors/Common.selectors'; import { WalletViewSelectorsIDs } from '../../../../e2e/selectors/WalletView.selectors'; import { NetworksViewSelectorsIDs } from '../../../../e2e/selectors/Settings/NetworksView.selectors'; import { SendLinkViewSelectorsIDs } from '../../../../e2e/selectors/SendLinkView.selectors'; +import { getBlockaidTransactionMetricsParams } from '../../../util/blockaid'; const trackEvent = (event, params = {}) => { MetaMetrics.getInstance().trackEvent(event, params); @@ -512,6 +513,7 @@ export function getSendFlowTitle( route, themeColors, resetTransaction, + transaction, ) { const innerStyles = StyleSheet.create({ headerButtonText: { @@ -527,9 +529,12 @@ export function getSendFlowTitle( }); const rightAction = () => { const providerType = route?.params?.providerType ?? ''; + const additionalTransactionMetricsParams = + getBlockaidTransactionMetricsParams(transaction); trackEvent(MetaMetricsEvents.SEND_FLOW_CANCEL, { view: title.split('.')[1], network: providerType, + ...additionalTransactionMetricsParams, }); resetTransaction(); navigation.dangerouslyGetParent()?.pop(); diff --git a/app/components/Views/confirmations/SendFlow/Confirm/index.js b/app/components/Views/confirmations/SendFlow/Confirm/index.js index e6531092895..a4c3ce54169 100644 --- a/app/components/Views/confirmations/SendFlow/Confirm/index.js +++ b/app/components/Views/confirmations/SendFlow/Confirm/index.js @@ -107,7 +107,7 @@ import { ConfirmViewSelectorsIDs } from '../../../../../../e2e/selectors/SendFlo import ExtendedKeyringTypes from '../../../../../constants/keyringTypes'; import { getLedgerKeyring } from '../../../../../core/Ledger/Ledger'; import { - getBlockaidMetricsParams, + getBlockaidTransactionMetricsParams, isBlockaidFeatureEnabled, } from '../../../../../util/blockaid'; import ppomUtil from '../../../../../lib/ppom/ppom-util'; @@ -302,23 +302,8 @@ class Confirm extends PureComponent { } }; - withBlockaidMetricsParams = () => { - let blockaidParams = {}; - - const { transaction } = this.props; - if ( - transaction.id === transaction.currentTransactionSecurityAlertResponse?.id - ) { - blockaidParams = getBlockaidMetricsParams( - transaction.currentTransactionSecurityAlertResponse?.response, - ); - } - - return blockaidParams; - }; - updateNavBar = () => { - const { navigation, route, resetTransaction } = this.props; + const { navigation, route, resetTransaction, transaction } = this.props; const colors = this.context.colors || mockTheme.colors; navigation.setOptions( getSendFlowTitle( @@ -327,6 +312,7 @@ class Confirm extends PureComponent { route, colors, resetTransaction, + transaction, ), ); }; @@ -855,7 +841,7 @@ class Confirm extends PureComponent { assetType, { ...this.getAnalyticsParams(), - ...this.withBlockaidMetricsParams(), + ...getBlockaidTransactionMetricsParams(transaction), }, ), type: 'signTransaction', @@ -884,7 +870,7 @@ class Confirm extends PureComponent { MetaMetricsEvents.SEND_TRANSACTION_COMPLETED, { ...this.getAnalyticsParams(), - ...this.withBlockaidMetricsParams(), + ...getBlockaidTransactionMetricsParams(transaction), }, ); stopGasPolling(); @@ -1095,9 +1081,10 @@ class Confirm extends PureComponent { }; onContactUsClicked = () => { + const { transaction } = this.props; const analyticsParams = { ...this.getAnalyticsParams(), - ...this.withBlockaidMetricsParams(), + ...getBlockaidTransactionMetricsParams(transaction), external_link_clicked: 'security_alert_support_link', }; this.props.metrics.trackEvent( diff --git a/app/components/Views/confirmations/components/ApproveTransactionReview/index.js b/app/components/Views/confirmations/components/ApproveTransactionReview/index.js index 0609d11c210..940b030cd76 100644 --- a/app/components/Views/confirmations/components/ApproveTransactionReview/index.js +++ b/app/components/Views/confirmations/components/ApproveTransactionReview/index.js @@ -51,7 +51,7 @@ import TransactionReviewDetailsCard from '../TransactionReview/TransactionReview import AppConstants from '../../../../../core/AppConstants'; import { UINT256_HEX_MAX_VALUE } from '../../../../../constants/transaction'; import { WALLET_CONNECT_ORIGIN } from '../../../../../util/walletconnect'; -import { getBlockaidMetricsParams } from '../../../../../util/blockaid'; +import { getBlockaidTransactionMetricsParams } from '../../../../../util/blockaid'; import { withNavigation } from '@react-navigation/compat'; import { isTestNet, @@ -510,21 +510,6 @@ class ApproveTransactionReview extends PureComponent { clearInterval(intervalIdForEstimatedL1Fee); }; - withBlockaidMetricsParams = () => { - let blockaidParams = {}; - - const { transaction } = this.props; - if ( - transaction.id === transaction.currentTransactionSecurityAlertResponse?.id - ) { - blockaidParams = getBlockaidMetricsParams( - transaction.currentTransactionSecurityAlertResponse?.response, - ); - } - - return blockaidParams; - }; - getAnalyticsParams = () => { try { const { chainId, transaction, onSetAnalyticsParams } = this.props; @@ -697,9 +682,10 @@ class ApproveTransactionReview extends PureComponent { }; onContactUsClicked = () => { + const { transaction } = this.props; const analyticsParams = { ...this.getAnalyticsParams(), - ...this.withBlockaidMetricsParams(), + ...getBlockaidTransactionMetricsParams(transaction), external_link_clicked: 'security_alert_support_link', }; this.props.metrics.trackEvent( @@ -1177,13 +1163,13 @@ class ApproveTransactionReview extends PureComponent { }; onCancelPress = () => { - const { onCancel } = this.props; + const { onCancel, transaction } = this.props; onCancel && onCancel(); this.props.metrics.trackEvent( MetaMetricsEvents.APPROVAL_PERMISSION_UPDATED, { ...this.getAnalyticsParams(), - ...this.withBlockaidMetricsParams(), + ...getBlockaidTransactionMetricsParams(transaction), }, ); }; @@ -1200,7 +1186,7 @@ class ApproveTransactionReview extends PureComponent { MetaMetricsEvents.APPROVAL_PERMISSION_UPDATED, { ...this.getAnalyticsParams(), - ...this.withBlockaidMetricsParams(), + ...getBlockaidTransactionMetricsParams(this.props.transaction), }, ); return this.setState({ isReadyToApprove: true }); diff --git a/app/util/blockaid/index.test.ts b/app/util/blockaid/index.test.ts index 1e8aecd8803..c76a243d9fd 100644 --- a/app/util/blockaid/index.test.ts +++ b/app/util/blockaid/index.test.ts @@ -7,9 +7,72 @@ import { import * as NetworkControllerMock from '../../selectors/networkController'; import { NETWORKS_CHAIN_ID } from '../../constants/network'; -import { getBlockaidMetricsParams, isBlockaidSupportedOnCurrentChain } from '.'; +import { + getBlockaidMetricsParams, + isBlockaidSupportedOnCurrentChain, + getBlockaidTransactionMetricsParams, +} from '.'; describe('Blockaid util', () => { + describe('getBlockaidTransactionMetricsParams', () => { + beforeEach(() => { + jest + .spyOn(NetworkControllerMock, 'selectChainId') + .mockReturnValue(NETWORKS_CHAIN_ID.MAINNET); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('returns empty object when transaction id does not match security response id', () => { + const transaction = { + id: 1, + currentTransactionSecurityAlertResponse: { + id: 2, + response: { + result_type: ResultType.Malicious, + reason: Reason.notApplicable, + providerRequestsCount: { + eth_call: 5, + eth_getCode: 3, + }, + features: [], + }, + }, + }; + const result = getBlockaidTransactionMetricsParams(transaction); + expect(result).toStrictEqual({}); + }); + + it('returns metrics params object when transaction id matches security response id', () => { + const transaction = { + id: 1, + currentTransactionSecurityAlertResponse: { + id: 1, + response: { + result_type: ResultType.Malicious, + reason: Reason.notApplicable, + providerRequestsCount: { + eth_call: 5, + eth_getCode: 3, + }, + features: [], + }, + }, + }; + + const result = getBlockaidTransactionMetricsParams(transaction); + expect(result).toEqual({ + ui_customizations: ['flagged_as_malicious'], + security_alert_response: ResultType.Malicious, + security_alert_reason: Reason.notApplicable, + ppom_eth_call_count: 5, + ppom_eth_getCode_count: 3, + }); + }); + }); + describe('getBlockaidMetricsParams', () => { beforeEach(() => { jest @@ -26,7 +89,7 @@ describe('Blockaid util', () => { expect(result).toStrictEqual({}); }); - it('returns enpty object when chain id is not in supported chain ids list', () => { + it('returns empty object when chain id is not in supported chain ids list', () => { jest.spyOn(NetworkControllerMock, 'selectChainId').mockReturnValue('10'); const result = getBlockaidMetricsParams(undefined); expect(result).toStrictEqual({}); diff --git a/app/util/blockaid/index.ts b/app/util/blockaid/index.ts index 250c720b302..eb2019cd7dd 100644 --- a/app/util/blockaid/index.ts +++ b/app/util/blockaid/index.ts @@ -5,6 +5,17 @@ import { import { BLOCKAID_SUPPORTED_CHAIN_IDS, getDecimalChainId } from '../networks'; import { store } from '../../store'; import { selectChainId } from '../../selectors/networkController'; +import type { TransactionMeta } from '@metamask/transaction-controller'; + +interface TransactionSecurityAlertResponseType { + currentTransactionSecurityAlertResponse: { + id: string; + response: SecurityAlertResponse; + }; +} + +export type TransactionType = TransactionMeta & + TransactionSecurityAlertResponseType; export const isSupportedChainId = (chainId: string) => { /** @@ -67,3 +78,19 @@ export const getBlockaidMetricsParams = ( return additionalParams; }; + +export const getBlockaidTransactionMetricsParams = ( + transaction: TransactionType, +) => { + let blockaidParams = {}; + + if ( + transaction?.id === transaction?.currentTransactionSecurityAlertResponse?.id + ) { + blockaidParams = getBlockaidMetricsParams( + transaction.currentTransactionSecurityAlertResponse?.response, + ); + } + + return blockaidParams; +};