In early March, ENS plans to perform a major contract upgrade and introduce a new contract called NameWrapper. Once all names, including secondary names like example.eth and subdomains like foo.example.eth, are "wrapped" into the new wrapper contract, it will be possible to restrict permissions to names by burning fuses. With this new feature, any wrapped name can also be transferred independently as an ERC-1155 token.

Users can migrate to the new system either by manually clicking "Upgrade" on the new website or by registering new .eth names that are automatically wrapped.

This document describes the changes between the existing and new ENS NFT collections. For general information about how the Name Wrapper works, please refer to the README of the name wrapper contract repository.

Contract addresses & release date

Please refer to the forum post for the latest information.

Guide to the .eth name registrars

Your existing process will continue to work after the name wrapper contracts are deployed because the existing controller contract will remain functional. However, we encourage you to switch to the new controller address so that names registered from your site/app are automatically wrapped, without requiring users to upgrade each name manually.

Registration process

Before registering, you MUST ensure that the name has not already been registered. To do this, call the available(string memory name) function on the .eth Registrar controller, passing the label of the .eth name you want to register as a string. Keep in mind that there is a small possibility that the name could be registered by someone else between the time you call available() and the time you register the name, which could cause the commit() or register() functions to fail. These functions also call available() internally to check if the name is registered.

Registration requires 2 on-chain transactions, both to the .eth Registrar Controller. You can find the updated contract code for all methods here:

First function

function commit(bytes32 commitment)

It takes a commit, which is a bytes32 hash that can be created using the contract via the makeCommitment function:

function makeCommitment(
        string memory name,
        address owner,
        uint256 duration,
        bytes32 secret,
        address resolver,
        bytes[] calldata data,
        bool reverseRecord,
        uint16 ownerControlledFuses,
        uint64 wrapperExpiry