Privacy-preserving token launches on Solana.
Built for the Solana Hackathon 2025.
Blind Launch enables fair token distribution where:
- Bidders submit encrypted bids - no one sees individual amounts
- Creators see only the aggregate total committed
- Claims happen from fresh wallets that are unlinkable to original bidders
This eliminates front-running, whale manipulation, and information asymmetry in token launches.
1. CREATE LAUNCH Creator sets token supply, min bid, auction window
2. SUBMIT BIDS Users submit encrypted bids with stealth pubkeys
│ (amounts hidden via Inco TEE)
│
3. CLOSE WINDOW VRF randomness determines exact close time
│ (MagicBlock integration)
│
4. SET RAISE CAP Creator sees only aggregate, chooses how much to accept
│ (Discretionary cap model)
│
5. CLAIM Users claim from FRESH wallets using stealth proofs
(Original bidder wallet ≠ Claim wallet)
| Feature | Description |
|---|---|
| Encrypted Bids | Bid amounts hidden via Inco Lightning TEE |
| Aggregate-Only Visibility | Creator sees total committed, not individual bids |
| Stealth Claims | Claim from fresh wallet unlinkable to bid wallet |
| VRF Window Close | Random close time prevents timing attacks |
- Inco Network - Encrypted state via Lightning TEE
- MagicBlock - VRF randomness for fair window closing
- Anoncoin - Privacy tooling for Solana launches
blindlaunch/
├── programs/
│ └── blind-launch/ # Solana/Anchor program
│ └── src/
│ ├── lib.rs # Program entrypoint
│ ├── instructions/# All instruction handlers
│ ├── state/ # Account structures
│ ├── errors.rs # Custom errors
│ └── events.rs # Event definitions
├── sdk/ # TypeScript SDK
│ └── src/
│ ├── client.ts # Main client
│ ├── crypto/
│ │ ├── stealth.ts # Stealth address generation
│ │ └── inco.ts # Inco encryption
│ └── test-e2e.ts # End-to-end test
└── target/
└── idl/ # Generated IDL
- Rust 1.70+
- Solana CLI 1.18+
- Anchor 0.32+
- Node.js 18+
# Build the program
anchor build
# Deploy to devnet
anchor deploy
# Run the SDK tests
cd sdk
npm install
npm run test:e2eGniUzPXTAMA2xVnX7peYaWPtZ3iawT8RhvjWmhBtzD54
Explorer Links:
import { Connection, Keypair } from '@solana/web3.js';
import { Program, AnchorProvider, Wallet } from '@coral-xyz/anchor';
import { generateStealthAddress, generateClaimProof } from '@blind-launch/sdk';
// 1. Create a launch
await program.methods
.createLaunch(tokenSupply, minBid, windowMin, windowMax)
.accounts({ ... })
.rpc();
// 2. Submit bid with stealth pubkey
const { stealthPubkey } = generateStealthAddress(bidderPubkey);
await program.methods
.submitBid(encryptedAmount, encryptedMaxPrice, commitment, stealthPubkey)
.accounts({ ... })
.rpc();
// 3. Claim from fresh wallet (unlinkable!)
const freshWallet = Keypair.generate();
const proof = generateClaimProof(launch, bidIndex, freshWallet.publicKey, stealthPubkey);
await program.methods
.claimAllocation(proof)
.accounts({ claimant: freshWallet.publicKey, ... })
.rpc(); BLIND LAUNCH FLOW
┌──────────────┐ ┌──────────────┐
│ Bidder 1 │──┐ │ Claimer 1 │
│ (Wallet A) │ │ │ (Wallet X) │◄─┐
└──────────────┘ │ └──────────────┘ │
┌──────────────┐ │ encrypted bids ┌──────────────┐ │ stealth
│ Bidder 2 │──┼─────────────────┐ │ Claimer 2 │◄─┤ proofs
│ (Wallet B) │ │ │ │ (Wallet Y) │ │
└──────────────┘ │ │ └──────────────┘ │
┌──────────────┐ │ ▼ ┌──────────────┐ │
│ Bidder 3 │──┘ ┌──────────────┐ │ Claimer 3 │◄─┘
│ (Wallet C) │ │ Inco TEE │ │ (Wallet Z) │
└──────────────┘ │ │ └──────────────┘
│ [encrypted] │ ▲
│ bid storage │ │
└──────┬───────┘ │
│ │
│ aggregate │
│ only │
▼ │
┌──────────────┐ │
│ Creator │ │
│ │ │
│ sees: $1M │ │
│ sets cap: │ │
│ $800k │ │
└──────┬───────┘ │
│ │
▼ │
┌─────────────────────────────────┐ │
│ BLIND LAUNCH PROGRAM │ │
│ │ │
│ • Pro-rata allocation │──────────┘
│ • Stealth verification │
│ • Refund distribution │
│ │
└─────────────────────────────────┘
PRIVACY GUARANTEES:
✓ No one sees individual bid amounts (encrypted in Inco TEE)
✓ Creator sees only aggregate total
✓ Claim wallets (X,Y,Z) are UNLINKABLE to bid wallets (A,B,C)
The Blind Launch model provides fair price discovery with creator discretion:
- Aggregate Revelation - After window closes, creator queries Inco to see only the total amount committed (not individual bids)
- Discretionary Cap - Creator sets raise cap based on aggregate (e.g., "I'll accept $800k of the $1M committed")
- Pro-Rata Allocation - Tokens distributed proportionally, excess refunded
- Stealth Claims - Users claim from fresh wallets, breaking the link to original bidders
BIDDING (Wallet A): CLAIMING (Wallet B):
┌─────────────────┐ ┌─────────────────┐
│ Generate │ │ New wallet │
│ stealth_pubkey │──────────▶│ proves ownership│
│ from secret │ │ via keccak256 │
└─────────────────┘ └─────────────────┘
│ │
▼ ▼
Store on-chain Verify proof
with bid Send refund to B
The claim proof is keccak256(stealth_pubkey || launch || bid_index || claimant), which proves knowledge of the stealth secret without revealing the original bidder.
The E2E test demonstrates the full flow:
cd sdk && npm run test:e2eOutput:
STEP 1: Create Launch ✓
STEP 2: Submit Encrypted Bids (3 bids) ✓
STEP 3: Close Auction Window ✓
STEP 4: Set Raise Cap (0.8 SOL of 1 SOL) ✓
STEP 5: Set Bid Allocations (pro-rata) ✓
STEP 6: Claim from Fresh Wallets ✓
- Bidder: BX1LLZ97...
- Claimers: CmhraCDs..., 6XSd1rh..., 44YjXjK...
- NO ON-CHAIN LINK between them!
- Full Inco Lightning integration for encrypted bid storage
- MagicBlock VRF for production window closing
- Token distribution (currently SOL refunds only)
- Confidential token transfers via Anoncoin
- Frontend UI
MIT License - see LICENSE
Built by Tonbi Studio for the Solana Hackathon 2025.
- Anchor Framework
- Inco Network - TEE encryption
- MagicBlock - Ephemeral VRF