Veilify has three circuits, written in Noir and proven with UltraHonk (Barretenberg). Each has a matching Solidity verifier generated from its verification key.

Shared library

All three circuits share one library:
  • ECDSA: secp256k1 signature verification over the EIP-1559 signing hash
  • RLP: rebuilding the typed transaction from its fields
  • Poseidon2 T4: matching Poseidon2T4Unrolled on-chain
  • LeanIMT: Merkle membership, up to depth 32
  • Note: commitment, nullifier, encryption on Grumpkin (GRUMPKIN_B must equal the contract’s constant)

Proving

1

Witness

The proxy assembles the signed transaction, the selected notes, their Merkle paths, nk, and fresh randomness for outputs.
2

Prove

Barretenberg produces an UltraHonk proof over BN254.
3

Preflight

The scheduler or relayer simulates the call against the current state before broadcasting.

Verifier keys are not circuits

A Solidity verifier contains a verification key. It cannot produce proofs. Deploying a pool needs the exact circuit artifacts (ACIR and proving key) that match the verifiers, or new circuits with regenerated verifiers. A mock verifier is never acceptable outside tests.
The Veilify circuit artifacts and proving pipeline are published with the testnet launch. Until then, Public Inputs documents the exact interface every circuit must satisfy.