ZERO Name Service


Why is ownership bipartite?

The bipartition of ZNS domains into an ERC-721 NFT and a record of the domain in ZNSRegistry is a fundamental feature of the protocol. By allowing domain owners to delegate ownership of a domain's record to another account, ZNS enables those same domain owners to interact with third-parties -- like dApps or other smart contracts -- without requiring the domain's token to be in the same wallet as the account that is interacting. This allows users to perform actions like lending their domain to contracts for staking, allowing other users to operate domain management functions (as in a DAO), and so on, without losing the benefits given to them by the protocol or forfeiting 'true' ownership of the NFT.

What is an operator?

Operators are specific addresses that have been granted permission to modify a domain on its owner's behalf. This is done by naming the operator address in the domain's record in the ZNSRegistry contract. Domain owners can grant an operator access to their domain's record at any point in time. This is typically done to allow third-party applications or other users the ability to manage a domain for an owner without requiring that owner forfeit their domain's NFT.
It's important to note that operators are assigned at an owner level, not a domain level. This means that if the domain is transferred to a new owner, both the old owner and their operators will lose access to it.
Many functions within ZNS use the onlyOwnerOrOperator guard to restrict who is able to call that function. As mentioned above, ZNS domain ownership is divided into two part. If a domain's ERC-721 token is transferred to a new owner, the old owner will still own the domain record within the registry until the token's new owner calls to reclaim that domain. Because the operator functionality relies on that domain record, an allowed operator of the old domain owner is still able to make modifications to the domain after selling it. Therefore, it is imperative that a domain token's new owner call to reclaim that domain immediately.
The reclaim call can be performed on a ZNS domain in ZERO's Explorer application, or directly on the contract in Etherscan.

What does it mean to reclaim a domain?

Domain reclamation entails taking back ownership of the domain's record as listed in ZNSRegistry. To reclaim a domain requires ownership the domain's ERC-721 token from an account that is also not the owner of the domain's record (otherwise there would be no reason to reclaim the domain).
Any time a domains NFT is transferred from one account to another -- including sales on secondary marketplaces -- it is imperative that thew new owner call reclaim on that domain immediately. If this is done done, the domain token's prior owner will still be listed as the domain's record owner in ZNSRegistry, enabling them to continue serving as the domain's operator, who can make modifications to the domain.

What does it mean to revoke a domain?

Domain revocation entails forfeiting ownership of that domain and burning the associated NFT, rendering the domain available again for anyone to register. Domains and subdomains that were registered via ZERO's stake-to-mint paradigm will be refunded their stake amount (but not associated fees and gas costs) in full. Subdomains that were purchased via direct, one-time payments will not have that payment refunded if revoked.
Revocation of a parent domain with existing child subdomains will not impact those subdomains; once minted, subdomains are entirely emancipated from their parent domain. It will not be possible to mint new child subdomains under a revoked domain, however, until the parent domain is re-minted.

What is a domain hash?

A domain hash is a cryptographic hash function of that domain's label, not name. For example, the domain has a name of, but the label is specifically just world.
For top level domains, or Worlds, there is no parent domain and so the domain hash is calculated as:
bytes32 domainHash = keccak256(bytes(name));
For subdomains, the parent domain hash exists and so the domain hash is instead calculated as:
bytes32 domainHash = keccak256(abi.encodePacked(parentHash,keccak256(bytes(label))));

What is a distribution configuration?

Distribution configurations specify three things:
  • The type of payment this domain accepts (STAKE vs. DIRECT)
  • The accessibility of this domain to have subdomains minted (LOCKED, OPEN, or MINTLIST)T
  • The ZNSPricer contract to use for this domain.
This configuration is given to the domain upon registration through either registerRootDomain or registerSubdomain

What is a payment configuration?

Payment configurations specify what ERC-20 token a domain accepts as payment for subdomains. It also specifies the recipient direct payments or stakes fees for subdomain registrations under that domain.
This configuration is given to the domain on registration through via registerRootDomain, registerSubdomain, or through using the setPaymentConfig call.

What is a price configuration?

Price configurations specify the necessary variables required by the ZNSPricer contract used by ZNS's registrar. Custom contracts can be used in this configuration; if this contract is one of the two pricing contracts ZERO has created, then the configuration specifies either a single price for each domain regardless of that domain label's length for FixedPricer. If the CurvedPricer contract is used, the base length, maximum length, minimum price, and maximum price of a domain are part of the config. More information is available on these values and what they mean in Pricing.
Much of this configuration handled for the user when minting through ZERO's Explorer application.