Current definition uma-v1. Charts stamped with it were computed by src/resolution/uma.py, and every value plotted for a past date could have been computed on that date.
Zone 11 has held dispute EVENTS since the Gamma pull — 758 markets contested at least once. It has never held the VOTING. This module is that half: the VotingV2 event log on Ethereum mainnet, read directly.
docs.uma.xyz/resources/subgraph-data points at The Graph, and every UMA doc page and tutorial still links to the hosted service. Measured 2026-08-05:
api.thegraph.com/subgraphs/name/umaprotocol/mainnet-voting
HTTP 301 -> error.thegraph.com/apierror.json. The hosted service is
sunset.
gateway.thegraph.com/api/subgraphs/id/<id>
HTTP **200** carrying {"errors":[{"message":"auth error: missing
authorization header"}]}. Note the 200: a fetcher that checks the status
code and not the body caches that as a dataset.The decentralised gateway needs a Graph Studio key, and Graph Studio authenticates with a crypto wallet. That is a wallet to reach a convenience layer over data that is public. The contract is public, eth_getLogs is public, and the subgraph was only ever an index of the same events — so this module reads them at the source. SPEC.md Appendix B's "auth: none" row was true right up until it was not.
VotingV2 0x004395edb43EFca9885CEdad51EC9fAf93Bd34ac from block 16,697,232
(2023-02-24)
Voting 0x8B1631ab830d11531aE83725fDa4D86012eCCd77 the predecessorEvery row records contract and every table records its block range. The two schemas are not identical — V2 added VoterSlashed per request, staking, and delegation — so they are never merged silently.
V1 is not read, and does not need to be. Zone 11's 758 disputed markets settle between 2025-03-30 and 2026-08-05, because Gamma only populates umaResolutionStatuses from 2025 onward. VotingV2 has been live since 2023-02-24. Zero disputed markets in the corpus predate it, so V2 alone covers every dispute this repo can observe — measured, not assumed. If the corpus ever gains earlier disputes, V1 becomes necessary and its rows must stay in their own table.
EVENTS below carries ABI type lists, and topic0() hashes them with src/fetch/keccak.py at call time. The signatures came from @uma/contracts-node's VotingV2.json artifact, and all ten topic0 values in a live 4,220-block sample matched an entry here. A topic0 copied from a blog post decodes the wrong event's fields into the right-looking columns and nothing anywhere errors.
price on a VoteRevealed is an int256 in UMA's 18-decimal fixed point. For the YES_OR_NO_QUERY identifier that Polymarket uses, 0 is NO, 1e18 is YES, 0.5e18 is UNRESOLVABLE, and type(int256).min is "too early". vote_label maps those and returns the raw value for anything else rather than guessing — other identifiers use the same field for a numeric answer.
Newest first. Each entry says what changed and whether values that had already been published moved with it, followed by the sentence from the module that decided the verdict.
VotingV2 reveals, slashing and resolutions read straight from mainnet logs. Replaces the subgraph route entirely.
The first version of this metric. There is no earlier definition to restate.
None on the site today. The definition is versioned and exported, and no chart currently carries its stamp — either a chart is missing from the export or the module is no longer drawn. The catalogue reports the gap rather than hiding the metric, because a definition nobody can see the output of is exactly the thing a reader should be told about.