VOLUNTARYBUGS / bitcoin security lab
Cashu mint: offline

Our own Cashu mint.
Our own Cloudflare front.
Real protocol, sandbox money.

This site hosts the lab for the Nutshell Strike-backend fee-cap finding (October 2026). Below you can connect your Cashu wallet to our mint, inspect it live, and reproduce the full mint → melt cycle against the vulnerable backend configuration — on infrastructure we own, with no third party involved.

01Live mint

CONNECT & INSPECT

not connected

MINT INFO

Connect to load /v1/info.

02Connect your wallet

CASHU.ME (browser)

  1. Open cashu.me → Settings → Mints
  2. Add mint → paste https://lab-mint-proxy.thuglifex.workers.dev
  3. Receive → Mint tokens to get test sats

MINIBITS / NUTSTASH (mobile & desktop)

  1. Minibits: Mints tab → + → paste the mint URL
  2. Nutstash: Mints → Add mint → paste the URL
  3. Top up via the mint's Lightning invoice (auto-settles)

The mint runs Nutshell (Python, cashubtc/nutshell @ ac1c2e0) with a Lightning backend simulator and automatic settlement — sats are sandbox tokens, no real money.

03The finding this lab reproduces

Summary (sanitized). In Nutshell's Strike Lightning backend, the melt fee cap computed by the ledger is accepted by the driver and silently discarded — the payment executes with no fee bound. When the backend's actual fee exceeds the reserve quoted to the wallet, the ledger detects the negative difference, logs a single debug line, and finalizes the melt as PAID. A malicious routing peer can therefore skim actual_fee − quoted_reserve from the operator's balance on every melt, indefinitely and silently. Verified live on this exact mint build with a runnable PoC; full disclosure report and code are in the project repository.

REPRODUCED IMPACT (own PoC, 5 cycles)

configmeltreservefeeresultloss
0% reserve1,000025PAID ×5125 sats
defaults10,000100250PAID ×5750 sats
control1,000025BLOCKED ×30

LEDGER'S OWN LOG, BEFORE FINALIZING PAID

No change to return: backend fee 250 exceeds
wallet's fee reserve 100 by 150.

…and the melt was recorded as PAID anyway.

04Run it yourself

FROM THE PROJECT FOLDER

componentcommand
This websitecd mint-website && npm run dev (port 7100)
The mintcd mint-node && ./start-mint.sh (port 3338)
Cloudflare quick tunnel (no account)./cloudflare-tunnel.sh
Full exploit PoCcd audit && SCENARIO=b python poc_strike_feecap.py

Permanent hosting: npx wrangler pages deploy ./ --project-name=voluntary-bugs-lab (Cloudflare Pages — config in wrangler.toml).