Predge Settlement Risk · sample pack

How a prediction market settled, step by step, with proof.

A Settlement Risk evidence pack is a dated record of how one prediction market settled. It puts every step in order: the rules at creation, each later change and the account that posted it, each oracle proposal and dispute, the token-holder vote, and outside events such as a regulatory filing. Every step links to a public source, and the whole pack is signed, so you can check that it was not edited. When the same event trades on another venue, the pack sets the two rule texts side by side. It is built for desks that trade Polymarket and Kalshi, for prediction-market funds and for law firms. Start with a 6-week paid pilot for $690, paid upfront. After that, packs for the markets you trade cost $490 a month. A one-off forensic pack on a single market is priced on request.

2,666Polymarket markets disputed at least once
323disputed twice or more, which sends the outcome to a UMA token-holder vote
26,970bulletin-board updates posted on-chain to Polymarket questions

Counted from Polygon event logs, 1 January to 2 October 2026. How we counted.

Case 1 · Polymarket · 31 May 2026

Strategy (MicroStrategy): the timing clarification came after the deadline

The market asked: "MicroStrategy sells any Bitcoin by May 31, 2026?" Strategy's own filing says it sold 32 BTC between 26 and 31 May. The market settled No. Here is the order of events.

MarketPolymarket 2169995
OutcomeNo, settled 2026-06-04 00:34:19 UTC
Volume, as Polymarket reports it$375.8 million

"This market will resolve to "Yes" if MicroStrategy sells any of its Bitcoin by 11:59 PM ET on the date specified in the title. Otherwise, this market will resolve to "No"."

Rules at creation, stored on-chain on 5 May 2026 (creation tx). They name "information from MSTR and on-chain data" as the primary source. They say nothing about when a sale must be confirmed.

Timeline (UTC)

  1. Market created on Polygon. The rules above are written into the creation transaction and the oracle request. Proposal bond: 500 USDC.tx 0xdfad…b18c
  2. Strategy sells 32 BTC, according to its own 8-K. Its bitcoin figures are stated as of 31 May, 4:00 PM ET.8-K text on SEC EDGAR
  3. Deadline: 11:59 PM ET on 31 May.
  4. First proposal: No.tx 0x2ff8…a34c
  5. First dispute. The question is reset and a new oracle request opens.tx 0xc5e6…5aab
  6. Second proposal: No.tx 0xf2f9…4aff
  7. Second dispute. The outcome now goes to a vote of UMA token holders (the DVM).tx 0xbcbd…377e
  8. SEC EDGAR accepts Strategy's 8-K (08:00:16 ET). It reports 32 BTC sold from 26 to 31 May.EDGAR filing 0001193125-26-249768
  9. Bulletin update 1, from a Polymarket operator account: "If a clarification is to be issued, it will be at 1:00 PM ET on June 1."tx 0xbd0b…ffbd
  10. Bulletin update 2, same account: "Confirmation achieved outside of the market's time frame does not qualify."tx 0x739e…4239
  11. UMA DVM round 10303 resolves No: 98.61% of revealed UMA tokens voted No (607 reveals).tx 0xc50f…7f78 (Ethereum)
  12. Market settles No on Polygon. No shares pay $1.00, Yes shares pay nothing.tx 0x9ab3…31da

Who posted the clarifications

Both updates came from 0xf43d…369d, a Polymarket operator account that also creates markets. It posted 8,852 bulletin updates between 1 January and 2 October 2026. This question was created by a different operator account, 0x9143…e5c5, which Polymarket's API lists as the market's submitter.

The market's rules say that updates "made by the question creator" through the bulletin board should be considered. When asked for this question's updates from the creator, the adapter contract returns none.

Why it matters

  • The rule at creation asked whether a sale happened by the deadline. It did not say when the sale had to be confirmed.
  • Strategy's own filing puts the sale inside the window. The filing was accepted 8 hours after the deadline.
  • The sentence that ruled out late confirmation went on-chain 13 hours after the deadline and 5 hours after the filing. By then both disputes had been filed, and the outcome was already headed for the DVM vote.
  • The price followed each step. YES was about 12 cents before the filing, 81 cents at 12:20 UTC, 55 cents at 16:50 UTC and 0.05 cents at 17:10 UTC (Polymarket price history, 10-minute points).
  • Every step was public and timestamped. The pack puts them in one place, in order, with a link to each source.

