Avalanche C-Chain metric audit

Avalanche's April active-user story has three problems

First, the reported daily metrics do not match Avalanche's documented definition. Second, Builder Hub rolls daily counts into monthly-looking numbers instead of deduplicating the month. Third, even the recomputed active-address counts are inflated by passive ERC721 spam activity.

The short version The daily numbers do not recompute under the published definition. The 43.76M Builder Hub monthly sender chart is a rollup artifact, not a real monthly-active number. And the biggest active-address spikes come from ERC721 spray contracts rather than real user activity.
76.37MApril C-Chain transactions checked
90AvaCache Parquet files used
16.20Mdocumented monthly active addresses
1.63Mdocumented monthly active senders

The Argument

1. Daily math Wrong Avalanche's reported daily values do not match the documented tx-plus-transfer recomputation.
2. Monthly math Summed Builder Hub's 43.76M sender figure behaves like summed daily counts, not April distinct senders.
3. Activity quality Spam NFTs Even documented active addresses are boosted by ERC721 sprays into mostly passive recipients.
How to see it AvaCache Daily Parquet files let anyone recompute the documented definition locally.

Monthly Counts

These are distinct counts across the full UTC month, not sums of daily counts. The documented definition counts transaction actors and ERC20/ERC721/ERC1155 transfer participants.

Documented active addresses 16.20M Distinct tx from/to plus transfer from/to in April.
Documented active senders 1.63M Distinct tx from plus transfer from in April.
Address-days 33.74M Sum of daily documented active-address counts.
Builder sender chart 43.76M This is a daily-sum style number, not a monthly distinct count.

Daily Shape

Under the documented definition, senders stay near 600K to 700K per day. Active addresses spike on April 21 and April 25 because transfer recipients expand the address set, not because millions of new transaction originators appear.

Interpretation

The daily address series and daily sender series should not move together during recipient-heavy transfer bursts. That separation is exactly what the recomputation shows.

Highest documented daily active addresses: April 25, 2026 with 5,786,233. Highest documented daily active senders: April 7, 2026 with 692,911.

Line chart comparing documented daily active addresses and active senders for April 2026

Spam transaction evidence

ERC721 Spray Contracts Explain The Spike Days

The peak documented active-address days are not days when millions of wallets suddenly sent transactions. They are recipient-heavy NFT-style spray days: thousands of contracts emitted zero-address ERC721 Transfer events into mostly passive or unused recipient addresses.

April 21 transfer-only 4.20M Addresses active only through transfer events.
April 25 transfer-only 5.16M The largest documented active-address spike.
ERC721 spray contracts 5,084 April 25 contracts with zero-address NFT-style mints to at least 500 recipients.
Transfer-only senders 5K-8K Peak-day sender contribution remains tiny compared with recipients.

Scale And Token Identity

April 20, 21, 25, and 26 contain thousands of ERC721-style contracts that emit Transfer events from the zero address to roughly 1,000 recipients each. The logs carry a third indexed topic, the NFT token id, and the sampled top contracts report ERC721 and ERC721 metadata support.

Stacked bar chart showing transaction baseline, transfer-only active addresses, and ERC721 spray recipients for April 2026 peak days

Spam mechanism

April 25 is the cleanest example: 631,095 transaction actors, 5,155,138 transfer-only active addresses, and 5,066,421 transfer-only recipients from ERC721 spray contracts. These addresses count under the documented active-address metric, but they did not initiate C-Chain transactions.

What were the tokens?

The normal high-volume emitters still include recognizable contracts such as AXEN/XEN, USDt, USDC, WAVAX, and NXPC. The multi-million-address spikes, however, are dominated by ERC721 spray contracts whose top sampled names/symbols resolve to evmlab and evmhub.

