A bidirectional, fully Zero-Knowledge bridge. Move USDC in either direction without ever revealing which deposit or lock transaction triggered your claim. The link between source and destination is cryptographically severed.
On a standard bridge, anyone watching can correlate the address that locks funds with the address that claims them. Zephyr uses ZK proofs so the deposit and claim are mathematically decoupled.
The same ZK flow powers both directions. Your secret never leaves your browser — the proof is generated client-side and verified on-chain.
Lock USDC or ZUSDC on the source chain. A Poseidon commitment
Poseidon(amount, secret, recipient)
is recorded — no plaintext address stored.
The relayer monitors events, builds a Poseidon Merkle tree, and posts the root to the destination chain. The frontend auto-detects when it's ready.
Your browser runs the Groth16 prover (snarkjs WASM) to build a zero-knowledge proof of membership, amount, and nullifier — all in ~30–60 seconds.
Submit the proof on-chain. The contract verifies it via native BN254 pairing, checks the nullifier, and releases net funds. No link to the original deposit.
ZK proofs are load-bearing in both directions — a valid proof is strictly required to claim bridged funds, no matter which way you're going.
commitment = Poseidon(netAmount, secret, recipient) recorded, 0.1% fee collected.
Locked events, posts root to Stellar via set_src_root.
claim(proof, pub, recipient, commitment) on Soroban. Native BN254 verifies.
lock_stellar_private(amount, commitment). ETH recipient is completely hidden on-chain.
setStellarRoot.
claimFromStellar(proof, ...) on EVM. Native alt_bn128 precompiles verify.
A single shared Circom circuit powers both directions. The exact same Groth16 proof
generated in your browser verifies on both Ethereum's alt_bn128
and Stellar's native BN254 host functions.
Groth16 over BN254, Poseidon hashes, depth-15 Merkle tree.
Five statements proven in a single Groth16 proof.
commitment = Poseidon(amount, secret, recipient)leaf = commitment (exists in tree)nullifierHash = Poseidon(secret, leaf)leaf ∈ Merkle tree (path matches root)amountCommitment = Poseidon(amount)A flat 0.1% is collected on each side (lock + claim) to fund operations and maintain liquidity. Fees accumulate on-chain and are withdrawable by admin only.
| Direction | Source fee | Destination fee | Total |
|---|---|---|---|
| ETH → Stellar | 0.1% on lock | 0.1% on claim | ~0.2% |
| Stellar → ETH (ZK) | 0.1% on lock_private | 0.1% on claimFromStellar | ~0.2% |
| Stellar → ETH (release) | 0.1% on lock_stellar | 0.1% on claimBurned | ~0.2% |
Depth-15 deployment with burn-proof release path and VK-init bypass. Click any address to view on the explorer.
Every layer chosen for soundness and auditability — from the ZK proving toolkit down to the smart contract languages.
Connect your wallets, lock your funds, and let Zero-Knowledge proofs do the rest. Your deposit and claim will never be linked.
Launch the App