Case 2 · Polymarket and Kalshi · 28 February 2026

One event, two venues: $1.00 and $0.02

Both venues listed a market on Ali Khamenei leaving power by the end of February 2026. His death was reported on 28 February. Polymarket's rules did not mention death. Kalshi's rules did. That one clause decided the payout.

Polymarket

"Khamenei out as Supreme Leader of Iran by February 28?"

$1.00
per Yes share · settled 2026-03-04 01:05:25 UTC

Rule at creation: Yes if he is removed from power "for any length of time". That covers the case where he "resigns, is detained, or otherwise loses his position or is prevented from fulfilling his duties". There is no death clause.

Both Yes proposals were disputed on 28 February. UMA DVM round 10257 voted Yes with 99.997% of revealed UMA tokens (632 reveals).

Kalshi

"Will Ali Khamenei leave office before 2026-03-01T15:00:00.000Z?" (KXKHAMENEIOUT-AKHA-26MAR01)

$0.02
per Yes contract · settled 2026-03-01 03:19:26 UTC

Rule: "If Ali Khamenei leaves solely because they have died", payouts are based "upon the last traded price (prior to the death)".

Kalshi settled the contract at the last traded price before the death. It also refunded fees and reimbursed shares bought after the death (The Verge, 1 March 2026).

Timeline (UTC)

  1. Polymarket market created. Its rules are stored on-chain.tx 0x30d3…fb39
  2. Polymarket bulletin update: in case of ambiguity, the market "may remain open until a consensus of credible reporting can determine whether the resolution criteria was met".tx 0xaadb…962a
  3. Yes proposed on Polymarket. Disputed at 22:05:05.proposal 0xe961…7e97dispute 0xd3fa…2301
  4. Yes proposed again. Disputed at 23:24:57, so the outcome goes to the UMA DVM vote.proposal 0xb592…d79fdispute 0xfdb8…19ac
  5. Kalshi settles its "before 1 March" contract at $0.02 per Yes contract.Kalshi API record
  6. UMA DVM round 10257 resolves Yes: 99.997% of revealed UMA tokens.tx 0x0e6f…2125 (Ethereum)
  7. Polymarket settles Yes. Each Yes share pays $1.00.tx 0x48a4…d1a7

Why it matters

  • Traders who treated the two contracts as one event held two different bets. A pair opened before the event that looked hedged, Kalshi Yes plus Polymarket No, paid $0.02 in total instead of $1.00.
  • The two venues also settled about 70 hours apart.
  • The difference was written in the published rules. Reading the two rule texts side by side shows it. A cross-venue pack makes that comparison for every pair you hold.

Sample record

The Strategy market as a signed production record

This is the live settlement-risk record for the market in Case 1, as api.predge.io/v1/settlement-risk/2169995 returned it, signed with Predge's production key. The attestation.canonical field holds the exact bytes that were signed with ed25519. The attestation.payload field is the same data, parsed. Anyone can check the signature without contacting us.

Signed with Predge's production key

Key id 13fa3d18a369e6c7, public key 13fa3d18a369e6c71bf941563ba47822b30182273d5106a0e8fb61c5016352d9, listed as active at api.predge.io/.well-known/predge-keys.json. The signature covers attestation.payload: the chain facts and our risk reading. Records issued after the next API release also carry envelope_signature, which covers the whole envelope.

The pack also holds the raw Polygon JSON-RPC requests and answers that reproduce those facts: block numbers, block hashes, the dispute transactions' receipts and logs, and the getter results. That part is public chain data. It is not signed; re-run any request on any Polygon node.

The timeline, rules, vote figures and findings in Case 1 above are our research on public records. They are not part of the signed record.

Excerpt

Shortened for reading. "…" marks the parts left out. The full file holds the whole envelope, the checks run when it was generated and the full RPC transcript.

