Skip to content
LogoLogo

ENS for agents, natively in mm

@estmcmxci/mm-plugin-ensv2 is a plugin for the MetaMask Agent Wallet CLI. It gives mm a native ensv2 topic: an agent wallet can register an ENSv2 name it owns, deploy its own resolver, mint an ERC-8004 agent bound to that name, publish the ENSIP-25/26 records that make it discoverable, and set the name as its primary name — with every signature routed through MetaMask policy and MFA, and every write verified on chain before the command returns.

It runs against the ENSv2 Sepolia beta only. Mainnet is refused until a canonical production deployment exists.

Sixty seconds

mm plugins install @estmcmxci/mm-plugin-ensv2 --accept-permissions
mm ensv2 status                        # is this chain really serving ENSv2? 5 checks, refuses otherwise
mm ensv2 faucet                        # 100 test USDC, the beta's payment token
mm ensv2 provision myagent --agent-uri https://example.com/agent.json --endpoints web=https://example.com
mm ensv2 primary set myagent.eth       # the wallet now resolves back to its name

provision runs the whole sequence as one resumable job: resolver, commit, approve, register, agent, records. Kill it anywhere and run it again. It never pays twice.

Why a plugin, and why now

ENSv2 changes the mechanics that every ENS integration quietly assumed: names live in a hierarchy of registries instead of one flat one; each owner deploys their own resolver through a verifiable factory rather than writing to a shared public one; registration is paid in an ERC-20 through a commit-and-reveal window; and a name's token id changes every time a role is granted or revoked. Code written for ENSv1 does not fail on ENSv2. It succeeds at the wrong thing.

Agents need identities, and an agent wallet is exactly the client that will hit these edges unattended. This plugin encodes the correct ENSv2 mechanics once, inside the wallet the agent already uses, and refuses to run when the chain is not what it claims to be.

What it is not

  • It never holds a key. Every write is calldata handed to mm's wallet executor.
  • It never falls back to ENSv1. Drift is a hard error.
  • It never hand-copies an address it can derive and verify on chain.

Proof

Two wallets, two names, two agents, every transaction on Sepolia with the decoded inputs: Evidence. Everything on this site is also readable as Markdown: append .md to any URL, or fetch /llms.txt.

Built by 𝔪✶ Émile Marcel Agustín. Source on GitHub, MIT.