Sm4rty

Tools / Tornado Demixer

Tornado Demixer

Rank the withdrawals a Tornado Cash deposit could have become.

Zero-knowledge proofs are not broken here and cannot be. What this reads is the behaviour around the proof — deposit counts, gas fingerprints, timing, where the money went next — and ranks every withdrawal against the anonymity set it is hiding in.

The transaction that put money into Tornado Cash.

Measured from the deposit block.

Prefer the command line?

The same engine ships as a CLI, for wider windows, CSV and JSON output, and scans too long to sit through in a tab. Zero dependencies — Node 20.9 and nothing else.

Get it on GitHub
git clone https://github.com/Sm4rty-1/tornado-demixer
cd tornado-demixer

node src/cli.js <deposit-tx-hash> --window 30d --csv candidates.csv
How this worksthe signals, and what a score means
  • Address reuse

    The money goes back to the address that sent it in. Not a lead — a link.

  • Denomination profile

    One address receives the same mix of pool sizes the depositor used: 3 × 1 ETH and 1 × 10 ETH is a fingerprint.

  • Deposit count

    Make four deposits in one sitting and you have four notes to withdraw. Counts match.

  • Gas fingerprints

    An identical, unusual gas price on both sides — but only when the user relayed the withdrawal themselves.

  • Timing

    How long the money sat in the pool, and whether both transactions fall in the same part of the depositor's day.

  • Downstream convergence

    Several fresh recipients forwarding to one address the depositor already uses.

A run starts from the honest prior: if 42 withdrawals of that denomination left the pool in the window, any one of them is the deposit with probability 1 in 42. Each signal that fires multiplies those odds, signals that stay silent change nothing, and one signal — unaccounted withdrawals — multiplies them down. Results are then normalised across the candidate set, because only so many of those withdrawals can be one depositor’s.

So a score answers “does this withdrawal belong to the depositor”, not “to this exact deposit”. Tiers are graded on lift over the prior rather than the raw percentage, because 5% means opposite things in a pool of 12 and a pool of 900.

What to do nextturning a candidate into a finding

This is where the tool stops and the work starts. A ranking narrows thousands of withdrawals to a handful of addresses; everything after that is manual, and it decides whether you have something real.

Open any candidate and there is a Check by hand block under the evidence: what arrived, who paid the gas, which relayer, how long the money sat, what was bought afterwards, where it went next, which contracts the address uses. Those are observations, not scores — each one is a claim you can take to an explorer and verify.

  1. Check the address itself. Age, and what funded its first transaction — a self-relayed withdrawal needed gas before it could withdraw, so somebody sent that ETH, and that transaction is often the loose thread. Neither is visible here; both are one explorer click away.
  2. Read the gas line before trusting any gas evidence. Self-relayed means the user signed it themselves and their wallet fingerprint is on it. Relayed means the fingerprint belongs to the relayer and says nothing about them.
  3. Look at what they bought afterwards. If the depositor sold an asset before depositing and a candidate bought the same asset after withdrawing, that is a round trip. The rarer the asset, the less it can be coincidence.
  4. Follow the money past where this stops. Exchange deposits, bridges, other mixers. Funds reaching an identifiable venue are usually where an investigation gets its answer.
  5. Check attribution and sanctions lists. An already-attributed candidate is either strong confirmation or a sign you have found a service rather than a person.
  6. Look for off-chain corroboration. ENS, socials, forum and marketplace activity, previous incident reporting.
  7. Re-run with different settings. Widen the window, switch off the signal carrying the result, turn on exact denominations. A candidate that survives parameter changes is worth more than one that appears under a single configuration.
  8. Write down what would disprove it, then look for that. If you cannot say what evidence would change your mind, you have a hypothesis you cannot test.
Limits and ethicswhat this will not tell you

Every output is a probabilistic lead. Disciplined users — long random delays, no address reuse, a relayer every time, one denomination, no consolidation — leave nothing to find, and the tool will correctly tell you so. In a busy pool some address will match a deposit count by chance.

An address holding more notes than the depositor put in is usually shared — a consolidation point or an exchange deposit address — and is scored down for it. That penalty is softened when the depositor’s history is too long to read in full, because then the excess may be theirs and simply invisible here.

Written for compliance work, incident response, stolen-fund tracing and research. It ranks addresses; it does not judge them, and it does not identify people.