How Conge works

Where the data comes from, exactly what each check looks at, and what it can't see.

Data sources

Blockscout API v2 is the primary source for almost everything — whether an address is a contract, the token's name, symbol and supply, its holder list and holder count, whether its source is verified (and its ABI), whether it's an upgradeable proxy, when it was deployed, and market data. It's a plain read-only HTTP API; Conge never needs a wallet or a signature to query it.

Results appear progressively. As soon as the token and holder lookups answer, the result card shows the token's name, supply, holder concentration, holder count and market data. Contract verification, owner privileges and token age each show "Checking…" and fill in on their own as their lookups return — under load, some explorer lookups take several seconds. Every Blockscout request gets 10 seconds; one that doesn't answer in time shows as Unknown, with the reason, instead of holding up the rest.

A small Cloudflare Worker acts as a read-only RPC relay for the two checks Blockscout has no field for — reading a contract's owner(), and the sell simulation — plus a lightweight connection check (the chain ID) shown under Network status. It exists because the chain's public RPC endpoint has been unreachable from some networks and devices (a TLS certificate error) and doesn't send the CORS headers a browser needs. That endpoint is also shared by everyone on the chain and tightly rate-limited, so the Worker retries a rate-limited call a few times with a short backoff rather than failing straight away.

The Worker only forwards a fixed allow-list of read-only calls (eth_chainId, eth_blockNumber, eth_call, eth_getCode), and only for requests coming from this site — nothing that could move funds, change state, or sign anything passes through it. It's also optional: if it's ever unreachable, the owner and sell-simulation checks show Unknown and everything else still works.

What gets scanned

Conge only scores tokens. Before running any check, it confirms there's a token at the address, and stops with a plain explanation — rather than a risk card full of empty fields — when there isn't:

  • A wallet address (no contract code) — there's nothing to scan.
  • A contract that isn't a standard token — a router, a pool, or any contract with no token name, symbol, or decimals. Conge says it doesn't look like a standard token and can't analyze it.
  • An address the explorer doesn't list as a token and can't otherwise identify right now — Conge says it couldn't confirm what the address is, and suggests trying again.

If the explorer's token lookup itself fails or times out, that proves nothing either way, so the scan goes ahead and each affected check honestly shows Unknown.

The risk checks

Every check is transparent and rule-based — no model, no hidden scoring. These are the exact thresholds Conge uses.

Source code verified

Whether the contract's source is published and verified on the block explorer. Unverified source is High on its own, and it also means the owner-privilege checks below can't run, since they need the verified ABI.

Holder concentration

How much of the total supply the largest holder, and the top 10 holders together, control. The zero address and the common 0x…dEaD burn address are left out, since tokens sent there are out of circulation.

Largest holder: over 50% is High, over 20% is Medium. Top 10 combined: over 80% is Medium. When both come out Medium, they're shown as one finding.

When the block explorer tags a top holder as a contract — typically a liquidity pool, bridge, or vault — the finding says so, because supply held by a pool reads very differently from supply held by a single wallet. That note explains the number; it doesn't lower the severity, and Conge only mentions it when the explorer actually tagged the address.

Holder count

How many holders the token has. Fewer than 10 is High; 10 to 99 is Medium; 100 or more passes. With very few holders, the price can be moved by a handful of wallets.

Token age

How long ago the contract was deployed, from its creation transaction. Under 24 hours is High; under 7 days is Medium; older passes. Very new tokens haven't had time for problems, or scams, to surface.

Upgradeable proxy

Whether whoever controls the contract can swap out its logic — detected from the explorer's proxy information, or from an upgradeTo-style function in the verified ABI.

An upgradeable proxy with unverified source is High: its logic can change with no way to confirm what it would become. With verified source it's Medium — common for regulated or compliance-driven tokens, but you're trusting whoever controls upgrades. It rises to High when the upgrade admin is confirmed to be a plain wallet rather than a contract such as a multisig or timelock. If the admin's type can't be confirmed, it stays Medium rather than guessing.

Owner privileges

For verified contracts only, the ABI is searched by function name for owner powers: minting new tokens, pausing transfers, blacklisting or blocklisting addresses, and setting fees or taxes are each Medium; setting a maximum transaction or wallet size is Low. If none are found and the contract isn't a proxy, the check passes. If the source isn't verified (or the ABI couldn't be read), this shows Unknown.

Owner

Who currently holds owner privileges, read via the Worker from owner() — or that ownership has been renounced to the zero address, meaning any owner-only functions listed above can no longer be called. This is informational and doesn't raise the risk level by itself. Renouncing ownership doesn't cover a proxy's upgrade admin, which is separate.

Sell-simulation honeypot check

A read-only simulation (an eth_call, never a real transaction) of whether an ordinary holder can actually sell. Conge first looks for liquidity pools among the top 5 holders by asking each contract holder for token0()/token1() — any contract that pairs this token is treated as a pool, whichever DEX it belongs to. It then simulates, from up to 2 plain-wallet top holders, a transfer of 1% of their balance to an ordinary address and to each pool found.

If the ordinary transfer fails for every holder tried, it's High ("Transfers are restricted" — a pause, blacklist, or allowlist). If ordinary transfers work but every transfer to a pool fails, it's High ("Selling appears blocked" — the classic honeypot). If both succeed, it passes. If there's no pool among the top 5 holders, no eligible wallet to test from, or the RPC can't be reached, the check says so and shows Unknown — never a pass. See the limits below for what this can't catch.

Market data

Price, 24-hour volume, and market cap as reported by the block explorer, shown in USD for context. Informational only — it never affects the risk level.

The risk gauge

The overall level is simply the worst result among the checks that actually produced data. Conge never uses the words "safe" or "secure".

  • High — at least one check came back High.
  • Medium — no High, but at least one Medium.
  • Low — no Medium or High findings in these automated checks. There may still be minor (Low) notes, and Low is not a guarantee.
  • Insufficient data — none of the checks that count produced usable data, so there's no honest verdict to give.

A check that couldn't produce a result is shown as Unknown, grouped under "Info / unknown". Unknown checks never count toward the level — not as a red flag, and never as a pass. Market data and the owner check are informational and don't raise the level either.

While checks are still running, the gauge reads "Finalizing risk level…" and the needle sweeps; it only settles once every check that affects the level has finished.

What Conge cannot detect

None of this is an audit or a guarantee — it's a fast, transparent read of public data. Specific, known gaps:

  • Buy/sell tax. The sell simulation confirms a transfer to a pool isn't outright blocked, but can't measure a fee taken on top of it.
  • Router-only logic. Some tokens only misbehave when the caller is a specific DEX router mid-swap — a direct transfer simulation from a holder doesn't reproduce that.
  • Time- or amount-based traps. The simulation moves 1% of a holder's balance, right now. A token that only blocks larger transfers, or only after or before a certain time, can pass every check here while still being a trap in practice.
  • Pools outside the top holders. The sell simulation only looks for pools among the top 5 holders, and only recognizes pools that answer token0()/token1(). When it finds none, it says so (Unknown) rather than passing.
  • Name-based checks aren't a bytecode audit. The owner-privilege check looks for functions by name in a verified ABI — a differently-named function with the same effect won't be caught.
  • A scan sometimes can't finish every check. The owner and sell-simulation checks depend on a shared public RPC that rate-limits under load, and some block-explorer lookups can be slow or time out. Affected checks show Unknown with the reason — see the FAQ.

Always verify independently on the block explorer before acting on anything Conge shows you.