ProofCourt logoProofCourt
ProofCourt

The escrow that investigates before it pays

A decentralized arbitration court for natural-language escrow conditions. An AI jury independently investigates each claim — the claim itself is never evidence — and settles RELEASE, PARTIAL or REFUND on-chain, with an appeals process.

Built on GenLayer Multi-LLM consensus On-chain audit log Payable fund-locking 11 local tests green
View the contract Reproduce the demo

How a dispute is settled

Escrow litigation, not an oracle call: standards of proof in code, adversarial validation, and an appeals loop that sharpens vague conditions until they are decidable.

1 · LockPayer creates an escrow with a plain-language condition. Funds are locked from their wallet (payable).
2 · ClaimBeneficiary files the claim. Links they provide are fetched and marked UNTRUSTED.
3 · InvestigateA leader model independently gathers evidence; validators on different LLMs re-derive the verdict and vote.
4 · VerdictRELEASE pays the beneficiary, REFUND returns to the payer, PARTIAL keeps funds locked.
5 · AppealPARTIAL rewrites the condition into strict atomic checks, then the court resolves again.

Three AI roles, one standard of proof

No single model decides anything. Every outcome requires independent agreement before money moves.

Leader

Investigates the claim: block-explorer traces, API responses, timestamps, amounts, recipients. Runs an explicit anti-deception checklist (claimant-hosted links, wrong direction, out-of-context logs).

Jury

Validators running different LLM policies re-derive the verdict from their own investigation — ignoring the leader's summary — and vote. A low-confidence RELEASE is downgraded to PARTIAL automatically.

Appeal judge

Rewrites a failed condition into strict, atomic, binary checks resolvable from on-chain or API data, removing every judgment call.

"Cannot verify" is PARTIAL, not REFUND. Verified live on GenLayer: the same unverifiable claim produced PARTIAL 0.25 from one model and REFUND 0.98 from another — exactly why ProofCourt requires consensus instead of trusting a single LLM.

— observed on-chain, GenLayer Studio full-consensus run

Design decisions that matter

Reproduce the demo

  1. Open GenLayer Studio and paste contract.py from the repository → Deploy new instance.
  2. Create an escrow: condition "Bitcoin block 800000 exists on the Bitcoin blockchain and was mined before 2025", your address as beneficiary, Value = 100.
  3. File a claim: submit_claim — the leader fetches evidence and the jury votes (1–2 min).
  4. Read the verdict: get_escrow + get_verdict_log — full reasoning, confidence and evidence, on-chain.
  5. Test the appeal: an unverifiable condition returns PARTIAL; appeal rewrites it into atomic checks and the court resolves again.