Skip to content

Commit ecd5239

Browse files
fix: asset value metric in metamask pay (#22645)
## **Description** Fix the generation of the `simulation_sending_assets_total_value` property by reading it from the required tokens. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: #6245 ## **Manual testing steps** ## **Screenshots/Recordings** ### **Before** ### **After** ## **Pre-merge author checklist** - [x] I’ve followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I’ve included tests if applicable - [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Compute `simulation_sending_assets_total_value` from required tokens instead of `useTokenAmount`, updating hook logic and tests accordingly. > > - **Metrics hook (`useTransactionPayMetrics`)**: > - Replace `useTokenAmount` with `useTransactionPayRequiredTokens` to derive primary required token and compute `sendingValue` from `amountHuman`. > - Set `simulation_sending_assets_total_value` for `perps_deposit` and `predict_deposit` using the derived numeric value. > - Keep existing quote, fee, strategy, and dust metrics logic intact. > - **Tests (`useTransactionPayMetrics.test.ts`)**: > - Mock `useTransactionPayRequiredTokens` and expect numeric `simulation_sending_assets_total_value` (e.g., `1.23`). > - Remove reliance on `useTokenAmount`; adjust mocks and expectations for quotes/steps, dust, token list size, and fees. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 4d1b8fd. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
1 parent ab9c5f2 commit ecd5239

File tree

2 files changed

+18
-11
lines changed

2 files changed

+18
-11
lines changed

app/components/Views/confirmations/hooks/pay/useTransactionPayMetrics.test.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,19 @@ import {
1111
tokenAddress1Mock,
1212
} from '../../__mocks__/controllers/other-controllers-mock';
1313
import { useTransactionPayToken } from './useTransactionPayToken';
14-
import { useTokenAmount } from '../useTokenAmount';
1514
import { act } from '@testing-library/react-native';
1615
import { updateConfirmationMetric } from '../../../../../core/redux/slices/confirmationMetrics';
1716
import { TransactionType } from '@metamask/transaction-controller';
1817
import { useAutomaticTransactionPayToken } from './useAutomaticTransactionPayToken';
1918
import {
2019
TransactionPayQuote,
20+
TransactionPayRequiredToken,
2121
TransactionPayStrategy,
2222
} from '@metamask/transaction-pay-controller';
2323
import { Json } from '@metamask/utils';
2424
import {
2525
useTransactionPayQuotes,
26+
useTransactionPayRequiredTokens,
2627
useTransactionPayTotals,
2728
} from './useTransactionPayData';
2829

@@ -72,10 +73,12 @@ function runHook({ type }: { type?: TransactionType } = {}) {
7273

7374
describe('useTransactionPayMetrics', () => {
7475
const useTransactionPayTokenMock = jest.mocked(useTransactionPayToken);
75-
const useTokenAmountMock = jest.mocked(useTokenAmount);
7676
const updateConfirmationMetricMock = jest.mocked(updateConfirmationMetric);
7777
const useTransactionPayQuotesMock = jest.mocked(useTransactionPayQuotes);
7878
const useTransactionPayTotalsMock = jest.mocked(useTransactionPayTotals);
79+
const useTransactionPayRequiredTokensMock = jest.mocked(
80+
useTransactionPayRequiredTokens,
81+
);
7982

8083
const useAutomaticTransactionPayTokenMock = jest.mocked(
8184
useAutomaticTransactionPayToken,
@@ -89,9 +92,11 @@ describe('useTransactionPayMetrics', () => {
8992
setPayToken: noop as never,
9093
});
9194

92-
useTokenAmountMock.mockReturnValue({
93-
amountPrecise: TOKEN_AMOUNT_MOCK,
94-
} as ReturnType<typeof useTokenAmount>);
95+
useTransactionPayRequiredTokensMock.mockReturnValue([
96+
{
97+
amountHuman: TOKEN_AMOUNT_MOCK,
98+
} as TransactionPayRequiredToken,
99+
]);
95100

96101
updateConfirmationMetricMock.mockReturnValue({
97102
type: 'test',
@@ -192,7 +197,7 @@ describe('useTransactionPayMetrics', () => {
192197
params: {
193198
properties: expect.objectContaining({
194199
mm_pay_use_case: 'perps_deposit',
195-
simulation_sending_assets_total_value: TOKEN_AMOUNT_MOCK,
200+
simulation_sending_assets_total_value: 1.23,
196201
}),
197202
sensitiveProperties: {},
198203
},
@@ -220,7 +225,7 @@ describe('useTransactionPayMetrics', () => {
220225
params: {
221226
properties: expect.objectContaining({
222227
mm_pay_use_case: 'predict_deposit',
223-
simulation_sending_assets_total_value: TOKEN_AMOUNT_MOCK,
228+
simulation_sending_assets_total_value: 1.23,
224229
}),
225230
sensitiveProperties: {},
226231
},

app/components/Views/confirmations/hooks/pay/useTransactionPayMetrics.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ import { Hex, Json } from '@metamask/utils';
77
import { TransactionType } from '@metamask/transaction-controller';
88
import { useTransactionPayToken } from './useTransactionPayToken';
99
import { BridgeToken } from '../../../../UI/Bridge/types';
10-
import { useTokenAmount } from '../useTokenAmount';
1110
import { useAutomaticTransactionPayToken } from './useAutomaticTransactionPayToken';
1211
import { getNativeTokenAddress } from '../../utils/asset';
1312
import { hasTransactionType } from '../../utils/transaction';
1413
import {
1514
useTransactionPayQuotes,
15+
useTransactionPayRequiredTokens,
1616
useTransactionPayTotals,
1717
} from './useTransactionPayData';
1818
import { TransactionPayStrategy } from '@metamask/transaction-pay-controller';
@@ -22,7 +22,7 @@ export function useTransactionPayMetrics() {
2222
const dispatch = useDispatch();
2323
const transactionMeta = useTransactionMetadataRequest();
2424
const { payToken } = useTransactionPayToken();
25-
const { amountPrecise } = useTokenAmount();
25+
const requiredTokens = useTransactionPayRequiredTokens();
2626
const automaticPayToken = useRef<BridgeToken>();
2727
const quotes = useTransactionPayQuotes();
2828
const totals = useTransactionPayTotals();
@@ -33,6 +33,8 @@ export function useTransactionPayMetrics() {
3333

3434
const transactionId = transactionMeta?.id ?? '';
3535
const { chainId, type } = transactionMeta ?? {};
36+
const primaryRequiredToken = requiredTokens.find((t) => !t.skipIfBalance);
37+
const sendingValue = Number(primaryRequiredToken?.amountHuman ?? '0');
3638

3739
if (!automaticPayToken.current && payToken) {
3840
automaticPayToken.current = payToken;
@@ -61,15 +63,15 @@ export function useTransactionPayMetrics() {
6163

6264
if (payToken && type === TransactionType.perpsDeposit) {
6365
properties.mm_pay_use_case = 'perps_deposit';
64-
properties.simulation_sending_assets_total_value = amountPrecise ?? null;
66+
properties.simulation_sending_assets_total_value = sendingValue;
6567
}
6668

6769
if (
6870
payToken &&
6971
hasTransactionType(transactionMeta, [TransactionType.predictDeposit])
7072
) {
7173
properties.mm_pay_use_case = 'predict_deposit';
72-
properties.simulation_sending_assets_total_value = amountPrecise ?? null;
74+
properties.simulation_sending_assets_total_value = sendingValue;
7375
}
7476

7577
const nativeTokenAddress = getNativeTokenAddress(chainId as Hex);

0 commit comments

Comments
 (0)