The Argument
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.
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.
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.
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.
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.
| Day | Doc active | Tx baseline | Transfer-only | Transfer-only senders | ERC721 spray contracts | ERC721 spray recipients | Transfer-only from spray |
|---|---|---|---|---|---|---|---|
| 2026-04-18 | 1,081,874 | 621,488 | 460,386 | 6,672 | 0 | 0 | 0 |
| 2026-04-20 | 1,538,388 | 617,010 | 921,378 | 7,948 | 925 | 938,066 | 859,748 |
| 2026-04-21 | 4,834,827 | 634,107 | 4,200,720 | 6,700 | 4,496 | 4,496,471 | 4,095,555 |
| 2026-04-25 | 5,786,233 | 631,095 | 5,155,138 | 5,405 | 5,084 | 5,072,864 | 5,066,421 |
| 2026-04-26 | 2,949,652 | 619,757 | 2,329,895 | 6,019 | 2,261 | 2,261,227 | 2,258,467 |
| Day | Top sampled label | Top contract | Top contract recipients | Sample result |
|---|---|---|---|---|
| 2026-04-20 | evmlab | 0x4273e308264a5049e6e5bd812fd83f974b6e30d6 | 14,781 | Top 15 report ERC721 metadata; all labeled evmlab. |
| 2026-04-21 | evmlab | 0xbaa7f4963a8559f495c4a359b60222c265f78264 | 1,001 | Top 15 report ERC721 metadata; all labeled evmlab. |
| 2026-04-25 | evmhub | 0xce606340828380c002cebe0896834698c2a0a964 | 1,001 | Top 15 report ERC721 metadata; mostly evmhub. |
| 2026-04-26 | evmhub | 0x6d9ffa87c87883f9b5f3022dfc624ae2fa8e086a | 1,001 | Top 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.
to = null creation txs.
0xb0b0b6903489cc56bf037cb2f5ba986e2775bb07 before creation.
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.
| Day | Sample | Prior any | No prior | Prior normal tx | Prior ERC20 | Prior ERC721 | Prior ERC1155 |
|---|---|---|---|---|---|---|---|
| 2026-04-20 | 8 | 0 | 8 | 0 | 0 | 0 | 0 |
| 2026-04-21 | 8 | 0 | 8 | 0 | 0 | 0 | 0 |
| 2026-04-25 | 8 | 1 | 7 | 0 | 1 | 0 | 1 |
| 2026-04-26 | 8 | 0 | 8 | 0 | 0 | 0 | 0 |
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.
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-01 | 751,897 | 653,502 | 2,696,641 | 646,187 | 651,483 |
| 2026-04-02 | 642,955 | 607,688 | 2,939,991 | 600,576 | 604,910 |
| 2026-04-03 | 776,175 | 652,821 | 2,845,553 | 646,938 | 650,799 |
| 2026-04-04 | 626,372 | 596,656 | 3,390,126 | 590,852 | 593,972 |
| 2026-04-05 | 697,528 | 657,158 | 3,554,714 | 651,728 | 664,596 |
| 2026-04-06 | 631,660 | 595,361 | 3,634,895 | 587,607 | 591,800 |
| 2026-04-07 | 800,700 | 692,911 | 3,611,674 | 685,948 | 690,222 |
| 2026-04-08 | 721,888 | 597,158 | 3,604,950 | 590,163 | 594,087 |
| 2026-04-09 | 706,786 | 654,312 | 2,660,281 | 646,023 | 649,918 |
| 2026-04-10 | 648,922 | 607,693 | 2,609,197 | 597,563 | 604,891 |
| 2026-04-11 | 670,897 | 648,878 | 2,372,346 | 641,362 | 646,057 |
| 2026-04-12 | 695,639 | 600,355 | 2,117,938 | 593,875 | 597,566 |
| 2026-04-13 | 689,671 | 651,725 | 2,229,646 | 643,947 | 647,921 |
| 2026-04-14 | 629,617 | 611,437 | 2,252,140 | 603,417 | 608,105 |
| 2026-04-15 | 695,311 | 640,778 | 2,266,864 | 634,390 | 638,317 |
| 2026-04-16 | 672,717 | 625,102 | 2,264,401 | 617,652 | 622,050 |
| 2026-04-17 | 679,955 | 638,338 | 2,355,057 | 631,484 | 635,383 |
| 2026-04-18 | 1,081,874 | 620,159 | 2,732,837 | 613,487 | 621,488 |
| 2026-04-19 | 839,322 | 634,137 | 2,304,830 | 627,186 | 632,371 |
| 2026-04-20 | 1,538,388 | 620,382 | 2,372,026 | 612,434 | 617,010 |
| 2026-04-21 | 4,834,827 | 632,106 | 2,525,307 | 625,406 | 634,107 |
| 2026-04-22 | 715,773 | 623,739 | 2,056,482 | 615,913 | 619,834 |
| 2026-04-23 | 700,231 | 628,642 | 2,054,777 | 620,402 | 625,884 |
| 2026-04-24 | 707,853 | 618,908 | 2,047,191 | 612,343 | 617,930 |
| 2026-04-25 | 5,786,233 | 627,258 | 2,350,024 | 621,853 | 631,095 |
| 2026-04-26 | 2,949,652 | 620,036 | 2,308,035 | 614,017 | 619,757 |
| 2026-04-27 | 735,776 | 629,617 | 2,222,358 | 622,630 | 626,977 |
| 2026-04-28 | 652,508 | 613,353 | 2,000,719 | 605,904 | 610,283 |
| 2026-04-29 | 753,164 | 644,053 | 2,062,706 | 635,061 | 643,199 |
| 2026-04-30 | 701,953 | 613,945 | 1,922,994 | 606,541 | 617,301 |