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.
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?
curl "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/holders?limit=5&exclude=infra" \ -H "x-api-key: $CRIUS_API_KEY"const res = await fetch("https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/holders?limit=5&exclude=infra", { headers: { "x-api-key": process.env.CRIUS_API_KEY },});const { data, meta } = await res.json();import os, requests
r = requests.get( "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/holders?limit=5&exclude=infra", headers={"x-api-key": os.environ["CRIUS_API_KEY"]},)body = r.json()print(body["data"])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 (
0x1860e8b874ed7742ae5459af731687ecb576c9fdatpct: 2.87295,0x346f5777f5652bd561dcd830e638bc40d3e1cf3datpct: 2.5567) and the three after them all havelabel: null: ordinary wallets. distribution.top10_pct: 13.436counts holders only, acrosscount: 178holders.
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:
| Tag | What it is |
|---|---|
pool | A Uniswap v2 pair, a v3 pool, or the v4 PoolManager that holds every v4 pool's tokens |
lp_locker | An LP locker or vesting contract (the Pons launch locker, UNCX, Team Finance and others) |
burn | 0x0000000000000000000000000000000000000000, 0x000000000000000000000000000000000000dead and any address with 17 or more zero bytes out of 20, such as 0xdead000000000000000000000000000000000000 |
launchpad | A launchpad's contracts, including its v4 hook (the Pons hook is pons_v2_meme_hook) |
hook | Any other Uniswap v4 hook: hooks hold the fees and taxes they take from swaps |
router | Routers and aggregators |
protocol_fee | Protocol fee receivers |
contract | Any other program contract (a bot, vault or game): a deployed contract with more than 300 bytes of code |
exchange, cex, bridge | Labeled exchange and bridge wallets |
Holder tags describe a real holder in the context of one token:
| Tag | Meaning |
|---|---|
dev | The token's launch creator or its verified deployer |
sniper | Bought within the first 10 blocks after the token's first trade |
whale | Holds 1% or more of total supply and is not infrastructure |
smart_account | An EIP-7702 account: an ordinary wallet whose code delegates to a contract. Always a holder, never infrastructure |
App id, e.g. fomo | A 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?
curl "https://api.crius.sh/v1/robinhood/token/0xddccd4690cc99cf19d2e0bdbcb390d17e913958a/bubblemap?top=50" \ -H "x-api-key: $CRIUS_API_KEY"const res = await fetch("https://api.crius.sh/v1/robinhood/token/0xddccd4690cc99cf19d2e0bdbcb390d17e913958a/bubblemap?top=50", { headers: { "x-api-key": process.env.CRIUS_API_KEY },});const { data, meta } = await res.json();import os, requests
r = requests.get( "https://api.crius.sh/v1/robinhood/token/0xddccd4690cc99cf19d2e0bdbcb390d17e913958a/bubblemap?top=50", headers={"x-api-key": os.environ["CRIUS_API_KEY"]},)body = r.json()print(body["data"])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_infraholds what isn’t a holder: the PoolManager (pct: 22.2145, tagpool), the Pons launch locker (pct: 8.16327,lp_locker), the Pons hook0xe5e702641ea86f4ae6cc3cdaed2b886f976be044(pct: 6.06241,launchpad), two program contracts (contract) and the burn address0xdead000000000000000000000000000000000000(pct: 0.81637,burn).- The first node,
0xe1a5961d61200006577f2e96114d212889213cd6, holdspct: 2.82829and is taggedsmart_accountandwhale. - Four of the six nodes shown also carry
fomo: smart accounts created by that app, for example0xa4109b8d391723d8f6bcfc5d75e6996f61062f76atpct: 2.70423. clusters: []andedges: []: no funding or transfer links among these holders.
Where the classes apply
/holderslists every address with itslabel;exclude=infradrops infrastructure rows, anddistribution.top10_pctcounts holders only either way./holders/snapshotputstagson each row and returns bothtop10_ex_infra_pctandtop10_incl_infra_pct.exclude=infradrops infrastructure rows./holders/cohortand/holders/historytakeexclude=infratoo, so cohorts and holder counts aren’t padded by pools and lockers./tradersfilters on tags:tag=smart_accountfor smart accounts only,exclude=dev,sniper,exchangefor outside traders. Program contracts are left out unless you passinclude_contracts=true, andexclude=botsdrops wallets labeled as bots./bubblemapmoves infrastructure tohidden_infra;include=infrabrings it back./securityand/bundlesuse the same 10-block sniper window forsniper_supply_pct.
Use it in your app
-
Never rank infrastructure. Show pools, lockers and burn addresses in a separate group, or drop them with
exclude=infrawhere the endpoint takes it. -
Read tags, not labels.
labelis a name for display (uniswap_v4_pool_manager,pons_v2_launch_locker);tagsare the stable classes you filter on. -
Flag the dev and the snipers. A
devorsniperamong 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.
Related
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