# AntSeedStats

> Independent analytics for AntSeed, the peer-to-peer AI-inference marketplace on Base. Every figure is read from Base chain data or from what sellers announce, labelled as such, and stamped with the block it is from. Not affiliated with the AntSeed team; not financial advice.

The site is built to be read by agents as well as people: every page has a JSON twin under /api/v1 (linked from the page head and from a Link header), the same endpoints are MCP tools, and the definitions behind every number are in /llms-full.txt. The data is licensed CC BY 4.0: free to use with attribution to AntSeedStats (antseedstats.com). No key; 60 requests per minute per IP, with X-RateLimit headers.

## Key concepts

- AntSeed is a peer-to-peer marketplace for AI inference on Base: buyers pay sellers in USDC through payment channels, the protocol takes a flat 4% fee, and every 7-day epoch mints $ANTS to sellers and buyers in proportion to their points.
- Settled means paid on-chain (ChannelSettled events, the source of every revenue figure). Served means tokens and requests reported in MetadataRecorded events. The two are counted separately and never mixed.
- Gross is the full buyer-paid amount including the 4% fee; net to sellers is gross minus the fee. Headline revenue on this site is gross.
- Organic is our view of the market without wash trading: it leaves out sellers in AntSeed's on-chain wash registry (a chain fact) and the clusters we confirmed ourselves (our judgement). Lists default to all, rankings default to organic, and every row carries both flags.
- $ANTS transfers are gated, so it has no market price and this site never invents one. The canonical token is 0xa87EE81b2C0Bc659307ca2D9ffdC38514DD85263; price sites that list an $ANTS token index an unrelated impostor.
- Money comes as integer micro-USDC (exact) plus a 2-decimal string; timestamps are UTC seconds; days are UTC calendar days; 24h, 7d and 30d windows are rolling.
- Every API response carries meta.as_of_block, the Base block the data is from, and meta.sources, which labels each figure as chain (read from Base), announce (what a seller publishes about itself) or antseedstats (a definition of ours).
- Figures are lower bounds wherever they depend on data buyers choose to share (per-model usage, free-tier usage). The site says so next to the figure.


## Links

