For documentation of the ENS system, see docs.ens.domains.
This repo doubles as an npm package with the compiled JSON contracts
import {
BaseRegistrar,
BaseRegistrarImplementation,
BulkRenewal,
ENS,
ENSRegistry,
ENSRegistryWithFallback,
ETHRegistrarController,
FIFSRegistrar,
LinearPremiumPriceOracle,
PriceOracle,
PublicResolver,
Resolver,
ReverseRegistrar,
StablePriceOracle,
TestRegistrar,
} from '@ensdomains/ens-contracts'
// Registry
import '@ensdomains/ens-contracts/contracts/registry/ENS.sol';
import '@ensdomains/ens-contracts/contracts/registry/ENSRegistry.sol';
import '@ensdomains/ens-contracts/contracts/registry/ENSRegistryWithFallback.sol';
import '@ensdomains/ens-contracts/contracts/registry/ReverseRegistrar.sol';
import '@ensdomains/ens-contracts/contracts/registry/TestRegistrar.sol';
// EthRegistrar
import '@ensdomains/ens-contracts/contracts/ethregistrar/BaseRegistrar.sol';
import '@ensdomains/ens-contracts/contracts/ethregistrar/BaseRegistrarImplementation.sol';
import '@ensdomains/ens-contracts/contracts/ethregistrar/BulkRenewal.sol';
import '@ensdomains/ens-contracts/contracts/ethregistrar/ETHRegistrarController.sol';
import '@ensdomains/ens-contracts/contracts/ethregistrar/LinearPremiumPriceOracle.sol';
import '@ensdomains/ens-contracts/contracts/ethregistrar/PriceOracle.sol';
import '@ensdomains/ens-contracts/contracts/ethregistrar/StablePriceOracle.sol';
// Resolvers
import '@ensdomains/ens-contracts/contracts/resolvers/PublicResolver.sol';
import '@ensdomains/ens-contracts/contracts/resolvers/Resolver.sol';
If your environment does not have compiler, you can access to the raw hardhat artifacts files at node_modules/@ensdomains/ens-contracts/artifacts/contracts/${modName}/${contractName}.sol/${contractName}.json
The ENS registry is the core contract that lies at the heart of ENS resolution. All ENS lookups start by querying the registry. The registry maintains a list of domains, recording the owner, resolver, and TTL for each, and allows the owner of a domain to make changes to that data. It also includes some generic registrars.
Interface of the ENS Registry.
Implementation of the ENS Registry, the central contract used to look up resolvers and owners for domains.
The new implementation of the ENS Registry after the 2020 ENS Registry Migration.
Implementation of a simple first-in-first-served registrar, which issues (sub-)domains to the first account to request them.
Implementation of the reverse registrar responsible for managing reverse resolution via the .addr.reverse special-purpose TLD.
Implementation of the .test
registrar facilitates easy testing of ENS on the Ethereum test networks. Currently deployed on Ropsten network, it provides functionality to instantly claim a domain for test purposes, which expires 28 days after it was claimed.
Implements an ENS registrar intended for the .eth TLD.
These contracts were audited by ConsenSys Diligence; the audit report is available here.
BaseRegistrar is the contract that owns the TLD in the ENS registry. This contract implements a minimal set of functionality:
This separation of concerns provides name owners strong guarantees over continued ownership of their existing names, while still permitting innovation and change in the way names are registered and renewed via the controller mechanism.
EthRegistrarController is the first implementation of a registration controller for the new registrar. This contract implements the following functionality:
The commit/reveal process is used to avoid frontrunning, and operates as follows:
The minimum delay and expiry for commitments exist to prevent miners or other users from effectively frontrunning registrations.
SimplePriceOracle is a trivial implementation of the pricing oracle for the EthRegistrarController that always returns a fixed price per domain per year, determined by the contract owner.
StablePriceOracle is a price oracle implementation that allows the contract owner to specify pricing based on the length of a name, and uses a fiat currency oracle to set a fixed price in fiat per name.
Resolver implements a general-purpose ENS resolver that is suitable for most standard ENS use cases. The public resolver permits updates to ENS records by the owner of the corresponding name.
PublicResolver includes the following profiles that implements different EIPs.
ABI()
).addr()
).contenthash()
).supportsInterface()
).name()
).pubkey()
).text()
).This repo runs a husky precommit to prettify all contract files to keep them consistent. Add new folder/files to prettier format
script in package.json. If you need to add other tasks to the pre-commit script, add them to .husky/pre-commit
git clone https://github.com/ensdomains/ens-contracts
cd ens-contracts
yarn
yarn test
yarn pub
Smart contract development tends to take a long release cycle. To prevent unnecessary dependency conflicts, please create a feature branch (features/$BRNACH_NAME
) and raise a PR against the feature branch. The feature branch must be merged into master only after the smart contracts are deployed to the Ethereum mainnet.