Found while implementing #306. Not in that issue's definition of done, so left untouched.
The dApp approval screen labels anything outside the 512-entry bundled list as Unknown token, even when the symbol is already available from state.trackedTokens or from the address's own explorer-reported tokenBalances. resolveSymbol() in src/shared/tokenList.js exists for exactly this lookup and is not consulted here.
Consequence is UX, not safety: a user is shown "Unknown token" for a token they added themselves and hold a balance of, which trains them to disregard the label — and the label is one of the signals that ought to distinguish a familiar token from an attacker's.
Note the ordering constraint: #306 added the same three-source resolution chain for decimals (src/shared/approvalAmount.js). The symbol should reuse that chain rather than introduce a second one with its own precedence, so land this after #306.
Definition of done
The approval screen resolves the token symbol from the bundled list, then state.trackedTokens, then the address's explorer-reported entry — the same precedence and, where practical, the same code path as the decimals resolution.
Unknown token is shown only when no source knows the symbol, and continues to be shown in that case rather than guessing.
A symbol from an untrusted source is still subject to the existing spoof rule in src/shared/symbolSpoof.js — resolving a symbol must not create a new way to claim a bundled ticker.
Test covers: bundled token, tracked-only token, explorer-only token, and genuinely unknown token.
make check green.
Found while implementing https://git.eeqj.de/sneak/AutistMask/issues/306. Not in that issue's definition of done, so left untouched.
The dApp approval screen labels anything outside the 512-entry bundled list as `Unknown token`, even when the symbol is already available from `state.trackedTokens` or from the address's own explorer-reported `tokenBalances`. `resolveSymbol()` in `src/shared/tokenList.js` exists for exactly this lookup and is not consulted here.
Consequence is UX, not safety: a user is shown "Unknown token" for a token they added themselves and hold a balance of, which trains them to disregard the label — and the label is one of the signals that ought to distinguish a familiar token from an attacker's.
Note the ordering constraint: https://git.eeqj.de/sneak/AutistMask/issues/306 added the same three-source resolution chain for **decimals** (`src/shared/approvalAmount.js`). The symbol should reuse that chain rather than introduce a second one with its own precedence, so land this after #306.
## Definition of done
- [ ] The approval screen resolves the token symbol from the bundled list, then `state.trackedTokens`, then the address's explorer-reported entry — the same precedence and, where practical, the same code path as the decimals resolution.
- [ ] `Unknown token` is shown only when no source knows the symbol, and continues to be shown in that case rather than guessing.
- [ ] A symbol from an untrusted source is still subject to the existing spoof rule in `src/shared/symbolSpoof.js` — resolving a symbol must not create a new way to claim a bundled ticker.
- [ ] Test covers: bundled token, tracked-only token, explorer-only token, and genuinely unknown token.
- [ ] `make check` green.
Fold this in — same cause, and it now reads worse than before.
pendingTxDetails.token stays "ETH" for a non-bundled ERC-20, so src/popup/views/txStatus.js:84 renders the wait summary as:
5000000000 base units (decimals unknown) ETH
Pre-existing and not introduced by #306 — the old code produced 5000.0000 ETH for the same case, which was wrong in a quieter way. Naming an ERC-20 transfer as ETH on a status screen is the same missing symbol resolution this issue is about, so the DoD here should cover pendingTxDetails.token and the status screens, not only the approval screen.
Fold this in — same cause, and it now reads worse than before.
`pendingTxDetails.token` stays `"ETH"` for a non-bundled ERC-20, so `src/popup/views/txStatus.js:84` renders the wait summary as:
```
5000000000 base units (decimals unknown) ETH
```
Pre-existing and not introduced by https://git.eeqj.de/sneak/AutistMask/pulls/306 — the old code produced `5000.0000 ETH` for the same case, which was wrong in a quieter way. Naming an ERC-20 transfer as ETH on a status screen is the same missing symbol resolution this issue is about, so the DoD here should cover `pendingTxDetails.token` and the status screens, not only the approval screen.
Folded in from #354: tokenInfo() and tokenLabel() in src/shared/uniswap.js resolve from the bundled list only, so the swap lines have the same gap as the ERC-20 line. One resolution chain, used by both.
model: claude-fable-5
Folded in from https://git.eeqj.de/sneak/AutistMask/issues/354: `tokenInfo()` and `tokenLabel()` in `src/shared/uniswap.js` resolve from the bundled list only, so the swap lines have the same gap as the ERC-20 line. One resolution chain, used by both.
model: claude-fable-5
clawbot
added this to the 1.0.0 milestone 2026-09-21 09:20:00 +02:00
The approval screen and the wait/success/error status screens now resolve a token's symbol through one chain — the bundled list, then the tokens you track, then the block explorer's report — the same sources and precedence the amount line already used for the token's scale. A token you added by hand, or hold a balance of, is named instead of shown as Unknown token, and a non-bundled ERC-20 is no longer carried onto the wait screen as ETH. The Uniswap swap lines use the same chain. A tracked or explorer-reported name stays subject to the spoof rule in src/shared/symbolSpoof.js, so it cannot claim a bundled or native ticker.
Done in https://git.eeqj.de/sneak/AutistMask/pulls/394.
The approval screen and the wait/success/error status screens now resolve a token's symbol through one chain — the bundled list, then the tokens you track, then the block explorer's report — the same sources and precedence the amount line already used for the token's scale. A token you added by hand, or hold a balance of, is named instead of shown as `Unknown token`, and a non-bundled ERC-20 is no longer carried onto the wait screen as `ETH`. The Uniswap swap lines use the same chain. A tracked or explorer-reported name stays subject to the spoof rule in `src/shared/symbolSpoof.js`, so it cannot claim a bundled or native ticker.
Also covers https://git.eeqj.de/sneak/AutistMask/issues/354 (folded in).
Model: opus-4-8
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Found while implementing #306. Not in that issue's definition of done, so left untouched.
The dApp approval screen labels anything outside the 512-entry bundled list as
Unknown token, even when the symbol is already available fromstate.trackedTokensor from the address's own explorer-reportedtokenBalances.resolveSymbol()insrc/shared/tokenList.jsexists for exactly this lookup and is not consulted here.Consequence is UX, not safety: a user is shown "Unknown token" for a token they added themselves and hold a balance of, which trains them to disregard the label — and the label is one of the signals that ought to distinguish a familiar token from an attacker's.
Note the ordering constraint: #306 added the same three-source resolution chain for decimals (
src/shared/approvalAmount.js). The symbol should reuse that chain rather than introduce a second one with its own precedence, so land this after #306.Definition of done
state.trackedTokens, then the address's explorer-reported entry — the same precedence and, where practical, the same code path as the decimals resolution.Unknown tokenis shown only when no source knows the symbol, and continues to be shown in that case rather than guessing.src/shared/symbolSpoof.js— resolving a symbol must not create a new way to claim a bundled ticker.make checkgreen.Fold this in — same cause, and it now reads worse than before.
pendingTxDetails.tokenstays"ETH"for a non-bundled ERC-20, sosrc/popup/views/txStatus.js:84renders the wait summary as:Pre-existing and not introduced by #306 — the old code produced
5000.0000 ETHfor the same case, which was wrong in a quieter way. Naming an ERC-20 transfer as ETH on a status screen is the same missing symbol resolution this issue is about, so the DoD here should coverpendingTxDetails.tokenand the status screens, not only the approval screen.Folded in from #354:
tokenInfo()andtokenLabel()insrc/shared/uniswap.jsresolve from the bundled list only, so the swap lines have the same gap as the ERC-20 line. One resolution chain, used by both.model: claude-fable-5
Done in #394.
The approval screen and the wait/success/error status screens now resolve a token's symbol through one chain — the bundled list, then the tokens you track, then the block explorer's report — the same sources and precedence the amount line already used for the token's scale. A token you added by hand, or hold a balance of, is named instead of shown as
Unknown token, and a non-bundled ERC-20 is no longer carried onto the wait screen asETH. The Uniswap swap lines use the same chain. A tracked or explorer-reported name stays subject to the spoof rule insrc/shared/symbolSpoof.js, so it cannot claim a bundled or native ticker.Also covers #354 (folded in).
Model: opus-4-8