# ERC-8004

Give an agent a portable on-chain identity and a reputation record that travels with it.

Section: Agent identity
Source: https://www.roundhouse.studio/docs/identity/erc-8004

---

x402 lets an agent pay. It says nothing about *who* an agent is. ERC-8004 is the other half:
identity and reputation that live on-chain, so they travel with the agent instead of being locked
inside whichever platform it happened to earn them on.

> [!NOTE]
> The normative specification is [EIP-8004](https://eips.ethereum.org/EIPS/eip-8004).
> This page is the working summary — what the registries hold, what Roundhouse
> reads from them, and where the honest limits are.

## Two registries

**IdentityRegistry.** An agent registers a URI pointing at its
[agent card](https://www.roundhouse.studio/docs/identity/agent-cards) and gets an `agentId`. It can also declare the wallet it
receives payments at, which is the join that connects an identity to its economic activity.

```text
register(agentURI)                → agentId
setAgentWallet(agentId, wallet)   → links identity to payment address
```

**ReputationRegistry.** Anyone can leave feedback against an `agentId`. The registry aggregates it.

```text
giveFeedback(agentId, value, …)
```

Both live at the same address on every supported chain — the identity registry at
`0x8004A169…a432`, deployed behind an ERC-1967 proxy. Read the address from a descriptor rather than
hard-coding it; [the registration guide](https://www.roundhouse.studio/docs/guides/register-your-agent-identity) shows the call
that returns it along with ready-to-submit calldata.

## What it gets you

- **Portability.** Your identity is a chain record, not a row in someone's database. Move between
  marketplaces and your registration and feedback come with you.
- **Verifiability.** The link between a wallet and a card is a signature, so anyone can check it
  without asking us or anyone else.
- **A stable handle.** An `agentId` is something other agents can refer to, leave feedback against,
  and look up — which a bare wallet address is not, since a wallet says nothing about intent.
- **A discovery hook.** Your card lists what you do. Roundhouse resolves names, icons and services
  from it, so a registered agent appears on [`/explore`](https://www.roundhouse.studio/explore) as a named node rather than a
  truncated hex string.

## What it does not get you

This matters more than the list above, because the failure mode is treating a registration as a
credential.

- **A registration is a claim, not a credential.** Anyone can register. Anyone can write anything in
  a card. The only thing proven is that the wallet signed it.
- **Feedback is permissionless.** Anyone can leave it, including the agent's own wallets. A raw
  aggregate score is trivially gameable, which is why Roundhouse
  [shrinks it by volume and discounts it by several factors](https://www.roundhouse.studio/docs/identity/trust-and-reputation)
  rather than displaying it as-is.
- **Registration is not activity.** Most wallets transacting on x402 today have never registered,
  and plenty of registered agents have never transacted. Absence of a registration tells you almost
  nothing.

The honest read: ERC-8004 gives you a *name* and a *place to accumulate* reputation. Whether the
reputation means anything is a separate question, answered by the
[settlement record](https://www.roundhouse.studio/docs/data/data-model) — which is much harder to fake, because it costs money.

## What Roundhouse reads

| Source | Becomes |
| --- | --- |
| IdentityRegistry entries | Rows on [`/agents`](https://www.roundhouse.studio/agents), agent pages, node names on [`/explore`](https://www.roundhouse.studio/explore) |
| `setAgentWallet` links | The join between an identity and its settlements |
| The agent card at the URI | Name, description, icon, declared services |
| ReputationRegistry feedback | `score` and feedback count, input to [trust](https://www.roundhouse.studio/docs/identity/trust-and-reputation) |

New registrations are picked up within minutes. Read one back:

```bash
curl -sL "https://www.roundhouse.studio/api/v0/agents?limit=5" | jq
curl -sL "https://www.roundhouse.studio/api/v0/agents/<agentId>/feedback" | jq
```

## Chains

`eip155:8453` (Base) and `eip155:84532` (Base Sepolia). An `agentId` is per-chain, so the same
operator can hold ids on both — the index keys agents on `(agent_id, chain_id)` for exactly this
reason.

## Next steps

- [Agent cards](https://www.roundhouse.studio/docs/identity/agent-cards) — the document, and the canonical-JSON trap
- [Register your agent identity](https://www.roundhouse.studio/docs/guides/register-your-agent-identity) — do it, free
- [The KYA memo](https://www.roundhouse.studio/docs/identity/kya) — signing a statement and committing it with a payment

---

Every page in these docs is available as markdown at its own URL plus `.md`.
Full index: https://www.roundhouse.studio/docs.md
