fish — ~/cases/ledger-cryptobilis-2026-10 · forensics
INVESTIGATION REPORTBALANCES 18:46 UTCLEDGER / CRYPTOBILIS DRAIN · 9 OCT 2026

The Ledger / CryptoBilis drain, 9 October 2026: 75.49M USDT and 220.57 BTC traced, what Tether froze, and what still sits on attacker wallets

Correction, 15 Oct 2026 (UTC): an earlier version of this report and of the address list treated five TRON wallets as attacker wallets: TGe3p75NtsM6DgTxUZ3GpaFXAKH6LbGQkz, TBW8Fqzov5s19bP2jKbWSnHYBP59eP87JE, TFyjETWQN8svophpGSKmgAe1VZ3tSgGXfd, TSyQxuTzRAkZ7RC3s3w2cbukDDX7VP68Dn and TQU3Hfq5VwfURXHLhyk7SCLwtSPMrrFueU. Four of them bought USDD at a public swap router with their own funds, and the fifth only received USDD from one of the four. My walk had followed the router's payouts to its other users. I found no transaction that ties any of the five to the theft. I removed all five from the list and from the transfer map, and I apologise to their owners. I added three wallets that sit on the drain path (and, below, thirteen more): TKz9dXP2RFFnn4sgBrDexBi2y1uRrj8vWs and TKcsH2MPHDRPagEr2s6MwYok7LG8wM4dFR each passed 500,000 USDT from a collector to TQDGwZmYcUtcYGL9y2uWQYpRFjY9VTwsgR, and 0xd7ef9a5a5da8de7a348145401d0236ef4452dd2e received 1,033,440.89 USDC from 0x0c54660eD28A1b5698d5A4276502c67A7d6Bee52 and split it. I also corrected the USDD swap figures. The report counted 26,367,864 USDT in 55 swaps into USDD, but 21 of those transactions were redemptions of USDD into USDT (16,440,306 USDT), not purchases, and my detector had missed purchases. After reading every USDT and USDD transfer of the swap contracts from 8 to 16 Oct 2026, the listed wallets bought USDD with 17,219,936 USDT in 49 swaps (10 wallets), plus 8,806,905 USDT in 9 swaps by the wallet of the separate parcel in the first section (26,026,841 USDT in 58 swaps by 11 wallets in all), and redeemed USDD for 24,752,226 USDT in 30 transactions. I added thirteen more TRON wallets that bought USDD with money from the distributor or from another listed wallet, passed it on or redeemed it, as Medium. The USDD walk figures in the bottom line, the coverage limits and the next steps changed for a different reason: I removed the walks that started from the removed wallets. (High for the two TRON wallets and the 17,219,936 USDT in 49 swaps; Medium for the separate 8,806,905 USDT parcel, the Ethereum wallet and the thirteen TRON wallets)

Update, 16 Oct 2026 (UTC): seven TRON wallets on the list move from Medium to High: TQfPjcib9hKXppxnwcrP96Lw2vYgKrJgMn, TFU6L1mcNx7Vcs5uiNaikF9MMHpBxfvzZ2, TLkp2oDMTr7GebvHKaA8sZ2TmxCzUNEazz, TREwHYmr17h3LJHkUgSNabSTDdeF8d86yk, TNLkZnYn1czoFzgKofvCFwnZKqmaQHHasw, TNDek2bQs8hRpyyBmNxZA2KUX2J4RXxnJz and TVTNEeZkyh7dxnajexQKptURZkUDYe9chC. All seven got their USDD from TZ1eeDMo9Gr1ErSwCeQ4meMJGGtaPYv89n, 4,441,193 USDD in total. TUZApsGDcSsPpo4Sxyaz8Zhjg8vKaaHce7 bought that USDD with USDT from the drain address TYohhJpmXn4uuKhC1uFRCCjMWAWPJnUfGj. I read every USDT transfer into that address: all of it was taken from two victim wallets. The earliest attacker transaction I have found on TRON is at 03:55:27 UTC on 9 Oct, when the attacker took over one of those victim wallets (section 10).

conf. HighMediumLowtimes UTC

