# METHOD — ERC-8004 Arbitrum One cohort census (public RPC) — 2026-10-07

## Objective

Measure the Arbitrum One ERC-8004 cohort — raw registry mints, owner concentration, on-chain reputation feedback, and a sampled view of agent-metadata liveness — using only free public-RPC calls, zero Alchemy credits, and zero on-chain transactions. The output is a public, reproducible snapshot that any reader can re-derive at a comparable cost.

## Measurement window

- **Chain:** Arbitrum One (CAIP-2 `eip155:42161`)
- **Chain id:** 42161
- **RPC primary:** `https://arb1.arbitrum.io/rpc`
- **RPC fallback:** `https://arbitrum.gateway.tenderly.co`
- **Node class:** full (not archive) — `eth_getCode` is state-pruned on `arb1.arbitrum.io/rpc`, so the deploy block was seeded from the committed `.cc-agent/.0656-arbitrum-census.json` freeze. `eth_getLogs` is index-based, not state-based, and works globally; §Scan-coverage below confirms 100% coverage of the deploy-to-head window.
- **Deploy block:** 428,895,443 (same block for both registries; verified against the 0656 freeze)
- **Head block at run:** 512,646,051
- **Scan range:** 83,750,609 blocks
- **Generated UTC:** 2026-10-07T18:29:18Z
- **RPC calls total:** 228 (errors=0, backoffs=0)

## Registry contracts

- **IdentityRegistry:** `0x8004A169FB4a3325136EB29fA0ceB6D2e539a432`
- **ReputationRegistry:** `0x8004BAa17C55a88189AE136b182e5fdA19dE9b63`

Both are the deterministic ERC-8004 addresses deployed to every EVM chain. Bytecode length at head: 260 hex chars each.

## Scan coverage

`eth_getLogs` was issued in 10,000,000-block windows (nine windows total) from the deploy block to head:

```
[428895443 .. 438895442]
[438895443 .. 448895442]
[448895443 .. 458895442]
[458895443 .. 468895442]
[468895443 .. 478895442]
[478895443 .. 488895442]
[488895443 .. 498895442]
[498895443 .. 508895442]
[508895443 .. 512646051]  (tail)
```

Coverage complete: **true**. 1,604 Transfer(from=0x0) logs pulled from IdentityRegistry; 973 NewFeedback logs pulled from ReputationRegistry.

## Owner distribution

Each `Transfer(from=0x0, to=OWNER, tokenId=AGENT_ID)` was decoded; the owner is the 20-byte right-slice of the Transfer `to` topic. Distinct owners and per-owner counts were computed by in-memory count. The resulting owner-share-of-mints is reported as `top1_share_pct` and `top10_share_pct`. This is **not** a share of currently-held agents — if any owner transferred an agent-id post-mint, this cut would overstate their current holdings. The read-across to live agent operators is a lower bound.

## tokenURI sample + liveness probe

A 200-of-1,604 sample (12.47% of the cohort) was drawn evenly spaced by agent-id (`sample_strategy = evenly_spaced_by_agent_id`, `sample_cap = 200`). For each sampled agent:

1. `tokenURI(agent_id)` was called on the IdentityRegistry.
2. `data:` URIs were parsed inline. `ipfs://` URIs were resolved via the standard public IPFS gateway. `http(s)://` metadata hosts were fetched directly with a 5-second GET timeout.
3. Returned JSON was parsed for the standard ERC-8004 shape: `services[]`, `capabilities[]`, `x402Support`, `payment`.
4. The **first** HTTP(S) `services[].endpoint` field (if any) was probed with a single GET and a 5-second timeout. Response status was recorded.

The 0/200 HTTP-live rate measures **HTTP reachability on the first endpoint of a sampled agent**. It is NOT an agent-liveness measurement — many Arbitrum agents publish `.eth`, `.arb`, `.agent`, or ENS-reverse names in their endpoint field rather than HTTP(S) URLs, and the probe does not resolve those name-service references. The stronger live signal on Arbitrum is on-chain reputation feedback: 108 distinct agents received at least one NewFeedback event (full-cohort full-history — not an extrapolation).

Sample results are published verbatim in `summary.json` under `tokenuri_sample.*`. The extrapolated-to-cohort figures (`http_live_extrapolated_to_cohort = 0`, `metadata_ok_extrapolated_to_cohort = 353`) are simple pro-rations of the sample rate and should be read as **point estimates with sample noise**; no confidence interval is published here.

## Reproducibility

Every number on the companion dataset page and the companion blog post derives from the fields published here or in `summary.json`. The underlying measurement script is at `scripts/analysis/0772_arbitrum_public_rpc_census.py` in the repo; the input envelope (identical measurement, machine-readable) is at `.cc-agent/.0772-arbitrum-census.json`, SHA-256 `2ce26378ad36a7ded274f9f60ccd6b360b0239e574f5bceac39961260ba1554b`.

To reproduce, from the repo root:

```bash
python3 scripts/analysis/0772_arbitrum_public_rpc_census.py
# -> writes docs/0772-arbitrum-erc8004-census.md and
#    .cc-agent/.0772-arbitrum-census.json
```

The script is read-only (eth_getCode / eth_getLogs / eth_call / eth_chainId only). No signing key is needed and no on-chain state is modified.

## Comparison with the 2026-09-17 freeze (task 0656)

The prior 0656 census ran against Alchemy's Arbitrum One archive RPC and recorded **1,502** registrations and **142** distinct senders at head block 505,982,474 (2026-09-17T04:31:28Z). This 0772 measurement, 20 days later and against a public (non-archive) RPC, records **1,604** registrations and **1,000** distinct owners. Deploy block matches. The registration cohort grew by **102** (+6.79%) over the ~20-day window.

The ~7× jump in distinct-sender/distinct-owner is a definition change, not a cohort change: 0656 published `distinct_senders` (distinct tx.from on each registration transaction) over a smaller sample resolution; this 0772 run publishes `distinct_owners` from the Transfer `to`-address. The two numbers measure different populations.

## What this dataset does NOT publish

- **Agent liveness rate for the Arbitrum cohort.** The HTTP-probe cut is a sample on the first endpoint only and is dominated by ENS/.agent-named endpoints that the probe cannot resolve. A proper liveness rate would require full endpoint enumeration and name-service resolution; those are not in scope here.
- **A chain-vs-chain comparative live rate.** `/v1/public/stats` publishes `agents_with_reputation` for Base (29,128) and Ethereum (0; indexer paused), but Arbitrum is not in the paid API's covered chain set, and the Base / Arbitrum denominators are different cohorts. No ratio is claimed.
- **Trust scores for Arbitrum agents.** The paid `/v1/intel/*` API indexes Base and Ethereum. Arbitrum is MEASURED here, not INDEXED.

## License

CC BY 4.0 — free to reuse, remix, and redistribute, including commercially, with attribution.
