Load-Bearing Privacy

B2B Payments
In the Shadows.

Every on-chain invoice is a public leak. GhostPay uses Cloak ZK-proofs to hide your treasury flows, payroll, and vendor costs while keeping your auditor happy.

INV-2024-001
MAY 11, 2026
Recipient
acme_corp.sol
Amount
50.00 SOL
"Payment for Q2 Infrastructure and Stealth Cloud Services"
Status: Shielded

Zero Knowledge

Amounts and addresses never hit the public ledger. Your business strategy stays your business.

Scoped Audits

Share viewing keys with auditors for selective transparency without d-oxing your entire history.

Instant Proofs

Generate Groth16 proofs in seconds directly in your browser. No server needed.

How It Works

End-to-end privacy for B2B transactions powered by Solana and ZK-SNARKs.

1

Invoice Creation

Draft invoices normally. Data is encrypted and stored in Supabase, keeping the metadata off-chain and fully private.

2

Shielding Funds

Solana SOL or USDC is converted into UTXOs within the Cloak Shielded Pool. No link to your public address.

3

ZK Proof Generation

Groth16 proofs are generated locally in your browser. Transaction validity is proven without revealing amounts or parties.

4

Selective Audit

Generate a unique Viewing Key specific to a transaction to prove compliance to an auditor without leaking all history.

Technical Architecture

Next.js & Turbopack

High performance frontend delivering instantaneous interactions with Neo-Brutalist aesthetics.

Cloak SDK Integration

Under the hood, @cloak.dev/sdk manages the UTXO set and merkle tree syncing with the Solana Devnet.

Supabase Backend

Realtime database layer powering live invoice updates with row-level security ensuring strict data access controls.

// Generating a UTXO for payment
const amountLamports = BigInt(invoice.amount * 1e9);
const owner = await generateUtxoKeypair();
const output = await createUtxo(amountLamports, owner);

// Depositing to the Shielded Pool
const deposited = await transact({
  inputUtxos: [await createZeroUtxo()],
  outputUtxos: [output],
  externalAmount: amountLamports,
  depositor: publicKey,
}, { programId: CLOAK_PROGRAM_ID });

// Private Transfer via Full Withdraw
await fullWithdraw(deposited.outputUtxos, recipient);