Cryptolean
// Methodology · uma

UMA's DVM: who settles disputes, with what stake, which way, and when slashed.

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.

Definition and failure modes

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.

WHY NOT THE SUBGRAPH (kept, because it cost a day to establish)

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.

THE CONTRACTS

VotingV2   0x004395edb43EFca9885CEdad51EC9fAf93Bd34ac   from block 16,697,232
                                                        (2023-02-24)
Voting     0x8B1631ab830d11531aE83725fDa4D86012eCCd77   the predecessor

Every 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.

EVENT SIGNATURES ARE COMPUTED, NOT REMEMBERED

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.

WHAT THE VOTE VALUES MEAN

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.

Version history

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.

  1. uma-v12026-08-06InitialCurrent

    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.

Charts drawn with it

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.

Current version
uma-v1
Versions on record
1
First dated
2026-08-06
Restatement policy
Never moved
Never restated. Every bump on record added output without redefining what was already there.
Charts
0
Source
src/resolution/uma.py
Public functions
caller_concentration, decode_logs, delegation_blocs, herfindahl, request_concentration, slash_evidence, slash_reasons, topic0, vote_label, voter_agreement, voter_concentration, voter_evidence
Machine-readable
catalog.json · llms.txt