# 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.

Source: https://docs.crius.sh/concepts/holder-classes/ · Updated 2026-10-28

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

Example [Free plan · 2 credits](https://docs.crius.sh/reference/holders/live-holders/)

### 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**

```bash
curl "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/holders?limit=5&exclude=infra" \
  -H "x-api-key: $CRIUS_API_KEY"
```

**JavaScript**

```js
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();
```

**Python**

```python
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)**

```json
{
  "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.

[Live holders reference](https://docs.crius.sh/reference/holders/live-holders/) [Data looks wrong? Report it](mailto:support@crius.sh?subject=Wrong%20data%20in%20docs%20example%3A%20CHARGE's%20top%20five%20real%20holders%2C%20infrastructure%20left%20out&body=Page%3A%20https%3A%2F%2Fdocs.crius.sh%2Fconcepts%2Fholder-classes%2F%23live-holders%0ARequest%3A%20GET%20%2Fv1%2Frobinhood%2Ftoken%2F0x7b8892cea949bc60d494681d1bc3ea96071ab0b8%2Fholders%3Flimit%3D5%26exclude%3Dinfra%0A%0AWhat's%20wrong%20or%20missing%3F%0A%0A)

Without `exclude=infra`, the live list keeps infrastructure rows with their `label`, so you can draw them differently. The [holder snapshot](https://docs.crius.sh/reference/holders/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](https://docs.crius.sh/concepts/attribution/#wallet-tags).

Example [Starter plan · 10 credits](https://docs.crius.sh/reference/wallet-graph/bubble-map/)

### 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**

```bash
curl "https://api.crius.sh/v1/robinhood/token/0xddccd4690cc99cf19d2e0bdbcb390d17e913958a/bubblemap?top=50" \
  -H "x-api-key: $CRIUS_API_KEY"
```

**JavaScript**

```js
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();
```

**Python**

```python
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)**

```json
{
  "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.

[Bubble map reference](https://docs.crius.sh/reference/wallet-graph/bubble-map/) [Data looks wrong? Report it](mailto:support@crius.sh?subject=Wrong%20data%20in%20docs%20example%3A%20A%20bubble%20map%20with%20the%20infrastructure%20moved%20aside&body=Page%3A%20https%3A%2F%2Fdocs.crius.sh%2Fconcepts%2Fholder-classes%2F%23bubble-map%0ARequest%3A%20GET%20%2Fv1%2Frobinhood%2Ftoken%2F0xddccd4690cc99cf19d2e0bdbcb390d17e913958a%2Fbubblemap%3Ftop%3D50%0A%0AWhat's%20wrong%20or%20missing%3F%0A%0A)

## 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.
    

```python
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

[Guide **Token holders** Robinhood Chain token holders API: get any token's top holders in one call, with balance, share of supply, USD value, labels, holder count and top-10 share. Read](https://docs.crius.sh/guides/get-token-holders/) [Guide **Read a bubble map** Get a Robinhood Chain token's top holders as a graph, with the funding and transfer links that group them. Real examples, with and without clusters. Read](https://docs.crius.sh/guides/read-a-bubble-map/) [Guide **Top traders & PnL** Rank the traders of any Robinhood Chain token by PnL, volume, buys or ROI, with wallet tags, gas and hold time. A real example with the PnL math explained. Read](https://docs.crius.sh/guides/get-top-traders-pnl/) [Guide **Detect bundles & snipers** Find out who bought a Robinhood Chain token's launch, how much of the supply snipers and bundles took and whether they still hold it, with a real insider launch that fell 97%. Read](https://docs.crius.sh/guides/detect-bundles-and-snipers/) [Concept **Trader attribution & wallet tags** How Crius attributes Robinhood Chain trades to the real trader behind routers, aggregators, bundlers and bot contracts, and what each wallet tag means. Read](https://docs.crius.sh/concepts/attribution/) [API reference **Live holders API** The current holder list, ranked by balance, with each holder's share of supply, USD value and labels (pools, lockers, burn addresses, the dev). Read](https://docs.crius.sh/reference/holders/live-holders/)
