For developers

Emoji names — technical overview

How the protocol is put together, what a name costs, what it resolves to today, and the honest state of the integration roadmap.

Why this can exist at all

TON's .ton registry accepts English letters, digits and hyphens. Emoji are excluded, and Telegram usernames use the same restricted set. So an emoji name service cannot be a .ton name.

TON DNS has a permissionless escape hatch. A domain owner can set the record sha256("dns_next_resolver") to any contract address, delegating resolution of every subdomain beneath it to custom logic. Own a parent domain, deploy a TEP-81 resolver under it, and 🚀🌙.<parent>.ton becomes resolvable by any compliant TON client, with nobody's permission.

That is the whole trick. It is not a workaround — it is the standard working as designed.

Architecture

ContractRole
RegistrarThe economic and ownership core. Registration, renewals, auctions, referrals, partner splits, admin. Holds auction escrow.
ResolverTEP-81 dnsresolve. Maps an emoji label to records, byte-exact and root-agnostic. Multiple resolvers can be registered.
NFT collection + itemTEP-62. One tradable NFT per name — the ownership object itself, not a receipt for it.

An off-chain Ed25519 signer attests (nameHash, emojiCount, contentHash, validity), because emoji segmentation — zero-width joiners, variation selectors, regional indicator pairs — cannot practically run inside TVM. The registrar verifies that signature before it prices anything.

The signer is not trusted with the rules Everything the chain can check, the chain does check. The raw name bytes are proven against nameHash on-chain; skin-tone modifiers and blocked look-alikes are rejected by a byte scan in TVM; and since V7 the registrar segments the emoji clusters itself and refuses any attested tier that disagrees with the bytes. A fully compromised signer cannot mint a blocked emoji, cannot fake a pricing tier, and cannot smuggle a single-emoji name past the auction lock.

The namespace

Pricing

Two schedules. First-year prices are admin-adjustable only within hardcoded bounds; renewal prices are constants with no setter anywhere in the contract. The lower bound of every first-year band is the tier's own renewal price — a first-year price can never be set below what a renewal costs.

welded shut — immutableadjustable within bounds
EmojiTierFirst year Adjustable withinRenewal / yr
1Mythicauction only — 150 floor50 GRAM
2Legendary20 GRAM10 – 8010 GRAM
3Epic15 GRAM7.5 – 607.5 GRAM
4Rare5 GRAM3 – 203 GRAM
5Uncommon3 GRAM1.5 – 121.5 GRAM
6–7Common1.5 GRAM0.75 – 60.75 GRAM

A registration of N years costs the first-year price plus (N − 1) renewals. Term is capped at 5 years per transaction and 10 years total from the present.

Never hardcode a price Call priceRegister(emojiCount, numYears) and priceRenew(emojiCount, numYears) on the registrar. First-year prices move within their bounds; your integration should not need a redeploy when they do. priceRegister returns 0 for a single-emoji name, because a single has no list price at all.

The message you send must also cover network fees and the registrar's own outgoing work — the NFT mint and the resolver syncs. Read Integration before you build a checkout.

What a name resolves to, today

Records live in the resolver as an open map of categories, so new integrations need no contract change. The wallet category is the one that matters at launch: a name resolves to a TON address, and a compliant client sends funds to it.

Two properties worth calling out:

Integration roadmap — where we actually are

Stage 1 · live mechanism, pre-mainnet deployment

<name>.emojiverse.ton. The resolver sits under a parent .ton domain via dns_next_resolver. Any TON client that implements TEP-81 resolves it with no changes on their side. This has been verified end-to-end — an emoji name resolved in a real wallet and delivered funds.

The immediate, real use of a name It is not a placeholder for something better; it is the thing that works without asking anyone's permission.

Stage 2 · native display

Wallets and explorers showing 🚀🌙 as the name rather than the raw address, and accepting it in a send field. This is integration work with individual clients — we can ship SDK support and documentation, but each client decides its own timeline.

Stage 3 · .emoji as a first-class suffix

The end state is 🚀🌙.emoji resolving natively, without a parent domain in the path. That requires adoption by parties we do not control — it is an ecosystem outcome, not a deploy we can schedule. We will not put a date on it.

What we can do, and have done, is make the resolver root-agnostic so that when it happens, existing names carry over byte-for-byte with no migration and no re-registration.

Security properties in one place

The full evidence is in Security and operability.