Prove your humanity. Own your agent name. No gatekeepers.
- The Problem
- Quick Start
- How It Works
- Architecture
- Project Structure
- Development Guide
- Live Services
- Key Concepts
- No way to prove an ENS name belongs to a real human. Anyone can register a name β there's no on-chain signal distinguishing humans from bots. As AI agents proliferate, this distinction becomes critical.
- AI agents have no human-readable identity. An agent might have a wallet, but no name, no discoverability, and no visible link to its human operator.
- No trust anchor for agent namespaces. You can create ENS subnames, but nothing ties them back to a verified human β so there's no way to know who's behind an agent.
- Node.js 18+ and pnpm
- A World ID (via Worldcoin)
- An existing ENS domain (
yourname.eth)
# Clone and install dependencies
git clone <repo-url>
cd ETHGlobal-Cannes2026
pnpm install
# Frontend (Next.js)
cd frontend
pnpm dev
# Open http://localhost:3000
# Backend (World ID verification service)
cd backend
pnpm dev
# Runs on http://localhost:3001
# Gateway (CCIP-Read service)
cd gateway
pnpm dev
# Runs on http://localhost:3002- Go to http://localhost:3000
- Connect your wallet (World App or browser wallet)
- Enter your ENS name (e.g.,
alice) - Verify with World ID
- Verify ownership on L1 via CCIP-Read
- Mint your verified
alice.humanens.ethon World Chain
- After registering your verified link
- Click "Create Agent"
- Enter an agent name (e.g.,
shopping-bot) - Verify with World ID again
- Mint
shopping-bot.alice.humanens.ethas an ERC-721
The Problem: You own alice.eth on Ethereum L1, but how do we prove you also control it on World Chain without moving your NFT?
The Solution: Get a verified alice.humanens.eth subname linked via bidirectional proof β no transfer required. Uses CCIP-Read (EIP-3668) for trustless L1βL2 ownership verification without bridging.
What you get:
- Keep full control of your original
alice.ethon L1 - Get a verified
alice.humanens.ethon World Chain - One-time World ID verification anchors the link
- 10-minute freshness window prevents replay attacks
The Problem: AI agents need human-readable names, but anyone can claim to represent you.
The Solution: Create shopping-bot.alice.humanens.eth β a World ID-gated agent namespace where every name traces back to a verified human. Resolvable everywhere ENS works.
Features:
- Compatible with ENSIP-25 (for ERC-8004 agents bidirectional attestation)
- Integrates with World's AgentBook for human-only privileges
- Each agent is an ERC-721 NFT (transferable, composable)
- Only you can create subagents under your verified link
Frontend (Next.js, IDKit, MiniKit, wagmi/viem)
β
βββ Backend (Express) βββ World ID v4 cloud verification + EIP-712 attestations
β (temporary while v4 contracts are not on mainnet)
β
βββ Gateway (Express) βββ CCIP-Read L1 ENS ownership proofs
β
βββ World Chain Mainnet
βββ ENS L2Registry ββββ handles subnames
βββ HumanENSLinker.sol βββ acts as a custom L2Registrar for verified links & agent subnames
Step-by-step process for linking your ENS name:
1. User enters their ENS label (e.g. "alice")
ββ Frontend validates the label format
2. Frontend checks L1 for existing text record
ββ If missing: user must set humanens text record first
ββ Value: arbitrary nullifier for the link
3. User verifies humanity with World ID v4
ββ Obtains a World ID proof + nullifier
4. Frontend sends proof to backend for attestation
ββ Backend verifies the proof cryptographically
ββ Backend signs an EIP-712 attestation (nullifier + label + timestamp + expiry)
5. Frontend calls gateway for L1 ownership proof
ββ Gateway reads alice.eth owner + text record from L1 via RPC
ββ Gateway returns a signed CCIP-Read proof
6. Frontend submits registration transaction via MiniKit
β Contract verifies backend signature (humanity proof)
β Contract verifies gateway signature (L1 ownership proof)
β Contract checks freshness (10-min window)
β Contract enforces one-link-per-nullifier
ββ L2 Registry mints alice.humanens.eth on World Chain
Step-by-step process for creating an agent under your verified link:
1. User enters an agent name (e.g. "shopping-bot") under alice.humanens.eth
2. User verifies with World ID v4 again
ββ Proves they own the parent verified link
3. Frontend sends the proof to backend
ββ Backend verifies and signs an EIP-712 attestation for agent creation
4. Frontend submits agent creation transaction via MiniKit
β Contract verifies signature
β Contract verifies nullifier matches parent link owner
ββ L2 Registry mints shopping-bot.alice.humanens.eth as an ERC-721
5. (Optional) User sets ENSIP-25 text record
ββ Link it to an existing ERC-8004 agent for bidirectional attestation
βββ contracts/ Solidity smart contracts
β βββ HumanENSLinker.sol Main contract for link registration & agent creation
β βββ interfaces/ ENS L2Registry interfaces
β
βββ backend/ Express.js server
β βββ World ID v4 verification service
β βββ EIP-712 attestation signing
β βββ REST API endpoints
β
βββ gateway/ Express.js CCIP-Read gateway
β βββ L1 ownership verification
β βββ CCIP-Read proof generation
β βββ Signature verification
β
βββ frontend/ Next.js 15 application
β βββ World Mini App + browser UI
β βββ ENS integration (viem/wagmi)
β βββ MiniKit for transactions
β βββ World ID v4 IDKit
β
βββ register-agent/ CLI utility for ERC-8004 agent registration
| Component | Purpose | Tech Stack |
|---|---|---|
| Frontend | User interface for registration & agent creation | Next.js 15, TypeScript, viem/wagmi, IDKit, MiniKit |
| Backend | World ID verification & attestation signing | Express, TypeScript, EIP-712 |
| Gateway | Trustless L1 ownership proofs via CCIP-Read | Express, TypeScript, EIP-3668 |
| Contracts | On-chain registration logic & subname minting | Solidity, OpenZeppelin |
| Service | URL |
|---|---|
| π¦ L2Registry contract | 0x37119ac61eb66d2b877e8c3fa65924a3b6c6970b |
| π HumanENSLinker contract | 0xE073cc7E0675a65BD9b03D528c1c227614119063 |
cd frontend
pnpm dev- Access at
http://localhost:3000 - Uses hot reload (changes refresh automatically)
- Connect wallet via browser extension or World App
- Debugging: Open VS Code DevTools (F12)
cd backend
pnpm dev- Runs on
http://localhost:3001 - Endpoints:
POST /verifyβ Verify World ID proofPOST /attestβ Get signed EIP-712 attestation
cd gateway
pnpm dev- Runs on
http://localhost:3002 - Implements CCIP-Read standard
- Reads L1 ENS data via RPC
- Returns signed proofs for contract verification
# Terminal 1: Frontend
cd frontend && pnpm dev
# Terminal 2: Backend
cd backend && pnpm dev
# Terminal 3: Gateway
cd gateway && pnpm devcd contracts
# Run Foundry or Hardhat tests| File | Purpose |
|---|---|
pnpm-workspace.yaml |
Monorepo configuration (root) |
wagmi-config.ts (frontend) |
Blockchain RPC & account config |
.env.local (services) |
API keys, RPC URLs, signing keys |
Allows smart contracts to verify off-chain data without storing it on-chain. Used to prove L1 ENS ownership without bridging the NFT.
Standard for signing structured data. Used by backend to create verifiable proofs of World ID verification without storing nullifiers on-chain.
A World ID-provided identifier that prevents duplicate registrations (one per human, one per link).
Worldcoin's proof-of-personhood service. Provides cryptographic proof that you're a unique human.
Each agent name (shopping-bot.alice.humanens.eth) is minted as an NFT, making it transferable and composable with other protocols.
ENS Improvement Proposal for agent namespaces and bidirectional attestation between traditional ENS names and ERC-8004 agents.