Documentation

Zrenches — The Rebirth of Privacy on Solana

Solana solved throughput, latency, and UX. What it didn't solve is the glass-wallet problem — the fact that every funding path, every trade, and every deployment turns into a permanent public dossier.

Zrenches is a high-performance, zero-knowledge execution layer that restores privacy to Solana without sacrificing speed. It's built from day one for Pump.fun-native token launches, creator workflows, and trench-level experimentation.

This isn't a bolt-on mixer or a gimmick. It's a shielded execution environment that plugs directly into the tools you already use.

Why Zrenches Exists

On Solana today, success comes with a cost: as soon as a creator hits, their wallets are scraped, mapped, profiled, and farmed. A single lucky deployment can permanently compromise every future strategy.

Zrenches fixes this by separating who you are from what you build. It provides a cryptographic firewall between your funding wallets and your public actions.

🔒

Private Funding

Shield SOL and route it privately into new deployments

🎭

Anonymous Launch

No visible link between main wallet and Pump.fun launch

Native Speed

All at Solana's native block times and fees

🛡️

Optional Privacy

Choose when to shield and when to be public

💡

Positioning

Zrenches is the missing privacy primitive for Solana — a creator-grade shielded layer that is Pump.fun-native from day one and designed to feel invisible until you need it.

Architecture Overview

Under the hood, Zrenches is a refactored fork of the original Light SDK privacy work, extended into a compressed UTXO model and wired directly into a modern Solana dapp stack.

Core Primitives

  • Pedersen Commitments — Cryptographically bind asset values while keeping them hidden
  • Nullifiers — Prevent double-spends while keeping origins concealed
  • Sparse Merkle Trees — Commit to the global note set with efficient proofs
  • Groth16 SNARKs — Constant-time on-chain verification (~0.5ms)
  • ElGamal Encryption — Keep balances recoverable but opaque to observers
Shielded Note StructureTypeScript
interface ShieldedNote {
  // Pedersen commitment to the value
  commitment: PublicKey;
  
  // ElGamal-encrypted note data
  encryptedData: {
    amount: EncryptedValue;
    assetId: EncryptedValue;
    memo: EncryptedValue;
  };
  
  // Ephemeral public key for decryption
  ephemeralPubkey: PublicKey;
  
  // Merkle tree position
  leafIndex: number;
  
  // Nullifier (revealed only when spent)
  nullifier?: PublicKey;
}
💭

Concept

Think of Zrenches as a compressed, shielded ledger sitting just beneath your normal Solana accounts. You move value in and out of that ledger with proofs instead of direct transfers.

Multi-Vector Privacy

Zrenches does more than "hide one input and show one output." It introduces Multi-Vector Privacy — the ability to consume, merge, split, and redirect multiple concealed value paths in a single proof.

The unshielding circuit can work with up to 6 shielded notes at once, enabling complex private operations that would otherwise require multiple traceable transactions.

Multi-Note Unshield ExampleTypeScript
import { unshieldMulti } from '@zrenches/sdk';

// Consolidate multiple shielded notes into one output
const tx = await unshieldMulti({
  // Input: 6 different shielded notes
  inputNotes: [
    { commitment: note1.commitment, amount: 0.5 },
    { commitment: note2.commitment, amount: 1.2 },
    { commitment: note3.commitment, amount: 0.8 },
    { commitment: note4.commitment, amount: 2.1 },
    { commitment: note5.commitment, amount: 0.4 },
    { commitment: note6.commitment, amount: 1.0 },
  ],
  
  // Output: Single public recipient gets 6 SOL
  recipient: deployerWallet.publicKey,
  amount: 6.0,
  
  // Proof generation happens client-side
  zkProof: await generateMultiNoteProof(inputNotes),
});

// Result: Deployer wallet receives 6 SOL with no 
// visible connection to the 6 source notes

Use Cases

Consolidating fragmented balances into a single private exit
Funding several ephemeral wallets from one proof
Creating complex internal flows that collapse into one visible action

Shielding Flow

Shielding is the process of moving SOL from a public Solana wallet into the Zrenches privacy layer. Once shielded, your balance becomes a cryptographic commitment visible only to you.

