Yellow Pages for agents: ENS IDs, iNFT ownership, signed rep, USDC skills, TEE proofs
alice.agentdir.eth) on Sepolia.success_ratio × min(samples, lookback) / lookback. 1/1 perfect cannot outrank 9/10 over 50 samples.Stack:
contracts/ (Foundry, Solc 0.8.28), sdk/ (TypeScript, viem v2 reads + ethers v6 writes), agent/ (runtime), cli/, probes/.@noble/ed25519. Canonical JSON for stable digests.Identity + iNFT:
setAgentStateRoot(tokenId, newRoot) rotation emits AgentStateUpdated events; SDK walks them for memory history with optional sig-verify per blob.EnsResolver.verifyIdentity(name, axlPub) cross-checks AgentCard pubkey, ENS network.axl.pubkey text record, iNFT agentAxlPubkey in one call. Spoof = automatic reject.Reputation:
prevRoot of previous one. Head pointer = network.agentdir.rep-head ENS text record.RepChain.walk validates every signature against ENS-published AXL pubkey. Merkle-verifiable, no separate service.RepChain.append so concurrent callers can't fork on shared prevRoot.Payments (KeeperHub Direct Execute):
POST /api/execute/transfer (Turnkey-managed wallet).req.callerPubkey. Stolen receipts useless.TEE-verified inference:
does not provide an export named 'C'). Fixed by walking from main entry to lib.commonjs/index.js via createRequire.broker.inference.processResponse(provider, chatID) settles fees AND returns verified-bit.{provider, chatID, signingAddress, verified} into rep attestation. CLI rep walker prints TEE✓ next to validated entries.\r\n → \n framing, captures ZG-Res-Key from headers, cancels reader in finally block to avoid leaks.Multi-agent swarm:
hopBudget decrements per hop; loops impossible.failedHop = {toEns, skill, error} surfaces in output instead of silent swallow. Every leg writes own rep att.Discovery:
Directory.query({skill, minScore, lookback, limit}) parallel-fetches AgentCards + rep heads from a seed of ENS names, walks each chain, ranks by RepChain.scoreFor.Hacky bits worth noting:
setStateRoot throws on empty rootHash instead of the silent zero-write the iNFT would otherwise accept.agent.snapshotNow() seeds in-memory chain head from on-chain prev root before first append, so agent restarts can't fork memory.
