Skip to content

Commit e48b38e

Browse files
fix: cp-7.60.0 fix metamask pay totals (#22829)
## **Description** Fix total calculation when using alternate currencies. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: #22714 ## **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] > Switches to a unified USD fiat formatter across confirmation views, fixes total/fee/balance USD calculations, and updates custom amount logic and tests. > > - **Confirmations UI (fiat display)**: > - Replace `useTransactionPayFiat` with `useFiatFormatter({ currency: 'usd' })` in `predict-claim-footer`, `bridge-fee-row`, `pay-with-row`, and `total-row`. > - Format amounts via `BigNumber` and use USD fields (`.usd`, `balanceUsd`) for totals/fees/balances. > - **Bridge fees**: > - Recalculate fee totals and tooltip breakdown using USD values (provider + sourceNetwork + targetNetwork) and format with USD formatter. > - **Pay With row**: > - Display USD balance using `payToken.balanceUsd` instead of fiat-converted balance. > - **Predict claim footer**: > - Format single-win amount in USD via formatter. > - **Custom amount logic** (`useTransactionCustomAmount`): > - Use token USD rate and direct USD balances; compute percentage amounts from USD balances; update `useTokenBalance` to return USD values. > - Adjust related test expectations (e.g., 43% -> `530.86`). > - **Cleanup**: > - Remove `useTransactionPayFiat` hook and its test. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit e213a26. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
1 parent d47acc1 commit e48b38e

File tree

8 files changed

+21
-169
lines changed

8 files changed

+21
-169
lines changed

app/components/Views/confirmations/components/predict-confirmations/predict-claim-footer/predict-claim-footer.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ import { selectPredictWonPositions } from '../../../../../UI/Predict/selectors/p
2121
import { selectSelectedInternalAccountAddress } from '../../../../../../selectors/accountsController';
2222
import { PredictPosition } from '../../../../../UI/Predict';
2323
import { AlignItems, FlexDirection } from '../../../../../UI/Box/box.types';
24-
import { useTransactionPayFiat } from '../../../hooks/pay/useTransactionPayFiat';
24+
import useFiatFormatter from '../../../../../UI/SimulationDetails/FiatDisplay/useFiatFormatter';
25+
import { BigNumber } from 'bignumber.js';
2526

2627
export interface PredictClaimFooterProps {
2728
onPress: () => void;
@@ -71,13 +72,13 @@ export function PredictClaimFooter({ onPress }: PredictClaimFooterProps) {
7172
}
7273

7374
function SingleWin({ wonPositions }: { wonPositions: PredictPosition[] }) {
74-
const { formatFiat } = useTransactionPayFiat();
75+
const formatFiat = useFiatFormatter({ currency: 'usd' });
7576

7677
const position = wonPositions[0];
7778
const { amount } = position;
7879

7980
const amountFormatted = useMemo(
80-
() => formatFiat(amount),
81+
() => formatFiat(new BigNumber(amount)),
8182
[amount, formatFiat],
8283
);
8384

app/components/Views/confirmations/components/rows/bridge-fee-row/bridge-fee-row.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@ import {
1919
useTransactionPayQuotes,
2020
useTransactionPayTotals,
2121
} from '../../../hooks/pay/useTransactionPayData';
22-
import { useTransactionPayFiat } from '../../../hooks/pay/useTransactionPayFiat';
2322
import { BigNumber } from 'bignumber.js';
2423
import { InfoRowSkeleton, InfoRowVariant } from '../../UI/info-row/info-row';
2524
import AlertRow from '../../UI/info-row/alert-row';
2625
import { RowAlertKey } from '../../UI/info-row/alert-row/constants';
2726
import { useAlerts } from '../../../context/alert-system-context';
27+
import useFiatFormatter from '../../../../../UI/SimulationDetails/FiatDisplay/useFiatFormatter';
2828

2929
export function BridgeFeeRow() {
3030
const transactionMetadata = useTransactionMetadataOrThrow();
31-
const { formatFiat } = useTransactionPayFiat();
31+
const formatFiat = useFiatFormatter({ currency: 'usd' });
3232
const isLoading = useIsTransactionPayLoading();
3333
const quotes = useTransactionPayQuotes();
3434
const totals = useTransactionPayTotals();
@@ -128,7 +128,7 @@ function FeesTooltip({
128128
message: string;
129129
totals: TransactionPayTotals;
130130
}) {
131-
const { formatFiat } = useTransactionPayFiat();
131+
const formatFiat = useFiatFormatter({ currency: 'usd' });
132132

133133
const networkFeeUsd = useMemo(
134134
() =>

app/components/Views/confirmations/components/rows/pay-with-row/pay-with-row.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ import Icon, {
2525
IconName,
2626
IconSize,
2727
} from '../../../../../../component-library/components/Icons/Icon';
28-
import { useTransactionPayFiat } from '../../../hooks/pay/useTransactionPayFiat';
28+
import useFiatFormatter from '../../../../../UI/SimulationDetails/FiatDisplay/useFiatFormatter';
2929

3030
export function PayWithRow() {
3131
const navigation = useNavigation();
3232
const { payToken } = useTransactionPayToken();
33-
const { formatFiat } = useTransactionPayFiat();
33+
const formatFiat = useFiatFormatter({ currency: 'usd' });
3434
const { styles } = useStyles(styleSheet, {});
3535

3636
const {
@@ -46,8 +46,8 @@ export function PayWithRow() {
4646
}, [canEdit, navigation]);
4747

4848
const balanceUsdFormatted = useMemo(
49-
() => formatFiat(new BigNumber(payToken?.balanceFiat ?? '0')),
50-
[formatFiat, payToken?.balanceFiat],
49+
() => formatFiat(new BigNumber(payToken?.balanceUsd ?? '0')),
50+
[formatFiat, payToken?.balanceUsd],
5151
);
5252

5353
if (!payToken) {

app/components/Views/confirmations/components/rows/total-row/total-row.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ import {
1111
useIsTransactionPayLoading,
1212
useTransactionPayTotals,
1313
} from '../../../hooks/pay/useTransactionPayData';
14-
import { useTransactionPayFiat } from '../../../hooks/pay/useTransactionPayFiat';
1514
import { InfoRowSkeleton, InfoRowVariant } from '../../UI/info-row/info-row';
15+
import useFiatFormatter from '../../../../../UI/SimulationDetails/FiatDisplay/useFiatFormatter';
1616

1717
export function TotalRow() {
18-
const { formatFiat } = useTransactionPayFiat();
18+
const formatFiat = useFiatFormatter({ currency: 'usd' });
1919
const isLoading = useIsTransactionPayLoading();
2020
const totals = useTransactionPayTotals();
2121

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

Lines changed: 0 additions & 84 deletions
This file was deleted.

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

Lines changed: 0 additions & 66 deletions
This file was deleted.

app/components/Views/confirmations/hooks/transactions/useTransactionCustomAmount.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ describe('useTransactionCustomAmount', () => {
294294
result.current.updatePendingAmountPercentage(43);
295295
});
296296

297-
expect(result.current.amountFiat).toBe('1061.72');
297+
expect(result.current.amountFiat).toBe('530.86');
298298
});
299299

300300
it('minus buffers if 100', async () => {

app/components/Views/confirmations/hooks/transactions/useTransactionCustomAmount.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import { useSelector } from 'react-redux';
1515
import { selectMetaMaskPayFlags } from '../../../../../selectors/featureFlagController/confirmations';
1616
import { getNativeTokenAddress } from '@metamask/assets-controllers';
1717
import { hasTransactionType } from '../../utils/transaction';
18-
import { useTransactionPayFiat } from '../pay/useTransactionPayFiat';
1918
import { usePredictBalance } from '../../../../UI/Predict/hooks/usePredictBalance';
2019
import { useTransactionPayRequiredTokens } from '../pay/useTransactionPayData';
2120

@@ -161,22 +160,24 @@ function useMaxPercentage() {
161160
}, [chainId, featureFlags, payToken, requiredTokens]);
162161
}
163162

164-
function useTokenBalance(tokenFiatRate: number) {
163+
function useTokenBalance(tokenUsdRate: number) {
165164
const transactionMeta = useTransactionMetadataRequest() as TransactionMeta;
166-
const { convertFiat } = useTransactionPayFiat();
167165

168166
const { payToken } = useTransactionPayToken();
169-
const payTokenBalance = convertFiat(payToken?.balanceUsd ?? 0);
167+
168+
const payTokenBalanceUsd = new BigNumber(
169+
payToken?.balanceUsd ?? 0,
170+
).toNumber();
170171

171172
const { balance: predictBalanceHuman } = usePredictBalance({
172173
loadOnMount: true,
173174
});
174175

175176
const predictBalanceUsd = new BigNumber(predictBalanceHuman ?? '0')
176-
.multipliedBy(tokenFiatRate)
177+
.multipliedBy(tokenUsdRate)
177178
.toNumber();
178179

179180
return hasTransactionType(transactionMeta, [TransactionType.predictWithdraw])
180181
? predictBalanceUsd
181-
: payTokenBalance;
182+
: payTokenBalanceUsd;
182183
}

0 commit comments

Comments
 (0)