Opal LogoOpal

Solana-native optimistic oracle

Stake Your Truth

Post a claim, back it with USDC, and let it settle as true on its own. Anyone who disagrees pays to challenge, and the truth is decided in the open.

3Terminal outcomes·2Dispute layers·USDCSingle asset·1 = 1Vote weight·67%Supermajority

How it works

Resolution advances in three layers

01Assert

Post statement & bond. Default answer: True.

02Dispute

First dispute opens the LLM round.

03Escalate

Second dispute opens private voting; settlement on Resolved.

State machine

State defines the answer

One state field tells integrators the current answer, what is still open to dispute, and when settlement is safe.

LIVENESS

Asserted

Default answer: TRUEChallengeable until the liveness deadline.
INTERMEDIARY

PendingLLM

Answer: pendingFirst dispute accepted; awaiting the LLM verdict.
LIVENESS

AssertedLLM

Answer: LLM outcomeChallengeable until the challenge deadline.
INTERMEDIARY

PendingVote

Answer: under challengeSecond dispute accepted; vote round initializing.
INTERMEDIARY

Voting

Answer: under challengePrivate USDC-staked vote is live.
TERMINAL

Resolved

Outcome is setIrreversible. Integrators can settle.
AssertedResolved (True)Liveness expires with no dispute
AssertedLLMResolved (LLM outcome)Challenge window expires

Integrator rule: ignore outcome unless state == Resolved. Every earlier state is a live claim, not a settlement signal.

Instruction flow

From statement to settlement

Every escalation is one permissioned-or-permissionless instruction on the program. No bots, no committees on the happy path.

Undisputedcreate → finalize
2calls
One disputecreate → dispute → LLM → finalize
4calls
Full escalationcreate → dispute → challenge → vote → finalize
7calls

create_assertion

01 / 07

The statement and its Resolution Spec hash go on-chain, the USDC bond is locked, and the liveness clock starts. Default answer: True.

dispute_assertion

02 / 07

A bonded dispute during the liveness window moves the assertion to PendingLLM and opens the LLM resolution round.

submit_mock_llm_resolution

03 / 07

The LLM verdict is posted and verified on-chain. The assertion becomes AssertedLLM and the challenge window opens.

challenge_llm_resolution

04 / 07

A second bonded dispute challenges the LLM outcome, records what was challenged, and initializes the vote round.

open_vote

05 / 07

Vote state is delegated to the private rollup and the voting window is set. The assertion moves from PendingVote to Voting.

cast_vote

06 / 07

Voters lock USDC behind an outcome with linear weight: one staked USDC is one vote. Ballots stay sealed while the window is open.

finalize_*

07 / 07

finalize_undisputed, finalize_llm_resolution, or finalize_vote_resolution sets the terminal outcome, settles every bond, and closes the assertion.

Economics

Every answer is collateralized

Truth-telling is the only strategy that doesn't lose money. Wrong assertions and wrong disputes forfeit their bonds to whoever corrected them.

01

Bond to assert

Every statement is posted with a USDC bond. If nobody disputes it before the liveness deadline, it finalizes True and the bond comes back.

02

Stake to dispute

Disputing costs a matching bond and routes the statement to LLM resolution. An incorrect dispute is slashed; a correct one is paid from the loser.

03

Escalate to a vote

Challenging the LLM verdict opens a private USDC-staked vote with linear weight. An outcome needs a supermajority to become final.

04

No-fault settlement

If the statement cannot be decided under its Resolution Spec, it settles Unresolvable: nobody is slashed and every bond is returned.

For integrators

One account. The state is the answer.

01

Trust only Resolved

Every earlier state is an open claim. The state machine tells you exactly what is still challengeable.

02

One account to read

Current state, round pointers, dispute count, and the final outcome live on a single assertion PDA.

03

Spec-pinned answers

The account stores the hash of the Resolution Spec, the document that defines how the statement resolves.

04

Corrections are new assertions

A resolved assertion is never mutated. If the world changes, a new assertion carries the correction.

AssertionAccount
PDA
state:Resolved// only Resolved is terminal
outcome:True// meaningful once Resolved
dispute_count:2
liveness_deadline:1782050400
llm_resolution_round:→ LlmResolutionRound
vote_resolution_round:→ VoteResolutionRound
auxiliary_hash:0x9f2c…b310// pins the Resolution Spec
getAccountInfo → decode → trust state

Audiences

Built for integrators, challengers, and protocol operators

Prediction markets

Settle subjective markets only after the assertion reaches Resolved. Read the state machine and wait for the terminal outcome.

Disputers

Challenge optimistic defaults or questionable LLM outputs for direct economic upside. The protocol rewards accurate disputes.

Builders

One assertion PDA exposes current state, round pointers, dispute count, and the final answer for downstream apps.

Future operators

The MagicBlock integration is reserved in accounts, but v1 does not require it to be live.

FAQ

Common questions

A natural-language statement posted with a USDC bond and a Resolution Spec that defines how it should be judged. It defaults to True and anyone can dispute it during the liveness window.

Default true · Disputable · Final at Resolved

Post a statement.
Let the market check it.

Assertions finalize on their own unless someone pays to disagree. Every escalation makes the answer more expensive to fake.

Opal logoOpal

Resolution you can rely on

A Solana-native optimistic oracle for natural-language statements.

Default TrueDisputableFinal at Resolved
Built for verifiable outcomes
Solana Devnet2026