Privacy-preserving
stealth addresses
for Solana

Send and receive SOL without revealing your identity on-chain. Stealth addresses, relayer privacy, and zero-knowledge proofs.

$ cargo add cloak-sdk
Deployed on Solana Devnet
ProgramAaJF9TTgTPqRTuXfnQnVvBihpYwYUAYroW984foWyVJ
Explorer

Architecture

A complete privacy stack

ECDH / Ed2551901

Stealth Addresses

Unique one-time addresses for every payment. Sender and receiver are completely unlinkable on-chain.

Anchor Program02

On-chain Registry

Announcement PDAs store ephemeral keys. Scalable design with per-announcement accounts.

Tx Privacy03

Relayer Network

Submit through a relayer to hide the sender's wallet. The relayer pays rent, you sign the transfer.

Groth16 / BN25404

Zero-Knowledge

Hide payment amounts with Pedersen commitments and zk-SNARK proofs. Verify without revealing.

Developer Experience

Privacy in a few lines of code

SDK
main.rs
use cloak_sdk::{
  StealthPayment,
  StealthKeypair,
  Scanner,
};

// Create a stealth payment
let payment = StealthPayment::create(
  &receiver_meta, amount
)?;

// Scan for incoming payments
let payments = scanner.scan(rpc).await?;

// Derive spending key
let kp = StealthKeypair::derive(
  &meta, &ephemeral
)?;
CLI
Terminal
# Generate your stealth identity
$ cloak init
Generated new stealth meta-address!

# Send a private payment
$ cloak send stealth1abc... 0.5
Transaction sent!

# Hidden amount (zk-SNARK)
$ cloak send stealth1abc... 0.5 --private
Generating zk-SNARK proof...

# Through relayer (hidden sender)
$ cloak send stealth1abc... 0.5 --relayer
Transaction relayed!

Features

Why Cloak?

Stealth Addresses

ECDH-derived one-time addresses. Each payment goes to a unique address that only the recipient can detect.

Hidden Amounts

Pedersen commitments with Groth16 proofs hide payment amounts. Verify validity without revealing the value.

Relayer Privacy

Submit transactions through a relayer to hide your wallet address. The relayer pays rent, you only sign the transfer.

Smart Scanning

Efficient on-chain scanning with viewing key delegation. Watch-only wallets can detect payments without spending keys.

Scalable Registry

Each announcement is its own PDA — no circular buffers, no limits. Indexed by a global counter for deterministic access.

Full CLI

Init, send, scan, spend, history. Supports --private and --relayer modes. Everything from the terminal.

Protocol

How it works

01

Generate

Receiver creates a stealth meta-address and shares the public portion.

02

Derive

Sender uses ECDH with the meta-address to derive a unique one-time stealth address.

03

Transfer

SOL is sent to the stealth address. An announcement PDA publishes the ephemeral key on-chain.

04

Spend

Receiver scans announcements, detects payments, and derives the spending key.

Stack

Built with

RustCore SDK
AnchorOn-chain Program
ark-groth16ZK Proofs
Ed25519ECDH Stealth
AxumRelayer Server
ClapCLI Framework
BN254Elliptic Curve
SolanaDevnet Live

Applications

Use cases

Private Donations

Accept contributions without exposing all donors publicly on-chain. Each donation goes to a unique stealth address.

Payroll

Pay employees privately without revealing salary information. Relayer mode hides the company wallet.

Anonymous Purchases

Buy goods and services without linking transactions to your identity. zk-proofs hide the amounts.

Treasury Management

Move funds between wallets without exposing organizational structure. View keys for auditing without spending access.

Ready to build?

Start integrating privacy-preserving payments in your Solana application.