Step-by-Step Process

  1. 1

    Generate ZK Identity

    Client generates an ephemeral keypair and constructs a Pedersen commitment to the amount being shielded

  2. 2

    Create Proof

    Generate a Groth16 SNARK proof locally in WASM (~2-3 seconds)

  3. 3

    Submit Transaction

    Send proof + commitment to Zrenches program. Program verifies proof, inserts commitment into Merkle tree

Shield SOL ExampleTypeScript
import { shield, generateZkIdentity } from '@zrenches/sdk';
import { useWallet } from '@solana/wallet-adapter-react';

export function ShieldButton() {
  const wallet = useWallet();
  
  const handleShield = async () => {
    // 1. Generate ephemeral ZK identity
    const zkIdentity = await generateZkIdentity();
    
    // 2. Shield 5 SOL from connected wallet
    const result = await shield({
      wallet: wallet.publicKey,
      amount: 5.0, // SOL
      zkIdentity,
      
      // Optional: add encrypted memo
      memo: "Funding for next launch",
    });
    
    // 3. Store the shielded note locally
    // (encrypted with your wallet's signature)
    await saveShieldedNote({
      commitment: result.commitment,
      amount: 5.0,
      zkIdentity,
      txSignature: result.signature,
    });
    
    console.log("Shielded 5 SOL");
    console.log("Commitment:", result.commitment);
  };
  
  return (
    <button onClick={handleShield}>
      Shield 5 SOL
    </button>
  );
}

Unshielding Flow

Unshielding moves value from the privacy layer back to a public Solana wallet. This is how you fund deployer wallets, exit to exchanges, or convert back to transparent SOL.

Proof Requirements

The unshield proof must demonstrate:

  • You own the notes being spent (know the private key)
  • Sum of inputs equals outputs plus fees
  • All notes are members of the current Merkle tree
  • None of the nullifiers have been used before
Unshield to Deployer WalletTypeScript
import { unshield, generateDeployerWallet } from '@zrenches/sdk';

export async function fundDeployerWallet() {
  // 1. Create fresh deployer wallet (no on-chain history)
  const deployer = await generateDeployerWallet();
  
  // 2. Load your shielded notes
  const notes = await loadShieldedNotes();
  
  // 3. Select notes totaling desired amount
  const selectedNotes = selectNotes(notes, 3.0); // 3 SOL
  
  // 4. Generate unshield proof (client-side)
  const proof = await generateUnshieldProof({
    inputNotes: selectedNotes,
    recipient: deployer.publicKey,
    amount: 3.0,
  });
  
  // 5. Submit unshield transaction
  const tx = await unshield({
    proof,
    recipient: deployer.publicKey,
    amount: 3.0,
  });
  
  console.log("Unshielded 3 SOL to deployer");
  console.log("Deployer address:", deployer.publicKey.toBase58());
  console.log("No visible link to your main wallet!");
  
  return deployer;
}

Anonymous Pump.fun Deployment

The flagship use-case of Zrenches is anonymous token deployment on Pump.fun. By combining shielding, unshielding, and ephemeral wallets, you can launch tokens with zero connection to your main wallet.

Complete Anonymous Launch FlowTypeScript
import { shield, unshield, launchToken } from '@zrenches/sdk';
import { Keypair } from '@solana/web3.js';

export async function anonymousLaunch() {
  // STEP 1: Shield SOL from main wallet
  console.log("Step 1: Shielding 10 SOL...");
  const zkIdentity = await generateZkIdentity();
  const shieldResult = await shield({
    wallet: mainWallet.publicKey,
    amount: 10.0,
    zkIdentity,
  });
  
  // STEP 2: Generate fresh deployer wallet
  console.log("Step 2: Creating deployer wallet...");
  const deployer = Keypair.generate();
  
  // STEP 3: Unshield to deployer (private transfer)
  console.log("Step 3: Unshielding to deployer...");
  const unshieldResult = await unshield({
    inputNotes: [shieldResult.note],
    recipient: deployer.publicKey,
    amount: 10.0,
  });
  
  // STEP 4: Deploy token on Pump.fun
  console.log("Step 4: Launching token...");
  const token = await launchToken({
    deployer,
    name: "My Private Token",
    symbol: "PRIV",
    description: "Launched anonymously via Zrenches",
    initialBuy: 5.0, // Use 5 SOL for initial buy
  });
  
  console.log("✅ Token launched anonymously!");
  console.log("Token address:", token.mint.toBase58());
  console.log("Bonding curve:", token.bondingCurve.toBase58());
  console.log("");
  console.log("🔒 Privacy guaranteed:");
  console.log("  - No link between main wallet and deployer");
  console.log("  - Deployer has no prior on-chain history");
  console.log("  - Funding path hidden by ZK proofs");
  
  return token;
}
🎯

