Skip to main content
Every name and label you pass to the SDK is normalized per ENSIP-15 before it is hashed, sent to the API, or compared. Viem’s namehash() does not normalize. Skip this step and Alice.eth and alice.eth hash to different nodes, so an availability check can report a registered name as free.
The normalized form is returned to you on every checkName result as name, alongside its label and parentName parts.

Normalize on your own side too

If your app stores, compares, or caches names, use the same helpers the SDK uses so your keys agree with its.
The SDK also exports MAX_NAME_BYTES (255) and MAX_LABEL_BYTES (63), the length bounds it enforces after normalization.
Passing a full name where a label is expected is the most common mint bug, so normalizeLabel rejects any value containing a . outright rather than hashing it as one long label.

ENS v2

ENS v2 moves name ownership into per-name subregistries, so a v1 registry owner() lookup reports a migrated name as unowned. The contracts are not final and nothing is deployed to mainnet yet. This is why checkName treats the Namespace API as the primary source of truth and the registry as corroboration: the API can follow the migration without an SDK release. Normalization is unaffected, since ENSIP-15 does not change in v2.