Transparency is the product
Methodology
Everything about checking a token, what the labels mean and the exact rules behind them. Building something? See the developer guide.
Getting started
- Copy a token's address from nad.fun, or remember its name or ticker.
- Paste it into the search box at the top of any page. Suggestions appear as you type; press Enter to open the token.
- Read its label and the one-line reasons under it.
- Open a wallet group to see which wallets are linked, why, and the public transaction behind each link.
To browse instead, open screener: filter by label, sort by trading, holders or holder gap, and share the link, which keeps your filters.
Labels
Every token gets one label. Labels describe links found in public transactions, not whether a token is good or bad, and are not financial advice.
- Many linked walletsIts creator or holders are linked to many other wallets. See who, and the proof.
- Some linked walletsSome of its creator's or holders' wallets are linked. See who, and the proof.
- No linked wallets foundNo links found between its creator and holders and other wallets. Not a guarantee.
- Not enough dataToo little trading to say.
The rules, in order
- Many linked wallets: The creator belongs to a wallet group that launched 5 or more tokens in the window.
- Many linked wallets: At least 5 wallets hold it, and real owners are half the holder count or fewer.
- Many linked wallets: Wallet groups hold 20% or more of the supply, or the creator's side holds 10% or more.
- Some linked wallets: The creator belongs to a wallet group.
- Some linked wallets: At least 5 wallets hold it, and real owners are 85% of the holder count or fewer.
- Some linked wallets: Wallet groups hold 5% or more of the supply, or the creator's side holds 3% or more.
The cut-offs are our own choice and have not been tested against hand-labelled tokens. Grouping itself was checked by hand on a small sample only.
Where the data comes from
Nuno reads every nad.fun launch, trade and transfer from the public Monad blockchain, traces where each buyer's money came from, and updates every 20 minutes. Its numbers are published as open JSON and written to a contract on Monad testnet. Nothing private is used.
Method
The full rulebook, for anyone who wants to check every detail.
Nuno counts entities, not wallets. It groups wallets that are very likely controlled by the same operator into an entity (a "cluster"), then recomputes each nad.fun token's holder, concentration and volume numbers per entity. Every link between two wallets keeps the transactions that justify it, so anyone can check each flag on a Monad explorer.
This document is the definition of every number Nuno publishes. Code references are to this repository.
1. Data sources
| Data | Source | Notes |
|---|---|---|
| Token launches, curve buys/sells, graduations | CurveCreate, CurveBuy, CurveSell, CurveGraduate events from the nad.fun curve contract 0xA7283d07812a02AFB7C09B60f8896bCEA3F90aCE on Monad mainnet |
Event ABIs from nad.fun/abi.md; topic hashes checked against live logs. The transaction signer is stored with every trade (see "Trade attribution"). |
| Token launches and curve buys/sells on nad.fun's V2 curve | Create, Buy, Sell events from 0x9f3832732923252A21044F21eE6bd87F09514ae4 (identified through nad.fun's own API: market_type: "V2_CURVE") |
Not in nad.fun's docs and unverified on Monadscan. Buy/Sell signatures confirmed by keccak match; their topics are (token, sender), the reverse of V1. The create event (topic 0xac11ceed…) has no public signature: Nuno decodes creator, token, pool from its topics and name, symbol, URI from its data, checked against nad.fun's API. Most nad.fun activity is on V2 (about 48 launches and 3,700 trades per day in October 2026, vs about 10 launches per day on V1). |
| Balances | ERC-20 Transfer events of every tracked token, from creation onward |
Balances are rebuilt from the full transfer history. |
| Post-graduation trades | V1 tokens: Uniswap V3 Swap on the pool from CurveGraduate. V2 tokens: Uniswap V2-style pair Swap on the pool from the V2 curve's Graduate(token, pool) |
Attributed to the transaction signer (the Swap sender is a router). V2-pair swaps report in/out amounts and are stored as signed pool deltas like V3 swaps, so both feed the same volume and wash rules. |
| Funding (who sent a wallet its MON) | Monad archive state + debug_traceBlockByNumber (section 2) |
No public Monad RPC serves trace_filter. |
| Infrastructure | packages/metrics/src/infrastructure.json, generated by pnpm infra:scan (section 3) plus manual entries; Nansen labels once integrated |
Used only to stop exchanges/bridges/routers acting as links. |
Window: tokens launched in the last BACKFILL_DAYS days (default 7). Analysis reads mainnet only; snapshots are published to NunoFeed on Monad testnet.
Trade attribution
The curve event's sender is the trading wallet for direct trades and trades through nad.fun's router. When a wallet trades through a bot contract (its own or a shared trading-bot router), sender is that contract. On the 7-day sample this was 94 of 537 curve trades. When sender is a contract, the trade is attributed to the transaction signer. Example: 0x022e… signs calls to its own contract 0x9b2d…, which sells on the curve; those sells belong to 0x022e….
Contracts vs wallets
An address counts as a contract when eth_getCode returns bytecode. EIP-7702 delegated accounts are wallets, not contracts: their code is the 23-byte designator 0xef0100 || delegate, but they are still controlled by a private key. Several active nad.fun traders are 7702 accounts.
2. Funding resolution
For each wallet that bought a tracked token:
- Find the first-funded block. For an externally owned account,
touched(b) = balance(b) > 0 or nonce(b) > 0can only flip from false to true. Once funded, a wallet can only spend by sending a transaction, which raises its nonce. Nuno binary-searches archive state for the first block wheretouchedis true, searching strictly before the wallet's first buy. That takes about 27 steps over Monad's full history. - Find the sender. In that block, a top-level transaction with value to the wallet gives the sender directly. Otherwise Nuno traces the block with
callTracerand takes every successful value-carrying frame (CALL,CREATE,CREATE2,SELFDESTRUCT) whose target is the wallet. Frames under a reverted frame are ignored. - Find later deposits. A small first funding is often followed by the real money (e.g. 10 MON first, 300,000 MON later). Between the first-funded block and the wallet's first buy (or, for an ancestor, the block where it funded its child), Nuno looks for deposits that raised the balance. If
balance(lo) < t <= balance(hi), a binary search finds a block where the balance crossedtupwards, and a balance can only rise through an inbound value transfer, so that block contains a deposit; its sender is found as in step 2. Withtat the midpoint, each deposit found halves the remaining gap. Only rises of at least 1 MON are searched. Together with the first funding, at most 5 inbound funding edges are stored per wallet. - Record evidence. For every edge Nuno stores the
funder(the frame that sent value, possibly a disperse contract), theorigin(the transaction signer, i.e. the entity that controls the funds), value, block, timestamp and tx hash. - Repeat on every origin, up to 3 hops back.
The origin is used for linking, so bundlers that fan out through a disperse contract are still linked to their operator.
3. Entity resolution (clustering)
Entity resolution runs globally across every tracked token at once. That way an operator who launches or trades many tokens is one entity everywhere, with the same id. Wallets are linked by weighted edges. Weights between the same pair of wallets add up across edge types and across tokens. A pair is merged (union-find) once its total weight reaches 1.0.
| Edge | Weight | Rule |
|---|---|---|
same_direct_funder |
1.0 | Both wallets were funded (first funding or a later deposit) by the same non-infrastructure origin, within 24 h of each other |
common_funding_source |
0.8 | The wallets share any non-infrastructure ancestor within 3 funding hops. Counted once per pair, however many ancestors they share (several shared ancestors on one chain are one signal) |
creator_funded |
1.0 | A token's creator is among the wallet's funding ancestors (≤ 3 hops); links wallet and creator |
token_transfer |
1.0 | One wallet sent a tracked token directly to the other (neither is a contract) |
same_block_early_buy |
0.5 | Both bought the same token in the same block, within 200 blocks (~1 min) of its creation |
same_block_sell |
0.5 | Both sold the same token in the same block |
Consequences of the weights:
- A single weak signal (one shared block, or a distant shared ancestor) never merges wallets on its own.
- Two weak signals do. Examples: co-selling in the same block on two different tokens (0.5 + 0.5), or a shared ancestor plus a same-block sell (0.8 + 0.5).
Infrastructure (exchange-like) addresses. Until Nansen labels are integrated, pnpm infra:scan profiles every funding origin on-chain. It marks an address exchange-like if it has sent ≥ 5,000 transactions or holds ≥ 1,000,000 MON. Each entry in infrastructure.json records the numbers and block it was judged on. This is a heuristic, not a label. A busy private wallet can be over-excluded, which only costs recall: its funded wallets are not linked through it. A small exchange deposit wallet can be missed. On 2026-10-08 it flagged 16 of 46 funding origins. The serial-launch funder 0xb245… (91 txs) is not flagged.
Distribution hubs (fan-out cap). Some addresses fund, or send tokens to, hundreds of unrelated people: airdrops, payout wallets, trading-bot services. Without a limit, one of them chains everyone it touched into a single "entity". On the October 2026 window, one wallet that sent tokens to 1,375 different wallets helped merge 3,728 wallets into one group. So an address that funds more than 50 distinct participants, is a shared funding ancestor of more than 50, or sends tokens to more than 50 is treated as a hub (receiving from many is not: farm wallets consolidating into one main wallet stay linked), and those links stop grouping wallets. Its recipients can still be grouped by their own evidence.
Farm exception. A direct funder (or a token creator) above the cap still links its wallets when its payments look like one operator seeding its own wallets:
- the median payment is at most 10 MON;
- at least 80% of payments are within half to double the median;
- at least 80% of recipients got their first funding from it.
Example: 0xb56e…e299 paid 101 fresh wallets about 0.37 MON each. Funders whose payments vary widely, are large, or go to already-funded wallets stay hubs. The exception covers direct funding only, never token transfers or shared ancestors.
Hard rules
- Contracts are never entity members. Each address's code is checked with
eth_getCode. nad.fun protocol contracts, curve pools and graduated pools are always excluded. - Infrastructure addresses never act as linking funders or ancestors.
- Every accepted link keeps its evidence: edge type, tx hash, block, and the token where relevant.
- For very large groups (more than 64 wallets sharing one funder, block or source), links are chained in time order instead of all pairs. The merged result is identical; only per-pair weight accumulation across edge types is reduced.
An entity's id is its lexicographically smallest member address. A wallet with no accepted links is its own entity.
4. Metrics (per token)
All supply shares are in basis points of total supply (10,000 = 100%), rounded down. Total supply is mints minus burns from the token's transfer history. Curve, pool and nad.fun protocol contracts are never counted as holders.
| Metric | Definition |
|---|---|
rawHolders |
Addresses with a non-zero balance, excluding contracts |
realHolders |
Distinct entities among those holders |
effectiveTop10Bps |
Combined balance of the 10 largest entities, as a share of total supply |
clusterSupplyBps |
Balance held by wallets that belong to multi-wallet entities, as a share of total supply |
creatorLinkedSupplyBps |
Balance held by the creator's entity (the creator alone if unclustered), as a share of total supply |
rawVolume |
Sum of the MON side of every curve trade (buy: MON in; sell: MON out) plus, after graduation, every Uniswap V3 swap on the token/WMON pool. A swap's side and MON leg come from the pool's signed deltas; the pair is ordered by address (token0 < token1), so the token's side is known without an RPC call |
organicVolume |
rawVolume minus wash-like volume (below) |
organicVolumeBps |
organicVolume / rawVolume; 0 when there is no volume |
Wash-like volume, computed per entity across all its wallets:
- (a) If an entity both bought and sold, and its net token position change is under 5% of its gross tokens traded, all its MON volume is wash-like.
- (b) Otherwise, round trips count: for each window of 3,600 blocks (~18 min),
2 × min(buy MON, sell MON). - Entities that only bought or only sold are directional and never count as wash.
Because entities span wallets, one wallet buying while a sibling wallet sells is detected as an entity round trip.
5. Evidence root
evidenceRoot = keccak256(utf8(canonicalJson)), where canonicalJson is:
{"token": "<addr>", "clusters": [
{"id": "<addr>", "members": ["<sorted addrs>"],
"evidence": ["<a>:<b>:<edgeType>:<txHash>:<block>", "... sorted, deduplicated"]}
]}
clusters lists the entities active in the token, sorted by id. The source block is not part of the hash, so the root changes only when the evidence changes; the block is published alongside it as sourceBlock. The canonical JSON is stored and served, so anyone can recompute the root and compare it with the one on-chain.
6. On-chain feed
NunoFeed.publish(token, Snapshot) stores the metrics above plus sourceBlock (the mainnet block they were computed at) and evidenceRoot; publishedAt is stamped by the contract. Snapshots can only move forward in sourceBlock. The publisher sends a new snapshot when any of these hold:
- holder counts changed;
- a bps metric moved by at least 25;
- the evidence root changed;
- 6 hours have passed since the last snapshot (heartbeat).
OrganicGate.requireOrganic(token, maxClusterBps, maxAge) reverts when there is no snapshot, when the snapshot is older than maxAge, or when clusterSupplyBps > maxClusterBps.
7. Limitations and known false-positive cases
- Not every inbound transfer. Nuno stores the first funding plus deposits that raised the net balance, at most 5 per wallet. A deposit that was spent again before the wallet's first buy (so the balance never rose past it) can be missed, and so can small deposits under 1 MON.
- Native MON only. Funding via WMON or other ERC-20s is not yet followed.
- EIP-7702 accounts. A delegated EOA can move funds without raising its nonce, which breaks the monotonicity assumption in section 2. Such wallets may resolve to a later block, or to a block with no inbound value; the latter is stored as "no inbound value frame".
- Round-trip traders count as wash. Rule (a) in section 4 classifies any entity that ends the window with a near-zero net position as wash-like. That includes a sniper that buys at launch and later sells everything at a profit, not only volume bots. On the 7-day sample, attributing bot-contract sells to their signers dropped volume-weighted organic volume from about 20% to about 1%, mostly because of one such sniper (
0x022e…). "Organic" here means "volume from entities that kept a position", which is stricter than "not wash-traded". - Distribution hot wallets. A service that funds many independent users (exchange, faucet, trading-bot onboarding) looks the same as an operator funding its own wallets. Example:
0xa934…(7,594 txs) first-funded 8 trading wallets within ~37 minutes. The infrastructure heuristic treats it as infrastructure, so those wallets are not linked. Some of them may in fact be one operator. - Shared infrastructure funders. Until Nansen labels are integrated, an exchange hot wallet funding two unrelated users within 24 h links them (
same_direct_funder). This is the main expected source of false positives, and the hand-review indocs/VALIDATION.mdchecks for it. - Coincidental same-block trades. Two independent traders can share a block, especially right after launch. That is why these edges weigh 0.5 and need a second signal.
- DEX swaps and clustering. Post-graduation swaps count toward volume and wash detection, but do not create
same_block_*links (those use curve trades only). Swaps routed through aggregators that split across pools are attributed per pool event. - Supply denominator. Shares use total supply. On the bonding curve most supply sits in the curve contract, so shares of circulating supply are higher than the published numbers.
- Hub cap approximations. Hubs are counted over all funded wallets and all token recipients in the database, so full and incremental runs agree. A shared ancestor (2–3 hops up) above the cap gets no farm exception: wallets that trace back to the same seeder through different intermediaries are then grouped only through their direct funders and other evidence.
- No ground truth. No labelled dataset exists. Accuracy is reported only as the observed precision on the hand-reviewed sample in
docs/VALIDATION.md.
Nansen cross-checks
For hub funders, Nuno asks Nansen's related-wallets endpoint about a wallet the hub funded and compares Nansen's "First Funder" with its own funding trace. 46 of 47 agree on both the funder and the transaction. Matching wallets carry a Verified by Nansen badge on their entity page. Nansen labels exchanges and other shared infrastructure, which stops them from linking unrelated wallets; none of the funders checked so far had such a label.
| Wallet | Nansen first funder | Nuno first funder | Tx | Result |
|---|---|---|---|---|
| 0xc7bf…754f | 0xaa6e…0b0c | 0xaa6e…0b0c | 0xd728…1c25 | ✓ same funder and tx |
| 0x573b…190e | 0x4116…0c54 | 0x4116…0c54 | 0xc1bf…5216 | ✓ same funder and tx |
| 0xb245…d3b3 | 0xf89d…aa40(High Activity) | 0xf89d…aa40 | 0x8efa…7695 | ✓ same funder and tx |
| 0x4116…0c54 · #045faf | 0xc7bf…754f | 0xc7bf…754f | 0xab81…e127 | ✓ same funder and tx |
| 0xc419…0be7 · #3d0de3 | 0x3ec1…22b6(High Activity) | 0x3ec1…22b6 | 0x1aea…78fb | ✓ same funder and tx |
| 0x5447…37d9 · #0cd730 | 0x28de…cde7 | 0x28de…cde7 | 0x833d…99b5 | ✓ same funder and tx |
| 0xb42f…ead6 | 0xdf74…32bb | 0xdf74…32bb | 0x2df0…b8ae | ✓ same funder and tx |
| 0x81a3…b41a · #016322 | 0xb56e…e299 | 0xb56e…e299 | 0x7b96…a62d | ✓ same funder and tx |
| 0x71dd…6735 · #01e0a8 | 0x25e5…b8a8 | 0x25e5…b8a8 | 0xfb8e…2180 | ✓ same funder and tx |
| 0x9768…ae35 · #03aec5 | 0x6d93…aa38 | 0x6d93…aa38 | 0x2822…f894 | ✓ same funder and tx |
| 0x9a3f…fdef | 0xf89d…aa40(High Activity) | 0xf89d…aa40 | 0xcaaa…1d52 | ✓ same funder and tx |
| 0x0e25…580c · #00ea03 | 0xd3b6…93e1 | 0xd3b6…93e1 | 0xff36…87e7 | ✓ same funder and tx |
| 0x4747…3556 | 0xbae8…432a | 0xbae8…432a | 0x0b91…979f | ✓ same funder and tx |
| 0xd4e0…5d17 | 0xe1d3…662c | 0xe1d3…662c | 0x545e…efa9 | ✓ same funder and tx |
| 0x3560…faab | 0xf799…48ef | 0xf799…48ef | 0x599f…20e8 | ✓ same funder and tx |
| 0xf093…0a18 | 0x00cb…75bd | 0x00cb…75bd | 0x722c…b518 | ✓ same funder and tx |
| 0x55a8…1729 | 0xd78d…3bae(High Activity) | 0xd78d…3bae | 0x2e0d…31e3 | ✓ same funder and tx |
| 0xbdef…7282 · #01ce49 | 0xc5b3…45b0 | 0xc5b3…45b0 | 0x0b4c…d0dc | ✓ same funder and tx |
| 0x6de8…6385 · #0699ac | 0xc5b3…45b0 | 0xc5b3…45b0 | 0xd733…5847 | ✓ same funder and tx |
| 0xdd1c…78de · #0a0f29 | 0xb245…d3b3 | 0xb245…d3b3 | 0xe12e…950e | ✓ same funder and tx |
| 0xdcbb…24ad | 0xe735…dd7f(High Activity) | 0xe735…dd7f | 0x6d06…1456 | ✓ same funder and tx |
| 0xb5e5…3be0 · #085858 | 0xc5b3…45b0 | 0xc5b3…45b0 | 0x552a…1f25 | ✓ same funder and tx |
| 0xba95…03ec · #0bfdd3 | 0xc5b3…45b0 | 0xc5b3…45b0 | 0x4e77…6dd0 | ✓ same funder and tx |
| 0xa218…aac8 · #0e0c06 | 0xc5b3…45b0 | 0xc5b3…45b0 | 0x0f82…ad5a | ✓ same funder and tx |
| 0x9515…797c | 0xe01d…568e | 0xe01d…568e | 0xdbca…8837 | ✓ same funder and tx |
| 0x91ee…3e4f · #16e5e6 | 0x2444…b65e | 0x2444…b65e | 0x8303…9185 | ✓ same funder and tx |
| 0xc668…7b56 · #08aba1 | 0xc5b3…45b0 | 0xc5b3…45b0 | 0x6a43…c759 | ✓ same funder and tx |
| 0x4337…8d0e · #433700 | 0x4337…568e(High Activity) | 0x4337…568e | 0xeee5…2a82 | ✓ same funder and tx |
| 0x7041…b700 | 0x1ab4…8f23(Token Millionaire) | 0x1ab4…8f23 | 0xb7a1…e61b | ✓ same funder and tx |
| 0xd243…f160 | 0x8c82…7ba1(testnetfaucets.eth) | 0x8c82…7ba1 | 0xbc46…4527 | ✓ same funder and tx |
| 0xe0ab…9c93 | 0xfc08…221d | 0xfc08…221d | 0xc1e9…1827 | ✓ same funder and tx |
| 0x61ec…1d90 · #4ae6e6 | 0x551f…4d2d | 0x551f…4d2d | 0x956f…b350 | ✓ same funder and tx |
| 0x62c7…08e3 · #62c706 | 0x158e…5303 | 0x158e…5303 | 0x9192…edc2 | ✓ same funder and tx |
| 0xc98c…578f · #28ec99 | 0xc5b3…45b0 | 0xc5b3…45b0 | 0x45a7…8758 | ✓ same funder and tx |
| 0xbde0…4bbf · #0f46d1 | 0x5ecd…f6d4 | 0x5ecd…f6d4 | 0x5bde…ff40 | ✓ same funder and tx |
| 0x5e9c…df3d | 0x0d07…92fe(Token Millionaire) | 0x0d07…92fe | 0x42d9…4bc5 | ✓ same funder and tx |
| 0x7663…3e0a | 0xa869…0874 | 0xa869…0874 | 0x31ea…9053 | ✓ same funder and tx |
| 0x6c22…7d29 | 0x4405…e249 | 0x4405…e249 | 0xfee5…8f07 | ✓ same funder and tx |
| 0x6167…17b5 | 0x5160…076c | 0x5160…076c | 0xd134…596c | ✓ same funder and tx |
| 0xad84…182c | 0x233c…b4cd(Token Millionaire) | 0x233c…b4cd | 0x96c3…a23b | ✓ same funder and tx |
| 0x0123…1129 | 0x65f4…b4b6 | 0x65f4…b4b6 | 0x8b34…6e6a | ✓ same funder and tx |
| 0xa1de…0552 · #a1dedd | 0x23ad…5546 | 0x23ad…5546 | 0xd803…408b | ✓ same funder and tx |
| 0x045f…59cf · #045faf | 0x241a…0e30 | – | 0x7fac…afec | differs |
| 0x0163…e455 · #016322 | 0xb56e…e299 | 0xb56e…e299 | 0x4aa2…7b94 | ✓ same funder and tx |
| 0x01e0…d0ae · #01e0a8 | 0x25e5…b8a8 | 0x25e5…b8a8 | 0x7f38…0d14 | ✓ same funder and tx |
| 0x3b86…e792 | 0x233c…b4cd(Token Millionaire) | 0x233c…b4cd | 0x29f0…4f8b | ✓ same funder and tx |
| 0x0c8a…ac3f · #0c8acf | 0x347f…2bd9(coletadelixo.eth*) | 0x347f…2bd9 | 0xdfb3…21d5 | ✓ same funder and tx |
Validation
There is no labelled ground truth for wallet clusters. This is the hand review of a reproducible random sample, shown in full. Accuracy is claimed for this sample only.
Draft verdicts, pre-filled by Claude Code on 2026-10-08 from on-chain checks (every evidence tx re-fetched from
rpc1.monad.xyz; funder nonces and balances read at the latest block). Pending human review. Change any verdict you disagree with.
There is no labelled ground truth for wallet clusters. This is a hand review of a reproducible random sample.
Sample generated by pnpm --filter @nuno/metrics validation 42 at mainnet block 111,709,445: 20 flagged links (of 90, across 1 entities) and 10 unflagged buyer wallets (of 19).
Verdict key. Flagged link: TP = the evidence shows common control, FP = plausibly independent (e.g. both funded by an exchange), ? = can't tell. Unflagged wallet: TN = no sign of a link to another sampled/known operator, FN = a link Nuno missed.
Observed precision = TP / (TP + FP) on flagged links. Reported in the README only for this sample.
Flagged links
| # | Entity | Wallets | Edge | Evidence | Verdict | Reasoning |
|---|---|---|---|---|---|---|
| 1 | 0x0a0f2937… |
0x1b3dc681… ↔ 0x2d5be282… |
same_direct_funder | 0x88d0162e… @66478733 via 0xb2454805…0xe771d39f… @66478748 via 0xb2454805… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,733 and 66,478,748 (15 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 7 of the 71) and show the same ~550–650-tx bot profile. |
| 2 | 0x0a0f2937… |
0x1b3dc681… ↔ 0x849cb815… |
common_funding_source | 0x88d0162e… @66478733 via 0xb2454805…0x9dd12f03… @66478710 via 0xb2454805…0x88d0162e… @66478733 via 0xf89d7b9c…0x9dd12f03… @66478710 via 0xf89d7b9c…0x88d0162e… @66478733 via 0x348ee93e…0x9dd12f03… @66478710 via 0x348ee93e… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,733 and 66,478,710 (23 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 8 of the 71) and show the same ~550–650-tx bot profile. The ancestors 0xf89d… (73,554 txs, 378M MON) and 0x348e… in this link's evidence are exchange-like and would not justify a link alone; the link stands on 0xb245…66d3b3. |
| 3 | 0x0a0f2937… |
0x0a0f2937… ↔ 0xea6cf43b… |
same_direct_funder | 0x472f4f46… @66478720 via 0xb2454805…0xc585563e… @66478724 via 0xb2454805… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,720 and 66,478,724 (4 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 7 of the 71) and show the same ~550–650-tx bot profile. |
| 4 | 0x0a0f2937… |
0x0a0f2937… ↔ 0x725d3b6d… |
common_funding_source | 0x472f4f46… @66478720 via 0xb2454805…0x8db860bf… @66478738 via 0xb2454805…0x472f4f46… @66478720 via 0xf89d7b9c…0x8db860bf… @66478738 via 0xf89d7b9c…0x472f4f46… @66478720 via 0x348ee93e…0x8db860bf… @66478738 via 0x348ee93e… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,720 and 66,478,738 (18 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 7 of the 71) and show the same ~550–650-tx bot profile. The ancestors 0xf89d… (73,554 txs, 378M MON) and 0x348e… in this link's evidence are exchange-like and would not justify a link alone; the link stands on 0xb245…66d3b3. |
| 5 | 0x0a0f2937… |
0xe0b0111d… ↔ 0x2d5be282… |
common_funding_source | 0x9327686e… @66478743 via 0xb2454805…0xe771d39f… @66478748 via 0xb2454805…0x9327686e… @66478743 via 0xf89d7b9c…0xe771d39f… @66478748 via 0xf89d7b9c…0x9327686e… @66478743 via 0x348ee93e…0xe771d39f… @66478748 via 0x348ee93e… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,743 and 66,478,748 (5 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 7 of the 71) and show the same ~550–650-tx bot profile. The ancestors 0xf89d… (73,554 txs, 378M MON) and 0x348e… in this link's evidence are exchange-like and would not justify a link alone; the link stands on 0xb245…66d3b3. |
| 6 | 0x0a0f2937… |
0xdd1cf85f… ↔ 0xea6cf43b… |
same_direct_funder | 0xe12ecdb9… @66478715 via 0xb2454805…0xc585563e… @66478724 via 0xb2454805… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,715 and 66,478,724 (9 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 7 of the 71) and show the same ~550–650-tx bot profile. |
| 7 | 0x0a0f2937… |
0xdd1cf85f… ↔ 0x725d3b6d… |
same_direct_funder | 0xe12ecdb9… @66478715 via 0xb2454805…0x8db860bf… @66478738 via 0xb2454805… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,715 and 66,478,738 (23 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 7 of the 71) and show the same ~550–650-tx bot profile. |
| 8 | 0x0a0f2937… |
0xe0b0111d… ↔ 0x2d5be282… |
same_direct_funder | 0x9327686e… @66478743 via 0xb2454805…0xe771d39f… @66478748 via 0xb2454805… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,743 and 66,478,748 (5 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 7 of the 71) and show the same ~550–650-tx bot profile. |
| 9 | 0x0a0f2937… |
0xea6cf43b… ↔ 0xe0b0111d… |
common_funding_source | 0xc585563e… @66478724 via 0xb2454805…0x9327686e… @66478743 via 0xb2454805…0xc585563e… @66478724 via 0xf89d7b9c…0x9327686e… @66478743 via 0xf89d7b9c…0xc585563e… @66478724 via 0x348ee93e…0x9327686e… @66478743 via 0x348ee93e… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,724 and 66,478,743 (19 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 7 of the 71) and show the same ~550–650-tx bot profile. The ancestors 0xf89d… (73,554 txs, 378M MON) and 0x348e… in this link's evidence are exchange-like and would not justify a link alone; the link stands on 0xb245…66d3b3. |
| 10 | 0x0a0f2937… |
0x849cb815… ↔ 0xdd1cf85f… |
same_direct_funder | 0x9dd12f03… @66478710 via 0xb2454805…0xe12ecdb9… @66478715 via 0xb2454805… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,710 and 66,478,715 (5 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (8 and 7 of the 71) and show the same ~550–650-tx bot profile. |
| 11 | 0x0a0f2937… |
0x39f234ce… ↔ 0xea6cf43b… |
same_direct_funder | 0x928affdb… @66478706 via 0xb2454805…0xc585563e… @66478724 via 0xb2454805… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,706 and 66,478,724 (18 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 7 of the 71) and show the same ~550–650-tx bot profile. |
| 12 | 0x0a0f2937… |
0x0a0f2937… ↔ 0x849cb815… |
common_funding_source | 0x472f4f46… @66478720 via 0xb2454805…0x9dd12f03… @66478710 via 0xb2454805…0x472f4f46… @66478720 via 0xf89d7b9c…0x9dd12f03… @66478710 via 0xf89d7b9c…0x472f4f46… @66478720 via 0x348ee93e…0x9dd12f03… @66478710 via 0x348ee93e… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,720 and 66,478,710 (10 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 8 of the 71) and show the same ~550–650-tx bot profile. The ancestors 0xf89d… (73,554 txs, 378M MON) and 0x348e… in this link's evidence are exchange-like and would not justify a link alone; the link stands on 0xb245…66d3b3. |
| 13 | 0x0a0f2937… |
0xdd1cf85f… ↔ 0x1b3dc681… |
common_funding_source | 0xe12ecdb9… @66478715 via 0xb2454805…0x88d0162e… @66478733 via 0xb2454805…0xe12ecdb9… @66478715 via 0xf89d7b9c…0x88d0162e… @66478733 via 0xf89d7b9c…0xe12ecdb9… @66478715 via 0x348ee93e…0x88d0162e… @66478733 via 0x348ee93e… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,715 and 66,478,733 (18 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 7 of the 71) and show the same ~550–650-tx bot profile. The ancestors 0xf89d… (73,554 txs, 378M MON) and 0x348e… in this link's evidence are exchange-like and would not justify a link alone; the link stands on 0xb245…66d3b3. |
| 14 | 0x0a0f2937… |
0xea6cf43b… ↔ 0x39f234ce… |
common_funding_source | 0xc585563e… @66478724 via 0xb2454805…0x928affdb… @66478706 via 0xb2454805…0xc585563e… @66478724 via 0xf89d7b9c…0x928affdb… @66478706 via 0xf89d7b9c…0xc585563e… @66478724 via 0x348ee93e…0x928affdb… @66478706 via 0x348ee93e… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,724 and 66,478,706 (18 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 7 of the 71) and show the same ~550–650-tx bot profile. The ancestors 0xf89d… (73,554 txs, 378M MON) and 0x348e… in this link's evidence are exchange-like and would not justify a link alone; the link stands on 0xb245…66d3b3. |
| 15 | 0x0a0f2937… |
0x1b3dc681… ↔ 0x725d3b6d… |
common_funding_source | 0x88d0162e… @66478733 via 0xb2454805…0x8db860bf… @66478738 via 0xb2454805…0x88d0162e… @66478733 via 0xf89d7b9c…0x8db860bf… @66478738 via 0xf89d7b9c…0x88d0162e… @66478733 via 0x348ee93e…0x8db860bf… @66478738 via 0x348ee93e… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,733 and 66,478,738 (5 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 7 of the 71) and show the same ~550–650-tx bot profile. The ancestors 0xf89d… (73,554 txs, 378M MON) and 0x348e… in this link's evidence are exchange-like and would not justify a link alone; the link stands on 0xb245…66d3b3. |
| 16 | 0x0a0f2937… |
0x511e8425… ↔ 0x2d5be282… |
same_direct_funder | 0xf7b03822… @66478728 via 0xb2454805…0xe771d39f… @66478748 via 0xb2454805… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,728 and 66,478,748 (20 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 7 of the 71) and show the same ~550–650-tx bot profile. |
| 17 | 0x0a0f2937… |
0x849cb815… ↔ 0x1b3dc681… |
same_direct_funder | 0x9dd12f03… @66478710 via 0xb2454805…0x88d0162e… @66478733 via 0xb2454805… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,710 and 66,478,733 (23 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (8 and 7 of the 71) and show the same ~550–650-tx bot profile. |
| 18 | 0x0a0f2937… |
0x511e8425… ↔ 0x39f234ce… |
common_funding_source | 0xf7b03822… @66478728 via 0xb2454805…0x928affdb… @66478706 via 0xb2454805…0xf7b03822… @66478728 via 0xf89d7b9c…0x928affdb… @66478706 via 0xf89d7b9c…0xf7b03822… @66478728 via 0x348ee93e…0x928affdb… @66478706 via 0x348ee93e… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,728 and 66,478,706 (22 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 7 of the 71) and show the same ~550–650-tx bot profile. The ancestors 0xf89d… (73,554 txs, 378M MON) and 0x348e… in this link's evidence are exchange-like and would not justify a link alone; the link stands on 0xb245…66d3b3. |
| 19 | 0x0a0f2937… |
0x725d3b6d… ↔ 0x849cb815… |
common_funding_source | 0x8db860bf… @66478738 via 0xb2454805…0x9dd12f03… @66478710 via 0xb2454805…0x8db860bf… @66478738 via 0xf89d7b9c…0x9dd12f03… @66478710 via 0xf89d7b9c…0x8db860bf… @66478738 via 0x348ee93e…0x9dd12f03… @66478710 via 0x348ee93e… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,738 and 66,478,710 (28 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 8 of the 71) and show the same ~550–650-tx bot profile. The ancestors 0xf89d… (73,554 txs, 378M MON) and 0x348e… in this link's evidence are exchange-like and would not justify a link alone; the link stands on 0xb245…66d3b3. |
| 20 | 0x0a0f2937… |
0xdd1cf85f… ↔ 0x0a0f2937… |
common_funding_source | 0xe12ecdb9… @66478715 via 0xb2454805…0x472f4f46… @66478720 via 0xb2454805…0xe12ecdb9… @66478715 via 0xf89d7b9c…0x472f4f46… @66478720 via 0xf89d7b9c…0xe12ecdb9… @66478715 via 0x348ee93e…0x472f4f46… @66478720 via 0x348ee93e… |
TP | Both wallets' first funding is a plain transfer of exactly 14,995 MON from 0xb245…66d3b3, at blocks 66,478,715 and 66,478,720 (5 blocks apart). 0xb245…66d3b3 is a private EOA (91 lifetime txs). Its nonce went 49→59 across that burst, so these were 10 consecutive sends to 10 fresh wallets. Both wallets then created tracked tokens (7 and 7 of the 71) and show the same ~550–650-tx bot profile. The ancestors 0xf89d… (73,554 txs, 378M MON) and 0x348e… in this link's evidence are exchange-like and would not justify a link alone; the link stands on 0xb245…66d3b3. |
Unflagged wallets
| # | Wallet | Verdict | Reasoning |
|---|---|---|---|
| 1 | 0x9689474d… |
TN | First funded with 9,846 MON by 0xdb2a…f254 (11,560 lifetime txs, 6.8M MON: exchange-like). 1 buy on 1 token. Only shared ancestor is at hop 3 with one other buyer. No link to the operator lineage. |
| 2 | 0x62c706c2… |
TN | First funded with 410.9 MON by 0x158e…5303 (private, 87 txs). 2 trades on 1 token. Shares no funding ancestor with any other buyer in the data. |
| 3 | 0x291bc9aa… |
TN | First funded with 397.7 MON by 0xf539…3d85 (private, 14 txs) at block 41.4M. 5 trades on 1 token. Its only shared ancestor is 0xf70d…dbef at hop 3 (578,677 txs: exchange-like), correctly not enough to link. |
| 4 | 0x23ad000e… |
TN | First funded with 200 MON by 0xdcbb…24ad (account with code, 3,327 txs: smart or delegated wallet). 2 trades on 1 token. No shared ancestors. |
| 5 | 0xb75d93f8… |
TN | First funded with 14,124 MON directly by 0xf70d…dbef (578,677 txs, 8.4M MON: exchange-like). 1 buy. Shares that exchange-like lineage with two other buyers. One lineage only counts once (0.8), correctly below the threshold. |
| 6 | 0x51c83637… |
TN | First funded with 13,857 MON by 0xa934…9c49 (7,594 txs, high-throughput distributor) at block 37.7M. 1 buy. Shares 0xa934… lineage with 2 other buyers. That is the lineage behind the double-count bug fixed today; not linked now. |
| 7 | 0x6f370da2… |
TN | First funded with 100 MON by 0x9322…2bd5 (587 txs, 42.7M MON: whale or treasury). 1 buy. Was wrongly merged with 0xf359… before today's fix (two shared ancestors on one chain counted twice). Now correctly unflagged. |
| 8 | 0x5c16a939… |
TN | First funded with 682.5 MON by 0x7ff8…1cce5 (701 txs, 751k MON). 3 buys on 1 token. No shared ancestors. |
| 9 | 0x91fea3a2… |
TN | First funded with 26,948 MON by 0x04d9…6d56 (48,290 txs: exchange-like). 9 buys on 1 token. Shared ancestors only at hops 2–3 via high-volume addresses. |
| 10 | 0x022e9c32… |
? (possible FN) | Sniper pattern on the operator's tokens. It bought 58 of the 71 tokens, each exactly once, 1–2 blocks after launch, for 350–500 MON. It sells through its own contract 0x9b2d…94c4: it signs a call (selector 0xb8a9ddeb) that pulls the tokens and sells on the curve, so the 56 curve sells are attributed to the contract. Funded by 0x33f1…3f99 (private, 44 txs), which was funded by 0xabde…9d76 (exchange-like); no link to 0xb245…66d3b3 within 3 hops. Either an independent launch-sniper bot or the operator's own buyer; on-chain evidence cannot tell which. Since 2026-10-08 its contract-routed sells are attributed to it (trade attribution by tx signer). |
Result
Flagged links: 20 TP, 0 FP, 0 ?. Observed precision on this sample: 20/20 (100%).
Unflagged wallets: 9 TN, 1 ? (possible FN).
Caveats that matter more than the headline number:
- All 20 flagged links come from one entity, because only one multi-wallet entity exists in the 7-day window. The sample effectively tests one clustering decision, made of 20 pairs, not 20 independent ones. It says little about precision on other operator styles.
- A false positive was found and fixed before this review.
0x6f37…and0xf359…were merged because they shared two ancestors on one funding chain, and each was counted. That behaviour is fixed (one lineage counts once per pair). Without the fix, the sample would likely have included an FP. - Exchange-like ancestors are common:
0xf89d…(73,554 txs),0xf70d…(578,677 txs),0xa934…,0xabde…,0x04d9…,0xdb2a…. They create 0.8common_funding_sourceoverlaps between unrelated buyers. None merged wallets on its own here, but pairing one with a weak signal (e.g. one same-block sell) would. Excluding these addresses as infrastructure (Nansen labels or an evidence-backed manual list) is the main precision safeguard still missing. - Possible miss (row 10):
0x022e…snipes the operator's launches and sells through its own contract. Its sells were credited to the contract; fixed: curve trades with a contractsenderare now attributed to the transaction signer. It is still not linked to the operator: no funding or transfer evidence connects them. - Also fixed after this review: EIP-7702 delegated wallets were wrongly treated as contracts and excluded (6 active traders, incl.
0xd243…with 50 trades). They are now wallets, and their funding is resolved. - Exchange-like ancestors are now excluded via
pnpm infra:scan(16 addresses, e.g.0xf89d…,0xf70d…,0xa934…). The 20 flagged links above are unchanged: they rest on0xb245…, which is not flagged. - Also seen:
0xb245…66d3b3sent a second burst of 10 transfers right after the first (nonce 59→69 by block 66,478,800). Those recipients haven't traded in the window, so they are not in the data.