The SWIRL mixing protocol, end to end: silent receiving, a continuously deepening anonymity pool, sterile settlement.
SWIRL is a mixing layer for Lightning payments. It sits between a payer and your node, and its job is narrow: make the settlement that arrives at your wallet unlinkable to the payment that entered the pool. Not obfuscated, not harder to trace — unlinkable, up to the depth of the pool at the moment you exit.
The system is built from three independent layers, each closing a different class of observer. Identity is handled at receive time by BOLT12 offers with blinded paths; flow is dissolved inside a continuously deepening anonymity pool with uniform denominations and randomized release schedules; and settlement crosses to layer 1 through a hashlock-atomic submarine swap that lands on a UTXO with no shared history.
1 — Offer. You publish a single static BOLT12 offer (lno1…). It contains no node ID and no channel information; it is safe to post publicly, forever.
2 — Deposit. A payer resolves the offer over onion-routed messages and receives a one-time invoice whose route terminates in a blinded path. They pay it like any Lightning invoice; they learn nothing about where it actually landed.
3 — Pool. Your deposit does not settle to you directly. It enters a pool alongside other participants' deposits and rests there — a minimum hold first, then a randomized exit queue. Every payout is cut from the same denomination lattice, and release order is a uniform permutation with no relation to arrival.
4 — Exit. Each chunk leaves on its own randomized delay, optionally hopping additional relays, optionally crossing to layer 1 through a submarine swap. Amount, order, and timing each carry zero bits of identifying information.
| SECTION | WHAT IT COVERS |
|---|---|
| Threat Model | Who is watching, what they see, what they stop seeing |
| Silent Receiving | Static BOLT12 offers, onion messages, blinded paths |
| Pool Depth | How deposits deepen one continuously open anonymity pool |
| Denominations | Why every exit is cut from the same quantum lattice |
| Timing | Release jitter and order permutation as privacy primitives |
| Loop-Out | Hashlock-atomic submarine swaps onto sterile UTXOs |
| Channels | Unannounced channels, ingress/egress rotation, liquidity |
| CLI Reference | Every swirl command and option, with defaults |
| Testing & Audit | Reproduce the regtest evidence yourself |