CRIUS Docs
API status Get API key
Concepts

Holder classes on Robinhood Chain: infrastructure, bots, snipers, whales and smart accounts

How the Crius API tells real holders from pools, the PoolManager, lockers and contracts, and how it tags devs, snipers, whales and smart accounts.

Updated 3 min read

Not every address that holds a token is a holder. On a typical Robinhood Chain token most of the supply sits in Uniswap v4’s PoolManager, an LP locker and a burn address, and many active “wallets” are router or bot contracts. Crius classifies every address into infrastructure (contracts that hold tokens on behalf of a market or nobody) and holders (people, including smart accounts), then adds tags such as dev, sniper and whale to holders. Concentration stats count holders only, so top10_pct describes who really owns the supply.

Who holds a token

CHARGE's top five real holders, infrastructure left out

Who are the largest holders of Charge AI (0x7b8892cea949bc60d494681d1bc3ea96071ab0b8), and which of them are real holders?

GET/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/holders?limit=5&exclude=infra
curl "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/holders?limit=5&exclude=infra" \
-H "x-api-key: $CRIUS_API_KEY"
Real response 200 Captured Oct 28, 2026 · 67 lines (arrays trimmed)
{
"data": {
"balances": "verified_onchain",
"count": 178,
"distribution": {
"top10_pct": 13.436
},
"history": "complete",
"holders": [
{
"address": "0x1860e8b874ed7742ae5459af731687ecb576c9fd",
"balance": 28729479.389247917189540117,
"label": null,
"pct": 2.87295,
"rank": 1,
"value_eth": 0.0474081,
"value_usd": 111.806
},
{
"address": "0x346f5777f5652bd561dcd830e638bc40d3e1cf3d",
"balance": 25566954.227971953484331514,
"label": null,
"pct": 2.5567,
"rank": 2,
"value_eth": 0.0421894,
"value_usd": 99.4981
},
{
"address": "0xa975e46d6552fb0ef85f7e9f7b640a058dc368bd",
"balance": 23260835.335709034922247096,
"label": null,
"pct": 2.32608,
"rank": 3,
"value_eth": 0.038384,
"value_usd": 90.5235
},
{
"address": "0xf4e322c50010e00878b8d6bbb2c495d90097e58f",
"balance": 19090692.939108585371870819,
"label": null,
"pct": 1.90907,
"rank": 4,
"value_eth": 0.0315026,
"value_usd": 74.2947
},
{
"address": "0x8e6be350c1276d3276cead49859aa435d77ac9eb",
"balance": 12214695.452807030766083489,
"label": null,
"pct": 1.22147,
"rank": 5,
"value_eth": 0.0201561,
"value_usd": 47.5356
}
],
"ledger_reliable": true
},
"meta": {
"block": 100436633,
"block_age_ms": 414,
"block_ts": 1793228150000,
"chain": "robinhood",
"finalized_block": 100427397,
"lag_ms": 17,
"safe_block": 100431079
}
}

What this tells you

  • With exclude=infra, the Uniswap v4 PoolManager, the Pons launch locker and the burn address are left out, so the list starts with real holders.
  • Ranks 1 and 2 (0x1860e8b874ed7742ae5459af731687ecb576c9fd at pct: 2.87295, 0x346f5777f5652bd561dcd830e638bc40d3e1cf3d at pct: 2.5567) and the three after them all have label: null: ordinary wallets.
  • distribution.top10_pct: 13.436 counts holders only, across count: 178 holders.

Without exclude=infra, the live list keeps infrastructure rows with their label, so you can draw them differently. The holder snapshot gives both shares: for CHARGE at block 94616288, top10_incl_infra_pct is 88.256 and top10_ex_infra_pct is 20.2394.

The classes

Infrastructure never counts as a holder. These tags are left out of concentration stats and the bubble map:

TagWhat it is
poolA Uniswap v2 pair, a v3 pool, or the v4 PoolManager that holds every v4 pool's tokens
lp_lockerAn LP locker or vesting contract (the Pons launch locker, UNCX, Team Finance and others)
burn0x0000000000000000000000000000000000000000, 0x000000000000000000000000000000000000dead and any address with 17 or more zero bytes out of 20, such as 0xdead000000000000000000000000000000000000
launchpadA launchpad's contracts, including its v4 hook (the Pons hook is pons_v2_meme_hook)
hookAny other Uniswap v4 hook: hooks hold the fees and taxes they take from swaps
routerRouters and aggregators
protocol_feeProtocol fee receivers
contractAny other program contract (a bot, vault or game): a deployed contract with more than 300 bytes of code
exchange, cex, bridgeLabeled exchange and bridge wallets

