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
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.
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 notesUse Cases
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
Generate ZK Identity
Client generates an ephemeral keypair and constructs a Pedersen commitment to the amount being shielded
- 2
Create Proof
Generate a Groth16 SNARK proof locally in WASM (~2-3 seconds)
- 3
Submit Transaction
Send proof + commitment to Zrenches program. Program verifies proof, inserts commitment into Merkle tree
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
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.
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:
Every shield/unshield operation contributes a small fee (0.001 SOL) to the gas pool
The relayer uses the gas wallet as the fee-payer for all privacy operations
Deployer wallets can operate without ever receiving a direct SOL transfer for gas
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.jsCore Functions
shield()— Move SOL into privacy layerasync 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 walletasync 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 identityasync function generateZkIdentity(): Promise<ZkIdentity>
interface ZkIdentity {
privateKey: Uint8Array;
publicKey: PublicKey;
nullifierKey: Uint8Array;
}getShieldedBalance()— Query private balanceasync function getShieldedBalance(
zkIdentity: ZkIdentity
): Promise<{
total: number;
notes: ShieldedNote[];
}>React Hooks
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.
Core Launch
- ✓SOL shielding/unshielding
- ✓Pump.fun integration
- ✓Global gas wallet
- ✓Multi-vector privacy
SPL Token Support
- ○Confidential SPL transfers
- ○Multi-asset shielding
- ○Private token swaps
Decentralization
- ○Permissionless relayers
- ○Decentralized gas provisioning
- ○Governance token launch
Enterprise Features
- ○Optional viewing keys
- ○Compliance tooling
- ○Institutional SDK
The Flywheel Effect
As the anonymity set grows, every user becomes more private by default.