MetaMask / MetaMask/metamask-extension

[Bug]: Send screen converts USD to ETH at a rate ~23% below the wallet's own home screen, causing users to send ~30% more than the amount typed

Open
#46,083 2 comments 0 reactions 0 assignees View on GitHub
external-contributor INVALID-ISSUE-TEMPLATE needs-reproduction regression-prod-13.46.1 Sev2-normal ta-needs-engineer-escalation ta-triaged team-confirmations type-bug
Dominant language
TypeScript
Stars
13.2k
Forks
5.6k
Avg merge
2d 5h
Merged PRs (30d)
451

Description

**Describe the bug**

When the Send flow's amount field is set to USD, the fiat-to-ETH conversion uses a price roughly 23% lower than the price the same extension displays on its own home screen at the same moment. The ETH amount actually sent is therefore about 1.30x the fiat amount the user typed.

The discrepancy is consistent through the entire flow: the amount field, the "available" balance on the send screen, and the confirmation screen all use the low rate. At no point before signing is the correct fiat value shown. Because the transaction is irreversible, this is a silent overpayment with no recovery path.

## Steps to reproduce

Fund an account with ETH on Base, then note the fiat value shown for the balance on the account home screen. Click Send and set the amount field to USD using the toggle. Compare the "available" figure on the send screen against the home screen value for the same balance. Type a USD amount, continue to the confirmation screen, confirm, then look up the resulting transaction on a block explorer.

## Observed

All within the same minute, same account, Base network:

| Surface | Fiat shown for 0.000524434938761553 ETH | Implied ETH price |
| --- | --- | --- |
| Home screen (Tokens list) | $1.29 | ~$2,455 |
| Send screen, USD mode, "available" | $0.99 | ~$1,888 |

BaseScan independently valued the same balance at $1.29 (@ $2,453.97/ETH), agreeing with the home screen. The send screen is the outlier.

Confirmed on-chain transaction from an earlier leg of the same test:

| Field | Value |
| --- | --- |
| Tx hash | 0x975fe8b50884251317168ff92240b684656f5090a7717aba3f73b166b2dcdf1a |
| Network | Base, block 50873313 |
| Typed into Send screen | $1.00 USD |
| Actually sent | 0.000524434938761553 ETH |
| Value per BaseScan | $1.29 |

$1.00 divided by 0.000524434938761553 ETH implies an ETH price of about $1,907 inside the send flow, against about $2,455 everywhere else.

## Reproducibility

Reproduced twice, roughly 40 minutes apart, on two different accounts derived from the same seed, both on Base. Not a transient glitch.

## Impact

The error runs in the direction that costs the user money, and it scales linearly with the amount:

| User types | ETH sent is actually worth |
| --- | --- |
| $10 | ~$13 |
| $100 | ~$130 |
| $1,000 | ~$1,300 |

The confirmation screen repeats the incorrect fiat figure, so reading carefully does not catch it. Nothing in the flow displays the true value before signing, and the transaction cannot be reversed. The Max button appears unaffected, since it operates in ETH terms.

## Workaround

Set the amount field to ETH rather than USD before entering an amount.

**Expected behavior**

The Send screen's USD conversion should use the same price as the extension's own home screen, and as public market data. Typing 1 with USD selected should send approximately $1.00 worth of ETH, not $1.29.

**Screenshots/Recordings**

Image
Image
Image
Image

**Steps to reproduce**

Fund an account with ETH on the Base network. Note the fiat value shown for the balance on the account home screen. Click Send, then set the amount field to USD using the toggle. Compare the "available" figure on the send screen against the home screen value for the same balance: they differ by roughly 23%. Type a USD amount and continue to the confirmation screen, which repeats the low figure. Confirm, then look up the transaction on a block explorer to see the true value of the ETH that was sent.

**Error messages or log output**

```shell

```

**Where was this bug found?**

Live version (from official store)

**Version**

13.46.1

**Build type**

None

**Browser**

Chrome

**Operating system**

Windows

Contributor guide

Open the contributing guide

Research direction

Start by reproducing the Send flow in USD mode on Base using version 13.46.1, then compare its available and confirmation values with the home screen for the same balance. Trace where each surface gets its ETH price and verify that entering $1 produces approximately $1 of ETH before signing; confirm the fix with a matching on-chain valuation.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
blockchain, frontend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
52/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.