Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions benchmarks/pm-resolution-delay.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ number: "039"
title: Resolution delay, Polymarket vs Kalshi
seo_title: "Prediction market resolution delay live 2026"
seo_description: "Polymarket and Kalshi resolution time measured live: median delay from close to payout, broken down by category. Polymarket anchored on UMA ProposePrice, Kalshi on settlement_ts from the public API."
subtitle: How long from market close to final settlementPolymarket measured onchain via UMA ProposePriceQuestionResolved, Kalshi via settlement_ts minus close_time from the public REST API. Auto-generated multivariate parlays excluded from Kalshi data.
subtitle: "How long from market close to final settlement: Polymarket measured onchain via UMA ProposePrice to QuestionResolved, Kalshi via settlement_ts minus close_time from the public REST API. Auto-generated multivariate parlays excluded from Kalshi data."

category: Trading
status: live
Expand Down Expand Up @@ -43,15 +43,15 @@ methodology:
- "Polymarket join: questionID = keccak256 of the proposal ancillary data, verified against QuestionInitialized events."
- "Kalshi anchor: settlement_ts from the public markets API (exact timestamp, no polling error). Delay = settlement_ts - close_time. close_time is the scheduled market close, not the real-world event end."
- "Kalshi scope: traditional prediction markets only. Exotics (auto-generated multivariate parlays) are excluded by design: they auto-settle so fast they never appear in status=closed, so the watchlist only contains real market questions. Categories from /events/{event_ticker} (lazy cache): Sports→sports, Politics/Elections→politics, Crypto/Financials→crypto, everything else→other."
- "Anchor asymmetry: Polymarket's 2h UMA challenge window is protocol-enforced no market can resolve in under 2h on the clean path. Kalshi has no such floor; traditional sports and politics markets settle in minutes to hours after close_time. The difference in distributions reflects both operational speed and architecture."
- "Anchor asymmetry: Polymarket's 2h UMA challenge window is protocol-enforced: no market can resolve in under 2h on the clean path. Kalshi has no such floor; traditional sports and politics markets settle in minutes to hours after close_time. The difference in distributions reflects both operational speed and architecture."
- "Categories: sports, politics, crypto, other, consistent across venues. Per-category rows are the honest unit of comparison because market types run different resolution windows."
- "Disputes (Polymarket only): a DisputePrice before resolution marks the market disputed. Disputed delays land in the disputed series and are excluded from the main category rows."
- "Pending backlog (Polymarket only): markets past their scheduled endDate with no onchain resolution, polled from Gamma every cycle."
- "Listener: 45s incremental Polygon log polling with a 7-day chunked backfill on restart. Kalshi poller ticks every 5 min. Both coexist in the same process."

findings:
- "Polymarket across all markets: median onchain resolution delay {{p50:polymarket-all}} from first proposal to resolution, p99 at {{p99:polymarket-all}}. The within 2 hours share is in the table above, measured, and does not match the 93 percent figure that circulates without a methodology."
- "Kalshi across all markets (excluding auto-generated parlays): median resolution delay {{p50:kalshi-all}} from scheduled close_time to settlement_ts. Kalshi resolves internally no onchain oracle, no mandatory challenge window. The difference vs Polymarket's median reflects both operational speed and Polymarket's protocol-enforced 2h minimum."
- "Kalshi across all markets (excluding auto-generated parlays): median resolution delay {{p50:kalshi-all}} from scheduled close_time to settlement_ts. Kalshi resolves internally: no onchain oracle, no mandatory challenge window. The difference vs Polymarket's median reflects both operational speed and Polymarket's protocol-enforced 2h minimum."
- "Categories are not comparable on a single median: sports, crypto and politics markets run different resolution processes on each venue."
- "Disputes (Polymarket only) are rare but expensive: disputed markets carry materially longer delays than the clean path."

Expand Down
2 changes: 1 addition & 1 deletion benchmarks/pm-ws-latency.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ methodology:

findings:
- "Polymarket's CLOB WebSocket connects and delivers the first orderbook snapshot in {{p50:polymarket}} p50 (24h, all regions). This is the startup cost a new subscriber pays to go from a fresh dial to live market data."
- "Kalshi's WebSocket ticker channel is delta-only: it does not send a market snapshot on subscription. The 'connect-to-snapshot' timing for Kalshi measures the time from dial to the first incremental price update, not to a full snapshot. On an active market this is typically 1060s and reflects market activity level as much as connection speed. The inter-arrival and disconnect metrics below are more representative of the real-time feed health."
- "Kalshi's WebSocket ticker channel is delta-only: it does not send a market snapshot on subscription. The 'connect-to-snapshot' timing for Kalshi measures the time from dial to the first incremental price update, not to a full snapshot. On an active market this is typically 10 to 60s and reflects market activity level as much as connection speed. The inter-arrival and disconnect metrics below are more representative of the real-time feed health."
- "Inter-arrival time on the feed (the steady-state update rate on an active market) is published as a metric panel below for both venues. The faster the inter-arrival, the more granular the real-time picture a subscriber gets."

disclaimer: "Connect-to-snapshot includes Cloudflare edge latency and routing from each probe region. Numbers vary with network conditions and market activity. This bench measures observed end-to-end startup time, not venue-side processing time alone."
Expand Down
2 changes: 1 addition & 1 deletion src/lib/pm-stats.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ function promUrl(): string | null {
* worker after every tierA sweep. Bump the suffix if the summary shape
* changes so a stale-shape blob can never deserialize into a misaligned
* payload. The cohort-snapshot module appends its own `:v1`. */
export const PM_HUB_KEY = "pm-hub";
export const PM_HUB_KEY = "pm-hub-v2";

/**
* Fetch the venue + data feed cohort in one Promise.all fan out. Returns
Expand Down
Loading