# Method — ERC-8004 four-chain IdentityRegistry census (2026-09-17)

Companion to `dataset.csv`. Documents, for each of the six rows in the dataset,
the exact block window, the RPC provider, the measurement method, the sample
seed and `n_resolved` where applicable, and the reconciliation history. Written
so a third party with an archive RPC on the same four chains can reproduce every
row given only this document and the frozen envelopes it names.

## What this measures

**Raw registrations and distinct-sender concentration on the ERC-8004
`IdentityRegistry` contract as it stood on 2026-09-17**, across four EVM chains
that all run the same registry at the same deterministic-deploy address
(`0x8004A169FB4a3325136EB29fA0ceB6D2e539a432`), plus one probe of a separate
BRC8004 BNB-team fork at `0xfA09B3397fAC75424422C4D28b1729E3D4f659D7`.

The `Transfer(from=0x0)` event is the identity mint. Every row is anchored to a
specific `window_start_block` / `window_end_block` pair — this is the pinning
mechanism, not clock time. A reproduction that lands the same block range will
land the same underlying event set modulo re-orgs, which are not a concern at
the depths sampled here.

## Prior work

This census is an **independent replication and extension** of prior public
work on the ERC-8004 IdentityRegistry. It is not the first four-chain census
of the registry. It cites the earlier work by URL so a reader can compare the
codebases end-to-end.

