Veilmainnet-betaOpen app →
Security

Built to be verified, not trusted

Veil never holds your keys, and its program won't move funds without a valid proof from them. Here is how it's tested, where review stands, and what you can check on-chain yourself, right now.

309 checks passing26 attack scenarios rejected on-chainExternal audit planned before mainnetKey ceremony before mainnetNon-custodial
0automated checks
0on-chain scenario steps
0attack scenarios rejected
0circuit constraints proven per action

Assurance roadmap

What's done, and what happens before deposit caps are lifted.

✓
Independent internal adversarial review

Reviewed by a reviewer with no part in writing the code. Every finding was fixed before release and is covered by a regression test.

Complete
✓
Automated test suite

309 checks across 6 suites, including real zero-knowledge proofs replayed against the on-chain program.

Passing
✓
Mainnet-fork testing

End-to-end runs against a copy of mainnet with the real Jupiter and Jupiter Lend programs: shield, private swap, private lending, exit.

Complete
4
External audit by an independent firm

Scope: On-chain program, circuit, relayer. The audit package (source hashes, scope, invariants) is ready.

Planned
5
Public proving-key ceremony

A multi-party ceremony that is secure if any single participant is honest. The kit is built and tested.

Before mainnet
6
Guarded mainnet beta

Per-token caps, a multisig admin with two-step handover, and a preflight that refuses launch until every check passes.

Next

Test coverage

Every suite runs on each release; tap one to see what it covers. Last run Oct 3, 2026 · build a797f9a.

Protections, verified on-chain

Each guarantee is exercised against the real program with hostile inputs that must be refused. We publish what is guaranteed, not how anyone might try to break it.

✓Every note spends once

A note leaves a one-time marker on-chain when spent; any second attempt is refused by the program.

2 scenarios verified
✓Only valid proofs move funds

Every public detail of a transaction is recomputed by the program and bound into the proof. Change anything and it no longer verifies.

2 scenarios verified
✓Funds go where you said

Recipients and relayer fees are fixed by your proof. Nobody in between can redirect them.

1 scenario verified
✓Trades and lending are ring-fenced

Each trade or lending position gets its own escrow and signer, must pay out at least your minimum, or refunds you in full.

7 scenarios verified
✓Fees are capped and accounted

Protocol fees can never exceed 1%, are tracked apart from user funds, and can only be swept to the treasury.

3 scenarios verified
✓Limited, two-step governance

Admin powers are narrow, can’t move user funds, and change hands only when the new holder accepts.

6 scenarios verified
✓Risky tokens are refused

Tokens with features that could endanger a shared vault are rejected when a vault is opened.

1 scenario verified
✓Spam and capacity limits

Empty transactions are refused and each token’s vault has a beta cap.

2 scenarios verified
✓No blocking by third parties

Outsiders can’t stop your spends or withdrawals by tampering with addresses ahead of time.

2 scenarios verified

By design

Your keys stay with you

Generated and encrypted in your browser; proofs are built there too. Relayers and indexers only ever see public data.

No custodial path

The admin can pause and set limits, but no instruction lets anyone move notes without the owner's proof.

Isolated integrations

Swaps and lending run only through allowlisted programs, each confined to its own escrow.

Open and replaceable

Anyone can run a relayer or an indexer. Clients verify the Merkle root themselves.

Verify it yourself live from mainnet-beta

Read straight from the Solana RPC in your browser, not from our servers.

Program

Program id—
Upgrades controlled by
Admin
Status
Protocol fees (cap 1%)
Allowlisted programs

Beta vault caps

Proving keys

CircuitGroth16 · BN254 · 4 in, 3 out · 31,137 constraints · tree depth 26
Key originDevelopment keys. A public multi-party ceremony runs before mainnet.
Proving key SHA-25683634b5d2054f7edbacef0c96f32ddd4b2addfd0a376e955e654e5bf3309686f
Verification key SHA-256697bd3729fce098f4b98eeba6ed9bf48ba5f2db6693bdd7da8f0ccdd109ca9d6

Responsible disclosure

Found something? Please report it privately before telling anyone else, so users stay safe while it's fixed. A dedicated security contact opens with the mainnet beta.