The operating system for onchain AI agents. ENS gives agents identity and discovery. Uniswap gives agents financial rails. KeeperHub gives agents reliable execution with an audit trail.
🏆 Built for ETHGlobal Open Agents 2026 · Live on Sepolia · agentos.nikhilraikwar.me
AgentOS is an OS layer for onchain AI agents: every agent gets an ENS name, a user-owned smart wallet, Uniswap financial rails, and verifiable KeeperHub execution.
Short description: AgentOS: ENS-named AI agents with user-owned smart wallets that discover each other, trade on Uniswap, and execute reliably via KeeperHub.
AI agents can reason, but they fail at the parts that matter most onchain:
| Problem | AgentOS Solution |
|---|---|
| No persistent identity | Every agent gets a real ENS subname under agentos.eth |
| No decentralized discovery | Agent capabilities stored as ENS text records — no central DB needed |
| No verifiable reputation | ERC-8004-style onchain identity, feedback, and validation registries |
| Execution fails on gas, approvals, retries | KeeperHub Direct Execution handles the transaction lifecycle |
| No clean payment path between agents | Uniswap Trading API routes value to an agent's preferred token |
These are not screenshots. These are live Etherscan links from actual KeeperHub + Uniswap execution.
| Step | Transaction | KeeperHub Run ID |
|---|---|---|
| USDC Approval to Permit2 | 0x25d8d8... | gp9i4rbct6i36uv028vav |
| Uniswap Swap (KeeperHub-routed) | 0xbc7bdf... | u8hg88102bu9wi5u126uw |
Verified swap result:
- KeeperHub wallet:
0x924CAF4F0FDAfea9eF3653374D2f93F56059c7e5 - Path: Sepolia USDC → WETH
- Input:
1 USDC→ Output:0.000122895544056695 WETH - Agent:
tradedemo.agentos.eth - Agent wallet:
0x3f962D91813D7a2230580EA11475305FC6Ef6F7E
Health endpoint (live):
https://agentos-seiv.onrender.com/health
{
"ok": true,
"chainId": 11155111,
"parentEnsName": "agentos.eth",
"openai": true,
"uniswap": true,
"keeperhub": {
"ok": true,
"result": {
"walletAddress": "0x924caf4f0fdafea9ef3653374d2f93f56059c7e5"
}
}
}flowchart TD
UW["🦊 User Wallet\nConnected on Sepolia"]
subgraph FRONTEND["📱 Next.js Frontend — Vercel"]
LP["Landing Page\nRainbowKit connect"]
DB["Dashboard\nDeploy + Chat + Records"]
PX["Next.js API Proxy\n/api/backend/*"]
end
subgraph CONTRACTS["⛓️ Sepolia Contracts"]
FAC["AgentWalletFactory\n0x75C553...4CB"]
REG["AgentSubnameRegistrar\n0x3ccF94...9E"]
ID["AgentIdentityRegistry8004\n0xB7dd5B...300"]
AR["AgentRegistry\n0x4180F3...55"]
SW["AgentSmartWallet\nOwner = User Wallet"]
end
subgraph ENS["🌐 ENS Sepolia — agentos.eth"]
SUB["name.agentos.eth"]
TXT["Text Records\nspecialty · fee · endpoint · reputation"]
ADR["Address Record → Smart Wallet"]
end
subgraph BACKEND["🖥️ Express Backend — Render"]
SEC["CORS + Backend Secret\nProtected execution routes"]
OA["OpenAI Agent Runtime\nTool-calling loop"]
ENSS["ENS Adapter\nviem getEnsAddress / getEnsText"]
UNIS["Uniswap Adapter\nTrading API"]
KHS["KeeperHub Adapter\nDirect Execution"]
end
subgraph UNISWAP["🦄 Uniswap Trading API"]
QT["/quote"]
AP["/check_approval"]
SW2["/swap — Universal Router calldata"]
end
subgraph KH["⚙️ KeeperHub Direct Execution"]
EX["/execute/contract-call"]
ST["/execute/{id}/status"]
MCP["MCP Server"]
end
UW -->|signs 4 txs| FRONTEND
DB -->|createAgentWalletFor| FAC
FAC -->|deploys| SW
DB -->|register label + records| REG
REG -->|setSubnodeRecord + setAddr + setText| ENS
DB -->|registerWithWallet| ID
DB -->|registerAgent| AR
DB -->|chat messages| PX
PX -->|server-side secret header| SEC
SEC --> OA
OA -->|ens_discover_agent| ENSS
ENSS -->|resolves| ENS
OA -->|uniswap_get_quote| UNIS
UNIS --> QT & AP & SW2
UNIS -->|submit tx| KHS
KHS --> EX & ST
sequenceDiagram
actor User as 🦊 User Wallet
participant FE as 📱 Dashboard
participant FAC as ⛓️ WalletFactory
participant ENSR as 🌐 ENS Registrar
participant ID as 🪪 Identity8004
participant AR as 📋 AgentRegistry
User->>FE: Connect wallet on Sepolia
User->>FE: Enter name + specialty + fee + token
User->>FAC: createAgentWalletFor(name, node, owner=User, executor=Backend/KeeperHub)
FAC-->>FE: AgentWalletCreated → smartWallet address
User->>ENSR: register(label, owner=User, wallet=smartWallet, textRecords[])
ENSR-->>FE: AgentSubnameRegistered → name.agentos.eth live
User->>ID: registerWithWallet(agentURI, metadata[], wallet=smartWallet)
ID-->>FE: ERC-8004 identity NFT minted to User
User->>AR: registerAgent(node, ensName, smartWallet, owner=User)
AR-->>FE: Agent indexed in AgentRegistry
sequenceDiagram
actor User as 👤 User Chat
participant BE as 🖥️ Backend Agent
participant OA as 🤖 OpenAI Runtime
participant ENS as 🌐 ENS Sepolia
participant UNI as 🦄 Uniswap API
participant KH as ⚙️ KeeperHub
User->>BE: "Quote 1 USDC to WETH"
BE->>OA: Tool-calling loop starts
OA->>ENS: ens_discover_agent(tradedemo.agentos.eth)
ENS-->>OA: address + specialty + fee + preferred_token
OA->>UNI: POST /check_approval {token, amount, wallet}
UNI-->>OA: approval tx if needed
OA->>KH: executeContractCall(approval tx) → gp9i4rbct6i36uv028vav
OA->>UNI: POST /quote {generatePermitAsTransaction: true}
UNI-->>OA: routing + output + optional permitTransaction
OA->>UNI: POST /swap {quoteResponse}
UNI-->>OA: Universal Router calldata
OA->>KH: executeContractCall(swap) → u8hg88102bu9wi5u126uw
KH-->>OA: txHash confirmed
OA-->>User: "Swap complete — txHash 0xbc7bdf..."
graph LR
O["🟣 orchestrator / user"]
subgraph ENS ["🌐 ENS Sepolia — agentos.eth"]
T["tradedemo.agentos.eth"]
R["any-user-agent.agentos.eth"]
end
subgraph TR ["agent records"]
T1["specialty: trading,defi"]
T2["fee: 0.001 ETH"]
T3["preferred_token: USDC"]
T4["keeperhub: enabled"]
T5["reputation: 50"]
T6["agentos.lastExecutionTx"]
end
O -->|resolve ENS| T & R
T -->|read records| TR
O -->|pick by specialty + reputation\npay via Uniswap\ncall endpoint| T
ENS is not cosmetic. ENS is the runtime directory for every agent.
What ENS does:
| ENS Usage | What it does |
|---|---|
| Address record | Points to the agent's user-owned smart wallet |
specialty |
Machine-readable capability — clients can read this to route tasks |
fee |
Agent's service cost, readable by any client |
preferred_token |
Uniswap can route payment into this token |
endpoint |
Callable API endpoint for agent invocation |
reputation |
Updated after verified task completion |
keeperhub |
Signals execution reliability support |
agentos.lastExecutionTx |
Latest Etherscan-verifiable tx hash written back to ENS |
agentos.lastKeeperHubRun |
KeeperHub run ID for operator audit |
Creative use: ENS text records become a machine-readable capability manifest. A user, app, or orchestrator can resolve *.agentos.eth, read its records, and route a task to the right agent — with no central registry, no API key, and no private database.
ERC-8004 integration: Three registry contracts (Identity, Reputation, Validation) implement an ERC-8004-style pattern for trustless agent identity and onchain feedback.
AgentOS uses the Uniswap Trading API as the financial execution rail for ENS-named agents.
What we integrate:
POST /check_approval — ERC20 allowance check before swap
POST /quote — Routing + price discovery
POST /swap — Universal Router calldata preparation
Real execution proof:
- Path: Sepolia USDC → WETH
- Input:
1 USDC→ Output:0.000122895544056695 WETH - Swap tx: 0xbc7bdf...
Why it matters: Agents do not just show a swap UI. Uniswap is the financial rail for agent payments and autonomous DeFi execution from user-owned smart wallets.
FEEDBACK.mdis in the repo root with real Uniswap integration notes.
AgentOS routes confirmed Uniswap execution through KeeperHub Direct Execution.
What KeeperHub does:
- Executes ERC20 approvals from the agent smart wallet
- Executes Permit2 transactions when returned by the Uniswap API
- Executes Universal Router swap calldata
- Returns
executionId, status, and transaction proof
Real KeeperHub execution IDs:
| Transaction | executionId | Etherscan |
|---|---|---|
| USDC approval | gp9i4rbct6i36uv028vav |
0x25d8d8... |
| Uniswap swap | u8hg88102bu9wi5u126uw |
0xbc7bdf... |
MCP configured: https://app.keeperhub.com/mcp — OAuth authenticated during development.
Execution pattern used:
AI agent prepares intent
Uniswap prepares calldata
AgentSmartWallet restricts allowed targets
KeeperHub executes and returns tx proof
ENS can store latest execution memory
KEEPERHUB_FEEDBACK.mdis in the repo root with full builder feedback.
ERC8004_IDENTITY_REGISTRY_ADDRESS = 0xB7dd5B72bF248806F63d645a6bDaFfDb053f4300
ERC8004_REPUTATION_REGISTRY_ADDRESS = 0xe7f6b315cA9d49bA1aEcA516311a043542A2d161
ERC8004_VALIDATION_REGISTRY_ADDRESS = 0x3C5E64A4f0fc23C4205AC5a5D281Ecab06Ee57D9
AGENT_REGISTRY_ADDRESS = 0x4180F328e2600E8b846e13A1EFe85D21690C6e55
AGENT_WALLET_FACTORY_ADDRESS = 0x75C553505C7912377E08e4B9b2c824D722a704CB
AGENT_SUBNAME_REGISTRAR_ADDRESS = 0x3ccF94F8B4E5Dd6886A7cbcb2f3C52482dA4ff9E
ENS Parent: agentos.eth on Sepolia
Verify: https://sepolia.app.ens.domains/agentos.eth
Full deployment metadata: deployments/sepolia.json
AgentOS/
├── packages/
│ ├── contracts/ Solidity — 6 contracts deployed on Sepolia
│ │ ├── AgentWalletFactory.sol
│ │ ├── AgentSubnameRegistrar.sol
│ │ ├── AgentIdentityRegistry8004.sol
│ │ ├── AgentReputationRegistry8004.sol
│ │ ├── AgentValidationRegistry8004.sol
│ │ └── AgentRegistry.sol
│ ├── backend/ Express + TypeScript — agent runtime (Render)
│ │ └── src/
│ │ ├── server.ts REST API + health endpoint
│ │ ├── ens.ts ENS Sepolia adapter (viem)
│ │ ├── uniswap.ts Uniswap Trading API adapter
│ │ ├── keeperhub.ts KeeperHub Direct Execution adapter
│ │ └── openai-agent.ts Tool-calling agent loop
│ └── frontend/ Next.js 15 — landing + dashboard (Vercel)
│ ├── app/api/backend/ Secure backend proxy
│ ├── components/
│ │ ├── LandingPage.tsx
│ │ └── Dashboard.tsx Deploy, chat, ENS records, wallet activity
│ └── lib/contracts.ts Typed ABIs + contract addresses
├── FEEDBACK.md Uniswap Trading API feedback
├── KEEPERHUB_FEEDBACK.md KeeperHub integration feedback
├── deployments/sepolia.json
└── .env.example
# 1. Clone and install
git clone https://github.com/NikhilRaikwar/AgentOS
cd AgentOS
npm install
cd packages/backend && npm install --workspaces=false
cd ../frontend && npm install --workspaces=false
cd ../contracts && npm install --workspaces=false
# 2. Configure environment
cp .env.example .env
# Fill in:
# OPENAI_API_KEY — from platform.openai.com
# UNISWAP_API_KEY — from developers.uniswap.org
# KEEPERHUB_API_KEY — kh_ organization key from keeperhub.com
# SEPOLIA_RPC_URL — Infura/Alchemy Sepolia endpoint
# NEXT_PUBLIC_WALLETCONNECT_ID
# 3. Run backend
cd packages/backend && npm run dev
# 4. Run frontend
cd packages/frontend && npm run dev
# 5. Open
# http://localhost:3000 — Landing page
# http://localhost:3001/health — Backend healthcurl http://localhost:3001/healthExpected:
{
"ok": true,
"chainId": 11155111,
"parentEnsName": "agentos.eth",
"openai": true,
"uniswap": true,
"keeperhub": { "ok": true }
}cd packages/contracts
npm run deploy:sepoliaVisit agentos.nikhilraikwar.me. Connect wallet on Sepolia.
Click Deploy Agent. Enter name, specialty, fee, and preferred token. Sign 4 wallet transactions:
AgentWalletFactory.createAgentWalletFor— smart wallet deployed, owned by your walletAgentSubnameRegistrar.register—name.agentos.ethminted on ENS SepoliaAgentIdentityRegistry8004.registerWithWallet— ERC-8004 identity NFT mintedAgentRegistry.registerAgent— agent indexed onchain
Open:
https://sepolia.app.ens.domains/name.agentos.eth
Verify: subname exists, address resolves to the smart wallet, and text records are readable.
Get a quote to swap 1 USDC to WETH
The OpenAI agent:
- Calls
ens_discover_agent→ reads ENS records - Calls
uniswap_get_quote→ Uniswap/quote - Shows route + expected output
- Requires confirmation before execution
- Routes confirmed execution through KeeperHub
After a confirmed swap, click Write Proof to ENS to store agentos.lastExecutionTx, agentos.lastKeeperHubRun, and updated reputation back into the agent's ENS text records.
agentos.eth is owned and configured on Sepolia:
- Parent name:
agentos.eth - Manager/controller:
AgentSubnameRegistrarcontract - Users call
AgentSubnameRegistrar.register(label, owner, wallet, records[])directly — no server private key involved
To deploy your own registrar for a different parent ENS name:
ENS_RESOLVER_ADDRESS=0x... PARENT_ENS_NAME=yourname.eth npm run deploy:registrar:sepoliaThen in the Sepolia ENS app, set the registrar address as the manager of yourname.eth.
| Limitation | Detail |
|---|---|
| Native ETH → token via KeeperHub | Universal Router requires payable msg.value. ERC20 → token via Permit2 works. Documented in FEEDBACK.md. |
| Sepolia liquidity | Some Uniswap routes return "No quotes available." USDC/WETH works best. |
| Text record gas | Writing 10+ text records costs gas per tx. Production use should batch with setRecords via multicall resolver. |
| Agent persistence | Created agents persist in localStorage. A production version would use onchain indexing. |
| KeeperHub dashboard links | Dashboard run pages are private to the organization. AgentOS shows Etherscan public proof + KeeperHub run IDs. |
# Required for full demo
OPENAI_API_KEY=
UNISWAP_API_KEY=
KEEPERHUB_API_KEY= # Must be kh_ org key for REST + MCP
SEPOLIA_RPC_URL=
NEXT_PUBLIC_WALLETCONNECT_ID=
# Production security
CORS_ORIGINS=https://agentos.nikhilraikwar.me,http://localhost:3000,http://127.0.0.1:3000
BACKEND_API_SECRET=
BACKEND_API_URL=https://agentos-seiv.onrender.com
NEXT_PUBLIC_API_URL=/api/backend
# Optional — only for redeploying contracts
DEPLOYER_PRIVATE_KEY=
AGENT_EXECUTOR_PRIVATE_KEY=
# Contract addresses — already set from deployments/sepolia.json
ERC8004_IDENTITY_REGISTRY_ADDRESS=0xB7dd5B72bF248806F63d645a6bDaFfDb053f4300
ERC8004_REPUTATION_REGISTRY_ADDRESS=0xe7f6b315cA9d49bA1aEcA516311a043542A2d161
ERC8004_VALIDATION_REGISTRY_ADDRESS=0x3C5E64A4f0fc23C4205AC5a5D281Ecab06Ee57D9
AGENT_REGISTRY_ADDRESS=0x4180F328e2600E8b846e13A1EFe85D21690C6e55
AGENT_WALLET_FACTORY_ADDRESS=0x75C553505C7912377E08e4B9b2c824D722a704CB
AGENT_SUBNAME_REGISTRAR_ADDRESS=0x3ccF94F8B4E5Dd6886A7cbcb2f3C52482dA4ff9E
NEXT_PUBLIC_AGENT_SUBNAME_REGISTRAR_ADDRESS=0x3ccF94F8B4E5Dd6886A7cbcb2f3C52482dA4ff9E| File | Purpose |
|---|---|
FEEDBACK.md |
Uniswap Trading API integration feedback |
KEEPERHUB_FEEDBACK.md |
KeeperHub builder feedback |
Nikhil Raikwar — Built at ETHGlobal Open Agents 2026.
Live demo: agentos.nikhilraikwar.me Backend health: agentos-seiv.onrender.com/health
License: MIT