How Sniff checks a coin
Everything below is what the code actually does, with the real thresholds. If a number isn't here, Sniff doesn't use it.
Overview
Sniff is one scanner with three ways in. All three run the same checks and give the same verdict.
- Website
- Paste a contract address or a pump.fun, Solscan, GMGN, Birdeye or Photon link. You get a case file with a Clean, Shady, Risky or Rug stamp, the story check, and the live feed of fresh launches.
- Telegram bot
- Send the bot an address or link. It replies with the on-chain verdict first, then edits the same message to add the story verdict when it's ready. It can also post clean live launches to a channel.
- Desktop dog
- A small dog that walks along your screen. Copy an address and it sniffs it and tells you what it found.
On-chain checks
Data comes from Helius: standard Solana RPC (mint account, bonding curve, largest holders, transaction history), the DAS API (getAsset for name, image and metadata link) and the Enhanced Transactions API (the dev's past pump.fun launches). The coin's metadata file is fetched from IPFS.
Every coin starts at 100 points. Each finding is marked ✅ fine, ⚠️ caution or ❌ red flag, and cautions and red flags take points off.
Some findings are information only and don't change the score: whether the coin is still on the bonding curve or has migrated to PumpSwap, which token the curve trades against when it isn't SOL (pump.fun curves can be paired with PUMP or a tokenized stock, and the market cap is then priced in that token), Mayhem-mode extra supply, the exchange share, and a note when a coin has too many trades to inspect its creation block.
When a busy coin has more transactions than Sniff can page through, the creation block (and so the bundle check) is out of reach. Sniff still finds the launch time from the coin's metadata account, which is only written at creation, so the age-based dev checks keep working. Token-2022 coins keep their metadata inside the mint, so for those the age can stay unknown.
Coins in the live feed get a lighter scan to save credits: Sniff reads at most 1,000 of the coin's transactions instead of 5,000 and skips the Enhanced API launch count. Opening the coin runs the full scan.
How the score works
- Start at 100 and subtract the points from the table.
- Red flags outweigh the total. Any ❌ caps the score at 70, so the best it can get is Shady. Two or more ❌ cap it at 40, which is Risky. A coin everyone has sold is capped at 20, which is a Rug.
- The score is kept between 0 and 100 and stamped:
Clean75–100
Shady45–74
Risky21–44
Rug0–20
Mixing in the story
When the story check finishes, the case file shows one final score: the on-chain score and the story score averaged 50/50, but never higher than the on-chain score. A great story can't rescue bad on-chain signals; a weak story can pull a clean coin down. If the verdict is Just a meme, the story doesn't change the score at all.
final = min(on-chain, round((on-chain + story) / 2))
Example: on-chain 90, story 30 (Larp) gives min(90, 60) = 60, so the stamp changes from Clean to Shady.
Story check: is the story real?
Plenty of coins claim to be an AI agent, an app or a brand's official mascot. The story check tests those claims in two steps. Community coins that only borrow a brand or stock name (often paired with a tokenized version of that stock) and claim nothing more are rated Just a meme, not Larp.
1. Code collects the facts
- Metadata: name, ticker, description, launch time and the website, X and Telegram links from the coin's metadata.
- Website: the page title, description and up to 5,000 characters of text. The fetch is locked down: only http and https on ports 80 and 443, addresses that resolve to private or internal networks are refused, at most 3 redirects, 400 KB and 8 seconds.
- GitHub: up to 2 repositories linked from the description, the website or its page. For each: when it was created compared with the coin's launch (and how many days before), commit count, contributors, stars, forks, whether it's a fork and of what, last push and language. If only a GitHub account is linked, Sniff reads the account's age and public repo count.
2. Claude weighs the claims
Claude (Opus 5.5) gets those facts plus up to 4 web searches and 4 page fetches. It lists what the coin claims (technology, affiliations, utility), checks the important claims against the brand's own channels and credible sources, and returns a verdict with each claim, its status and a source link. The site shows it on a Larp → Real gauge.
Real70–100Main claims verified: working product, repo that predates the coin with real activity, confirmed affiliation.
Partly real40–69Some claims verified, some exaggerated or unverified.
Larp0–39Main claims false, faked or unverifiable.
Just a meme50No claims beyond being a meme. Doesn't affect the final score.
Red flags it looks for
- A "brand mascot" or partnership that the brand's official site or X account never mentions.
- A GitHub repo created after the coin launched, a fork with no new work, or a handful of commits behind "real tech".
- A big claim (AI agent, revenue share, working app) with no evidence anywhere. Unverified counts against the coin.
- A website that doesn't load or says nothing about the product.
Without an Anthropic key on the server, the story section shows the collected facts only, with no verdict.
Checking a website on its own
You can paste a website instead of a coin: on this site, in a private chat with the bot, or with /site example.com in a group. Sniff runs the same two steps on the site alone and stamps it Real, Partly real, Larp or Just a meme. If the page lists a pump.fun coin address, Sniff shows it with a button to scan it, but doesn't scan it automatically, because a site can list any address. A site check looks at what the site claims, not whether its code or wallet connection is safe.
Live feed
New coins arrive from the PumpPortal WebSocket the moment they launch. Sniff then watches each coin's bonding curve through a Helius WebSocket subscription. A coin enters the feed only when both are true within 5 minutes of launch:
- at least
FEED_MIN_SOL SOL is sitting in the curve (default 8 SOL);
- the curve has updated at least 15 times, which is roughly 15 trades.
Why both: a dev can put 8 SOL into their own coin in the first second. One big buy isn't traction; many separate trades bringing in real SOL is. Coins that don't make it in 5 minutes are dropped, and so are coins whose curve trades against a token other than SOL, since their inflow can't be measured in SOL. Sniff watches up to 300 coins at once.
Coins that pass get the lighter scan and appear in the feed. Clean ones are also posted to the Telegram channel if one is set up.
Disclaimer
Sniff reads on-chain signals and public pages. It can't see intent. A Clean stamp means none of these checks found a problem, not that the coin won't dump. A dev can still sell, holders can still exit, and new tricks appear all the time. The story check is an AI's judgement from public sources and can be wrong. Nothing here is financial advice. Only trade what you can afford to lose.