Privacy Guarantee

At no point is there a direct, visible path that links your main wallet to the deployer. The only thing public is that "some value left Zrenches and a new wallet launched a token." Your identity remains cryptographically separated from your creation.

Global Gas Wallet & Relayer

Funding burner wallets for gas is one of the biggest privacy leaks in crypto. Even if you shield your main transfer, sending 0.01 SOL for gas creates a traceable link.

Zrenches solves this with a global gas wallet and relayer infrastructure:

Protocol fees accumulate in a global gas wallet

Every shield/unshield operation contributes a small fee (0.001 SOL) to the gas pool

Relayer pays transaction fees

The relayer uses the gas wallet as the fee-payer for all privacy operations

Ephemeral wallets never need funding

Deployer wallets can operate without ever receiving a direct SOL transfer for gas

Relayer ArchitectureDiagram
┌─────────────────┐
│ Your Wallet │
└────────┬────────┘
│ Shield Request
┌─────────────────┐
│ Zrenches SDK │ ← Generates proof client-side
└────────┬────────┘
│ Proof + Commitment
┌─────────────────┐
│ Relayer │ ← Pays gas from global wallet
└────────┬────────┘
│ Transaction
┌─────────────────┐
│ Zrenches │ ← Verifies proof, updates tree
│ Program │
└─────────────────┘
💡

Result

Fee UX feels invisible to users, and your privacy is no longer broken by gas management. The relayer network is permissionless — anyone can run a relayer and earn fees from the gas pool.

SDK Reference

The Zrenches SDK provides a clean, TypeScript-first API for integrating privacy into your Solana applications.

Installation

npm install @zrenches/sdk @solana/web3.js

Core Functions

shield()— Move SOL into privacy layer
async function shield(params: {
  wallet: PublicKey;      // Source wallet
  amount: number;         // SOL amount
  zkIdentity: ZkIdentity; // Generated identity
  memo?: string;          // Optional encrypted memo
}): Promise<ShieldResult>
unshield()— Move SOL out to public wallet
async function unshield(params: {
  inputNotes: ShieldedNote[]; // Notes to spend (max 6)
  recipient: PublicKey;       // Destination wallet
  amount: number;             // SOL amount
  proof?: ZkProof;            // Optional pre-generated proof
}): Promise<UnshieldResult>
generateZkIdentity()— Create ephemeral identity
async function generateZkIdentity(): Promise<ZkIdentity>

interface ZkIdentity {
  privateKey: Uint8Array;
  publicKey: PublicKey;
  nullifierKey: Uint8Array;
}
getShieldedBalance()— Query private balance
async function getShieldedBalance(
  zkIdentity: ZkIdentity
): Promise<{
  total: number;
  notes: ShieldedNote[];
}>

React Hooks

useZrenches HookReact
import { useZrenches } from '@zrenches/react';

export function MyComponent() {
  const {
    shield,
    unshield,
    balance,
    isLoading,
    error,
  } = useZrenches();
  
  const handleShield = async () => {
    await shield({ amount: 5.0 });
  };
  
  return (
    <div>
      <p>Shielded Balance: {balance} SOL</p>
      <button onClick={handleShield}>
        Shield 5 SOL
      </button>
    </div>
  );
}

Roadmap & Adoption Flywheel

Zrenches is designed to be the privacy base-layer that Solana has been missing. As more creators and tools integrate, the anonymity set grows, making every user more private by default.

Q3 2025

Core Launch

  • SOL shielding/unshielding
  • Pump.fun integration
  • Global gas wallet
  • Multi-vector privacy
Q1 2026

SPL Token Support

  • Confidential SPL transfers
  • Multi-asset shielding
  • Private token swaps
Q2 2026

Decentralization

  • Permissionless relayers
  • Decentralized gas provisioning
  • Governance token launch
Q2 2026

Enterprise Features

  • Optional viewing keys
  • Compliance tooling
  • Institutional SDK

The Flywheel Effect

📈
More Activity
🔒
Stronger Privacy
💎
More Demand

As the anonymity set grows, every user becomes more private by default.