Holder tags describe a real holder in the context of one token:

TagMeaning
devThe token's launch creator or its verified deployer
sniperBought within the first 10 blocks after the token's first trade
whaleHolds 1% or more of total supply and is not infrastructure
smart_accountAn EIP-7702 account: an ordinary wallet whose code delegates to a contract. Always a holder, never infrastructure
App id, e.g. fomoA smart account whose delegate contract belongs to a known app

The difference between a contract and a smart account matters. An EIP-7702 account’s code is only a 23-byte pointer to its delegate, and Safe or ERC-4337 account proxies are under 200 bytes, so they stay wallets. A trading bot’s own contract is far larger and is tagged contract. Trade-level tags (bundler, fresh, insider, bot) are explained on the attribution page.

A bubble map with the infrastructure moved aside

Who are the real top holders of sockets (0xddccd4690cc99cf19d2e0bdbcb390d17e913958a), and are they linked?

GET/v1/robinhood/token/0xddccd4690cc99cf19d2e0bdbcb390d17e913958a/bubblemap?top=50
curl "https://api.crius.sh/v1/robinhood/token/0xddccd4690cc99cf19d2e0bdbcb390d17e913958a/bubblemap?top=50" \
-H "x-api-key: $CRIUS_API_KEY"
Real response 200 Captured Oct 28, 2026 · 138 lines (arrays trimmed)
{
"data": {
"block": null,
"clusters": [],
"edges": [],
"hidden_infra": [
{
"address": "0x8366a39cc670b4001a1121b8f6a443a643e40951",
"label": "uniswap_v4_pool_manager",
"pct": 22.2145,
"tags": [
"pool"
]
},
{
"address": "0x267444d099b10fb5ed7c3cc7b7c767adca574952",
"label": "pons_v2_launch_locker",
"pct": 8.16327,
"tags": [
"lp_locker"
]
},
{
"address": "0xe5e702641ea86f4ae6cc3cdaed2b886f976be044",
"label": "pons_v2_meme_hook",
"pct": 6.06241,
"tags": [
"launchpad"
]
},
{
"address": "0xbe0b139abc90723af76a89d3051f60ba1b64c8d9",
"label": null,
"pct": 1,
"tags": [
"contract"
]
},
{
"address": "0xdead000000000000000000000000000000000000",
"label": null,
"pct": 0.81637,
"tags": [
"burn"
]
},
{
"address": "0x0afeb98a5b40bc38e9cf5a3f202c17843a7ce553",
"label": null,
"pct": 0.168848,
"tags": [
"contract"
]
}
],
"nodes": [
{
"cluster": null,
"id": "0xe1a5961d61200006577f2e96114d212889213cd6",
"label": null,
"pct": 2.82829,
"tags": [
"smart_account",
"whale"
],
"value_usd": 1286.54
},
{
"cluster": null,
"id": "0xa4109b8d391723d8f6bcfc5d75e6996f61062f76",
"label": null,
"pct": 2.70423,
"tags": [
"smart_account",
"fomo",
"whale"
],
"value_usd": 1230.11
},
{
"cluster": null,
"id": "0xf2caeb616fb22a8acc00afbaeee83b24f18b354b",
"label": null,
"pct": 2.23269,
"tags": [
"smart_account",
"fomo",
"whale"
],
"value_usd": 1015.61
},
{
"cluster": null,
"id": "0xb9b642020e216e84887ad414e067928e380bbbd5",
"label": null,
"pct": 1.77186,
"tags": [
"whale"
],
"value_usd": 805.992
},
{
"cluster": null,
"id": "0xc9cafef2258a07f8455da92438360318b34848e2",
"label": null,
"pct": 1.73578,
"tags": [
"smart_account",
"fomo",
"whale"
],
"value_usd": 789.58
},
{
"cluster": null,
"id": "0xc51c3340b898a67fed7c9f18db75b346dd04f8a0",
"label": null,
"pct": 1.63331,
"tags": [
"smart_account",
"fomo",
"whale"
],
"value_usd": 742.968
}
],
"token": "0xddccd4690cc99cf19d2e0bdbcb390d17e913958a"
},
"meta": {
"block": 100406890,
"block_age_ms": 885,
"block_ts": 1793225087000,
"chain": "robinhood",
"finalized_block": 100397649,
"lag_ms": 30,
"safe_block": 100401329
}
}