Day Doc active Tx baseline Transfer-only Transfer-only senders ERC721 spray contracts ERC721 spray recipients Transfer-only from spray
2026-04-181,081,874621,488460,3866,672000
2026-04-201,538,388617,010921,3787,948925938,066859,748
2026-04-214,834,827634,1074,200,7206,7004,4964,496,4714,095,555
2026-04-255,786,233631,0955,155,1385,4055,0845,072,8645,066,421
2026-04-262,949,652619,7572,329,8956,0192,2612,261,2272,258,467
Day Top sampled label Top contract Top contract recipients Sample result
2026-04-20evmlab0x4273e308264a5049e6e5bd812fd83f974b6e30d614,781Top 15 report ERC721 metadata; all labeled evmlab.
2026-04-21evmlab0xbaa7f4963a8559f495c4a359b60222c265f782641,001Top 15 report ERC721 metadata; all labeled evmlab.
2026-04-25evmhub0xce606340828380c002cebe0896834698c2a0a9641,001Top 15 report ERC721 metadata; mostly evmhub.
2026-04-26evmhub0x6d9ffa87c87883f9b5f3022dfc624ae2fa8e086a1,001Top 15 report ERC721 metadata; all labeled evmhub.

CSVs: peak day context, ERC721 spray summary, top ERC721 spray contracts.

Factory And Funder Pattern

The transaction Parquet has the contract creation transaction, but not a receipt contractAddress field. For this spam family, the constructor emits logs, so events.parquet supplies the created contract address. Joining constructor logs to txs.parquet recovered every spray contract creation locally.

Creations recovered 12,766 All spray contracts matched constructor logs plus to = null creation txs.
Factories found 0 No local creation matched a factory-call pattern; these were top-level creates.
Common funder 12,760 Contracts whose deployer was funded by 0xb0b0b6903489cc56bf037cb2f5ba986e2775bb07 before creation.
Linked recipients 12.75M Recipient slots associated with contracts funded by that address.

Six spray contracts had no prior April funding transaction visible in the local Parquet window; the other 12,760 all trace one hop back to the same funder. CSVs: local factory/funder summary, local factory/funder details.

Recipient Provenance

To spot-check whether the spray was landing on previously active addresses, we sampled transfer-only recipients from the ERC721 spray set and queried Routescan before each recipient's first spray block. The check looked for prior normal transactions, ERC20 transfers, ERC721 transfers, and ERC1155 transfers.

Sampled recipients 32 Eight transfer-only spray recipients from each peak day.
Prior normal txs 0 No sampled recipient had a prior C-Chain transaction in Routescan.
No prior activity 31 / 32 No prior normal/ERC20/ERC721/ERC1155 history before the spray block.
One exception Passive The exception had prior incoming USDC and avaprize.com ERC1155, but no prior normal tx.
Day Sample Prior any No prior Prior normal tx Prior ERC20 Prior ERC721 Prior ERC1155
2026-04-208080000
2026-04-218080000
2026-04-258170101
2026-04-268080000

CSVs: Routescan spot-check summary, sampled recipient details. The sample intentionally excludes addresses that were transaction actors on the spray day.

Reported Vs Recomputed Daily

The chart below overlays Avalanche's reported daily values with the local recomputation from AvaCache using the published definition. The red line is what Builder Hub/API reports; the blue line is what the documented transaction-plus-transfer-event definition produces.

Reported address-days 57.12M Sum of Avalanche's April daily active-address values.
Recomputed address-days 33.74M Sum of local documented daily active-address values.
Reported sender-days 43.76M Sum of Avalanche's April daily active-sender values.
Recomputed sender-days 18.86M Sum of local documented daily active-sender values.
Two-panel chart comparing Avalanche reported daily active addresses and senders with local documented recomputation for April 2026

CSV: april_2026_daily_reported_vs_documented.csv. The largest daily gap is April 30, 2026: Avalanche reports 2,387,068 active addresses and 2,361,502 active senders, while the documented recomputation gives 701,953 and 613,945.

Compare The Claims

