fix: judge the symbol a user sees, not the bytes a contract returns (closes #260)
All checks were successful
check / check (push) Successful in 40s

A token whose symbol is " ETH " missed KNOWN_SYMBOLS on all three surfaces
while HTML collapsed the padding and painted it as ETH next to the user's
real ETH. isSpoofedSymbol() now normalizes before the lookup: NFKC, every
Unicode format character removed wherever it sits, then trimmed, then
uppercased. All three surfaces inherit it unchanged.

Covered: ASCII and Unicode whitespace padding, zero-width and other
invisible format characters, and compatibility variants such as fullwidth
letters. Knowingly left open, and asserted as open in the suite: confusables
that are distinct letters (Cyrillic capital Ie), bidi reordering, and
interior whitespace, which renders differently and so is not the confusion.

No symbol in KNOWN_SYMBOLS or the bundled token list contains whitespace or
a non-ASCII character, so nothing legitimate is newly filtered; a test walks
the whole table and asserts it.

The balance list's token-type gate is now case-insensitive. It compared
exactly, so an explorer writing "erc-20" would silently drop a real holding
before any filter ran. Which types are admitted is unchanged.
This commit is contained in:
2026-08-12 09:48:42 +00:00
parent 5af89a1b63
commit 13bf482327
4 changed files with 275 additions and 2 deletions

11
TODO.md
View File

@@ -44,6 +44,17 @@ undefined identifiers, which is how
# Completed Steps
- 2026-08-12: The known-symbol spoof rule now judges the symbol a user actually
sees. `isSpoofedSymbol()` normalizes before the lookup — NFKC, then every
Unicode format character removed, then trimmed — so `" ETH "`, a no-break
space, a zero-width space and a fullwidth `` are all caught on the
balance list, the history and the send selector at once. Confusables that are
distinct letters (Cyrillic `Е`) and bidi reordering stay knowingly open and
are asserted as open in the suite. No bundled symbol contains whitespace or a
non-ASCII character, so nothing legitimate is newly filtered; the balance
list's token-type gate also became case-insensitive, which no longer drops a
real holding if an explorer writes `erc-20`
([#260](https://git.eeqj.de/sneak/AutistMask/issues/260)).
- 2026-08-12: The transaction confirmation screen has browser coverage. The
end-to-end suite reaches ConfirmTx for both the native ETH and the ERC-20 path
off a funded-balance fixture, and asserts the pending, funded, over-balance