fix: the wallet's own send shows its amount to four decimal places (closes #522)
ConfirmTx and the wait, success and error screens printed Send's amount field as it stood (`.5 ETH`, or every digit Max filled in); TxApproval shows `0.5000 ETH`. ConfirmTx now writes the amount as TxApproval does: parsed at the scale it is encoded with, written back as plain decimal text and cut by truncateAmountNeverZero(), and hands the status screens a copy carrying that text. A token whose scale is unknown, which cannot be sent, has the field's text cut the same way. The transaction is still signed for the exact amount, which also prices the USD value. A saved confirmation screen whose amount is not text is no longer redrawn. Model: opus-5-5
This commit was merged in pull request #613.
This commit is contained in:
@@ -1082,23 +1082,29 @@ The rule and its exception live in `src/shared/amountDisplay.js` as
|
||||
confirmation screens display goes through the floored one — the ERC-20 amount,
|
||||
the ETH value and max fee (`src/popup/views/approval.js`), the swap's `Amount`
|
||||
and `Min. received` lines (`src/shared/uniswap.js`), the Send screen's
|
||||
`Current balance` (`src/popup/views/send.js`), and the balance and network fee
|
||||
on the confirmation screen for the wallet's own send
|
||||
(`src/popup/views/confirmTx.js`). Both screens render a network fee through
|
||||
`formatFee()` in `src/popup/views/helpers.js`, which prices the exact fee in USD
|
||||
rather than its truncated figure, so the same fee reads the same on both, USD
|
||||
value included. Balances are stored exactly (`src/shared/balances.js`), whatever
|
||||
decimals a token declares, so a balance below the floor reaches these screens as
|
||||
it is. The history list (`src/shared/transactions.js`) uses the unfloored one:
|
||||
the transaction detail view is the authoritative record and already shows exact
|
||||
precision. The balance lists use neither: they round to four places with
|
||||
`toFixed(4)` (`balanceLine()` in `src/popup/views/helpers.js`). The 4-decimal
|
||||
rule is unchanged everywhere else, including for amounts at or above the floor
|
||||
on the approval screens.
|
||||
`Current balance` (`src/popup/views/send.js`), and the amount, balance and
|
||||
network fee on the confirmation screen for the wallet's own send
|
||||
(`src/popup/views/confirmTx.js`), which hands the wait, success and error
|
||||
screens the amount as it showed it. The transaction is still signed for the
|
||||
exact amount, and its USD value is priced from it. Both screens render a network
|
||||
fee through `formatFee()` in `src/popup/views/helpers.js`, which prices the
|
||||
exact fee in USD rather than its truncated figure, so the same fee reads the
|
||||
same on both, USD value included. Balances are stored exactly
|
||||
(`src/shared/balances.js`), whatever decimals a token declares, so a balance
|
||||
below the floor reaches these screens as it is. The history list
|
||||
(`src/shared/transactions.js`) uses the unfloored one: the transaction detail
|
||||
view is the authoritative record and already shows exact precision. The balance
|
||||
lists use neither: they round to four places with `toFixed(4)` (`balanceLine()`
|
||||
in `src/popup/views/helpers.js`). The 4-decimal rule is unchanged everywhere
|
||||
else, including for amounts at or above the floor on the approval screens.
|
||||
|
||||
The floor applies only where the token's scale is known. Where it is not, the
|
||||
approval screen states base units instead of a quantity — see Unknown token
|
||||
scale below — and no truncation happens at all.
|
||||
On the approval screen and the wait, success and error screens that carry its
|
||||
amount forward, the floor applies only where the token's scale is known. Where
|
||||
it is not, they state base units instead of a quantity — see Unknown token scale
|
||||
below — and no truncation happens at all. On ConfirmTx and the wait, success and
|
||||
error screens that follow it, the amount of a token whose scale is unknown,
|
||||
which cannot be sent, is the text from Send's amount field cut to four decimals
|
||||
with the same floor (`.5` reads `.5000`).
|
||||
|
||||
**Specific Exception — unknown token scale:** Calldata carries base units and no
|
||||
scale, so every amount on the dApp approval screen needs the token's `decimals`.
|
||||
@@ -1763,14 +1769,18 @@ view would leave a wallet one click from deletion.
|
||||
- Token contract: full address + etherscan link (ERC-20 only)
|
||||
- From: blockie + color dot + full address + etherscan link + wallet title
|
||||
- To: blockie + color dot + full address + etherscan link + ENS name
|
||||
- Amount: value + symbol (USD in parentheses). An ETH amount Send's "Max"
|
||||
filled in is worked out again from this screen's own fee estimate when it
|
||||
arrives, as the balance minus the reserve, and the transaction is signed
|
||||
with that estimate's fee fields, so a fee fetched again at signing cannot
|
||||
exceed what the amount leaves behind. The address keeps whatever part of
|
||||
the reserve the transaction does not use. If the balance could not be read
|
||||
or no longer covers the fee, the amount is left as it was and one of the
|
||||
errors below blocks the send
|
||||
- Amount: value + symbol (USD in parentheses), the value to four decimal
|
||||
places with the nonzero floor, as on TxApproval (see Display Consistency),
|
||||
however Send's amount field wrote it (`.5` and `0.5` both read `0.5000`).
|
||||
For a token whose scale is unknown, which cannot be sent, the value is the
|
||||
text from Send's amount field cut the same way (`.5` reads `.5000`). An
|
||||
ETH amount Send's "Max" filled in is worked out again from this screen's
|
||||
own fee estimate when it arrives, as the balance minus the reserve, and
|
||||
the transaction is signed with that estimate's fee fields, so a fee
|
||||
fetched again at signing cannot exceed what the amount leaves behind. The
|
||||
address keeps whatever part of the reserve the transaction does not use.
|
||||
If the balance could not be read or no longer covers the fee, the amount
|
||||
is left as it was and one of the errors below blocks the send
|
||||
- Your balance: the From address's balance on the network its transaction
|
||||
was reviewed on, read from that network's RPC endpoint each time the
|
||||
screen is shown, so a screen the popup reopens onto states and checks that
|
||||
@@ -2350,9 +2360,11 @@ view would leave a wallet one click from deletion.
|
||||
- From: color dot + full address + etherscan link
|
||||
- Contract: color dot + full address + etherscan link, token symbol label if
|
||||
known; for a contract creation, the same sentence as on WaitTx
|
||||
- Value: amount in ETH (4 decimal places, USD in parentheses)
|
||||
- Network fee (max): gas limit × fee per gas in ETH (4 decimal places, USD
|
||||
in parentheses), with the gas limit and the fee per gas in gwei below it
|
||||
- Value: amount in ETH (4 decimal places with the nonzero floor, USD in
|
||||
parentheses)
|
||||
- Network fee (max): gas limit × fee per gas in ETH (4 decimal places with
|
||||
the nonzero floor, USD in parentheses), with the gas limit and the fee per
|
||||
gas in gwei below it
|
||||
- Network and nonce
|
||||
- Raw data: full calldata displayed inline (shown if present)
|
||||
- Password input and an error line
|
||||
|
||||
Reference in New Issue
Block a user