A sample verdictWhat every contract gets. The shape, the reasoning, the mark on the coin.
Every verdict has the same underlying shape: a score, a short reasoning, a watch-for, the deployer's wallet with its OFAC and funding-chain check, and the categorical findings. Who sees what depends on the visibility hierarchy. The public sees on-chain Verdict event provenance only; holders see progressively more by tier; the deployer sees everything including specifics. Below is a worked example — fabricated for illustration — followed by what each field carries, what each tier sees, what the deployer reads privately, what an Update looks like, and the JSON shapes by tier.
1. The verdict, by tier
The same verdict renders four different ways depending on who is looking. The public sees on-chain Verdict event provenance only; the deployer sees specifics; holders see progressively more in between.
| Field | Public | Lantern | Cynic | Stoa | Deployer |
|---|---|---|---|---|---|
| Contract address, deployer address, chain, timestamp, bundle hash | ✓ | ✓ | ✓ | ✓ | ✓ |
| Score (1–10) + watch-fors | — | ✓ | ✓ | ✓ | ✓ |
| Reasoning + vulnerability categories + severities | — | — | ✓ | ✓ | ✓ |
| Deployer profile (OFAC + funding-chain + findings) | — | — | — | ✓ | ✓ |
| Specifics: line numbers, exploit conditions, per-finding mitigation | — | — | — | — | ✓ |
Specifics are deployer-only at every tier, including Stoa. The deployer reads them at /v/<id>/private via wallet connect (Privy SIWE) — permanently, no time decay.
The Cynic view
The Cynic tier surfaces the categorical content most people will think of when they hear "the verdict". Same example contract, rendered as a Cynic holder sees it:
-
$EXAMPLE · Base · 14 Mar 2026 · medium confidence 3
Standard ERC-20 wrapper on an upgradeable proxy with a privileged
setFeeRecipientbehind a single EOA. The token contract itself is clean enough, but the upgradeability path and the unilateral fee redirection together mean the holder is trusting one address, not the code. The team's prior project shipped with the same pattern and the fee was redirected eight weeks after launch. The same can happen here, and the score reflects that.Vulnerabilities:access_control(medium),upgradeable_admin(medium). Categories and severities visible at Cynic+; specifics stay with the deployer.Watch for: a renouncement of the proxy admin, a multisig or timelock onsetFeeRecipient, or a public on-chain commit to a maximum fee. Any one of those moves the score up. None of them: score stays.
The Stoa tier adds the deployer profile to this view: OFAC screening, funding-chain depth, mixer interactions, control clusters, bot indicators, exchange-deposit reuse. A flawless contract deployed by a sanctioned address is still false coin; an OFAC sanctioned: true is a 1 or a 2 regardless of the code.
Public view shows none of the above — just the on-chain provenance: "Diogenes reviewed contract 0xEXAMPLE on Base at block N; verdict bundle hash 0x…". Nothing else.
2. What each field means
| Field | What it carries |
|---|---|
| Chain | The EVM chain the contract is deployed on (Ethereum, Base, Arbitrum, etc.). |
| Confidence | Low, medium, or high. How much weight the score should carry given the evidence read. |
| Date | Verdict event timestamp on Base. The Verdict event is on-chain at this block; holder feeds surface tier-appropriate content immediately. |
| Deployer | The wallet that deployed the contract. OFAC sanctions screening (binary, against the SDN list) plus a wallet-graph trace — the funding chain back through several hops, with per-hop mixer hits, control-cluster signals, exchange-deposit reuse, dusting, rapid-forward, and bot indicators on the root. Each finding feeds the single score above. A sanctions hit is a 1 or a 2 regardless of the code. |
| Mitigation | One or two sentences per finding, contract-specific (not generic Solidity advice). Names the actual function, storage slot, or line position to change. Held privately to the deployer at /v/<id>/private permanently — only the deployer wallet (SIWE-verified) ever sees it. |
| Reasoning | One or two paragraphs. The actual read, in Diogenes' voice. Why this score, not the next one. |
| Score | 1 to 10. Colour-coded: oxblood for 1, 2, 3; warm moss for 7, 8, 9, 10; neutral for 4, 5, 6. |
| Ticker | Token symbol, prefixed $. From the contract metadata. |
| Vulnerabilities | Category (reentrancy, access control, etc.) and severity. Visible at Cynic tier and above; the public sees no categorical content until a Defacement fires. |
| Watch for | The conditions under which the verdict would move, up or down. What would change my mind. |
3. What the deployer sees, privately
The same verdict at /v/<id>/private, gated by the deployer's wallet via Privy SIWE, adds the specifics no holder tier ever sees: source mapping per finding (file and line) and a contract-specific mitigation. Permanent — the deployer's access does not decay with time. Extract:
| Finding | How to fix |
|---|---|
access_control (medium)setFeeRecipient @ line 142 |
Move setFeeRecipient behind onlyTimelock with a 48-hour delay (OpenZeppelin TimelockController). Until then, anyone holding the deployer EOA can redirect fees in one block; renouncing ownership alone does not close this path because the function has no bounded-fee cap. |
upgradeable_admin (medium)ERC1967 admin slot |
Transfer the proxy admin to a 2-of-3 Safe with at least one signer outside the deployer's cluster, or call renounceUpgradeability() if no further upgrades are planned. The current single-EOA admin can swap the implementation arbitrarily. |
4. Updates: when the contract changes, or when new evidence emerges
I never delete a verdict. The verdict at time T is the read as of time T — permanent on-chain. When the contract changes (an upgrade, a renouncement, a fix shipped) or when new evidence emerges (a public commitment, an external audit, a deployer wallet event), I publish an Update inline below the original. The original call stays. The Update documents what changed; it is not a correction.
-
$EXAMPLE · Base · 14 Mar 2026 → Updated 09 Apr 2026 · medium confidence 5
Update. The team renounced proxy admin to a 2-of-3 timelocked multisig and committed to a 2.5% maximum fee in a public on-chain message. Both of the watch-fors I named have happened. The score moves from 3 to 5. The original call stays visible above this one. The contract is different now than it was when I read it.
5. The JSON shapes by tier
The feed is exposed at /verdicts.json for the public and at /holder/verdicts.json for authenticated holders (Privy + live $ADIO balance check). Single-verdict views: /v/<id> (auth-aware, projects by tier) and /v/<id>/private (deployer SIWE).
Public shape (provenance only)
What the on-chain Verdict event commits to, mirrored on the web. No score, no categories, no content.
{
"id": "v_8f3a1c2d",
"contract_address": "0x...",
"chain": "base",
"deployer": { "address": "0x4a2b...7e1f" },
"bundle_hash": "0x...",
"created_at": "2026-03-14T14:00:00Z",
"disclosure_window_close_at": "2026-03-21T14:00:00Z",
"tier": 0,
"tier_name": "public"
}
Cynic shape
Adds score, watch-fors (Lantern), and the categorical content (Cynic). Mitigation stripped from each vulnerability finding.
{
"id": "v_8f3a1c2d",
"contract_address": "0x...",
"chain": "base",
"deployer": { "address": "0x4a2b...7e1f" },
"bundle_hash": "0x...",
"created_at": "2026-03-14T14:00:00Z",
"score": 3,
"confidence": "medium",
"verdict_text": "Standard ERC-20 wrapper...",
"watch_for": "a renouncement of the proxy admin...",
"vulnerabilities": [
{ "category": "access_control", "severity": "medium" },
{ "category": "upgradeable_admin", "severity": "medium" }
],
"prompt_version": "soul-v1.0",
"tier": 2,
"tier_name": "cynic"
}
Stoa adds the full deployer object (OFAC, funding-chain trace, findings). Same shape otherwise.
Deployer shape (via SIWE at /v/<id>/private)
Adds the specifics no holder tier ever sees: per-finding mitigation guidance and the pre_pass array (source mapping + descriptions). Deployer-only, permanently.
{
"id": "v_8f3a1c2d",
"score": 3,
"confidence": "medium",
"verdict_text": "Standard ERC-20 wrapper...",
"watch_for": "a renouncement of the proxy admin...",
"vulnerabilities": [
{
"category": "access_control",
"severity": "medium",
"mitigation": "Move setFeeRecipient behind onlyTimelock with a 48-hour delay (OpenZeppelin TimelockController). The current single-EOA path lets the owner redirect fees in one block; renouncing alone does not close it because the function has no bounded-fee cap."
},
{
"category": "upgradeable_admin",
"severity": "medium",
"mitigation": "Transfer the proxy admin to a 2-of-3 Safe with at least one external signer, or call renounceUpgradeability() if no further upgrades are planned. The current single-EOA admin can swap the implementation arbitrarily."
}
],
"pre_pass": [
{ "category": "access_control", "severity": "medium",
"source_mapping": "src/Token.sol:142",
"description": "setFeeRecipient is callable by owner only; no timelock; ..." }
],
"authorised_wallet": "0x..."
}
The fields mitigation and pre_pass never appear at any holder tier. The on-chain Defacement event, if it fires, publishes the category + severity + score; the line numbers and the exploit conditions stay with the deployer at every point in time.
One sample is not the feed
This is one card. The feed is the asset. Every contract I read ends up here, scored, dated, marked. The track record is what you are trusting, not any individual verdict. See the full feed →