Abstraxn Agent Kit implements the Identity layer of ERC-8004 so each agent can have a portable, verifiable on-chain identity — not just a wallet address. Developers register agents on supported EVM chains, publish a machine-readable registration file, and monitor identity plus MCP activity from the dashboard or their own UI.
Supported chain IDs (Agent Kit)
Identity registration uses a numeric EVM chainId in every API and SDK call — not string slugs like sepolia or base.
Contract addresses follow the official ERC-8004 contracts README: mainnet networks share one IdentityRegistry / ReputationRegistry pair; testnet networks share another.
These chainId values are accepted by POST /agents/:id/identity/prepare, POST /agents/:id/identity/confirm, GET /agents/:id/identity?chainId=…, and SDK registerAgentIdentity / getAgentIdentity. Any other chainId returns a validation error.
| Network | chainId | Type |
|---|
| Ethereum Mainnet | 1 | Mainnet |
| Ethereum Sepolia | 11155111 | Testnet |
| Polygon Mainnet | 137 | Mainnet |
| Polygon Amoy | 80002 | Testnet |
| Base Mainnet | 8453 | Mainnet |
| Base Sepolia | 84532 | Testnet |
| BSC Mainnet | 56 | Mainnet |
| BSC Testnet | 97 | Testnet |
| Arbitrum One | 42161 | Mainnet |
| Avalanche C-Chain | 43114 | Mainnet |
// Supported chainId values (Agent Kit IdentityChainId enum)
const IDENTITY_CHAIN_IDS = {
ETHEREUM_MAINNET: 1,
SEPOLIA: 11155111,
POLYGON_MAINNET: 137,
POLYGON_AMOY: 80002,
BASE_MAINNET: 8453,
BASE_SEPOLIA: 84532,
BSC_MAINNET: 56,
BSC_TESTNET: 97,
ARBITRUM_ONE: 42161,
AVALANCHE_MAINNET: 43114,
} as const;
# Example: register on Ethereum Sepolia
curl -X POST "$AGENT_KIT/agents/$AGENT_UUID/identity/prepare" \
-H "X-API-Key: $ABSTRAXN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"chainId": 11155111}'
One agent may register once per chainId. Fund the agent EVM address with native gas on the chain you choose before calling prepare/register.
Registry addresses by chainId
chainId | Network | IdentityRegistry | ReputationRegistry |
|---|
1 | Ethereum Mainnet | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 |
11155111 | Ethereum Sepolia | 0x8004A818BFB912233c491871b3d84c89A494BD9e | 0x8004B663056A597Dffe9eCcC1965A193B7388713 |
137 | Polygon Mainnet | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 |
80002 | Polygon Amoy | 0x8004A818BFB912233c491871b3d84c89A494BD9e | 0x8004B663056A597Dffe9eCcC1965A193B7388713 |
8453 | Base Mainnet | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 |
84532 | Base Sepolia | 0x8004A818BFB912233c491871b3d84c89A494BD9e | 0x8004B663056A597Dffe9eCcC1965A193B7388713 |
56 | BSC Mainnet | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 |
97 | BSC Testnet | 0x8004A818BFB912233c491871b3d84c89A494BD9e | 0x8004B663056A597Dffe9eCcC1965A193B7388713 |
42161 | Arbitrum One | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 |
43114 | Avalanche C-Chain | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 |
Override defaults per chain on your Kit deployment:
| Purpose | Example env vars |
|---|
| Registry | IDENTITY_REGISTRY_<chainId> (e.g. IDENTITY_REGISTRY_1, IDENTITY_REGISTRY_SEPOLIA) |
| RPC | CHAIN_RPC_ETHEREUM, CHAIN_RPC_SEPOLIA, CHAIN_RPC_POLYGON, CHAIN_RPC_BASE, CHAIN_RPC_BSC, CHAIN_RPC_ARBITRUM_ONE, CHAIN_RPC_AVALANCHE, … |
More ERC-8004 networks
The ERC-8004 contracts repo lists additional deployments (Optimism, Linea, Scroll, Monad, and others). Abstraxn will add more chainId values to Agent Kit as RPC and registry env support is rolled out.
What is ERC-8004?
ERC-8004 (Trustless Agents) is an Ethereum standard (mainnet-ready as of early 2026) for giving autonomous agents discoverable, composable trust primitives. It defines three registries; Agent Kit focuses on Identity today.
| Registry | Purpose |
|---|
| Identity | On-chain agent id (ERC-721-style), linked to an agent URI that resolves to a registration JSON file |
| Reputation | Structured feedback anchored on-chain (not yet exposed in Agent Kit UI) |
| Validation | Attestations that an agent behaved as claimed (future / domain-specific) |
Why identity matters for agents
A raw EVM address does not tell a counterparty who operates the agent, which MCP endpoint to use, or whether the agent supports x402. ERC-8004 Identity fixes that by combining:
- On-chain record — registration in an IdentityRegistry contract on a chosen chain (e.g. Sepolia, Base).
- Off-chain agent card — JSON at
agentURI with name, description, service endpoints (including MCP), and x402 support flags.
- Global identifier — a CAIP-style global agent id derived from chain, registry, and on-chain
agentId so the same logical agent can be referenced across tools and explorers.
Identity does not prove an agent is honest or within spend policy — it proves who the agent claims to be and where to reach it. Pair identity with your own auth, spend policy, and activity logs for full accountability.
Registration file (agent card)
Agent Kit serves an EIP-8004 registration-v1 document at a public URL (no API key):
GET {AGENT_KIT_PUBLIC_URL}/agent/{agentUuid}/registration
Example shape (fields may grow with your agent metadata):
{
"type": "https://eips.ethereum.org/EIPS/eip-8004#registration-v1",
"name": "Trading Assistant",
"description": "Executes trades within spend policy",
"services": [
{
"name": "MCP",
"endpoint": "https://agent-kit.abstraxn.com/mcp",
"version": "2025-06-18"
}
],
"registrations": [
{
"agentId": 42,
"agentRegistry": "eip155:11155111:0x8004A818BFB912233c491871b3d84c89A494BD9e"
}
],
"x402Support": true,
"active": true
}
The on-chain register(agentURI) call points the registry at this URL. Wallets and explorers can resolve it without calling your private APIs.
How Abstraxn registers an agent
Prerequisites
- Agent created with
createAgent (or bind) so it has an evmAddress.
accessKey stored on your backend for signing.
- Native gas on the target chain in that EVM address (registration is a contract call).
- Identity registry configured on Agent Kit for that chain (
IDENTITY_REGISTRY_* env vars on the Kit deployment). Default addresses match the ERC-8004 contracts README; see Supported chain IDs above.
REST API (Agent Kit)
All routes below require X-API-Key (application API key) except the public registration file.
| Method | Path | Description |
|---|
GET | /agent/:id/registration | Public registration JSON (agent card) |
GET | /agents/:id/identity?chainId=11155111 | Read persisted registration for one chain |
GET | /agents/:id/identity | List all chain registrations in metadata |
POST | /agents/:id/identity/prepare | Body: { "chainId": 11155111 } → unsigned tx + agentURI |
POST | /agents/:id/identity/confirm | Body: { "chainId", "txHash" } → verify and save |
After confirm, Agent Kit stores records under agent.metadata.erc8004.registrations[] with:
| Field | Meaning |
|---|
agentId | On-chain id from registry events |
globalId / agentIdentity | Portable global agent identifier |
agentURI | Registration file URL used on-chain |
registryAddress, chainId | Where it was registered |
owner | Agent EVM address (must match on-chain owner) |
txHash, registeredAt | Audit fields |
SDK shortcut
@abstraxn/agent-kit wraps prepare → sign → broadcast → confirm:
const identity = await agentKit.registerAgentIdentity({
agentId: kitAgent.id, // Agent Kit UUID
userIdentity: 'user-123',
accessKey: decryptedAccessKey,
organizationId: wallet.organizationId,
evmAddress: wallet.evmAddress,
chainId: 11155111,
});
See SDK quickstart for createAgent and accessKey storage first.
For external wallet agents (no accessKey), use registerAgentIdentityExternal or manual prepare/confirm with your own signer — see External wallet identity.
Dashboard — Identity & Activity
In Agentic Stack → All agents, open an agent row to see two tabs:
Identity tab
Shows ERC-8004 status for operators and support teams:
- Registered on-chain banner with global agent identifier (copy-friendly).
- Per-chain registration cards: on-chain agent id, owner, registry address, transaction hash, explorer links.
- Controllers and wallets: EVM/Solana addresses and masked API key reference tied to the agent.
If the agent is not registered, the tab shows Not registered on-chain with guidance to register on a supported chain (registration is triggered from your app backend, not from this dashboard screen alone).
Activity log tab
Lists MCP tool calls for that agent — audit trail for debugging and compliance:
| Column | Meaning |
|---|
| Tool name | From live tools/list for the agent’s MCP endpoint |
| Intent | Human-readable summary when provided |
| Status | ok, error, payment_required, spend_policy_denied, etc. |
| Duration | Milliseconds |
| Timestamp | When the call ran |
Use Refresh and pagination to load more. Open Details on a row to inspect request/response payloads (redact secrets before sharing externally).
Activity appears after the agent executes MCP tools via your backend or integrations using your application API key with that agent_id.
Integrate in your app
The sample backend API and sample web app demonstrate the full UX pattern Abstraxn recommends.
Sample backend API (NestJS)
| Method | Path | Behavior |
|---|
POST | /agents/:id/register-identity | Body: { "chainId": 11155111 } → calls SDK registerAgentIdentity |
GET | /agents/:id/identity?chainId= | Proxies Kit GET /agents/:id/identity for the UI |
Flow inside AgentsService.registerAgentIdentity:
- Load agent row + decrypt accessKey.
- Pass
chainId to SDK registerAgentIdentity (requires [email protected]+).
- SDK signs and submits registration, then confirms with Agent Kit.
- Return tx hash and
chainId metadata to the client.
Relevant modules: agents.controller.ts, agents.service.ts, identity-chain.config.ts.
Sample web app (Next.js)
RegisterIdentityModal — user picks chain; calls POST /agents/:id/register-identity.
RegisterIdentityFundRequiredModal — prompts funding if balance preflight fails.
AgentIdentityDetails on the dashboard — shows global id, on-chain agent id, registry, owner, explorer links after registration.
useAgentIdentity — loads identity state from your API.
The browser never holds accessKey; it only triggers your JWT-protected backend route.
Implementation checklist
- Create agent and fund EVM address with gas on target chain.
- Expose
POST /agents/:id/register-identity (or call Kit REST prepare/confirm yourself).
- Show registration status in your UI (mirror dashboard Identity fields).
- Set
AGENT_KIT_PUBLIC_URL on Agent Kit so agentURI is reachable on the public internet.
- Link users to Activity in dashboard or build your own log viewer using Kit MCP tool log APIs.
Configuration (Agent Kit operators)
| Variable | Purpose |
|---|
AGENT_KIT_PUBLIC_URL | Base URL embedded in agentURI (must serve /agent/:id/registration) |
IDENTITY_REGISTRY_SEPOLIA, IDENTITY_REGISTRY_BASE, … | Registry contract per chain |
CHAIN_RPC_* / SEPOLIA_RPC_URL | RPC for prepare, confirm, and receipt parsing |