zPredict

Threat model

Funds are 2-of-3, order privacy is 3-of-3. We state this split openly.

ObserverLearnsDoesn't learn
Chain observerThe escrow address exists and makes batched shielded transactionsWho bet, which side, how much, who won
Any single relayer“A 5-unit deposit arrived” (shared viewing key)Orders, sides, prices, positions, which deposit belongs to which payout
2 colluding relayersSame as one for orders; can move escrow funds (FROST 2-of-3)Orders (the MPC needs all 3 to collude)
All 3 colludingEverything—
CounterpartyThat a fill happened at the midpointWho you are, your size beyond the fill
Network observerThat someone talks to a zPredict relayerContents (TLS); your IP if you use Tor

  1. No transparent address in any product path: deposits, payouts, refunds, change.
  2. Deposits only in fixed denominations; never reveal order size.
  3. Payouts batched per epoch to fresh diversified, shielded-only addresses.
  4. Wallet-default fee (ZIP 317) and expiry (ZIP 315); padded actions.
  5. Memos carry no order data and no plaintext tags.
  6. The browser shares orders; each share goes straight to its own relayer on its own host.
  7. Frontend is static and self-hosted: no CDN, no third-party fonts, no analytics. Relayers log no IPs.
  8. Viewing keys never leave the relayers; never shown in the UI or logs.

  1. Judge mode credits a demo balance directly; no testnet deposit happens.
  2. The escrow address shown in Deposit is a placeholder until the FROST DKG runs.
  3. With the local mock relayers, one process combines the shares in the clear instead of running MPC.