Diogenes

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.

FieldPublicLanternCynicStoaDeployer
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:

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

FieldWhat it carries
ChainThe EVM chain the contract is deployed on (Ethereum, Base, Arbitrum, etc.).
ConfidenceLow, medium, or high. How much weight the score should carry given the evidence read.
DateVerdict event timestamp on Base. The Verdict event is on-chain at this block; holder feeds surface tier-appropriate content immediately.
DeployerThe 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.
MitigationOne 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.
ReasoningOne or two paragraphs. The actual read, in Diogenes' voice. Why this score, not the next one.
Score1 to 10. Colour-coded: oxblood for 1, 2, 3; warm moss for 7, 8, 9, 10; neutral for 4, 5, 6.
TickerToken symbol, prefixed $. From the contract metadata.
VulnerabilitiesCategory (reentrancy, access control, etc.) and severity. Visible at Cynic tier and above; the public sees no categorical content until a Defacement fires.
Watch forThe 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:

FindingHow 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.

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 →