What this tells you

  • hidden_infra holds what isn’t a holder: the PoolManager (pct: 22.2145, tag pool), the Pons launch locker (pct: 8.16327, lp_locker), the Pons hook 0xe5e702641ea86f4ae6cc3cdaed2b886f976be044 (pct: 6.06241, launchpad), two program contracts (contract) and the burn address 0xdead000000000000000000000000000000000000 (pct: 0.81637, burn).
  • The first node, 0xe1a5961d61200006577f2e96114d212889213cd6, holds pct: 2.82829 and is tagged smart_account and whale.
  • Four of the six nodes shown also carry fomo: smart accounts created by that app, for example 0xa4109b8d391723d8f6bcfc5d75e6996f61062f76 at pct: 2.70423.
  • clusters: [] and edges: []: no funding or transfer links among these holders.

Where the classes apply

  • /holders lists every address with its label; exclude=infra drops infrastructure rows, and distribution.top10_pct counts holders only either way.
  • /holders/snapshot puts tags on each row and returns both top10_ex_infra_pct and top10_incl_infra_pct. exclude=infra drops infrastructure rows.
  • /holders/cohort and /holders/history take exclude=infra too, so cohorts and holder counts aren’t padded by pools and lockers.
  • /traders filters on tags: tag=smart_account for smart accounts only, exclude=dev,sniper,exchange for outside traders. Program contracts are left out unless you pass include_contracts=true, and exclude=bots drops wallets labeled as bots.
  • /bubblemap moves infrastructure to hidden_infra; include=infra brings it back.
  • /security and /bundles use the same 10-block sniper window for sniper_supply_pct.

Use it in your app

  1. Never rank infrastructure. Show pools, lockers and burn addresses in a separate group, or drop them with exclude=infra where the endpoint takes it.

  2. Read tags, not labels. label is a name for display (uniswap_v4_pool_manager, pons_v2_launch_locker); tags are the stable classes you filter on.

  3. Flag the dev and the snipers. A dev or sniper among the top holders is the first thing a trader wants to know.

import requests
# Top traders of a token, without the dev, snipers and exchanges (Free plan key).
r = requests.get(
"https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/traders",
params={"sort": "pnl", "window": "all", "exclude": "dev,sniper,exchange", "limit": 20},
headers={"x-api-key": API_KEY},
)
for t in r.json()["data"]:
print(t["rank"], t["address"], t["pnl_usd"], ",".join(t["tags"]) or "-")

Frequently asked questions

Why is the Uniswap PoolManager the biggest holder of my token?

All Uniswap v4 pools live inside one contract, the PoolManager (0x8366a39cc670b4001a1121b8f6a443a643e40951 on Robinhood Chain), so the tokens in every v4 pool of your token sit at that address. Crius labels it uniswap_v4_pool_manager, tags it pool and leaves it out of top10_pct and other concentration stats.

What is a smart account on Robinhood Chain?

A wallet whose code delegates to a contract under EIP-7702. It is still a user's wallet, so Crius counts it as a holder and tags it smart_account; the wallet profile shows account_type: "smart_account" and the delegate contract. When the delegate belongs to a known app, the app's id is added as a tag (for example fomo).

How does Crius decide a wallet is a sniper?

A wallet is tagged sniper on a token when it bought within the first 10 blocks after the token's first trade. On Robinhood Chain 10 blocks is about one second. The bundles endpoint lets you change the window with window_blocks.

Is the whale tag based on USD value?

No. whale means the address holds 1% or more of the token's total supply and is not infrastructure: a pool, locker, hook or burn address holding 1% is never a whale.

Are exchange wallets counted as holders?

No. Exchange and bridge wallets are treated as infrastructure. One exchange deposit wallet holds many customers' tokens, and linking wallets through it would join unrelated people into one cluster.

Get your free Crius API key

Every example on this page works with a free key: higher rate limits than the anonymous plan, holders, wallets and the WebSocket stream. No card needed.

  • Robinhood Chain (4663) only, from our own archive nodes
  • REST + WebSocket
  • Pay on-chain or by card