Methodology
Each launch gets a deterministic 0-100 score. Higher means more risk signals. A risk signal is a measurable property that has been common in failed or abusive launches (for example, one wallet controlling owner functions). It is not a finding about any team's intent, and many legitimate projects carry several.
How the score is built
- Every check returns risk signal (adds its fixed weight), pass or info (adds 0), or unknown (adds 3).
- Unknown is honest: when a check cannot run with free public data (for example there is no free sell simulator for Robinhood Chain), it is shown as unknown and adds a small, fixed uncertainty weight so missing data never looks safe. It is never guessed.
- Privileged-function points are multiplied by 0.5 when owner() is provably 0x0 or dead (renounced), because other roles may still call them. When there is no owner (or it is renounced), the contract uses OpenZeppelin AccessControl, no account holds a role (RoleGranted/RoleRevoked logs since deployment, hasRole on the deployer) and no initializer is still open, the functions are shown as informational with 0 points.
- The total is capped at 100. Bands: 0-24 LOW, 25-49 MODERATE, 50-74 ELEVATED, 75-100 HIGH.
- On-chain reads are pinned to one block per scan. DexScreener, GeckoTerminal and GoPlus are live APIs; their responses are saved in each launch's raw JSON so any score can be re-derived.
Checks and weights
Contract
| Rule | Points | What it means |
|---|
No contract code
not_contract | +40 | eth_getCode returns empty: the address is a wallet or the contract is not deployed on this chain. |
Source not verified
unverified | +15 | Neither Sourcify nor Blockscout has verified source code, so the logic can only be read from bytecode. Verified on either one counts as verified. If one of them could not be checked (for example Blockscout's Cloudflare blocked the request after retries) and the other has no match, the check is marked unknown, not unverified. |
Unverified, but matches a verified template
unverified_template_match | +4 | Not verified itself, but the runtime bytecode is the same length and at least 97% byte-identical to a verified reference contract (for example the Pons launchpad token). Differences are constructor values such as name and symbol. |
Upgradeable proxy
upgradeable_proxy | +15 | An EIP-1967 implementation or beacon slot is set (or Sourcify reports a proxy), so the logic can be replaced after launch. EIP-1167 clones are not upgradeable and are not flagged. |
Proxy admin is a single wallet
proxy_admin_eoa | +5 | The EIP-1967 admin slot points at an address with no code: one key controls upgrades. |
Owner and privileged functions
| Rule | Points | What it means |
|---|
Owner is a single wallet
owner_eoa | +8 | owner()/getOwner() returns an address with no code, or a wallet with an EIP-7702 delegation (code starting 0xef0100), so one key controls every owner-only function. |
Owner is a contract
owner_contract | +3 | owner() is a contract (multisig, timelock or factory). Not classified further, so it carries a small weight. EIP-7702 delegated wallets are not counted here; they are single wallets. |
Mint function
fn_mint | +12 | A mint function exists (exact selector in bytecode, or a name match in the verified ABI). New supply can be created. |
Blacklist / bot-block function
fn_blacklist | +12 | A function that can block specific addresses from transferring. |
Pause function
fn_pause | +8 | Transfers can be paused. |
Fee / tax / limit setter
fn_fee_setter | +8 | Buy/sell fees or max-transaction/wallet limits can be changed after launch. |
Trading on/off switch
fn_trading_switch | +6 | Trading can be enabled or disabled by a privileged caller. |
Withdraw / rescue function
fn_withdraw | +5 | Tokens or ETH held by the contract can be withdrawn by a privileged caller. |
Upgrade function
fn_upgrade | +10 | upgradeTo/upgradeToAndCall is present. |
Trading (GoPlus, honeypot.is)
| Rule | Points | What it means |
|---|
Sell blocked in simulation
honeypot | +35 | GoPlus is_honeypot=1, or the honeypot.is buy/sell simulation fails to sell (Base only). |
Buy or sell tax above 10%
high_tax | +10 | Reported by GoPlus or measured by the honeypot.is simulation. |
GoPlus contract flags
goplus_flag | +8 | Any of: cannot_sell_all, transfer_pausable, hidden_owner, can_take_back_ownership, owner_change_balance, selfdestruct, slippage_modifiable, is_blacklisted, is_mintable. |
Creator history flag
same_creator_honeypot | +15 | GoPlus honeypot_with_same_creator=1. |
Liquidity
| Rule | Points | What it means |
|---|
Top pool under $5k
very_low_liquidity | +15 | Largest DexScreener/GeckoTerminal pool holds less than $5,000. If the two sources disagree by more than 5x the check is marked unknown instead. |
Top pool under $25k
low_liquidity | +10 | Largest pool holds $5,000-$25,000. |
No pool listed
no_pool | +6 | Neither DexScreener nor GeckoTerminal lists a pool at scan time. |
LP not locked or burned
lp_unlocked | +12 | Less than 90% of LP tokens are locked or burned (GoPlus LP holders, or the burned share of a V2 pair). LP held by a verified locker contract (source verified on Sourcify or Blockscout; name or functions identify it as a locker) counts as locked even when GoPlus reports 0%, because GoPlus may not recognise custom lockers. The locker's unlock terms are not analysed. Concentrated-liquidity and bonding-curve pools cannot be read from free sources and are marked unknown. |
Holders
| Rule | Points | What it means |
|---|
Launch wallet holds 5%+
launcher_holds_supply | +10 | The wallet that sent the launch transaction (or deployed the contract) still holds 5% or more of supply. |
One wallet holds 10%+
holder_concentration | +10 | The largest non-contract holder (pools, vaults and curves excluded; EIP-7702 delegated wallets kept) holds 10% or more of supply. |
Deployer
| Rule | Points | What it means |
|---|
Fresh deployer wallet
fresh_deployer | +8 | The launch wallet has sent 5 or fewer transactions in total. |
Serial deployer
serial_deployer | +8 | The launch wallet directly created 10 or more live contracts, or has sent more than 400 transactions. |
Young deployer wallet
young_deployer | +6 | The launch wallet's oldest transaction is less than 7 days before the scan. |
Site and social
| Rule | Points | What it means |
|---|
Shared server with watchlist sites
hosting_cluster | +25 | The project website resolves (Google DNS-over-HTTPS) to the same IP as a server on the hosting watchlist. Shared hosting is common and is a risk signal only; it is not evidence that the projects share owners or of any wrongdoing. Shared CDN/PaaS ranges (Cloudflare, Vercel, Netlify, GitHub Pages, Fastly) are never counted. |
Same /24 network as a watchlist server
hosting_cluster_subnet | +8 | The site's IP is in the same /24 block as a watchlist server (outside shared CDN ranges). |
Domain under 14 days old
young_domain | +5 | RDAP registration date is less than 14 days before the scan. Subdomains of site builders (lovable.app, vercel.app, ...) are not scored. |
X account under 3 days old
young_x_account | +4 | The X account behind the launch post was created less than 3 days before the scan. |
Data sources
Public, keyless sources only: chain RPC (Robinhood Chain 4663, Base 8453), Sourcify, Blockscout, GoPlus, honeypot.is (Base), DexScreener, GeckoTerminal, Google DNS-over-HTTPS and RDAP. Launch posts come from public X search. The GoPlus and honeypot.is query pattern is reused from the open-source token-launch-scan.
Known limits
- No free sell simulation exists for Robinhood Chain, so that check is always unknown there.
- LP lock status cannot be read for bonding-curve (Pons) pools or Uniswap v3/v4 positions; it is computed for V2 pairs and taken from GoPlus where available.
- The bytecode-only function scan matches 64 exact common signatures; renamed functions can be missed. Beyond the role-holder check above, access control on those functions is not analysed.
- Deployer contract counts include direct deployments only, not factory launches (Pons, Clanker, ape.store).
- Hosting overlap is only as good as the watchlist. Shared CDN and PaaS ranges are excluded on purpose.
- Scores are a snapshot. Owners can change settings, add or remove liquidity at any time after a scan.
What is not listed
A scored launch is left off this site when its evidence is incomplete or broken: a flagged check without a verifiable link, a scan that aborted, a malformed record, or a launch post that turned out to belong to a third party or to point at a different contract. These are not judgments about the projects. Excluded so far: 3.
- Launch post belongs to a third party or names a different contract: 3
Known-dead evidence links are repaired before publishing (for example, a Sourcify link for a contract that is only verified on Blockscout is replaced by the Blockscout source link). Hosting facts are stated as infrastructure overlap only.
Corrections
If a team shows that a signal is wrong (for example a multisig owner misclassified), it is corrected publicly. Email metatron@mail.grokbot.com with the chain, address and the evidence.
All weights (scorer v0.2.0)
| Rule | Points when flagged |
|---|
not_contract | 40 |
unverified | 15 |
unverified_template_match | 4 |
upgradeable_proxy | 15 |
proxy_admin_eoa | 5 |
owner_eoa | 8 |
owner_contract | 3 |
fn_mint | 12 |
fn_blacklist | 12 |
fn_pause | 8 |
fn_fee_setter | 8 |
fn_withdraw | 5 |
fn_upgrade | 10 |
fn_trading_switch | 6 |
honeypot | 35 |
high_tax | 10 |
goplus_flag | 8 |
same_creator_honeypot | 15 |
low_liquidity | 10 |
very_low_liquidity | 15 |
no_pool | 6 |
lp_unlocked | 12 |
launcher_holds_supply | 10 |
holder_concentration | 10 |
fresh_deployer | 8 |
serial_deployer | 8 |
young_deployer | 6 |
hosting_cluster | 25 |
hosting_cluster_subnet | 8 |
young_domain | 5 |
young_x_account | 4 |
any check unknown | 3 |
| privileged-function points when owner() is 0x0/dead | x0.5 |