Skip to content

Warn before the first send to any name service - #6328

Open
j0ntz wants to merge 3 commits into
developfrom
jon/name-service-scam-warning
Open

j0ntz wants to merge 3 commits into
developfrom
jon/name-service-scam-warning

Conversation

@j0ntz

@j0ntz j0ntz commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Description

Asana: Send (Name Services) - Universal Scam Warning

The Send scene showed a scam warning only for FIO handles. Names from ENS, Unstoppable Domains, ZcashNames, Zano aliases and the wallet's own plugin resolved straight to an address with no warning. This PR puts every name through one gate in the address tile.

  • The warning fires when this account has never paid the name at the address it resolves to now. The account's own FIO handles are still skipped.
  • The sent list (SentNames.json) is keyed by service and lower-cased name, and is written after a broadcast, Stealth Send included. Entries in the old FioSentAddresses.json still count as FIO sends.
  • EVM addresses match in either checksum case, since the same name can resolve to the checksummed form on one path and the lower-case form on another. Other address formats must match exactly.
  • The copy is service-neutral and hand-translated in every locale. The FIO-only heuristic that guessed whether a handle copied an address is gone.
  • A name typed for a Swap & Send recipient on another chain goes through the same gate.
  • AddressModal returns the resolved name and service alongside the address. A resolution only counts for the input that started it; before, an address resolved for an earlier name could be submitted for a later input.

Tested on the iOS simulator (frames below): the first ENS and UD sends warn, a real send to vitalik.eth on opBNB reached Transaction Success, the same name then went straight to amount entry with no warning, and the first send to a FIO handle still warns. A Stealth Send of $26.50 ETH to that FIO handle then broadcast through the Houdini private route, and after a relaunch the same handle went straight to amount entry with no warning, which covers both the Stealth recording path and the FIO repeat case. With Polygon picked under Recipient receives on an ETH wallet, entering brad.crypto also raises the warning. On that same Swap & Send path, vitalik.eth (already paid from this account) goes straight to amount entry with no warning.

Follows EdgeApp/edge-react-gui#6319, which covered FIO only.

CHANGELOG

Does this branch warrant an entry to the CHANGELOG?

  • Yes
  • No

Dependencies

none

Requirements

If you have made any visual changes to the GUI. Make sure you have:

  • Tested on iOS device
  • Tested on Android device
  • Tested on small-screen device (iPod Touch)
  • Tested on large-screen device (tablet)

Test evidence

7ce55ce
Warn before the first send to any name
2026-11-07

1. ens first send warns

2. ens send success

3. ens repeat no warning

4. ud first send warns

5. fio first send warns

6. fio stealth first send warns

7. fio stealth send success

8. fio repeat no warning

9. swap send name warns

10. c1 resolved

11. c1 no warning

Note

Medium Risk
Changes the send recipient path and on-disk send history for all name services; mistakes could block sends or skip warnings, but behavior is heavily tested and backward-compatible with legacy FIO records.

Overview
First-send scam warnings now apply to all resolvable names (ENS, Unstoppable Domains, ZcashNames, Zano aliases, FIO, and wallet plugin names), not only FIO handles.

AddressTile2 funnels every resolved name through a single confirmNameSend gate. The user must confirm unless they own the FIO handle, have already sent to that name at the current resolved address, or entered a raw address. Warning strings are service-neutral (warning_sending_to_name_*) across locales; the FIO-specific “looks like an address” copy is removed.

Persistence moves from FIO-only FioSentAddresses.json to SentNames.json, keyed by service and lower-cased name with the addresses paid at send time. Legacy FIO entries still count. After broadcast (including Stealth Send/swap), SendScene2 records accepts via addToSentNames / getAcceptedNameSends, replacing the old FIO helpers.

AddressModal now resolves to AddressModalResult { address, name? } and tags ENS/UD/ZNS resolution with a service. Submit only applies a resolution when it matches the current input (fixes stale resolution from earlier typing). Call sites that only need an address unwrap .address.

Tests broaden AddressTile2 name-warning coverage and add sentNames.test.ts; FioSentAddresses.test.ts is removed.

Reviewed by Cursor Bugbot for commit 7ce55ce. Bugbot is set up for automated code reviews on this repo. Configure here.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a72c435. Configure here.

Comment thread src/components/tiles/AddressTile2.tsx Resolved
@j0ntz
j0ntz force-pushed the jon/name-service-scam-warning branch from a72c435 to 805b85d Compare November 7, 2026 00:12
j0ntz added 3 commits November 6, 2026 17:14
The list of names this account has paid now covers every name service,
keyed by service and lower-cased name, instead of FIO handles only. The
FIO-only list stays readable, so sends recorded before this change still
count.
The modal now resolves with the picked address and, when it turned a
name into that address, the name and its service (unstoppable, ens,
zns or the wallet's own plugin). The send tile needs that to tell a name
from an address.

A resolution now only counts for the input that started it. Before, an
address resolved for an earlier name stayed in state and was submitted
for any later input the resolver did not touch.
Names from every service (FIO, ENS, Unstoppable Domains, ZcashNames,
Zano aliases, and names the wallet's own plugin resolves) now go
through one gate in the address tile. It warns when this account has
never paid the name at the address it resolves to now, and still skips
the account's own FIO handles.

The copy is service-neutral: it says the input is a name, not an
address, names the service, coin and resolved address, and says a name
never converts, bridges or routes funds. The FIO-only heuristic that
guessed whether a handle copied an address is gone.
@j0ntz
j0ntz force-pushed the jon/name-service-scam-warning branch from 805b85d to 7ce55ce Compare November 7, 2026 01:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant