Predge is the trust and dispute layer for AI-agent payments. The rails move the money; Predge answers the question they leave open, was the paid job delivered?, with a signed ruling, a refund when the work never arrived, and a bond anyone can take if the ruling cites evidence nobody filed. We do not run a rail. Live today: x402 payments on Base, Solana, Arc, Monad and Algorand, and the arbiter contracts on 16 mainnets including Circle's Arc; the design is rail-agnostic. Prediction markets are the first vertical: the same signed records track settlement risk on Polymarket, where we analyzed 3,005 UMA disputes from 1 Jan to 2 Oct 2026.
Predge sits in the arbiter seat of a refund protocol (the shape of Circle's Refund Protocol and the x402r refund extension). The contract, PredgeRefundArbiter, limits what that seat can do.
sha256(evidence) on-chain under its own key.rule() only accepts evidence that was already filed on-chain.challenge.challenge takes no input from the caller: it compares the hash Predge cited with what the party filed. A ruling that cites evidence nobody filed loses the bond. An honest ruling reverts every challenge and its stake is reclaimable after the window.| Contract | Address |
|---|---|
| PredgeRefundArbiter | 0xA9c39e9aEd452Ee638a10aC10f6A6288C4Ca6E89 |
| MockRefundProtocol (demo target) | 0xf6659f725B3F790287a75f7A83C373E2a3D908aa |
| PredgeValidatorBond v2.1 | 0xfeE8b89eb8aa2499F7025Cd9aaEB13a4b046d0d1 |
| AgentJob (ERC-8183) | 0x8B9589B8F5857dDe080Ac68e8B370c3bA5E74495 |
| PredgeAgentValidator (ERC-8004) | 0xbe601d486D821450F9248ab91891736B1a09699F |
Read on chain: this arbiter (0xA9c3…6E89) has challengeWindow = 86400 s and minBond = 0.05 USDC (Arc's native gas token); bond disputeWindow = 86400 s. The 0.05 USDC floor applies to this earlier Arc arbiter only.
The payer files evidence, the arbiter rules citing exactly that record, the refund lands, and a challenge against it reverts: fileEvidence · rule. Then a ruling that cites evidence nobody filed, and the challenge that takes its bond.
That run (18 Sep 2026) used the previous arbiter version, 0xA1533757…5Ad967. The live arbiter above adds one rule: evidence must be filed on-chain before it can be cited. Source and receipts: predgeAI/predge-arc.
One contract set, one address per contract, on every chain below. Sources verified on Sourcify (exact match).
| Chain | chainId | Links |
|---|---|---|
| Ethereum | 1 | arbiter · source |
| Base | 8453 | arbiter · source |
| BNB Chain | 56 | arbiter · source |
| Arbitrum One | 42161 | arbiter · source |
| Optimism | 10 | arbiter · source |
| Polygon | 137 | arbiter · source |
| Avalanche C-Chain | 43114 | arbiter · source |
| Celo | 42220 | arbiter · source |
| Gnosis | 100 | arbiter · source |
| Linea | 59144 | arbiter · source |
| Unichain | 130 | arbiter · source |
| Sonic | 146 | arbiter · source |
| Arc | 5042 | arbiter · source |
| Monad | 143 | arbiter · source |
| Mantle | 5000 | arbiter · source |
| Robinhood Chain | 4663 | arbiter · source |
| Contract | Address (all 16 chains) |
|---|---|
| PredgeRefundArbiter | 0xb2972B4944Eec83946EB7B23D572AbE04F46E22c |
| PredgeValidatorBond v2.1 | 0x800B5596a8540e752dE8f8a8AF99E927d139A643 |
| PredgeAgentValidator (ERC-8004) | 0x925767fdce6C819F027f55CC50464e3bCdfD2671 |
| AgentJob (ERC-8183) | 0xcBaB4a9FA4d756b4C5e2a18F055d2E0132CE7D1D |
| PredgeSettlement | 0x47BE8a7d461De505723a0Ac1d74982e53f8E412b |
| MockRefundProtocol (demo target) | 0xcaC30945CDF0F963f38972d939e111B87b80Cf79 |
Read on chain, same on all 16 chains: arbiter challengeWindow = 86400 s, minBond = 1015 wei, i.e. 0.001 of the chain's native token (0.001 ETH on Ethereum and the ETH L2s, 0.001 BNB, POL, AVAX, CELO, xDAI, S, MNT or MON elsewhere; on Arc the native token is USDC, so 0.001 USDC). The bond is posted in the native token.
Deployed 18 Oct 2026 from 0x5d016C1B4d7A42eB7c982da1Ae7fFdB958CFCAe9. Receipts per chain: predgeAI/predge-deploy. The Arc table above is the earlier Arc deployment and the full mainnet run; both stay live. Need another EVM chain? Ask us: it deploys in a day.
To start a pilot, write to hello@predge.io or Telegram.
One call tells you whether a Polymarket market's resolution is settled, disputed or waiting on a UMA vote, read live from UMA's Optimistic Oracle and Polymarket's UMA CTF adapter on Polygon. Free, no key, signed.
curl https://api.predge.io/v1/settlement-risk/:market
:market = condition id, numeric market id or slug.
Protocol V2 markets: UMA-resolved ones are read through Polymarket's OracleAggregator (protocol: "v2"); Chainlink- or EOA-reported and atomic neg-risk V2 markets return 422 unsupported_protocol_v2 until supported. A 422 or 404 is never a "no risk" answer.
risk_level: ok (no proposal or dispute), watch, caution (disputed, sent to a UMA vote, or paused), resolved (the on-chain resolution is final).uma_state, dispute_count, every dispute with its tx, sent_to_uma_vote, bulletin-board updates, onchain_resolution.segment_dispute_rate: how often 2026 markets of this kind were disputed, with a 95% interval.attestation: an ed25519 signature over the record, key id 13fa3d18a369e6c7. See Verify.Every Polymarket market disputed on UMA in the last 30 days, with its status (disputed, uma_vote, resolved) and a link to its signed record. Page: data.predge.io/disputes. Embeddable badge: <iframe src="https://data.predge.io/badge?market=ID" width="320" height="96">.
curl https://api.predge.io/v1/settlement-risk/active
GET https://api.predge.io/v1/settlement-risk/:market/estimate
The full signed record plus settlement_estimate. $0.02 per call over x402, in USDC on Base, Solana, Algorand, Arc or Monad; the payment that bought it sits inside the signed record. A 400/404/422/502 is not charged; Protocol V2 markets return 422 unsupported_protocol_v2 here until the estimate supports them. Pilot partners can get a key (x-predge-key header) that unlocks it without payment.
Signed payment receipts follow the open spec in predgeAI/x402-receipts.
For traders. Add up to 10 wallets; every Polymarket market they hold is watched, and each settlement event is sent to your webhook and Telegram: proposal, dispute, uma_vote (disputed twice, the outcome goes to a UMA vote), bulletin_update (clarifications and other notices) and resolution. Every event carries the signed settlement-risk record, the evidence for each dispute. Desk: contact us (hello@predge.io), 14-day free trial.
curl -H "x-predge-key: $DESK_KEY" https://api.predge.io/v1/desk/config
curl -X PUT -H "x-predge-key: $DESK_KEY" -H "content-type: application/json" \
-d '{"wallets":["0x…"],"webhook_url":"https://you.example/hook","telegram_chat_ids":["123456789"]}' \
https://api.predge.io/v1/desk/config
curl -X POST -H "x-predge-key: $DESK_KEY" https://api.predge.io/v1/desk/test
curl -H "x-predge-key: $DESK_KEY" https://api.predge.io/v1/desk/events
Webhook deliveries are signed: x-predge-signature: sha256=HMAC-SHA256(secret, "<x-predge-timestamp>.<raw body>"). Reject timestamps more than 5 minutes off. Non-2xx answers are retried for about an hour. The same key covers 5,000 /estimate calls a month.
Polymarket whale trades, wallet track records ranked by outcome-verified edge, smart-money signals and signed attestations. Pay per call in USDC over x402: no account, no API key.
| Route | Price |
|---|---|
| GET /v1/whales/latest | $0.005 |
| GET /v1/wallets/leaderboard | $0.01 |
| GET /v1/wallets/:address | $0.01 |
| GET /v1/signals/consensus | $0.03 |
| GET /v1/attest/:conditionId | $0.02, signed |
Full route list and prices: api.predge.io · openapi.json · /.well-known/x402. Paid data is delayed 15 minutes.
npx x402-proxy https://api.predge.io/v1/whales/latest?limit=10
Any x402 client works (for example @x402/fetch): request the route, read the 402, pay, retry.
claude mcp add predge-whale-data \
-e BUYER_PRIVATE_KEY=0xYOUR_FUNDED_BASE_KEY \
-e X402_NETWORK=base \
-- npx -y @predge/whale-data-mcp
@predge/whale-data-mcp on npm (source). Paid tools spend real USDC and are hard-capped by MAX_PRICE_USD ($0.05 by default) before any money moves. The free tools (discovery, settlement risk, record verification) need no key. Use a dedicated low-balance buyer wallet.
Every signed record carries an attestation with canonical (the exact signed bytes), signature and kid. Check it offline against Predge's published key, not the key inside the response.
| Key id (kid) | 13fa3d18a369e6c7 |
| ed25519 public key | 13fa3d18a369e6c71bf941563ba47822b30182273d5106a0e8fb61c5016352d9 |
| Key registry | api.predge.io/.well-known/predge-keys.json |
// Node 20+, no dependencies
import { createPublicKey, verify } from "node:crypto";
const PREDGE_KEY = "13fa3d18a369e6c71bf941563ba47822b30182273d5106a0e8fb61c5016352d9";
const r = await (await fetch("https://api.predge.io/v1/settlement-risk/5608010")).json();
const a = r.attestation;
const key = createPublicKey({ format: "der", type: "spki",
key: Buffer.concat([Buffer.from("302a300506032b6570032100", "hex"), Buffer.from(PREDGE_KEY, "hex")]) });
console.log(verify(null, Buffer.from(a.canonical, "utf8"), key, Buffer.from(a.signature, "hex"))); // true
On settlement-risk records (payload_version: "2", since 18 Oct 2026) the signature also covers the market question and slug, the sha256 of every bulletin-board update, and the Polygon block every read was made at (block: number and hash). Every eth_call runs at that block, so an archive node reproduces the record exactly. Since payload_version: "3" the market dates are signed under their Polymarket names: gamma_end_date (the scheduled end set at creation, often stale), uma_end_date and closed_time (when the market actually closed), each ISO-8601 UTC or null, with the raw Gamma strings in gamma_dates_raw. The version 2 field end_date is gone; read gamma_end_date for the same value. Older records stay valid.
The whole HTTP body is signed too, in the x-predge-body-signature header: ed25519 over predge-body-v1, a newline, then the raw body bytes.
const res = await fetch("https://api.predge.io/v1/settlement-risk/5608010");
const body = Buffer.from(await res.arrayBuffer());
const sig = /sig=([0-9a-f]{128})/.exec(res.headers.get("x-predge-body-signature"))[1];
console.log(verify(null, Buffer.concat([Buffer.from("predge-body-v1\n"), body]), key, Buffer.from(sig, "hex"))); // true
Spec: data.predge.io/canonicalization.md, sections 5a and 5b. Python: python3 verify_record.py record.json --body-signature "<header>" (verify_record.py).
No code: paste a record into data.predge.io/verify. For signed x402 payment receipts, the spec, TypeScript library and test vectors are in predgeAI/x402-receipts.
Email hello@predge.io or message us on Telegram: t.me/latcom.