Core Concepts

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:

  1. Uppercase ASCII letters are lowercased.
  2. Separators and punctuation — spaces, -, _, ., !, $ and friends — are stripped entirely.
  3. Numeric leetspeak digits are folded to the letter they imitate (table below).
  4. Any non-ASCII byte (unicode look-alikes, emoji, accented letters) causes the launch to revert with NonAsciiName.

Leetspeak folding table

DigitFolds to
0o
1i
3e
4a
5s
7t
8b

Digits 2, 6 and 9 have no common letter form, so they are kept as-is.

all collapse to → robinhood
Robinhood
robin hood
ROBINHOOD!!!
R0b1n-H00d
r.o.b.i.n.h.o.o.d
Note.Symbols are not symbol-folded — only digit-folded and stripped — so a ticker like HOOD! 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 Latin o).
  • Deterministic & pure. canonicalName(string) is a pure view — 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:

bash
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).