Nullark has five public-facing layers. Each layer has a different trust boundary.

System layers

LayerRoleBoundary
Pool contractStores commitments, tracks nullifiers, verifies proof-adapter results, releases public exitsCannot protect users from timing, recipient, RPC, frontend, or relayer metadata
Circuits and verifiersBind note authorization and public withdrawal fieldsOnly valid for the published public input order and artifact hashes
Browser appHandles wallet prompts, note material, recovery flow, and proving UXA compromised origin can expose sensitive material
Indexer and recovery helpersRead public events and help reconstruct recoverable private-balance stateMust not log decrypted notes or raw secrets
Relayer endpointAccepts bounded withdrawal submission requestsNot a privacy guarantee and not a recovery channel

Flow summary

1

Deposit

The user deposits a fixed denomination into the pool. The app creates note material locally and records encrypted-note event data.
2

Track pool state

The frontend or indexer reconstructs accepted roots from public events. Root freshness matters because old roots can expire after later insertions.
3

Prove spend authorization

The browser prover uses the published WASM and zkey to produce a withdrawal proof. Raw witness inputs remain private.
4

Exit publicly

The withdrawal sends funds to a public MegaETH recipient. The recipient, amount, fee, nullifier, and timing are public.

Fail-closed boundary

If the chain ID, pool address, verifier address, public input order, artifact hashes, or trusted setup record do not match the public artifact record, the integration stops instead of guessing.