Appearance
Economics: fees & coverage
The protocol is deliberately not a business in the middle. It escrows, it routes, it slashes — it never holds.
What a request costs
| Component | Amount | Where it goes |
|---|---|---|
| Flat request fee | network parameter (mainnet: 1 000 000 lamports = 0.001 SOL; devnet: 150 000) | escrowed inside the request account; released to the delivering prover's operator on fulfill; returned to the payer at close otherwise |
| Coverage premium | premium_bps of your at-risk amount (mainnet: 25 bps; devnet: 2) | same escrow, same routing — it prices the bond capacity your guarantee reserves |
| Account rent | ~0.004 SOL, reclaimable | temporary deposit for the 460-byte request account; returned at close |
| Terms acknowledgment | ~0.0015 SOL, once per wallet | rent for the on-chain acknowledgment record |
100% of fees go to the prover that delivered. There is no protocol treasury; there is nothing to govern, drain, or trust.
The free tier: at_risk = 0
Zero at-risk is legal and means randomness only, no delivery guarantee — you pay only the flat fee, and if a prover is slow you simply retry (and reclaim() the stranded rent later). This is the right default for consumer-facing apps and everything the web SDK does out of the box.
The delivery guarantee: at_risk > 0
Declaring at_risk_lamports buys an exact, automatic promise:
- The amount is reserved against the prover's bond for your request's entire window — the bond invariant (
bond ≥ reserved) is enforced on every mutating path, so coverage is never nominal. - If the window passes unfulfilled, anyone can trigger
slash: exactly that amount moves from the bond to yourcomp_dest. Not "up to". No committee. No appeal. - Size it at or above the maximum output this randomness can trigger — it is your compensation ceiling, and nothing warns you if you under-buy.
Two protections you inherit automatically:
- A single request cannot reserve more than a capped share of any prover's bond, so one consumer cannot starve everyone else.
comp_destmay not be the prover, the request, or the prover's operator — a prover cannot slash itself into a profit.
Getting money back
close_request(or the web SDK'sreclaim()) returns rent and unspent fee escrow to the payer once a request is terminal.- Slash compensation lands directly at your
comp_dest— no claim step.
The Terms gate
Every value-bearing entry point requires the payer wallet to hold a current on-chain acknowledgment of the protocol Terms of Use — a one-time transaction per wallet, re-required only if the terms are revised. The acknowledgment must echo the hash of the exact published document, which is what makes it meaningful; the SDKs show the full text and refuse to acknowledge anything that does not hash to the on-chain value.
Resolution paths — fulfill, slash, close_request — are deliberately not gated: an un-acknowledged wallet can always be made whole, just never newly exposed.