Metric Builder/API value Local documented value What it means
April monthly active addresses 22,473,186 16,196,763 Dashboard is higher than the documented transfer-only definition.
April monthly active senders 43,763,454 on Builder chart 1,633,559 Builder chart is summing daily sender counts, not reporting monthly distinct senders.
Official Metrics API monthly active senders 9,484,569 1,633,559 Even the monthly API value is much higher than the documented transfer-only recomputation.
April 25 daily active addresses 6,483,098 5,786,233 Same spike shape, but the local documented count is lower.
April 25 daily active senders 1,423,006 627,258 Reported sender count is not explained by tx senders plus documented transfer senders.

Reproduce With AvaCache

AvaCache publishes daily C-Chain Parquet files for blocks, txs, and events. The commands below download April 2026 and run the documented metric definition locally with DuckDB.

1Download April 2026 Parquet files

mkdir -p data/avacache/daily
curl -fsSL https://parquet.avacache.com/manifest.json \
  -o data/avacache/manifest.json

jq -r '
  .files[]
  | select(.date >= "2026-04-01" and .date <= "2026-04-30")
  | .key
' data/avacache/manifest.json |
while read -r key; do
  curl -fL "https://parquet.avacache.com/${key}" \
    -o "data/avacache/${key}"
done

April 2026 is 90 files and about 8 GB locally. The source manifest includes sizes and MD5 hashes.

2Install DuckDB for local SQL

python3 -m pip install duckdb

3Run the documented daily-count query

python3 - <<'PY'
import duckdb

TX = "data/avacache/daily/2026-04-*.txs.parquet"
EV = "data/avacache/daily/2026-04-*.events.parquet"

TRANSFER = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
TRANSFER_SINGLE = "0xc3d58168c5ae7397731d063d5bbf3d15ec90c2ac5a0a42aa7fcb8b37e4df"
TRANSFER_BATCH = "0x4a39dc06d4c0dbc64b70f1f5045c5e13db6db9d9e2e0e28e0f2b2344c8d44e4"
ADDR_TOPIC = "^0x0{24}[0-9a-fA-F]{40}$"
ZERO = "0x0000000000000000000000000000000000000000"

con = duckdb.connect()
query = f"""
WITH
tx AS (
  SELECT
    regexp_extract(filename, '(2026-04-[0-9]{{2}})', 1) AS day,
    lower(from_address) AS from_address,
    lower(to_address) AS to_address
  FROM read_parquet('{TX}', filename=true)
),
ev AS (
  SELECT
    regexp_extract(filename, '(2026-04-[0-9]{{2}})', 1) AS day,
    topic0, topic1, topic2, topic3
  FROM read_parquet('{EV}', filename=true)
),
xfers AS (
  SELECT
    day,
    '0x' || lower(substr(topic1, 27, 40)) AS from_addr,
    '0x' || lower(substr(topic2, 27, 40)) AS to_addr
  FROM ev
  WHERE topic0 = '{TRANSFER}'
    AND regexp_matches(topic1, '{ADDR_TOPIC}')
    AND regexp_matches(topic2, '{ADDR_TOPIC}')

  UNION ALL

  SELECT
    day,
    '0x' || lower(substr(topic2, 27, 40)) AS from_addr,
    '0x' || lower(substr(topic3, 27, 40)) AS to_addr
  FROM ev
  WHERE topic0 IN ('{TRANSFER_SINGLE}', '{TRANSFER_BATCH}')
    AND regexp_matches(topic2, '{ADDR_TOPIC}')
    AND regexp_matches(topic3, '{ADDR_TOPIC}')
),
senders AS (
  SELECT day, from_address AS addr FROM tx
  UNION ALL
  SELECT day, from_addr AS addr FROM xfers
),
active AS (
  SELECT day, from_address AS addr FROM tx
  UNION ALL SELECT day, to_address AS addr FROM tx
  UNION ALL SELECT day, from_addr AS addr FROM xfers
  UNION ALL SELECT day, to_addr AS addr FROM xfers
),
active_counts AS (
  SELECT day, count(DISTINCT addr) AS active_addresses_documented
  FROM active
  WHERE addr IS NOT NULL
    AND addr <> ''
    AND addr <> '{ZERO}'
  GROUP BY day
),
sender_counts AS (
  SELECT day, count(DISTINCT addr) AS active_senders_documented
  FROM senders
  WHERE addr IS NOT NULL
    AND addr <> ''
    AND addr <> '{ZERO}'
  GROUP BY day
)
SELECT
  active_counts.day,
  active_addresses_documented,
  active_senders_documented
FROM active_counts
JOIN sender_counts USING (day)
ORDER BY active_counts.day
"""

