Fathom

A read-only risk-verdict tool for DreamDEX event contracts, grounded in on-chain state.

Next.js · TypeScript · Somnia · Groq

01 / 04

Brief

Prediction-market interfaces usually show a price and an order book. On DreamDEX, that was not enough. I found a market the indexer still called Trading while the contract was Locked, and displayed depth did not say whether orders were durable or immediately pullable. A trading decision built on the summary could be wrong before any model got involved.

Build

Fathom reads the venue and chain directly, runs eight signals through a deterministic engine, and returns ALLOW, RECHECK, or BLOCK with a trace of where the evaluation stopped. The model only writes the plain-English explanation. Its schema has no verdict field, so it cannot change the result. The public site stays read-only and serves a periodically refreshed, verified board snapshot instead of pretending every page load is a reliable live read.

Key decisions

  • Code owns the verdict. The language model receives a finished result and can only explain it; six guards reject contradictions, invented numbers, unknown signals, and outcome predictions.
  • The depth-durability signal reads each order on-chain. Aggregated views discard owner and expiry data, and investigating those fields exposed that the venue's order owners were upgradeable proxies, so Fathom reports what can be supported instead of claiming an order is impossible to pull.
  • There is no wallet connection or half-built execution path. The shipped client opens without a signer, says READ ONLY, and never handles a user's keys or funds.
  • Production runs from a committed board snapshot refreshed by GitHub Actions. Captures fail closed, with a staleness escape hatch added after the first guard proved it could preserve an old board indefinitely.

Outcome

Submitted to the Somnia Network × DreamDEX Event Contracts Hackathon by the extended deadline, and live at fathom.samuelyahaya.com. During the build, a market Fathom had flagged because its on-chain status disagreed with the indexer was later voided on-chain. There are no judging results or user metrics to report yet.