- **AgentCount** — `https://github.com/AgentCount/agentcount` (public repo
  created 2026-07-31T08:30:04Z; fetched 2026-09-18T01:44:29Z). Rust codebase,
  Apache-2.0 license on the code and CC BY 4.0 on the published data archives
  (verified from the repo's `LICENSE` file and `DATA.md`). Their README
  documents a 2026-07-30 four-chain census across BNB Chain, Base, Ethereum
  mainnet, and Celo (354,858 total agents at that snapshot). The current
  scope in their `published-runs.json` at fetch time covers 11 chains —
  `arbitrum, base, billions, bsc, celo, gnosis, mainnet, megaeth, op, polygon,
  xlayer` — so the three overlap chains between the two projects are Ethereum,
  Base, and BSC, plus Arbitrum (added to AgentCount's scope after their
  initial 2026-07-30 run). Their most recent runs at fetch time were dated
  2026-08-24 / 2026-08-25. At those runs their raw-count figures were:
  Ethereum mainnet 50,419 at block 25,824,613; Base 67,951 at block
  50,394,649; Arbitrum 1,387 at block 497,799,172; BSC 300,552 at block
  117,948,134. Our 2026-09-17 checkpoint blocks sit roughly 24 days of block
  time later on each chain, and our raw-count figures (50,820 / 88,500 /
  1,502 / 352,415 respectively) are compatible with theirs within the growth
  observed in the intervening block-window drift. Two independent codebases
  (their Rust sweeper against Postgres, our Python `eth_getLogs` scans against
  frozen JSON envelopes) reading the same on-chain registry produce the same
  order of results at compatible block windows.

- **maxguryanov/agent-registry-research** —
  `https://github.com/maxguryanov/agent-registry-research` (public repo created
  2026-08-17T14:44:03Z; fetched 2026-09-18T01:44:29Z). MIT license.
  Repository description: "Measuring how many agents registered in the
  ERC-8004 Identity Registry on Base actually expose a working service
  endpoint." That work extends into per-agent HTTP liveness on Base, which
  this dataset intentionally does **not** publish at this checkpoint (see
  trap 4 in `GRADE.md` — the rate-publishable chains at this checkpoint all
  read 100% with a batch-mint dominance flag set, making the per-chain
  liveness split mechanically uninformative in this window).

- **Ren, Junming (2026).** *ERC-8004 Agent Reputation and Activity Dataset.* Zenodo, v1.0, `10.5281/zenodo.20676023` (deposited 2026-06-13; fetched 2026-09-24T23:44Z at `https://zenodo.org/records/20676023`). CC BY 4.0. Ethereum-mainnet-only dataset covering blocks 24,339,925 → 25,277,687 (2026-01-29 → 2026-06-09), split across five CSVs — `agent_core`, `agent_reputation`, `agent_statistic`, `agent_transaction`, `all_agent`. Extends into ERC-8004 ReputationRegistry feedback and derived agent-level statistics on Ethereum, which this census does not cover at this checkpoint (this census's Ethereum window is later and stops at distinct-sender reconciliation rather than reputation-formation modelling).

- **Xiong, Li, Wei, Wang, Knottenbelt, Wang (2026).** *Can Trustless Agents
  Be Trusted? An Empirical Study of the ERC-8004 Decentralized AI Agent
  Ecosystem.* arXiv:2606.26028 (v1 2026-06-24; v2 2026-07-08; fetched
  2026-09-18T01:44:29Z at `https://arxiv.org/abs/2606.26028`). Peer-reviewable
  empirical study of the ERC-8004 protocol and its three registries across
  multiple chains.

**What this census adds.** Sender-side reconciliation as a chain-level
metric (100% `tx.from` coverage on the three census chains — Ethereum, Base,
Arbitrum — so distinct-sender counts are exact, not sampled); a BSC
early-vs-late split reported as two disjoint cluster samples with named seeds
and non-overlapping Wilson CI95s, so the early-era concentration and the
late-era distribution are visible as separate columns rather than blurred into
a single BSC row; a BRC8004 BNB-team fork probe reported as `FORK_EMPTY` at
a K=40 windowed cadence; and per-numeric-cell provenance via `PROVENANCE.json`
tracing every value to a specific `source_key` inside a specific frozen
envelope on disk. That set — chain-level distinct-sender reconciliation,
BSC era split, fork probe, cell-level provenance — is the extension beyond the
prior work above.

## Population

The four chains that carry the standard ERC-8004 registry, plus the BRC8004
fork on BNB Smart Chain. Testnets (Sepolia, Base Sepolia, BSC testnet) are
excluded — mainnets only.

| Chain | `chain` column | Registry address | Total registrations (row `registrations`) |
|---|---|---|---:|
| Ethereum mainnet | `ethereum` | `0x8004…a432` | 50,820 |
| Base | `base` | `0x8004…a432` | 88,500 |
| Arbitrum One | `arbitrum` | `0x8004…a432` | 1,502 |
| BNB Smart Chain (standard) | `bnb_standard` | `0x8004…a432` | 352,415 |
| BNB Smart Chain late-era sample | `bnb_standard_late` | `0x8004…a432` | 1,592 (sampled) |
| BRC8004 fork on BNB | `bnb_brc8004_fork` | `0xfA09…59D7` | 0 (K=40 sample) |

BSC dominates the population by raw count (~76% of the four-chain total). The
uneven distribution is the reason BSC gets three rows (a whole-history raw-count
row + two disjoint cluster samples) and the three smaller chains each get one
census row.

## Common RPC method (all census rows and all BSC sample rows)

Every `eth_getLogs` scan below used the same event signature and topic filter:

- Event: `Transfer(address indexed from, address indexed to, uint256 indexed tokenId)`
- `topic0`: `0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef`
- `topic1` (filter): `0x0000000000000000000000000000000000000000000000000000000000000000` (mints only — `from = 0x0`)
- Registry address: filtered per-row (see population table above)
- Chunk size: **10,000 blocks** per `eth_getLogs` call
- RPC provider (all four chains): **Alchemy Growth-tier archive endpoints**
- Deployment-block search: `eth_getCode` binary search against the same archive
  RPC, `genesis_confidence: high` on all four census chains

`tx.from` resolution used batched `eth_getTransactionByHash` against the same
RPCs. For the three census rows this ran across every unique transaction that
produced a mint (100% coverage, 0 fails). For the two BSC sample rows and the
BRC8004 probe it ran across the sampled tuples only.

## Per-row method

### Row 1 — `ethereum` (full re-scan, whole history)

- **Envelope on disk:** `.cc-agent/.0654-ethereum-census-freeze.json`
- **Method:** `full_rescan`. Every `Transfer(from=0x0)` since deployment, with
  every `tx.from` resolved so senders are deduped, not just counts.
- **Window:** block 24,339,871 (deployment, 2026-01-29T10:20:23Z UTC) →
  25,994,481 (checkpoint, 2026-09-17T03:20:47Z UTC).
- **`registrations`:** 50,820 (whole history).
- **`distinct_senders`:** 11,352 (100% `tx.from` coverage, exact).
- **`top1_share` / `top10_share`:** 4.9% / 18.2%.
- **CI95 columns:** empty (census — point measurement, no sampling error to bound).
- **`hhi`:** empty (freeze envelope retained top-1 / top-10 aggregates only, not
  the full sender-count distribution).
- **`sample_seed`:** empty (no sample drawn).
- **`n_resolved`:** 50,820 (= `registrations`).
- **`notes`:** empty (clean row).

### Row 2 — `base` (full re-scan, whole history)

- **Envelope on disk:** `.cc-agent/.0655-base-census.json` (task 0655).
- **Method:** `full_rescan`. Same procedure as row 1.
- **Window:** block 41,663,783 (deployment, 2026-02-03T11:08:33Z UTC) →
  51,415,064 (checkpoint, 2026-09-17T04:31:15Z UTC).
- **`registrations`:** 88,500 (whole history).
- **`distinct_senders`:** 29,289 (100% coverage, exact).
- **`top1_share` / `top10_share`:** 11.6% / 27.2%.
- **CI95 columns:** empty. **`hhi`:** empty. **`sample_seed`:** empty.
- **`n_resolved`:** 88,500.
- **`notes`:** empty.

### Row 3 — `arbitrum` (full re-scan, whole history, small-n)

- **Envelope on disk:** `.cc-agent/.0656-arbitrum-census.json` (task 0656).
- **Method:** `full_rescan`. Same procedure as row 1.
- **Window:** block 428,895,443 (deployment, 2026-02-05T13:16:00Z UTC) →
  505,982,474 (checkpoint, 2026-09-17T04:31:28Z UTC).
- **`registrations`:** 1,502 (whole history).
- **`distinct_senders`:** 142 (100% coverage, exact).
- **`top1_share` / `top10_share`:** 18.2% / 39.1%.
- **CI95 columns:** empty. **`hhi`:** empty. **`sample_seed`:** empty.
- **`n_resolved`:** 1,502.
- **`notes`:** `small_n_caveat`. Concentration statistics on 1,502 registrations
  across 142 senders are dominated by sample-size effects — see `GRADE.md` on
  trap 5.

### Row 4 — `bnb_standard` (whole-history raw-count backfill + early-era sender sample)

- **Envelopes on disk:**
  - Raw-count backfill: `.cc-agent/.0658-bnb-standard-census.json` (task 0658).
  - Reconciliation delta: `.cc-agent/.0659-bnb-standard-reconcile.json` (task 0659).
  - Early-era sender sample: `.cc-agent/.0659c-bnb-sender-sample.json` (task 0659c).
- **Method:** `full_raw_count_backfill`. Whole-history `eth_getLogs` was run
  end-to-end (the same procedure as the census rows) but `tx.from` resolution
  across all 352k tuples exceeded the budget, so the sender-side columns on
  this row are drawn from a K=1500 uniform-in-tuple cluster sample of the
  **early era** (block 79,027,268 – 104,927,268) rather than the whole history.
- **Window:** block 79,027,268 (deployment) → 122,349,961 (head checkpoint).
- **`registrations`:** 352,415 = 352,359 backfill + 56 reconciliation delta.
  **This is the whole-history raw count.**
- **`distinct_senders`:** 1,289 — **lower bound**, from the early-era sample
  only.
- **`top1_share` / `top10_share`:** 9.67% / 14.20% (Wilson CI95 8.27–11.27% /
  12.52–16.06%).
- **`hhi`:** 0.010379 (over the early-era sample's sender distribution).
- **`sample_seed`:** 659 (K=1500 uniform-in-tuple).
- **`n_resolved`:** 1,500 (sample size, not the total).
- **`notes`:** `early_era_only;cluster_sample_uniform_tuple;raw_count_is_whole_history`.
  The `raw_count_is_whole_history` marker exists because this is the only row in
  the dataset whose `registrations` column and sender-side columns are anchored
  to different subsets of the same block range — reading it without the note is
  the mistake trap 1 is designed to prevent.

### Row 5 — `bnb_standard_late` (late-era windowed cluster sample only)

- **Envelope on disk:** `.cc-agent/.0660-bnb-late-sample.json` (task 0660).
- **Method:** `cluster_sample_windowed`. K=60 non-overlapping 2,000-block
  windows drawn uniformly at random within the late range, `tx.from` resolved
  across every event in each window.
- **Window:** block 104,927,268 → 122,384,655 (late-era block range).
- **`registrations`:** 1,592 — **the count observed inside the 60 sampled
  2,000-block windows**, not the late-range total. Reported so `n_resolved`
  makes sense (see column 8 in the data dictionary).
- **`distinct_senders`:** 1,117 — lower bound, from this sample only.
- **`top1_share` / `top10_share`:** 0.25% / 2.50% (Wilson CI95 0.09–0.73% /
  1.76–3.55%).
- **`hhi`:** 0.000963. **`sample_seed`:** 660. **`n_resolved`:** 1,200.
- **`notes`:** `late_era_only;cluster_sample_windowed`.
- **Row split rationale:** the late-era top-1 and top-10 shares are ~40× and
  ~5× lower than the early-era shares (Wilson CI95s do not overlap), so
  publishing a single BSC-standard row would blur an early-era phenomenon that
  the late era does not carry. Two rows preserves the difference.

### Row 6 — `bnb_brc8004_fork` (BRC8004 fork probe — effectively empty)

- **Envelope on disk:** `.cc-agent/.0661-brc8004-probe.json` (task 0661).
- **Method:** `cluster_sample_windowed`. K=40 non-overlapping 2,000-block
  windows drawn uniformly at random across the fork's full deployment-to-head
  range.
- **Window:** block 78,864,633 (BRC8004 deployment) → 122,424,322 (head
  checkpoint).
- **`registrations`:** 0 in the K=40 sample.
- **`distinct_senders`:** 0 (lower bound from an empty sample).
- **`top1_share` / `top10_share`:** 0 / 0. **CI95 columns:** all 0 (0-of-0).
- **`hhi`:** empty. **`sample_seed`:** 661. **`n_resolved`:** 0.
- **`notes`:** `fork_effectively_empty`. Task 0661 verdict was **FORK_EMPTY**.
  Nine mints were observed by task 0661 outside the K=40 sample (in the first
  50,000 blocks after deployment); a defensible upper bound on lifetime
  BRC8004 registrations is low thousands, almost certainly <1% of the standard
  registry's 352,359. The BRC8004 sender set is **disjoint** from both BSC
  standard-registry samples.

## Reconciliation history

- **0654 (Ethereum freeze).** Whole-history Ethereum re-scan. Freeze recorded
  0 chunk errors, 0 `tx.from` fails, `n_resolved = registrations`.
- **0655 (Base).** Whole-history Base re-scan. Same discipline as 0654: 0 chunk
  errors, 0 fails, 100% coverage.
- **0656 (Arbitrum).** Whole-history Arbitrum re-scan. 0 chunk errors, 0 fails,
  100% coverage. `small_n_caveat` marker introduced in the freeze envelope for
  the low absolute volume.
- **0658 (BNB standard whole-history raw count).** Whole-history `eth_getLogs`
  backfill on the BSC standard registry. 1 chunk error (`IncompleteRead` at
  blocks 117,407,268–117,417,267, recorded verbatim in the freeze envelope; no
  material impact on the raw count). Backfill total: 352,359.
- **0659 (BNB standard reconciliation).** Delta pass to catch registrations
  minted between the 0658 head and the T5b checkpoint. 56 additional mints
  observed, added to the 0658 backfill total to give the row-4 `registrations`
  = 352,415.
- **0659c (BNB standard early-era sender sample).** K=1500 uniform-in-tuple
  cluster sample of the early era (block 79,027,268 – 104,927,268). Provided
  the sender-side columns on row 4.
- **0660 (BNB standard late-era windowed sample).** K=60 non-overlapping
  2,000-block windows within the late era (104,927,268 – 122,384,655), 60/60
  windows OK, 0 skipped. Row 5. This is the sample that carries the
  early-vs-late concentration difference on BSC.
- **0661 (BRC8004 fork probe).** K=40 windowed probe of the BRC8004 BNB-team
  fork. Verdict `FORK_EMPTY`. Row 6.
- **0662 (T5a copy).** Finished publication copy at
  `docs/drafts/erc-8004-four-chain-census-2026-09.md` plus the build spec at
  `docs/drafts/erc-8004-four-chain-census-dataset-spec.md`. No new numbers.
- **0663 (T5b artifacts).** `dataset.csv`, `dataset.json`, `dataset.jsonld`,
  `PROVENANCE.json`, `SHA256SUMS` in this directory. Every numeric cell traces
  to one of the envelopes above via `PROVENANCE.json`.
- **0664 (T5c, this file).** Companion markdown + `index.html`. No new numbers.

## Limitations (plain language)

**What this dataset can say.**

- It says, at the checkpoint block times above, how many raw registrations each
  ERC-8004 registry carries — for all four chains, in the same table, using the
  same event signature and the same chunk size against the same tier of archive
  RPC.
- It says, on the three census chains (Ethereum, Base, Arbitrum), how many
  distinct senders are behind those registrations — as an exact count, with
  100% `tx.from` coverage.
- It says, on the BSC standard registry, that the early-era top-1 and top-10
  sender shares are materially higher than the late-era shares, with Wilson
  CI95s that do not overlap.
- It says that the BRC8004 BNB-team fork is effectively empty at the sampling
  cadence tried (K=40 windowed probe: 0 mints).

**What this dataset does NOT say.**

1. **It does not say 352,415 distinct operators are on BSC.** That figure is
   a raw registration count; the distinct-sender counts on row 4 are early-era
   lower bounds. See `GRADE.md` trap 1.
2. **It does not say the sum of the BSC early and late samples is the BSC
   distinct-sender total.** Both are lower bounds. See trap 2.
3. **It does not extrapolate the BSC sample shares to the whole BSC range.**
   Cluster samples over uneven density are order-of-magnitude comparisons,
   not point estimates. See trap 3.
4. **It does not publish a per-chain liveness rate.** The reason is in the
   copy at `docs/drafts/erc-8004-four-chain-census-2026-09.md` § "What this
   does — and does not — say"; the short version is that the rate-publishable
   chains all read 100% at 8 host clusters with a batch-mint dominance flag
   set, which makes the rate mechanically uninformative in this window. See
   trap 4.
5. **It does not say Arbitrum is captured.** The 18.2% top-1 / 39.1% top-10
   figures are small-n artifacts at 1,502 total registrations across 142
   senders. See trap 5.
6. **It does not say BRC8004 has zero lifetime registrations.** The K=40
   sample observed zero; task 0661 documented nine mints outside the sample.
   See trap 6.
7. **It does not reconcile every popular ERC-8004 total.** Public totals
   published by third-party explorers and press mentions disagree by orders
   of magnitude with each other and with parts of this census; the
   disagreement is disclosed, not laundered. This dataset does not adopt any
   external figure, and no external figure is re-cited here without a
   fetchable source. See trap 7.

## License

**CC BY 4.0.** Attribution is the whole point of publishing this dataset.
Downstream users may reuse it commercially, redistribute it, and build on it,
provided they credit Onchain Agent Intel and link back to the canonical page.
The measurements are not copyrightable; the license attaches to the dataset as
compiled and packaged — the CSV, the JSON, the JSON-LD, the provenance file,
and this documentation.

## Reproduction

Given the block ranges, seeds, and RPC method above, a third party can:

1. Fire `eth_getLogs` for each `(chain, window_start_block, window_end_block)`
   pair from the census-row table, chunk size 10,000 blocks, `topic0` and
   `topic1` as specified above.
2. For the three census rows, resolve `tx.from` for every unique transaction
   returned via batched `eth_getTransactionByHash`. Aggregate distinct senders
   and top-1 / top-10 shares.
3. For the BSC standard row's sender columns, draw K=1500 uniform-in-tuple
   samples with seed 659 within block range 79,027,268 – 104,927,268 and
   resolve `tx.from` on the sampled tuples.
4. For the BSC late row, draw K=60 non-overlapping 2,000-block windows with
   seed 660 within block range 104,927,268 – 122,384,655 and resolve `tx.from`
   on every event in each window.
5. For the BRC8004 probe, draw K=40 non-overlapping 2,000-block windows with
   seed 661 across block range 78,864,633 – 122,424,322 on the BRC8004
   registry address and count mints.

A reproduction that lands the same block windows will land the same
`registrations` counts modulo new mints between their run and ours. Rows with
the same seed will draw the same tuples. Distinct-sender counts on the census
rows should match exactly; the sampled rows will vary within the Wilson CI95
bands.

## Companion files

- `dataset.csv` — the 6 rows
- `dataset.json` — same 6 rows re-emitted as JSON with attribution + offer
- `dataset.jsonld` — schema.org `Dataset` metadata block
- `PROVENANCE.json` — one entry per numeric cell traced to source envelope
- `SHA256SUMS` — sha256 of the four data files above
- `DATA-DICTIONARY.md` — column-by-column reader's map
- `GRADE.md` — the self-grade against the seven claim traps
- `index.html` — the staged (research-dir-only) HTML page
- `../../drafts/erc-8004-four-chain-census-2026-09.md` — finished publication
  copy (T5a)
- `../../drafts/erc-8004-four-chain-census-dataset-spec.md` — build spec (T5a)
