A solver posts a bond in FLR, claims a cross-chain job, and executes it on another chain. They get paid only if Flare's Data Connector proves the payment happened — verified on-chain, against a Merkle root the network agreed on. No valid proof, no payment, and the bond is slashed. The contract never takes the solver's word for anything.
Below, you can forge a proof yourself and watch the deployed contract reject it. No wallet, no gas, no signup — your browser talks straight to Coston2.
Six steps. Step 6 is the one that matters.
This is the whole thesis in one button. Tamper with a real attestation and submit it to the live contract on Coston2.
Starts from the genuine attestation of a real XRPL testnet payment (voting round 1 437 267).
Change anything you like, then submit. Your browser ABI-encodes the call and sends
eth_call to a public Coston2 node — a real execution against the deployed
contract that costs nothing and changes nothing.
Everything here will be refused, including the untouched proof — and that is the honest result. This proof was already spent: it settled job #40 in this transaction, which paid the solver and released their bond. A spent proof cannot be replayed against another job — that refusal is the replay protection doing its job. So the bench shows you the rejection half of the design live; the acceptance half is the transaction linked above, already on chain.
finding a claimed opportunity…
Every rejection you see is produced by the contract at
0x52B11A47d832F43Bc35e014f95dA93c340F5A155, not by this page.
This page cannot decide the answer — it only formats what the chain returned.
Read from Coston2 when you loaded this page. Nothing here is hardcoded.
| # | Status | Value (drops) | Solver | Reward pot |
|---|---|---|---|---|
| loading from chain… | ||||
Four criteria, each demonstrated by a real transaction or a real on-chain refusal. Every hash below is clickable — check them yourself rather than taking this page's word.
An under-bonded solver is refused; a sufficiently bonded one is allowed. The refusal reverts
with InsufficientFreeBond.
claim tx 0xbb8b6e8c…3d4db0
A real XRPL testnet payment, attested by the Data Connector, verified on-chain, and settled.
The solver was paid and the bond released. Opportunity #40 reads SETTLED, its
reward pot went from 0.1 FLR to zero, and the fee split paid 100% to the solver,
0 to the protocol, 0 to LPs.
settle tx 0x6e8e1826…d2dd45
XRPL payment 0xbea3bd28…ded8a6
Two opportunities passed their deadline with no valid proof. Both read DEFAULTED
and the full locked bond moved to the slash destination. Check them yourself — read
statusOf(6) and statusOf(26) on the registry and you get
5, the defaulted state.
opportunities #6 and #26 · registry 0x2327102e…19cafd
Five forgeries, all aimed at a genuinely claimed opportunity, all refused on-chain:
a wholly fabricated proof, a rewritten amount, a rewritten reference, a rewritten sender,
and the genuine proof replayed against a different job. Four died at
ProofRejectedByFdc — the Merkle verification — and the replay died at
PaymentReferenceMismatch. You can reproduce any of them in the bench
above.
The easy version of this system pays the solver when an off-chain service says the job was
done. That service is then the thing you have to trust, and the economic security is
decorative. Here the settlement contract fetches Flare's FdcVerification
contract through the canonical registry and checks the Merkle proof itself. A solver who
lies produces a proof that fails verification, and the deadline then slashes their bond.
The bench above exists so you don't have to believe that paragraph.
After the Merkle verification passes, the contract still refuses the proof unless it binds to this exact job:
| Check | Rejects with |
|---|---|
| Merkle proof verifies against the agreed root | ProofRejectedByFdc |
| It is a Payment attestation from the expected source chain | WrongAttestationType / WrongSourceId |
| The payment succeeded and was one-to-one | PaymentNotSuccessful / PaymentNotOneToOne |
| Reference binds this job id and this solver | PaymentReferenceMismatch |
| Amount delivered covers the job value | InsufficientPaymentAmount |
| Sent by the solver's registered account, to the protocol's account | WrongPaymentSender / WrongPaymentRecipient |
| Paid after the claim and before the deadline | PaymentBeforeClaim / PaymentAfterDeadline |
Holds FLR bonds. Lock, release and slash are callable only by the registry — there is no owner drain path.
Posts, claims and expires jobs. Enforces the bond gate at claim time.
Verifies the proof and pays or slashes. The fee split is immutable at 0 bps.
Every read this page makes is a plain JSON-RPC call to a public Coston2 node, with no key. For example, the status of opportunity #40:
…
Status codes: 0 none · 1 open · 2 claimed · 3 settled · 4 expired · 5 defaulted.