ERCs
ERC-137 — Ethereum Name Service (registry)
The base ENS registry. Maps node hashes (the namehash of a domain) to owners and resolvers. The registry is the root of the resolution tree; per-name resolvers handle the actual record lookups.
import { eip155_1 } from "@ethernauta/chain/eip155-1";
import { ENS_REGISTRY, namehash, resolver } from "@ethernauta/erc/137";
import { eth_call } from "@ethernauta/eth";
import { contract, create_reader, encode_chain_id, http } from "@ethernauta/transport";
const CHAIN_ID = encode_chain_id({ namespace: "eip155", reference: eip155_1.chainId });
const reader = create_reader([
{ chainId: CHAIN_ID, transports: [http("https://ethereum-rpc.publicnode.com")] },
]);
const node = namehash("vitalik.eth");
const callable = resolver({ node })(
contract({ chain_id: CHAIN_ID, to: ENS_REGISTRY }),
);
const result_bytes = await eth_call([{ to: callable.to, input: callable.data }])(reader({ chain_id: CHAIN_ID }));
const resolver_address = callable.decode(result_bytes); Core methods
| Method | Shape | Purpose |
|---|---|---|
owner({ node }) | Callable<Address> | Owner of a name. |
resolver({ node }) | Callable<Address> | Resolver contract for a name. |
ttl({ node }) | Callable<Uint64> | Cache TTL. |
set_resolver({ node, resolver }) | Signable<Hash32> | Change resolver. |
set_owner({ node, owner }) | Signable<Hash32> | Transfer ownership. |
set_subnode_owner({ node, label, owner }) | Signable<Hash32> | Subdomain ownership. |
Utilities
| Export | Purpose |
|---|---|
namehash | Compute the canonical 32-byte node hash for a domain. |
normalize | ENSIP-15 normalization (re-exported from @ethernauta/ens). |
registry | Registry-address resolution per chain. |
Resolver extension
The resolver extension subpath (@ethernauta/erc/137/resolver) carries the standard resolver interface methods (addr, text, contenthash, …). These methods are called against the resolver contract found via ERC-137.resolver(node), not the registry itself.
In practice you don’t call ENS contracts directly — use @ethernauta/ens for the multi-call orchestration:
import { eip155_1 } from "@ethernauta/chain/eip155-1";
import { get_ens_address } from "@ethernauta/ens";
import { create_reader, encode_chain_id, http } from "@ethernauta/transport";
const CHAIN_ID = encode_chain_id({ namespace: "eip155", reference: eip155_1.chainId });
const reader = create_reader([
{ chainId: CHAIN_ID, transports: [http("https://ethereum-rpc.publicnode.com")] },
]);
const address = await get_ens_address({ name: "vitalik.eth" })(
reader({ chain_id: CHAIN_ID }),
); See also
- @ethernauta/ens — high-level ENS resolution.
- ERC-181 — reverse resolution.
- ERC-1577 — content hash records.
- ERC-2304 — multichain addresses.