Deposits you made with the classic Tornado Cash UI (or another tool) live as note strings, not on your kohaku seed. To spend them from this CLI, import those strings into a mainnet wallet, then unshield as usual.
# What a note looks like
Legacy format:
tornado-<currency>-<denom>-<chainId>-0x…
Mainnet examples (chain id 1):
tornado-eth-0.1-1-0x…
tornado-eth-1-1-0x…
tornado-dai-1000-1-0x…
Sepolia uses 11155111 instead of 1. A note for the wrong chain will not import into a mainnet wallet (wrong-chain).
Treat notes like seed material. Anyone with an unspent note can withdraw it. Do not paste into websites, chat, or screenshots. Prefer pasting once into a local terminal, then clear scrollback / clipboard.
# Practical mainnet flow
- Use a mainnet kohaku wallet (
create-walletwithout--testnet) withRPC_URLpointing at mainnet (ideally a local node). - Have
DEFAULT_PRIVACY_PROTOCOL=tornado(or pass--include tornadolater). - Import one or more notes (quote each string):
kohaku import-tornado-note 'tornado-eth-1-1-0xYourNoteSecret…'
Multiple notes in one go:
kohaku import-tornado-note \
'tornado-eth-0.1-1-0x…' \
'tornado-eth-1-1-0x…'
The CLI syncs against chain state (Tornado saga / pool data — Tor by default; see Network traffic) and prints a status per note:
| Status | Meaning |
|---|---|
imported |
Note matched an unspent deposit and is stored in this wallet |
not-found |
No matching unspent deposit (already spent, typo, or not yet synced) |
wrong-chain |
Note’s chainId does not match this wallet’s network |
- Confirm private balance:
kohaku balances --include tornado --verbose
- Withdraw like any other Tornado balance:
kohaku unshield --next --amount-formatted 1.0
kohaku unshield --next --amount-formatted 1.0 --broadcast
# Where notes usually come from
- Backups / copies you saved when depositing in the classic Tornado interface
export-tornado-notefrom another kohaku wallet (same denomination you want to move):
kohaku export-tornado-note --amount-formatted 1.0
Export prints raw secrets to stdout — same care as import. Interactive mode asks before revealing; --non-interactive skips that confirm.
# Tips
- Import only into a wallet you trust to hold those secrets long-term. After a successful import, treat the old plaintext note file as spent credentials still (until you have unshielded and are sure nothing else has a copy).
- Saga CDN requests are Tor-or-fail (no clearnet fallback). Prefetch saga history with
fetch-sync-cacheso import /balancesdo not page the whole CDN over Tor. Proving circuits are bundled with the CLI. See Network traffic. - You do not need the original deposit address or seed — the note string is enough to prove and withdraw.
Full flags: Full Commands Reference (import-tornado-note / export-tornado-note).