> ## Documentation Index
> Fetch the complete documentation index at: https://a-identity.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Build on Robinhood Chain

> Robinhood Chain network config for both networks, the canonical ERC-8004 registries already deployed there, and the x402 facilitator we run for it.

Robinhood Chain is Robinhood's own Arbitrum Orbit L2, built for tokenized real-world
assets, with ETH as the gas token and Ethereum for data availability. A-Identity runs
agent identity there, and settles paid trust calls there in USDG.

## Why this chain

> **Agents will trade here**
>
> It is the chain built around tokenized stocks and ETFs, and Robinhood has opened its surfaces to AI agents while stating plainly that it does not supervise them. That gap is the product.

> **ERC-8004 is already live**
>
> The canonical identity and reputation registries were deployed here by their authors, at the same addresses they carry on X Layer and Celo. Nothing had to be forked.

> **Gasless payments work**
>
> USDG implements EIP-3009, so a buyer can sign a transfer and never touch gas. Our facilitator broadcasts it.

> [!NOTE]
>
> Mainnet (`4663`) is **live** for us: agent #0 on the canonical registry is ours, and
> paid trust calls settle here in USDG. Testnet (`46630`) is **beta**, and carries the
> full canonical ERC-8004 trio plus a deployed AgentSpendPolicy vault. Every claim on
> this page is checkable at [/proof/robinhood](https://a-identity.xyz/proof/robinhood).

## Network config

| Field | Mainnet | Testnet |
| - | - | - |
| Chain ID | `4663` | `46630` |
| CAIP-2 | `eip155:4663` | `eip155:46630` |
| Native currency | ETH (18 decimals) | ETH (18 decimals) |
| RPC (HTTP) | `https://rpc.mainnet.chain.robinhood.com` | `https://rpc.testnet.chain.robinhood.com` |
| Block explorer | [robinhoodchain.blockscout.com](https://robinhoodchain.blockscout.com) | [explorer.testnet.chain.robinhood.com](https://explorer.testnet.chain.robinhood.com) |
| Faucet | n/a (bridge real ETH) | [faucets.chain.link/robinhood-testnet](https://faucets.chain.link/robinhood-testnet) |

> [!WARNING]
>
> Two things will bite you here.
>
> **There is no canonical Circle USDC on either network.** Do not copy a USDC address
> from another chain: it will not be the same token. The settlement token we use on
> mainnet is Paxos USDG at `0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168`, which is the
> address Paxos documents for this chain. Our registry deliberately leaves the USDC slot
> empty and names USDG as its own thing.
>
> **CreateX is not deployed here**, on either network, so CREATE3 is unavailable. The
> deterministic deployer that IS present is the Safe Singleton Factory
> (`0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7`), alongside the Arachnid CREATE2 factory.
> That is what makes the canonical ERC-8004 addresses reproducible here.

## Connect with viem

```ts chain.ts theme={null}
import { defineChain } from 'viem'

export const robinhoodChain = defineChain({
  id: 4663,
  name: 'Robinhood Chain',
  nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
  rpcUrls: { default: { http: ['https://rpc.mainnet.chain.robinhood.com'] } },
  blockExplorers: { default: { name: 'Blockscout', url: 'https://robinhoodchain.blockscout.com' } },
})

export const robinhoodTestnet = defineChain({
  id: 46630,
  name: 'Robinhood Chain Testnet',
  nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
  rpcUrls: { default: { http: ['https://rpc.testnet.chain.robinhood.com'] } },
  blockExplorers: { default: { name: 'Blockscout', url: 'https://explorer.testnet.chain.robinhood.com' } },
})
```

```ts read.ts theme={null}
import { createPublicClient, http } from 'viem'
import { robinhoodChain } from './chain'

const client = createPublicClient({ chain: robinhoodChain, transport: http() })

// Agent #0 is the first token this canonical registry minted.
const owner = await client.readContract({
  address: '0x8004a169fb4a3325136eb29fa0ceb6d2e539a432',
  abi: [{ type: 'function', name: 'ownerOf', stateMutability: 'view', inputs: [{ type: 'uint256' }], outputs: [{ type: 'address' }] }],
  functionName: 'ownerOf',
  args: [0n],
})
```

## What is deployed

| Contract | Network | Address |
| - | - | - |
| IdentityRegistry | mainnet | [`0x8004a169fb4a3325136eb29fa0ceb6d2e539a432`](https://robinhoodchain.blockscout.com/address/0x8004a169fb4a3325136eb29fa0ceb6d2e539a432) |
| ReputationRegistry | mainnet | [`0x8004BAa17C55a88189AE136b182e5fdA19dE9b63`](https://robinhoodchain.blockscout.com/address/0x8004BAa17C55a88189AE136b182e5fdA19dE9b63) |
| USDG (settlement) | mainnet | [`0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168`](https://robinhoodchain.blockscout.com/address/0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168) |
| AgentSpendPolicy vault (ours) | mainnet | [`0x05a6aad7124c2f1c7b82b03e0bbe3867bc500073`](https://robinhoodchain.blockscout.com/address/0x05a6aad7124c2f1c7b82b03e0bbe3867bc500073) |
| IdentityRegistry | testnet | [`0x8004A818BFB912233c491871b3d84c89A494BD9e`](https://explorer.testnet.chain.robinhood.com/address/0x8004A818BFB912233c491871b3d84c89A494BD9e) |
| ReputationRegistry | testnet | [`0x8004B663056A597Dffe9eCcC1965A193B7388713`](https://explorer.testnet.chain.robinhood.com/address/0x8004B663056A597Dffe9eCcC1965A193B7388713) |
| ValidationRegistry | testnet | [`0x8004Cb1BF31DAf7788923b405b754f57acEB4272`](https://explorer.testnet.chain.robinhood.com/address/0x8004Cb1BF31DAf7788923b405b754f57acEB4272) |

We did not deploy the mainnet registries. They were already live at their canonical
cross-chain addresses when we arrived; what is ours is **agent #0**, the first token that
registry ever minted. On testnet the ValidationRegistry implementation was the one piece
missing, and we deployed it by replaying the canonical Safe-Singleton-Factory calldata,
which reproduces the same address rather than forking a new one.

A ValidationRegistry proxy has code at the mainnet family's address here (read live
2026-10-11; an earlier version of this page said none existed, which was wrong), but we do
**not wire it**, so a KYA result is not anchored on-chain there. It is still verified
off-chain and recorded; we do not claim an anchor we have not written.

The **AgentSpendPolicy vault** is ours: 1 USDG a day, 0.25 USDG per payment for the agent
key, and anything above is refused with the contract's typed `AboveAutoApprove` error and
left to the owner. Since 2026-10-01 the agent key (`0x8C8D...3349`) is a separate wallet
from the owner key (`0xd305...ed36`), and its session key runs to 2026-11-15. The owner is
still a server-held key; the transactions are listed on
[/proof/robinhood](https://a-identity.xyz/proof/robinhood).

Before an agent pays here, [/check/robinhood](https://a-identity.xyz/check/robinhood)
(or `GET /api/robinhood/check?q=...`, or the MCP tool `evm_pay_check`) answers whether a
token is the real USDG and whether the payee holds an ERC-8004 agent id.

## The x402 facilitator

An x402 facilitator is the service a seller calls to verify a payment and settle it. We
run our own here, and it is open. We are not the only one: as of 2026-09-30 other
facilitators serve this chain too, hosted and open-source, some predating our launch. We
run ours so that one code path and one receipt standard cover every chain we sell on.

To be precise about what that does and does not claim: gasless EIP-3009 relaying on USDG
predates us on this chain by weeks, and an x402 settlement is indistinguishable on-chain
from any other relayed authorization. What is ours is the facilitator below, and the rule
that nothing counts as settled without a receipt carrying the matching Transfer log.

| Endpoint | Access |
| - | - |
| `GET /api/facilitator/supported` | open |
| `POST /api/facilitator/verify` | open, read-only |
| `POST /api/facilitator/settle` | allowlisted by payTo, because we pay the gas |
| `GET /api/facilitator/proof` | open |

Base URL: `https://a-identity-backend.onrender.com/api/facilitator`. Both x402 wire
spellings are accepted for `network`: the v1 slug (`rhchain`) and the v2 CAIP-2 id
(`eip155:4663`).

The signing domain is **proven, not pasted**. USDG exposes neither `version()` nor
`eip712Domain()`, so the EIP-712 domain cannot be read from the contract. We rebuild each
candidate domain and accept only the one that reproduces the live `DOMAIN_SEPARATOR`. If
none matches, no payment challenge is served at all, because inviting a buyer to sign
against a guessed domain produces an authorization nobody can settle.

## Verify it yourself

```bash theme={null}
# The signing domain, straight from the token. Compare it to what /supported publishes.
curl -sX POST https://rpc.mainnet.chain.robinhood.com -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168","data":"0x3644e515"},"latest"]}'
# -> 0x7a3d7400b27830f4f91c2c16a082486d67c1befecaec2f53b33f1f35d5b62036

# Our provenance ledger, with a live re-read of ownerOf(0) on every request.
curl -s https://a-identity-backend.onrender.com/api/proof/robinhood

# Every settlement, with the transaction that proves it.
curl -s https://a-identity-backend.onrender.com/api/facilitator/proof
```

## Where this chain fits

Arc is where escrow lives and where the spend vault first ran. Celo is where x402 settles
through a facilitator someone else runs. Robinhood Chain is where an agent pays in USDG
among hundreds of tokens that copy its name, so it is where checking the dollar before
paying matters most, and it is the chain whose users are agents trading real-world assets,
which is exactly the population that needs a policy layer in front of it.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.