Substance documentation
Substance is a due diligence terminal for Robinhood Chain (chain id 4663). You paste a token contract address and it returns a score from 0 to 100 built from ten checks on public data. This page explains exactly how that score is made, where the data comes from and what the tool can and cannot tell you.
Quick start
Open the terminal, paste a token contract address (the long code that
starts with 0x) and press Scan. A fresh scan takes about 15 seconds. Results
stay cached for ten minutes, so scanning the same token again is instant.
Substance never asks you to connect a wallet. If a page that looks like Substance asks for a wallet, a signature or a payment, close it. It is not us.
The ten checks
Every scan runs the same ten checks. Each check earns points and the total becomes the Substance Score. The exact thresholds are listed below so you can verify any score by hand.
| Check | Points | How it is scored |
|---|---|---|
| Verified source | 20 | Full points when the contract source is published on Blockscout. Zero when it is not, because nobody can read what an unverified contract really does. |
| Liquidity depth | 15 | Based on the deepest pool. $100K or more earns 15, $25K earns 10, $5K earns 5. Below that is a red flag: you cannot exit a thin pool. |
| Holder base | 15 | 2,500 holders or more earns 15, 1,000 earns 12, 250 earns 8, 100 earns 4. Under 100 holders is a red flag. |
| Web presence and docs | 15 | A listed website earns 5. Social links earn 3. If the site is reachable and has a documentation or whitepaper link it earns 7 more. In our research of dozens of projects, having real docs was the single best signal of a serious team. |
| Deployer history | 10 | The token's creation transaction names the wallet that launched it. We count that wallet's earlier launches through the Pons factories. Zero to two earlier launches earn 7 points. Three to seven earn 4. Eight or more is a serial deployer and earns 0 with a red flag. The count reads the wallet's recent activity, so very old launches can fall outside the window. |
| Holder concentration | 10 | Share of supply held by the top wallets. Under 30% earns 10, under 50% earns 6, under 70% earns 3. Pools, lockers and burn addresses are excluded from the math. |
| Trading activity | 10 | 24 hour volume. $50K or more earns 10, $10K earns 7, $1K earns 4. |
| Track record | 10 | Age of the oldest pool. 30 days or more earns 10, 7 days earns 6, 2 days earns 3. Under 48 hours is a red flag because most rugs happen in the first two days. |
| Explorer reputation | 5 | Blockscout keeps its own scam list. A clean reputation earns 5. A scam flag caps the whole score at 5 no matter what the other checks say. |
| Supply sanity | 5 | Checks that supply data parses and notes the fixed 1B supply standard used by Pons launches. |
Coming next: launch bundling. A check that reads the opening blocks of a launch and measures how much of the supply left the pool straight away, and into how few hands. It is built and running against live launches while we calibrate the thresholds. It does not affect any score yet, and this page will publish its weights before it does.
The formula
The check points add up to 115 available in total. The score is the points earned divided
by the points available from the checks that actually ran, times 100. Worked example: if
every check runs and a token earns 108 of the 115 points, the score is 108 / 115 x 100 = 94.
If one 10 point check could not fetch its data, the available total drops to 105 and the
score is computed over 105. Every report shows this line under the dial, for example
108 of 115 available points, scaled to 94, so you can check the math yourself.
Grades
In plain words: an A is verifiable, liquid and documented. A C has real activity but real weaknesses. An F is a shell where almost nothing can be verified.
Data coverage
Public data sources go down and rate limits happen. When a check cannot fetch its data it
is marked N/A and the score is rescaled over the checks that did complete.
Every report shows its coverage, for example data coverage 90%. We would rather
show a smaller honest score than fill a gap with a guess.
Launch feed
The feed watches the Pons factory contract
(0xA5aA…1feB) for its TokenDeployed event. Every new token gets
scanned automatically within about a minute of hitting the chain, newest first. The feed
keeps the last 200 launches and survives restarts.
Fresh launches score low on purpose. A token that is ten minutes old has no track record, few holders and usually no docs yet. That is a fact about the token, not a bug in the feed. Watch how a launch develops over its first hours instead of judging the first snapshot.
For Pons launches the feed and every report also show bonding progress. A Pons token trades in its own locked pool from launch and graduates once the WETH paired in that pool reaches the threshold, 4.2 ETH by default. The progress number is that WETH amount against the threshold. Graduation confirms demand reached the bar. It says nothing about quality, so read it next to the score, not instead of it.
The feed is also available as JSON:
GET /api/feed
Data sources
Everything runs on public endpoints that anyone can query for free:
| Source | Used for |
|---|---|
| Blockscout | robinhoodchain.blockscout.com/api/v2: token metadata,
verified source, holder counts, holder list, scam flags. |
| Dexscreener | api.dexscreener.com: pools, liquidity, price, FDV,
24 hour volume, pool age, website and social links. |
| Public RPC | robinhood-rpc.publicnode.com with
rpc.mainnet.chain.robinhood.com as backup: raw chain reads, launch events,
and name and symbol for tokens the explorer has not indexed yet. |
| Pons V2 factory | 0x000000e200088D55C39a11F609E5F667729ad49b
(view on Blockscout). The feed polls its TokenCreated
event about once a minute. |
| Project website | One read only page load to check the site is real and to look for a documentation link. We never submit anything. |
API
The terminal runs on one simple endpoint that you can call yourself:
GET /api/scan?address=0xTokenAddress
Copyable example:
curl "http://localhost:8563/api/scan?address=0x18E674231A58c239Dc7DaeDcffE15Ec3A24cff5c"
The response is JSON with the score, grade, verdict, all ten checks with their points and details, red flags, green flags, token identity data and explorer links:
{
"address": "0x18E674231A58c239Dc7DaeDcffE15Ec3A24cff5c",
"score": 96,
"grade": "A",
"verdict": "Top tier substance profile...",
"coverage_pct": 100,
"identity": { "name": "Hookr.fun", "symbol": "HOOKR",
"liquidity_usd": 453427, "holders": 3457, ... },
"checks": [ { "id": "verified", "status": "pass",
"points": 20, "max": 20, ... }, ... ],
"red_flags": [],
"green_flags": [ "Contract source is verified on Blockscout", ... ]
}
There is also a command line mode that prints the same JSON, made for bots and scripts:
python3 scanner.py 0xTokenAddress
Errors:
| Case | Status | Body |
|---|---|---|
| Malformed address | 400 | {"error": "Invalid address"} |
| No token at the address | 404 | {"error": "No token found..."} |
| Upstream data failure | 200 | a report with the failed checks marked N/A and a lower coverage percent |
There is also a machine readable summary of this whole API at /agent.md and /llms.txt for AI agents.
Please be gentle. The scanner leans on public rate limited APIs. If you want to scan in bulk, add a delay between calls.
Self hosting
Substance is plain Python with zero dependencies. No pip, no database, no keys. If you can run Python 3 you can run Substance:
python3 server.py 8563
# then open http://localhost:8563
The whole project is three files: the scan engine, a small web server and one HTML page per screen. Read the source before you run it. That rule applies to us too.
Limitations
Being clear about limits matters more than looking smart. Substance cannot see:
- Intent. A clean profile today does not stop a team from rugging tomorrow.
- Hidden ownership. A team can spread supply over many fresh wallets and the concentration check will not catch it.
- Contract tricks. Verified source means the code is readable, not that the code is safe. Substance does not audit logic.
- The future. Every score is a snapshot. Liquidity can leave in one block.
- Airdrop inflated holders. The holder count check can be gamed by airdropping dust to thousands of wallets. Read it next to volume and concentration.
- Deployer history off this chain. The deployer check only sees launches through the Pons factories on chain 4663. A wallet that rugged on another chain shows as a first launch here.
A high score means real and readable. It does not mean safe and it never means buy. Substance is not financial advice and no score is a recommendation.
Token status
There is no official Substance token today. If that ever changes, the contract address will be published on this page first, before anywhere else. Any token using the Substance name before that is fake. This matters on a chain where riding a known name is a common trick.
FAQ
Is Substance free?
Yes. Scanning is free and stays free.
Do I need to connect a wallet?
No, never. Substance is read only. If something that looks like Substance asks for a wallet, it is not us.
Can a project pay for a better score?
No. The scoring table above is public and the same for everyone. If the code is open you can check there is no special path.
A token I like scored low. Is it a scam?
Not always. A low score means little could be verified. Brand new honest projects also start with a low score because they have no track record yet. Read the check details, not just the number.
A token scored high and still rugged. How?
See the limitations section. Substance measures what is public at scan time. It cannot see intent. Use the score to filter out obvious shells, then do your own research on what remains.
Which chains are supported?
Robinhood Chain only for now. The scanner design is not tied to one chain, so more can follow.