Skip to content

docs(ens): say why the resolver announces ENSIP-10 and nothing else - #23

Merged
xgreenx merged 1 commit into
chore/ens-resolver-followupsfrom
docs/ens-resolver-invocation-path
Sep 7, 2026
Merged

xgreenx merged 1 commit into
chore/ens-resolver-followupsfrom
docs/ens-resolver-invocation-path

Conversation

@xgreenx

@xgreenx xgreenx commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Stacked on #22 (chore/ens-resolver-followups), which is stacked on #15. Docs and one test; no behaviour change.

What this says

HandleResolver announces ENSIP-10 and ERC-165 and nothing else. The NatSpec on supportsInterface now says why the absence of ERC-7996 (0x582de3e7) is deliberate, and a test pins it so a future edit has to argue the point.

Why it matters

ENS's ResolverCaller (shared by today's mainnet UniversalResolver and by ENSv2's DNSTLDResolver) picks one of two routes to a resolver:

  • Batch gateway (the route we get): our OffchainLookup is forwarded to a batch gateway as a request whose sender is our resolver (ENSIP-21). The {sender} filled into the URL is us, so a gateway that signs for the address in the URL signs for the right target.
  • Direct (the route ERC-7996 switches on, per ENSIP-22): the universal resolver calls us, catches the revert, and raises it again under its own address. {sender} becomes the universal resolver. A gateway signing for the URL then signs for the wrong target and resolveWithProof refuses every answer.

So announcing ERC-7996 without a gateway that signs for a configured resolver address breaks resolution outright. The note records the condition under which a future deployment may announce it, together with eth.ens.resolver.extended.multicall.

References: ENSIP-22, ENSIP-21, ResolverCaller.sol, CCIPReader.sol (the sender rewrite), DNSTLDResolver.sol (ENSv2 consults the v1 registry first, so this resolver and the setResolver step survive v2 unchanged).

Observed

The Sepolia handles.link entry already points at a HandleResolver (0xd46181CAb629AEDA48406b462656513821De6775): ENSIP-10 true, ERC-7996 false, one URL http://127.0.0.1:8080/ens/{sender}/{data}.json. Consistent with this note; the gateway requirements themselves go in the design doc (libid-org/libid, stacked on #7).

Verification

forge test --match-path 'contracts/ens/test/*'   # 21 passed
forge fmt --check

ERC-7996 is the id the ENS universal resolver reads as leave to call a
resolver directly instead of through the batch gateway. On that route it
raises the OffchainLookup again under its own address, so the {sender} a
client fills into the gateway URL is the universal resolver, and a gateway
that signs for the URL's address signs for the wrong target. The NatSpec on
supportsInterface now records this, and a test pins the absence of the id.

Assisted-by: Claude Fable 5.1
Signed-off-by: xgreenx <xgreenx9999@gmail.com>
@xgreenx
xgreenx marked this pull request as ready for review September 7, 2026 10:20
@xgreenx
xgreenx merged commit 4634507 into chore/ens-resolver-followups Sep 7, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant