Skip to Content

Privacy Model

This page documents exactly what Lateo hides, what it reveals, and what the trust assumptions are. This is the page your security team should read first.

What an on-chain observer sees

DataVisible?Details
Pool contract addressYesPublic — anyone can see the pool exists
Total pool volumeYesSum of all deposits/withdrawals
Commitment hashesYesOpaque 256-bit values — amount and owner are hidden
Nullifier hashesYesOpaque 256-bit values — which commitment was spent is hidden
Payment destinations (services)Yesx402 service addresses are visible
Payment amountsYesIndividual payment amounts to services
Batch timingYesPayments within a batch window are grouped

What an on-chain observer does NOT see

DataWhy it’s hidden
Which agent made which paymentPayments come from pool wallet, not individual wallets
Which deposit funds which paymentZK proof breaks the link — nullifiers are unlinkable to commitments
Agent wallet addressesNever appear in payment transactions
Query contentNot stored on-chain (service-side only)
Individual balancesOnly the pool’s total balance is visible

What the proxy operator sees

This is the most important trust consideration:

DataOperator accessMitigation
Agent identitiesYes — agents authenticate to the proxyEncrypted in SQLite with AES-256-GCM
Agent balancesYes — tracked for payment authorizationPer-field encryption with agent-specific keys
Payment requests (agent → service mapping)Yes — proxy routes the requestLogs sanitized: no public keys, tx hashes, or agent IDs logged
ZK private keys and blindingsYes — stored to generate proofsEncrypted storage; planned migration to client-side proving
Agent notes (unspent commitments)Yes — needed for proof generationEncrypted; planned migration to client-side storage

What the proxy operator does NOT see (with planned upgrades)

UpgradeWhat it removes from operator visibility
Client-side provingZK keys, blindings, notes — all move to client
FROST MPC walletPool wallet control — no single party can move funds
Operator blindnessAgent → service mapping — proxy only sees encrypted relay requests

Threat model

ThreatProtected?How
On-chain surveillance (competitor monitoring blockchain)YesZK proofs + batching
Network-level timing analysis (ISP/node operator)PartialBatching defeats timing; Tor can be used additionally
Compromised proxy operatorPartialEncrypted storage protects at-rest data; active operator sees requests
Compromised proxy databaseYesAES-256-GCM per-field encryption; master key not in DB
Double-spend attemptYesNullifiers verified on-chain; contract rejects duplicate nullifiers
Fake proof submissionYesGroth16 proof verified on-chain via BN254 pairing check
Pool drain (operator steals funds)PartialPool contract requires valid ZK proof for transact(); operator CAN do direct SAC transfers (mitigated by FROST MPC in roadmap)
Last updated on