Interactive map of every transfer by wallet: https://philgr8.github.io/ledger-drain-map/ · this report as a page: https://philgr8.github.io/ledger-drain-map/report.html

Asection A-A · bottom lineA

00·BLUF

key figuresbalances 18:46 UTC · 12 Oct 2026
75,494,920
USDT traced on TRON: 66,688,015 from the collectors, 8,806,905 from nine more wallets (Medium)
66,688,015
USDT traced on TRON from the collector wallets
10,000,001.11
USDT frozen by Tether on 20 wallets, read 18:46 UTC
56,688,014
USDT into seven bridges and swap services, 158 transfers
50,126,288
USDT matched to a payout on the destination chain
8,806,905
USDT from nine more TRON wallets, emptied into one wallet at 20:49 UTC on 9 Oct (Medium)
18,993.32
ETH in 17 wallets with at least 1 ETH, read 18:46 UTC
220.57
BTC swept from 326 wallets into four collectors (the last 16.78 BTC is Medium)
214.22
BTC held on five Bitcoin wallets, read 18:46 UTC
203.79
BTC unspent on the first two Bitcoin collectors
6,758.3
ETH into Tornado Cash, 560 deposits
899.71
ZEC paid to shielded Zcash addresses in 7 transactions on 10 Oct
Snapshot: balances 18:46 UTC, rail resolution 18:54 UTC, 12 Oct 2026. Balances (ETH, BTC, TRON USDT and the Tether blacklist) are one pass between 18:37 and 18:46 UTC. Transactions on the map and in the hop table run up to 18:37:19 UTC; the Tornado deposits of 12 Oct in section 4 I read at 18:53 UTC. The reads for the corrections of 13 Oct (the nine TRON wallets, the third and fourth Bitcoin collectors, and a second read of the seven Bitcoin balances) were made between 05:15 and 05:25 UTC on 13 Oct.
Author
Phil Grushyn (LinkedIn)
Corrections to the earlier version of this report
The headline moves from 67,719,350 to 66,688,015 USDT traced and the rails from 57,719,349 to 56,688,014 USDT (173 to 158 transfers, 97 to 91 sending wallets): a 1,000,000 USDT transfer into a Chainflip deposit channel was counted twice (section 3), and five TRON wallets with no path to the theft are out (section 10). The Bitcoin held figure moved from 214.22 to 203.79 BTC because 10.43 BTC on three wallets was taken for a separate strand; the correction of 13 Oct below reverses that. The first Tornado deposit I count is 9 Oct 15:17:23 UTC; the earlier text gave the start of my search window.
Corrections of 13 Oct 2026
A cross-check against the collector lists in public write-ups showed two errors in this report. First, section 6 said the 10.43 BTC on bc1qq2gz3dn…, bc1qynaz7ar… and bc1qzg9q2me… had no on-chain link to the collectors. That was wrong. Transaction 54e7af311e6f2a4d35aee3b6bc87947d81b92c19791f896a296590c8e186fe67 spends six inputs from bc1qgqheemzla77pesl227hdtgf5ykz62d0zvld26n and pays 4.69052803 BTC to bc1qq2gz3dn…, with 0.31714337 BTC change back. The other two wallets are fed by bc1qgqhee… and a fourth collector (section 6). Held Bitcoin is 214.22 BTC across five wallets, not 203.79. The 203.79 BTC at the first two collectors is unchanged. Bitcoin swept moves from 203.79 BTC (122 wallets) to 220.57 BTC (326 wallets). Second, nine TRON wallets that emptied 8,806,905 USDT were missing from the TRON total (section 5). The total moves from 66,688,015 to 75,494,920 USDT, of which 8,806,905 is Medium.
Correction of 13 Oct, 18:05 UTC
The reconciliation of 13 Oct missed 3,700,000 USDT that TLn8gUhn… sent into Bitget Wallet's TRON bridge on 9 Oct. The balance watch never read 0x8bc2c1bc…, which holds 1,537.39 ETH from that leg and other swaps. Both are now in sections 8 and 9. I have not added the 3,700,000 USDT to the rail table or the headline. Those figures stay as of the 12 Oct snapshot.
Ledger's statements
Ledger has not stated a total loss. On 9 Oct 2026 at 13:32:12 UTC it said it was investigating reports of loss of funds from users in South East Asia who bought from a reseller named CryptoBillis (https://x.com/Ledger_Support/status/2108551100613714002). On 10 Oct at 17:09:51 UTC it confirmed that one impacted user's device contained an unauthorized hardware implant (https://x.com/Ledger_Support/status/2108968264055345381). On 11 Oct at 17:13:22 UTC it said the volume of impacted devices is limited and that all confirmed cases involve devices sold through CryptoBilis (https://x.com/Ledger/status/2109331538072494364). Public estimates by others are higher than my figures; I have not tested any of them. Post times are the status-id times and match each page's own timestamp. I re-read these statements on 15 Oct 2026. On 9 Oct at 21:31:17 UTC CryptoBilis posted a notice dated 10 Oct: it had temporarily paused the sale and shipment of all hardware wallets, of every brand, across all its stores and online channels in Malaysia, the Philippines and Indonesia, and its physical stores were temporarily closed until further notice (https://x.com/cryptobilis/status/2108671666490626200). On 13 Oct at 06:39:17 UTC Ledger described the implant: it sits inside the enclosure, reads the recovery phrase shown on the setup screens, and its microcontroller transmits the words over LTE using a provisioned eSIM; it does not modify the Secure Element or the Ledger operating system and does not alter transactions or signatures (https://x.com/Ledger/status/2109896739985453358). In the same post Ledger said it had confirmed the implant in one affected user's signer and had not confirmed the total number of users or the value lost.
Scope
every chain the funds touched. TRON USDT from the drain collectors to the rails and to Tether's freeze at 12:09 to 14:10 UTC on 9 Oct; the USDD detour and the nine wallets emptied into TRu643b…; the four Bitcoin collectors, the 326 wallets swept into them and the three wallets downstream; Ethereum wallets the rails paid; Tornado Cash deposits and withdrawals on Ethereum; the BNB Chain, Polygon, Arbitrum, Base and Solana legs; Avalanche and Optimism probed per address; balances of the ETH and BTC wallets in the case. Every figure below comes from a transaction, a contract read or a service's own order record that anyone can repeat; hashes are in the appendix.
Not covered
the four USDD walks I valued start from 10,042,336 USD; the USDD bought by the other buying wallets was redeemed at the swap router or passed on without a valued walk, and I make no claim about it. 4,228,162 USD of the walked USDD value sits on wallets I expand next, and so does 5,998,960 USDT of the nine-wallet parcel (four busy wallets, section 5). About 6.35 BTC that the third and fourth Bitcoin collectors passed on beyond the three downstream wallets is not traced to an exit. I do not count Tornado Cash withdrawals or Zcash payouts that chain data does not tie to the attacker. HiFiSwap (3 of 49 orders), one Bridgers order and one NEAR Intents order are not resolved. The Tornado withdrawals are not linked to individual deposits. I did not trace the two forwarding wallets of 12 Oct past their Tornado deposits, and a large Solana wallet that Relay paid is not attributed (section 7).
Confidence
High = read from a signed transaction, a contract call or a service's own order record. Medium = an inference from High facts. Low = a hypothesis.

01·How I started

Collector addresses were already in public write-ups by Specter, SEAL 911, Bitquery and YFarmX. I read each one on chain, kept the ones that matched the drain's timing and flows, and walked forward from them. Everything below is a transfer I read myself. The first rail deposit I traced is 05:41:18 UTC on 9 Oct (USDT0, 500,000 USDT, tx 14363215f8666b403ed1fc10776f9fd3dd7051898c4a93e4ba914e392edda898). (High)

02·Collectors, distributors and the frozen parcels

03·The seven rails

56,688,014 USDT left 91 TRON wallets in 158 transfers. The USDT amounts, entry counts and times in the table are TRON transfers, without the five removed wallets (section 10). One 1,000,000 USDT transfer into a Chainflip deposit channel is the same money the Chainflip Vault fetched three minutes later; I count it once. "Resolved" means I matched an entry transaction to the payout on the destination chain from the service's own order record or an on-chain message id; the order counts cover the 187 service orders of the wallets I kept, on all source chains, read at 18:54 UTC. The table leaves out 3,700,000 USDT that TLn8gUhn… sent into Bitget Wallet's TRON bridge on 9 Oct, found on 13 Oct (section 9).

RailUSDT in (TRON)Entry txs (TRON)Sending walletsFirst to last TRON entry (UTC)Orders resolved (all chains)
USDT0 bridge20,000,00040409 Oct 05:41 to 07:4340 of 40
THORChain18,128,51526239 Oct 09:02 to 11 Oct 16:1926 of 26
Relay9,497,7733699 Oct 06:35 to 14:0238 of 44
Chainflip5,906,18013129 Oct 08:51 to 11 Oct 11:3513 of 13 in the service's records
NEAR Intents2,200,000669 Oct 06:33 to 08:256 of 7
Bridgers600,000439 Oct 06:36 to 07:203 of 7
HiFiSwap355,54633112 Oct 11:19 to 13:413 of 49

Resolved destinations, all (High) (protocol identifiers, not timing):

04·Tornado Cash and the exit to Zcash

04b·Update, 14 Oct: out of Tornado Cash and out of Zcash

05·USDD: a detour inside the rails, and nine more wallets

06·Bitcoin

07·The other chains

08·Held and moving

Read between 18:37 and 18:46 UTC on 12 Oct: the watch read 123 wallets (Ethereum, Bitcoin and TRON addresses) and did not read the four Solana wallets, which I read separately (section 7).

09·Exchange deposit addresses

Update 13 Oct 2026: I reconciled every outflow of every attacker wallet on my list after the theft. That found more exchange and bridge exits than the three in the table below. It missed the Bitget Wallet legs from TRON, added at 18:05 UTC. (confidence per line)

The first three deposit addresses I found: (Medium: deposit-address pattern, not a confirmed customer)

10·Addresses removed from my list

I removed 12 addresses after checking their paths, and the transfers they made are out of every figure above. (Medium: each rests on the absence of a path)

11·Open items

Per-address CSV: file 2 in this gist. Every wallet-to-wallet transfer I drew, as of 15 Oct: hops.csv (file 3 in the gist holds the rows up to 13 Oct). Bitget Wallet payouts to TRON: file 4. Bitget Wallet orders from TRON to Ethereum: file 5. Map of the transfers: https://philgr8.github.io/ledger-drain-map/

A·Appendix: transaction hashes

Times in the report are block times.

NEAR Intents to Zcash, seven payouts (Zcash block times, 10 Oct): 12:27:00 4ef0612f0227d010cbbea38d3ad58788d8d58027f0b9f62b9b242421e781e7c5; 12:33:30 ebc7ec63cb5e7b220a8ae5d5ef91c1c36e46e2d3173807934586c784031626ad; 12:41:24 85e0441da8ec3241f93fdf19fbb5e204b608714899392df18e808edff0cfdf6f; 13:33:14 5c4a28b4404d955bc228842274ef2978a96d944f36bd72e02761efa70ca095e9; 13:38:03 e7c0b42b771d6aca724527f369b7b8df83cca3dd1eda3900f705c07f5fc7834a; 13:43:01 b1936b55e9ce4f16b4ee0e87a04b837bde4c9ce0f673b202a365366990b20430; 13:54:44 70a8035bf1b7d408e4588af76bbf5e76d1e27e49b8c6cd5c3f6f54e45466bf0d

USDD parcel THORChain swaps, TRON swap then Ethereum payout: 11 Oct TRON swap 18:51:24 81369cb61f373570d81c18aa9056c697263b2d7138b47a26192f2cb94323287d; its Ethereum payouts 12 Oct 03:59:59 0xbc56156e308dea5ab1c9ec0ae5549bacaa14ef81452b50527a584d336cd46e27 (491.67 ETH) and 0x28c9e56358eb264dc15a76d2f29dae2a7afa84b878ee981c1f4f6ccb2bb1150f (216.64 ETH). 11 Oct TRON swap 18:46:09 0ec0e032d6877914cf7bbff8bad615565bd992d7f740bfc3ebc5e42969b439d7; its Ethereum payout 11 Oct 22:36:11 0x3670c1219fd30472caf0536953fe894273b707ebbdfc077575409d2d39f123e3.

12 Oct TRON swap 06:11:21 4bea29231f2db5bce7612efe752d332e8bed9dac7cf04e7b34eb6bd2995b64a7; its Ethereum payout 12 Oct 11:44:23 0x70d580f7059c7b8bc1317cb9496a07b160695ed1b113835e3b7e6260930bd107. 12 Oct TRON swap 06:15:48 812914dd2f5a07b8b5ce88fbb0b44ceeaff570ebdeb6505ca7e5d357c3101d1d; its Ethereum payout 12 Oct 12:02:35 0x76348aa448f36ce45aae7d5ee8c288ef88a016518c36ef107ec97d1dfde482f2. 12 Oct TRON swap 06:36:09 f520bbd65fdde1f8dcb95de8233a3d5b527dac90cb828a70dc154b6bddfca7b1; its Ethereum payout 12 Oct 11:56:23 0x31ecd74ca475579452f9b5f5a36eab5679bbb4c89de64e2d580b155ec1fe9dac.

12 Oct TRON swap 07:09:57 e9b9d647db2c42879a9e90ed1b6f94ba796ce2e81a9284628a1ad832cca27288; its Ethereum payout 12 Oct 11:49:59 0xb2196ffd2592c403ed9e6bb57a3d1a2966e202059a4ee76a43209152ce06c3c0. 12 Oct TRON swap 13:33:45 34cd551eb9ded5300d4d783323f10805b92ca0eece2bde9ac03f573d41219da9; its Ethereum payout 12 Oct 19:08:59 0x15a83c397b7e8bd4e2ba5b265706235ccf84312b95e8383a1738298149bf92b0. 12 Oct TRON swap 13:52:27 00f02d8ade5af3b929bb38ff86ac5bccce1686d88fbb9bb344ca42d2e637cd80; its Ethereum payout 12 Oct 17:37:11 0x3098413cb38e44f5b3ea8581d34ded063a1474cbdb9eca548f8911b367d797a1.

Zcash, three later lots and their exits (10 Oct): 92099a0196bdcebaf2cd60ff721ad28d86e637f8a8d61a2808a2bc534029526a -> 5a347e5f41d7969975b9e93de947a23b4208147aec44bdfa030f697ea6077195, 7810e00d9f1e2d7bd26ebbf739d5e86073c4453d7c9f1940acc3f69d26800eb2; c8903a9fa4b607a0d63d9c589cda8fb6dc02f3d09f2d0a2f8bccf9817f77e980 -> daffb9cccc5a69de5cabed503f6161d39978403867f4345f376b8f000dabb18c, 9b2f6baca40d566a5c952d299b14de6964518721a71b1f3d51a6a4dd1f696f1f; 8fa169363c7da575b7bb30d52aa2df2934feb973658d3750e9e9120275d6763e -> 7f49db42695eee7a05e393fd288e30882593ef077e17db67ef3b224609114b48, 8053cef6654ed6d71b307f2fc338dd9f60385135ea1c4774ac52237110224a12.

Tornado withdrawals to the two thief wallets: the 15 transaction hashes are in file 3 (leg TORNADO-OUT), including the 5 x 1 ETH and 2 x 0.1 ETH withdrawals. The eight 12 Oct deposits are in file 3 (leg ETH-TORNADO, from 14:45:59 and 17:25:11 UTC).

Tether's freeze of one wallet (TB6bJfqPjbfhg4Qa8y81CnUK3KHrN6Sd1g) at 12:09:42 UTC on 9 Oct, tx fbf788661c249713fd0816c8a3fe9d93313209fe8763f83249b9199d6987231a.

Phil Grushyn · balances read 18:46 UTC, 12 Oct 2026 · rail resolution read 18:54 UTC · all times UTC
FORENSICSinvestigation report
caseLEDGER-2026-10
balances2026-10-12 18:46 UTC
rails read2026-10-12 18:54 UTC