Name rules
Every name and symbol is reduced to a canonical fingerprint. Two launches that fingerprint to the same value can never both exist — that's the whole point of the launchpad.
Why canonicalize at all
The promise is one meme, one token. If we only compared raw strings, Robinhood, robin hood and R0b1n-H00d would each be treated as a different coin — exactly the vamp problem we set out to kill. So before the registry check, the contract folds cosmetic variation away and compares the result.
The canonicalization pipeline
Both the name and the symbol run through NameLib.canonicalize on-chain, in this order:
- Uppercase ASCII letters are lowercased.
- Separators and punctuation — spaces,
-,_,.,!,$and friends — are stripped entirely. - Numeric leetspeak digits are folded to the letter they imitate (table below).
- Any non-ASCII byte (unicode look-alikes, emoji, accented letters) causes the launch to revert with
NonAsciiName.
Leetspeak folding table
| Digit | Folds to |
|---|---|
| 0 | o |
| 1 | i |
| 3 | e |
| 4 | a |
| 5 | s |
| 7 | t |
| 8 | b |
Digits 2, 6 and 9 have no common letter form, so they are kept as-is.
Robinhood
robin hood
ROBINHOOD!!!
R0b1n-H00d
r.o.b.i.n.h.o.o.dHOOD! canonicalizes to hood, but the decorative $ or ! never changes letters.Deliberate design choices
- Aggressive on purpose. We would rather reject a borderline-original name than let a near-copy of an existing OG slip through.
- ASCII only. Rejecting non-ASCII closes the unicode homoglyph attack (e.g. a Cyrillic
оthat looks like a Latino). - Deterministic & pure.
canonicalName(string)is apureview — you can call it off-chain to preview a fingerprint without spending gas.
Check before you launch
Use the API or a direct contract read to see how a name resolves and whether it's free:
curl "http://5.9.115.219:2442/api/v1/names/check?name=R0b1n-H00d&symbol=HOOD"
# { "name": { "canonical": "robinhood", "available": false },
# "symbol": { "canonical": "hood", "available": false } }On-chain, the equivalent reads are isNameAvailable(name), isSymbolAvailable(symbol) and canonicalName(name).