Informational only, and this site never asks for your recovery words.details
Informational only. This is independent analysis and an
evidence-backed explainer, not financial, security or legal advice, and
not a substitute for professional advice about your own situation. It is
not affiliated with, endorsed by, or speaking for Coinkite, Block, or any
other party named here. Published estimates are attributed, and differing
scenarios are kept separate with their assumptions. Act on your own
judgement.
Editorial standards and corrections.
Do not disclose recovery material to a website, form, message or support account.
This site never asks for it. Deliberate recovery on independently verified
offline equipment is a separate operation.
Seed-word safety.
Plain language
Updated 2 Aug 2026
Timeline
From the guard being written in 2021 to disclosure and model-specific hotfix releases in 2026.
No code. Written to be actionable.
On 30 July 2026, inside a window of about 41 minutes, funds were swept from roughly 1,200
bitcoin addresses, and published analyses attribute the sweep to COLDCARD
seeds that could be guessed. Two advisories followed within a day and
disagreed about which models were affected. Everything dated before 30 July
is the archaeology of how a build-time guard written in 2021 became a live
key-generation defect; everything from 30 July onward is the incident and
the response. The arithmetic behind the swept totals is kept on
the funds-accounting page. The
disclosure page reconstructs 30 and 31 July
in second-level detail; this timeline is the sparse spine.
28 Jan 2021
The #ifndef MICROPY_HW_ENABLE_RNG guard exists in libngu. Its defined-zero defect is already present, but COLDCARD seed generation does not yet use this path.
1 Mar 2021
Commit b18723dddb6d751c39978e4364b56b2414f68b47 migrates wallet generation from ckcc.rng_bytes() to ngu.random.bytes(). Combined with the existing defined-zero guard defect, the migration activates the affected path.
17 Mar 2021
Firmware v4.0.0 ships for Mk2 and Mk3, opening the first exposure window. Its normal seed-generation path XORs output from the MicroPython and libngu Yasmarang generators before hashing.
11 and 14 Mar 2022
The reseed() API is added to libngu, and Mk4 v5.0.0 ships as the first production firmware calling rng_seeding() on the normal boot path. A secure-element-derived value overwrites one libngu state word, contributing at most 32 bits; other UID and timing terms remain in published models.
26 Jun 2023
Firmware v4.1.9 ships. For the next three years it remains the latest published Mk3 release, and it contains the affected path.
8 Feb 2024
First public Q firmware, v0.0.3Q, with production v1.0.0Q on 10 Mar 2024. Every Q build in the published release history before v1.5.0Q contains the affected path.
10 Mar 2026
COLDCARD Mk5 launches on firmware v5.5.0 and uses the Mk4-class generation path. Its pre-hotfix releases are affected under the same published candidate-space models.
30 Jul 2026, early UTC morning
The 500-transaction set spends 1,324 UTXOs from 500 source addresses across four consecutive blocks, 960,188 to 960,191. Gross inputs total 594.51379184 BTC; 594.47722484 BTC reaches the first collector after fees. Block timestamps span 15 minutes 18 seconds. Galaxy's wider attributed set begins in block 960,183 and spans 41 minutes. Bitcoin Optech states 29 July without a timezone; a US-local date is possible but not established in the newsletter. The sets and clocks are reconciled on the funds-accounting page.
30 Jul 2026
Coinkite publish the Mk3 Security Advisory, initially scoping the issue to Mk3 and stating Mk4, Q and Mk5 were "not affected based on our early analysis". That earlier state is recovered from the Internet Archive; this project's own capture of the page began 1 August. Block's engineering team publish their technical report the same day with a wider affected scope. Block states that it published before the vendor's analysis was complete because it believed exploitation was active.
31 Jul 2026, 00:03 UTC
Block's preliminary thread identified 695 additional transactions, netting 488.10957948 BTC, by the same fingerprint. A later privacy-safe recheck places them in blocks 960,183 and 960,185, inside Galaxy's 41-minute window and before the 500-transaction subset. The common-operator attribution remains unverified because Block explicitly said it had not confirmed that the earlier waves were related to the drain.
31 Jul 2026, 05:17 to 05:19 UTC
The signed-release record lists Q hotfix 1.5.0Q at 05:17 and Mk4/Mk5 hotfix 5.6.0 at 05:18. Source release commit 3238f6f follows at 05:19 with the note: "No new features but will generate entropy correctly."
30 Jul 2026, publisher date; expanded-scope time unresolved
Coinkite's entropy technical backgrounder displays a 30 July publication date. Its state held on 1 August includes Mk4, Mk5 and Q and presents scenarios near 72 bits for those models and 40 bits for Mk3. The first appearance of that expanded scope relative to the 31 July hotfix records has not been established.
31 Jul 2026, 11:37 UTC
An official COLDCARD update directs Mk3 users on v4.0.1 or later without at least 50 private independent dice rolls to migrate, and directs affected Mk4, Mk5 and Q users to update before generating a new seed. The vendor's stated Mk3 range remains narrower than the v4.0.0 start established from source and release records.
31 Jul 2026, 13:43 UTC
The official Mk3 update announces firmware 4.2.0 as available. The 07:30 UTC advisory state had described a final Mk3 release as under evaluation rather than committed, contingent on validating a sufficiently safe upgrade path, and told users not to wait for it. The vendor downloads page checked on 1 August lists 4.2.0 as current for Mk2 and Mk3; this archive has not installed or independently checked the binary.
31 Jul 2026, 15:42 UTC
NVK publishes an apology on behalf of Coinkite, taking accountability, committing to a technical postmortem covering why their own review missed it, and offering written incident summaries to affected users for police reports and insurance claims.
31 Jul 2026, 16:54 UTC
The official Edge update announces 6.6.0X for Mk4/Mk5 and 6.6.0QX for Q. Mk3, Mk4, Mk5 and Q then have named vendor fix releases.
31 Jul 2026, 17:42 UTC
Block's Clay Garrett reports that the operator used a paid account at a well-known blockchain-services provider to query the source addresses during the sweeps, and that the provider's internal logs matched the suspected workflow "with extraordinary specificity, including the number, timing and sequence of requests". Shared with authorities.
1 Aug 2026, captured 05:28:59 UTC
The community coldcard-watch tracker expands its headline from the first 1,195-address episode to two episodes totalling 2,321 addresses and 1,128.4717 BTC. This records the tracker's changed attribution. The relationship of the later 45.9 BTC cluster to the principal incident set remains unverified.
1 Aug 2026, 11:21 UTC
Coinkite ask owners to treat migration as urgent: follow the advisory for the model, upgrade the device, generate a new seed, move funds carefully, and pass the message to owners who are less online. The post quotes the vendor's 31 July urgent update, which states the Mk3 boundary as 4.0.1 and later and carves out seeds created with at least 50 private, independent dice rolls.
1 Aug 2026, 12:29 UTC
Kevin Loaec of Wizardsardine reports that Mk4, Mk5 and Q wallets are "now actively drained", quoting Tomer Strolight's account of a COLDCARD Mk4 seed deliberately left funded as a duress wallet and swept overnight to bc1qzm5pauxyv7t7vqstzpumqcn066wfjsmev34mf3. The same post argues that breaking an Mk4 is harder than breaking a weak passphrase, so Mk3 seeds behind a passphrase at or under roughly 32 bits are at immediate risk. This is a reported third-party account of a single wallet. The pinned funds dataset here covers the 30 and 31 July waves and holds no addresses, so it cannot corroborate the sweep. The named destination does appear in held captures of a community tracker as a 1 August vault holding 0.33203236 BTC from 16 sweeps, and a later capture of that tracker records its Mk4 attribution as withdrawn in favour of an Mk3-origin seed. The device model behind a sweep is not visible on chain.
1 Aug 2026, 13:35 UTC (9:35 a.m. EDT)
The Mk3 advisory carries a third dated update. It replaces the blanket warning that affected Mk3 owners' funds "may be at risk" with two published conditions: funds are at risk unless the seed was created with at least 50 fair, independent, private dice rolls and the wallet is protected by a strong, unique BIP-39 passphrase. The passphrase section moves in both directions, saying that reduced seed entropy alone is not enough to reach a passphrase wallet, and also that a strong passphrase does not repair the affected seed and that passphrase users should still migrate. The backgrounder carries the same update, while the banner on the vendor's downloads and terms pages moves from "may be at risk" to "are at risk". The disclosure page sets the three recorded revisions side by side.
1 Aug 2026, 15:45 UTC
Wizardsardine publish a long-form post-mortem, announced by Kevin Loaec. It addresses Liana and multisig configurations first, then reconstructs the flaw, and argues the incident is worse than commonly understood because owners with dice-generated seeds still have device features that depend on the same generator. Wizardsardine sells Liana, a competing wallet product, and the authors describe the post as written quickly and invite corrections.
1 Aug 2026, 15:47 UTC
Loaec separately states that owners who imported a seed or generated one with dice are also exposed if they used certain COLDCARD features. The features are enumerated in an attached graphic that did not render in the held capture, so the list itself is not established from what is held here. The claim extends the incident beyond seed generation into derived material; what else the generator touched tracks which features are established from source.
1 Aug 2026, 16:09 UTC
A separate matter involving the same party: Block's Clay Garrett publishes initial findings on a reported vulnerability in Block's own Bitkey product, disclosed to Block by 1440000bytes. This is not the COLDCARD RNG defect and does not bear on it. Block states that exploitation would require exceptional circumstances during a narrow window in inheritance setup, that an attacker would not obtain enough cryptographic material to reach funds, that it sees no risk of remote drains, and that a mobile-app patch would be submitted the same day.
1 Aug 2026, 16:35 UTC
bitcoin++ Insider Edition announce Dustin Dettmer's commit-history walkthrough, "When random.bytes() runs but doesn't work". It reads the firmware history around the disabled hardware-RNG guard and the call chain that left seed generation on the software generator.
1 Aug 2026, 18:35 UTC (2:35 p.m. EDT)
The Mk3 advisory carries a fourth dated update, and it settles which devices the vendor says are involved. The affected range becomes "Mk2 and Mk3 firmware versions 4.0.1 through 4.1.9 inclusive", the fixed release is listed as "Mk2/Mk3: version 4.2.0 or later", and the one-device migration section, the optional dice-only section and the closing migration steps are rewritten from Mk3-only to Mk2-or-Mk3 wording. The backgrounder carries the same dated update and the same substitution, saying the active PRNG on "Mk2 and Mk3" was seeded primarily from device and timing state. Until this revision the advisory named only the Mk3, and the vendor downloads-page listing was the only vendor evidence placing the Mk2 in either the affected range or the hotfix. The published lower bound stays at 4.0.1 for both models, so the v4.0.0 boundary difference is unchanged. The disclosure page sets the four recorded revisions side by side.
1 Aug 2026, 18:38 UTC
Galaxy Research identify a third sweep wave of 207.7294 BTC and revise their estimated observed size of the incident to 1,367.05 BTC across 4,585 addresses, superseding the roughly 1,083 BTC total they published on 31 July. The same thread reports 1,366.3865 BTC under attacker control with all endpoint attacker addresses fully unspent on chain, and carries Galaxy's own method limit: the work derives solely from block data and the unspent-output set, and Galaxy has not tested whether the addresses it identifies as possible victims were in fact generated with low entropy. Galaxy also states that the vulnerable firmware shipped on 17 March 2021 around block 674,951 and that no coin identified in waves 1 to 3 was created before that block; what that means for the published version ranges is on the firmware page. Galaxy's scope is wider than the 30 and 31 July sets reconciled on the funds-accounting page, which does not adopt the revised total.
This has happened before
Predictable key generation has appeared in several earlier incidents, including Debian OpenSSL, Android SecureRandom, Randstorm, Milk Sad and Trust Wallet. Their mechanisms, populations and evidence differ. The precedent page compares them with those differences stated.
A recurring engineering property is that a randomness API name does not attest to the source behind it. Output-side statistical tests can miss a source substitution, so build-time guards, link inspection and provenance-aware tests serve different purposes.
What reproducible builds establish
A successful reproducible-build comparison can show that a distributed binary corresponds to specified source and build inputs. It does not establish that the source logic is correct. Reproducibility and source review therefore address different failure modes.
Discovery and detection limits
Coinkite stated an inference that someone found the defect by applying AI to the public source. The AI evidence page separates that inference from the separately reported post-disclosure reproductions.
Why output checks did not attest to provenance
Yasmarang output varies and can pass the codebase's basic distinct-byte and repetition checks. Those checks can still fail on degenerate values, but they do not prove a hardware source. The compile-time guard tests whether the macro is defined rather than whether its value is enabled. Tracing the call to the linked rng_get() implementation exposes the substitution; a provenance-aware runtime or build test could also detect it.