{
  "pack_format": "predge-evidence-pack-v2",
  "pack_id": "pm-2169995-v2",
  "generated_at": "2026-10-07T22:14:51Z",
  "signed_by": {
    "kid": "13fa3d18a369e6c7",
    "public_key": "13fa3d18a369e6c71bf941563ba47822b30182273d5106a0e8fb61c5016352d9",
    "role": "attestation",
    "key_set": "https://api.predge.io/.well-known/predge-keys.json",
    "key_set_fetched_at": "2026-10-07T22:14:21Z"
  },
  "attestation": {
    "version": "predge-attest-v1",
    "issuer": "predge.io",
    "algorithm": "ed25519",
    "kind": "settlement-risk",
    "public_key": "13fa3d18a369e6c71bf941563ba47822b30182273d5106a0e8fb61c5016352d9",
    "canonical": "… 1,236 characters: the exact bytes that were signed …",
    "signature": "20257295a08f2e28f670f211feecb98b9511be742d93b6273d92b0431d3b1c19f51db7937a5da704eba6583f2e24c8ae0fed0768efda3fcf017680793205020c",
    "payload": {
      "version": "predge-attest-v1",
      "issuer": "predge.io",
      "kind": "settlement-risk",
      "platform": "polymarket",
      "chain": "polygon",
      "market_id": "2169995",
      "condition_id": "0x3733a1b647e7364095736ab0966465d896a84cf3b6bc1695ca1f26c3239b3868",
      "uma_question_id": "0x0382b71b4df8e161d7947966fef8e5f6cc2d29b0285f87761e569b043e68f83d",
      "adapter": "0x65070be91477460d8a7aeeb94ef92fe056c2f2a7",
      "oracle": "0x2c0367a9db231ddebd88a94b4f6461a6e47c58b1",
      "uma_state": "settled",
      "resolved_on_chain": true,
      "paused": false,
      "dispute_count": "2",
      "open_dispute": false,
      "sent_to_uma_vote": true,
      "current_proposal": null,
      "disputes": [
        {
          "disputed_at": "2026-06-01T04:12:20Z",
          "tx": "0xc5e63a7828b193232c33cb93db44b2f1c05f017c4bfe16d54078be560ae25aab",
          "disputed_proposal": "No"
        },
        {
          "disputed_at": "2026-06-01T04:53:01Z",
          "tx": "0xbcbd0d858e43a073bd64b334577c088b72e6dde8b1a9184de658108b0d2a377e",
          "disputed_proposal": "No"
        }
      ],
      "bulletin_board_count": "2",
      "latest_bulletin_board_update": {
        "posted_at": "2026-06-01T17:00:16Z",
        "poster": "venue_operator",
        "kind": "clarification"
      },
      "onchain_resolution": {
        "outcome": "No"
      },
      "risk_level": "resolved",
      "recommendation": "resolved: the on-chain resolution is final (No); nothing is left to settle.",
      "checked_at": "2026-10-07T22:13:17Z",
      "issued_at": "2026-10-07T22:14:21.191Z"
    }
  },
  "rpc_evidence": {
    "head_block": {
      "number": "95137377",
      "hash": "0xc99dddc4729a49d146138972aa886c87e2a542eaef1e6b37ac966906c030acb2",
      "timestamp_utc": "2026-10-07T22:14:25Z"
    },
    "recomputed_matches_signed": "… every compared field: true …",
    "dispute_receipts": [
      {
        "tx": "0xc5e63a7828b193232c33cb93db44b2f1c05f017c4bfe16d54078be560ae25aab",
        "block_number": "87741382",
        "block_hash": "0x462a6e9ac0898a6763e766b273e1f10cb93c3ade9c33a97159bcaae8b73b640d",
        "block_timestamp_utc": "2026-06-01T04:12:20Z",
        "status": "0x1",
        "time_matches_signed": true
      },
      {
        "tx": "0xbcbd0d858e43a073bd64b334577c088b72e6dde8b1a9184de658108b0d2a377e",
        "block_number": "87742777",
        "block_hash": "0x101ec2e2ac11a2c126c6948dd01087c6e5e5ecc8382e6f5da2a8943e946b1001",
        "block_timestamp_utc": "2026-06-01T04:53:01Z",
        "status": "0x1",
        "time_matches_signed": true
      }
    ],
    "transcript": "… 56 raw JSON-RPC requests and answers …"
  }
}
Show the full file
Loading…

