DOOMWARE
Protocol · methodology

DOCS

DoomWare is infrastructure: observation, normalization, measurement, confidence, verdict, data freshness. Nothing below is a prediction. Every number the engine prints comes from the formulas on this page with the inputs printed next to it.

PIPELINE

One request runs the same nine steps for the scanner, the inspector, the compare table and the API. A step that cannot read prints UNAVAILABLE and the fields it feeds stay null; the verdict never fills a gap with a guess.

  1. 01
    Validate address
    zod · 0x + 20 bytes
  2. 02
    Detect chain
    eth_getCode on every registered chain (or the requested one)
  3. 03
    Query RPC
    bytecode size · EIP-1967 / EIP-1822 slots · owner()
  4. 04
    Token metadata
    decimals · symbol · name · totalSupply (Multicall3, bytes32 fallback)
  5. 05
    Pool information
    every registered factory × fee tier · live state at one block
  6. 06
    Liquidity metrics
    USD reference · depth ladder simulated with each venue’s own math
  7. 07
    Holder concentration
    explorer holder list classified vs discovered pools · balanceOf(pools, burn)
  8. 08
    Observable market state
    indexer: reference price · 24h volume · pool age
  9. 09
    Structured output
    scores · confidence · verdict · calculations · trace

DATA SOURCES PER NETWORK

NetworkVenues (registered factories)Quote tokensExplorerIndexerVerification
Ethereum · 1Uniswap V3 · Uniswap V2USDC · USDT · WETHBlockscoutGeckoTerminalBlockscout + Sourcify
Robinhood Chain · 4663Uniswap V3 · Uniswap V2 · Pons curveUSDG · WETHBlockscoutGeckoTerminalBlockscout + Sourcify
Base · 8453Uniswap V3 · Uniswap V2USDC · WETHBlockscoutGeckoTerminalBlockscout + Sourcify
Arbitrum One · 42161Uniswap V3 · Uniswap V2USDC · WETHBlockscoutGeckoTerminalBlockscout + Sourcify
SolanaProvider contract declared in lib/providers/solana.ts, not wired. Never selectable, never returns data.

RPC reads are the only inputs to the verdict’s liquidity terms. Explorer and indexer values are labelled INDEXED wherever they appear; they feed concentration (holders), the agreement factor of price confidence (reference price) and the informational fields (volume, pool age). When an explorer refuses server-side callers, the scanner reads the holder list from your browser and labels it — the API verdict at that block excludes it.

FORMULAS

Liquidity score (0–100)
LIQUIDITY SCORE = 60 × min(1, log10(1 + liquidityUsd) / 6) + 25 × (1 − min(1, impact$1k / 5%)) + 15 × (1 − min(1, impact$10k / 10%))
Concentration score (0–100, higher = more concentrated)
CONCENTRATION SCORE = 100 × clamp(0.6 × topHolder% / 50% + 0.4 × top10% / 90%, 0, 1) — measured on circulating supply (pools and burn addresses excluded)
Price confidence (0–1)
PRICE CONFIDENCE = 0.35 × min(1, liquidityUsd / $250,000) + 0.25 × (1 − min(1, impact$1k / 5%)) + 0.2 × venue + 0.2 × agreement; venue = 1 when the deepest pool comes from a registered factory and answered a live read, agreement = 1 − min(1, |onChain − indexer| / onChain / 10%) (0.5 when no indexer price)
Reliability score (0–100)
RELIABILITY SCORE = 40 × (1 − min(1, observationAgeSec / 600)) + 30 × (resolvedFields / 6) + 30 × priceConfidence
Observation freshness
FRESHNESS = now − blockTimestamp: FRESH < 30s, AGING < 120s, STALE ≥ 600s (UNKNOWN when the block carries no timestamp)
Verdict rules — evaluated top to bottom, first match wins
  1. 1.UNKNOWN — no live pool from a registered factory, no USD reference for its quote token, or the $1,000 reference simulation was unavailable.
  2. 2.CONCENTRATED — top circulating holder ≥ 30% or top-10 ≥ 80% (pools and burn addresses excluded).
  3. 3.UNSTABLE — price confidence < 0.5, indexer/on-chain price disagreement > 15%, or the reference size only partially fills.
  4. 4.THIN — quote-side liquidity < $50,000 or impact at $1,000 > 1%.
  5. 5.LIQUID — liquidity ≥ $250,000 and impact at $10,000 ≤ 1%.
  6. 6.HEALTHY — everything else: liquidity ≥ $50,000 and impact at the reference size within 1%.

THRESHOLDS

Reference size
$1,000
Impact limit at reference
1%
HEALTHY depth floor
$50,000
LIQUID depth floor
$250,000
LIQUID impact ceiling at $10k
1%
CONCENTRATED · top holder
≥ 30% of circulating
CONCENTRATED · top 10
≥ 80% of circulating
Concentration buckets
MODERATE ≥ 35 · HIGH ≥ 65
UNSTABLE · confidence below
0.5
UNSTABLE · price disagreement
> 15%
Confidence depth full at
$250,000
Freshness
FRESH < 30s · AGING < 120s · STALE ≥ 600s
Depth ladder sizes
$100 · $500 · $1,000 · $2,500 · $5,000 · $10,000 · $25,000
Reliability coverage fields
price · liquidity · volume24h · holders · verification · poolAge
Liquidity score weights
depth 60 · $1k 25 · $10k 15
Confidence weights
depth 0.35 · impact 0.25 · venue 0.2 · agreement 0.2
What DoomWare does not do
  • ▲ It does not predict prices, signal trades or rate “smart money”. A verdict is a description of measurable state at one block.
  • ▲ It does not fabricate. When a source is unavailable the field is null and the screen prints DATA SOURCE UNAVAILABLE.
  • ▲ It does not sign. The wallet button is read-only (EIP-6963) and exists only to point a scan at your own address.
  • ▲ The live feed is per instance. On serverless hosts two requests may hit two instances; the feed lists what this instance observed.
  • ▲ Holder rows come from the first explorer page (up to 50). Concentration is measured on circulating supply — total minus pool and burn balances — and treats every non-pool account the same (a treasury counts as a holder).
  • ▲ Pool age and 24h volume come from an indexer and are informational; they never feed the verdict.
Configuration
RPC_URL RPC_URL_<chainId> private endpoints (server-side only). Public endpoints are the fallback.
NEXT_PUBLIC_CHAIN_ID default network (4663).
PRICE_API_URL OPTIONAL_API_KEY GeckoTerminal-compatible indexer; empty string disables it.
EXPLORER_API_URL SOURCIFY_API_URL Blockscout / Sourcify roots; empty string disables.
DOOMWARE_V2_FACTORIES_<id> DOOMWARE_V3_FACTORIES_<id> DOOMWARE_QUOTE_TOKENS_<id> venue and quote overrides.
Full list in .env.example. Machine consumers start at /api.