Safety

Risks — spoofing and phishing

An emoji name service has an attack surface a text one does not. Here is exactly what we block, what we warn about, the measured numbers, and what we still cannot fix.

Read this page before you buy a name and before you send funds to one.

The threat, stated precisely

In a text name service the enemy is the homoglyph: paypal.eth versus pаypal.eth with a Cyrillic а. In an emoji name service the problem is worse in one specific way and better in another.

Worse: emoji are drawings, and drawings of the same thing look alike on purpose. 😮 and 😯 are different codepoints, different names, different owners — and at 16 pixels in a wallet's send field they are the same picture. A user cannot tell them apart by looking harder.

Better: the namespace is small and enumerable. There are 1,878 registrable characters, not a million Unicode codepoints. That means the look-alike families can be measured rather than guessed at, and the residual risk can be published as a number instead of a reassurance.

1,878registrable characters
37permanently unregistrable
132measured look-alike families
0identical-rendering name pairs

Five tiers, and who enforces each

Where a rule lives matters more than the rule. Names are content-hashed, so anything that changes which names are valid becomes unfixable after the first mainnet mint. The rules are split accordingly.

TierRuleEnforced byChangeable later?
1 · Block37 confusable variants in 10 classes, plus every skin-tone modifierThe contract, in TVMNever 🔒
2 · CanonicaliseOne encoding per rendered name; only RGI emoji and RGI sequencesSigner, pinned by an on-chain policy hashNever 🔒
3 · DetectSkeleton collision against the live registryIndexer / mini-appYes
4 · WarnPer-name risk band, at registration and at send timeWallet / mini-appYes
5 · CleanNothing looks like it

Tiers 1 and 2 are welded shut. Tiers 3 to 5 are deliberately not, because what looks alike is a moving target — new emoji ship every year and vendors redraw the ones that exist. Welding a similarity table to an immutable namespace would guarantee it goes stale.

What "enforced in TVM" buys you The blocked set is checked by a byte scan inside the contract, after the raw name bytes have been proven against the name hash. It does not depend on our signing service being honest or uncompromised. A fully compromised signer can no more mint 🙁 than it can mint 👍🏽.

What is blocked outright

Only the cases where two emoji are genuinely indistinguishable — where no amount of care lets a user tell them apart. Each look-alike class names one survivor up front, and every other member is permanently unregistrable by anyone: public, admin, or a compromised signer.

Ten classes, 37 blocked characters. Examples:

ClassSurvivesBlocked
Hearts❤️
Frowning faces😕🙁 ☹
Surprised faces😮😯 😲 😦 😧
Check marks✔️🗸
Clock faces🕐🕑 … 🕧
Blue / grey hearts💙 🖤🩵 🩶
Moon phases🌑 🌒 🌓 🌔 🌕🌖 🌗 🌘
Different is not blocked A different colour, a different direction, a different gender is a different emoji and stays registrable. 🔴 and 🔵 both live. ➡️ and ⬅️ both live. 🏃‍♂️ and 🏃‍♀️ both live. Blocking those would be censoring the namespace to solve a problem that a warning solves better.

The moon set is the clearest example of the rule being applied honestly: the family is three mirror pairs, and an earlier version of this policy kept both crescents — the most confusable pair in the set — while blocking four phases that are plainly distinct. It was repartitioned. The current split keeps one moon per lit-area level and blocks only the mirrored half, which removes a real collision and blocks one fewer emoji than before.

Skin-tone modifiers are rejected everywhere, so every person emoji has exactly one registrable spelling and 👍 cannot be shadowed by five near-identical variants. All invisible characters are disallowed — zero-width spaces, directional overrides, and every other markless codepoint that could hide inside a name without being seen.

The number that went to zero

The metric that actually matters is homograph multiplicity: given a registered name, how many other registrable names render identically to it?

If that number is greater than zero, the namespace itself is unsafe — no amount of interface warning fixes a name that has a perfect twin.

Name lengthIdentical-rendering alternatives
2 emoji1 (the name itself)
3 emoji1
4 emoji1
5 emoji1
6 emoji1
7 emoji1

One means the name is alone. Every registrable name in this namespace has exactly one spelling, and no other registrable name draws the same picture.

The confusability map

Below "identical" sits "similar", and similar is not something to block — it is something to measure and disclose. The map is derived from Unicode's own character names rather than hand-written, so it does not go stale the moment a new emoji block ships.

Registrable namespace1,878 characters
Look-alike families132
Characters in at least one family469
Share of the namespace in a family24.97%
Characters with no similar neighbour at all1,409
Largest single family29 members (squared buttons: 🅰 🅱 🆎 🆑 …)

So roughly a quarter of the namespace has a visual neighbour, and three quarters is clean. That is the honest shape of the risk. It is not zero and we are not going to present it as zero.

What you will see as a user

Every name carries its own risk band When you register, the interface tells you which family your emoji belong to, how many similar names are possible, and what the nearest look-alikes are. If you are buying a name for a brand, this is the number to look at before you commit — a name from the 1,409 clean characters is materially harder to impersonate than one from a 29-member family.

The check that protects money is the one at send time, not registration — the person who loses funds is the sender, and they never saw the registration flow.

SituationWhat a wallet shows
The name is visually near-identical to another registered nameBlocked — "Visually almost identical to 🔴🔵, which is also registered"
Elevated risk and registered less than 30 days agoWarning — "Registered recently and 99 similar names are possible. Confirm the address"
Elevated risk, established nameNotice — "99 other registrable names could be mistaken for this one"
Clean, or on a verified listNothing

Age is the strongest free signal there is. An impostor name is registered shortly before the campaign that uses it — a name in a crowded visual neighbourhood that appeared last week is the classic setup.

What we still cannot fix

Stated plainly, because a security page that only lists wins is marketing.

Protecting yourself