ERCs

ERC-137 — Ethereum Name Service (registry)

eips.ethereum.org/EIPS/eip-137

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

MethodShapePurpose
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

ExportPurpose
namehashCompute the canonical 32-byte node hash for a domain.
normalizeENSIP-15 normalization (re-exported from @ethernauta/ens).
registryRegistry-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