Check it yourself

  1. Download the pack into an empty folder.
  2. Save one of the scripts below in the same folder and run it. The Node script needs Node 18 or later and no packages. The Python script needs the cryptography package. Longer versions with the same checks: verify-record.mjs and verify_record.py.
  3. Every check should print true, including "key published by Predge".
  4. Change any character inside payload or canonical and run it again. At least one check turns false.
  5. Then check the facts, not just the signature. Every dispute transaction in the pack comes with its block number and block hash, and every step on this page links to Polygonscan, Etherscan, SEC EDGAR or the venue.
Node
// verify-pack.mjs  (Node 18 or later, no packages)
// usage: node verify-pack.mjs pm-2169995-microstrategy-may31.pack.json
import { readFileSync } from "node:fs";
import { createHash, createPublicKey, verify } from "node:crypto";

const pack = JSON.parse(readFileSync(process.argv[2], "utf8"));
const env = pack.attestation;
const canon = (v) => v === null || typeof v !== "object" ? JSON.stringify(v)
  : Array.isArray(v) ? `[${v.map(canon).join(",")}]`
  : `{${Object.keys(v).sort().map((k) => `${JSON.stringify(k)}:${canon(v[k])}`).join(",")}}`;
const key = createPublicKey({ format: "der", type: "spki", key: Buffer.concat([
  Buffer.from("302a300506032b6570032100", "hex"), Buffer.from(env.public_key, "hex")]) });

console.log("payload matches canonical:", canon(env.payload) === env.canonical);
console.log("content_hash (sha256):    ", createHash("sha256").update(env.canonical).digest("hex"));
console.log("signature valid:          ", verify(null, Buffer.from(env.canonical), key, Buffer.from(env.signature, "hex")));

// Is the signing key one Predge publishes?
const list = await (await fetch("https://api.predge.io/.well-known/predge-keys.json")).json();
console.log("key published by Predge:  ", list.keys.some((k) => k.active && k.public_key === env.public_key));
Python
# verify_pack.py  (Python 3.8 or later; pip install cryptography)
# usage: python3 verify_pack.py pm-2169995-microstrategy-may31.pack.json
import hashlib, json, sys
from cryptography.exceptions import InvalidSignature
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey

env = json.load(open(sys.argv[1], encoding="utf-8"))["attestation"]
canon = json.dumps(env["payload"], sort_keys=True, separators=(",", ":"), ensure_ascii=False)
print("payload matches canonical:", canon == env["canonical"])
print("content_hash (sha256):    ", hashlib.sha256(env["canonical"].encode()).hexdigest())
try:
    Ed25519PublicKey.from_public_bytes(bytes.fromhex(env["public_key"])).verify(
        bytes.fromhex(env["signature"]), env["canonical"].encode())
    print("signature valid:           True")
except InvalidSignature:
    print("signature valid:           False")
print("key id (kid):             ", env["public_key"][:16], "(Predge production: 13fa3d18a369e6c7)")

Method and limits

How we counted, and what we did not check

  • Market level only. We do not identify traders, proposers, disputers or voters. Vote figures are totals. The only accounts we name are venue operator accounts.
  • Counts come from on-chain logs on Polygon for 1 January to 2 October 2026 (blocks 81,053,171 to 94,850,000). We counted disputes on UMA's Optimistic Oracle V2 and Managed Optimistic Oracle V2 where the requester is one of Polymarket's five UMA adapter contracts, and bulletin-board updates on those adapters. Result: 3,005 disputes on 2,666 markets, 323 markets disputed twice or more, and 26,970 bulletin updates, 99.8% of them from three operator accounts. On 4 October we re-derived every count with separate code: a full re-fetch of the window matched log for log, sample block ranges re-read through a second RPC provider matched, and 20 of 20 sampled final outcomes matched Polymarket's own market data.
  • Times are block times in UTC. The EDGAR time is the SEC acceptance time, 08:00:16 Eastern, which is 12:00:16 UTC. Kalshi figures come from Kalshi's public API, read on 3 October 2026.
  • Not verified: why anyone proposed, disputed or voted as they did, and whether an outcome was right. Trading volumes are shown as the venues report them. Kalshi's reason for the $0.02 settlement comes from its rules, its public market data and public statements, not from its internal records.

Free report

Get a free report on your markets

Send us the markets you hold or plan to trade, on Polymarket, Kalshi or both. Links or market IDs are enough. Ask by Friday 16 October and we will send you a free settlement report on them.

Pricing: a 6-week pilot for $690, paid upfront, then $490 a month. One-off forensic packs are priced on request.