Docs
Contents

Security model

What each party can and cannot do, what the ledger enforces for you, and what your app must get right. The full analysis is in ../docs/design-v0.3.1.md ("Trust model", "Invariants the ledger enforces"); the latest internal review is ../docs/review/close-pot-actions.md.

Who can do what

PartyCanCannot
Operators (2 of 3)Stall deposits and payouts. A colluding quorum can sign a false credit (reconciliation then freezes the app) or spend the vault: the design has no bound on that yetMove a ledger balance; as honest operators, pay a settlement anywhere but the committed address, or pay one twice (every payout spends the vault's head note); sign anything for a ledger whose code differs from their pin
One operatorFreeze an app as a guardian (a threshold unfreezes)Sign alone; unfreeze
Rollup validatorReorder or withhold rollup transactions; commit wrong seat amounts for pots it holdsChange who sits in a pot (the receipt stays on Solana); touch another pot; keep a pot forever (refund after the deadline)
Your appDecide every outcome in its own pots; choose when to close themCreate value; add or replace a player; move a balance without the player's signature; touch another app; change a payout address; block an exit of unstaked funds
Ledger adminRegister settings within program caps, activate apps, set caps, pause; rotate the attestor key (bounded by reconciliation); hand over the admin roleUnfreeze; change guardians; move funds
A player's keyPlay its balance, request an exitRedirect a payout

What the ledger guarantees your players

What your app must get right

The ledger checks that seats add up, not that the right seat won. Review your app for:

Known limitations

From the internal reviews; none breaks the guarantees above.

AreaLimitation
Up/DownWhoever settles still chooses among the prices published in the 2 s after expiry (a few updates)
AuctionBids are public after the reveal; a seller can bid through a second key and decline to reveal (paying the penalty to the other bidders), which acts as a hidden reserve
Ledgermove_seat accepts an amount of 0; request_exit has no undo; a new app's deposit cap is 0 until set; deposit IDs are global across apps
GatewayRegistering an intent can store it yet return an error; an unknown app may answer 503 before 404
DeploymentThe testnet's three operators run on one host with a dealer-generated key; production needs separate hosts and providers and a distributed key generation
ReviewThe ledger has had internal review only; an external review is planned before mainnet