- [Full backstage in one file](https://antseedstats.com/llms-full.txt): API reference, MCP tools, every definition behind the tips, the FAQ, the changelog
- [OpenAPI 3.1](https://antseedstats.com/api/v1/openapi.json): every endpoint, parameter and response field
- [API root](https://antseedstats.com/api/v1): a JSON map of every machine-readable door
- [MCP server](https://antseedstats.com/mcp): Streamable HTTP, no key; locally: npx -y @antseedstats/mcp-server
- [Developers](https://antseedstats.com/developers): a curl per endpoint, a Try it box, the MCP setup per client
- [For agents](https://antseedstats.com/for-agents): how this site is built for agents, and the data policy
- [FAQ](https://antseedstats.com/faq): what AntSeed, $ANTS, DIEM, points and the views mean
- [Changelog](https://antseedstats.com/changelog): what changed on the site and in the API, newest first
- [Status](https://antseedstats.com/status): indexer health, chain head and lag
- [Sitemap](https://antseedstats.com/sitemap.xml): every public page

## API reference

Generated from the catalogue that also drives the router, the OpenAPI document (https://antseedstats.com/api/v1/openapi.json), the Developers page and the MCP tools. All GET, JSON by default, envelope { data, meta }.

### Network

#### GET /network/summary

Lifetime totals, windows, current epoch. The home page numbers. Lifetime settled USDC and fees come from every ChannelSettled event. The 24h, 7d and 30d windows are rolling (not calendar) and count distinct buyers and sellers inside the window. paid_usage_24h comes from settlements whose buyers shared a per-model split, so it is a lower bound.

- Example: https://antseedstats.com/api/v1/network/summary
- Page: https://antseedstats.com/
- MCP tool: antseedstats_network_summary
- Cache: live tier (see meta.max_age_s)
- Sources: lifetime=chain, windows=chain, paid_usage_24h=chain, epoch=chain
- Fields:
  - lifetime.settled_micro (integer): settled in micro-USDC (integer, 6 decimals)
  - lifetime.settled_usd (string): settled in USDC, formatted with 2 decimals
  - lifetime.fees_micro (integer): fees in micro-USDC (integer, 6 decimals)
  - lifetime.fees_usd (string): fees in USDC, formatted with 2 decimals
  - lifetime.settles (integer): Settlement events
  - lifetime.buyers (integer): Distinct buyers that settled
  - lifetime.sellers (integer): Distinct sellers that settled
  - lifetime.tokens_in (integer): Input tokens (MetadataRecorded)
  - lifetime.tokens_out (integer): Output tokens
  - lifetime.requests (integer): Requests
  - windows (object): Rolling windows ending now
  - windows.24h.settled_micro (integer): settled in micro-USDC (integer, 6 decimals)
  - windows.24h.settled_usd (string): settled in USDC, formatted with 2 decimals
  - windows.24h.settles (integer): Settles
  - windows.24h.buyers (integer): Distinct buyers
  - windows.24h.sellers (integer): Distinct sellers
  - windows.7d.settled_micro (integer): settled in micro-USDC (integer, 6 decimals)
  - windows.7d.settled_usd (string): settled in USDC, formatted with 2 decimals
  - windows.7d.settles (integer): Settles
  - windows.7d.buyers (integer): Distinct buyers
  - windows.7d.sellers (integer): Distinct sellers
  - windows.30d.settled_micro (integer): settled in micro-USDC (integer, 6 decimals)
  - windows.30d.settled_usd (string): settled in USDC, formatted with 2 decimals
  - windows.30d.settles (integer): Settles
  - windows.30d.buyers (integer): Distinct buyers
  - windows.30d.sellers (integer): Distinct sellers
  - paid_usage_24h (object): Rolling 24h from per-model usage (lower bound)
  - paid_usage_24h.requests (integer): Paid requests
  - paid_usage_24h.tokens (integer): Paid tokens
  - paid_usage_24h.images (integer): Generated images
  - paid_usage_24h.free_requests (integer): Free-tier requests
  - paid_usage_24h.free_tokens (integer): Free-tier tokens
  - paid_usage_24h.models (integer): Distinct models used
  - paid_usage_24h.coverage (number): Share of settlements carrying a per-model split, 0 to 1
  - epoch.number (integer): Current epoch
  - epoch.starts_ts (integer): UTC seconds
  - epoch.ends_ts (integer): UTC seconds
  - epoch.seconds_left (integer): Until the next epoch

#### GET /network/daily

Per UTC day: settled, users, tokens. One row per UTC calendar day with no gaps. Settled and fees from ChannelSettled; tokens and requests from MetadataRecorded (paid); free usage from the free-tier counters; users are distinct accounts that settled that day. Today is partial.

- Example: https://antseedstats.com/api/v1/network/daily?from=2026-09-30&to=2026-10-06
- Page: https://antseedstats.com/revenue
- MCP tool: antseedstats_network_daily
- Cache: history tier (see meta.max_age_s)
- Sources: days=chain
- Parameters:
  - from (query, date): First UTC day, YYYY-MM-DD (default: 30 days ago)
  - to (query, date): Last UTC day, YYYY-MM-DD (default: today)
  - format (query, enum, default json, one of json|csv): json (default) or csv
- Fields:
  - from (string): First day returned
  - to (string): Last day returned
  - days[] (array)
  - days[].day (string): UTC calendar day
  - days[].settled_micro (integer): settled in micro-USDC (integer, 6 decimals)
  - days[].settled_usd (string): settled in USDC, formatted with 2 decimals
  - days[].fees_micro (integer): fees in micro-USDC (integer, 6 decimals)
  - days[].fees_usd (string): fees in USDC, formatted with 2 decimals
  - days[].settles (integer): Settlement events
  - days[].users (integer): Distinct accounts that settled (buyers plus sellers)
  - days[].new_users (integer): Accounts whose first settlement is this day
  - days[].buyers (integer): Distinct buyers
  - days[].sellers (integer): Distinct sellers
  - days[].free_only_users (integer): Accounts active on the free tier only
  - days[].tokens_in (integer): Paid input tokens
  - days[].tokens_out (integer): Paid output tokens
  - days[].requests (integer): Paid requests
  - days[].free_tokens (integer): Free-tier tokens
  - days[].free_requests (integer): Free-tier requests

#### GET /leaders

Last 24h leaders, wash left out. The 'Happening now' band. Rolling 24h window. Sellers we treat as wash trading are left out of every ranking (excluded_sellers says how many were active); this is our judgement, not a chain fact. Model rankings use per-model usage shared by buyers, so they are lower bounds.

- Example: https://antseedstats.com/api/v1/leaders
- Page: https://antseedstats.com/
- MCP tool: antseedstats_leaders
- Cache: live tier (see meta.max_age_s)
- Sources: seller=chain, models=chain, exclusion=antseedstats
- Fields:
  - window_hours (integer): 24
  - seller.address (string): Lowercase 0x
  - seller.name (string | null): Announced name (untrusted)
  - seller.settled_micro (integer): settled in micro-USDC (integer, 6 decimals)
  - seller.settled_usd (string): settled in USDC, formatted with 2 decimals
  - seller.buyers (integer): Distinct buyers
  - top_model_by_sales.model (string): Canonical id
  - top_model_by_sales.display (string): Name
  - top_model_by_sales.settled_micro (integer): settled in micro-USDC (integer, 6 decimals)
  - top_model_by_sales.settled_usd (string): settled in USDC, formatted with 2 decimals
  - top_model_by_sales.tokens (integer): Tokens
  - top_model_by_sales.requests (integer): Requests
  - top_model_by_sales.buyers (integer): Buyers
  - top_model_by_tokens.model (string): Canonical id
  - top_model_by_tokens.display (string): Name
  - top_model_by_tokens.settled_micro (integer): settled in micro-USDC (integer, 6 decimals)
  - top_model_by_tokens.settled_usd (string): settled in USDC, formatted with 2 decimals
  - top_model_by_tokens.tokens (integer): Tokens
  - top_model_by_tokens.requests (integer): Requests
  - top_model_by_tokens.buyers (integer): Buyers
  - top_free_model.model (string): Canonical id
  - top_free_model.display (string): Name
  - top_free_model.tokens (integer): Free tokens
  - top_free_model.requests (integer): Free requests
  - top_free_model.buyers (integer): Buyers
  - excluded_sellers (integer): Wash-trading sellers active in the window and left out

### Sellers

#### GET /sellers

Every seller, lifetime and 7-day figures. The seller leaderboard. Lifetime figures from ChannelSettled and MetadataRecorded. wash_registry is AntSeed's on-chain verdict; organic is our view (registry plus confirmed clusters). The default view is all: nothing is hidden unless you ask.

- Example: https://antseedstats.com/api/v1/sellers?sort=revenue_7d&view=organic&limit=10
- Page: https://antseedstats.com/sellers
- MCP tool: antseedstats_sellers
- Cache: history tier (see meta.max_age_s)
- Sources: figures=chain, name=announce, reputation=antseedstats, wash_registry=chain, organic=antseedstats
- Parameters:
  - sort (query, enum, default revenue_7d, one of revenue_7d|revenue|tokens|requests): Sort key, descending
  - view (query, enum, default all, one of all|organic): organic leaves out sellers in the on-chain wash registry plus our confirmed clusters; all keeps every seller
  - limit (query, int, default 100): Rows to return (1 to 1000)
  - offset (query, int, default 0): Rows to skip
- Fields:
  - total (integer): Sellers matching the view
  - sellers[] (array)
  - sellers[].address (string): Lowercase 0x address
  - sellers[].agent_id (string | null): On-chain agent id (null for announce-only peers)
  - sellers[].name (string | null): Display name from the seller's own announcement (untrusted text)
  - sellers[].verified (boolean): Has a domain or GitHub proof we verified
  - sellers[].live (boolean): Announcing on the DHT right now
  - sellers[].revenue_micro (integer): revenue in micro-USDC (integer, 6 decimals)
  - sellers[].revenue_usd (string): revenue in USDC, formatted with 2 decimals
  - sellers[].revenue_7d_micro (integer): revenue 7d in micro-USDC (integer, 6 decimals)
  - sellers[].revenue_7d_usd (string): revenue 7d in USDC, formatted with 2 decimals
  - sellers[].fees_micro (integer): fees in micro-USDC (integer, 6 decimals)
  - sellers[].fees_usd (string): fees in USDC, formatted with 2 decimals
  - sellers[].settles (integer): Lifetime settlement events
  - sellers[].channels (integer): Lifetime payment channels
  - sellers[].tokens (integer): Lifetime tokens served, input plus output (MetadataRecorded)
  - sellers[].requests (integer): Lifetime requests (MetadataRecorded)
  - sellers[].models (integer): Models advertised
  - sellers[].reputation (number | null): Trust score 0 to 100 (AntSeed SDK formula, recomputed by us)
  - sellers[].ghost_rate (number | null): Share of channels opened and never settled, 0 to 1
  - sellers[].wash_registry (boolean): Proven wash trader in AntSeed's on-chain registry (chain fact)
  - sellers[].organic (boolean): In our Organic view: not in the registry and not in a cluster we confirmed (our judgement)
  - sellers[].first_settle_ts (integer | null): First settlement, UTC seconds (null if none)
  - sellers[].last_settle_ts (integer | null): Last settlement, UTC seconds (null if none)

#### GET /sellers/{address}

One seller: totals, trust, verification. Everything the seller page shows. trust holds the four weighted parts of the AntSeed trust score (history 50, usage 20, power 10, identity 20) as we recompute them from on-chain inputs; wash_registry comes from the registry contract.

- Example: https://antseedstats.com/api/v1/sellers/0xd19ffae0e85b5230422019926b2f37ec0f1f41f3
- Page: https://antseedstats.com/sellers/0xd19ffae0e85b5230422019926b2f37ec0f1f41f3
- MCP tool: antseedstats_sellers_detail
- Cache: live tier (see meta.max_age_s)
- Sources: figures=chain, name=announce, prices=announce, reputation=antseedstats, verification=antseedstats, wash_registry=chain, organic=antseedstats
- Parameters:
  - address (path, address, required): Seller address (0x, 40 hex, any case)
- Fields:
  - address (string): Lowercase 0x
  - agent_id (string | null): On-chain agent id
  - peer_id (string | null): DHT peer id
  - name (string | null): Announced name (untrusted)
  - rank (integer | null): Position by lifetime revenue
  - share (number | null): Share of lifetime network revenue, 0 to 1
  - revenue_micro (integer): revenue in micro-USDC (integer, 6 decimals)
  - revenue_usd (string): revenue in USDC, formatted with 2 decimals
  - revenue_7d_micro (integer): revenue 7d in micro-USDC (integer, 6 decimals)
  - revenue_7d_usd (string): revenue 7d in USDC, formatted with 2 decimals
  - revenue_prev_7d_micro (integer): revenue prev 7d in micro-USDC (integer, 6 decimals)
  - revenue_prev_7d_usd (string): revenue prev 7d in USDC, formatted with 2 decimals
  - fees_micro (integer): fees in micro-USDC (integer, 6 decimals)
  - fees_usd (string): fees in USDC, formatted with 2 decimals
  - settles (integer): Settlements
  - channels (integer): Channels
  - buyers (integer): Distinct buyers
  - tokens (integer): Tokens served
  - requests (integer): Requests
  - reputation (number | null): Trust score 0 to 100
  - trust.history (number | null): 0 to 50
  - trust.usage (number | null): 0 to 20
  - trust.power (number | null): 0 to 10
  - trust.identity (number | null): 0 to 20
  - trust.identity_kind (string | null): Kind of identity claim
  - trust.epoch (integer | null): Epoch the score was computed for
  - ghost_rate (number | null): Channels never settled over channels opened, 0 to 1
  - stake_usdc (number | null): USDC stake on-chain
  - verified (boolean): Has a domain or GitHub proof we verified
  - verification[] (array)
  - verification[].kind (string): domain or github
  - verification[].target (string): Domain or GitHub user
  - verification[].verified (boolean): Effective state
  - verification[].href (string): Verified resource
  - live (boolean): Announcing on the DHT now
  - wash_registry (boolean): Proven wash trader on-chain
  - organic (boolean): In our Organic view
  - first_settle_ts (integer | null): UTC seconds
  - last_settle_ts (integer | null): UTC seconds

#### GET /sellers/{address}/daily

One seller per UTC day (the cross-check). The cross-check series. settled is what changed hands on-chain for this seller that day (every ChannelSettled where it is the seller), which is why it can differ from what the seller measured as served. Tokens come from MetadataRecorded for the seller's agent and are null for announce-only peers.

- Example: https://antseedstats.com/api/v1/sellers/0xd19ffae0e85b5230422019926b2f37ec0f1f41f3/daily?from=2026-09-30&to=2026-10-06
- Page: https://antseedstats.com/sellers/0xd19ffae0e85b5230422019926b2f37ec0f1f41f3
- MCP tool: antseedstats_sellers_daily
- Cache: history tier (see meta.max_age_s)
- Sources: days=chain
- Parameters:
  - address (path, address, required): Seller address (0x, 40 hex, any case)
  - from (query, date): First UTC day, YYYY-MM-DD (default: 30 days ago)
  - to (query, date): Last UTC day, YYYY-MM-DD (default: today)
  - format (query, enum, default json, one of json|csv): json (default) or csv
- Fields:
  - address (string): Lowercase 0x
  - from (string): First day
  - to (string): Last day
  - days[] (array)
  - days[].day (string): UTC day
  - days[].settled_micro (integer): settled in micro-USDC (integer, 6 decimals)
  - days[].settled_usd (string): settled in USDC, formatted with 2 decimals
  - days[].fees_micro (integer): fees in micro-USDC (integer, 6 decimals)
  - days[].fees_usd (string): fees in USDC, formatted with 2 decimals
  - days[].settles (integer): Settlements
  - days[].buyers (integer): Distinct buyers
  - days[].tokens_in (integer | null): Input tokens
  - days[].tokens_out (integer | null): Output tokens

#### GET /sellers/{address}/models

What a seller advertises and sold. advertised is the signed metadata as the network sees it (prices in USD per 1M tokens). sold is decoded from settlements whose buyers shared a per-model split, so it is a lower bound and names come as advertised.

- Example: https://antseedstats.com/api/v1/sellers/0xd19ffae0e85b5230422019926b2f37ec0f1f41f3/models
- Page: https://antseedstats.com/sellers/0xd19ffae0e85b5230422019926b2f37ec0f1f41f3
- MCP tool: antseedstats_sellers_models
- Cache: catalog tier (see meta.max_age_s)
- Sources: advertised=announce, sold=chain
- Parameters:
  - address (path, address, required): Seller address (0x, 40 hex, any case)
- Fields:
  - address (string): Lowercase 0x
  - advertised[] (array)
  - advertised[].model (string): Canonical id
  - advertised[].model_display (string): Name
  - advertised[].advertised_as (string): Raw announced name
  - advertised[].input_usd_per_m (number | null): USD per 1M input
  - advertised[].cached_input_usd_per_m (number | null): USD per 1M cached input
  - advertised[].output_usd_per_m (number | null): USD per 1M output
  - advertised[].free (boolean): 0 and 0
  - advertised[].protocols (string | null): CSV of API protocols
  - advertised[].categories (string | null): Seller tags, CSV
  - sold[] (array)
  - sold[].model (string): Canonical id
  - sold[].model_display (string): Name
  - sold[].settled_micro (integer): settled in micro-USDC (integer, 6 decimals)
  - sold[].settled_usd (string): settled in USDC, formatted with 2 decimals
  - sold[].tokens (integer): Tokens
  - sold[].requests (integer): Requests
  - sold[].buyers (integer): Distinct buyers

### Models and prices

#### GET /models

Catalogue: sellers, prices, usage. One row per canonical model (name variants merged). Prices are the min and max advertised across sellers. Usage is lifetime and a lower bound (per-model splits are opt-in). all counts every seller; organic leaves out wash-trading sellers. The default view is organic, like the site; models with no organic usage are still listed.

- Example: https://antseedstats.com/api/v1/models?view=organic&limit=10
- Page: https://antseedstats.com/models
- MCP tool: antseedstats_models
- Cache: history tier (see meta.max_age_s)
- Sources: prices=announce, usage=chain, organic=antseedstats
- Parameters:
  - view (query, enum, default organic, one of all|organic): organic leaves out sellers in the on-chain wash registry plus our confirmed clusters; all keeps every seller
  - sort (query, enum, default revenue, one of revenue|tokens|requests|sellers): Sort key, descending, applied to the chosen view
  - limit (query, int, default 100): Rows to return (1 to 1000)
  - offset (query, int, default 0): Rows to skip
- Fields:
  - total (integer): Models
  - models[] (array)
  - models[].model (string): Canonical id
  - models[].display (string): Name
  - models[].custom (boolean): A seller's own model, not in any catalog
  - models[].sellers (integer): Sellers advertising it
  - models[].image_generation (boolean): Priced per image
  - models[].min_input_usd_per_m (number | null): Cheapest input price
  - models[].max_input_usd_per_m (number | null): Dearest input price
  - models[].min_output_usd_per_m (number | null): Cheapest output
  - models[].max_output_usd_per_m (number | null): Dearest output
  - models[].min_image_usd (number | null): Cheapest price per image
  - models[].usage (object): In the chosen view
  - models[].usage.settled_micro (integer): settled in micro-USDC (integer, 6 decimals)
  - models[].usage.settled_usd (string): settled in USDC, formatted with 2 decimals
  - models[].usage.tokens (integer): Tokens
  - models[].usage.images (integer): Images
  - models[].usage.requests (integer): Requests
  - models[].usage.buyers (integer): Buyers
  - models[].usage.sellers (integer): Sellers with sales
  - models[].usage_all (object): Every seller, always
  - models[].usage_all.settled_micro (integer): settled in micro-USDC (integer, 6 decimals)
  - models[].usage_all.settled_usd (string): settled in USDC, formatted with 2 decimals
  - models[].usage_all.tokens (integer): Tokens
  - models[].usage_all.requests (integer): Requests
  - models[].usage_all.buyers (integer): Buyers
  - models[].usage_all.sellers (integer): Sellers with sales

#### GET /models/{id}

Where to buy one model. Accepts the canonical id or any advertised spelling, in any case or separator (Kimi K3 works). Sellers are deduplicated (cheapest input price) and come trusted first, then cheapest, unless sort says otherwise. The filters answer the question a buyer asks: which sellers of this model meet my conditions. Without filters the list hides nobody.

- Example: https://antseedstats.com/api/v1/models/kimi-k3?trusted=true
- Page: https://antseedstats.com/models/kimi-k3
- MCP tool: antseedstats_models_detail
- Cache: catalog tier (see meta.max_age_s)
- Sources: prices=announce, reputation=antseedstats, organic=antseedstats, usage=chain
- Parameters:
  - id (path, string, required): Canonical model id or an advertised name
  - free (query, bool): true: only free listings; false: only paid
  - min_reputation (query, number): Only sellers with a trust score at or above this (0 to 100)
  - verified (query, bool): true: only sellers with a domain or GitHub proof we verified
  - organic (query, bool): true: only sellers outside the wash registry and our confirmed clusters; false: only the others
  - live (query, bool): true: only sellers announcing on the DHT right now
  - trusted (query, bool): true: only sellers that settled on-chain and score at or above 60, the SDK's own routing gate (the calculator's rule)
  - max_input_usd_per_m (query, number): Only listings at or below this USD per 1M input tokens
  - max_output_usd_per_m (query, number): Only listings at or below this USD per 1M output tokens
  - sort (query, enum, default trusted, one of trusted|price|reputation): trusted: trusted sellers first, then cheapest input; price: cheapest input first; reputation: highest trust score first
- Fields:
  - model (string): Canonical id
  - display (string): Name
  - custom (boolean): Seller's own model
  - advertised_as[] (array)
  - usage (object): Lifetime, every seller, lower bound
  - usage.settled_micro (integer): settled in micro-USDC (integer, 6 decimals)
  - usage.settled_usd (string): settled in USDC, formatted with 2 decimals
  - usage.tokens (integer): Tokens
  - usage.requests (integer): Requests
  - usage.buyers (integer): Buyers
  - usage.sellers (integer): Sellers
  - usage_organic.settled_micro (integer): settled in micro-USDC (integer, 6 decimals)
  - usage_organic.settled_usd (string): settled in USDC, formatted with 2 decimals
  - usage_organic.tokens (integer): Tokens
  - usage_organic.requests (integer): Requests
  - usage_organic.buyers (integer): Buyers
  - usage_organic.sellers (integer): Sellers
  - sellers[] (array)
  - sellers[].address (string | null): Lowercase 0x
  - sellers[].agent_id (string): Agent id
  - sellers[].name (string | null): Announced name (untrusted)
  - sellers[].advertised_as (string): Raw name
  - sellers[].input_usd_per_m (number | null): USD per 1M input
  - sellers[].cached_input_usd_per_m (number | null): USD per 1M cached input
  - sellers[].output_usd_per_m (number | null): USD per 1M output
  - sellers[].image_usd (number | null): USD per image
  - sellers[].free (boolean): 0 and 0
  - sellers[].reputation (number | null): Trust score
  - sellers[].verified (boolean): Verified proof
  - sellers[].organic (boolean): In our Organic view
  - sellers[].proven (boolean): Has settled on-chain (carries a trust score and usage)
  - sellers[].trusted (boolean): Proven and scoring at or above 60, the SDK routing gate (our rule, the calculator's pick)
  - sellers[].live (boolean): Announcing on the DHT right now
  - sellers[].request_id (string | null): peerId@model, what a buyer sends

#### GET /prices

Every listing with list-price savings. The network explorer flattened: one row per seller and model with the advertised prices, whether it is free, the OpenRouter list price for the same model and the saving against it. Filter by model to compare sellers; the intent filters (trusted, verified, organic, live, price caps) narrow to the sellers a buyer would use. Sorted by model, then trusted first and cheapest input.

- Example: https://antseedstats.com/api/v1/prices?model=kimi-k3&trusted=true
- Page: https://antseedstats.com/network
- MCP tool: antseedstats_prices
- Cache: catalog tier (see meta.max_age_s)
- Sources: prices=announce, list_price=antseedstats, reputation=antseedstats, organic=antseedstats
- Parameters:
  - model (query, string): Canonical model id to filter on (any spelling)
  - free (query, bool): true: only free listings; false: only paid
  - view (query, enum, default all, one of all|organic): organic leaves out sellers in the on-chain wash registry plus our confirmed clusters; all keeps every seller
  - min_reputation (query, number): Only sellers with a trust score at or above this (0 to 100)
  - verified (query, bool): true: only sellers with a domain or GitHub proof we verified
  - organic (query, bool): true: only sellers outside the wash registry and our confirmed clusters; false: only the others
  - live (query, bool): true: only sellers announcing on the DHT right now
  - trusted (query, bool): true: only sellers that settled on-chain and score at or above 60, the SDK's own routing gate (the calculator's rule)
  - max_input_usd_per_m (query, number): Only listings at or below this USD per 1M input tokens
  - max_output_usd_per_m (query, number): Only listings at or below this USD per 1M output tokens
  - sort (query, enum, default trusted, one of trusted|price|reputation): trusted: trusted sellers first, then cheapest input; price: cheapest input first; reputation: highest trust score first
  - limit (query, int, default 100): Rows to return (1 to 1000)
  - offset (query, int, default 0): Rows to skip
- Fields:
  - total (integer): Listings matching
  - listings[] (array)
  - listings[].seller (string): Lowercase 0x address
  - listings[].seller_name (string | null): Announced display name (untrusted text)
  - listings[].agent_id (string | null): On-chain agent id
  - listings[].model (string): Canonical model id (the /models/{id} slug)
  - listings[].model_display (string): Display name
  - listings[].advertised_as (string): The raw name the seller announces
  - listings[].input_usd_per_m (number | null): USD per 1M input tokens
  - listings[].cached_input_usd_per_m (number | null): USD per 1M cached input tokens
  - listings[].output_usd_per_m (number | null): USD per 1M output tokens
  - listings[].free (boolean): Input and output both priced at 0
  - listings[].list_input_usd_per_m (number | null): OpenRouter list price for the same model, USD per 1M input
  - listings[].save_pct (integer | null): Percent below the list price, 1 to 99, only when the listing beats it
  - listings[].reputation (number | null): Trust score 0 to 100
  - listings[].verified (boolean): Has a domain or GitHub proof we verified
  - listings[].organic (boolean): Seller in our Organic view
  - listings[].proven (boolean): Has settled on-chain (carries a trust score and usage)
  - listings[].trusted (boolean): Proven and scoring at or above 60, the SDK routing gate (our rule, the calculator's pick)
  - listings[].live (boolean): Announcing on the DHT right now
  - listings[].stake_usdc (number | null): Seller's USDC stake on-chain (proven peers)
  - listings[].capabilities[] (array)

### Epochs and $ANTS

#### GET /epochs

Every epoch: emission, points, burn. Epochs are 7 days from genesis (2026-04-09 09:54:21 UTC). Points are the on-chain usage accruals in USDC; from epoch 22 they come from the usage accounting contract, which leaves out registry-proven wash traders, so totals drop at that boundary for the same real activity. burn_ants is what the gate burned at the close of that epoch.

- Example: https://antseedstats.com/api/v1/epochs
- Page: https://antseedstats.com/rewards/history
- MCP tool: antseedstats_epochs
- Cache: history tier (see meta.max_age_s)
- Sources: epochs=chain
- Fields:
  - current (integer): Current epoch number
  - epochs[] (array)
  - epochs[].epoch (integer): Number
  - epochs[].starts_ts (integer): UTC seconds
  - epochs[].ends_ts (integer): UTC seconds
  - epochs[].status (string): complete, current or future
  - epochs[].emission_ants (number): Emission for the epoch
  - epochs[].model (string): legacy or recognized
  - epochs[].seller_points_micro (integer): seller points in micro-USDC (integer, 6 decimals)
  - epochs[].seller_points_usd (string): seller points in USDC, formatted with 2 decimals
  - epochs[].buyer_points_micro (integer): buyer points in micro-USDC (integer, 6 decimals)
  - epochs[].buyer_points_usd (string): buyer points in USDC, formatted with 2 decimals
  - epochs[].burn_ants (number | null): ANTS burned at close (null before the burn)

#### GET /epochs/{n}

One epoch, live economics if current. Same row as /epochs. For the current epoch, economics adds the budget per bucket, the usage and stake inputs and the projected burn as read from the gate now. buyer_ants_per_usd_projected divides the buyer budget by buyer usage so far: our projection, it settles only at epoch close.

- Example: https://antseedstats.com/api/v1/epochs/25
- Page: https://antseedstats.com/rewards
- MCP tool: antseedstats_epochs_detail
- Cache: live tier (see meta.max_age_s)
- Sources: epoch=chain, economics=chain, buyer_ants_per_usd_projected=antseedstats
- Parameters:
  - n (path, int, required): Epoch number
- Fields:
  - epoch (integer): Number
  - starts_ts (integer): UTC seconds
  - ends_ts (integer): UTC seconds
  - status (string): complete, current or future
  - emission_ants (number): Emission
  - model (string): legacy or recognized
  - seller_points_micro (integer): seller points in micro-USDC (integer, 6 decimals)
  - seller_points_usd (string): seller points in USDC, formatted with 2 decimals
  - buyer_points_micro (integer): buyer points in micro-USDC (integer, 6 decimals)
  - buyer_points_usd (string): buyer points in USDC, formatted with 2 decimals
  - burn_ants (number | null): Burned at close
  - economics.minted_ants (number): Minted so far this epoch
  - economics.allocated_ants (number): Budgets granted
  - economics.unallocated_ants (number): Left over
  - economics.buckets[] (array)
  - economics.buckets[].key (string): Bucket
  - economics.buckets[].cap_pct (number): Ceiling, % of emission
  - economics.buckets[].cap_ants (number): Ceiling
  - economics.buckets[].allocated_ants (number): Granted
  - economics.buckets[].dynamic (boolean): Scales with usage or stake
  - economics.burn.cap_ants (number): 30% of emission
  - economics.burn.projected_ants (number): If someone settles
  - economics.burn.realized_ants (number): Burned so far
  - economics.usage.seller_micro (integer): seller in micro-USDC (integer, 6 decimals)
  - economics.usage.seller_usd (string): seller in USDC, formatted with 2 decimals
  - economics.usage.buyer_micro (integer): buyer in micro-USDC (integer, 6 decimals)
  - economics.usage.buyer_usd (string): buyer in USDC, formatted with 2 decimals
  - economics.usage.target_micro (integer): target in micro-USDC (integer, 6 decimals)
  - economics.usage.target_usd (string): target in USDC, formatted with 2 decimals
  - economics.usage.pct_of_target (number): Input over target, %
  - economics.usage.seller_budget_ants (number): Seller usage budget
  - economics.usage.buyer_budget_ants (number): Buyer usage budget
  - economics.stake.active_ants (number): Active stake
  - economics.stake.target_ants (number): Target
  - economics.stake.pct_of_target (number): %
  - economics.buyer_ants_per_usd_projected (number | null): Buyer budget over buyer usage so far
  - economics.degraded (boolean): True when a chain read failed and these figures are not trustworthy

#### GET /ants/supply

$ANTS minted, emitted, burned, staked. The canonical token is 0xa87EE81b2C0Bc659307ca2D9ffdC38514DD85263 (transfers gated, no market price; an unrelated token with the same ticker is indexed elsewhere). emitted_ants counts completed epochs only. The partition is null when any identity it depends on failed to tie out.

- Example: https://antseedstats.com/api/v1/ants/supply
- Page: https://antseedstats.com/ants/supply
- MCP tool: antseedstats_ants_supply
- Cache: history tier (see meta.max_age_s)
- Sources: supply=chain, partition=chain
- Fields:
  - token (string): Canonical $ANTS address
  - transfers_enabled (boolean): Token transfers open to everyone
  - total_supply_ants (number): totalSupply, includes burned-to-dead
  - max_supply_ants (number): Cap
  - emitted_ants (number): Completed-epoch emission
  - burned_ants (number | null): Both burn sinks
  - burned_dead_ants (number): At 0x...dEaD
  - partition.staked_ants (number): In pools
  - partition.stakable_ants (number | null): Staked plus earned not yet staked
  - partition.staked_pct (number | null): Staked over stakable
  - partition.minted_ants (number): Minted
  - partition.pre22_ants (number): Minted before epoch 22
  - partition.segments[] (array)
  - partition.segments[].key (string): Segment
  - partition.segments[].ants (number): ANTS
  - partition.segments[].pct (number): % of total
  - burns[] (array)
  - burns[].epoch (integer): Epoch
  - burns[].ants (number): Burned at its close

### Tools

#### GET /search

Names to ids: sellers, models, labs. Turns what a person types into the ids every other endpoint takes. A seller name or agent id finds the seller (address), a model name in any spelling finds the canonical model id (kimi-k3, Kimi K3 and moonshotai/kimi-k3 are the same), a family word finds the lab, a 0x address says whether it is a seller and/or a buyer, a 0x hash says whether it is a payment channel and/or a settlement tx. Every match carries the page that shows it and the endpoint that returns it as data. Ranked: exact, prefix, every word present, substring; ties go to the busier entity.

- Example: https://antseedstats.com/api/v1/search?q=kimi
- Page: https://antseedstats.com/network
- MCP tool: antseedstats_search
- Cache: live tier (see meta.max_age_s)
- Sources: label=announce, score=antseedstats
- Parameters:
  - q (query, string, required): What to look for: a name, a model, a lab, a 0x address or a 0x hash (2 to 80 characters)
  - type (query, enum, one of seller|buyer|model|lab|channel|tx): Only this kind of match
  - limit (query, int, default 10): Matches to return (1 to 25)
- Fields:
  - query (string): The query as searched
  - matches[] (array)
  - matches[].type (string): seller, buyer, model, lab, channel, tx or address
  - matches[].id (string): The id other endpoints take: address, model id, lab slug, channel id or tx hash
  - matches[].label (string): Display name (sellers: their own announced name, untrusted text)
  - matches[].sublabel (string | null): Second line: address, raw model id or role
  - matches[].page (string): The page on antseedstats.com (BaseScan for a tx or an unknown address)
  - matches[].api (string | null): The endpoint that returns this entity as data (null for a tx)
  - matches[].score (integer): Our ranking, 0 to 100: 100 exact, 80 prefix, 60 every word, 40 substring

#### GET /estimate

Cost of a workload on AntSeed vs list. The calculator as an endpoint. Give a model and a monthly token mix; get the list price (OpenRouter), the cheapest seller, the trusted pick (settled on-chain, trust score at or above 60, wash sellers never considered) and the saving. Costs include the 4% protocol fee; the list price does not. Image, video and audio generators are not priced (they bill per generation). Prices are advertised rates, not quotes.

- Example: https://antseedstats.com/api/v1/estimate?model=kimi-k3&input_tokens=22000000&output_tokens=5500000
- Page: https://antseedstats.com/calculator
- MCP tool: antseedstats_estimate
- Cache: catalog tier (see meta.max_age_s)
- Sources: list=antseedstats, prices=announce, trusted=antseedstats
- Parameters:
  - model (query, string, required): Canonical model id or any advertised spelling
  - input_tokens (query, int, default 22000000): Input tokens per period (a coding agent: about 22 million a month)
  - output_tokens (query, int, default 5500000): Output tokens per period
  - cached_tokens (query, int, default 0): Cached input tokens per period (prompt prefixes already processed)
- Fields:
  - model (string): Canonical id
  - display (string): Name
  - tokens.input (integer): Input tokens
  - tokens.output (integer): Output tokens
  - tokens.cached (integer): Cached input tokens
  - fee_pct (number): Protocol fee applied to AntSeed costs (4)
  - mode (string): full: list price and paid offers; market-only: no list price; free-only: every listing is free
  - list (object): Null when the model has no published list price
  - list.input_usd_per_m (number): List USD per 1M input
  - list.output_usd_per_m (number): List USD per 1M output
  - list.cached_input_usd_per_m (number | null): List USD per 1M cached input
  - list.source (string): openrouter
  - list.reference_id (string): OpenRouter model id
  - list.cost_usd (number): Cost of the mix at list price, no fee
  - cheapest (object): The cheapest paid seller for this mix; null when none
  - cheapest.seller (string): Lowercase 0x
  - cheapest.name (string): Announced name (untrusted)
  - cheapest.input_usd_per_m (number): USD per 1M input
  - cheapest.output_usd_per_m (number): USD per 1M output
  - cheapest.cached_input_usd_per_m (number | null): USD per 1M cached input
  - cheapest.reputation (number | null): Trust score
  - cheapest.trusted (boolean): Passes the trusted rule
  - cheapest.verified (boolean): Domain or GitHub proof
  - cheapest.cost_usd (number): Cost of the mix, fee included
  - trusted_pick (object): The cheapest trusted seller; null when none passes the rule
  - trusted_pick.seller (string): Lowercase 0x
  - trusted_pick.name (string): Announced name (untrusted)
  - trusted_pick.input_usd_per_m (number): USD per 1M input
  - trusted_pick.output_usd_per_m (number): USD per 1M output
  - trusted_pick.cached_input_usd_per_m (number | null): USD per 1M cached input
  - trusted_pick.reputation (number | null): Trust score
  - trusted_pick.trusted (boolean): Always true
  - trusted_pick.verified (boolean): Domain or GitHub proof
  - trusted_pick.cost_usd (number): Cost of the mix, fee included
  - saving_usd (number | null): List cost minus the headline pick (trusted, else cheapest); null without a list price
  - saving_pct (number | null): The same as a percentage of list
  - free_sellers (integer): Free listings of this model
  - free_trusted (integer): Of those, passing the trusted rule
  - paid_sellers (integer): Paid listings considered

#### GET /glossary

Every definition behind the site's tips. The text behind every info dot on the site as data: what each figure is and how it is computed, with the page it appears on. The same copy a visitor reads in the tooltip, so a figure and its definition can be cited together. Filter by page or search the text.

- Example: https://antseedstats.com/api/v1/glossary?page=home
- Page: https://antseedstats.com/for-agents
- MCP tool: antseedstats_glossary
- Cache: no cache
- Sources: definitions=antseedstats
- Parameters:
  - page (query, string): Only this page key (home, revenue, sellers, models, network, staking, rewards, ants, diem, buyers, calculator, status, developers, ...)
  - q (query, string): Only definitions whose term or text contains this
- Fields:
  - total (integer): Definitions matching
  - terms[] (array)
  - terms[].id (string): page.key, stable
  - terms[].term (string): Human term
  - terms[].page (string): Page key
  - terms[].url (string): The page on antseedstats.com
  - terms[].definition (string): The definition, as shown in the tip
  - terms[].version (string): Definition version; bumps when the meaning changes

#### GET /changelog

What changed on the site and the API. The site changelog as data, newest first: version, date, title and the items. An API change is always a changelog entry, so an agent can read what moved since it last looked.

- Example: https://antseedstats.com/api/v1/changelog?limit=3
- Page: https://antseedstats.com/changelog
- MCP tool: antseedstats_changelog
- Cache: no cache
- Sources: entries=antseedstats
- Parameters:
  - limit (query, int, default 10): Entries to return
- Fields:
  - total (integer): Entries
  - entries[] (array)
  - entries[].version (string): Semver-like
  - entries[].date (string): UTC day
  - entries[].title (string): Title
  - entries[].tag (string): feature, fix or data
  - entries[].items[] (array)

### Health

#### GET /status

Indexer head, lag, subsystems. Never cached. last_indexed_block is the oldest watermark across the ingestion streams, which is also the as_of_block every other endpoint reports.

- Example: https://antseedstats.com/api/v1/status
- Page: https://antseedstats.com/status
- MCP tool: antseedstats_status
- Cache: no cache
- Sources: status=antseedstats
- Fields:
  - overall (string): ok, warn or down
  - head_block (integer | null): Base head, read live
  - last_indexed_block (integer | null): Oldest stream watermark
  - lag_blocks (integer | null): head minus last indexed
  - streams[] (array)
  - streams[].key (string): Stream
  - streams[].last_block (integer): Watermark
  - streams[].lag_blocks (integer | null): Lag
  - streams[].status (string): ok, warn or down
  - subsystems[] (array)
  - subsystems[].key (string): Subsystem
  - subsystems[].status (string): ok, warn or down
  - subsystems[].detail (string): Human summary

## MCP tools

Server: https://antseedstats.com/mcp (Streamable HTTP, stateless, no key) or `npx -y @antseedstats/mcp-server` (stdio). Connect from Claude Code with `claude mcp add --transport http antseedstats https://antseedstats.com/mcp`. One tool per endpoint; a tool's arguments are the endpoint's parameters (format dropped, limit capped at 100). Every result starts with the page it comes from, the Base block it is as of and the sources line, then the data as JSON.

- antseedstats_network_summary: Lifetime totals, windows, current epoch. Example question: "How much did the AntSeed network settle today and this week?"
- antseedstats_network_daily: Per UTC day: settled, users, tokens. Example question: "Chart AntSeed's daily settled volume for the last 30 days"
- antseedstats_leaders: Last 24h leaders, wash left out. Example question: "Who is leading AntSeed in the last 24 hours, by sales and by tokens?"
- antseedstats_sellers: Every seller, lifetime and 7-day figures. Example question: "List the top 10 AntSeed sellers by revenue this week, wash traders left out"
- antseedstats_sellers_detail: One seller: totals, trust, verification. Example question: "Profile seller 0xd19f...41f3: revenue, trust score, verification, wash flag"
- antseedstats_sellers_daily: One seller per UTC day (the cross-check). Example question: "How much did seller 0xd19f...41f3 settle per day over the last week?"
- antseedstats_sellers_models: What a seller advertises and sold. Example question: "Which models does seller 0xd19f...41f3 advertise, at what price, and which sold?"
- antseedstats_models: Catalogue: sellers, prices, usage. Example question: "Which models are most used on AntSeed, and what do they cost?"
- antseedstats_models_detail: Where to buy one model. Example question: "Where can I buy kimi-k3 on AntSeed, cheapest trusted seller first?"
- antseedstats_prices: Every listing with list-price savings. Example question: "Compare every seller's price for kimi-k3 against the OpenRouter list price"
- antseedstats_epochs: Every epoch: emission, points, burn. Example question: "Show every AntSeed epoch with its emission, points and burn"
- antseedstats_epochs_detail: One epoch, live economics if current. Example question: "What is the projected $ANTS per USD for buyers in the current epoch?"
- antseedstats_ants_supply: $ANTS minted, emitted, burned, staked. Example question: "How much $ANTS has been minted, burned and staked so far?"
- antseedstats_search: Names to ids: sellers, models, labs. Example question: "Find the seller called Super Seeder and the model id for Kimi K3"
- antseedstats_estimate: Cost of a workload on AntSeed vs list. Example question: "What would 22M input and 5.5M output tokens of Kimi K3 cost on AntSeed vs list?"
- antseedstats_glossary: Every definition behind the site's tips. Example question: "How does AntSeedStats define network revenue and organic?"
- antseedstats_changelog: What changed on the site and the API. Example question: "What changed on AntSeedStats this week?"
- antseedstats_status: Indexer head, lag, subsystems. Example question: "Is the AntSeedStats indexer up to date with the Base chain?"

## Definitions behind the tips

The text behind every ⓘ on the site, grouped by page: what each figure is and how it is computed. This is the live copy; where the glossary below disagrees, this wins.

### https://antseedstats.com/

- **rising sellers**: Sellers growing right now in both revenue and distinct buyers. Momentum is the geometric mean of two ratios: dollars per day and buyers per day over the last 3 days versus the 11 days before, so a seller only rises if both grow. Only sellers that pass our legitimacy gate are eligible: no wash-trading cluster, no watchlist, no sybil flags, at least 5 buyers and $20 this week, no captive top buyer (a buyer above 60% of revenue only disqualifies when that buyer itself settles with fewer than 5 sellers; a diversified one damps the rank instead), and at least half of the buyers also buying from other sellers. Steady cards are the largest eligible non-rising sellers with a persistent base (active 20+ of the last 28 days): at least one, and enough to show three cards when fewer than three sellers are clearly rising. Nothing that fails the gate is ever used to fill the panel. Recomputed hourly from settlements.
- **epoch panel**: Marketplace activity inside the current 7-day emission epoch: revenue, tokens and active sellers counted since the epoch started, from on-chain settle and metadata events. The epoch volume chart lives further down the page.
- **top models**: The models earning the most on AntSeed, ranked by settled USDC (Sales), tokens served (Tokens) or distinct buyers (Users). Built from buyer-shared per-model settlement reports (metadata v2). Sharing the split is the buyer's own choice, so every figure is a lower bound. These rankings are lifetime cumulative and sharing was rare when it launched in June, so the early months are thin; the footnote under the card shows how much of recent activity now names its model, measured live. Organic: only usage sold by sellers outside the wash-trading verdicts (AntSeed's on-chain wash registry plus our confirmed and high-probability clusters); before this filter, 9 of the 10 largest models by lifetime sales were almost entirely wash. View more has an All switch with every seller.
- **happening now**: The live layer: who led the network over the last rolling 24 hours, then the individual requests as they settle. A rolling window, not a calendar day, so it stays meaningful just after midnight. Sellers flagged for wash trading are left out of every leader (the same filter as Rising sellers: wash clusters, our watchlist, sybil flags). The 24h totals and the model with the most requests are on the Requests page; the day-by-day reference is the Daily metrics table at the bottom of this page.
- **leader seller**: The seller that settled the most USDC in the last 24 hours, from every on-chain settlement (complete, not a sample), including the 4% protocol fee. Sellers flagged for wash trading are left out.
- **leader revenue**: The model that settled the most USDC in the last 24 hours. Built from the per-model split buyers choose to share on-chain, so it is a lower bound. Name variants of one model count together; sales by wash-flagged sellers are left out.
- **leader tokens**: The model that served the most paid tokens in the last 24 hours, input plus output. Cheap models with long contexts lead here while earning little, which is why it is a different card from Top model. Free-tier tokens have their own card; sales by wash-flagged sellers are left out.
- **leader free**: The free-tier model that served the most tokens in the last 24 hours, from the free-usage reports sellers post on-chain. No payment changes hands, so it never counts in revenue. Sellers send these reports in batches, so the last ~15 minutes may not be in yet.
- **tx model**: For settlements, the model the payment bought, when the buyer shared the per-model split on-chain. A settlement can cover several services at once, and those rows read 'N models' rather than picking one. Dash means either a non-settlement event or a buyer who did not share the split.
- **winner tokens**: The model that processed the most tokens in the last 24 hours, input plus output. Volume, not value: the token leader is usually not the revenue leader, because cheap models with long contexts move enormous token counts for very little money. The caption shows what it actually earned and how much of the network's input was cache replay rather than fresh context.
- **winner revenue**: The model that settled the most USDC in the last 24 hours, including the 4% protocol fee. This is where the money went, which is regularly a different model from the one that moved the most tokens: expensive reasoning models earn more per token, so they can lead on revenue while serving a fraction of the volume.
- **winner requests**: The model that served the most individual inference calls in the last 24 hours. A third way to be the biggest: many small requests can outnumber everything else while barely registering on tokens or revenue, which is what high-frequency and agent workloads look like.
- **network panel**: Live network counts: paying buyers and settling sellers from on-chain settles, DIEM staked in the provider-capacity pool (live contract read), and service offerings advertised on the AntSeed DHT.
- **ants progress**: Compares the cumulative $ANTS emission entitlement (completed epochs, 5M ANTS each, read from the contract) with the supply actually minted on-chain. Transfers are still gated, so there is no market price.
- **total active users**: Total marketplace participants: distinct buyers who have used the network (opened a channel, reserving funds against a seller, plus buyers seen only on free-tier usage, who never open a paid channel), plus distinct sellers from settled trades, plus the live on-chain DIEM staker count. Buyers are counted from reserve (actual usage), which already includes everyone who has settled plus those using the network but not yet settled; idle deposits are still excluded. The three pools are summed, so an address active in more than one role can be counted more than once.
- **network revenue**: Lifetime gross USDC buyers paid for settled inference, summed from every settle event (delta). This is the full buyer-paid amount including the flat 4% protocol fee, tied to the contracts' own per-channel accumulators. Net to sellers is this minus fees.
- **tokens consumed**: Lifetime tokens served across the marketplace, input plus output. Paid usage is summed from on-chain MetadataRecorded events; free-tier usage comes from the buyer-reported cumulative counters on FreeUsageRecorded, differenced per channel and service, so it is a lower bound. The subline splits paid vs free. Token counts are on-chain, but the model behind each request is not.
- **network fees**: Lifetime protocol fees: the flat 4% the protocol takes of settled volume, summed from the platformFee carried on each settle event. Network revenue minus this equals net to sellers.
- **ants burned**: $ANTS burned to date, read live from the token: the unclaimed remainder of every settled epoch, minted straight to the dead address (up to 30% of the epoch's emission, since epoch 22), plus anything a future buy-and-burn sends to the zero address. Burning here mints to a dead address rather than lowering totalSupply, so minted supply includes it. It grows with every epoch that is settled.
- **ants available**: Cumulative $ANTS emission of every completed epoch (5,000,000 ANTS per epoch, read from the contract) minus what was burned: the epoch remainder minted to the dead address is inside that entitlement but available to nobody, so it is taken out here. The subline is the supply actually minted on-chain, also net of the burn. Transfers are gated, so there is no market price yet.
- **current epoch**: The active 7-day emission epoch, computed from the contract clock (genesis 2026-04-09, 604800s per epoch). Each epoch mints a fixed $ANTS budget split by points. The subline counts hours left until this epoch ends.
- **epoch revenue**: Gross settled USDC in the current epoch (includes the 4% fee), summed from settle events whose timestamp falls in this epoch via the contract clock. The subline counts settles this epoch.
- **epoch tokens**: Tokens served this epoch, input plus output, paid and free-tier combined, for events dated at or after the current epoch's start. The free half is differenced per event rather than per day, so the partial day at the epoch boundary is not double-counted. The subline splits paid vs free.
- **active sellers**: Distinct seller addresses that settled at least one trade since the current epoch began, counted from settle events on-chain.
- **buyers**: Distinct paying buyers: addresses that have settled at least one trade, counted from settle events. This is the paying side, not addresses that only made a deposit. The reserved subline counts distinct buyers who opened a channel against a seller (actual usage); it includes everyone who has paid plus buyers using the network but not yet settled.
- **sellers**: Distinct sellers that have settled at least one trade on the marketplace, counted from on-chain settle events.
- **diem staked**: Total staked in the DIEM provider-capacity pool, read live on-chain from the staking proxy. Stakers back inference capacity (fronted by the Venice.ai proxy seller) and earn USDC fees plus $ANTS incentives.
- **services**: Number of advertised provider service offerings, counted from the off-chain provider catalog (network.antseed.com/stats). These reflect what providers advertise, not proven per-trade usage.
- **chart dau**: Distinct accounts active each day, split into existing and new paid. Active counts settling buyers and settling sellers; new paid means an account's first settlement is that day. The All/Buyers/Sellers toggle reslices the same data. The violet segments count accounts active only through free usage that day, from buyer-reported free-usage events (no payment involved, so easier to fake and a lower bound): the lighter top slice is accounts whose first-ever activity, paid or free, is that day.
- **col dau**: Distinct accounts active that day: settling buyers and sellers, plus accounts active only through free-tier usage — the same total the Daily active users chart draws, paid series plus the violet free segments. The free part is buyer-reported (no payment involved), so it is easier to fake and a lower bound; the Free column beside this one shows how much of the total it is.
- **col free dau**: Of that day's active accounts, how many were active ONLY through free-tier usage (no settlement that day), from buyer-reported free-usage events. A lower bound: only free usage that buyers report on-chain is visible. Includes the New free accounts — the column beside shows how many of these are first-timers.
- **col new paid**: Accounts whose first on-chain settlement (as buyer or seller) is that day — the first time an account pays or gets paid. An account that started on the free tier counts here on the day it converts to paid.
- **col new free**: Of that day's free-only actives, accounts whose first-ever activity on the network (paid or free) is that day. Buyer-reported like all free usage, so a lower bound and easier to fake. Counted from first appearance, not deposits.
- **chart settled**: Daily gross settled USDC (bars, includes the 4% fee) plus a running cumulative total (line), summed from settle events per day. The faded top on today's bar projects the partial day to its end at the current pace.
- **chart tokens**: Tokens served per day, stacked input vs output, summed from on-chain MetadataRecorded events. The faded top on the latest bar projects the partial day to its end at the current pace. The violet segment is free-tier usage decoded from buyer-reported free-usage events: no payment involved, so it is easier to fake and a lower bound.
- **chart requests**: Inference requests per day, summed from the request_count on MetadataRecorded events. The faded top on today's bar projects the partial day to its end at the current pace. The violet segment is free-tier requests from buyer-reported free-usage events: no payment involved, so it is easier to fake and a lower bound.
- **available to claim**: Cumulative $ANTS emission of every completed epoch to date, read live from the contract (5M per epoch, halving every ~2y; the in-flight epoch is excluded until it closes), minus what was burned at settlement, since burned emission is available to nobody. The $ANTS page shows the gross figure as 'emitted to date'. This is the entitlement ceiling, above what has actually been minted.
- **total minted**: Actual $ANTS supply minted so far, read on-chain from totalSupply, minus the balance of the dead address: burning under this model mints to that address rather than lowering totalSupply, so the gross figure would count burned tokens as minted. The bar shows minted as a share of the cumulative epoch entitlement, both net of the burn. Transfers are still gated, so there is no market price yet.
- **chart epoch volume**: Gross settled USDC per epoch (includes the 4% fee), bucketed from settle events by the contract clock. The faded top on the live epoch projects it to the epoch end at the current pace.
- **chart epoch usage**: Per-epoch token usage: paid input and output tokens from MetadataRecorded events, plus the free tier (violet, buyer-reported via AntseedFreeUsage, computed from the cumulative counters) stacked on top, and a requests line (paid). The faded segments on the live epoch project it to the epoch end at the current pace.
- **latest channels**: Most recently active payment channels (one per buyer-seller channelId). Settled is the channel's cumulative settled USDC, Settles counts its settle events, Age is time since the last settle. Sorted by latest activity.
- **latest transactions**: Newest-first feed of on-chain activity across all indexed event types (settles, deposits/withdrawals, stakes, claims, DIEM events, token transfers). Value shows the native unit (USDC or ANTS); rows link to BaseScan.

### https://antseedstats.com/revenue

- **settled gross**: Total buyer-paid USDC for all settled inference, including the flat 4% protocol fee. Sum of the per-settlement delta across every ChannelSettled event. Equals on-chain volume and ties to the contracts' own per-agent accumulators to the cent. Gross, not net to sellers.
- **net to sellers**: What sellers keep after the protocol's flat 4% fee: gross settled USDC minus total platform fees. Computed from ChannelSettled events as sum(delta) minus sum(platformFee). Some other dashboards headline this net figure as volume.
- **platform fees**: The protocol's take, a flat 4% of settled volume. Sum of the platformFee field on every ChannelSettled event. The sub-line shows effective take (fees divided by gross revenue), which should sit near 4%.
- **avg per settle**: Average buyer-paid USDC per settlement: the mean of the delta field across all ChannelSettled events. Shown to 4 decimals because these are micro-payments (a single inference settles for a tiny fraction of a dollar).
- **participants**: Distinct buyer addresses that have settled at least one trade (main number) plus distinct seller addresses (sub-line), counted from ChannelSettled events. Counts paying participants only, not depositors who funded escrow but never traded.
- **chart cumulative**: Running total of all settled USDC over time, bucketed hourly. Each point is the cumulative gross volume (sum of ChannelSettled.delta, fee included) up to that hour. Only rises; it is an all-time accumulation.
- **chart daily**: Gross settled USDC per calendar day (sum of ChannelSettled.delta, fee included). The faded top segment on today's bar is a pace-to-date projection extrapolating the partial day at its current rate, not yet-settled volume.
- **chart fees**: The protocol's flat 4% fee collected per day, from the platformFee field on ChannelSettled events. Tracks daily revenue at about 4% of it. The faded top of today's bar is a pace-to-date projection of the partial day.
- **col seller revenue**: Gross settled USDC earned by this seller: the sum of ChannelSettled.delta where it is the seller (fee included). Same gross basis as the Settled (gross) KPI. Table shows the top 15 sellers.
- **col buyer spent**: Total USDC this buyer has paid for settled inference: the sum of ChannelSettled.delta where it is the buyer (gross, fee included). Table shows the top 15 buyers by spend.

### https://antseedstats.com/rewards

- **hero**: What this epoch's scheduled emission will actually pay, read from the emissions gate: the fixed buckets (team, reserve, verification) plus what the two dynamic buckets (seller pools, usage) are budgeted to mint given how far usage and stake sit from their targets. An upper bound: a side with no claimants forfeits its budget, and no single account may take more than the per-account cap. What no bucket claims is remainder: burned at settlement up to 30% of the emission, the rest minted to the reserve. Nothing mints until the epoch closes.
- **earning**: Who is earning this epoch's usage rewards, from the points the contract has accrued so far (settled inference, after the on-chain wash-trading policy). The contract splits each side's budget by WEIGHTED points: every settle's points times the weight of the seller pool it went through, so the same dollar earns more behind a pool with more stake and lock, and next to nothing behind a pool that only holds its 1-ANTS seed. Projected is the account's share of its side's weighted points times the side's budget, if the epoch closed now, capped the way the contract caps it. Ranked by weighted points, which is the order the contract pays in. Sellers link to their page; buyers to theirs.
- **col projected**: The account's share of its side's weighted points so far (points times the seller pool's weight for the epoch, read from AntseedUsageAccounting), times the side's usage budget for this epoch, capped at the per-account maximum the contract enforces (the excess is forfeited, not redistributed). This is the contract's own formula (pendingBuyerReward / pendingAgentReward). A projection: points keep accruing and the budget moves with the targets until the epoch closes.
- **col epoch share**: The account's share of all weighted points on its side this epoch, so far. Weighted means each settle's points times the seller pool's weight, so usage behind a strong pool counts for far more than the same usage behind a seed-only pool; raw points are on the history page. 'Capped' means the share is above the per-account maximum, so the projected reward is the cap and the rest is forfeited.
- **current epoch**: Active 7-day reward epoch. AntSeed runs fixed 7-day epochs from a pinned on-chain genesis (9-Apr-2026): epoch = floor((now - genesis) / 7 days), matching the contract's own time-based clock. 'Ends in' counts down to the next boundary. Distinct from the DIEM pool's reward epochs, which run on the pool's own contract clock.
- **emission per epoch**: Total $ANTS scheduled for this epoch. From epoch 22 (10-Sep-2026) the split is 40/20/15/15/10 (seller pools/usage/team/reserve/verification); before that it was 65/5/15/15 (seller/buyer/reserve/team). Starts at 5M ANTS/epoch and halves every 104 epochs (about 2y). $ANTS transfers are gated, so there is no market price yet.
- **allocated**: How much of this epoch's emission the buckets are budgeted to mint, against the 5M scheduled. An upper bound, not a forecast. Team, reserve and verification are fixed; the seller-pool and usage buckets are dynamic and scale from a floor up to their ceiling with distance to target. What actually mints can be lower still: no single seller or buyer may take more than 5% of its side's usage budget, and a side with no weighted claimants forfeits its whole budget. Whatever is left is remainder: burned up to 30% of the epoch's emission, the rest minted to the reserve.
- **usage target**: Recognized usage this epoch against the 1,000,000 USDC per-epoch target that sets the usage bucket's share. The input is the larger of the buyer and seller point totals AFTER the on-chain points policies, so volume from sellers proven to be wash trading is already excluded. At zero the bucket pays nothing; any usage above zero puts it at its 10% floor, and only reaching the target takes it to the halfway point of its 20% ceiling.
- **stake target**: $ANTS active behind provider pools in THIS epoch against the 400,000,000 target that sets the seller-pool bucket's share. A position activates one epoch after it is created, so stake committed since the epoch began does not count here yet; the Staking page carries the next epoch's larger figure. With $ANTS transfers gated, the only way stake grows is rewards restaked into a pool, so the bucket sits near its 2% floor rather than its 40% ceiling.
- **staker bucket floor**: What the provider-pool bucket is budgeted to pay this epoch, read from the contract's own stakerEpochBudget(). Its share of the emission rises with active stake on a saturating curve between a floor and a ceiling: zero stake pays nothing, any stake at all pays the floor, stake equal to the 400,000,000 ANTS target reaches the midpoint of the range, and the ceiling is approached but never hit. Whole-number rounding keeps the budget on the exact floor until stake is a few thousand ANTS.
- **pools with stake**: Known sellers (everyone who ever settled a channel or ever staked USDC) whose poolActiveStakeAtEpoch is above zero in THIS epoch, asked of the pools contract directly. Their own dashboard counts registered agents and reports a larger number; the two measure different things and neither is wrong. The positions are summed and compared with the contract's totalActiveStakeAtEpoch: any stake the sum cannot account for is shown as unattributed rather than hidden, and a sum above the total refuses to render.
- **active no pool**: Sellers that settled inference this epoch and hold no pool. Sellers proven to be wash trading on-chain are excluded from this count and shown separately, because their rewards are already zeroed by the wash policy and folding them in would overstate the gap. The section also checks, on every render, whether any pool-less seller accrued usage points; the text below says so only when the answer is none.
- **no points share**: Settled USDC volume from sellers with no pool and no wash finding, as a share of the epoch's volume from all non-wash sellers. Wash volume is left out of both sides so the ratio measures the pool gap alone. Gross, including the flat 4% protocol fee, over the live epoch so far.
- **projected burn**: What would be burned for THIS epoch if its leftover were settled today, capped at 30% of the epoch's emission with the remainder minted to the reserve. It is a projection, not a balance: nothing can be claimed or burned until the epoch closes, and even then the burn is not automatic; someone has to call settleEpochRemainder on each reward controller. That call is permissionless, so anyone can make it, but if nobody does, nothing is burned. The caption carries what has actually been burned so far, across settled epochs; the Staking page shows the same figure first-line.
- **locked seller rewards**: Cumulative $ANTS seller rewards minted into the SellerRewardsPool but still locked, read live on-chain via totalLockedRewards(). Releasing them takes two separate things, not one: the seller-claim policy set on-chain (the caption tracks that one live), and the pool actually allowed to move $ANTS, which needs either token transfers enabled or the pool on the token transfer whitelist.
- **ants claimed**: Total $ANTS actually claimed (minted out) to date, summed from indexed on-chain claim events (emissions_claim). Sub-line shows the number of claim transactions and the distinct accounts that claimed.
- **chart points**: Seller points per epoch, read from the contracts: EmissionsV2 (epochTotalSellerPoints) up to epoch 21, AntseedUsageAccounting (totalSellerPointsByEpoch) from epoch 22. Each settled inference accrues points to the seller; share of points sets share of the usage emission. From epoch 22 the points are counted AFTER the on-chain points policy, which zeroes sellers proven to be wash trading, so epoch 22+ bars are not comparable with earlier ones and sit far lower for the same real activity. The live epoch shows a faded pace-to-date projection of its end total.
- **chart revenue**: Buyer-paid USDC for settled inference per epoch (gross, including the flat 4% protocol fee). Summed from indexed settlement events (channel_settled), bucketed by the contract's epoch clock. The live epoch shows a faded pace-to-date projection.
- **col epoch**: Reward epoch index (7-day periods from the on-chain genesis). The current, in-flight epoch is tagged '(live)'.
- **col seller points**: Seller points accrued in the epoch: EmissionsV2 (epochTotalSellerPoints) up to epoch 21, AntseedUsageAccounting (totalSellerPointsByEpoch) from epoch 22, both in the raw on-chain USDC unit. Up to epoch 21 this column mirrors revenue; from epoch 22 it is post-policy, with proven wash traders zeroed, so it sits well below revenue.
- **col buyer points**: Buyer points accrued in the epoch: EmissionsV2 (epochTotalBuyerPoints) up to epoch 21, AntseedUsageAccounting (totalBuyerPointsByEpoch) from epoch 22. Each settled inference accrues points to the buyer too, equal to seller points unless the points policy splits them; your share sets your share of the buyer usage emission.
- **col emission**: Total $ANTS scheduled for that epoch: 5M ANTS at tier 0, halving every 104 epochs (about 2y). This is the whole epoch budget before it is split across buckets — 65/5/15/15 (seller/buyer/reserve/team) up to epoch 21, and 40/20/15/15/10 (seller pools/usage/team/reserve/verification) from epoch 22 on. Scheduled is not the same as minted: a bucket only mints what its rules allow, and the leftover is burned or sent to the reserve.
- **col revenue**: Buyer-paid USDC for settled inference in the epoch (gross, including the flat 4% protocol fee), summed from indexed settlement events (channel_settled) bucketed by the contract's epoch clock.
- **total locked**: Total locked seller rewards in $ANTS, summed from indexed accrual events (locked_reward) across all sellers. This ties out exactly to the pool's on-chain totalLockedRewards(). Releasing them needs two on-chain conditions, not one: the seller-claim policy installed, and the pool allowed to move $ANTS (transfers enabled, or the pool on the token transfer whitelist).
- **accrual records**: Number of locked-reward accrual events indexed (LockedRewardRecorded). Each event credits $ANTS to a seller's locked balance; a seller typically has many accruals over time.
- **eligible to claim**: Sellers currently flagged eligible to claim unlocked rewards, taking the latest eligibility state per seller from indexed events. Today this is effectively just the DIEM proxy seller; broad claims also need sellerClaimPolicy set on-chain.
- **claim status**: Whether seller rewards can be claimed yet. Reads the pool's sellerClaimPolicy() on-chain: 'Open' if a non-zero policy address is set, otherwise 'Locked'. Currently Locked (policy unset).
- **col locked ants**: Locked $ANTS rewards for this seller, summed from their indexed accrual events (locked_reward). Locked until two on-chain conditions are met, not one: sellerClaimPolicy installed, and the pool allowed to move $ANTS. Click through to the seller's page.
- **col accruals**: Number of locked-reward accrual events (LockedRewardRecorded) credited to this seller over time.
- **active stakers**: LEGACY system, unrelated to the $ANTS provider pools above: sellers bonding USDC stake to back their inference capacity. Net stake per seller = staked minus unstaked from indexed stake_event rows; counts sellers with a positive net balance.
- **total staked**: Total USDC bonded by sellers as stake to back inference capacity, summed as staked minus unstaked across all sellers with a positive net balance (from indexed stake_event rows).
- **total slashed**: Total USDC slashed from seller stake (penalties on bad behavior), summed from the slashed amount on indexed unstake events. Sub-line counts how many slashing events occurred.
- **col staked usdc**: Net USDC stake bonded by this seller (staked minus unstaked), from indexed stake_event rows. Only sellers with a positive net balance are listed. The Agent column shows their on-chain agent id.
- **col top seller points**: Total seller points across all epochs per account, summed from indexed SellerPointsAccrued deltas. Points are the reward accounting unit: your share of points sets your share of each epoch's $ANTS emission. Seller points track settled volume.
- **col top buyer points**: Total buyer points across all epochs per account, summed from indexed BuyerPointsAccrued deltas. Each settled inference accrues points to the buyer (1:1 with the seller); your share of points sets your share of the buyer emission.
- **shift**: A hypothesis, not a forecast: it takes the last complete epoch's usage exactly as it happened and re-splits it under the power each pool holds for the next epoch (where every stake, split, merge or max lock made this epoch lands). Rewards are split by usage MULTIPLIED by power, and until real stake landed every pool held the same 1 ANTS starter, so power cancelled and usage alone decided the split. It no longer cancels. Actual usage in the coming epoch will differ; what this isolates is the effect of the power change alone.

### https://antseedstats.com/staking

- **staked of stakable**: How much of the $ANTS that CAN be in a pool today actually is. Staked is the token's own balance of the pools contract: the principal of every position not yet withdrawn, seeds included. Stakable adds what has been earned under the epoch-22 model and not yet staked: seller and buyer usage rewards still unclaimed, staker rewards settled onto positions and not yet restaked or withdrawn, and pool rewards of the last closed epoch nobody has settled yet. Nothing else qualifies. $ANTS transfers are gated and no wallet is whitelisted, so a wallet balance cannot reach a pool; a reward can, because it mints straight into the pool when staked. Rewards already claimed or withdrawn to a wallet are therefore not counted either. Staked includes positions that only start earning next epoch (a position activates one epoch after it is created), so the Rewards page, which counts only the stake active in this epoch, shows a smaller figure.
- **not staked**: Rewards earned under the epoch-22 model that could be staked today and are not: unclaimed seller and buyer usage rewards (read per account from AntseedUsageRewards for every closed epoch, and checked against the contract's own budget for that epoch), staker rewards settled onto positions and not withdrawn (the balance of the staker-rewards controller, tied out against its own claimable index), and pool rewards earned but not yet settled on-chain. The caption splits it by source and says how much of the budget the 5% per-account cap left nobody able to earn.
- **burned**: $ANTS burned to date, both sinks: the epoch remainder minted to 0x…dEaD when settleEpochRemainder is called after an epoch closes, and anything sent to the zero address by a future buy-and-burn. Burning under this model mints to a dead address rather than lowering totalSupply, so minted supply includes it. The dead-address balance is tied out at wei precision against the gate's own per-epoch burn record, and it grows with every epoch that is settled.
- **supply bar**: Every $ANTS that exists or is owed, in five parts. Staked and 'earned, not staked' are the two that can be in a pool today. Burned is the dead-address balance. 'Minted since epoch 22, not in a pool' is what the gate minted that is neither burned, in a pool, nor waiting in the staker-rewards controller: the reserve, the team and verification buckets, and rewards their owners claimed or withdrew to a wallet, stranded there while transfers are gated. That residual is then measured a second way, by following every mint since the cutover in our own index to where it went, and the split is shown only when the two agree to the wei. 'Before epoch 22' is the whole legacy schedule (22 epochs of 5M), one bucket, none of it stakable; it is checked against totalSupply minus the gate's mints at wei precision, and the block refuses to render if the two disagree.
- **lock buckets**: Staked principal by the lock length each position was created with, its full term rather than what is left of it, so it reads as commitment. Max-locked positions are their own row: the owner turned on the contract's flag that holds power at the maximum instead of counting down. Active positions only, the same set the contract counts as stake.
- **avg lock**: The average lock term, weighted by principal: the number of epochs each active position was created for, with max lock counted as the full maximum since its power never counts down. This is the commitment the network's stake was made with. The epochs still LEFT on those locks, which is what power is built on, is the 'lock left' column of the provider table.
- **max lock share**: Share of staked principal in positions with max lock on. Their power never decays, so this is the part of the network that has committed for the full term and keeps renewing it.
- **unlocks**: The soonest an active position's lock ends, from the positions' own end epochs, and the principal that becomes withdrawable then. Max-locked positions never reach that date on their own: turning the flag off starts a full-length countdown first, so they are listed as 'never while max lock stays on'.
- **since22**: Everything the gate has minted since epoch 22, plus rewards earned and not yet minted, in the pieces that matter: burned (the epoch remainder, up to 30% of the emission), the reserve, rewards their owners claimed or withdrew to a wallet (stranded there while transfers are gated), rewards earned and not yet staked, and stake that came from rewards. The seeds are left out, being pre-22 tokens. The reserve and wallet pieces come from following every mint since the cutover in our own index; they show only when that account equals the chain's residual to the wei. Team and verification appear once they have minted something. This is the part of the supply that grows every epoch.
- **staker budget**: What the provider-pool bucket paid for the last complete epoch, read from stakerEpochBudget(). It is split across pools by usage multiplied by power, so 'per unit of power' is the honest rate: the budget divided by the network's total power for that epoch, with no price to turn it into a yield.
- **by provider**: Every provider pool with stake behind it, and the power that stake is worth in the current epoch. Staking activates one epoch late: every stake, split, merge, max lock or withdrawal made this epoch only counts from the next one, so a pool whose stake changes then carries a small line under Staked with the difference, and a pool whose first stake is still waiting shows a dash until it activates. Staked is the pool's principal; power is the sum over its positions of stake times the epochs left on the lock; share of power is the pool's side of the usage-times-power split the staker budget is paid by. The table opens sorted by Staked and Organic, which means no wash trading: it leaves out the pools of sellers AntSeed's own on-chain wash registry has proven, and of the wash clusters confirmed or rated high-probability on our Observatory, plus the 1-ANTS seeds the protocol mints to open a pool. Their stake is real on-chain and still counts in the network figures above; All pools shows them.
- **col pool power**: The pool's lock-weighted power in the current epoch (poolWeightAtEpoch): the sum over its active positions of stake times the epochs left on the lock. Stake added this epoch is not in it yet. Power, not stake, is what the staker budget is split by.
- **col pool apy**: Estimated APY for a new stake of 10,000 ANTS in this pool with a 1-week lock. It takes what the pool earned in the last complete epoch, shares it between the power the pool held then and the new stake's power (stake times lock), and compounds it every epoch for a year. Rewards and stake are both $ANTS, so no price is involved: it is how fast a stack of ANTS grows, not its value in dollars. It assumes that epoch repeats and ignores the one-epoch activation delay; it is estimated until the pool's reward for that epoch is settled on-chain. A longer lock carries more power (up to 104 times for 2 years) and so a much larger estimate, often past 10,000%, but more stake would follow such a return and shrink it. The same estimate the AntSeed staking dashboard shows at its 1-week end, recomputed from the contracts. Not a promise of returns.
- **col pool share**: The pool's power as a share of the network's, in the current epoch. With rewards split by usage times power, this is the pool's side of the multiplication.
- **col pool lock left**: The pool's power divided by its stake: the stake-weighted number of epochs still left on its positions' locks. It counts down by one every epoch; 104 is the maximum, and a pool whose positions are all max-locked stays there and is tagged '(max)'. The term each position was created with is in the positions table.
- **col position lock**: The lock length the position was created with, in epochs (up to 104, two years): the commitment its power is built on. 'Max lock' means the owner turned on the contract's flag: power stays at the maximum instead of counting down, and turning it off restarts a full-length countdown.
- **col pool stake**: The principal of the pool's positions active in the current epoch: what stakers actually put in. The line underneath, when there is one, is how that changes at the next epoch: "pending" is stake added this epoch (or re-created by a split or merge) that activates next epoch, "leaving" is stake whose lock ends or that was merged away. The contract itself works with a weight, principal plus a bonus on principal restaked from pool rewards, and that is the figure it splits power and the staker budget by (and what the AntSeed app shows as TVL).
- **network power**: The network's total lock-weighted power in the current epoch (totalPowerWeightAtEpoch): every active position's stake times the epochs left on its lock, with max-locked positions held at the maximum. The staker budget is split across pools by usage multiplied by power, so this is the denominator of every pool's share.
- **positions table**: Every lANTS position (Locked Antseed Stake) on the network. Positions are ERC-721 NFTs, enumerable from the contract, so this is the complete list rather than a sample. The KPI counts the positions people opened; every pool also holds one 1-ANTS seed position the protocol mints to open it, listed here and counted separately. Search by address to find your own. Each amount links to the position's page on antseedmarkets, the community lANTS marketplace. Under the staker, "pending" is new stake that counts from the next epoch ("+X pending" is the new part of a position) and "leaving" has a lock that ends, or stake that moves to another pool, at the next epoch. A position split or merged this epoch is listed once, as it stands from the next epoch, with the power its stake already carries.
- **col position power**: The position's power this epoch: weight times the epochs left on its lock. A position made this epoch has none yet; one that replaces positions split or merged this epoch shows the power their stake carries now. The line underneath is what it will carry from the next epoch. It falls by one epoch's worth every epoch unless max lock is on, in which case it stays at the maximum.
- **unused**: Rewards a pool has already earned and has not yet turned into stake: unclaimed seller usage rewards plus staker rewards already settled onto its positions. This matters more than it sounds. $ANTS transfers are disabled and nobody is on the token's whitelist, so nobody can buy their way into a pool: converting rewards you already earned is the ONLY route in, and it works precisely because those $ANTS are minted straight into the pool without ever touching a wallet. A pool's unused rewards are therefore its entire capacity to act, and the power column beside it is what they would be worth locked for the maximum term.

### https://antseedstats.com/ants

- **minted of max**: Share of the maximum supply that exists today: ANTSToken.totalSupply minus the balance of the dead address, over MAX_SUPPLY, all read live on-chain. From epoch 22 the unclaimed emission remainder is burned by minting it straight to the dead address, so it sits inside totalSupply while being held by nobody; the home page's minted figure subtracts it the same way, and the burned amount is shown there. The gross figure and where the rest of the supply sits are on the supply page. Transfers are still gated, so there is no market price.
- **market**: Whether $ANTS transfers are turned on, read on-chain (ANTSToken.transfersEnabled). 'Gated' means transfers are locked and there is no market price yet, 'Open' means the TransfersEnabled flag has fired. We never invent a price. The 'ANTS' listed on Coinbase and GeckoTerminal (0x8205…47c7) is a different, unrelated token; this site reads only the canonical ANTSToken (0xa87E…5263, in the pill above).
- **holders**: Addresses holding a positive $ANTS balance, computed from the indexed Transfer log (balance = total received minus total sent, zero and dead addresses excluded, kept if above 0). Caption counts all $ANTS Transfer events indexed.
- **emitted to date**: Cumulative $ANTS emission of every COMPLETED epoch since genesis, read live from the contract (getEpochEmission, which already includes the V1 epochs and the halving schedule). The in-flight epoch is excluded because its emission is not finalized or claimable until the epoch closes. This is the scheduled entitlement and sits at or above the actual minted supply, which lags as rewards are claimed.
- **ants claimed**: $ANTS recipients have actually pulled, summed from indexed EmissionsClaimed events. Caption counts claim events and distinct claiming accounts. Sits below minted supply because locked seller rewards have not yet been claimed.
- **locked**: $ANTS sitting in the seller-rewards pool but still locked, summed from indexed locked_reward records, with distinct seller count in the caption. Two separate things gate a release, not one: the on-chain seller-claim policy being set, and the pool being allowed to move $ANTS (either token transfers enabled, or the pool on the token transfer whitelist). Since M001 these are no longer freshly minted: a legacy claim moves them out of the legacy-emissions escrow into the pool, so this figure is the downstream of that escrow.
- **legacy escrow**: $ANTS still held by the legacy-emissions escrow: entitlement from the old (V1/V2) schedule that nobody has claimed yet. M001 pre-minted a fixed amount into this escrow and repointed AntseedEmissionsV2 at it, so the legacy path no longer mints new supply — it draws from this pool and stops when it empties. A seller claim moves $ANTS from here into the seller-rewards pool, where it shows up as locked, but buyer and staker claims are paid straight to the recipient, so a small part of what has left here never passes through the pool. Caption shows the pre-minted total and how much has been released, meaning it has left the escrow, not that it is all now locked. Read live on-chain (balanceOf); the pre-mint comes from the indexed Transfer log.
- **reward pool flows**: Total $ANTS routed through the rewards pool: claimed (EmissionsClaimed events) plus locked (locked_reward records). A combined view of seller and buyer reward flows, distinct from the on-chain minted supply.
- **treasury usdc**: USDC sitting in the Buy & Burn treasury now, read live on-chain via USDC.balanceOf. The treasury address is read from DiemStakingProxy.operatorFeeRecipient (not hardcoded). 10% of the DIEM pool operator fee accrues here to later buy and burn $ANTS.
- **operator fee**: The DIEM staking pool operator fee rate, read on-chain from DiemStakingProxy.operatorFeeBps (1000 bps = 10%). This slice of DIEM pool revenue routes to the Buy & Burn treasury. Distinct from the protocol's flat 4% inference fee.
- **bought and burned**: $ANTS sent to the zero address, summed from the indexed Transfer log: the only burn the buy-and-burn treasury can produce, once transfers open and it buys $ANTS on the market. The epoch remainder burn is a different thing: from epoch 22 the protocol mints the unclaimed remainder straight to the dead address (up to 30% of an epoch's emission, only after the epoch closes and only if someone calls settleEpochRemainder). That figure is on the home page and in the split since epoch 22 above, not in this card.
- **routed to treasury**: Gross DIEM pool revenue routed to date, derived on-chain: takes totalUsdcDistributedEver (the 90% paid to stakers) and grosses it back up by the operator fee to recover total pool throughput. The 10% operator slice of this funds the treasury.
- **top holders**: The 30 largest $ANTS balances, computed from the indexed Transfer log (received minus sent; the zero and dead addresses excluded). Named rows are catalog sellers or protocol contracts. The Seller rewards pool row holds the locked rewards of every V2 seller: a claim lands in the pool, not in the seller's wallet, so a seller with rewards and no balance is inside that row rather than missing from the list; it clicks through to the rewards history. Protocol contracts are not linked to a seller page, since they never were a node.
- **col balance**: A holder's $ANTS balance, computed from the indexed Transfer log as total received minus total sent (zero address excluded). Sorted descending, top 30 shown.

### https://antseedstats.com/diem

- **hero**: DIEM is Venice's inference-credit token. This pool (DiemStakingProxy, on Base) takes DIEM stakes that back the Venice.ai proxy seller's capacity on AntSeed; stakers earn 90% of the proxy's USDC revenue plus $ANTS incentives. Total staked is read live on-chain (totalStaked, 18-dec). The dollar value uses the DIEM price read on-chain from Aerodrome (ETH to VVV to DIEM), so it moves with that market. The pool runs its own reward epochs and unstake batches, separate from the 7-day $ANTS epochs; those, and the unstake queue, are on the proxy page.
- **usdc to stakers**: Lifetime USDC the pool has paid stakers, read on-chain (totalUsdcDistributedEver, 6-dec): the 90% of the proxy's revenue routed to stakers, the other 10% being the operator fee. The APY in the caption is the USDC paid per staked DIEM over the trailing 7 days, annualised and valued at the on-chain DIEM price: an estimate of the current rate, not a lifetime average. Reserved and claimed USDC are on the proxy page.
- **stakers table**: Stakers by active DIEM, read live on-chain per address (staked and earnedUsdc via multicall). Earned is the USDC a staker can claim right now, not what they have claimed already; claimed USDC, claimed $ANTS, queued unstakes and last activity are in the full table on the proxy page. Rows open the staker's buyer page.
- **total diem staked**: Total $DIEM currently staked in AntSeed's provider-capacity pool, read live on-chain (DiemStakingProxy.totalStaked, 18-dec). Stakers back inference capacity to earn USDC fees plus $ANTS. Caption shows the active staker count.
- **staked growth**: Growth of the pool over time: total $DIEM staked (left axis, area) and the number of active stakers (right axis, line). Reconstructed from on-chain stake/unstake events since the pool opened; the latest point is pinned to the live on-chain totals, so it matches the KPI cards.
- **usdc distributed**: Lifetime USDC the pool has paid stakers, read on-chain (totalUsdcDistributedEver, 6-dec). This is the 90% of pool revenue routed to stakers (10% is the operator fee). Caption pool yield = distributed divided by staked USD value.
- **pool apy**: Estimated staker yield over the trailing 7 days, annualised (not a lifetime average). It is the USDC paid per staked DIEM in the last week, valued at the on-chain DIEM price, so it reflects the current rate no matter when each staker joined.
- **proxy seller volume**: Total settled USDC volume earned by the Venice.ai proxy seller (the DiemStakingProxy address), summed from indexed ChannelSettled events. Gross volume including the 4% protocol fee. Caption shows request count from off-chain usage metadata.
- **queued unstake**: $DIEM sitting in open (un-flushed) unstake batches awaiting exit, read on-chain by summing unstakeBatches from the oldest unclaimed to the current batch where the batch is not yet flushed. Caption shows already-unstaked DIEM and current batch number.
- **ants claimed**: Total $ANTS rewards claimed by all DIEM pool stakers, summed from indexed antsClaimed reward events. $ANTS is AntSeed's native token with transfers still gated, so this is a token count, not USD. Caption shows the number of reward payout events.
- **ants distributed**: Total $ANTS the pool has allocated to stakers across all funded reward epochs, summed live on-chain from rewardEpochs.antsPot. This is what the pool distributed regardless of whether stakers have claimed it yet, so it runs ahead of $ANTS claimed (roughly a third still sits unclaimed since $ANTS transfers are gated). A token count, not USD. Caption shows how much has been claimed so far.
- **reward epoch**: The current finalized reward epoch of the DIEM pool, read on-chain (DiemStakingProxy.finalizedRewardEpoch). Each epoch the pool finalizes rewards for stakers. Caption shows the pool's first reward epoch. Note: this is the pool's own clock, not the 7-day $ANTS emission epoch used on the Staking page.
- **service offers**: Number of distinct AI service listings the Venice.ai proxy seller advertises, counted from the off-chain DHT provider catalog for its agent. These are advertised offerings, not proven per-trade usage.
- **unstaked**: $DIEM in flushed-but-unclaimed unstake batches: the exit has processed but the staker has not yet claimed, read on-chain by summing flushed unstakeBatches. Caption shows the oldest unclaimed batch number.
- **staked value**: USD value of all staked DIEM: total staked times the DIEM price. DIEM price is derived on-chain via Aerodrome pools (ETH to VVV to DIEM), not a CEX feed. Shows a dash when the price chain is unavailable. Caption shows price per DIEM.
- **usdc reserved**: USDC currently reserved for stakers in the pool, read live on-chain (totalUsdcReservedForStakers, 6-dec). This is owed to stakers but not yet distributed to them.
- **usdc claimed**: Total USDC actually withdrawn by stakers, summed from indexed usdcPaid reward events. Caption shows the payout count. Distinct from USDC distributed, which is the pool's on-chain lifetime accumulator.
- **operator fee burn**: The DIEM pool's operator fee (10%, read on-chain from operatorFeeBps) that routes to a treasury earmarked to buy back and burn $ANTS once transfers open. Caption shows the live USDC treasury balance (balanceOf the operatorFeeRecipient). No burns yet.
- **seller earnings**: Total settled USDC earned by the Venice.ai proxy seller, summed from indexed ChannelSettled events. Gross volume including the 4% protocol fee. Caption shows request count from off-chain usage metadata.
- **seller stake**: USDC the proxy seller has bonded in the AntseedStaking contract (seller-side capacity stake), summed from indexed stake events (stakes minus unstakes). Distinct from the DIEM pool's total staked DIEM. Caption shows the agent ID.
- **seller channels**: Number of distinct payment channels the proxy seller has settled, from distinct channel IDs in indexed ChannelSettled events. Counts channels that settled at least once. Caption shows the distinct buyer count.
- **seller requests**: Total inference requests served by the proxy seller, summed from request_count in indexed MetadataRecorded usage records for its agent. Caption shows total tokens (input plus output).
- **seller last activity**: Timestamp of the proxy seller's most recent settle event, taken from the latest indexed ChannelSettled record for this address.
- **col active stake**: The staker's currently active DIEM stake, read live on-chain per staker (DiemStakingProxy.staked(user), 18-dec) via multicall.
- **col queued unstake**: DIEM this staker has queued to unstake in the oldest unclaimed batch, read live on-chain (unstakeBatchUserAmount for that batch and user, 18-dec).
- **col earned usdc**: USDC this staker can claim right now (unclaimed accrued rewards), read live on-chain per staker (DiemStakingProxy.earnedUsdc(user), 6-dec).
- **col usdc claimed**: USDC this staker has already withdrawn, summed from indexed usdcPaid reward events for the address. Distinct from Earned USDC, which is still claimable.
- **col staker ants claimed**: $ANTS rewards this staker has claimed, summed from indexed antsClaimed reward events for the address. A token count, not USD ($ANTS transfers are still gated).
- **chart account daily volume**: The proxy seller's settled USDC volume per day, from indexed ChannelSettled deltas bucketed by day. Gross volume including the 4% fee. The current day shows a translucent pace-to-date projection extrapolated from the partial day's pace.
- **chart account daily tokens**: Input and output tokens the proxy seller processed per day, summed from indexed MetadataRecorded usage records for its agent and bucketed by day.
- **chart account epoch volume**: The proxy seller's settled USDC volume grouped by 7-day reward epoch, from indexed ChannelSettled deltas. Gross volume including the 4% fee. The live epoch adds a translucent pace-to-date projection extrapolated from elapsed time.
- **chart account epoch tokens**: The proxy seller's tokens and request count grouped by 7-day reward epoch, summed from indexed MetadataRecorded usage records. The live epoch adds a translucent pace-to-date projection extrapolated from elapsed time.
- **col channel status**: Channel lifecycle: Active (no close event), Closed (a ChannelClosed event exists), or Unknown until the lifecycle backfill has been seeded. Derived from indexed channel lifecycle events.
- **col channel settled**: Cumulative USDC settled on this channel, taken as the max running total_settled from its ChannelSettled events. Gross amount including the 4% protocol fee.
- **col method**: The decoded event type: Channel Settled, Metadata Recorded, Seller Emission, Channel Reserved, Channel Top Up or Channel Closed, labelled per the indexed event stream it came from.
- **col service input**: Advertised price per 1M input tokens for this service, from the off-chain DHT provider catalog. An advertised rate, not a settled price.
- **col service output**: Advertised price per 1M output tokens for this service, from the off-chain DHT provider catalog. An advertised rate, not a settled price.
- **buy burn section**: Live USDC treasury that accrues from the 10% DIEM operator fee, read on-chain (balanceOf the operatorFeeRecipient). Earmarked to buy back and burn $ANTS once transfers open. No burns yet.

### https://antseedstats.com/distribution

- **buyers demand**: Distinct buyer wallets that have settled at least one inference channel on-chain (the paying demand side). Counted from channel_settled grouped by buyer; depositors who never settled are not included.
- **effective buyers**: Effective number of equal-sized buyers: 1 divided by the Herfindahl index of each buyer's share of total spend. Far below the raw buyer count means a few wallets dominate demand; close to it means spend is evenly spread.
- **gini buyers**: Gini coefficient of buyer spend: 0 means every buyer spends equally, near 1 means one wallet drives almost all spend. Computed over each buyer's gross settled USDC across all buyers.
- **top10 buyers**: Share of all marketplace spend coming from the 10 largest buyers, summed from each buyer's gross settled USDC (delta in channel_settled) over the total. Higher means demand is concentrated in few wallets.
- **sellers supply**: Distinct seller wallets that have earned volume from at least one settled channel (the supply side). Counted from channel_settled grouped by seller; includes sellers not listed on the DHT catalog.
- **effective sellers**: Effective number of equal-sized sellers: 1 divided by the Herfindahl index of each seller's share of total volume. Far below the raw seller count means a few providers earn most of the volume.
- **gini sellers**: Gini coefficient of seller volume: 0 means all sellers earn equally, near 1 means one provider takes almost all volume. Computed over each seller's gross settled USDC across all sellers.
- **top10 sellers**: Share of all marketplace volume earned by the 10 largest sellers, summed from each seller's gross settled USDC (delta in channel_settled) over the total. Higher means supply is concentrated in few providers.
- **chart lorenz**: Cumulative share of value held by the bottom X% of accounts, smallest first (blue = buyer spend, lime = seller volume). The dashed line is perfect equality; the more a curve bows below it, the more concentrated that side.
- **chart market share**: Marketplace split among the top 6 counterparties plus an Others remainder. Toggle Supply for sellers by gross volume or Demand for buyers by gross spend; each slice is that wallet's settled USDC share of the total.
- **col share buyers**: This buyer's gross spend as a share of total marketplace spend, shown as a percentage with a bar. Computed as the buyer's settled USDC divided by the sum across all buyers.
- **col share sellers**: This seller's gross volume as a share of total marketplace volume, shown as a percentage with a bar. Computed as the seller's settled USDC divided by the sum across all sellers.
- **col spent buyers**: Total gross USDC this buyer has paid across all settled channels, summing per-settlement delta in channel_settled. Gross includes the flat 4% protocol fee, so it is what the buyer paid, not what reached sellers.
- **col volume sellers**: Total gross settled USDC this seller has earned across all channels, summing per-settlement delta in channel_settled. Gross includes the flat 4% protocol fee; net to the seller is this minus that fee.

### https://antseedstats.com/channels

- **channel models**: The models served through this specific channel, decoded from the buyer's shared per-model settlement reports (metadata v2). Settled USDC, tokens and requests are the channel's own cumulative split. Only shown when this channel's buyer opts into sharing the split.
- **opened**: Every payment channel ever created, counted from ChannelReserved (channel opened/reserved) logs, including channels that never settled a trade. Distinct channelIds on-chain. This is the broadest channel count.
- **active**: Channels currently open: created via ChannelReserved and not yet closed. Computed as distinct opened channelIds minus distinct closed channelIds (ChannelClosed logs). Open and not closed.
- **settled**: Channels that have settled at least one inference payment, counted as distinct channelIds in the ChannelSettled log. A channel can be opened without ever settling, so this is always at or below Opened.
- **closed**: Lifetime channel closures: distinct channelIds with a ChannelClosed event on-chain. A close ends the channel and pays out the seller's settled amount plus any buyer refund.
- **col settled**: Cumulative USDC settled through this channel, read as the max of the on-chain running total (totalSettled) across its ChannelSettled events. This is gross buyer-paid value, including the flat 4% protocol fee.
- **col settles**: Number of settlement events on this channel: a count of ChannelSettled logs sharing its channelId. Each settlement incrementally pays the seller for inference served.
- **detail settled**: Cumulative USDC settled through this channel, read as the max of the on-chain running total across its settlement events. Gross buyer-paid value, including the protocol's flat 4% fee.
- **detail fees**: Total protocol fees collected from this channel, summed from the platformFee on each ChannelSettled event. The platform fee is AntSeed's flat 4% take of settled volume; the seller keeps the rest.
- **col amount**: USDC settled in this single settlement event, read from the delta on the ChannelSettled log. This is the incremental buyer payment; sum of all deltas builds the channel's cumulative total.
- **col cumulative**: The channel's running settled total at this point, read from totalSettled on the ChannelSettled log. It is the on-chain cumulative sum of all settlement deltas up to and including this event.

### https://antseedstats.com/transactions

- **section**: Newest on-chain activity across AntSeed, merged from indexed events: settlements, deposits/withdrawals, stakes, $ANTS claims, DIEM stakes/rewards, and $ANTS transfers. We pull the latest rows from each event table, union them, and show the 100 most recent by block. Rows link to BaseScan.
- **col type**: What kind of activity this row is, inferred from the event type (not from decoding the raw method). Values: settle, deposit, withdraw, stake, unstake, claim, diem-stake, diem-unstake, diem-reward, transfer. Settle is a channel settlement paying a seller.
- **col account**: The key address for this event, shortened. It is the buyer for settlements and deposits, the seller for stakes, the claimant for $ANTS claims, the user for DIEM events, and the recipient for $ANTS transfers, so the role depends on the row's Type.
- **col value**: The event amount in its native unit: USDC for settlements (full buyer-paid amount, incl. the 4% protocol fee), deposits, withdrawals and seller stakes; $ANTS for claims, DIEM events and transfers. Units differ by Type, so values are not comparable across rows.

### https://antseedstats.com/requests

- **section**: Individual inference requests as they settle, newest first. One row per on-chain usage report, not per settlement: a settlement can cover several services at once and each reports separately. Usage is recorded on-chain as a running total per channel and service, so every figure is the difference against that channel's previous report, which is the work done between the two.
- **col model**: The model that served these requests, named by the buyer in its on-chain usage report and merged into a canonical identity so that different spellings of the same model group together. Only requests whose buyer shares the model split appear at all, which is why this feed is a lower bound on real network activity.
- **col requests**: How many individual inference calls this report covers. It is the increase in the channel's running request counter since its previous report, so one row can represent many calls batched between two reports rather than a single API call.
- **col tokens**: Tokens processed for these requests, input plus output, as the increase since the channel's previous report. Cached input is included here exactly once (it is a subset of input, not an extra), and the Cached column beside this one shows how much of it was cache replay.
- **col cached**: How much of the input was served from cache rather than processed fresh. Cached input is a subset of the token total, never added on top. It dominates agent-style workloads that resend a long context on every turn, which is why a model can lead on raw tokens while barely registering on cost.
- **col usdc**: USDC settled for these requests, as the increase in the channel's running paid-amount since its previous report. This is the full buyer-paid amount including the 4% protocol fee. Empty on free-tier rows, which involve no payment at all.
- **kpi requests**: Inference calls settled across the network in the last 24 hours, summed from the per-event increases in every channel's request counter. A rolling 24-hour window, not a calendar day, so it never empties out just after midnight. Free-tier requests are counted separately in the caption and never mixed in.
- **kpi tokens**: Tokens served across the network in the last 24 hours, input plus output, summed from the per-event increases in every channel's token counters. The caption shows how much of the input was cache replay rather than freshly processed context.
- **kpi sales**: USDC settled for inference in the last 24 hours, summed from the per-event increases in every channel's paid-amount, including the 4% protocol fee. Counts only settlements whose buyer shares the per-model split, so it is a lower bound on the network's true 24-hour volume, not the same figure as total network revenue.
- **kpi coverage**: Share of the last 24 hours' settlements that name the model served. Naming it is the buyer's own choice (settlement metadata v2) and the chain does not record it otherwise, so this is what decides how much of the network this feed can see. Measured live against the settlement count rather than quoted from a fixed figure.
- **free badge**: Free-tier usage: a buyer-signed report with no payment attached, so it is easier to fake than a settlement. Free rows never count toward revenue, rankings or paid totals.
- **image badge**: Generated images settled in this event (metadata v3). The protocol bills each image as a flat 1290-output-token credit, counted in the token figures (the network's convention) — the image count here is the ground truth for image work.

### https://antseedstats.com/models

- **models advertised**: Distinct AI models advertised across all AntSeed sellers, counted from our own crawl of the AntSeed DHT (the sellers' signed catalogs). Advertised offering, not on-chain usage: the chain never records which model served a purchase. In the table, "Sellers" counts who advertises each model and prices are the cheapest advertised $/1M tokens; image models are billed per generated image instead.
- **seller offerings**: Total (seller x model) pairs advertised on the AntSeed DHT, summed across every model. A seller offering 5 models adds 5 pairs. Counts advertised offerings, not trades or usage.
- **enriched**: How many catalog models we matched to the VeniceStats knowledge layer (bios, specs, capabilities). Matched by normalized model name against the VeniceStats catalog. Un-matched models still appear, just without the knowledge layer.
- **with usage**: Models with at least one buyer-shared per-model settlement report (metadata v2). Sharing the split is the buyer's opt-in choice, so this tracked subset is a lower bound on real usage, not the whole network. Counted Organic: models whose only usage came from wash traders are left out.
- **rankings**: Models ranked by settled USDC (sales), tokens served or distinct buyers (users), from buyer-shared per-model settlement reports. Opt-in coverage: every figure is a lower bound counting only the activity where buyers disclose the model split. Lifetime cumulative; opted-in channels contribute their full history, so the months when sharing was rare stay thin no matter how much of today's traffic reports its model. The footnote under the ranking measures that recent share live. Organic: only usage sold by sellers outside the wash-trading verdicts (AntSeed's on-chain wash registry plus our confirmed and high-probability clusters); before this filter, 9 of the 10 largest models by lifetime sales were almost entirely wash. View more has an All switch with every seller.
- **col sellers**: How many distinct AntSeed sellers advertise this model on the DHT. Counted as distinct agent ids per model in the seller catalog. Advertised offering, not proven usage.
- **usage section**: What buyers actually did with this model on AntSeed: tokens, settled calls, distinct buyers, how many sellers were actually used, and the gross USDC settled. Counted only from settlements whose buyers share the per-model split on-chain (settlement metadata v2, opt-in), so every figure here is a LOWER BOUND — real usage is at least this, likely more. AntSeed does not record on-chain which model served a purchase, which is why this depends on buyers opting in.
- **col save**: How much cheaper this model's BEST listing on AntSeed is than its list price. Text models compare input rates against the public OpenRouter models API (refreshed twice a day) — the same measure as the Save column on the Network page. Image models compare $ per generated image against the Venice list price carried by the enrichment layer (refreshed daily). Free listings show 100% only when a list price exists to compare against; a dash means no reference for this model or no listing that beats it.
- **col tokens**: Lifetime tokens (input plus output) attributed to this model, from settlements whose buyers share the per-model split on-chain (metadata v2/v3, opt-in). Image settlements count the protocol's flat 1290-output-token billing credit per image — the network's own accounting, the same convention Google uses for image output; each model's page shows the excl.-credit split. Token counts are buyer-reported: input tokens are computed by the buyer client, not by the model. A LOWER BOUND: purchases in channels without that data are invisible, so a dash means nothing has been attributed to this model yet, not that it is unused. Organic usage only: tokens sold by wash traders are left out.
- **col image price**: Cheapest advertised price per generated image, in USD, from the seller's unit-billing announce (metadata v11). The MIN across all sellers of the model. Image models are billed per image, not per token — their advertised token prices are protocol fallbacks and are not shown. A dash means no seller unit-bills this model.
- **col images**: Lifetime images generated with this model, counted from on-chain settlements whose buyers share the per-model split (metadata v3, opt-in). A LOWER BOUND, same coverage caveat as Tokens. Organic usage only.
- **col input price**: Cheapest advertised input price for this model, in USD per 1M input tokens. The MIN advertised input_price across all sellers of the model. A price floor, not an average or a paid price.
- **col output price**: Cheapest advertised output price for this model, in USD per 1M output tokens. The MIN advertised output_price across all sellers of the model. A price floor, not an average or a paid price.
- **detail sellers**: How many AntSeed sellers advertise this model on the DHT. Counted from the seller catalog (provider_service rows for this model). Advertised offering, not proven per-trade usage.
- **detail from input**: Cheapest advertised input price among this model's sellers, in USD per 1M input tokens. The minimum finite advertised input price across sellers. A floor, not an average or paid price.
- **detail from output**: Cheapest advertised output price among this model's sellers, in USD per 1M output tokens. The minimum finite advertised output price across sellers. A floor, not an average or paid price.
- **detail context**: Model context window (max token window) from the VeniceStats knowledge layer, shown in thousands of tokens. Sub-label shows HuggingFace downloads when known. Only present for enriched models.
- **col seller input**: This seller's advertised input price for the model, in USD per 1M input tokens, read from the seller catalog. An advertised price, not a paid or settled amount.
- **col seller output**: This seller's advertised output price for the model, in USD per 1M output tokens, read from the seller catalog. An advertised price, not a paid or settled amount.
- **col seller reputation**: Buyer trust score (0-100) for this seller, the AntSeed SDK's own formula, computed by us from the same chain reads a buyer node makes: settled service history (up to 50; log curves that saturate at 100 channels and $100), last epoch's share of recognized-usage points (up to 20), this epoch's share of staking power (up to 10) and the public history of a verified GitHub or domain identity (up to 20). A seller on the on-chain wash-trading registry scores 0. Blank for sellers with no on-chain settlement history yet. Recomputed every 15 minutes; sellers that left the DHT keep their score from chain state (usage falls to 0 after one epoch) and show when they were last seen. The table defaults to most-reputable first.
- **col routing**: How the AntSeed SDK's default buyer routing — what the VPR desktop app ships with — would treat this seller for this model. A seller is routable only when its EFFECTIVE reputation clears the trust gate (60): the buyer trust score, halved when the seller omits cached-input pricing that other sellers of the model advertise (free offers exempt). Among routable sellers, traffic goes cheapest-first (total advertised price; $ per image for unit-billed models) — reputation above the gate only breaks price ties, it is not a rank. #N is that routing order; 'gated' means the router would skip this seller entirely. Computed with the SDK's own functions and default preferences. Cold-start view: the live router also reacts to per-peer failures and cooldowns, which are buyer-side runtime state with no on-chain footprint.
- **about section**: Model knowledge (TLDR, bio, capabilities, links, sources) from the VeniceStats enrichment layer; the bio is auto-generated via Venice inference. Descriptive background only, shown for enriched models. Not on-chain data.
- **best price**: Cheapest advertised input/output price across all AntSeed sellers of this model, per 1M tokens. The green badge is the saving versus the model's reference list price (from the VeniceStats catalog), averaged across input and output. Advertised rates, not settled amounts.
- **wash flag**: Models excluded from the default ranking because buyer-graph analysis indicates wash trading: buyers who buy from no other seller, wallets first-funded in the same hour, machine-steady cadence. Measured from on-chain settlement patterns — never from the model's name. Methodology and per-model reasons are shown with each row; a flag is a strong signal, not a court verdict.

### https://antseedstats.com/sellers

- **col rev7**: USDC this seller settled in the last 7 days (rolling), including the 4% protocol fee. The table is sorted by it, so the sellers selling now come first; sellers with nothing this week follow by lifetime revenue, which is the Revenue total column.
- **leaderboard**: Sorted by the last 7 days of sales. Organic means no wash trading: the default view leaves out the sellers identified as wash traders, those AntSeed's own on-chain wash registry has proven (SP1 proofs, the protocol's verdict, not ours), plus the wash clusters confirmed or rated high-probability on our Observatory. All shows every seller; their revenue still counts in the total above. A verified seller has proven ownership of a domain or GitHub account: we fetch the DNS / .well-known / GitHub proof (which must echo the peer's id), not the self-declared claim. Only verified shows verified sellers that are also Organic: proving who you are does not clear a wash-trading verdict.
- **pool staked**: The principal of every position behind this seller that is active in the current epoch: what the stakers actually put in, the same figure as the Staking page and the list below. The contract counts a slightly larger weight (poolActiveStakeAtEpoch: principal plus a 5% bonus on principal restaked from pool rewards), and splits power and rewards by that. Positions activate one epoch after they are created, and every split, merge or max lock also lands one epoch later, so when the pool's stake changes at the next epoch the caption says by how much.
- **pool power share**: This pool's lock-weighted power as a share of the whole network's, in the current epoch; when it changes at the next epoch (stake waiting to activate, here or in other pools) the caption gives the next epoch's share. Power is stake times the epochs left on each lock; the staker budget is split by usage multiplied by power, so this is the pool's side of that multiplication.
- **pool usage share**: This pool's raw usage points as a share of every pool's, in the last complete epoch, after the on-chain points policy (proven wash traders are zeroed). It is the other side of the multiplication: a pool with usage and no power earns almost nothing.
- **pool staker reward**: What this pool earned for its stakers in the last complete epoch: the staker budget times the pool's weighted points (usage times power) over every pool's. 'Settled on-chain' is the contract's own figure; 'earned, not settled' is computed from the contract's own inputs, because settlement is lazy and permissionless and a reward nobody settled is still a reward.
- **pool staking**: The $ANTS locked behind this seller's provider pool, and what the pool earns for it. Power, not stake, is what rewards are split by: a position is worth its stake multiplied by the epochs still left on its lock, up to 104. Staking is delegated, so the stakers listed are frequently not the seller. Each pool is paid its usage share multiplied by its power share, so a pool with traffic and no stake earns almost nothing and a pool with stake and no traffic earns nothing. Read live from the pools contract for the current epoch. Staking activates one epoch late: every stake, split, merge, max lock or withdrawal made this epoch only counts from the next one, and those positions are marked pending.
- **epoch usage pending**: What this seller's agent would receive from the usage bucket if the epoch ended now: AntseedUsageRewards.pendingAgentReward, the contract's own figure, not our formula. It is a share of the seller-side usage budget by weighted points, capped at 5% of that budget per agent; at the cap, more usage this epoch earns nothing. Pending, not paid: nothing mints until the epoch closes and the reward is claimed, and the figure keeps moving until then as other sellers accrue points. A seller on the wash-trading registry accrues no points, so its figure is zero whatever it settles.
- **rising sellers**: Sellers growing right now in both revenue and distinct buyers. Momentum is the geometric mean of two ratios: dollars per day and buyers per day over the last 3 days versus the 11 days before, so a seller only rises if both grow. Only sellers that pass our legitimacy gate are eligible: no wash-trading cluster, no watchlist, no sybil flags, at least 5 buyers and $20 this week, no captive top buyer (a buyer above 60% of revenue only disqualifies when that buyer itself settles with fewer than 5 sellers; a diversified one damps the rank instead), and at least half of the buyers also buying from other sellers. Steady cards are the largest eligible non-rising sellers with a persistent base (active 20+ of the last 28 days): at least one, and enough to show three cards when fewer than three sellers are clearly rising. Nothing that fails the gate is ever used to fill the panel. Recomputed hourly from settlements.
- **col trend**: Settled revenue over the last 7 days versus the 7 days before, as a percentage change. Blank when the seller settled less than $20 this week or had nothing to compare against.
- **col momentum**: Momentum, as a multiplier: revenue growth times buyer growth over the last 3 days versus the 11 days before, geometric mean, after the concentration and age adjustments. Shown only for sellers eligible for the Rising sellers panel; blank means not eligible or not enough activity, it is not a verdict.
- **detail momentum**: Momentum over the last 3 days versus the 11 before: revenue growth times buyer growth, geometric mean. The small series is distinct buyers per day over the last 14 days. Shown only while the seller is eligible for the Rising sellers panel.
- **active sellers**: Sellers that have settled at least one inference on-chain. Counted as the distinct seller addresses appearing in ChannelSettled events, whether or not they still advertise on the AntSeed DHT.
- **total revenue**: Total settled USDC across all sellers, summed from ChannelSettled.delta on-chain. This is gross buyer-paid revenue, including the flat 4% protocol fee (net to sellers is gross minus that fee).
- **in live catalog**: Sellers currently advertising on the AntSeed DHT, identified by a provider_directory row sourced from our DHT poller. Off-catalog sellers (settling on-chain but not announcing) are excluded.
- **distribution**: Concentration of settled revenue on the supply side. Top 10 = share of total settled USDC held by the 10 largest sellers. Gini (0 even, 1 = one dominates) and effective (1/HHI, equal-sized seller count) summarize the spread.
- **col seller**: The seller, shown by its AntSeed DHT display name when announced, else its on-chain address. Subtitle marks off-catalog sellers (settling on-chain but not announcing on the DHT).
- **col revenue**: Settled USDC for this seller, summed from its ChannelSettled.delta events on-chain. Gross buyer-paid revenue including the flat 4% protocol fee (net to seller is gross minus that fee).
- **col channels**: Distinct payment channels this seller has settled through, counted as unique channel IDs in its ChannelSettled events. Channels opened but never settled are reflected in the Ghost rate instead.
- **col tokens**: Total tokens served by this seller's agent, summed as input plus output tokens from on-chain MetadataRecorded logs. Joined to the seller via its agent ID; sellers with no metadata link show zero.
- **col models**: Number of models this seller advertises on the AntSeed DHT catalog (off-chain). These are advertised offerings, not proven per-trade usage: the per-purchase model is not recorded on-chain. "off-catalog" under a name means the seller settles on-chain but does not announce on the DHT.
- **col reputation**: Buyer trust score (0-100) for this seller, the AntSeed SDK's own formula, computed by us from the same chain reads a buyer node makes: settled service history (up to 50; log curves that saturate at 100 channels and $100), last epoch's share of recognized-usage points (up to 20), this epoch's share of staking power (up to 10) and the public history of a verified GitHub or domain identity (up to 20). A seller on the on-chain wash-trading registry scores 0. Blank for sellers with no on-chain settlement history yet. Recomputed every 15 minutes; sellers that left the DHT keep their score from chain state (usage falls to 0 after one epoch) and show when they were last seen.
- **col ghost**: Share of this seller's channels that were served but never settled on-chain. Computed as ghostCount / channelCount, both read authoritatively from the contract's getAgentStats. Higher means more unsettled channels. Colored green under 10%, amber under 20%, red at 20% or more.
- **col first seen**: Date of this seller's first settlement on-chain, taken as the earliest timestamp in its ChannelSettled events. Reflects first settled activity, not first DHT announcement.
- **col last settle**: Time since this seller's most recent on-chain settlement, from the latest timestamp in its ChannelSettled events. Shown as a relative age (e.g. 3h ago).
- **recent settles**: The latest on-chain settlements paying this seller, from ChannelSettled events: channel, buyer, settled amount and age. Most recent first; capped to the latest rows.
- **advertised models**: The model catalog this seller announces on the AntSeed DHT, with its advertised prices per million tokens. These are offerings, not proven per-trade usage: the per-purchase model is not recorded on-chain.
- **detail revenue**: This seller's total settled USDC, summed from ChannelSettled.delta on-chain. Gross (includes the flat 4% protocol fee); the subtitle shows that fee, summed from the per-settle platform_fee field.
- **detail rank**: This seller's position on the revenue leaderboard: rank by lifetime settled USDC among every seller that ever settled, plus its share of total network volume. Both recomputed live from on-chain settles.
- **detail last7d**: Settled USDC in the trailing 7 days, with the change versus the 7 days before that. Both windows summed live from on-chain settle events; lifetime totals are in the Revenue card.
- **detail locked**: $ANTS emission rewards this seller has accrued, minted to the rewards pool but locked until two on-chain conditions are met, not one: the seller-claim policy installed, and the pool allowed to move $ANTS at all. Summed from LockedRewardRecorded events; the Staking page has the full leaderboard.
- **detail settles**: On-chain settlement events paying this seller (ChannelSettled count). Subtitle shows distinct payment channels and distinct buyers it has settled with, both counted from those same settle events.
- **detail tokens**: Total tokens this seller's agent has served, input plus output, summed from on-chain MetadataRecorded logs. Subtitle shows request count. Requires an agent link; shows zero if the seller is off-catalog.
- **detail models**: Number of models this seller advertises on the AntSeed DHT, counted from its catalog service entries. These are advertised offerings, not proven per-trade usage: the per-purchase model is not recorded on-chain.
- **detail reputation**: Buyer trust score (0-100), the AntSeed SDK's own formula (version 0.2.121) computed by us from the same chain reads a buyer node makes. Four parts, shown under the number: history (up to 50) from settled channels and USDC on log curves that saturate at 100 channels and $100; usage (up to 20) from the seller pool's share of all pools' recognized-usage points in the last complete epoch; power (up to 10) from the pool's share of the network's lock-weighted staking power this epoch; identity (up to 20) from the public history of a verified GitHub portfolio (stars, breadth, age; max 70 points scaled to 20) or a verified domain's registration age (max 12 points scaled to 20), the strongest one only. A seller flagged on the on-chain wash-trading registry scores 0 whatever the parts. Shares use the SDK's log curve (100% = full weight, 10% = two thirds, 1% = a third). Nothing else feeds the number: stake, ghost rate, ticket size and our own wash heuristics are not in it. The sybil line, when shown, is the SDK's display-only heuristic (not part of the score); it still gates our Rising Sellers list. A seller that left the DHT keeps its score from chain state and its last verified identity, with the date it was last seen announcing.
- **detail ghost**: Share of this seller's channels that were served but never settled on-chain. Computed as ghostCount / channelCount, both read authoritatively from the contract's getAgentStats; subtitle shows the raw counts. Colored green under 10%, amber under 20%, red at 20% or more.
- **detail stake**: This seller's stake on-chain, in USDC, read from the AntseedStaking seller record via our DHT poller. Backs the seller's capacity; shown as a dash for sellers without a directory entry.
- **chart daily**: This seller's settled USDC per day, summed from ChannelSettled.delta and zero-filled across the full date range. The current day shows a translucent pace-to-date projection (day-so-far scaled by the fraction of the day elapsed).
- **chart daily tokens**: This seller's tokens served per day, stacked input vs output, summed from on-chain MetadataRecorded events for its agent and zero-filled across the range. The current day shows a translucent pace-to-date projection (day-so-far scaled by the fraction of the day elapsed).
- **chart epoch volume**: This seller's settled USDC grouped by the contract's 7-day emission epochs. The in-flight epoch shows a translucent pace-to-date projection to its end; fully elapsed epochs are final.
- **chart epoch tokens**: This seller's tokens served per 7-day epoch, stacked input vs output (request count in the tooltip), summed from on-chain MetadataRecorded events for its agent. The in-flight epoch shows a translucent pace-to-date projection.
- **buyer mix**: How this seller's revenue splits across its buyers: the six largest buyers by settled USDC, each as a slice, with all remaining buyers grouped into an Others slice.
- **col buyer share**: This buyer's share of the seller's total revenue, computed as the buyer's settled USDC divided by the seller's total across all buyers. Rendered as a bar with percent.
- **model sales**: What this seller actually sells PER MODEL — settled USDC, tokens and distinct buyers attributed to each model, decoded from settlement metadata v2. Values are channel-cumulative since each channel opened, so an opted-in channel contributes its full lifetime, not just recent activity. Coverage is buyer-opt-in: channels that don't share the split are excluded, making every figure a lower bound on the seller's true totals (the cross-checked sums match the channels' settled USDC exactly).
- **model mix**: How this seller's SHARED revenue splits across the models it serves: the six largest models by settled USDC from per-model (v2) settlements, with the rest grouped into Others. Only opted-in channels are counted — the mix describes the shared slice of this seller's business, not necessarily all of it.
- **col model share**: This model's share of the seller's per-model (v2) revenue — the model's settled USDC divided by the seller's total across all models WITH shared data. Rendered as a bar with percent.
- **free usage**: What this seller served on the FREE tier per model — tokens, requests and distinct buyers decoded from AntseedFreeUsage events. These are usage reports signed by the buyers, with no payment attached: easier to fake than settlements, so every figure is a lower bound and free usage never counts toward revenue or rankings. Values are channel-cumulative (latest report per channel and service).
- **free mix**: How this seller's free-tier tokens split across the models it serves for free: the six largest models by buyer-reported free tokens, with the rest grouped into Others.
- **col free share**: This model's share of the seller's total free-tier tokens (buyer-reported). Rendered as a bar with percent.
- **free tier chip**: Advertised at $0 for both input and output tokens: this offering is free tier. Usage on it is buyer-reported via the AntseedFreeUsage contract and shown in the Free usage section, never in revenue.

### https://antseedstats.com/labs

- **labs count**: Distinct AI organizations (labs) behind the models advertised on the AntSeed DHT. Grouped from the VeniceStats provider enrichment org, with an inferred-org fallback for models without enrichment.
- **models count**: Models in the AntSeed DHT catalog attributed to these labs, summed across all labs. Advertised offerings, not proven per-trade usage: the per-purchase model is not recorded on-chain.

### https://antseedstats.com/buyers

- **paying buyers**: Distinct wallets that paid for at least one settled inference trade (a ChannelSettled event). This is the real demand side, counted from on-chain settlements. Wallets that only funded escrow but never settled are not counted here.
- **depositors**: Distinct wallets that funded escrow at least once (an AntseedDeposits deposit event). A superset of paying buyers: it includes wallets that deposited USDC but have not yet settled any inference trade.
- **total spent**: Total settled USDC paid by all buyers over their lifetime, summed from on-chain ChannelSettled events. This is gross buyer spend, including the flat 4% protocol fee taken from settled volume.
- **avg per buyer**: Average lifetime settled USDC per paying buyer: total spent divided by the number of wallets on the leaderboard (those with at least one settle). Non-settling depositors are not in the denominator.
- **deposited**: Gross USDC ever deposited into escrow by all buyers, summed from on-chain AntseedDeposits deposit events. This is total inflow, before subtracting any withdrawals.
- **withdrawn**: Gross USDC pulled back out of escrow by all buyers, summed from on-chain WithdrawalExecuted events. This is total escrow outflow.
- **net in escrow**: Net USDC currently committed to escrow: gross deposited minus gross withdrawn, both summed from on-chain events. An accounting net of deposits versus WithdrawalExecuted, not a live balance read.
- **distribution**: How concentrated buyer demand is. Headline = share of total settled USDC held by the top 10 buyers. Gini measures inequality (0 even, near 1 one dominates); effective = 1/HHI, the equal-sized-buyer count. All from settled spend per buyer.
- **col spent**: Lifetime settled USDC paid by this buyer, summed from its on-chain ChannelSettled events. Gross spend, including the flat 4% protocol fee. The leaderboard is sorted by this by default.
- **col channels**: Distinct payment channels this buyer has settled through, counted as unique channel IDs in its ChannelSettled events. A channel is one buyer-seller payment relationship.
- **col sellers**: Distinct sellers (providers) this buyer has paid, counted as unique seller addresses across its on-chain settlements.
- **col tokens**: Total AI tokens (input plus output) this buyer consumed, summed from on-chain MetadataRecorded events. The metadataHash records token counts only, so which model was used is not provable on-chain.
- **col deposited**: Gross USDC this buyer deposited into escrow, summed from its on-chain AntseedDeposits deposit events. Gross inflow, not net of withdrawals.
- **col first seen**: When this buyer first settled a trade: the earliest timestamp across its on-chain ChannelSettled events. This tracks first settle, not first deposit.
- **col last buy**: How long since this buyer last settled a trade: the most recent timestamp across its on-chain ChannelSettled events, shown as time-ago.
- **detail spent**: This buyer's lifetime settled USDC, summed from its on-chain ChannelSettled events. Gross spend, including the flat 4% protocol fee. Subtext shows total USDC it deposited into escrow.
- **detail settles**: Number of settlement events (ChannelSettled) for this buyer, counted from on-chain settlements. Subtext shows the distinct channels and distinct sellers behind those settles.
- **detail tokens**: Total AI tokens (input plus output) this buyer consumed, summed from on-chain MetadataRecorded events. Subtext shows request count. The on-chain metadataHash records token counts only, not which model was used.
- **detail sellers used**: Distinct sellers (providers) this buyer has paid, counted as unique seller addresses across its on-chain settlements.
- **chart daily**: This buyer's settled USDC per day, from its first settle to now, each bar summing ChannelSettled delta for that day (zero-filled for idle days). Gross spend including the 4% protocol fee, bucketed by UTC day.
- **chart daily tokens**: This buyer's AI tokens consumed per day, stacked input vs output, summed from on-chain MetadataRecorded events for its wallet and zero-filled across the range. The current day shows a translucent pace-to-date projection.
- **chart epoch volume**: This buyer's settled USDC grouped by the contract's 7-day emission epochs. The in-flight epoch shows a translucent pace-to-date projection to its end; fully elapsed epochs are final.
- **chart epoch tokens**: This buyer's tokens consumed per 7-day epoch, stacked input vs output (request count in the tooltip), summed from on-chain MetadataRecorded events. The in-flight epoch shows a translucent pace-to-date projection.
- **seller mix**: How this buyer's total settled spend splits across the sellers it uses: the top 6 sellers by spend, with everything else grouped into an Others slice. Slice size is each seller's share of the buyer's total spend.
- **col seller share**: This seller's portion of the buyer's total settled spend (spend to this seller divided by the buyer's total across all sellers). Shown as a bar and percentage.
- **model purchases**: What this buyer actually buys PER MODEL — settled USDC, tokens and distinct sellers attributed to each model, decoded from settlement metadata v2. Sharing the split is the buyer's own choice (it signs the payload), and values are channel-cumulative, so its opted-in channels contribute their full lifetime. Channels where this buyer chose not to share are excluded, making every figure a lower bound (the cross-checked sums match the channels' settled USDC exactly).
- **purchase mix**: How this buyer's SHARED spend splits across the models it buys: the six largest models by settled USDC from per-model (v2) settlements, with the rest grouped into Others. Only the buyer's opted-in channels are counted.
- **col model share**: This model's share of the buyer's per-model (v2) spend — the model's settled USDC divided by the buyer's total across all models WITH shared data. Rendered as a bar with percent.
- **free usage**: What this buyer used on the FREE tier per model — tokens, requests and distinct sellers decoded from AntseedFreeUsage events. The reports are signed by this buyer itself, with no payment attached: easier to fake than settlements, so every figure is a lower bound and free usage never counts toward spend or paid totals. Values are channel-cumulative (latest report per channel and service).
- **free mix**: How this buyer's free-tier tokens split across the models it uses for free: the six largest models by self-reported free tokens, with the rest grouped into Others.
- **col free share**: This model's share of the buyer's total free-tier tokens (self-reported). Rendered as a bar with percent.

### https://antseedstats.com/calculator

- **model**: Every token-priced model with a live listing on the AntSeed network — type to search by name, id or lab. Models with a published list price (the public OpenRouter models API, refreshed twice a day server-side) get the full comparison; marketplace-only models (stealth releases, private fine-tunes) are priced across sellers without a savings claim; free-only models are shown as free. Image/video/audio generators are left out: they bill per generation, not per token. Grouped with the most-used models on AntSeed first, from on-chain settled usage.
- **tokens in**: Everything you send the model in a month, in millions of tokens: prompts, chat history, attached files and system instructions. Your provider's usage dashboard shows the monthly total; Claude Code users can run ccusage in a terminal for the same figures.
- **tokens out**: Everything the model writes back in a month, in millions of tokens, including reasoning tokens. It sits next to input in the same usage dashboard and is usually the smaller number — but output costs several times more per token, so it often drives the bill.
- **tokens cached**: Optional: monthly cached-input tokens (prompt caching — input the provider has already seen). Cache-heavy workloads like coding agents can have most of their input arrive cached at a fraction of the price; both the list side and the AntSeed side price it here. Where no cached rate is advertised, the input rate applies (protocol convention).
- **list price**: What the same workload costs at the model's published list price, from the public OpenRouter models API — the same reference AntSeed's own site uses — refreshed twice a day and stored server-side, so the comparison is reproducible. The tooltip on each result names the exact OpenRouter model the reference comes from.
- **cheapest**: The lowest-cost seller currently advertising this model on the AntSeed network for YOUR token mix — recomputed from every listing's input/output/cached rates as you type, with the 4% protocol fee included. Advertised rates from our own DHT crawl, not settled prices.
- **trusted**: The lowest-cost seller among those we'd actually point you to: on-chain-proven settlement history and a buyer trust score of at least 60, the same gate the AntSeed SDK's default router applies, additionally screened by our ranking-integrity checks. A shield badge marks sellers that also hold an externally verified domain or GitHub proof. The 4% protocol fee is included.

### https://antseedstats.com/network

- **services**: Total advertised services across the network: one per (peer x canonical model) offering, counted from our own DHT crawl of currently-announcing providers. When a provider lists the same model under several spellings, the cheapest listing represents it. These are advertised offerings with prices, not proven per-trade usage.
- **active peers**: Distinct providers currently announcing on the AntSeed DHT, from our own crawl. Includes on-chain-proven sellers (with reputation and usage) and advertising-only peers that have not settled on-chain yet (marked "new" in the provider chips). "Proven" counts the peers with on-chain settlement history.
- **tokens served**: Network-wide lifetime tokens served, input plus output, summed from on-chain MetadataRecorded events across all providers. On-chain token totals are exact; which model served each request is not on-chain.
- **models**: Distinct AI models advertised across all announcing providers, counted from the DHT service catalog by canonical model identity, so a model listed under several spellings counts once (the same definition the Models page uses; its number is larger because it counts the durable catalog, including sellers absent from the current crawl). The advertised offering, not proven usage: AntSeed never records on-chain which model served a purchase.
- **savings**: Median discount below list price across every listing that beats it, using the public OpenRouter models API as the list-price reference (refreshed twice a day) and comparing input rates. Free services with a reference count as 100% off. Listings with no reference (marketplace-only models) and listings that are not cheaper are excluded from the median, never counted as zero. Advertised rates, not settled prices.
- **free services**: Advertised services priced at zero for both input and output tokens, counted from our DHT crawl. Many providers run free models on the network; use the Free filter to browse only these, and free rates show as a highlighted FREE in the table.
- **col input**: Advertised price per 1M input tokens for this provider's listing of the model, read from its DHT announcement. An advertised rate, not a settled price. The table defaults to most-used models first; click a price header to rank by rate.
- **col cached input**: Price per 1M cached-input tokens (the prompt-caching tier: input the provider has already seen and can reuse), read from its DHT announcement. When a provider doesn't advertise a separate cached rate it charges the same as input, so we show the input price there — a cached price below input means a real caching discount. FREE means zero. An advertised rate, not a settled price.
- **col output**: Advertised price per 1M output tokens for this provider's listing of the model, read from its DHT announcement. An advertised rate, not a settled price.
- **usage section**: What buyers actually did with this model on AntSeed: tokens, settled calls, distinct buyers, how many sellers were actually used, and the gross USDC settled. Counted only from settlements whose buyers share the per-model split on-chain (settlement metadata v2, opt-in), so every figure here is a LOWER BOUND — real usage is at least this, likely more. AntSeed does not record on-chain which model served a purchase, which is why this depends on buyers opting in.
- **col save**: How much cheaper this listing's input price is than the model's list price, from the public OpenRouter models API (the same reference AntSeed's own site uses) refreshed twice a day. Shown only when the listing actually beats list; FREE marks $0/$0 services. A dash means no reference exists (marketplace-only model) or the listing isn't cheaper. Advertised rates, not settled prices.
- **col reputation**: Buyer trust score (0-100) for this seller, the AntSeed SDK's own formula, computed by us from the same chain reads a buyer node makes: settled service history (up to 50; log curves that saturate at 100 channels and $100), last epoch's share of recognized-usage points (up to 20), this epoch's share of staking power (up to 10) and the public history of a verified GitHub or domain identity (up to 20). A seller on the on-chain wash-trading registry scores 0. Blank for sellers with no on-chain settlement history yet. Recomputed every 15 minutes; sellers that left the DHT keep their score from chain state (usage falls to 0 after one epoch) and show when they were last seen. Shown as a dash for advertising-only peers with no on-chain settlement history yet.
- **col verified**: DHT signature verification: the provider cryptographically signed its DHT announcement, proof it controls the identity it advertises under. A check means a valid signature was in our crawl, a dash means none was seen. This is the identity-key layer; deeper verification types (identity, TEE attestation) are coming and will be shown separately.
- **col stake**: Seller USDC stake bonded on-chain to back the provider's capacity, read via our DHT poller from the AntseedStaking record. A dash means none is known (common for advertising-only peers).
- **col tokens**: The main figure is the PROVIDER-LEVEL lifetime total (input plus output tokens) from on-chain MetadataRecorded events — the same on every one of that provider's model rows. Since June 2026 some buyers also share a per-model split on-chain (settlement metadata v2, opt-in): those services get a green-dot line underneath with THIS model's own tokens. The split is a lower bound — it only counts channels whose buyers opted in. Dash for peers with no on-chain usage yet.
- **col users**: The main figure is the PROVIDER-LEVEL count of distinct buyers served, from on-chain MetadataRecorded events — the same on every one of that provider's model rows. Where buyers share the per-model split (settlement metadata v2, opt-in), a green-dot line underneath shows how many distinct buyers used THIS model — a lower bound, counting only the opted-in channels. Dash for peers with no on-chain usage yet.

### https://antseedstats.com/status

- **subsystems**: How many of the monitored subsystems are fully healthy right now, out of six total (on-chain ingestion, realtime, daily aggregation, model enrichment, database, host). Only subsystems in a clean OK state count toward the green tally; degraded ones do not.
- **chain head**: The latest Base mainnet block number, read live from the chain (Alchemy eth_blockNumber). It is the reference tip we compare every ingestion stream against to compute how many blocks behind we are.
- **last indexed**: The newest Base block we have stored, taken as the highest block of any settlement event in our database. It is our indexing frontier: the gap between this and Chain head is how far our data trails the live chain.
- **max ingest lag**: The worst lag across all ingestion streams: the most blocks any one stream is behind the chain head. Minutes assume Base's ~2s blocks. Healthy under 300 blocks, degraded under 2000, down beyond that.
- **realtime**: Health of the near-realtime WebSocket feed (backed by a catch-up worker). Read from a heartbeat the worker writes: OK when mode is live and the heartbeat is under 5 min old, down past 30 min stale. Subtitle shows time since the last on-chain event.
- **jobs table**: Background jobs that keep the pipeline fresh, each self-reporting to a health record. Status reads its consecutive-failure count: OK at zero, degraded from 1 to 5, down at 6 or more. Failures is that running count, Last success is the time since the job last completed cleanly.
- **streams table**: Per-stream ingestion watermarks. Last block is the newest block each stream has processed; Lag is chain head minus that (minutes assume ~2s Base blocks). OK under 300 blocks behind, degraded under 2000, down beyond. Updated is when the watermark last advanced.
- **disk used**: Root filesystem usage on the host, read via statfs. Percent used is 100 minus free percent, with absolute free space alongside. The bar turns hot past 88%, and the Server subsystem flags warn when free disk falls under 12%.
- **ram used**: Host RAM usage, computed as (total minus free) over total from the OS. Free here excludes reclaimable cache, so it can look higher than 'available' memory. The Server subsystem flags warn above 95% used.
- **database**: On-disk size of our PostgreSQL database (pg_database_size), with the number of stored settlement events below. The settle count comes from Postgres live-row statistics, so it is a close estimate rather than an exact count.
- **daily rollup**: The newest day present in our daily revenue rollup table. It confirms the daily aggregation job is current: if this date falls behind today, the Daily aggregation subsystem flips to degraded.

### https://antseedstats.com/developers

- **base url**: Every endpoint lives under this prefix. Paths on this page are relative to it, so /sellers means https://antseedstats.com/api/v1/sellers. Read-only GET requests, JSON by default.
- **auth**: No key, no account, no sign-up. Public data stays public; if you need more than the per-IP budget, ask and we will talk about a key.
- **format**: JSON with a data object and a meta object. The two daily series also accept format=csv and return a plain CSV with a header row, one line per UTC day.
- **rate limit**: A fixed budget per client IP per rolling minute. X-RateLimit-Remaining and X-RateLimit-Reset tell you where you stand; past the budget you get a 429 with Retry-After. Responses carry Cache-Control, so a cache in front of your app saves most calls.
- **cors**: Access-Control-Allow-Origin is * on every endpoint, so a static site can call the API straight from the browser without a proxy.
- **versioning**: Fields never change meaning inside v1; new fields are added, old ones stay. Figures that depend on a definition of ours, such as organic or the trust score, say so in meta.sources, and a change of definition would be a new field or a v2.
- **openapi**: A machine-readable description of every endpoint, parameter and response field, generated from the same catalogue as this page. Point an OpenAPI client or an AI tool at it.
- **as of block**: The Base block our indexer had fully processed when the response was built, with its timestamp and how many blocks behind the chain head that was. A number without a block cannot be reconciled with the chain; this one can.
- **units**: Money comes twice: an integer in micro-USDC (6 decimals, exact, the on-chain unit) and a formatted string with 2 decimals. Tokens and requests are integers. Prices are USD per 1 million tokens, as advertised.
- **time**: Timestamps are UTC seconds (fields ending in _ts). Days are UTC calendar days as YYYY-MM-DD. A 24h, 7d or 30d window is rolling and ends now; a day is a full UTC day, and today is partial.
- **sources**: chain: read from Base events or contract state. announce: what a seller signs and publishes about itself (names, prices), taken as is. antseedstats: a figure that depends on a definition of ours, such as the organic view, the trust score or a projection.
- **view**: Lists of sellers and prices default to all: nothing hidden. Rankings default to organic, like the site: sellers in AntSeed's on-chain wash registry and in clusters we confirmed are left out. Every row still carries wash_registry (the chain's verdict) and organic (ours) so you can choose.
- **llms**: llms.txt is the front door for AI agents (llmstxt.org convention): what the site is, the key concepts and every machine-readable link, in one Markdown file at a known address. llms-full.txt is the whole backstage in one file. Both are generated from the same sources as the pages.
- **mcp**: The Model Context Protocol is how AI clients such as Claude, Cursor or VS Code call outside tools. Our server turns every endpoint on this page into one tool, hosted at antseedstats.com/mcp with no key, or run locally from npm. Each answer names the page it comes from, the Base block it is as of and whether a figure is a chain fact, a seller's claim or our judgement, so the model can cite it.

## Glossary (catalogued 2026-06-06)

Definitions, formulas and caveats per metric as catalogued in June 2026. Where a definition here and a tip above disagree, the tip is the newer one.

### Home / Overview (`/`)

#### KPI

- **Total active users**
  - _Def:_ Headline reach count: distinct buyers plus distinct sellers (both from settled trades) plus the live on-chain DIEM staker count. Buyers = addresses with at least one ChannelSettled as buyer; sellers = distinct sellers in ChannelSettled; DIEM = stakerCount read from the DIEM pool contract.
  - _Formula:_ `distinct settled buyers + distinct settled sellers + DIEM stakerCount`
  - _Caveat:_ The three pools are summed, so an address that buys, sells and stakes can be counted up to three times.
- **Network revenue**
  - _Def:_ Lifetime gross USDC paid by buyers for settled inference, summed from every ChannelSettled event (the per-settle delta). This is the full buyer-paid amount and still includes the protocol's flat 4% fee.
  - _Formula:_ `Sum(channel_settled.delta)`
  - _Caveat:_ Gross, includes the 4% protocol fee. Net to sellers = this minus Network fees.
- **Tokens consumed**
  - _Def:_ Lifetime input plus output tokens served, summed from the on-chain MetadataRecorded events (input_tokens + output_tokens). The subline splits the in and out halves.
  - _Formula:_ `Sum(metadata_recorded.input_tokens) + Sum(metadata_recorded.output_tokens)`
  - _Caveat:_ From MetadataRecorded events; the metadataHash is a keccak of token counts only, so model attribution is not on-chain.
- **Network fees**
  - _Def:_ Lifetime protocol take: the flat 4% slice of settled volume, summed from the platformFee field recorded on each ChannelSettled event.
  - _Formula:_ `Sum(channel_settled.platformFee)`
- **$ANTS available**
  - _Def:_ Cumulative full-epoch $ANTS emission entitlement to date: the current epoch number times the per-epoch emission (5,000,000 ANTS at tier 0). The subline shows minted = the actual current $ANTS supply read on-chain.
  - _Formula:_ `current epoch x 5,000,000 ANTS (INITIAL_EMISSION_ANTS); minted = ANTSToken.totalSupply`
  - _Caveat:_ Available is the entitlement ceiling, not what has been minted; transfers are gated so there is no market price.

#### Panel stat

- **Current epoch**
  - _Def:_ The marketplace's active emission epoch, derived from the contract clock (genesis 2026-04-09, 7-day epochs). The subline counts the hours left until this epoch ends.
  - _Formula:_ `floor((now - genesis) / 604800); ends in = floor(secondsLeft / 3600)`
- **Epoch revenue**
  - _Def:_ Gross settled USDC for the current epoch only: sum of ChannelSettled delta for settles whose timestamp maps to the current epoch via the contract clock. Subline counts the settles in this epoch.
  - _Formula:_ `Sum(delta) for settles in current epoch; settles = count of those events`
  - _Caveat:_ Gross, includes the 4% fee.
- **Epoch tokens**
  - _Def:_ Input plus output tokens served during the current epoch, summed from MetadataRecorded events with a timestamp at or after this epoch's start.
  - _Formula:_ `Sum(input_tokens) + Sum(output_tokens) where timestamp >= epochStart(currentEpoch)`
- **Active sellers**
  - _Def:_ Count of distinct seller addresses that settled at least one trade since the current epoch's start.
  - _Formula:_ `COUNT(DISTINCT seller) from channel_settled where timestamp >= epochStart(currentEpoch)`
- **Buyers**
  - _Def:_ Count of distinct buyer addresses that have settled at least one trade (paying buyers), over all time.
  - _Formula:_ `distinct buyer in channel_settled`
  - _Caveat:_ Counts settling buyers only, not addresses that merely deposited.
- **Sellers**
  - _Def:_ Count of distinct seller addresses that have settled at least one trade, over all time.
  - _Formula:_ `distinct seller in channel_settled`
- **DIEM staked**
  - _Def:_ Total amount currently staked in the DIEM provider-capacity pool, read live on-chain from the staking proxy's totalStaked (18-decimal). Stakers deposit to back inference capacity and earn USDC fees plus $ANTS incentives.
  - _Formula:_ `DiemStakingProxy.totalStaked (18-dec)`
  - _Caveat:_ Labelled ANTS in the card but it is the staked DIEM-denominated pool balance read on-chain.
- **Services**
  - _Def:_ Count of advertised provider service offerings, from the indexed off-chain provider catalog (network.antseed.com/stats).
  - _Formula:_ `count(provider_service)`
  - _Caveat:_ These are advertised offerings from the off-chain catalog, not proof of per-trade usage.

#### Progress

- **Available to claim**
  - _Def:_ Cumulative full-epoch $ANTS emission entitlement to date: current epoch number times the fixed 5,000,000 ANTS per epoch. Shown as the full (100%) bar in the claim-vs-minted comparison.
  - _Formula:_ `current epoch x 5,000,000 ANTS (INITIAL_EMISSION_ANTS)`
  - _Caveat:_ An entitlement ceiling, not actual minted supply.
- **Total minted**
  - _Def:_ Actual current $ANTS supply read on-chain via ANTSToken.totalSupply. The bar's fill width is minted as a percent of the available-to-claim entitlement (capped at 100%).
  - _Formula:_ `ANTSToken.totalSupply; fill % = min(100, minted / availableToClaim x 100)`
  - _Caveat:_ Transfers are gated, so there is no market price.

#### Chart

- **Daily active users**
  - _Def:_ Per-day distinct active accounts, stacked as Existing plus New. Active = settling buyers, depositors and settling sellers that day; New = accounts whose first-ever activity (settle or deposit) is that day. Buyers/Sellers toggle shows that role's daily count.
  - _Formula:_ `total = distinct active buyers (settle or deposit) UNION distinct active sellers per day; new = accounts with first activity day = that day`
  - _Caveat:_ Active buyers include depositors, not only settlers; the last bar is the in-flight day.
- **Total USD settled (volume + cumulative)**
  - _Def:_ Daily gross settled USDC as bars (left axis) with the running cumulative total as a line (right axis). Daily volume = sum of ChannelSettled delta per day; cumulative is the running sum across days. The last day carries a faded pace-to-date projection.
  - _Formula:_ `daily = Sum(delta) per day; cumulative = running sum; projection = daily / max(dayElapsedFraction, 0.05) - daily`
  - _Caveat:_ Gross volume (includes the 4% fee). The today bar's faded top is an extrapolation, not settled value.
- **Daily tokens**
  - _Def:_ Per-day tokens served, stacked Input plus Output, from MetadataRecorded events grouped by day. The in-flight day shows a faded pace-to-date projection on top.
  - _Formula:_ `input = Sum(input_tokens) per day, output = Sum(output_tokens) per day; projection = value / max(dayElapsedFraction, 0.05) - value`
  - _Caveat:_ Today's faded segment is a projection, not recorded tokens.
- **Daily requests**
  - _Def:_ Per-day inference request count from the request_count field of MetadataRecorded events, grouped by day. The latest (in-flight) day carries a faded pace-to-date projection.
  - _Formula:_ `Sum(request_count) per day; today projection = value / max(dayElapsedFraction, 0.05) - value`
  - _Caveat:_ Today's faded segment is a projection, not recorded requests.
- **Epoch volume (revenue)**
  - _Def:_ Per-epoch gross settled USDC, one bar per epoch from genesis to current. Each bar sums ChannelSettled delta for settles in that epoch; the live epoch adds a faded pace-to-date projection to its end. Also rendered compactly in the Epoch network metrics panel.
  - _Formula:_ `per epoch: Sum(delta) bucketed by contract epoch; live projection = value / max(epochElapsedFraction, 0.05) - value`
  - _Caveat:_ Gross (includes the 4% fee). Pre-migration epochs have revenue but no emission points.
- **Epoch usage**
  - _Def:_ Per-epoch token usage: stacked Input and Output token bars (left axis) plus a Requests line (right axis), from MetadataRecorded events bucketed by epoch. The live epoch shows faded pace-to-date projections for tokens, and a projected request count in the tooltip.
  - _Formula:_ `per epoch: Sum(input_tokens), Sum(output_tokens), Sum(request_count); live projection = value / max(epochElapsedFraction, 0.05) - value`
  - _Caveat:_ Live-epoch faded segments are projections, not recorded usage.

#### Column

- **Volume**
  - _Def:_ Daily metrics table column: gross settled USDC that day, summed from ChannelSettled delta. Same series as the volume chart bars.
  - _Formula:_ `Sum(channel_settled.delta) per day`
  - _Caveat:_ Gross, includes the 4% fee.
- **Fees**
  - _Def:_ Daily metrics table column: protocol fees collected that day, summed from the platformFee on each ChannelSettled event (the flat 4%).
  - _Formula:_ `Sum(channel_settled.platform_fee) per day`
- **Settles**
  - _Def:_ Daily metrics table column: number of ChannelSettled events that day (each a settlement paying a seller).
  - _Formula:_ `COUNT(channel_settled) per day`
- **Requests**
  - _Def:_ Daily metrics table column: inference requests served that day, from the request_count field on MetadataRecorded events.
  - _Formula:_ `Sum(metadata_recorded.request_count) per day`
- **Tokens**
  - _Def:_ Daily metrics table column: total tokens (input plus output) served that day, from MetadataRecorded events.
  - _Formula:_ `Sum(input_tokens + output_tokens) per day`
- **DAU**
  - _Def:_ Daily metrics table column: distinct active accounts that day (settling buyers, depositors and settling sellers), the same total as the Daily active users chart.
  - _Formula:_ `distinct active buyers (settle or deposit) UNION distinct active sellers per day`
  - _Caveat:_ Active buyers include depositors, not only settlers.
- **New**
  - _Def:_ Daily metrics table column: accounts whose first-ever activity (settle or deposit) landed on that day.
  - _Formula:_ `count of accounts where MIN(activity day) = that day`
  - _Caveat:_ First-seen is based on settle and deposit activity only.

#### Section

- **Latest channels**
  - _Def:_ Feed of the most recently active payment channels (a buyer-seller channel keyed by channelId). Shows Settled (max total_settled seen on the channel), Settles (count of settle events) and Age (time since last settle). Sorted by last activity.
  - _Formula:_ `per channel: settled = MAX(total_settled), settles = COUNT(*), last = MAX(timestamp); derived from channel_settled`
  - _Caveat:_ Derived from settle events only; settled is the channel's cumulative settled total.
- **Latest transactions**
  - _Def:_ Unified newest-first activity feed merging indexed events: settle, deposit/withdraw, stake/unstake, claim, DIEM stake/unstake/reward and token transfer. Each row links to BaseScan; Value is shown in its native unit (USDC or ANTS).
  - _Formula:_ `UNION of indexed event streams ordered by block_number desc`
  - _Caveat:_ Values are already human-scaled (USDC 6-dec, ANTS 18-dec); kind labels the event type, no method decoding.

### Revenue (`/revenue`)

#### KPI

- **Settled (gross)**
  - _Def:_ Total buyer-paid USDC for all settled inference on AntSeed, including the flat 4% protocol fee. Computed as the sum of the delta field across every ChannelSettled event (the per-settlement amount). This equals on-chain volume and ties to the contracts' own per-agent accumulators (sum of getAgentStats.totalVolumeUsdc) to the cent.
  - _Formula:_ `Sum(ChannelSettled.delta)`
  - _Caveat:_ Includes the 4% fee, so it is gross, not net to sellers. Some dashboards headline the net figure as volume.
- **Net to sellers**
  - _Def:_ What sellers actually keep: gross settled USDC minus the protocol's flat 4% fee. Computed as the summed ChannelSettled.delta minus the summed ChannelSettled.platformFee.
  - _Formula:_ `Sum(delta) - Sum(platformFee)`
- **Platform fees**
  - _Def:_ The protocol's take: a flat 4% of settled volume. Computed as the sum of the platformFee field recorded on every ChannelSettled event. The sub-line shows the effective take as fees divided by gross revenue, formatted as a percent.
  - _Formula:_ `Sum(ChannelSettled.platformFee); effective take = fees / gross x 100`
  - _Caveat:_ Effective take displays as a percent of gross and should sit at about 4%.
- **Avg / settle**
  - _Def:_ Average buyer-paid USDC per settlement: the mean of the ChannelSettled.delta field across all settlements, shown to 4 decimals to capture micro-payments.
  - _Formula:_ `Sum(delta) / count(settlements)`
  - _Caveat:_ These are micro-payments, hence the 4-decimal display.
- **Participants**
  - _Def:_ Count of distinct buyer addresses that have settled at least one trade, with the count of distinct seller addresses in the sub-line. Both are counts of unique addresses appearing on ChannelSettled events.
  - _Formula:_ `distinct(buyer) and distinct(seller) on ChannelSettled`
  - _Caveat:_ Counts only addresses that have actually settled, not depositors who funded escrow but never traded.

#### Panel stat

- **{settles} settles · live on-chain**
  - _Def:_ The live counter under the page title: total number of settlement events ever recorded, the row count of ChannelSettled. Each settlement is one on-chain payment to a seller.
  - _Formula:_ `count(ChannelSettled rows)`

#### Chart

- **Total settled USDC over time**
  - _Def:_ Cumulative revenue line: a running total of settled USDC, bucketed by hour and accumulated with a window sum over time. Each point is the all-time settled total as of that hour.
  - _Formula:_ `running Sum(ChannelSettled.delta) over hourly buckets`
  - _Caveat:_ Hourly granularity, accumulates gross delta (includes the 4% fee).
- **Daily settled USDC**
  - _Def:_ Daily gross revenue bars: for each calendar day, the sum of ChannelSettled.delta for settlements timestamped that day, over a continuous date series (zero-filled gaps). The current in-flight day adds a translucent pace-to-date projection bar.
  - _Formula:_ `per day: Sum(delta); projection = actual / max(elapsed_day_fraction, 0.05) - actual`
  - _Caveat:_ The faded top segment on today's bar is a projection extrapolating the partial day at its current pace (multiplier capped at 20x), not actual data.
- **Daily fees (flat 4% take)**
  - _Def:_ Daily platform-fee bars: for each day, the sum of the ChannelSettled.platformFee field, which is the protocol's flat 4% cut of that day's settled volume. Same bar chart as daily revenue but keyed on the fee field. Today's bar carries a translucent pace-to-date projection.
  - _Formula:_ `per day: Sum(ChannelSettled.platformFee)`
  - _Caveat:_ The faded top segment on today's bar is a projection of the partial day, not actual fees.

#### Column

- **Seller**
  - _Def:_ Top sellers by revenue table, identity column. Shows the seller's DHT-catalog display name when known, otherwise a shortened wallet address. Sellers are ranked by total revenue; the row links to that seller's detail page.
  - _Caveat:_ Display name comes from the off-chain provider directory (DHT catalog); off-catalog sellers show only their address.
- **Revenue**
  - _Def:_ Per-seller gross revenue in the top-sellers table: the sum of ChannelSettled.delta for that seller (gross, fee included). Grouped by seller and ordered descending.
  - _Formula:_ `per seller: Sum(ChannelSettled.delta)`
  - _Caveat:_ Gross (includes the 4% fee), same basis as the page's Settled (gross) KPI.
- **Settles**
  - _Def:_ In the top-sellers table, the count of settlement events for that seller: how many ChannelSettled events name them as seller.
  - _Formula:_ `per seller: count(ChannelSettled rows)`
- **Buyer**
  - _Def:_ Top buyers by spend table, identity column. Shows a shortened buyer wallet address. Buyers are ranked by total spend; the row links to that buyer's detail page.
  - _Caveat:_ Buyers are plain wallets with no catalog name, so only the shortened address is shown.
- **Spent**
  - _Def:_ Per-buyer total spend in the top-buyers table: the sum of ChannelSettled.delta for that buyer (gross USDC paid, fee included). Grouped by buyer and ordered descending.
  - _Formula:_ `per buyer: Sum(ChannelSettled.delta)`
  - _Caveat:_ Gross of the 4% fee, the full amount the buyer paid.
- **Settles**
  - _Def:_ In the top-buyers table, the count of settlement events for that buyer: how many ChannelSettled events name them as buyer.
  - _Formula:_ `per buyer: count(ChannelSettled rows)`

### Staking (`/staking`)


#### KPI

- **Staked out of stakable** (hero figure)
  - _Def:_ staked ÷ (staked + earned-not-staked). Staked = the token's balance of the SellerPools contract (principal of every position not withdrawn). Earned-not-staked = unclaimed seller usage rewards + unclaimed buyer usage rewards (read per account and closed epoch from AntseedUsageRewards) + staker rewards settled on positions + pool rewards earned and not yet settled.
  - _Formula:_ `balanceOf(SellerPools) / (balanceOf(SellerPools) + Σ pendingAgentReward(unclaimed) + Σ pendingBuyerReward(unclaimed) + balanceOf(SellerPoolsRewards) + Σ unsettled pool rewards)`. The controller balance is the settled-not-withdrawn staker rewards (already minted at settlement, measured 19-sep) and is tied out against `Σ pendingIndexedStakerReward`: it may exceed it by rounding dust only (1 wei per payout; tolerance 1e-6 ANTS), else the block refuses.
  - _Caveat:_ Rewards already claimed or withdrawn to a wallet are not stakable (transfers gated) and are not counted. The account universe comes from our index (usage_points_accrued) plus every live pool; the page checks that our per-epoch point sums equal the contract's `totalSellerPointsByEpoch` / `totalBuyerPointsByEpoch` and says when they do not. Per closed epoch and side, unclaimed + claimed must not exceed `usageEpochBudgets`; the difference is what the 5% per-account cap (`MAX_REWARD_SHARE_BPS`) left nobody able to earn, shown in the caption with the number of accounts whose reward equals the cap exactly. The staked figure includes the 1-ANTS seeds (pre-22 tokens), noted in the caption.
- **Burned**
  - _Def:_ balanceOf(0x…dEaD) + balanceOf(0x0). The dead balance is tied out at wei precision against Σ gate.epochBurnedAmount(e ≥ 22); the block refuses to render if they differ.
  - _Caveat:_ Burning mints to the dead address, so totalSupply includes it.
- **Positions** / **Network power** / **Staker budget**
  - _Def:_ Positions = active positions that are not the 1-ANTS seed, with their distinct stakers and pools, and the seed count beside them; total power = totalPowerWeightAtEpoch (forward epoch); staker budget = stakerEpochBudget(last complete epoch) with budget ÷ total power as the per-unit rate.
- **Average lock** / **In max lock** / **Nothing unlocks before**
  - _Def:_ Average lock = principal-weighted average TERM of the active positions (endEpoch − startEpoch, max lock counted as 104), in epochs and years at 52/yr; NOT power ÷ stake, which is epochs left and is the provider table's "Lock left". Max-lock share is principal-weighted over active positions. "Nothing unlocks before" = the earliest endEpoch among active non-max-locked positions, as the epoch's start date; caption lists principal by end epoch and the max-locked principal as never.

#### Chart

- **The rest of the supply** (two share bars: the whole supply as stakable vs not, then "Since epoch 22" zoomed into burned · reserve · team · verification · claimed to wallets · earned, not staked · staked from rewards)
  - _Def:_ Total = totalSupply + unclaimed usage rewards + unsettled pool rewards (owed, unminted; settled staker rewards are already minted). Segments: staked · earned, not staked · burned · minted since epoch 22, not in a pool (the residual: reserve, team, verification, and rewards claimed or withdrawn to wallets) · before epoch 22 (one bucket, the 110M legacy schedule minus the seeds sitting in pools). The residual is then measured a second way from our index (`token_transfer`): every mint since epochStart(22) classified by recipient (dEaD, the gate's `minters()` controllers for reserve/team/verification, the usage and staker controllers, anything else = wallet) plus every later payout from the three protocol contracts to a non-pool address; the split renders only when it equals the chain-side residual to the wei (reasons: index-behind, unmodelled-flow, no-index).
  - _Formula:_ `pre22 = totalSupply − Σ epochMinted(e ≥ 22)` must equal the legacy schedule at wei precision; `balanceOf(SellerPools)` must equal Σ principal of positions not withdrawn; `balanceOf(0x…dEaD)` must equal Σ `epochBurnedAmount`. `post22Other = Σ epochMinted − burnedDead − (balanceOf(SellerPools) − seeds) − balanceOf(SellerPoolsRewards)`, refused if negative; `post22Other == reserve + team + verification + wallets` from the index, else the split is withheld.

#### Column

- **Lock length / Staked / Share / Positions** (lock table): principal by created term: max lock · 53–104 · 27–52 · 14–26 · 5–13 · 1–4 epochs.
- **Pool / Share / Staked / Lock left / Power** (by provider; toggle "With real stake" hides the pools whose only principal is the 1-ANTS seed, on by default when any real pool exists; the line above the table carries the seed-only group as one figure from `starterOnlyPools` / `starterOnlyPowerPct` / `starterOnlyUsagePct`): staked = the pool's PRINCIPAL (the contract's own stake, `poolActiveStakeAtEpoch`, is weights with the 5% restake bonus; the note under the table gives the network-wide difference), lock left = power ÷ stake in epochs ("(max)" only when every active position in the pool is max-locked), power = poolWeightAtEpoch, share = formatShare over totalPowerWeightAtEpoch.
- **Staker / Staked / Pool / Lock / Power** (positions; toggle "Real stake" hides the seed positions, whose staker cell carries a "seed" subtitle when shown): principal, created term or "max lock", power this epoch. Search haystack carries the full address, position id and agent id.

### Rewards (`/rewards`)


#### KPI

- **Current epoch**
  - _Def:_ The active reward epoch index. AntSeed runs fixed 7-day epochs from a pinned on-chain genesis (1775728461, 9-Apr-2026). The epoch number is computed from wall-clock time, matching the contract's own time-based currentEpoch().
  - _Formula:_ `floor((now - genesis) / 604800)`
  - _Caveat:_ Time-derived, not an RPC read, but matches the contract clock exactly.
- **Emission / epoch**
  - _Def:_ Total $ANTS minted this epoch, split 65/5/15/15 across seller/buyer/reserve/team. Starts at 5,000,000 ANTS per epoch (tier 0) and halves every 104 epochs (~2y). The sub-line shows the seller and buyer slices in thousands.
  - _Formula:_ `5,000,000 >> floor(epoch / 104); seller = 65%, buyer = 5%`
  - _Caveat:_ Token transfers are gated, so there is no $ANTS market price.
- **Locked seller rewards**
  - _Def:_ Cumulative $ANTS seller rewards minted into the SellerRewardsPool but still locked. Read live on-chain from the pool's totalLockedRewards() (18 decimals). Sub-line flags whether claims are open.
  - _Formula:_ `totalLockedRewards() / 1e18`
  - _Caveat:_ Rewards stay locked until sellerClaimPolicy is set on-chain; it is currently unset.
- **$ANTS claimed**
  - _Def:_ Total $ANTS actually claimed (minted out) to date, summed from indexed emissions_claim events, with counts of distinct claims and accounts.
  - _Formula:_ `SUM(amount) over emissions_claim; COUNT(*) claims; COUNT(DISTINCT account) accounts`
- **Total locked**
  - _Def:_ Sum of all indexed LockedRewardRecorded accruals across sellers, in $ANTS, with the distinct-seller count. This is the indexed-event view of the locked pool.
  - _Formula:_ `SUM(locked_reward.amount); COUNT(DISTINCT seller)`
  - _Caveat:_ Locked total ties out exactly to the pool's on-chain totalLockedRewards().
- **Accrual records**
  - _Def:_ Count of LockedRewardRecorded events indexed, one per accrual to a seller's locked balance.
  - _Formula:_ `COUNT(*) over locked_reward`
- **Eligible to claim**
  - _Def:_ Count of sellers currently flagged eligible to claim, taking the latest eligibility row per seller (by block) from seller_eligibility and keeping those marked eligible.
  - _Formula:_ `COUNT of latest-per-seller seller_eligibility rows where eligible = true`
  - _Caveat:_ Today eligibility is effectively limited to the DIEM proxy seller; reflects the on-chain eligibility flag, not whether claims are globally open.
- **Claim status**
  - _Def:_ Whether the global seller claim policy is set on-chain. Reads sellerClaimPolicy() from the pool; 'Open' if it is a non-zero address, 'Locked' if zero.
  - _Formula:_ `sellerClaimPolicy() != 0x0 ? Open : Locked`
  - _Caveat:_ Currently Locked (policy unset), so locked seller rewards cannot be claimed yet.
- **Active stakers**
  - _Def:_ Sellers with a positive net USDC stake. Net stake per seller = sum of stake amounts minus unstake amounts from indexed stake_event rows; counts those with net > 0.
  - _Formula:_ `COUNT of sellers where SUM(stake - unstake) > 0`
- **Total staked**
  - _Def:_ Sum of net USDC stake across all active stakers (net = stake minus unstake, only sellers with net > 0).
  - _Formula:_ `SUM over active sellers of (stake - unstake)`
  - _Caveat:_ USDC-denominated seller bond, distinct from the DIEM pool stake.
- **Total slashed**
  - _Def:_ Total USDC slashed from sellers, summed from the slashed field on unstake-type stake_event rows. Sub-line counts slashing events (unstakes with slashed > 0).
  - _Formula:_ `SUM(stake_event.slashed) where type = unstake`

#### Panel stat

- **Epoch N · ends in Xd Yh · live on-chain**
  - _Def:_ Live status line: current epoch index plus seconds remaining until the epoch boundary, formatted as days/hours.
  - _Formula:_ `secondsToEpochEnd = epochEnd(currentEpoch) - now`
  - _Caveat:_ Derived from the wall-clock epoch boundary, matching the contract clock.

#### Chart

- **Points per epoch (per side)**
  - _Def:_ Per-epoch seller point totals read directly from the EmissionsV2 contract (epochTotalSellerPoints per epoch, via multicall over epoch 0 to current). Bars are solid; the live epoch adds a faded pace-to-date projection of its end-of-epoch total.
  - _Formula:_ `bar = epochTotalSellerPoints(e); projection = value / max(elapsedFraction, 0.05) - value`
  - _Caveat:_ Epochs before V2 go-live (epoch 4, ~13-May) show 0 points but had real revenue; the chart starts at epoch 0 for the full timeline.
- **Revenue per epoch**
  - _Def:_ Buyer-paid USDC for settled inference, bucketed into epochs by the contract clock. Summed from indexed channel_settled events (the delta paid to the seller on each settlement), grouped by epoch. Live epoch adds a faded pace-to-date projection.
  - _Formula:_ `SUM(channel_settled.delta) per epoch; epoch = floor((ts - genesis)/604800)`
  - _Caveat:_ Gross settled revenue including the flat 4% protocol fee; ties to the contracts' per-agent accumulators.

#### Column

- **Epoch**
  - _Def:_ Epoch index in the metrics table; the current epoch is tagged '(live)'.
- **Seller points**
  - _Def:_ Seller point total for the epoch, read from the contract (epochTotalSellerPoints). Seller points track settled USDC volume very closely (denominated in the raw on-chain USDC unit), which is why points and revenue share a shape.
  - _Formula:_ `epochTotalSellerPoints(epoch)`
- **Buyer points**
  - _Def:_ Buyer point total for the epoch, read from the contract (epochTotalBuyerPoints). Buyer points accrue 1:1 with seller points on each settled inference.
  - _Formula:_ `epochTotalBuyerPoints(epoch)`
- **Emission**
  - _Def:_ Total $ANTS minted that epoch, from the pure emission schedule (5M halving every 104 epochs).
  - _Formula:_ `5,000,000 >> floor(epoch / 104)`
  - _Caveat:_ Full-epoch emission, not yet split by points or role.
- **Revenue**
  - _Def:_ Buyer-paid USDC for settled inference in the epoch, summed from channel_settled deltas (gross, includes the 4% fee).
  - _Formula:_ `SUM(channel_settled.delta) for the epoch`
  - _Caveat:_ Gross of the flat 4% protocol fee.
- **Settles**
  - _Def:_ Number of settlement events in the epoch (count of channel_settled rows).
  - _Formula:_ `COUNT(channel_settled) for the epoch`
- **Locked $ANTS**
  - _Def:_ Per-seller locked $ANTS in the leaderboard, summed from that seller's LockedRewardRecorded accruals. Row links to the seller page.
  - _Formula:_ `SUM(locked_reward.amount) GROUP BY seller`
- **Accruals**
  - _Def:_ Number of locked-reward accrual events for that seller.
  - _Formula:_ `COUNT(*) of locked_reward rows GROUP BY seller`
- **Staked (USDC)**
  - _Def:_ Per-seller net USDC stake in the leaderboard (stake minus unstake), filtered to net > 0 and sorted descending. Agent column shows the staker's agent id.
  - _Formula:_ `SUM(stake - unstake) GROUP BY seller HAVING > 0`
- **Top sellers by points / Points**
  - _Def:_ Per-account seller point totals across all epochs, summed from indexed point-accrued deltas (role = seller). Sorted descending; links to the seller page.
  - _Formula:_ `SUM(points_accrued.points) WHERE role = seller GROUP BY account`
  - _Caveat:_ Points come from EmissionsV2 SellerPointsAccrued events; seller points track settled volume.
- **Top buyers by points / Points**
  - _Def:_ Per-account buyer point totals across all epochs, summed from indexed point-accrued deltas (role = buyer). Sorted descending; links to the buyer page.
  - _Formula:_ `SUM(points_accrued.points) WHERE role = buyer GROUP BY account`
  - _Caveat:_ Points come from EmissionsV2 BuyerPointsAccrued events, accruing 1:1 with seller points per inference.

#### Section

- **Each epoch mints N ANTS, split 65/5/15/15**
  - _Def:_ Subtitle stating the per-epoch emission (from the schedule) and the fixed split percentages across seller/buyer/reserve/team.
  - _Formula:_ `emission = 5M >> floor(epoch/104); split 65/5/15/15`

### $ANTS (`/ants`)

#### KPI

- **Minted supply**
  - _Def:_ Total $ANTS minted to date, read live on-chain as ANTSToken.totalSupply (18 decimals). The caption shows it as a percentage of MAX_SUPPLY. $ANTS is AntSeed's native token, emitted each epoch to sellers and buyers.
  - _Formula:_ `totalSupply / 1e18 ; pct = totalSupply / maxSupply * 100`
  - _Caveat:_ Distinct from 'available to claim' (full epoch entitlement) and from 'claimed'. Transfers are gated so there is no market price.
- **Market**
  - _Def:_ Whether $ANTS transfers are enabled on-chain. Reads ANTSToken.transfersEnabled(): 'Gated' (locked, no price) until the on-chain TransfersEnabled flag fires, then 'Open'.
  - _Caveat:_ Currently gated, so there is no real market price for $ANTS. We never invent one.
- **Holders**
  - _Def:_ Count of addresses with a positive $ANTS balance, derived from the indexed Transfer log: balance = sum received minus sum sent, excluding the zero address, keeping only balances above 0. Caption shows total Transfer events indexed.
  - _Formula:_ `count(addr where SUM(received) - SUM(sent) > 0, addr != zero) ; transfers = COUNT(token_transfer)`
  - _Caveat:_ Computed from indexed transfers, not a contract holder enumeration; reflects only transfers seen by the indexer.
- **Claimed / locked**
  - _Def:_ Top value is total $ANTS actually claimed (sum of EmissionsClaimed event amounts, from the emissions_claim table). Caption shows total $ANTS still locked as seller rewards (sum of locked_reward amounts).
  - _Formula:_ `claimed = SUM(emissions_claim.amount) ; locked = SUM(locked_reward.amount)`
  - _Caveat:_ Claimed is a subset of minted; locked seller rewards are minted to the pool but not yet claimable until the seller-claim policy is set on-chain.
- **Emitted to date**
  - _Def:_ Cumulative full-epoch $ANTS emission entitlement, computed off the epoch clock: summing the per-epoch emission from the V2 migration epoch (4) through the current epoch. Each epoch emits 5M $ANTS at tier 0 (halving every 104 epochs).
  - _Formula:_ `sum over e=4..currentEpoch of epochEmissionAnts(e), where epochEmissionAnts = 5,000,000 / 2^floor(e/104)`
  - _Caveat:_ This is the theoretical full-epoch entitlement (epoch count x per-epoch emission), not the actual minted supply, which is read separately on-chain.
- **$ANTS claimed**
  - _Def:_ Total $ANTS that recipients have actually pulled, summed from indexed EmissionsClaimed events (emissions_claim.amount). Caption shows the number of claim events and the count of distinct claiming accounts.
  - _Formula:_ `totalAnts = SUM(emissions_claim.amount) ; claims = COUNT(*) ; accounts = COUNT(DISTINCT account)`
  - _Caveat:_ A subset of minted supply: seller rewards are minted to the pool but stay locked until the seller-claim policy is set, so claimed is below minted.
- **Locked (seller rewards)**
  - _Def:_ Total $ANTS minted to the seller-rewards pool but still locked, summed from indexed locked_reward records. Caption shows the count of distinct sellers with locked rewards. Not yet claimable.
  - _Formula:_ `total = SUM(locked_reward.amount) ; sellers = COUNT(DISTINCT seller)`
  - _Caveat:_ Becomes claimable only once the seller-claim policy is set on-chain; today only the DIEM proxy is eligible.
- **Reward pool flows**
  - _Def:_ Total $ANTS that has flowed through the rewards pool: claimed plus locked. The sum of the $ANTS claimed KPI and the Locked seller-rewards KPI.
  - _Formula:_ `claims.totalAnts + locked.total`
  - _Caveat:_ Combines two distinct pools (already pulled vs still locked); it is not the same as minted supply.
- **Treasury USDC**
  - _Def:_ USDC currently held by the Buy & Burn treasury, read live on-chain as USDC.balanceOf(treasury). The treasury address is read on-chain from DiemStakingProxy.operatorFeeRecipient (single source of truth, not hardcoded). Caption shows the short treasury address.
  - _Formula:_ `USDC.balanceOf(operatorFeeRecipient) / 1e6 ; falls back to derived feeAccrued if the read fails`
  - _Caveat:_ If the on-chain balance read fails, it falls back to the theoretical accrued fee (throughput x fee). 10% of the DIEM pool operator fee accrues here, intended to buy back and burn $ANTS once transferable.
- **Operator fee**
  - _Def:_ The DIEM staking pool's operator fee rate, read on-chain from DiemStakingProxy.operatorFeeBps and shown as a percent. This is the slice of DIEM pool revenue routed to the Buy & Burn treasury.
  - _Formula:_ `feePct = operatorFeeBps / 100 (1000 bps = 10%)`
  - _Caveat:_ This is the DIEM pool operator fee (10%), distinct from the protocol's flat 4% inference fee.
- **$ANTS burned**
  - _Def:_ Total $ANTS sent to the zero address (burned), summed from the indexed Transfer log where the recipient is the zero address. Caption shows burn count once transfers open, otherwise notes burning starts when transfers open.
  - _Formula:_ `antsBurned = SUM(token_transfer.value where to = zero address) ; burnCount = COUNT(*)`
  - _Caveat:_ Currently zero: $ANTS has no native burn function and transfers are still gated, so no burns have happened yet.
- **Routed to treasury**
  - _Def:_ Gross DIEM pool revenue routed to date, derived from the on-chain distributed total. Reads DiemStakingProxy.totalUsdcDistributedEver (the 90% paid to stakers) and grosses it back up by the fee fraction to recover total pool throughput.
  - _Formula:_ `throughput = distributedUsdc / (1 - feeFrac), where distributedUsdc = totalUsdcDistributedEver / 1e6 and feeFrac = operatorFeeBps / 10000`
  - _Caveat:_ Derived (gross-up of the distributed amount), not a direct revenue read; assumes the 90/10 split.

#### Column

- **Holder**
  - _Def:_ Address of a top $ANTS holder in the Top holders table, linking to that address's seller page. Rows are the top 30 by balance.
  - _Caveat:_ Holders are derived from indexed Transfers, so the list reflects transfers seen by the indexer.
- **Balance ($ANTS)**
  - _Def:_ $ANTS balance of a holder in the Top holders table: total received minus total sent across all indexed Transfers, for non-zero addresses with a positive balance, sorted descending.
  - _Formula:_ `SUM(value received) - SUM(value sent) per address`
  - _Caveat:_ Derived from indexed transfers (balance = received minus sent), not a direct contract balanceOf per holder.

### DIEM (`/diem`)

#### KPI

- **Total DIEM staked**
  - _Def:_ Total $DIEM currently staked in the AntSeed provider-capacity pool, read live on-chain from DiemStakingProxy.totalStaked (18-dec). The caption shows the active staker count from stakerCount.
  - _Formula:_ `totalStaked = on-chain DiemStakingProxy.totalStaked (formatUnits 18)`
  - _Caveat:_ Live contract read, not an indexed sum. Native DIEM units; USD value depends on the on-chain price chain.
- **USDC distributed**
  - _Def:_ Lifetime USDC paid out to stakers by the pool, read on-chain from totalUsdcDistributedEver (6-dec). This is the 90% of pool revenue routed to stakers (the other 10% is the operator fee). Caption shows pool yield = distributed / staked USD value.
  - _Formula:_ `usdcDistributed = totalUsdcDistributedEver; poolYield = usdcDistributed / (totalStaked x diemPriceUsd)`
  - _Caveat:_ Pool yield is null (shows dash) when the DIEM price chain is unavailable.
- **Pool USDC APY**
  - _Def:_ Estimated annualised USDC yield for stakers. Takes the lifetime pool yield (USDC distributed divided by staked USD value) and annualises it over the pool's age since its first reward epoch. Caption shows staked USD value and DIEM price.
  - _Formula:_ `apy = poolYield x (365 / daysActive); daysActive = (now - epochStart(firstEpoch)) / 1 day`
  - _Caveat:_ Estimate. Annualises lifetime yield over pool age, so early activity skews it. Null (dash) when DIEM price is unavailable.
- **Proxy seller volume**
  - _Def:_ Total settled USDC volume the Venice.ai proxy seller (the DiemStakingProxy address) has earned, summed from indexed ChannelSettled delta events. Caption shows request count from off-chain metadata.
  - _Formula:_ `earnings = Σ channel_settled.delta WHERE seller = PROXY_ADDRESS`
  - _Caveat:_ Settled gross volume (includes the 4% protocol fee). From indexed events, not a live contract read.
- **Queued unstake**
  - _Def:_ $DIEM sitting in open (un-flushed) unstake batches, waiting to exit. Summed by reading unstakeBatches across batches from oldestUnclaimed to current and totalling the amounts where the batch is not yet flushed. Caption shows already-unstaked DIEM and the current batch number.
  - _Formula:_ `queuedUnstake = Σ unstakeBatches[b].amount WHERE not flushed, for b in [oldestUnclaimed..current]`
  - _Caveat:_ Only summed when the batch range is 50 or fewer; otherwise reads are skipped.
- **$ANTS claimed**
  - _Def:_ Total $ANTS rewards claimed by all pool stakers, summed from indexed DIEM reward events of type antsClaimed. Caption shows the number of reward payout events.
  - _Formula:_ `ants = Σ diem_reward_event.amount WHERE type = 'antsClaimed'; payouts = COUNT(*)`
  - _Caveat:_ $ANTS transfers are gated so there is no market price; this is a token quantity, not a USD figure.
- **Reward epoch**
  - _Def:_ The current finalized reward epoch number for the DIEM pool, read on-chain from finalizedRewardEpoch. Caption shows the pool's first reward epoch (firstRewardEpoch).
  - _Formula:_ `currentEpoch = DiemStakingProxy.finalizedRewardEpoch; firstEpoch = firstRewardEpoch`
- **Service offers**
  - _Def:_ Number of distinct AI service listings the Venice.ai proxy seller advertises, counted from the off-chain provider catalog (providerService rows for the proxy's agentId).
  - _Formula:_ `serviceOffers = COUNT(providerService) WHERE agentId = proxy.agentId`
  - _Caveat:_ Off-chain DHT catalog (network.antseed.com), reflecting advertised offerings, not proven per-trade usage.

#### Panel stat

- **Unstaked**
  - _Def:_ $DIEM in flushed-but-unclaimed unstake batches: amounts whose batch has been flushed (exit processed) but not yet claimed by the staker. Summed from unstakeBatches where flushed is true. Caption shows the oldest unclaimed batch number.
  - _Formula:_ `unstaked = Σ unstakeBatches[b].amount WHERE flushed, for b in [oldestUnclaimed..current]`
  - _Caveat:_ Only summed when the batch range is 50 or fewer.
- **Staked DIEM value**
  - _Def:_ USD value of all staked DIEM: total DIEM staked multiplied by the DIEM price. DIEM price is derived on-chain via Aerodrome pools (ETH to VVV to DIEM), not a CEX feed. Caption shows the per-DIEM price.
  - _Formula:_ `stakeValueUsd = totalStaked x diemPriceUsd`
  - _Caveat:_ Shows a dash when the on-chain price chain (ETH/USD plus two Aerodrome pools) is unavailable.
- **USDC reserved**
  - _Def:_ USDC currently reserved for stakers in the pool, read live on-chain from totalUsdcReservedForStakers (6-dec). This is owed to stakers but not yet distributed.
  - _Formula:_ `usdcReserved = DiemStakingProxy.totalUsdcReservedForStakers`
- **USDC claimed**
  - _Def:_ Total USDC actually withdrawn by stakers, summed from indexed DIEM reward events of type usdcPaid. Caption shows the number of payout events.
  - _Formula:_ `usdc = Σ diem_reward_event.amount WHERE type = 'usdcPaid'`
  - _Caveat:_ Differs from USDC distributed (a live contract accumulator); this is the indexed sum of claim/withdraw events.
- **Operator fee → buy&burn**
  - _Def:_ The DIEM pool's operator fee percentage (10%, read on-chain from operatorFeeBps = 1000) that routes to a treasury earmarked for buying back and burning $ANTS. Caption shows the live USDC treasury balance.
  - _Formula:_ `feePct = operatorFeeBps / 100; treasuryUsdc = balanceOf(operatorFeeRecipient)`
  - _Caveat:_ No burns have happened yet ($ANTS transfers are gated). Treasury balance falls back to a derived fee figure if balanceOf fails.
- **Seller earnings**
  - _Def:_ Same as Proxy seller volume: total settled USDC the Venice.ai proxy seller has earned, summed from indexed ChannelSettled delta events. Caption shows request count.
  - _Formula:_ `earnings = Σ channel_settled.delta WHERE seller = PROXY_ADDRESS`
  - _Caveat:_ Settled gross volume including the 4% protocol fee.
- **Seller stake**
  - _Def:_ USDC the proxy seller has staked in the AntseedStaking contract (seller-side capacity bond), summed from indexed stake_event rows (stakes minus unstakes) for the proxy address. Caption shows the agent ID.
  - _Formula:_ `sellerStakeUsdc = Σ (stake_event.amount with sign: +stake, -unstake) WHERE seller = PROXY_ADDRESS`
  - _Caveat:_ This is the seller's own AntseedStaking bond, not the DIEM pool's total staked DIEM.
- **Channels**
  - _Def:_ Count of distinct payment channels the proxy seller has settled, from COUNT(DISTINCT channel_id) over ChannelSettled events. Caption shows the distinct buyer count.
  - _Formula:_ `channels = COUNT(DISTINCT channel_id); buyers = COUNT(DISTINCT buyer) WHERE seller = PROXY_ADDRESS`
  - _Caveat:_ Counts channels that have settled at least once, not every channel ever opened.
- **Requests**
  - _Def:_ Total inference requests served by the proxy seller, summed from request_count in off-chain metadata records for its agent. Caption shows total tokens (input plus output).
  - _Formula:_ `requests = Σ metadata_recorded.request_count; tokens = Σ (input_tokens + output_tokens) WHERE agent_id = proxy.agentId`
  - _Caveat:_ From off-chain usage metadata recorded on-chain (MetadataRecorded), not a settle count.
- **Last activity**
  - _Def:_ Timestamp of the proxy seller's most recent settle event (max ChannelSettled timestamp), shown as the latest settle date/time.
  - _Formula:_ `lastActivity = MAX(channel_settled.timestamp) WHERE seller = PROXY_ADDRESS`

#### Chart

- **Account daily volume**
  - _Def:_ The proxy seller's settled USDC volume per day, from ChannelSettled deltas bucketed by calendar day (gap-filled from first settle to now). The current partial day shows a translucent pace-to-date projection on top of the solid bar.
  - _Formula:_ `per day: Σ channel_settled.delta WHERE seller = PROXY_ADDRESS; live-day proj = value/elapsedDayFraction - value`
  - _Caveat:_ Gross settled volume (includes the 4% protocol fee). The projection is an extrapolation, not realised volume.
- **Account daily tokens**
  - _Def:_ Input and output tokens the proxy seller processed per day, summed from off-chain usage metadata (MetadataRecorded) for its agent, bucketed by calendar day and gap-filled.
  - _Formula:_ `per day: input = Σ input_tokens, output = Σ output_tokens WHERE agent_id = proxy.agentId`
  - _Caveat:_ From off-chain usage metadata recorded on-chain, not directly from settled value.
- **Account epoch volume**
  - _Def:_ The proxy seller's settled USDC volume grouped by AntSeed reward epoch (7-day windows from genesis). The live (in-flight) epoch adds a translucent pace-to-date projection to its end.
  - _Formula:_ `per epoch: Σ channel_settled.delta; epoch = floor((ts - EPOCH_GENESIS)/EPOCH_DURATION); live proj = value/elapsedFraction - value (fraction floored at 0.05)`
  - _Caveat:_ Gross settled volume including the 4% fee. Projection is an extrapolation capped at 20x for nearly-empty epochs.
- **Account epoch tokens**
  - _Def:_ The proxy seller's input tokens, output tokens and request count grouped by reward epoch, from off-chain usage metadata. The live epoch adds a translucent pace-to-date projection.
  - _Formula:_ `per epoch: input/output/requests = Σ over metadata_recorded WHERE agent_id = proxy.agentId; live proj = value/elapsedFraction - value`
  - _Caveat:_ From off-chain usage metadata. Projection is an extrapolation of the in-flight epoch, not realised usage.

#### Column

- **Staker**
  - _Def:_ The staker's wallet address, links to its buyer page. Rows come from the union of distinct users in DIEM stake events and DIEM reward events.
  - _Formula:_ `DISTINCT user FROM diem_stake_event UNION diem_reward_event`
  - _Caveat:_ Top 50 by net active stake then USDC claimed.
- **Active stake**
  - _Def:_ The staker's currently active DIEM stake, read live per-staker on-chain from staked(user) (18-dec) via multicall.
  - _Formula:_ `activeStake = DiemStakingProxy.staked(user)`
  - _Caveat:_ Live contract read per staker, not the DB net-stake (which is used only to rank rows).
- **Queued unstake**
  - _Def:_ DIEM this staker has queued to unstake in the oldest unclaimed batch, read live on-chain from unstakeBatchUserAmount(oldestBatch, user) (18-dec).
  - _Formula:_ `queuedUnstake = unstakeBatchUserAmount(oldestUnclaimedBatch, user)`
  - _Caveat:_ Only the oldest unclaimed batch is read per staker, not all open batches.
- **Earned USDC**
  - _Def:_ USDC this staker can claim right now, read live on-chain from earnedUsdc(user) (6-dec).
  - _Formula:_ `earnedUsdc = DiemStakingProxy.earnedUsdc(user)`
  - _Caveat:_ Claimable balance, distinct from USDC already claimed.
- **USDC claimed**
  - _Def:_ USDC this staker has already withdrawn, summed from indexed DIEM reward events of type usdcPaid for that user.
  - _Formula:_ `usdcClaimed = Σ diem_reward_event.amount WHERE type='usdcPaid' AND user = staker`
- **$ANTS claimed**
  - _Def:_ $ANTS this staker has claimed, summed from indexed DIEM reward events of type antsClaimed for that user.
  - _Formula:_ `antsClaimed = Σ diem_reward_event.amount WHERE type='antsClaimed' AND user = staker`
  - _Caveat:_ $ANTS transfers are gated, so this is a token quantity with no market price.
- **Last activity**
  - _Def:_ Most recent timestamp across this staker's stake and reward events, shown as a relative age.
  - _Formula:_ `lastActivity = MAX(timestamp) over the staker's stake + reward events`
- **Channel**
  - _Def:_ The payment channel ID between a buyer and the proxy seller, links to the channel page. Channels are grouped from ChannelSettled events for this seller.
  - _Formula:_ `channel_id grouped from channel_settled WHERE seller = PROXY_ADDRESS`
- **Status**
  - _Def:_ Channel lifecycle status: Active (no close event recorded), Closed (a ChannelClosed event exists), or Unknown when the lifecycle streams have not been seeded yet.
  - _Formula:_ `status = !seeded ? 'unknown' : EXISTS(channel_closed for channel) ? 'closed' : 'active'`
  - _Caveat:_ Shows Unknown rather than mislabel until the Reserved/Closed lifecycle backfill writes its watermark.
- **Buyer**
  - _Def:_ The buyer (counterparty) on this channel, taken as the most recent buyer address seen in the channel's settle events.
  - _Formula:_ `buyer = (array_agg(buyer ORDER BY block_number DESC))[1]`
- **Settled**
  - _Def:_ Cumulative USDC settled on this channel, taken as the maximum total_settled seen (the channel's running settled total is monotonic).
  - _Formula:_ `settled = MAX(channel_settled.total_settled) for the channel`
  - _Caveat:_ Gross settled total including the 4% protocol fee.
- **Requests**
  - _Def:_ Total inference requests recorded on this channel, summed from request_count in off-chain usage metadata matched by channel ID.
  - _Formula:_ `requests = Σ metadata_recorded.request_count WHERE channel_id = channel`
  - _Caveat:_ From off-chain usage metadata, not settle events.
- **Updated**
  - _Def:_ Most recent settle timestamp on the channel, shown as a relative age.
  - _Formula:_ `lastActivity = MAX(channel_settled.timestamp) for the channel`
- **Txn hash**
  - _Def:_ The on-chain transaction hash for a decoded proxy-seller event in the merged transactions feed (settles, metadata, emissions, channel lifecycle), links out to the transaction.
  - _Formula:_ `tx_hash from the UNION of channel_settled / metadata_recorded / points_accrued / channel_reserved / channel_topup / channel_closed`
- **Method**
  - _Def:_ The decoded event type for the row: Channel Settled, Metadata Recorded, Seller Emission, Channel Reserved, Channel Top Up, or Channel Closed.
  - _Formula:_ `literal label per UNION branch in getSellerTransactions`
- **Value**
  - _Def:_ USD value of the transaction: the settle delta for Channel Settled, max amount for Reserved, additional amount for Top Up, settled amount for Closed, and 0 for non-monetary events (Metadata Recorded, Seller Emission).
  - _Formula:_ `value = delta | max_amount | additional_amount | settled_amount | 0 depending on method`
  - _Caveat:_ Non-monetary events (Metadata Recorded, Seller Emission) show 0.
- **Block**
  - _Def:_ The Base mainnet block number in which the event was emitted.
  - _Formula:_ `block_number from the indexed event`
- **Age**
  - _Def:_ How long ago the transaction occurred, from the event timestamp shown as a relative age.
  - _Formula:_ `timestamp from the indexed event`
- **Service**
  - _Def:_ The AI model/service name the proxy seller advertises, from the off-chain provider catalog (providerService rows for its agent).
  - _Formula:_ `model from providerService WHERE agentId = proxy.agentId`
  - _Caveat:_ Advertised offering from the off-chain DHT catalog, not proven per-trade usage (the per-purchase model is not recorded on-chain).
- **Input ($/1M)**
  - _Def:_ Advertised price per 1M input tokens for this service, from the off-chain provider catalog.
  - _Formula:_ `inputPrice from providerService`
  - _Caveat:_ Advertised DHT pricing, not a settled/realised rate.
- **Output ($/1M)**
  - _Def:_ Advertised price per 1M output tokens for this service, from the off-chain provider catalog.
  - _Formula:_ `outputPrice from providerService`
  - _Caveat:_ Advertised DHT pricing, not a settled/realised rate.
- **Tags**
  - _Def:_ Service categories/tags the proxy seller announces for this offering, from the off-chain catalog's categories field.
  - _Formula:_ `categories from providerService, split on comma`

#### Section

- **Buy & Burn: treasury accruing to buy & burn $ANTS**
  - _Def:_ Cross-link showing the live USDC treasury balance that accrues from the 10% DIEM operator fee, earmarked to buy back and burn $ANTS once the token becomes transferable. Treasury is balanceOf(operatorFeeRecipient), read on-chain.
  - _Formula:_ `treasuryUsdc = balanceOf(operatorFeeRecipient); fee routed = 10% of pool throughput`
  - _Caveat:_ No burns have happened yet; $ANTS transfers are still gated (zero-address transfers = 0).

### Distribution (`/distribution`)

#### KPI

- **Buyers (demand)**
  - _Def:_ Count of distinct buyer wallets that have settled at least one inference channel. Computed as the number of non-zero buyers in the per-buyer gross-spend distribution (concentration.count over SUM(delta) grouped by buyer in channel_settled).
  - _Formula:_ `COUNT(DISTINCT buyer) with SUM(delta) > 0 from channel_settled`
  - _Caveat:_ Counts only paying buyers (settled at least once), not depositors who funded escrow but never settled.
- **effective (buyers)**
  - _Def:_ Effective number of equal-sized buyers, the inverse of the Herfindahl-Hirschman Index of buyer spend shares. A low value means a few wallets dominate; near the raw count means spend is evenly spread.
  - _Formula:_ `effective = 1 / HHI, where HHI = Σ (share_i)^2 over each buyer's share of total gross spend`
  - _Caveat:_ Based on gross settled USDC spend per buyer, not request or token counts.
- **Gini (buyers)**
  - _Def:_ Gini coefficient of buyer gross-spend, measuring inequality across buyers. 0 = every buyer spends equally, near 1 = one buyer accounts for almost all spend.
  - _Formula:_ `G = (2 * Σ i*x_i) / (n * Σx) - (n+1)/n, over buyer spends sorted ascending (clamped at 0)`
  - _Caveat:_ Weighted by gross settled USDC spend; clamped to a minimum of 0.
- **Top 10 buyers**
  - _Def:_ Combined share of total marketplace spend held by the 10 largest buyers by gross settled USDC. Sums the share field of the top 10 buyer rows.
  - _Formula:_ `Σ (top 10 buyers' spent) / total buyer spend, where spent = SUM(delta) per buyer`
  - _Caveat:_ Share is of gross settled USDC (includes the 4% protocol fee), not net to sellers.
- **Sellers (supply)**
  - _Def:_ Count of distinct seller wallets that have earned volume from at least one settled channel. The number of non-zero sellers in the per-seller gross-volume distribution.
  - _Formula:_ `COUNT(DISTINCT seller) with SUM(delta) > 0 from channel_settled`
  - _Caveat:_ Counts sellers that settled on-chain, whether or not they are announced on the DHT catalog.
- **effective (sellers)**
  - _Def:_ Effective number of equal-sized sellers, the inverse of the Herfindahl-Hirschman Index of seller volume shares. Low means a few providers earn most volume.
  - _Formula:_ `effective = 1 / HHI, where HHI = Σ (share_i)^2 over each seller's share of total gross volume`
  - _Caveat:_ Based on gross settled USDC volume per seller.
- **Gini (sellers)**
  - _Def:_ Gini coefficient of seller gross-volume, measuring how unevenly volume is shared across sellers. 0 = perfectly even, near 1 = one seller earns nearly everything.
  - _Formula:_ `G = (2 * Σ i*x_i) / (n * Σx) - (n+1)/n, over seller volumes sorted ascending (clamped at 0)`
  - _Caveat:_ Weighted by gross settled USDC volume; clamped to a minimum of 0.
- **Top 10 sellers**
  - _Def:_ Combined share of total marketplace volume earned by the 10 largest sellers by gross settled USDC. Sums the share field of the top 10 seller rows.
  - _Formula:_ `Σ (top 10 sellers' volume) / total seller volume, where volume = SUM(delta) per seller`
  - _Caveat:_ Share is of gross settled USDC (includes the 4% protocol fee), not net to sellers.

#### Panel stat

- **Top buyer / Top 3 (ConcStrip, buyers)**
  - _Def:_ Concentration readout above the buyers table: the single largest buyer's share of total spend, and the combined share of the top 3 buyers.
  - _Formula:_ `Top buyer = largest buyer share; Top 3 = sum of the 3 largest buyer shares of total gross spend`
  - _Caveat:_ Shares are of gross settled USDC spend across all buyers; Top 3 only shows when there are 3+ buyers.
- **Top seller / Top 3 (ConcStrip, sellers)**
  - _Def:_ Concentration readout above the sellers table: the single largest seller's share of total volume, and the combined share of the top 3 sellers.
  - _Formula:_ `Top seller = largest seller share; Top 3 = sum of the 3 largest seller shares of total gross volume`
  - _Caveat:_ Shares are of gross settled USDC volume across all sellers; Top 3 only shows when there are 3+ sellers.

#### Chart

- **Lorenz curves — value share vs account share**
  - _Def:_ Two Lorenz curves (buyers in blue, sellers in lime) plotting the cumulative share of value held by the bottom X% of accounts, ordered smallest to largest. Buyers use spend, sellers use volume; the dashed diagonal is perfect equality.
  - _Formula:_ `For each side, sort accounts ascending by gross USDC; plot (bottom i/n of accounts, cumulative value / total). Sampled on a shared 0..1 grid via linear interpolation.`
  - _Caveat:_ Value = gross settled USDC (delta). The deeper a curve bows below the equality line, the more concentrated that side.
- **Market share (Supply / Demand donut)**
  - _Def:_ Donut of the marketplace split among the top 6 counterparties plus an Others remainder, toggleable between Supply (sellers by volume) and Demand (buyers by spend). Slice value is each counterparty's gross settled USDC; Others is the total minus the top 6.
  - _Formula:_ `slices = top 6 by spent; Others = max(0, total - Σ top6). share = value / total`
  - _Caveat:_ Supply slices key off sellers (volume), Demand off buyers (spend); both are gross settled USDC.

#### Column

- **Buyer**
  - _Def:_ Buyer wallet address (truncated) in the Top buyers by spend table. Row links to that buyer's detail page.
  - _Caveat:_ Buyers are plain wallets with no directory display name.
- **Spent**
  - _Def:_ Total gross USDC a buyer has paid across all settled channels: the sum of per-settlement delta in channel_settled for that buyer.
  - _Formula:_ `SUM(delta) over channel_settled WHERE buyer = address`
  - _Caveat:_ Gross includes the flat 4% protocol fee (this is buyer-paid USDC, not net to sellers).
- **Share (buyers)**
  - _Def:_ This buyer's spend as a fraction of total marketplace spend, shown as a percentage with a bar. Each buyer's gross spend divided by the sum across all buyers.
  - _Formula:_ `buyer spent / total buyer spend (Σ SUM(delta) over all buyers)`
  - _Caveat:_ Denominator is gross settled USDC across all buyers.
- **Settles (buyers)**
  - _Def:_ Number of settlement events this buyer has been part of: the count of channel_settled rows for that buyer.
  - _Formula:_ `COUNT(*) over channel_settled WHERE buyer = address`
  - _Caveat:_ Counts settlement events, not channels; a single channel can settle multiple times.
- **Seller**
  - _Def:_ Seller provider in the Top sellers by volume table, shown by directory display name if known, else a truncated address. Row links to that seller's detail page.
  - _Caveat:_ Display name comes from the off-chain provider_directory (DHT catalog); off-catalog sellers show as an address.
- **Volume**
  - _Def:_ Total gross USDC a seller has earned across all settled channels: the sum of per-settlement delta in channel_settled for that seller.
  - _Formula:_ `SUM(delta) over channel_settled WHERE seller = address`
  - _Caveat:_ Gross includes the flat 4% protocol fee; net to the seller is this minus that fee.
- **Share (sellers)**
  - _Def:_ This seller's volume as a fraction of total marketplace volume, shown as a percentage with a bar. Each seller's gross volume divided by the sum across all sellers.
  - _Formula:_ `seller volume / total seller volume (Σ SUM(delta) over all sellers)`
  - _Caveat:_ Denominator is gross settled USDC across all sellers.
- **Settles (sellers)**
  - _Def:_ Number of settlement events paying this seller: the count of channel_settled rows for that seller.
  - _Formula:_ `COUNT(*) over channel_settled WHERE seller = address`
  - _Caveat:_ Counts settlement events, not distinct channels.

#### Other

- **Bottom X% of accounts (Lorenz tooltip)**
  - _Def:_ Lorenz hover readout: for the bottom X% of accounts (by size), the share of total spend those buyers hold and the share of total volume those sellers hold.
  - _Formula:_ `x = population fraction; buyers = interpolated cumulative spend share, sellers = interpolated cumulative volume share at x`
  - _Caveat:_ X% always refers to the smallest accounts up to that point.

### Channels (`/channels` + detail)

#### KPI

- **Opened**
  - _Def:_ Count of distinct channelIds that have a ChannelReserved (channel opened/reserved) event. The broadest count: every channel ever created, including ones that never settled.
  - _Formula:_ `COUNT(DISTINCT channel_id) FROM channel_reserved`
  - _Caveat:_ Only rendered once the lifecycle backfill watermark (idx-channelClosed) exists; this is the count most dashboards headline as 'channels'.
- **Active**
  - _Def:_ Channels that were opened (ChannelReserved) but have no ChannelClosed event yet. Computed as the set difference reserved EXCEPT closed.
  - _Formula:_ `COUNT(reserved.channel_id EXCEPT closed.channel_id)`
  - _Caveat:_ Only shown when lifecycle events are seeded; before that, status degrades to unknown rather than mislabel everything Active.
- **Settled**
  - _Def:_ Count of distinct channelIds that appear in the ChannelSettled log, i.e. channels that have settled at least one inference payment to the seller.
  - _Formula:_ `COUNT(DISTINCT channel_id) FROM channel_settled`
  - _Caveat:_ A channel can be opened without ever settling, so this is always <= Opened.
- **Closed**
  - _Def:_ Lifetime count of distinct channelIds that have a ChannelClosed event.
  - _Formula:_ `COUNT(DISTINCT channel_id) FROM channel_closed`
  - _Caveat:_ Only shown when lifecycle events are seeded.
- **Settled**
  - _Def:_ Cumulative USDC settled through this channel: the max totalSettled (on-chain running total) across the fetched ChannelSettled rows.
  - _Formula:_ `MAX(totalSettled) over fetched rows`
  - _Caveat:_ Gross value including the flat 4% protocol fee; based on the most recent 200 settlement rows.
- **Platform fees**
  - _Def:_ Total protocol fees taken from this channel: the sum of the platformFee field across the channel's ChannelSettled events. The platform fee is the protocol's flat 4% take of settled volume.
  - _Formula:_ `SUM(platformFee) over fetched rows`
  - _Caveat:_ Summed over the fetched settlement rows (capped at 200).
- **Buyer**
  - _Def:_ The buyer (payer) address for this channel, taken from the most recent ChannelSettled row. Links to the buyer's page.
  - _Formula:_ `rows[0].buyer (ordered by blockNumber desc)`
- **Seller**
  - _Def:_ The seller (inference provider) address for this channel, taken from the most recent ChannelSettled row. Links to the seller's page.
  - _Formula:_ `rows[0].seller (ordered by blockNumber desc)`

#### Panel stat

- **{n} channels {opened|settled} · live on-chain**
  - _Def:_ Headline live badge above the table. When the lifecycle backfill is seeded it shows the Opened count (every channel ever created via ChannelReserved); before seeding it falls back to the Settled count (distinct channelIds in channel_settled).
  - _Formula:_ `seeded ? stats.opened : stats.settled`
  - _Caveat:_ The word switches between 'opened' and 'settled' depending on whether lifecycle events (Reserved/Closed) have been indexed yet.
- **{n} settlements · live on-chain**
  - _Def:_ Live badge on the channel detail page showing the number of settlement events for this channel (count of ChannelSettled rows fetched, up to 200).
  - _Formula:_ `rows.length (channel_settled where channelId, take 200)`
  - _Caveat:_ The fetch is capped at 200 rows; channels with more settlements would undercount here.

#### Column

- **Channel**
  - _Def:_ The on-chain channelId (a 66-char hash) identifying a unique buyer/seller payment channel, rendered as a shortened address. Row links to the channel detail page.
  - _Caveat:_ Each channelId is a distinct buyer-to-seller stream of micro-settlements.
- **Buyer**
  - _Def:_ The buyer (payer) address on the channel. Taken as the most recent buyer value across the channel's ChannelSettled rows (latest by block number).
  - _Formula:_ `(array_agg(buyer ORDER BY block_number DESC))[1]`
- **Seller**
  - _Def:_ The seller address on the channel (the inference provider being paid). Taken as the most recent seller value across the channel's ChannelSettled rows.
  - _Formula:_ `(array_agg(seller ORDER BY block_number DESC))[1]`
- **Settled**
  - _Def:_ The channel's cumulative settled USDC: the maximum totalSettled value across all its ChannelSettled events. totalSettled is the on-chain running total, so the max is the latest cumulative figure.
  - _Formula:_ `MAX(total_settled) per channel_id`
  - _Caveat:_ This is buyer-paid USDC and includes the flat 4% protocol fee (gross). Formatted with 2 decimals only when under $100.
- **Settles**
  - _Def:_ Number of settlement events for the channel: the count of ChannelSettled log rows sharing that channelId.
  - _Formula:_ `COUNT(*) per channel_id in channel_settled`
- **Last activity**
  - _Def:_ Time of the channel's most recent settlement, the max timestamp across its ChannelSettled rows. Rendered as relative time (e.g. '5m ago'). Default sort key.
  - _Formula:_ `MAX(timestamp) per channel_id`
  - _Caveat:_ Reflects last settlement only, not Reserved/TopUp/Closed events.
- **Tx**
  - _Def:_ The transaction hash of an individual settlement event, shortened. Links out to the transaction on BaseScan.
- **Amount**
  - _Def:_ The incremental USDC settled in this single settlement event: the delta field of the ChannelSettled log.
  - _Formula:_ `delta (per ChannelSettled event)`
  - _Caveat:_ Gross buyer-paid amount for this increment; the running total is the Cumulative column.
- **Cumulative**
  - _Def:_ The channel's running settled total as of this settlement event: the totalSettled field of the ChannelSettled log.
  - _Formula:_ `totalSettled (per ChannelSettled event)`
- **Block**
  - _Def:_ The Base mainnet block number in which this settlement event was emitted. Default sort key for the history table.
  - _Formula:_ `blockNumber (per event)`
- **When**
  - _Def:_ Timestamp of the settlement event, rendered as relative time (e.g. '2h ago').
  - _Formula:_ `timestamp (per event)`

#### Section

- **First seen … last activity …**
  - _Def:_ Footer line showing the channel's activity window: first seen = earliest settlement timestamp, last activity = latest settlement timestamp, across the fetched ChannelSettled rows.
  - _Formula:_ `min(timestamps) … max(timestamps)`
  - _Caveat:_ Based on the fetched settlement rows (up to 200), settlement events only.

### Transactions (`/transactions`)

#### Column

- **Tx**
  - _Def:_ The transaction hash of the on-chain event, shortened to 0x1234...abcd. The row is clickable and opens the full transaction on BaseScan.
  - _Caveat:_ One feed row equals one indexed event, so a transaction emitting several events can appear in more than one row.
- **Type**
  - _Def:_ The activity category, derived from which event table the row came from (and a sub-type flag where one table holds two kinds). Possible values: settle (channel settlement paying a seller), deposit / withdraw (buyer escrow), stake / unstake (seller staking), claim ($ANTS emission claimed), diem-stake / diem-unstake (DIEM pool), diem-reward (DIEM pool reward), transfer ($ANTS token transfer).
  - _Formula:_ `Mapped per source table; deposit_event.type splits deposit vs withdraw, stake_event.type gives stake vs unstake, diem_stake_event.type splits diem-stake vs diem-unstake`
  - _Caveat:_ Categorised by event type, not by decoding the contract method called.
- **Account**
  - _Def:_ The most relevant address for the event type, shortened for display: the buyer for settlements and deposits/withdrawals, the seller for stakes, the claimant for $ANTS claims, the user for DIEM stake and reward events, and the recipient (to) for $ANTS transfers.
  - _Formula:_ `settle/deposit/withdraw = buyer; stake/unstake = seller; claim = account; diem events = user; transfer = to`
  - _Caveat:_ Which party the address represents depends on the event type, so it is not a single consistent role across rows.
- **Value**
  - _Def:_ The event amount in its native unit, already human-scaled in the DB. USDC for settlements (the buyer-paid delta), deposits/withdrawals, and seller stakes; $ANTS for emission claims, DIEM stakes/unstakes, and $ANTS transfers. USDC under $100 shows 2 decimals, otherwise rounded; $ANTS shows up to 2 decimals.
  - _Formula:_ `settle = channel_settled.delta (USDC); deposit/withdraw/stake = amount (USDC); claim/diem/transfer = amount or value ($ANTS)`
  - _Caveat:_ Different rows use different units, so values are not directly comparable across types. Settlement value is the full buyer-paid amount including the flat 4% protocol fee; net to the seller is that minus 4%. $ANTS transfers are currently gated so there is no market price.
- **Block**
  - _Def:_ The Base mainnet block number in which the event was emitted. The default sort key for the table, newest first.
  - _Caveat:_ Sorting is by block then timestamp; within the merged window ordering is exact.
- **Age**
  - _Def:_ How long ago the event occurred, rendered relative to now from the event's block timestamp: 'just now' under 90s, then minutes, hours, or days ago.
  - _Formula:_ `now - block timestamp, bucketed: <90s just now, <90m Xm ago, <36h Xh ago, else Xd ago`
  - _Caveat:_ Relative time computed in the browser from the indexed block timestamp.

#### Section

- **Latest activity**
  - _Def:_ A unified, near-realtime feed of the most recent on-chain events across AntSeed, merged from seven indexed event tables: channel settlements, escrow deposits/withdrawals, seller stakes/unstakes, $ANTS emission claims, DIEM pool stakes/unstakes, DIEM rewards, and $ANTS token transfers. The query pulls up to 200 newest rows from each source, unions them, then sorts by block (descending) and keeps the top 100.
  - _Formula:_ `UNION ALL of 7 event tables, each pre-limited to max(limit,200), then ORDER BY block_number DESC, timestamp DESC LIMIT 100`
  - _Caveat:_ Labelled by event type, not by decoding raw call methods. Pre-limiting each source means the global ordering is exact only across the merged window, not the full history.

### Models (`/models` + detail)

#### Integrity layer (2026-08-08 — ships dark)

- **Wash-trading flag (ranking integrity)**
  - _Formula:_ `wash-risk.ts tiers over service_usage (v2) + channel_settled + deposit_event; display governed by WASH_DISPLAY_MODE`
  - _Caveat:_ **Currently admin-only** (`WASH_DISPLAY_MODE = "off"` — zero public surface). Exclusivity alone is never a verdict (aggregator front-ends look exclusive by volume); legitimacy signals dampen the burst rule. A flag is a strong signal, not a court verdict.

#### KPI

- **Models advertised**
  - _Def:_ Count of distinct AI models advertised across all AntSeed sellers. Computed as the number of unique model rows in the provider_service catalog, which is sourced from the off-chain AntSeed DHT (network.antseed.com/stats), not from on-chain usage.
  - _Formula:_ `catalog.length = distinct models in provider_service`
  - _Caveat:_ This is the advertised catalog, not proven usage. On-chain data does not record which model served any given purchase.
- **Seller offerings**
  - _Def:_ Total number of (seller x model) pairs across the catalog: the sum of seller counts over every model. One seller advertising 5 models contributes 5 offerings.
  - _Formula:_ `totalOfferings = sum over models of c.providers (distinct agent_id per model)`
  - _Caveat:_ Counts advertised seller-model pairs, not trades. Same seller can appear under many models.
- **Enriched**
  - _Def:_ How many catalog models we matched to the VeniceStats knowledge layer (bios, specs, capabilities, logos). A model is enriched if its name or normalized key resolves to a VeniceStats catalog DTO.
  - _Formula:_ `enriched = count of catalog models present in resolveMany(catalog names)`
  - _Caveat:_ Enrichment is name-matched via a normalized key; obscure or agent-named models may not match and stay un-enriched.
- **Sellers**
  - _Def:_ Number of sellers advertising this specific model, i.e. the count of provider_service rows for the model joined to the seller directory.
  - _Formula:_ `providers.length for the model`
  - _Caveat:_ Advertised offering, not sellers proven to have served this model on-chain.
- **From (input)**
  - _Def:_ Cheapest advertised input price among sellers of this model, in USD per 1M input tokens. Computed as the minimum finite input price across this model's seller rows.
  - _Formula:_ `minIn = Math.min(finite input prices), USD per 1M tokens`
  - _Caveat:_ Advertised floor across sellers, not a paid or average price. Shown with up to 4 decimals.
- **From (output)**
  - _Def:_ Cheapest advertised output price among sellers of this model, in USD per 1M output tokens. Computed as the minimum finite output price across this model's seller rows.
  - _Formula:_ `minOut = Math.min(finite output prices), USD per 1M tokens`
  - _Caveat:_ Advertised floor across sellers, not a paid or average price. Shown with up to 4 decimals.
- **Context**
  - _Def:_ Model context window (max token window) from the VeniceStats enrichment specs, displayed in thousands of tokens. The sub-label shows HuggingFace download count when available, otherwise the words token window.
  - _Formula:_ `specs.context / 1000, rounded, shown as Nk`
  - _Caveat:_ From the off-chain knowledge layer; only present for enriched models, otherwise a dash.

#### Panel stat

- **advertised by N sellers**
  - _Def:_ Live badge under the model title stating how many sellers advertise this model. Same value as the Sellers KPI: the count of provider_service rows for the model.
  - _Formula:_ `providers.length`
  - _Caveat:_ Advertised offering count, not proven usage.

#### Column

- **Model**
  - _Def:_ The model name. Shows the VeniceStats display name when enriched, otherwise the raw AntSeed model id. A secondary line shows the raw id when it differs from the display name.
  - _Formula:_ `enriched name (e.name) fallback to raw AntSeed model id (c.model)`
- **Type**
  - _Def:_ The model type/modality (e.g. text, image) taken from the VeniceStats enrichment DTO. Shows a dash when the model is not enriched.
  - _Formula:_ `e.type from enrichment, else dash`
  - _Caveat:_ Only available for enriched models.
- **Sellers**
  - _Def:_ Number of distinct AntSeed sellers advertising this model on the DHT. Counted as distinct agent_id per model in provider_service.
  - _Formula:_ `COUNT(DISTINCT agent_id) per model`
  - _Caveat:_ Advertised offering count, not a count of sellers who actually served trades with this model.
- **Input $/M**
  - _Def:_ Cheapest advertised input price across all sellers of this model, in USD per 1M input tokens. Computed as MIN(input_price) over the model's provider_service rows.
  - _Formula:_ `minInput = MIN(input_price) per model, USD per 1M tokens`
  - _Caveat:_ Advertised price floor, not a paid or average price. Rendered with 2 decimals under $100, else whole dollars.
- **Output $/M**
  - _Def:_ Cheapest advertised output price across all sellers of this model, in USD per 1M output tokens. Computed as MIN(output_price) over the model's provider_service rows.
  - _Formula:_ `minOutput = MIN(output_price) per model, USD per 1M tokens`
  - _Caveat:_ Advertised price floor, not a paid or average price.
- **Seller**
  - _Def:_ A seller advertising this model. Shows the seller's display name (from the provider directory) with a shortened on-chain address sub-line, falling back to the short address or the agent id.
  - _Formula:_ `displayName, else short address, else agent id`
  - _Caveat:_ Links to the seller page when an on-chain address is known.
- **Input $/M**
  - _Def:_ This seller's advertised input price for the model, in USD per 1M input tokens, taken directly from its provider_service row.
  - _Formula:_ `ps.input_price for this seller-model row`
  - _Caveat:_ Advertised price, not a paid or settled price.
- **Output $/M**
  - _Def:_ This seller's advertised output price for the model, in USD per 1M output tokens, taken directly from its provider_service row.
  - _Formula:_ `ps.output_price for this seller-model row`
  - _Caveat:_ Advertised price, not a paid or settled price.
- **Categories**
  - _Def:_ Service categories the seller advertises for this model offering, taken verbatim from the provider_service catalog row. Shows a dash when none.
  - _Formula:_ `ps.categories for this seller-model row`
  - _Caveat:_ Self-advertised on the DHT, not validated on-chain.
- **API**
  - _Def:_ The API protocols the seller advertises for this model offering (e.g. openai-compatible), from the provider_service protocols field. Shows a dash when none.
  - _Formula:_ `ps.protocols for this seller-model row`
  - _Caveat:_ This is the API protocol, not the model's lab or vendor.

#### Section

- **About**
  - _Def:_ Knowledge panel for the model: TLDR bullets, an auto-generated bio, capability tags, external links and cited sources. All content comes from the VeniceStats enrichment layer; the bio text is auto-generated via Venice inference.
  - _Caveat:_ Off-chain knowledge, only shown for enriched models. Bio is LLM-generated, treat as descriptive not authoritative.

### Sellers (`/sellers` + detail)

#### Rising sellers (panel on `/` and `/sellers`; columns on `/sellers`; chip on the seller detail)

- **Momentum (seller)**
  - _Def:_ `mRev = (revS/3) / max(revB/11, $3)`, `mBuy = buyersPerDayS / max(buyersPerDayB, 1)`, `momentum = sqrt(mRev × mBuy)`; windows are rolling 24h buckets ending at compute time (S = last 3, B = the 11 before). `rankScore = momentum × penalties` (×0.75 when the top buyer is above 40% of the week's revenue, ×0.5 when the seller was first seen less than 14 days ago).
  - _Formula:_ `momentum = sqrt((revS/3 ÷ max(revB/11, 3)) × (buyersPerDayS ÷ max(buyersPerDayB, 1)))`
  - _Caveat:_ Tiny bases are floored ($3/day, 1 buyer/day) so a seller going from nothing to a little does not explode. Displayed as ×N.
- **Rising sellers (eligibility gate)**
  - _Caveat:_ Excluded sellers are omitted silently; the panel never labels anyone and the gate's reasons stay internal (observatory). An empty panel is never padded.
- **7d trend** (column)
  - _Formula:_ `(revW − revP) / revP`, rolling 168h windows
- **Buyers also buying elsewhere**
  - _Def:_ `alsoElsewhereW = |{buyers of this seller in W that settled with any other seller in the 28-day lookback}| / buyersW`. The diversity signal that separates real customers from an operator's captive wallets.

#### KPI

- **Active sellers**
  - _Def:_ Count of distinct seller addresses that have settled at least one inference on-chain. One row per seller in channel_settled, regardless of whether they currently advertise on the DHT.
  - _Formula:_ `COUNT(DISTINCT seller) in channel_settled`
  - _Caveat:_ Counts sellers that have settled, not all sellers advertising capacity.
- **Total revenue**
  - _Def:_ Sum of all settled USDC across every seller. The buyer-paid USDC for settled inference, including the flat 4% protocol fee (gross).
  - _Formula:_ `Σ channel_settled.delta over all sellers`
  - _Caveat:_ Gross figure (includes the 4% protocol fee); net to sellers would subtract that fee.
- **In live catalog**
  - _Def:_ Count of indexed sellers whose provider_directory row has source = 'dht', meaning they are currently announcing capacity on the AntSeed DHT.
  - _Formula:_ `COUNT where source = 'dht'`
  - _Caveat:_ Sellers without a current DHT announcement are off-catalog and excluded here even if they still settle.
- **Distribution →**
  - _Def:_ Teaser card: the top 10 sellers' share of total settled revenue, plus the Gini coefficient and effective count of equal-sized sellers. Links to /distribution.
  - _Formula:_ `top10 = Σ(top 10 sellers' revenue) / total revenue; Gini and effective from the seller revenue distribution`
  - _Caveat:_ All concentration is over settled USDC (channel_settled.delta), not stake or capacity.
- **Revenue**
  - _Def:_ This seller's total settled USDC (gross, includes 4% protocol fee), with the subtitle showing the protocol fees portion.
  - _Formula:_ `revenue = Σ delta; fees = Σ platform_fee, both from channel_settled where seller = X`
  - _Caveat:_ Revenue is gross; the subtitle 'platform fees' is the protocol's flat 4% take, summed from the per-event platform_fee.
- **Settles**
  - _Def:_ Number of settlement events for this seller, with a subtitle for distinct channels and distinct buyers.
  - _Formula:_ `settles = COUNT(*); channels = COUNT(DISTINCT channel_id); buyers = COUNT(DISTINCT buyer), all in channel_settled where seller = X`
  - _Caveat:_ Channels and buyers counted only from channels that produced a settlement.
- **Tokens served**
  - _Def:_ Total tokens served by this seller's agent (input + output), with a subtitle for request count, all from MetadataRecorded.
  - _Formula:_ `tokens = Σ(input_tokens + output_tokens); requests = Σ request_count in metadata_recorded where agent_id = seller's agent`
  - _Caveat:_ Zero if the seller has no DHT directory / agent link. From on-chain token-count metadata, not model usage.
- **Models advertised**
  - _Def:_ Number of models this seller advertises on the AntSeed DHT, counted from its provider_service rows.
  - _Formula:_ `COUNT of provider_service rows for the seller's agentId`
  - _Caveat:_ Advertised offerings (off-chain catalog), not proven per-trade usage; per-purchase model is not on-chain.
- **Reputation**
  - _Formula:_ `provider_directory.reputation; subtitle: sybilRisk x 100 and sybilFlags (CSV of fired signals)`
  - _Caveat:_ SDK formula with our superset universe (every settled seller, live in the DHT or not; non-live sellers feed their last-known advertised catalog into the sybil signals). The score's internal ghost gate uses ghosts/(channels+ghosts); the displayed Ghost rate is ghosts/channels. Verification bonus uses the grace-aware ✓ (a proof can hold up to 48h through transient re-check failures). Sybil risk is a heuristic, not proof.
- **Ghost rate**
  - _Def:_ Share of this seller's channels served but never settled on-chain, with a subtitle giving the raw ghost count over total channel count.
  - _Formula:_ `ghost_count / channel_count (0-1, shown as %); subtitle: ghostCount of channelCount`
  - _Caveat:_ Channel counts are authoritative from getAgentStats and can exceed channels seen in settle events. Em-dash if channel_count unknown.
- **Stake**
  - _Def:_ The seller's on-chain stake in USDC, read from the directory (sourced from AntseedStaking.sellers()).
  - _Formula:_ `provider_directory.stake_usdc for the seller`
  - _Caveat:_ Read on-chain; em-dash if no directory row. Distinct from the DIEM provider-capacity pool.

#### Panel stat

- **Top buyer**
  - _Def:_ Concentration strip over the seller's buyers: the single largest buyer's share of this seller's revenue.
  - _Formula:_ `max(buyer spent) / Σ buyer spent for this seller`
  - _Caveat:_ Label renders the singular of the unit ('buyer'); share over settled USDC per buyer.
- **Top 3**
  - _Def:_ Concentration strip: combined share of this seller's revenue from its three largest buyers.
  - _Formula:_ `Σ(top 3 buyers' spent) / Σ all buyers' spent`
  - _Caveat:_ Only shown when the seller has at least 3 buyers.
- **effective of N buyers**
  - _Def:_ Concentration strip: the effective number of equal-sized buyers (1/HHI) out of the actual buyer count, for this seller's revenue distribution.
  - _Formula:_ `effective = 1 / Σ(buyer share²); count = number of buyers with positive spend`
  - _Caveat:_ Effective is well below the raw count when revenue is concentrated in a few buyers.
- **Gini**
  - _Def:_ Concentration strip: Gini coefficient of how this seller's revenue is spread across its buyers.
  - _Formula:_ `Gini over buyer spend amounts (0 = perfectly even, toward 1 = one buyer dominates)`
  - _Caveat:_ Computed over settled USDC per buyer.

#### Chart

- **Daily settled USDC**
  - _Def:_ Bar chart of this seller's settled USDC per day, over a continuous daily series from first settle to today (zero-filled gaps). The in-flight day carries a translucent pace-to-date projection.
  - _Formula:_ `per day: Σ channel_settled.delta where seller = X and day = D; projection = day-so-far / fraction of day elapsed`
  - _Caveat:_ Days with no settles render as zero. Only the revenue series is shown (fee split not rendered on this page).
- **Buyer mix**
  - _Def:_ Donut of how this seller's revenue splits across its buyers: top 6 buyers individually plus an 'Others' slice.
  - _Formula:_ `per slice: buyer spent (top 6) / total; remainder grouped as Others`
  - _Caveat:_ Top-6 + Others rollup of settled USDC; not all buyers shown individually.

#### Column

- **Seller**
  - _Def:_ Seller identity: DHT display name if known, otherwise a shortened on-chain address. Subtitle shows the short address, or 'agent N', or 'off-catalog' when not announced on the DHT.
  - _Caveat:_ Display name comes from the off-chain DHT catalog; off-catalog sellers show only their address.
- **Revenue**
  - _Def:_ Per-seller settled USDC, the buyer-paid gross including the 4% protocol fee.
  - _Formula:_ `Σ channel_settled.delta where seller = X`
  - _Caveat:_ Gross (includes 4% fee). Per-purchase model is not attributed here.
- **Settles**
  - _Def:_ Number of settlement events (ChannelSettled logs) attributed to the seller. Each settlement is a payment to the seller off a payment channel.
  - _Formula:_ `COUNT(*) in channel_settled where seller = X`
  - _Caveat:_ Counts settlement events, not unique channels or buyers.
- **Channels**
  - _Def:_ Distinct payment channels through which the seller has settled at least once.
  - _Formula:_ `COUNT(DISTINCT channel_id) in channel_settled where seller = X`
  - _Caveat:_ Only channels that produced a settlement; channels opened but never settled are not counted here (see Ghost).
- **Tokens**
  - _Def:_ Total tokens served by the seller's agent: input plus output tokens summed from MetadataRecorded logs, joined via the seller-to-agentId mapping.
  - _Formula:_ `Σ (input_tokens + output_tokens) in metadata_recorded where agent_id = seller's agent`
  - _Caveat:_ Requires a seller-to-agent link from MetadataRecorded; shows 0 if none. From on-chain token-count metadata, not the model used.
- **Models**
  - _Def:_ Count of models the seller advertises on the AntSeed DHT catalog (provider_directory.model_count).
  - _Formula:_ `provider_directory.model_count for the seller's agent`
  - _Caveat:_ Advertised offerings from the off-chain catalog, NOT proven per-trade usage; the per-purchase model is not recorded on-chain.
- **Reputation**
  - _Formula:_ `provider_directory.reputation (credited settled volume, log-scored, × gates × (1 − sybil risk) + verification bonus)`
  - _Caveat:_ SDK formula, our superset universe (every settled seller; non-live sellers feed their last-known catalog). Blank if no on-chain trust yet. Recomputed each poll.
- **Ghost**
  - _Def:_ Share of the seller's channels that were served but never settled on-chain: ghostCount divided by channelCount, both authoritative from getAgentStats.
  - _Formula:_ `ghost_count / channel_count (0-1, shown as %)`
  - _Caveat:_ Uses the contract's authoritative channel counts (getAgentStats), which can exceed the channels seen in settle events. Blank if channel_count is 0/unknown.
- **First seen**
  - _Def:_ Timestamp of the seller's first settlement on-chain.
  - _Formula:_ `MIN(timestamp) in channel_settled where seller = X`
  - _Caveat:_ First settle, not first DHT announcement or first channel open.
- **Last settle**
  - _Def:_ Time since the seller's most recent settlement, rendered as a relative age.
  - _Formula:_ `MAX(timestamp) in channel_settled where seller = X, shown as time-ago`
  - _Caveat:_ Based on settle events only.
- **Channel**
  - _Def:_ Recent settles table: the payment channel ID for each recent settlement, shortened and linking to the channel page.
  - _Formula:_ `channel_settled.channel_id for the latest settles (limit 15)`
  - _Caveat:_ Most recent settlements only.
- **Buyer**
  - _Def:_ Recent settles table: the buyer (counterparty) on each recent settlement.
  - _Formula:_ `channel_settled.buyer for the latest settles`
  - _Caveat:_ Buyers are plain wallets with no directory name.
- **Settled**
  - _Def:_ Recent settles table: the USDC amount settled in each event (the per-settle delta).
  - _Formula:_ `channel_settled.delta per event`
  - _Caveat:_ Per-event gross amount (includes its share of the 4% fee).
- **Age**
  - _Def:_ Recent settles table: time since each settlement, as a relative age.
  - _Formula:_ `now - channel_settled.timestamp`
- **Buyer**
  - _Def:_ Buyers table: each buyer this seller has settled with, linking to the buyer page.
  - _Formula:_ `DISTINCT buyer in channel_settled where seller = X`
  - _Caveat:_ Buyers are plain wallets (no directory name).
- **Spent**
  - _Def:_ Buyers table: total settled USDC this buyer paid to this seller.
  - _Formula:_ `Σ channel_settled.delta where seller = X and buyer = B`
  - _Caveat:_ Gross (includes the 4% fee).
- **Share**
  - _Def:_ Buyers table: this buyer's share of the seller's total revenue, shown as a bar plus percent.
  - _Formula:_ `buyer spent / Σ all buyers' spent for this seller`
  - _Caveat:_ Share of the seller's settled USDC across its buyer base.
- **Settles**
  - _Def:_ Buyers table: number of settlement events between this buyer and this seller.
  - _Formula:_ `COUNT(*) in channel_settled where seller = X and buyer = B`
- **Model**
  - _Def:_ Advertised models table: each model this seller lists on the DHT, enriched with a display name and org logo, linking to the model page.
  - _Formula:_ `provider_service.model rows for the seller's agentId`
  - _Caveat:_ Advertised catalog offerings, NOT the model used in any specific purchase (per-purchase model is not on-chain).
- **Categories**
  - _Def:_ Advertised models table: the model's advertised category tags (e.g. chat, coding, reasoning).
  - _Formula:_ `provider_service.categories (CSV) for the model`
  - _Caveat:_ Self-advertised on the DHT.
- **Input $/M**
  - _Def:_ Advertised models table: the seller's advertised input price in USD per 1M tokens.
  - _Formula:_ `provider_service.input_price for the model (USD per 1M tokens)`
  - _Caveat:_ Advertised pricing from the DHT catalog, not necessarily what was charged per settled trade.
- **Output $/M**
  - _Def:_ Advertised models table: the seller's advertised output price in USD per 1M tokens.
  - _Formula:_ `provider_service.output_price for the model (USD per 1M tokens)`
  - _Caveat:_ Advertised pricing from the DHT catalog.
- **API**
  - _Def:_ Advertised models table: the service-api protocols (service-keys) this model is exposed over, e.g. openai-chat-completions.
  - _Formula:_ `provider_service.protocols (CSV) for the model`
  - _Caveat:_ Advertised on the DHT.

#### Other

- **verified**
  - _Def:_ Badge shown when the seller has a DHT announcement signature on file (proof it self-announced its identity).
  - _Formula:_ `true when provider_directory.signature is present`
  - _Caveat:_ Proves self-announcement, not third-party attestation.
- **off-catalog**
  - _Def:_ Badge shown when the seller settles on-chain but is not currently announcing on the DHT (no directory row sourced from 'dht').
  - _Formula:_ `true when source != 'dht' (live = false)`
  - _Caveat:_ Reputation IS computed for off-catalog sellers (decaying via the SDK recencyGate) and their last-known advertised catalog still feeds the sybil signals; what's missing is only the live announce (current models, prices, load).

### Buyers (`/buyers` + detail)

#### KPI

- **Paying buyers**
  - _Def:_ Count of distinct buyer wallets that have settled at least one inference trade (a ChannelSettled event). This is the economic demand side: wallets that actually paid for inference, not just funded escrow.
  - _Formula:_ `COUNT(DISTINCT buyer) FROM channel_settled`
  - _Caveat:_ Excludes wallets that deposited but never settled.
- **Depositors**
  - _Def:_ Count of distinct buyer wallets that have made a deposit into escrow (AntseedDeposits, type=deposit). A superset of paying buyers, since it includes wallets that funded escrow but have not yet settled any trade.
  - _Formula:_ `COUNT(DISTINCT buyer) FROM deposit_event WHERE type = 'deposit'`
  - _Caveat:_ Superset of paying buyers (includes non-settling depositors).
- **Total spent**
  - _Def:_ Sum of all buyers' lifetime settled USDC. Computed client-side by summing the spent field across every leaderboard row, where each row's spent is the sum of ChannelSettled delta for that buyer.
  - _Formula:_ `Σ over buyers of (Σ ChannelSettled.delta per buyer)`
  - _Caveat:_ This is buyer-paid USDC including the flat 4% protocol fee (gross settled volume).
- **Avg per buyer**
  - _Def:_ Total spent divided by the number of buyers in the leaderboard (wallets with at least one settle). Average lifetime spend per paying buyer.
  - _Formula:_ `totalSpent / buyers.length`
  - _Caveat:_ Denominator is the count of leaderboard (paying) buyers, not all depositors.
- **Deposited**
  - _Def:_ Gross USDC deposited into escrow across all wallets, summing every AntseedDeposits deposit event. Escrow flows section.
  - _Formula:_ `Σ amount FROM deposit_event WHERE type = 'deposit'`
  - _Caveat:_ Gross inflow, not net (does not subtract withdrawals).
- **Withdrawn**
  - _Def:_ Gross USDC pulled back out of escrow across all wallets, summing every withdraw event (WithdrawalExecuted).
  - _Formula:_ `Σ amount FROM deposit_event WHERE type = 'withdraw'`
- **Net in escrow**
  - _Def:_ Deposited minus withdrawn: the net USDC currently committed to escrow across all buyers.
  - _Formula:_ `deposited − withdrawn`
  - _Caveat:_ An accounting net of deposit vs withdrawal events, not a live escrow balance read.
- **Distribution →**
  - _Def:_ Teaser card linking to /distribution. The headline value is the share of total settled spend held by the top 10 buyers; the subtext shows the Gini coefficient and the effective number of buyers (1/HHI).
  - _Formula:_ `top10 = Σ(top 10 buyers' spent) / Σ(all buyers' spent); effective = 1/HHI; HHI = Σ share²`
  - _Caveat:_ Concentration is over settled USDC per buyer, derived from channel_settled only.
- **Spent**
  - _Def:_ This buyer's lifetime settled USDC (sum of ChannelSettled delta), shown to 2 decimals. Subtext shows total deposited.
  - _Formula:_ `SUM(delta) FROM channel_settled WHERE buyer = address`
  - _Caveat:_ Gross buyer-paid USDC including the flat 4% protocol fee.
- **Settles**
  - _Def:_ Number of settlement events for this buyer; subtext shows distinct channels and distinct sellers.
  - _Formula:_ `COUNT(*), COUNT(DISTINCT channel_id), COUNT(DISTINCT seller) FROM channel_settled WHERE buyer = address`
- **Tokens consumed**
  - _Def:_ Total AI tokens (input plus output) this buyer consumed from MetadataRecorded events, compact form. Subtext shows total request count.
  - _Formula:_ `SUM(input_tokens + output_tokens), SUM(request_count) FROM metadata_recorded WHERE buyer = address`
  - _Caveat:_ Token counts come from on-chain MetadataRecorded; the model behind them is not recorded on-chain.
- **Sellers used**
  - _Def:_ Number of distinct sellers (providers) this buyer has paid.
  - _Formula:_ `COUNT(DISTINCT seller) FROM channel_settled WHERE buyer = address`

#### Panel stat

- **Top seller**
  - _Def:_ Concentration strip over this buyer's spend per seller: the share of the buyer's total spend going to its single largest seller.
  - _Formula:_ `topShare = largest seller's spent / Σ all sellers' spent (for this buyer)`
  - _Caveat:_ Label renders as 'Top seller' (unit singularized); concentration is over USDC spent per seller.
- **Top 3**
  - _Def:_ Concentration strip: combined share of this buyer's spend going to its three largest sellers. Shown only when the buyer uses at least 3 sellers.
  - _Formula:_ `top3Share = Σ(top 3 sellers' spent) / Σ all sellers' spent`
  - _Caveat:_ Only displayed when count >= 3 sellers.
- **effective of N sellers**
  - _Def:_ Concentration strip: the effective number of equal-sized sellers (1/HHI) versus the actual count of sellers used. A low effective relative to N means spend is concentrated.
  - _Formula:_ `effective = 1/HHI, HHI = Σ share²; N = count of sellers with spend > 0`
- **Gini**
  - _Def:_ Concentration strip: Gini coefficient of this buyer's spend across the sellers it uses. 0 = spread evenly, approaching 1 = one seller dominates.
  - _Formula:_ `G = (2·Σ i·x_i)/(n·Σx) − (n+1)/n over ascending spend per seller`
  - _Caveat:_ Clamped to a minimum of 0.

#### Chart

- **Daily settled USDC**
  - _Def:_ Time series of this buyer's settled USDC per day, from first settle to now. Each bar sums ChannelSettled delta for that calendar day; days with no settles show zero.
  - _Formula:_ `SUM(delta) per date_trunc('day', timestamp), zero-filled via generate_series`
  - _Caveat:_ Gross settled USDC including the 4% fee; UTC day buckets.
- **Seller mix**
  - _Def:_ Donut of how this buyer's total spend splits across the sellers it uses: top 6 sellers by spend plus an 'Others' slice for the remainder.
  - _Formula:_ `per-seller value = SUM(delta); Others = total − Σ(top 6); slice share = value / total`
  - _Caveat:_ Top 6 sellers explicit, the rest aggregated into Others.

#### Column

- **Buyer**
  - _Def:_ The buyer wallet address (shortened), linking to its detail page. One row per distinct buyer that has settled at least once.
  - _Caveat:_ Only buyers with at least one settle appear; pure depositors are excluded.
- **Spent**
  - _Def:_ That buyer's lifetime settled USDC: the sum of ChannelSettled delta across all of its channels. The leaderboard sorts by this descending by default.
  - _Formula:_ `SUM(delta) FROM channel_settled GROUP BY buyer`
  - _Caveat:_ Gross buyer-paid USDC including the flat 4% protocol fee.
- **Settles**
  - _Def:_ Number of settlement events for this buyer: the row count of ChannelSettled rows where buyer matches. Each settle is one on-chain payment to a seller.
  - _Formula:_ `COUNT(*) FROM channel_settled GROUP BY buyer`
- **Channels**
  - _Def:_ Number of distinct payment channels this buyer has settled through. A channel is a buyer-seller payment relationship.
  - _Formula:_ `COUNT(DISTINCT channel_id) FROM channel_settled GROUP BY buyer`
  - _Caveat:_ Counts only channels that produced a settle, not opened-but-unsettled channels.
- **Sellers**
  - _Def:_ Number of distinct sellers (providers) this buyer has paid, counting unique seller addresses in its settlements.
  - _Formula:_ `COUNT(DISTINCT seller) FROM channel_settled GROUP BY buyer`
- **Tokens**
  - _Def:_ Total AI tokens consumed by this buyer: sum of input plus output tokens from MetadataRecorded events. Rendered in compact form (k/M/B).
  - _Formula:_ `SUM(input_tokens + output_tokens) FROM metadata_recorded GROUP BY buyer`
  - _Caveat:_ Token counts come from on-chain MetadataRecorded; the per-purchase model behind them is NOT recorded on-chain (metadataHash is a keccak of token counts only).
- **Deposited**
  - _Def:_ Gross USDC this buyer has deposited into escrow, summing its AntseedDeposits deposit events. Zero if the buyer settled without a tracked deposit.
  - _Formula:_ `SUM(amount) FROM deposit_event WHERE type='deposit' GROUP BY buyer`
  - _Caveat:_ Gross deposits, not net of withdrawals.
- **First seen**
  - _Def:_ Timestamp of this buyer's earliest settlement (MIN timestamp over its ChannelSettled events).
  - _Formula:_ `MIN(timestamp) FROM channel_settled GROUP BY buyer`
  - _Caveat:_ First settle, not first deposit.
- **Last buy**
  - _Def:_ Timestamp of this buyer's most recent settlement (MAX timestamp over its ChannelSettled events), shown as time-ago.
  - _Formula:_ `MAX(timestamp) FROM channel_settled GROUP BY buyer`
- **Channel**
  - _Def:_ Recent settles table: the payment channel ID (shortened) for each of this buyer's latest settlements, linking to the channel detail page. Up to the 15 most recent.
  - _Formula:_ `channel_id FROM channel_settled WHERE buyer = address ORDER BY timestamp DESC LIMIT 15`
  - _Caveat:_ Shows the most recent settles only.
- **Seller**
  - _Def:_ Recent settles table: the counterparty seller address (shortened) paid in that settlement.
  - _Formula:_ `seller FROM channel_settled WHERE buyer = address`
- **Settled**
  - _Def:_ Recent settles table: the USDC amount paid in that single settlement (the event delta).
  - _Formula:_ `delta FROM channel_settled (per event)`
  - _Caveat:_ Gross amount including the 4% protocol fee.
- **Age**
  - _Def:_ Recent settles table: how long ago that settlement happened, from its block timestamp.
  - _Formula:_ `NOW − settlement timestamp`
- **Seller**
  - _Def:_ Sellers used table: each distinct seller this buyer paid, shown by directory display name (or short address), linking to the seller detail page.
  - _Formula:_ `GROUP BY seller FROM channel_settled WHERE buyer = address`
  - _Caveat:_ Display name comes from the off-chain provider_directory; falls back to the address.
- **Spent**
  - _Def:_ Sellers used table: total USDC this buyer paid to that seller, summing the relevant ChannelSettled deltas.
  - _Formula:_ `SUM(delta) FROM channel_settled WHERE buyer = address GROUP BY seller`
  - _Caveat:_ Gross including the 4% fee.
- **Share**
  - _Def:_ Sellers used table: this seller's portion of the buyer's total spend, shown as a bar plus percentage.
  - _Formula:_ `spent to this seller / Σ this buyer's spend across all sellers`
- **Settles**
  - _Def:_ Sellers used table: number of settlement events between this buyer and that seller.
  - _Formula:_ `COUNT(*) FROM channel_settled WHERE buyer = address GROUP BY seller`

### Status (`/status`)

#### KPI

- **Subsystems**
  - _Def:_ Count of subsystems currently healthy out of the total six. Numerator counts subsystems whose status is exactly 'ok'; denominator is the full subsystem list length.
  - _Formula:_ `(# subsystems with status === 'ok') / total subsystems`
  - _Caveat:_ A subsystem in 'warn' (degraded) is not counted as green even though it is still functioning.
- **Chain head**
  - _Def:_ Current Base mainnet block number, fetched live via Alchemy eth_blockNumber. This is the tip of the chain we measure ingestion lag against.
  - _Formula:_ `eth_blockNumber (Alchemy, Base mainnet)`
  - _Caveat:_ Shows em dash if the RPC is unreachable; in that case lag-derived statuses fall back to 'warn'.
- **Last indexed**
  - _Def:_ Highest block number we have actually ingested into our database, taken as MAX(block_number) from the channel_settled table (the latest settlement event we have stored).
  - _Formula:_ `MAX(block_number) FROM channel_settled`
  - _Caveat:_ Labelled 'latest settle block': it reflects the newest stored settlement, not necessarily every event type's frontier.
- **Max ingest lag**
  - _Def:_ Largest gap, in blocks, between the chain head and any single ingestion stream's last processed block. Subtitle converts blocks to minutes assuming Base's ~2s block time.
  - _Formula:_ `maxLag = max over streams of (head - stream.lastBlock); minutes = maxLag * 2 / 60`
  - _Caveat:_ If the RPC head is unreachable, lag is unknown and status falls back to 'warn'. Status thresholds: ok < 300 blocks, warn < 2000, down otherwise.
- **Realtime**
  - _Def:_ Health and mode of the realtime WebSocket feed, read from the realtime:heartbeat cache entry. Shows the mode (e.g. 'live') and time since the last on-chain event was received.
  - _Formula:_ `ok if mode=='live' and heartbeat < 5 min stale; down if > 30 min stale; else warn`
  - _Caveat:_ Status is driven by heartbeat freshness, not by whether events are arriving; a stale heartbeat downgrades it.

#### Panel stat

- **All systems operational / Partial degradation / Major outage**
  - _Def:_ Overall health banner. Computed as the worst status across all six subsystems (ingestion, realtime, aggregation, enrichment, database, server): down if any is down, warn if any is warn, else ok. Maps to 'All systems operational' (ok), 'Partial degradation' (warn), or 'Major outage' (down).
  - _Formula:_ `overall = worst(subsystem.status for all subsystems)`
  - _Caveat:_ 'updated' stamp is the time the page computed the summary (server time, UTC), not the last on-chain event.
- **Mode**
  - _Def:_ Realtime WebSocket operating mode from the heartbeat (e.g. 'live'). Subtitle shows heartbeat age: how long since the worker last wrote its heartbeat, in seconds.
  - _Formula:_ `staleMs = now - heartbeat.updatedAt`
- **Last event**
  - _Def:_ Time since the most recent on-chain event was received over the WebSocket (lastEventAt), with the block number of that last event shown below.
  - _Formula:_ `now - realtime.lastEventAt`
  - _Caveat:_ Quiet on-chain activity (no trades) naturally increases this even when the feed is perfectly healthy.
- **Events**
  - _Def:_ Total on-chain events the realtime worker has processed since it started, with the count of duplicate events (already-seen, deduped) shown below.
  - _Formula:_ `events and dupes counters from the realtime heartbeat`
  - _Caveat:_ Counters reset to zero on worker restart (counted since worker start).
- **Errors / reconnects**
  - _Def:_ Realtime worker error count and WebSocket reconnect count, both accumulated since the worker started.
  - _Formula:_ `errors and reconnects counters from the realtime heartbeat`
  - _Caveat:_ Counted since worker start; reset on restart. Occasional reconnects are normal WebSocket behaviour.
- **Load (1/5/15m)**
  - _Def:_ System load averages over 1, 5 and 15 minutes from node:os loadavg, with CPU core count shown below for context.
  - _Formula:_ `loadavg() -> [l1, l5, l15]; cores = cpus().length`
  - _Caveat:_ Compare load against core count: load near or above the core count indicates the host is saturated.
- **Uptime**
  - _Def:_ Host OS uptime (node:os uptime), with the app process uptime (process.uptime) shown below as 'app up'.
  - _Formula:_ `os.uptime() and process.uptime()`
  - _Caveat:_ A short 'app up' value relative to host uptime indicates a recent app restart or redeploy.
- **Database**
  - _Def:_ Total PostgreSQL database size from pg_database_size, with the channel_settled row count (settlement events stored) shown below as 'settles'.
  - _Formula:_ `pg_database_size(current_database()); settles = live rows in channel_settled`
  - _Caveat:_ Settle count uses Postgres n_live_tup (an estimate from pg_stat_user_tables), so it can be slightly approximate.
- **Daily rollup**
  - _Def:_ Most recent date present in the daily_revenue aggregation table (MAX(date)), labelled 'latest revenue day'. Confirms the daily aggregation worker is current.
  - _Formula:_ `MAX(date) FROM daily_revenue`
  - _Caveat:_ A stale date here is why the Daily aggregation subsystem flips to warn.

#### Progress

- **Disk used**
  - _Def:_ Host disk usage of the root filesystem. Bar shows percent used = 100 minus free percent (from statfs on '/'); label also shows absolute free space.
  - _Formula:_ `diskUsedPct = 100 - (bavail / blocks * 100)`
  - _Caveat:_ Bar turns hot above 88% used; the Server subsystem warns when free disk drops below 12%. Uses bavail (available to non-root), so it can differ slightly from df.
- **RAM used**
  - _Def:_ Host memory usage: used percent = (total - free) / total, from node:os totalmem and freemem, with absolute free bytes shown.
  - _Formula:_ `ramUsedPct = (totalmem - freemem) / totalmem * 100`
  - _Caveat:_ Uses OS freemem (excludes reclaimable cache), so it can read higher than 'available' memory does. Server subsystem warns above 95%.

#### Column

- **Job / Status / Failures / Last success**
  - _Def:_ Worker jobs table. Each of six background jobs (On-chain catch-up, Daily aggregation, DHT poller reputation, Model enrichment, Ingestion self-verify, SDK version check) reports from its worker:health cache entry. Status: ok if 0 consecutive failures, warn at 1 to 5, down at 6 or more. Failures = consecutiveFailures counter. Last success = time since lastSuccessMs.
  - _Formula:_ `status: ok if consecutiveFailures==0, warn if 1..5, down if >=6`
  - _Caveat:_ A job with no cache entry shows 'no data yet' and is treated as warn; a single failure already flips it to degraded.
- **Stream / Last block / Lag / Status / Updated**
  - _Def:_ Ingestion streams table. One row per ingestion watermark (ingestion_state record). Last block = the stream's last processed block; Lag = chain head minus that block (with minutes at ~2s/block); Status: ok if lag < 300 blocks, warn < 2000, down otherwise; Updated = time since the watermark row was last written.
  - _Formula:_ `lag = head - stream.lastBlock; lagMin = lag * 2 / 60`
  - _Caveat:_ If chain head is unreachable lag is em dash and status falls back to warn. Header shows the live head block, or 'unreachable'.

#### Section

- **Subsystems (On-chain ingestion / Realtime WebSocket / Daily aggregation / Model enrichment / Database / Server)**
  - _Def:_ Friendly per-subsystem cards. On-chain ingestion = worst of stream lag and the catch-up worker; Realtime = WS heartbeat status; Daily aggregation = worst of the aggregate-daily worker and whether a daily_revenue row exists; Model enrichment = worst of the enrichment worker and whether any model_enrichment rows exist; Database = always ok with size/settle detail; Server = warn if free disk < 12% or RAM used > 95%.
  - _Formula:_ `each = worst(component statuses); overall banner = worst(all subsystems)`
  - _Caveat:_ The Database card status is hardcoded ok; it does not health-check query latency, only reports size and settle count.


## FAQ

### About AntSeedStats

**What is AntSeedStats?**

An independent, third-party analytics dashboard for [AntSeed](https://antseed.com), the peer-to-peer AI-inference marketplace on Base. It turns raw on-chain activity into readable charts, tables and context — revenue, network metrics, staking, $ANTS, $DIEM, sellers, buyers, models and more.

**Are you affiliated with the AntSeed team?**

No. AntSeedStats is independent and runs separately — we build in the open and stay in touch with the AntSeed team, but are not operated by or officially affiliated with them. Built by [@gekko_eth](https://x.com/gekko_eth) and provided for informational purposes only — not financial advice.

**Where does the data come from?**

Live, from Base mainnet (events and contract state) plus public AntSeed endpoints and our own DHT poller for provider reputation. Nothing is invented — every figure traces back to a verifiable source, and you can watch the pipeline's health on the [status page](https://antseedstats.com/status).

### AntSeed, $ANTS & DIEM

**What is AntSeed?**

A peer-to-peer marketplace for AI inference on Base. Buyers pay sellers in USDC through payment channels; the protocol takes a small fee and rewards participants with its $ANTS token.

**What is $ANTS?**

AntSeed's native token, emitted each epoch to sellers and buyers. Token transfers are currently gated, so there is **no real market price yet** — we never invent one. Note that the canonical token is `0xa87EE81b2C0Bc659307ca2D9ffdC38514DD85263`; some price sites index an unrelated impostor token — ignore those.

**What is $DIEM?**

$DIEM is the Venice ecosystem's token ([`0xf4d9…a024`](https://basescan.org/token/0xf4d97f2da56e8c3098f3a8d538db630a2606a024) on Base). AntSeed runs a provider-capacity staking pool around it: stakers deposit $DIEM to back inference capacity and earn USDC from marketplace fees plus $ANTS incentives. The pool is fronted by the Venice.ai proxy seller. For a deeper explainer, see [VeniceStats' “What is DIEM”](https://venicestats.com/what-is-diem).

**What is the “Buy & Burn”?**

A share of the DIEM pool's operator fee accrues to a treasury, intended to buy back and burn $ANTS once the token becomes transferable. We read the treasury balance live on-chain and show it on the $ANTS page; no burns have happened yet.

### Staking & points

**What are “points”?**

Points are the accounting unit of AntSeed's reward model. Each settled inference accrues points to the seller and the buyer of that trade. Each epoch emits a fixed amount of $ANTS (split between sellers, buyers, a reserve and the team), and **your share of that epoch's emission equals your share of the points**. In practice the seller points track settled volume very closely (they are denominated in the raw on-chain USDC unit), which is why the points and revenue charts have the same shape.

**Why don't you show estimated $ANTS rewards per seller?**

The points→$ANTS formula is proven in structure but one scale factor isn't fully confirmed yet against real claims. Rather than publish a number we're not certain of, we show the raw points and will add estimated $ANTS once it's validated.

### The numbers

**Why might your figures differ from other dashboards?**

Different dashboards use different methodologies, so totals can diverge. Our approach is to reconcile everything against on-chain truth and be explicit about how each metric is computed — for example, settled revenue and volume tie to the contracts' own per-agent accumulators. When in doubt, the on-chain source wins, and we show our working.

**What does “settled (gross)” vs “net to sellers” mean?**

Settled (gross) is the full buyer-paid amount, including the flat 4% protocol fee. Net to sellers is gross minus that fee. Some dashboards headline the net figure as “volume”; we label both so it's unambiguous.

**How fresh is the data?**

Near-realtime: a WebSocket feed picks up new events as they land, backed by a catch-up worker and self-verifying ingestion. Current chain head, last indexed block and lag are on the [status page](https://antseedstats.com/status).

### Reading the site

**How are “Rising sellers” chosen?**

The Rising sellers panel (home and [/sellers](https://antseedstats.com/sellers)) shows sellers that are growing right now in *both* revenue and distinct buyers. We compute a momentum score every hour from on-chain settlements: dollars per day and buyers per day over the last 3 days, each divided by the same figure over the 11 days before, combined as a geometric mean, so a seller only rises if both grow. A 7-day check filters out a spike on top of a collapsing week.

Only sellers that pass our legitimacy gate are eligible: not in a wash-trading cluster we have documented (confirmed or high-probability), not on our farm-shaped watchlist, no sybil flags from the AntSeed SDK, at least 5 distinct buyers and $20 settled this week, active on at least 4 of the last 7 days, no captive top buyer, and at least half of the week's buyers also buying from other sellers. A top buyer above 60% of the week's revenue only disqualifies when that buyer is itself captive (settled with fewer than 5 sellers in the last 28 days): that is the single-wallet pattern the rule exists for, and a loyal customer who buys from many sellers is not it. Soft adjustments reorder without excluding: a top buyer above 40% damps the rank by a quarter, a diversified top buyer above 60% by 40%, and a seller first seen less than 14 days ago by half. “Steady” cards are the largest eligible sellers with a persistent base (active on 20+ of the last 28 days; 10+ buyers this week, or 5+ when that tier runs out), never a rising seller. There is always at least one when one exists, and when fewer than three sellers are clearly rising the panel fills with Steady cards up to three, so it never looks empty and never pads with a seller that failed the gate; with nothing eligible the section disappears. A seller that made the list stays on it until its score drops below 1.05, not 1.2, so a seller hovering around the cut does not flicker in and out every hour.

Sellers that fail the gate are simply not shown; the panel never labels anyone. The method behind the wash-trading exclusions is documented on the [observatory](https://antseedstats.com/observatory).

**What is the Network explorer?**

The [Network page](https://antseedstats.com/network) lists every service advertised on the AntSeed DHT — one row per peer × model — with prices per million tokens, reputation, verification, stake and usage. Filter by lab, capability, provider or the green **FREE** chip (services priced $0 for both input and output). Peers marked “new” announce on the DHT but have not settled on-chain yet.

**What are Labs?**

The organizations behind the models — Anthropic, OpenAI, DeepSeek, Google and friends. The [Labs page](https://antseedstats.com/labs) groups every advertised model under its lab, and typing a lab's name in any search box (or in the Network filters) narrows results to that lab's models.

**How do I read the Distribution page?**

[Distribution](https://antseedstats.com/distribution) measures how concentrated each side of the marketplace is. The Lorenz curve plots the cumulative value share held by the bottom X% of accounts (the further it bows below the diagonal, the more concentrated). **Gini** summarizes that gap (0 = perfectly even, 1 = one account takes everything); **effective** is the equivalent number of equal-sized participants; top-10 share is the most intuitive headline.

**What is “Cached $/M”?**

Some sellers price cached input tokens (prompt prefixes the model has already processed) cheaper than fresh input. The Cached $/M column shows that advertised price; when a seller does not announce one, cached input simply costs the same as regular input.

**Why can't usage be split per model?**

The on-chain metadata records token counts but not which model served each request, so Tokens and Users on the [Network page](https://antseedstats.com/network) are provider-level totals shown on every one of that provider's rows. The AntSeed team is working on richer on-chain usage reporting; once it lands we can show true per-model usage.

**What are the translucent chart bars?**

Pace-to-date projections. The current day (or epoch) is still in progress, so its solid bar shows what has actually happened and the translucent extension projects the final value by scaling the so-far amount by the fraction of the period elapsed. Projections are estimates, never recorded data.

### Misc

**Is there an API?**

Yes. A read-only JSON API with no key lives under `/api/v1`: network totals and daily series, sellers and their daily settled volume, models and prices, epochs and the $ANTS supply. Every response says which block it is from. AI clients (Claude, Cursor, VS Code) can use the same data through our MCP server at `antseedstats.com/mcp`. See [Developers](https://antseedstats.com/developers) for the endpoints, a curl per endpoint, the OpenAPI file and the MCP setup.

**Is the site built for AI agents?**

Yes, on purpose. [/llms.txt](https://antseedstats.com/llms.txt) is the front door (what the site is, the key concepts, every machine-readable link) and [/llms-full.txt](https://antseedstats.com/llms-full.txt) carries the whole backstage in one file: the API reference, the MCP tools, every definition behind the ⓘ tips, this FAQ. Every page links to its JSON twin in the head and in a Link header, and the data is free to use under CC BY 4.0 with attribution to AntSeedStats. The [For agents](https://antseedstats.com/for-agents) page explains the pattern.

**I found a bug, or want a feature?**

Reach out to [@gekko_eth](https://x.com/gekko_eth) — feedback is welcome.

## Changelog (last 5)

Full list: https://antseedstats.com/changelog

### 2.9.0 (2026-10-08): The API answers questions, not just lookups

- Search as an endpoint (/api/v1/search?q=): a seller's name, a model in any spelling (Kimi K3, kimi_k3 and moonshotai/kimi-k3 all land on kimi-k3), a lab, a 0x address or a 0x hash come back as typed matches with the page that shows them and the endpoint that returns them as data. The site's search box now runs on the same engine.
- Intent filters on where-to-buy (/models/{id}) and on every listing (/prices): trusted, verified, organic, live, min_reputation, max_input_usd_per_m, max_output_usd_per_m and a sort. Each seller now says whether it is proven on-chain, trusted (the calculator's rule: settled and scoring 60 or more) and live. Sellers of a model come trusted first, then cheapest, as the docs promised.
- The calculator as an endpoint (/estimate): a model and a monthly token mix in, the list price, the cheapest seller, the trusted pick and the saving out, with the same math as the page.
- Every definition behind the site's info dots as data (/glossary), the changelog as data (/changelog), and every API answer now carries meta.docs: its section on Developers, the page that shows the same figures and the definitions behind them. The API root and network/summary say when the current epoch ends (next_epoch_ts).

### 2.8.0 (2026-10-08): The front door for agents

- llms.txt is the site's front door for AI agents: what AntSeedStats is, the key concepts (settled vs served, organic, epochs, why $ANTS has no price), and every machine-readable link. llms-full.txt carries the whole backstage in one file: the API reference, the MCP tools, the definitions behind every ⓘ tip, the glossary, the FAQ and the changelog, all generated from the same sources as the pages.
- Every page with a data twin now links to it in the head (rel=alternate, application/json) and in a Link header, and every API answer links back to the page that shows the same figures. The API root is a map of every door: docs, OpenAPI, llms, MCP, licence.
- robots.txt opens the public API and the llms files to every crawler and welcomes the AI crawlers by name; the internal routes and the back office stay closed.
- The data is licensed CC BY 4.0, attribution to AntSeedStats (antseedstats.com): stated in llms.txt, the API root, the OpenAPI file and the new For agents page, which explains the five things an agent needs from a site and what this site does for each.
- schema.org on the machine-facing pages: a FAQPage on the FAQ and a Dataset per endpoint on Developers. The FAQ gained an answer on the agent side of the site.
- Fixed: every page declared the home page as its canonical URL, so search engines could fold /sellers, /models and the rest into one. Each page now names itself.

### 2.7.0 (2026-10-08): MCP server for AI clients

- AI clients can now read AntSeedStats directly: an MCP server at antseedstats.com/mcp, no key, turns every public API endpoint into a tool. One line connects Claude Code; Claude Desktop, Cursor and VS Code snippets are on the Developers page, and the same server runs locally from npm as @antseedstats/mcp-server (open source, MIT).
- Every tool answer names the page on this site it comes from, the Base block it is as of, and whether each figure is a chain fact, a seller's own claim or our judgement, so the model can cite it.
- The tools are generated from the same catalogue as the API and this page, so they cannot drift from the endpoints.

### 2.6.0 (2026-10-07): Public API v1 and the Developers page

- A read-only JSON API with no key, under /api/v1: network totals and daily series, the last 24h leaders, every seller with lifetime and 7-day figures, a seller's daily settled volume (the cross-check a seller wants next to its own ledger), what a seller advertises and sold, the model catalogue with prices and usage, where to buy one model, every price listing with its saving against the list price, epochs with points and burns, and the $ANTS supply.
- Every response says which block it is from (as_of_block) and labels each figure as a chain fact, announced data or our own judgement. Money comes as exact micro-USDC plus a formatted string; the two daily series also export CSV.
- CORS is open, responses carry cache headers and an ETag, and each IP has 60 requests per minute. An OpenAPI 3.1 file describes everything at /api/v1/openapi.json.
- The new Developers page (in the footer) lists every endpoint with a curl to copy, a Try it box and the response fields, generated from the same catalogue as the API itself.

### 2.5.22 (2026-10-06): Sellers by this week's revenue

- The seller leaderboard opens sorted by Revenue 7d, what each seller settled in the last 7 days, so the sellers selling now come first. Revenue total, the lifetime figure, is the next column and sorts with one tap.
- The small charts on the Rising sellers cards end in a round dot again; stretched to the card's width, it had turned into an oval.

## Data policy

Licence CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). Attribute figures to AntSeedStats (antseedstats.com) and cite the page the figure comes from. We publish no personal data: usage is counted per endpoint and client family, never per IP or raw user agent. Rate limit 60 requests per minute per IP on the API and the MCP server. How the site is built for agents: https://antseedstats.com/for-agents
