assay
Method

How a report is computed.

Everything on a report comes from Robinhood Chain (chain id 4663) through public JSON-RPC. There is no model, no estimate, no external data vendor. The same chain state gives the same report.

Sources

  • Launch record: the pons v2 factory's TokenLaunched(token, curve, deployer, pairToken, launchConfigId, graduationThreshold) event, queried by the indexed token topic (or from the local index).
  • Curve state: getReserves(), realQuoteReserve(), graduationThreshold(), readyToGraduate(), creatorTaxBps(), phantomQuote(), quoteFeeBalance() on the curve, in one multicall.
  • Price: quote reserve ÷ token reserve (pair units per token). Market cap = price × totalSupply. USD only when a trustworthy source exists: the Chainlink ETH/USD feed at 0x78F3…d3A9 for ETH pairs, the per-stock Chainlink feeds for Robinhood Stock Token pairs (feed age shown), and a labelled 1:1 assumption for USDG. Other pairs show no USD.
  • Tape: every CurveBuy and CurveSell log on the curve since the launch block.
  • Holders: every ERC-20 Transfer log on the token since launch, replayed into balances. The set is marked unverified if the balances do not sum to totalSupply.
  • Deployer: TokenLaunched filtered by the deployer topic across the factory's lifetime (from block 27,000,000), and LaunchSwept for those tokens.
  • Graduation: a LaunchSwept event for the token.

Definitions

  • Circulating: totalSupply − curve balance − burned (0x0 and 0x…dEaD).
  • Quote in: sum of quoteIn across buys, in the pair asset.
  • Snipe window: 50 blocks (~5 s at 0.1 s/block), the same span as pons's decaying snipe tax.
  • Deployer sold: a Transfer from the deployer to the curve. A transfer to any other wallet is a move, not a sell, and is not flagged.

Flags

CodeSeverityCondition
SNIPE_CLUSTERwarning≥3 buys landed within 50 blocks (~5 s) of the launch block and those buys are ≥30% of all quote ever bought in. Evidence: the buy transactions.
SINGLE_WALLET_DOMINANCEwarningWith ≥3 buys on the tape, one wallet's buys are ≥50% of all quote bought in.
DEPLOYER_SOLDwarningThe launching wallet transferred tokens to the curve (a sell) at least once. Evidence: those transfers.
DEPLOYER_SERIALwarningThe launching wallet has ≥5 launches in the last 24 h or ≥15 in the last 7 days on the pons v2 factory.
SYMBOL_COLLISION (warning)warningAt least one indexed launch that graduated uses the same symbol (case-insensitive).
SYMBOL_COLLISION (notice)notice≥3 other indexed launches use the same symbol and none graduated.
COORDINATED_WALLETSnotice / warning≥3 wallets linked by same-transaction buys, identical buy amounts within ~1 min of launch, or token transfers between them (warning when the linked wallets bought ≥40% of quote in). A heuristic from public data, not a funding-source trace.
HOLDER_CONCENTRATIONnoticeWith ≥3 holders and reconciled balances, the top 10 wallets hold ≥70% of circulating supply (supply outside the curve, burns excluded).
DEPLOYER_HOLDS_LARGEnoticeThe deployer holds ≥20% of circulating supply and has not sold.
DEPLOYER_LOW_GRADUATIONnoticeThe deployer has ≥10 launches on record and none graduated.
SELL_ONLY_TAPEnoticeThe last 5 or more trades were all sells, on a tape of ≥6 trades.
ROUND_TRIPPINGnotice≥2 wallets each bought at least twice and sold at least twice.
THIN_TAPEnotice≤6 trades from ≤3 wallets.
NO_TRADESnoticeNo CurveBuy or CurveSell events since launch.
PARTIAL_DATAnoticeAn RPC budget (calls or logs) was hit while reading trades, transfers or the deployer record. Affected figures are lower bounds.
NEAR_GRADUATIONinfoReal quote reserve is ≥80% of the graduation threshold.
GRADUATEDinfoA LaunchSwept event exists for the token.
BOND_ACTIVE / BOND_SLASHEDinfo / warningThe deployer has an active, or a slashed, commitment bond on the AssayBond contract (when deployed).

Limits: what a report cannot tell you

  • Intent. A snipe cluster can be bots or friends; round-tripping can be market making or washing. The tape shows what happened, not why.
  • Wallet links. Clusters come from behaviour visible on this token (batch buys, lockstep amounts, hand-offs), not from a funding-source trace. Ten wallets can still be one person without leaving any of those marks.
  • After graduation. Price and market cap come from the locked Uniswap v4 pool (PoolManager 0x8366…0951, slot0 read through extsload); the pool's swap count and volume are read from its Swap events. Curve figures stay as final values at sweep.
  • Coverage. The index backfills the factory's whole history in the background; until that finishes, symbol collisions and deployer records for older launches are read from the chain within budgets and may be partial. /api/health shows the backfill progress.
  • Budgets. Public RPCs cap log queries at 10,000 results and rate-limit bursts. When a budget is hit the report says so (PARTIAL_DATA) and the figures are lower bounds.
  • Freshness. Reports are cached for 20 s on the curve and 5 min after graduation. The block number on every report is the truth about when it was read.
  • No safety rating. “No flags raised” is a statement about the listed conditions at one block. It is not a recommendation.

Reproduce it

The analysis functions are pure and live in src/lib/assay/. Fetch the same logs with any RPC client, replay them through analyzeTape, analyzeHolders and deriveFlags, and you get the same report.

Method · Assay