Private payroll and contractor payments on Solana, built on Cloak.
Pay your entire team in USDC, USDT, or SOL — amounts and addresses stay off-chain. Auditors get scoped access through viewing keys. The public ledger sees nothing.
Live: nova-oracle.xyz · Repo: github.com/thesithunyein/nova-oracle · Track: Cloak — Colosseum Frontier Hackathon
Every Solana transaction is public — every salary, every vendor payment, every treasury rebalance is permanently readable on any block explorer. For an organization paying its team in USDC, this means every employee's compensation is searchable forever by competitors, recruiters, ex-employees, and anyone with curl.
This isn't a minor leak. It's an operational risk that prevents serious organizations from running payroll on Solana at all.
| User | Pain | What NovaPay gives them |
|---|---|---|
| 50-person DAO finance team | Monthly USDC payroll exposes every contributor's salary | One CSV upload → one Phantom approval → batched private payments |
| Protocol treasury manager | Buybacks and vendor payments telegraph strategy in real time | Shielded execution; competitors see nothing |
| Cross-border payroll provider | Contractors in 30 countries don't want salaries permanently public | Stealth claim links + private settlement |
| Compliance officer | Auditors need access without breaking everyone else's privacy | Scoped viewing keys: full, partial, or time-limited |
If your users would walk away the moment their amounts went public, NovaPay is for you.
Cloak isn't a "privacy mode" toggle bolted on the side. Without Cloak, NovaPay literally cannot exist. Every flow routes through the SDK:
| User flow | Cloak SDK call | Code location | What it does |
|---|---|---|---|
| Run payroll batch | shieldedSend() per recipient inside executePayrollBatch |
cloak.ts:97-141, cloak.ts:143-183 |
Deposits to shielded pool via transact(), generates Groth16 proof client-side, withdraws to recipient via fullWithdraw(). Amount + recipient hidden. |
| Single private send | shieldedSend() |
cloak.ts:97-141 |
Same UTXO flow, single recipient. |
| Generate viewing key | initializeCloakKeys() → generateUtxoKeypair() + getNkFromUtxoPrivateKey() |
cloak.ts:68-80 |
Creates a key pair where nk decrypts shielded history without revealing the spending key. |
| Run compliance scan | scanHistory() → scanTransactions() + toComplianceReport() |
cloak.ts:185-217 |
Reads Cloak program txs from RPC, decrypts with nk, returns structured gross/fee/net report. |
| Stealth claim links | Fresh keypair per claim, base64-encoded into URL, recipient sweeps via escrow.sign(tx) |
dashboard/claim/page.tsx, claim/[secret]/page.tsx |
Sender funds a stealth address, encodes its private key into a URL. Recipient opens the URL — the link itself is the receiving authority. Sender never sees recipient's wallet. Maps directly to Cloak's stealth address API on mainnet. |
| Display fees | calculateFee() + calculateNetAmount() |
constants.ts:48-54 |
Live UI shows Cloak fee model (0.3% + 5M lamports). |
Three capabilities, all load-bearing. Batch shielded send powers payroll, viewing keys power compliance, stealth links power link-based payments — each is the core mechanism of its respective flow, not an add-on.
- Cloak integration layer:
src/lib/cloak.ts - Payroll batch execution:
src/app/dashboard/payroll/page.tsx - Compliance / viewing keys:
src/app/dashboard/compliance/page.tsx - Single shielded send:
src/app/dashboard/send/page.tsx
┌──────────────────────────────────┐
│ NovaPay Dashboard (Next.js 14) │
│ Payroll · Send · Compliance │
└──────────┬───────────────────────┘
│
┌──────────▼───────────┐
│ @cloak.dev/sdk │ (loaded on mainnet)
│ TypeScript │
│ Groth16 in browser │
└──────────┬───────────┘
│
┌──────────────┴──────────────┐
│ │
┌───────────▼──────────┐ ┌───────────▼──────────┐
│ Cloak Program │ │ Cloak Relay │
│ zh1eLd6r...qRkW │ │ api.cloak.ag │
│ UTXO shielded pool │ │ (non-custodial) │
└───────────┬──────────┘ └──────────────────────┘
│
┌──────▼──────┐
│ Solana L1 │
└─────────────┘
On devnet, the same UI runs against SystemProgram.transfer so judges can test every flow free of charge — but the Cloak code path is fully wired and one env-var away.
- Open nova-oracle.xyz
- Set Phantom to Devnet, connect
- Top up at faucet.solana.com
- Send page → paste any address + 0.01 SOL → see the confirmed tx on Solana Explorer
- Payroll page → click
Sample CSV→ clickImport CSV→ clickRun Shielded Payroll→ one Phantom approval, three transfers in one atomic transaction - Compliance page →
Generateviewing key →Run Scan→ see decrypted audit report - History page → all transactions with Explorer links + CSV export
| Flow | Tx (Solana Explorer) |
|---|---|
| Single private send | 414G4icPUPtJfmvQPuSb3cb8fTvuYwSAoapv2Wdt2zJ77pPZgrwDh2xuVCmrgibJaGJ9rzK55P73zaZeUxwbu1tu |
| Atomic 3-recipient payroll | Click any Explorer link in the History page after running the sample batch |
- Node 18+
- Phantom or Solflare wallet
git clone https://github.com/thesithunyein/nova-oracle.git
cd nova-oracle
npm install
cp .env.example .env.local
npm run devOpen http://localhost:3000.
NEXT_PUBLIC_SOLANA_NETWORK=mainnet-beta \
NEXT_PUBLIC_CLOAK_PROGRAM_ID=zh1eLd6rSphLejbFfJEneUwzHRfMKxgzrgkfwA6qRkW \
NEXT_PUBLIC_CLOAK_RELAY_URL=https://api.cloak.ag \
npm run devWhen IS_DEVNET is false, every payment dynamically imports @cloak.dev/sdk and routes through shieldedSend(), initializeCloakKeys(), and scanHistory() — see the conditional in src/app/dashboard/send/page.tsx lines 61–95.
- 🎯 Atomic batch disbursement. N recipients = 1 transaction = 1 Phantom approval. All-or-nothing payroll.
- ✨ Stealth claim links. Pay someone without knowing their wallet — generate a one-use URL, share it through any channel, recipient claims by opening it. Cryptographically real escrow, no backend.
- 📥 CSV import. Upload
name,wallet,amountfor 30+ employees in one shot. - 🔑 Viewing-key compliance. Generate scoped audit keys, run on-demand decryption scans, share reports with auditors.
- 📊 CSV export. Decrypted history exports for tax/finance.
- 🛡️ Inline validation. Bad addresses caught before signing.
- 📱 Mobile-responsive. Full functionality on phone — slide-in sidebar, touch-optimized controls.
- 🟡/🟢 Network badge. Always-visible Devnet vs Mainnet indicator so judges and users never confuse environments.
| Criterion (weight) | NovaPay's case |
|---|---|
| Integration depth (40%) | Three SDK capabilities used to the metal: (1) batch shielded send is the entire payroll product — shieldedSend runs per-recipient inside executePayrollBatch on mainnet, atomic batched on devnet for judging convenience. (2) Viewing-key + compliance — initializeCloakKeys + scanHistory power the audit dashboard. (3) Stealth claim links — fresh-keypair escrow + URL-encoded receiving authority, mapping directly to Cloak's stealth address API on mainnet. The product is impossible without Cloak. |
| Product (30%) | Next.js 14 App Router · TypeScript · TailwindCSS · shadcn/ui · Zustand persisted state · @solana/wallet-adapter-react · real Solana Explorer links · loading + error + retry states · responsive mobile UI · CSV import/export · inline validation · clear network indicator. |
| Real-world use (30%) | Concrete user: 50-person DAO finance team running monthly USDC payroll. Without privacy, every salary is permanently public. Existing Solana payroll tools either skip privacy or aren't usable. NovaPay collapses payroll + audit + compliance into one workflow no other Solana product offers. |
- App: Next.js 14 (App Router) · TypeScript · TailwindCSS · shadcn/ui · Framer Motion · Zustand
- Solana: @solana/web3.js · @solana/spl-token · @solana/wallet-adapter-react (Phantom + Solflare)
- Privacy: @cloak.dev/sdk — UTXO shielded pool, Groth16 proofs, non-custodial relay
- UI primitives: Lucide icons · Sonner toasts
- Stealth claim links — recipient claims funds without prior wallet setup (Cloak stealth address API)
- Private swaps via Orca — payroll-in-USDT, settle-in-USDC without revealing path
- Multi-sig batch approval — DAO treasuries with 2-of-3 sign-off on shielded payroll
- Recurring schedules — monthly auto-payroll with one approval upfront
Cloak Track — Colosseum Frontier Hackathon Built by @thesithunyein
MIT