Methodology and confidence
Last updated October 7, 2026
Iris follows money through services built to break the trail: privacy pools, CoinJoins, instant swaps, exchanges and bridges. It never breaks their cryptography. It reads what the chain shows around it: amounts, timing, fees, and addresses used on both sides. For each method, this page says what Iris looks for, what counts as a match, how sure it is, and where it goes wrong.
How to read a confidence
Every link Iris suggests comes with a percentage and the reasons behind it, each backed by its transactions. The percentage is a score, not a measured probability: it says how well a candidate fits and how much it stands out from the other candidates in the same window. A match that is alone in its window, close in time and in an unusual amount scores near 100%. Several equally good candidates share the score between them.
A few links are exact, because the service itself records both ends: a bridge transfer, a SideShift shift, a Privacy Pools ragequit. Iris says so when a link is exact.
Everything else is a lead for an investigation, not proof of who controls a wallet. We haven't yet published a precision measurement on deposits of our own, so read the percentages as a ranking of candidates.
Privacy pools on Solana
Privacy Cash, Cloak, encrypt.trade, ShadowWire, MagicBlock Private Payments and Umbra.
The heuristic. People usually take out what they put in, soon after. Iris knows each pool's fee (Privacy Cash even writes it into each withdrawal; Cloak charges 0.3% plus 0.005 SOL), so it works out what left the pool for each withdrawal and compares it with every deposit before it, or the other way round. A deposit paid out in parts is matched to the set of withdrawals that adds up to it: up to 10 recipients on Privacy Cash and ShadowWire, up to 15 tranches to one recipient on MagicBlock. Umbra is matched through the note between deposit and payout.
What counts as a match. The two sides agree to within 0.4% after the fee (0.05% on MagicBlock and Umbra), within 24 hours by default. Dust is never a candidate.
Confidence. Timing and amount together. A gap under 5 minutes counts fully, under 30 minutes a little less, then less again at an hour, 6 hours and a day. A round amount (1 SOL, 10 SOL) counts for less, a set of parts a little less than one withdrawal, and a candidate with another transfer of the same size in between counts for about a third. A wallet Iris only flags as a mixer from its behaviour, with no known fee, is matched more loosely and scored lower.
In practice. In Cloak's SOL pool, 41% of 329 withdrawals have a unique amount-and-timing match to one deposit (median 38 s). That measures how often amount and timing leave a single candidate, not how often Iris is right. Users who wait or withdraw a different amount aren't in it.
Known false positives. Popular amounts with many deposits; two people depositing the same amount minutes apart; bots that cycle the same sums; one service depositing for many users. A direct transfer between the two ends is a separate link that doesn't depend on the score: when we find one, we show it separately.
Railgun, Tornado Cash and Privacy Pools
On Ethereum, Arbitrum and BNB Chain. Iris indexes every deposit and withdrawal of these pools and matches each by what its design leaks.
Railgun. A note usually comes out whole, less the 0.25% fee, so the amounts match to the unit (a little less with a broadcaster's fee). Railgun holds new deposits for about an hour before they can be spent, so a match comes an hour or more later; one that comes sooner is flagged. Two or three withdrawals adding up to a note, and private swaps through RelayAdapt, are matched too. The same address on both sides scores at least 95%.
Tornado Cash. Every deposit to a pool is the same amount, so amount and timing alone say little: such a match is scored low and divided by how many deposits fit. Stronger signals, from published research: the same address on both sides, an unusual gas price shared by a deposit and a self-submitted withdrawal, one address depositing a mix of denominations that another withdraws soon after, and a withdrawer whose gas came from the depositor. A burst of deposits that leaves as a burst of withdrawals through one relayer to fresh wallets is a group lead, capped at 60%. No Tornado link scores above 97%.
Privacy Pools. A ragequit names its deposit, so that link is exact. A withdrawal is matched by value (exactly a deposit's value, or parts that add up to it) and timing; a larger deposit withdrawn in part is a weaker lead.
Known false positives. Common denominations and round amounts; relayers shared by many users; default gas settings that look unusual but aren't; a deposit withdrawn by a different person after a private transfer inside the pool.
Bitcoin CoinJoins
Wasabi 2 (with the round's coordinator named), Whirlpool and JoinMarket. A CoinJoin hides which equal output is whose; it can't hide what happens around them.
- An equal output is one of n: its confidence is 1 in n, and Iris says so.
- A leftover of no standard value is an anonymity set of one.
- An output paid back to an input's address: 99%.
- Whirlpool: a premix output of its own Tx0 (97%), and the Tx0's unmixed change (95%), which ties straight back to the depositor.
- JoinMarket: a change output tied to the inputs that paid for it by subset sum, 90% (80% when another set fits too).
- After the mix, outputs spent together outside another CoinJoin are one owner's again: 85% of the link they come from.
Known false positives. A payjoin or a batch payment that looks like a CoinJoin; a custodian consolidating many users' coins; subset sums that fit by chance in large rounds.
Instant swaps: SideShift, FixedFloat and others
Money goes in as one coin and comes out as another, often on another chain, so amounts can't be compared directly.
SideShift, exact. SideShift publishes its recent completed shifts with their exact amounts. Iris has kept that record since it started reading it, so a deposit of exactly a shift's amount, just before it was recorded, is that shift. On Solana the payout is the transfer of exactly the settled amount out of SideShift's hot wallet minutes later.
FixedFloat. Where Iris has read FixedFloat's public list of recent swaps, a deposit is matched to its swap by coin, network, amount and time, which gives the coin and chain it was paid out on, not the recipient.
By value, for the rest. ChangeNOW, SimpleSwap, StealthEX, Changelly and others, and SideShift shifts Iris has no record of: what the deposit was worth when it went in, against every payout of the service's hot wallets in the next 30 minutes, at the prices of that minute. A payout should be worth 0.3% to 3% less (the spread) plus a network fee. Published work puts this at about 80% right, so Iris shows it as one of N candidates, never as proof. Houdini Swap's two-exchange route is matched the same way, as a weaker lead. NEAR Intents deposits are exact through its 1Click API.
Known false positives. Busy hot wallets paying many similar amounts in the same half hour; fast price moves; round stablecoin payouts.
Exchanges
An exchange pays out from hot wallets and collects deposits through one-time deposit addresses. Iris matches a deposit to the hot wallets' payouts by amount (within 3%, for fees) and timing (within an hour by default), and follows a payout back one hop further, through the deposit address, to whoever funded it. Busy exchanges pay out many similar amounts, so expect several candidates. Only the exchange's own records can confirm who holds an account.
Bridges
A bridge transfer is read from the bridge's own record, not guessed: Circle's CCTP (decoded by Iris from Circle's message), Wormhole, deBridge, Mayan, LayerZero and Stargate, Across, Allbridge, Relay, Chainflip, THORChain and Maya, Garden, Layerswap, Symbiosis, NEAR Intents and IBC, and Li.Fi's status for the others. Both ends are named by the bridge, so a found transfer is exact.
Where it goes wrong. A bridge's API that doesn't answer: Iris says so, and asks again on the next lookup. A transfer not yet delivered, or refunded, is shown as such.
What Iris doesn't do
- It doesn't break any pool's cryptography.
- It doesn't say who a person is. It links wallets; only an exchange or an issuer can say who holds an account.
- It doesn't trace private users for curiosity. See responsible use.