How it is built
Existing public trackers score forecast accuracy: whether the crowd's prices were well-calibrated (Brier, log loss). This index measures something orthogonal that nobody publishes as a dated series: resolution integrity. When a market's proposed answer went to Polymarket's UMA optimistic oracle, how often was that answer contested before it settled, how many rounds did the fight run, and how much money was riding on the contested market.
disputed state.disputed entries in the timeline. A
timeline of proposed, disputed, proposed, disputed is a market contested twice.Both metrics are reported over traded markets only, markets with nonzero on-chain volume from the chain-validated resolution map. Polymarket's catalog is dominated by automated, never-traded scaffold markets that would otherwise swamp the signal, so untraded scaffold is excluded by design.
The dispute signal is the Polymarket Gamma umaResolutionStatuses timeline, pulled
keyless for every closed market by date-sharded paging with recursive window-splitting. Gamma
caps the page at 100 regardless of the requested limit and returns a 422 past roughly 2500
offset, so the pull shards by end-date window and recurses down to daily windows when a window
still hits the offset cap. The traded denominator and volume figures come from the WS-1
chain-validated resolution map joined to per-token traded volume.
The Gamma timeline is a venue REST feed. It is used for the free index because it is keyless-reproducible and chain-anchored (below), and for no other field. It is the one sanctioned venue-REST input; everything else stays chain-sourced.
Polymarket routes resolutions through several UMA CTF adapters. Each adapter's live optimistic
oracle was resolved on-chain by reading its optimisticOracle() getter with a
keyless eth_call. The observed adapters route to two live Polygon oracles:
Anyone can reproduce that mapping in seconds. On top of it, Gamma-flagged disputes are matched
to on-chain DisputePrice logs on those oracles, keying on the fact that a dispute
log's ancillary data hashes to the market's CTF question id. That log-level match is
throughput-bound on keyless getLogs (public Polygon endpoints return empty pages
on large ranges), so it runs as a bounded sample rather than over the full history, and becomes
exhaustive the moment a keyed getLogs endpoint is available. The
adapter-to-oracle topology is the primary chain anchor and is fully verified today; the
log-level match is stated honestly as a bounded sample.
Aggregating every UMA-resolved traded market by category and by settlement size produces a base-rate table for how often each kind of market is contested. We pre-registered an out-of-sample test (train 2025-03 to 2025-12, test 2026-01 to 2026-04) of whether a listing-time model on question wording could beat these base rates. It could not: the base-rate table won on out-of-sample AUC, precision-recall AUC, and calibration. We therefore publish the base-rate table, not a model.
Every number is re-derivable from the keyless Gamma pull plus the published queries. The
reproduction pack, published under the project's public GitHub organization at launch, carries
the keyless backfill script, the aggregation SQL as runnable DuckDB queries, the chain-anchor eth_call snippet, and the field allowlist. Code is MIT; data is CC BY 4.0.