Skip to content

Privacy Score

The Privacy Score says in one number how easy a wallet is to follow, or to tie to other wallets and to a person. 100 means nothing the scan can see links the wallet to anything. 0 means it is fully exposed.

The formula is the same for every wallet. The tables and the worked example on this page are read from the engine’s source when the docs are built (rules 1.3.0), so they always match what the scan does.

Every wallet starts at 100. Each finding costs its severity’s points, scaled by its confidence. Within one detector the costliest finding counts first, and once the detector reaches its cap the rest cost nothing. The score is what is left, and it never goes below 0. A wallet with a public name has a lower ceiling.

cost of a finding    = round(severity points × confidence)
cost of a detector   = min(cap, sum of its findings' costs, costliest first)
score                = max(0, 100 - sum of all detector costs)
with a public name   score = min(score, 34)

Named-wallet ceiling. A wallet with a public name is identified: anyone can see who it is. When public_identity.ens_reverse or public_identity.public_label fires at confidence 0.9 or more, the score is never above 34, the top of the exposed band, whatever else the scan finds. The naming finding then takes the extra points itself, so the costs still add up exactly.

SeverityPoints at confidence 1.0At confidence 0.6
info00
low42
medium85
high148
critical2213

A high finding at confidence 0.5 costs half of what it costs at 1.0.

FindingDetectorCap
ENS and public identitypublic_identity30
Linked walletslinked_wallets25
Funding source reusefunding_reuse20
CEX exposurecex_exposure20
Cross-chain traceabilitycross_chain12
Behavioral fingerprintbehavioral_fingerprint12
Recurring counterpartiesrecurring_counterparties10

The caps add up to more than 100 on purpose: a wallet that leaks in every way at once can reach 0. When that happens, the cheapest findings are trimmed first, so the costs still add up.

ScoreBandWhat it means
80 to 100privateLittle on chain ties this wallet to anything else.
60 to 79moderateSome links exist. A patient observer could follow them.
35 to 59traceableSeveral strong links. Most analytics tools would connect this wallet.
0 to 34exposedThis wallet is easy to tie to other wallets or to a person.

A small synthetic wallet, run through the engine’s real detectors without network (the fixture worked-example.json in the privacy-scan repository). On Ethereum and on Base, its first transaction was paid with coins from one personal wallet that funded three other fresh wallets the same day. It has back and forth transfers with one friend, it pays into an exchange deposit address that one other wallet also uses, and it sent a fresh wallet its first funds.

FindingSeverityConfidencePointsCounted
cex_exposure.deposit_addresscritical (22)0.801818
funding_reuse.shared_funderhigh (14)0.751111
linked_wallets.shared_deposithigh (14)0.701010
linked_wallets.back_and_forthhigh (14)0.6199
funding_reuse.same_funder_multichainmedium (8)0.8577
linked_wallets.funded_by_youhigh (14)0.6086
recurring_counterparties.topmedium (8)0.6155
cross_chain.multichain_presencelow (4)1.0044
  • Each finding costs its severity's points times its confidence, rounded: for example 22 × 0.80 = 17.6, rounded to 18.
  • linked_wallets finds 10 + 9 + 8 = 27 points, more than its cap of 25. The costliest count first, so funded_by_you counts 6 of its 8.
  • The counted points add up to -70: the score is 100 - 70 = 30, band exposed.

The wallets it is linked to, each with its word and confidence:

  • Likely 70%: same CEX deposit address
  • Possible 61%: back and forth transfers
  • Possible 60%: you sent its first funds
  • Possible 56%: shared funder (3 wallets)

The same formula, for a wallet with three findings, one of them a primary ENS name. Scored by the engine when the docs are built:

FindingRuleSeverityConfidencePoints
The address shows a primary ENS namepublic_identity.ens_reversecritical1.022
Its funder also paid 3 other wallets within 3 daysfunding_reuse.shared_funderhigh0.7511
5 near-silent hours a day over 40 signed transactionsbehavioral_fingerprint.timezonelow0.462

The points: 22 × 1.0, 14 × 0.75, 4 × 0.46, each rounded. No detector reaches its cap, so the formula gives 100 - 22 - 11 - 2 = 65.

But the wallet has a primary ENS name: anyone can see who it is. The named-wallet ceiling applies and the score is 34, exposed. The ENS finding takes the extra 31 points itself, so its cost shows as 53, and the costs still add up to 100 minus the score. Without the name, the same wallet scores 87, private.

  • Each finding in a result shows its cost after confidence, cap and ceiling. The costs add up exactly to 100 minus the score.
  • The result shows the points lost per detector, which detectors hit their cap, and whether the named-wallet ceiling applied.
  • The rules, the formula and a test suite are public under the MIT license in the privacy-scan repository. Every result names the rules version it was scored with.
  • New activity. A new transaction can create a new pattern.
  • Coverage. A chain that failed or was cut off at the read limit may hide findings. The result shows coverage per chain next to the score.
  • New rules. A change to the rules gets a new rules version, published in the repository.