print(con.execute(query).fetchdf())
PY

4Run the accurate monthly distinct query

-- After the tx, ev, and xfers CTEs above, add these CTEs and SELECT.
-- The monthly calculation removes the day grouping and deduplicates once
-- across all of April.

, monthly_senders AS (
  SELECT from_address AS addr FROM tx
  UNION ALL
  SELECT from_addr AS addr FROM xfers
),
monthly_active AS (
  SELECT from_address AS addr FROM tx
  UNION ALL SELECT to_address AS addr FROM tx
  UNION ALL SELECT from_addr AS addr FROM xfers
  UNION ALL SELECT to_addr AS addr FROM xfers
)
SELECT
  (SELECT count(DISTINCT addr)
   FROM monthly_active
   WHERE addr IS NOT NULL
     AND addr <> ''
     AND addr <> '0x0000000000000000000000000000000000000000') AS monthly_active_addresses,
  (SELECT count(DISTINCT addr)
   FROM monthly_senders
   WHERE addr IS NOT NULL
     AND addr <> ''
     AND addr <> '0x0000000000000000000000000000000000000000') AS monthly_active_senders;

Expected April 2026 result: 16,196,763 monthly active addresses and 1,633,559 monthly active senders.

Daily Results

Day Active addresses Active senders Transactions Tx senders Tx from/to
2026-04-01751,897653,5022,696,641646,187651,483
2026-04-02642,955607,6882,939,991600,576604,910
2026-04-03776,175652,8212,845,553646,938650,799
2026-04-04626,372596,6563,390,126590,852593,972
2026-04-05697,528657,1583,554,714651,728664,596
2026-04-06631,660595,3613,634,895587,607591,800
2026-04-07800,700692,9113,611,674685,948690,222
2026-04-08721,888597,1583,604,950590,163594,087
2026-04-09706,786654,3122,660,281646,023649,918
2026-04-10648,922607,6932,609,197597,563604,891
2026-04-11670,897648,8782,372,346641,362646,057
2026-04-12695,639600,3552,117,938593,875597,566
2026-04-13689,671651,7252,229,646643,947647,921
2026-04-14629,617611,4372,252,140603,417608,105
2026-04-15695,311640,7782,266,864634,390638,317
2026-04-16672,717625,1022,264,401617,652622,050
2026-04-17679,955638,3382,355,057631,484635,383
2026-04-181,081,874620,1592,732,837613,487621,488
2026-04-19839,322634,1372,304,830627,186632,371
2026-04-201,538,388620,3822,372,026612,434617,010
2026-04-214,834,827632,1062,525,307625,406634,107
2026-04-22715,773623,7392,056,482615,913619,834
2026-04-23700,231628,6422,054,777620,402625,884
2026-04-24707,853618,9082,047,191612,343617,930
2026-04-255,786,233627,2582,350,024621,853631,095
2026-04-262,949,652620,0362,308,035614,017619,757
2026-04-27735,776629,6172,222,358622,630626,977
2026-04-28652,508613,3532,000,719605,904610,283
2026-04-29753,164644,0532,062,706635,061643,199
2026-04-30701,953613,9451,922,994606,541617,301