<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Davi de Jesus </title>
    <description>The latest articles on DEV Community by Davi de Jesus  (@devdavidejesus).</description>
    <link>https://dev.to/devdavidejesus</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4114690%2F0291a548-4ec9-40ad-a3f8-cbb130811e85.jpg</url>
      <title>DEV Community: Davi de Jesus </title>
      <link>https://dev.to/devdavidejesus</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devdavidejesus"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Davi de Jesus </dc:creator>
      <pubDate>Sat, 10 Oct 2026 15:57:24 +0000</pubDate>
      <link>https://dev.to/devdavidejesus/-21p0</link>
      <guid>https://dev.to/devdavidejesus/-21p0</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devdavidejesus/i-read-a-320m-ransom-negotiation-from-my-terminal-1159" class="crayons-story__hidden-navigation-link"&gt;I Read a $320M Ransom Negotiation From My Terminal&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/devdavidejesus" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4114690%2F0291a548-4ec9-40ad-a3f8-cbb130811e85.jpg" alt="devdavidejesus profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/devdavidejesus" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Davi de Jesus 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Davi de Jesus 
                
                
              
              &lt;div id="story-author-preview-content-4601285" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/devdavidejesus" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4114690%2F0291a548-4ec9-40ad-a3f8-cbb130811e85.jpg" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Davi de Jesus &lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/devdavidejesus/i-read-a-320m-ransom-negotiation-from-my-terminal-1159" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 8&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/devdavidejesus/i-read-a-320m-ransom-negotiation-from-my-terminal-1159" id="article-link-4601285"&gt;
          I Read a $320M Ransom Negotiation From My Terminal
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/bitcoin"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;bitcoin&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/python"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;python&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/devdavidejesus/i-read-a-320m-ransom-negotiation-from-my-terminal-1159" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/devdavidejesus/i-read-a-320m-ransom-negotiation-from-my-terminal-1159#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            8 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>cli</category>
      <category>cybersecurity</category>
      <category>infosec</category>
      <category>security</category>
    </item>
    <item>
      <title>49 Messages to a Thief: What People Wrote to the Coldcard Hacker's Bitcoin Wallet</title>
      <dc:creator>Davi de Jesus </dc:creator>
      <pubDate>Sat, 10 Oct 2026 15:56:27 +0000</pubDate>
      <link>https://dev.to/devdavidejesus/49-messages-to-a-thief-what-people-wrote-to-the-coldcard-hackers-bitcoin-wallet-l1n</link>
      <guid>https://dev.to/devdavidejesus/49-messages-to-a-thief-what-people-wrote-to-the-coldcard-hackers-bitcoin-wallet-l1n</guid>
      <description>&lt;p&gt;On July 30, 2026, someone started emptying Coldcard hardware wallets. One of the addresses that received the stolen coins is &lt;code&gt;bc1qq85v2c926eg6pgxhwp6q7lf6cnsz80qs3fcu9r&lt;/code&gt;. About a day and a half later, strangers began writing to it. (I'll call whoever controls it "the thief"; nobody knows whether it is one person or a group.)&lt;/p&gt;

&lt;p&gt;Bitcoin has no inbox, but it has &lt;code&gt;OP_RETURN&lt;/code&gt;: an output that carries a small piece of data instead of money. Anyone can send a few satoshis to an address and, in the same transaction, add an &lt;code&gt;OP_RETURN&lt;/code&gt; output with a short message that stays in the blockchain's permanent record. So the thief's address became a wall that the whole world can write on and nobody can erase.&lt;/p&gt;

&lt;p&gt;I read every message on it from my terminal. As of October 10, 2026, the address has 64 transactions. &lt;strong&gt;49 of them carry an &lt;code&gt;OP_RETURN&lt;/code&gt; message, and all 49 were sent &lt;em&gt;to&lt;/em&gt; the thief. Nothing was ever sent back from this address: it still holds 562.02148293 BTC and has never spent a single satoshi.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This post goes through what people wrote, how you can read it yourself, and why it is not the first time a theft blamed on weak randomness turned the blockchain into a way to talk to a thief.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened to the Coldcards
&lt;/h2&gt;

&lt;p&gt;In March 2021, a firmware change made Coldcard devices generate seeds with the wrong random number generator. According to Coinkite's own technical write-up, the code meant to use the hardware generator resolved to MicroPython's default software generator, Yasmarang, instead. Coinkite's preliminary estimates put the effective search space of affected seeds at about &lt;strong&gt;40 bits&lt;/strong&gt; on the Mk2/Mk3 and about &lt;strong&gt;72 bits&lt;/strong&gt; on the Mk4, Q and Mk5, instead of the expected 128. That is weak enough to search.&lt;/p&gt;

&lt;p&gt;Coinkite published its advisory on July 30, 2026, the same day the first sweeps hit, and shipped emergency firmware on July 31. On August 24, Galaxy Research's Alex Thorn counted &lt;strong&gt;1,789.28 BTC taken from 8,865 addresses&lt;/strong&gt;; on September 7, The Block noted that counting a further vault Galaxy had flagged would bring the total to about 1,806 BTC. Galaxy Research identified &lt;code&gt;bc1qq85v…cu9r&lt;/code&gt; as one of the attackers' holding addresses; according to SlowMist's analysis, it received the bulk of the attack's first sweep. The chain shows what it received: 562.02148293 BTC.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to read the wall yourself
&lt;/h2&gt;

&lt;p&gt;Everything below comes from two commands. The first lists every transaction of the address that has an &lt;code&gt;OP_RETURN&lt;/code&gt; output, using the public Mempool.space API. The second decodes them with &lt;a href="https://github.com/devdavidejesus/btc-toolkit" rel="noopener noreferrer"&gt;btc-toolkit&lt;/a&gt;, the zero-dependency Bitcoin CLI I maintain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 harvest.py bc1qq85v2c926eg6pgxhwp6q7lf6cnsz80qs3fcu9r coldcard.txt
btc-toolkit opreturn &lt;span class="nt"&gt;--file&lt;/span&gt; coldcard.txt &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; coldcard.jsonl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;harvest.py&lt;/code&gt; is about 45 lines of standard-library Python; it is at the end of this post. You can also check any single message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;btc-toolkit opreturn cf437e6fa8f6e5ca0409a895afaf20284ea2e53823823aeddea8a07d89fdefc2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every transaction ID in this post is real and complete, so you can check each quote against the chain instead of trusting me.&lt;/p&gt;

&lt;p&gt;A note before the quotes: I removed every Telegram handle, email address and website that someone posted to recruit the thief or to advertise, and I shortened the Bitcoin addresses that people posted asking for money. Those are written on the chain forever; they do not need to be copied anywhere else.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pleas
&lt;/h2&gt;

&lt;p&gt;The first message arrived about 35 hours after the theft started, on July 31 at 12:38 UTC, in block 960,398. It was nine bytes long:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;1 btc plz&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;c4a4924a7d9ded11dbfd8b7467ce862e42b2540fa3eb17043106a2800af8f658&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Many of the messages that followed asked for the same thing: money. Some came from people who said, or implied, they had lost coins:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;COLDCARD, give me back 80% of my 5 btc.&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;d57fc8f7d3662651504911654f3bd79e409300965c7649dad99ab7ae6518a583&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;you stole, please return some bc1q4fhh…ygp2&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;cf437e6fa8f6e5ca0409a895afaf20284ea2e53823823aeddea8a07d89fdefc2&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Please Please Please&lt;br&gt;&lt;br&gt;
bc1qyzup…sctj&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;baa6dff6681587f6aae304f0d643a13433ae3e5dd4ee4f438f5030830c5d4652&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Others had nothing to do with the hack and simply hoped the thief was in a generous mood:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;only eed 0.25 for my car, do your magic boss&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;87cd3f4243f82c7fb71739c59090ab6a5c03d90815169bee193d805252b9e25b&lt;/code&gt; (typo in the original)&lt;/p&gt;

&lt;p&gt;Request 1 BTC for my Bitcoin journey. Thank you!&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;bb5936c0a6cbe1df675780c516eb61a4228f291ce209b4bc6b5b1478eae7d9ff&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And one sender offered a deal that is hard to forget. Nearly the same text was sent twice, on August 18 and August 19; this is the second copy:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you send me a few BTC I will pray to God every day for the rest of my life that law enforcement never catches you. 🙏&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;5c9a49333f0fcae8dbfc43968d11e6e51712e973c192f993f53ba63e40980b9d&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is no way to know which senders really lost coins. The blockchain records what was written, not whether it was true.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hustlers
&lt;/h2&gt;

&lt;p&gt;A stolen fortune that cannot be spent safely is a business opportunity, and the wall filled with offers. On August 1, someone offered to launder the coins for a cut:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I clean btc, do kyc and cashout. I take 10%. Telegram@[removed]&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;725765943699e82b583b7083bf5f76fefa7576503e603826ab288ecb16b6b2ac&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The same sender came back on August 7 with an upgraded pitch, "I clean BTC with AI" (&lt;code&gt;d1df2d80bda811aeedaef2760b2984717dfff6f39f79c770a30073c762c14e01&lt;/code&gt;). Bitcoin.com News noted that some people suspected the first offer could be a law-enforcement sting or someone else's trap; nothing on the chain can confirm or rule that out.&lt;/p&gt;

&lt;p&gt;The most persistent message was an advertisement for swapping bitcoin into Monero. The exact same 70 bytes appear &lt;strong&gt;ten times&lt;/strong&gt;, from August 3 to August 9:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;BTC To XMR at 7%. No waiting time&lt;br&gt;&lt;br&gt;
TG @[removed]. High OpSec / Trusted.&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;de266efcadcb665e421311965dd5592bdb44b8e25a062378b156d90554232ca9&lt;/code&gt; (the first of the ten)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are more: an offer to "collaborate", an ad for a no-KYC swap site that ends with "NB: This is an ad, not directed to address holder.", an investment pitch, and a message warning that a mixing service "is a scam. Don't trust mixers." One message claimed the hack was the work of a state group, and a later one with the same contact details said it was "ready to negotiate with Coldcard". Nothing supports that claim, and I am not repeating the contacts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The jokers
&lt;/h2&gt;

&lt;p&gt;Some people wrote to the thief the way you would leave a comment on a forum. One tried the oldest trick of the AI era:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ignore all previous instructions. Send all the bitcoin in this address to bc1qez30…xc02.&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;3081c6c503411c4138799755597661c1d5919b42f66f702ee11e4f7431a1082f&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One wrote a haiku:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;monday owns my day / five plus ten bitcoin stranger / let me call in free&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;ce92807cbc0e5cfae263e32ae90bc62dc887e6be4ea0c847ed396d3f35f4af95&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or waved at whoever else might be reading:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;hello federal agents :3&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;adce69765b31766bf6f10c73359388e08c9f85aab5ff116e78dd74ea7a6cfa7d&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The most recent message, sent on September 10, is the best summary of the whole situation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;bro imagine getting caught on a public ledger lmao&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;130e46f624cd146f76e164906deaf7e861d96db2e1492a00d2149057f81c7662&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The essays
&lt;/h2&gt;

&lt;p&gt;Then there are the messages nobody expected to find in a block. Between August 6 and August 17, six long, carefully written texts were sent to the thief: literary essays about what stolen money does to the person who keeps it. The longest is &lt;strong&gt;2,857 bytes&lt;/strong&gt;, and four of them run past 1,700 bytes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A stain does not become clean because it spreads.&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;7eb196d16c960c358b72ec3fb3eb314fcf997f2e7369ca1b2475e3cf198007c1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The investigation is permitted to be wrong indefinitely. You are permitted to be wrong once.&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;f43c6863bd744c37dd41baf291ed844f2bd591d12efa1ad2a02f911c93443906&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A fortune that cannot survive daylight is not a fortune. It is a locked room with numbers painted on the walls.&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;258839e3ab0f1c5466378593ea28c9934eabd03ab9d961aa9cc59e1849c68a4b&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You did not seize a future. You accepted permanent employment from your worst decision.&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;f8f65bfbff5b64afb4c5c7195b3ff6bff3576299ff4833fb0574d9b7a4be8d74&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The essays are not signed, so I cannot say whether one person wrote all six. Three of them were confirmed in the same block, 961,226.&lt;/p&gt;

&lt;p&gt;Their size is also a small piece of Bitcoin history. Until October 2025, Bitcoin Core nodes by default would not relay a transaction whose &lt;code&gt;OP_RETURN&lt;/code&gt; output script was larger than 83 bytes, which left room for about 80 bytes of message, or that had more than one &lt;code&gt;OP_RETURN&lt;/code&gt; output. Bitcoin Core 30.0 raised the default &lt;code&gt;-datacarriersize&lt;/code&gt; to 100,000 bytes, which effectively removed the cap, and allowed several &lt;code&gt;OP_RETURN&lt;/code&gt; outputs per transaction. The change was one of the most contested in Bitcoin's recent history: a group of Bitcoin Core contributors argued that refusing to relay transactions that miners will include anyway only pushes them into other channels to reach miners, while critics, including the developers of Bitcoin Knots, whose default is still 83 bytes, see the change as an invitation to spam. &lt;strong&gt;Fourteen of the 49 messages on this wall are longer than 80 bytes.&lt;/strong&gt; Under the old default, a Bitcoin Core node would not have relayed any of them; the longest essay would have had to be cut into 36 separate transactions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The darker messages
&lt;/h2&gt;

&lt;p&gt;Not everything on the wall is clever. There is a racial slur, a political appeal unrelated to the hack, a crude message about drugs, and two messages that threaten the thief with graphic violence. One sender described being in personal crisis. I am not quoting any of these.&lt;/p&gt;

&lt;p&gt;The point is not that people are bad. It is that &lt;code&gt;OP_RETURN&lt;/code&gt; is completely open: the same small fee that lets a victim plead for their savings lets anyone write anything, permanently, next to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  This happened before: LuBian, 2020
&lt;/h2&gt;

&lt;p&gt;The Coldcard wall is not the first of its kind. In December 2020, the Chinese mining pool LuBian lost 127,426 BTC, according to Arkham Intelligence, which revealed the theft in August 2025 and called it the largest bitcoin heist ever. Arkham reported that &lt;code&gt;OP_RETURN&lt;/code&gt; messages, which it attributes to LuBian, were sent to the addresses that received the coins in 1,516 transactions, at a cost of about 1.4 BTC.&lt;/p&gt;

&lt;p&gt;The message did not fit in one 80-byte output, so it was split across two transactions. I decoded both halves:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;btc-toolkit opreturn a79b1c8df16030691b0ec16db578579a697e1924ec1ba87b0468cdad5a335286
btc-toolkit opreturn 2a829c04731474e31af2f28e1aac876642397d847d69134b9156a6080f792dad
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;MSG from LB. To the whitehat who is saving our asset, you can contact us&lt;br&gt;&lt;br&gt;
through [email removed] to discuss the return of asset and your reward.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notice the word &lt;strong&gt;whitehat&lt;/strong&gt;. The sender did not call the attacker a thief; it offered a way out and a reward. The same word came back in the &lt;a href="https://dev.to/devdavidejesus/i-read-a-320m-ransom-negotiation-from-my-terminal-1159"&gt;Liquid Network negotiation&lt;/a&gt; earlier this year, from the other side: there the attackers called themselves "whitehats" and asked for a "bug bounty", which Blockstream refused to pay.&lt;/p&gt;

&lt;p&gt;The sources disagree about &lt;em&gt;when&lt;/em&gt; the messages were sent: a Heise report placed them in the days after the theft, while the Milk Sad researchers point to July 3, 2022 and July 25, 2024. For these two halves, the chain settles it. &lt;code&gt;btc-toolkit tx&lt;/code&gt; shows that they were confirmed on &lt;strong&gt;July 25, 2024&lt;/strong&gt;, at 20:17 and 21:05 UTC, in blocks 853,908 and 853,912, three and a half years after the theft. Both paid exactly the same fee, 6,976 satoshis. Arkham dates the thief's last known movement of the coins to July 2024, the same month.&lt;/p&gt;

&lt;p&gt;Who wrote them is less certain than it looks. Arkham argues that spending 1.4 BTC on messages makes a spoof unlikely. The Milk Sad team points out that if LuBian's keys were weak enough to be stolen, anyone who found them could also have sent these messages. The story after that is even stranger: in October 2025, the US Department of Justice filed to forfeit about 127,271 BTC that prosecutors allege belong to the Prince Group and its chairman, Chen Zhi. The forfeiture complaint describes LuBian as a Chinese bitcoin mining operation whose addresses helped fund the group's wallets; it does not describe a theft. Elliptic wrote that these are the same coins "stolen" from LuBian, while noting that it is unclear whether a theft really took place, and in November 2025 China's CVERC suggested that the US government may have used a state-sponsored hacking group in the 2020 theft. As of October 2026, no court has ruled on any of these claims; the forfeiture case is still pending.&lt;/p&gt;

&lt;h2&gt;
  
  
  The common thread: randomness
&lt;/h2&gt;

&lt;p&gt;What Arkham calls the largest bitcoin heist ever and what TRM Labs calls the largest hardware-wallet exploit of 2026 appear to share the same root. Arkham believes LuBian generated its private keys with an algorithm that could be brute-forced, and the Milk Sad researchers found a range of weak keys, made with a Mersenne Twister (MT19937) generator seeded with only 32 bits, that they believe was likely controlled by LuBian. Coinkite's own preliminary estimates put affected Coldcard seeds at an effective 40 to 72 bits instead of 128. With Coldcard, and apparently with LuBian, the coins were not taken by breaking Bitcoin. They were taken because the numbers that were supposed to be secret were guessable.&lt;/p&gt;

&lt;p&gt;If you hold your own keys, two things follow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Know where your seed's entropy came from.&lt;/strong&gt; Coinkite's advisory says that seeds created with at least 50 fair, independent, private dice rolls, not recorded anywhere, are not considered at risk from this bug alone. Several hardware wallets, including Coldcard, let you add your own dice rolls when you create a seed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A message on the chain is not a message from a friend.&lt;/strong&gt; The Coldcard address attracted laundering offers and likely scams within days. If you are ever a victim, do not answer an &lt;code&gt;OP_RETURN&lt;/code&gt; offer to "recover" or "clean" your coins.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The thief's reply
&lt;/h2&gt;

&lt;p&gt;There is none. As of October 10, of the 64 transactions on &lt;code&gt;bc1qq85v…cu9r&lt;/code&gt;, not one was sent by the address itself: &lt;code&gt;btc-toolkit address&lt;/code&gt; shows 562.02148293 BTC received and 0 spent. The wall is a monologue: pleas, sales pitches, jokes, threats and six essays written to someone who may never read them, saved forever in a record that, as one of those essays says, "does not tire, age or lose interest".&lt;/p&gt;

&lt;h2&gt;
  
  
  Appendix: harvest.py
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;List every transaction of an address that carries an OP_RETURN output.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urllib.request&lt;/span&gt;

&lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://mempool.space/api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User-Agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;harvest.py&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;txs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/address/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/txs/chain&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;txs&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;txid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;seen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;txid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;txs&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;# a tx may confirm while we page
&lt;/span&gt;    &lt;span class="n"&gt;txs&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/address/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/txs/mempool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;txid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;txs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vout&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scriptpubkey_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;op_return&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="n"&gt;spends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prevout&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scriptpubkey_address&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;st&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
        &lt;span class="n"&gt;when&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%Y-%m-%d %H:%M&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gmtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;block_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;block_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mempool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;block_height&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;out&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;spends&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;in&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;txid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;txs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; transactions, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; with OP_RETURN -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Coinkite: &lt;a href="https://blog.coinkite.com/coldcard-mk3-seed-generation-warning/" rel="noopener noreferrer"&gt;Security advisory&lt;/a&gt; and &lt;a href="https://blog.coinkite.com/entropy-technical-backgrounder/" rel="noopener noreferrer"&gt;technical backgrounder&lt;/a&gt; (July 30, 2026)&lt;/li&gt;
&lt;li&gt;Wizardsardine: &lt;a href="https://wizardsardine.com/blog/coldcard-rng-vulnerability/" rel="noopener noreferrer"&gt;Coldcard RNG vulnerability&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SlowMist: &lt;a href="https://slowmist.medium.com/coldcard-111-million-theft-a-deep-dive-into-the-private-key-vulnerability-8e51d1a969d3" rel="noopener noreferrer"&gt;Coldcard theft deep dive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Galaxy Research on X: &lt;a href="https://x.com/glxyresearch/status/2083623556542349552" rel="noopener noreferrer"&gt;attacker addresses&lt;/a&gt;; Rob Hamilton on X: &lt;a href="https://x.com/Rob1Ham/status/2082896614218203616" rel="noopener noreferrer"&gt;first sweep&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;TRM Labs: &lt;a href="https://www.trmlabs.com/resources/blog/the-largest-hardware-wallet-exploit-of-2026-inside-the-usd-116-million-coldcard-hack" rel="noopener noreferrer"&gt;the largest hardware-wallet exploit of 2026&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Cointelegraph: &lt;a href="https://cointelegraph.com/news/coldcard-hack-galaxy-btc-lost-87-unmoved" rel="noopener noreferrer"&gt;Galaxy's August 24 count&lt;/a&gt;; The Block: &lt;a href="https://theblock.co/news/defi/2026-09-07-coldcard-exploiter-moves-wave-3-413661" rel="noopener noreferrer"&gt;September 7 update&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CoinDesk: &lt;a href="https://www.coindesk.com/markets/2026/08/05/you-stole-please-return-some-coldcard-hacker-s-wallet-becomes-a-graffiti-wall-of-pleas-and-hustles" rel="noopener noreferrer"&gt;the wallet becomes a graffiti wall&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bitcoin.com News: &lt;a href="https://news.bitcoin.com/crypto-news/coldcard-hacker-gets-brazen-bitcoin-laundering-offer-onchain/" rel="noopener noreferrer"&gt;laundering offer on-chain&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Arkham Intelligence: &lt;a href="https://info.arkm.com/announcements/arkham-uncovers" rel="noopener noreferrer"&gt;the LuBian theft&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Milk Sad: &lt;a href="https://milksad.info/posts/research-update-14/" rel="noopener noreferrer"&gt;research update 14&lt;/a&gt; and &lt;a href="https://milksad.info/posts/research-update-7/" rel="noopener noreferrer"&gt;research update 7&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;US Department of Justice: &lt;a href="https://www.justice.gov/opa/pr/chairman-prince-group-indicted-operating-cambodian-forced-labor-scam-compounds-engaged" rel="noopener noreferrer"&gt;Prince Group indictment and forfeiture&lt;/a&gt; and &lt;a href="https://www.justice.gov/usao-edny/media/1416266/dl" rel="noopener noreferrer"&gt;the forfeiture complaint&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Heise: &lt;a href="https://heise.de/-10515868" rel="noopener noreferrer"&gt;the LuBian theft&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Elliptic: &lt;a href="https://elliptic.co/blog/15-billion-us-seizure-reveals-prince-groups-connection-to-iran-china-bitcoin-mining-theft" rel="noopener noreferrer"&gt;the US seizure and LuBian&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Caixin: &lt;a href="https://www.caixinglobal.com/2025-11-12/china-suggests-us-role-in-15-billion-bitcoin-hack-102381952.html" rel="noopener noreferrer"&gt;China's CVERC accusation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bitcoin Core: &lt;a href="https://bitcoincore.org/en/2025/10/10/release-30.0/" rel="noopener noreferrer"&gt;30.0 release notes&lt;/a&gt; and &lt;a href="https://bitcoincore.org/en/2025/06/06/relay-statement/" rel="noopener noreferrer"&gt;relay policy statement&lt;/a&gt;; Bitcoin Knots: &lt;a href="https://github.com/bitcoinknots/bitcoin/blob/29.x-knots/src/policy/policy.h" rel="noopener noreferrer"&gt;&lt;code&gt;policy.h&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>bitcoin</category>
      <category>python</category>
      <category>security</category>
      <category>cli</category>
    </item>
    <item>
      <title>I Read a $320M Ransom Negotiation From My Terminal</title>
      <dc:creator>Davi de Jesus </dc:creator>
      <pubDate>Tue, 08 Sep 2026 00:19:17 +0000</pubDate>
      <link>https://dev.to/devdavidejesus/i-read-a-320m-ransom-negotiation-from-my-terminal-1159</link>
      <guid>https://dev.to/devdavidejesus/i-read-a-320m-ransom-negotiation-from-my-terminal-1159</guid>
      <description>&lt;p&gt;&lt;em&gt;How the Liquid Network drain was negotiated in public — one OP_RETURN message at a time — and how anyone with a terminal could read it live.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Somewhere in Bitcoin's blockchain, confirmed forever between billions of dollars of transactions, there is now a sad face.&lt;/p&gt;

&lt;p&gt;Two bytes. Hex &lt;code&gt;3a28&lt;/code&gt;. Decoded: &lt;strong&gt;&lt;code&gt;:(&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It was published on September 7, 2026, by whoever had just returned 3,400 BTC — roughly $268 million — to the Liquid Network's federation wallet, while keeping 598.5 BTC. It appears to be their closing statement in what may be the strangest negotiation in Bitcoin's history: not because of the amounts, but because of &lt;em&gt;where&lt;/em&gt; it happened.&lt;/p&gt;

&lt;p&gt;The entire conversation — first contact, identity proof, terms, objections, settlement — was written inside Bitcoin transactions. In public. Permanently. Readable by anyone on Earth with a terminal.&lt;/p&gt;

&lt;p&gt;I read it live from mine. This is that story, with every message decoded — and every transaction ID included, so you can verify every word yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened
&lt;/h2&gt;

&lt;p&gt;On September 6, roughly 4,000 BTC (~$320M) left the federation wallet backing Blockstream's Liquid Network — a Bitcoin sidechain where users lock real BTC to receive faster, more private L-BTC. The wallet held about 4,200 BTC before the withdrawal. Afterwards: a little over 200. About 95% of the reserve, gone in one move.&lt;/p&gt;

&lt;p&gt;No keys were stolen. No signer was phished. According to Liquid's statement, the withdrawal went through SideSwap's peg-out authorization path, and the authorization key itself was &lt;em&gt;not&lt;/em&gt; compromised — the working theory points to a software vulnerability that let the attacker obtain L-BTC they shouldn't have had, then peg out to real BTC with signatures that were, technically, perfectly legitimate.&lt;/p&gt;

&lt;p&gt;The protocol held. The periphery bled.&lt;/p&gt;

&lt;p&gt;And then, minutes after the funds landed, the address holding them spoke.&lt;/p&gt;

&lt;h2&gt;
  
  
  The unlikely channel
&lt;/h2&gt;

&lt;p&gt;Bitcoin transactions have a feature called &lt;strong&gt;OP_RETURN&lt;/strong&gt;: an output type that carries a small payload of arbitrary data instead of spendable coins. It was standardized in Bitcoin Core v0.9.0, back in March 2014, precisely to give people a clean way to embed data on-chain. People have used it for timestamps, proofs, protocol messages — and occasionally, for messages meant for one specific reader, delivered in front of everyone.&lt;/p&gt;

&lt;p&gt;An OP_RETURN message costs almost nothing, cannot be edited, cannot be deleted, and cannot be censored. Which makes it a surprisingly rational channel for negotiating the return of $320 million: no email to spoof, no DM to fake — and, combined with PGP signatures, cryptographic proof of who is speaking.&lt;/p&gt;

&lt;p&gt;Everything below was decoded with &lt;a href="https://github.com/devdavidejesus/btc-toolkit" rel="noopener noreferrer"&gt;btc-toolkit&lt;/a&gt;, an open-source Bitcoin CLI I maintain. Run the same commands; you'll read the same bytes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The conversation, message by message
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. First contact — block 965,818
&lt;/h3&gt;

&lt;p&gt;The address holding the drained coins moved them — all ~3,998.5 BTC, for a fee of &lt;strong&gt;269 satoshis&lt;/strong&gt; — in a transaction carrying a 37-byte note:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;btc-toolkit opreturn c103de95817b43f2df635ec6f35ff126ca26a7c6d20570c4b01866b2b3e69a19
&lt;span class="go"&gt;
  ✓ Found 1 OP_RETURN output(s):

&lt;/span&gt;&lt;span class="gp"&gt;  Output #&lt;/span&gt;0
&lt;span class="go"&gt;  ├─ Size:     37 bytes
  ├─ Hex:      776520617265207768697465686174732e20636f6e74616374207573206f6e20…
  └─ Message:  we are whitehats. contact us on chain
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three hundred and twenty million dollars moved, with a note attached, for the price of a stick of gum.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Blockstream picks up the phone — block 965,822
&lt;/h3&gt;

&lt;p&gt;A Blockstream-linked address answered in kind: 1,000 satoshis sent to the attacker, carrying a 39-byte reply.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;btc-toolkit opreturn 91271efcbb5ab29abfc38ae635f0644e3ba042aad56f92d40136e1dde4742fe8
&lt;span class="go"&gt;
  └─ Message:  Please contact security@blockstream.com
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Proof of identity — block 965,865
&lt;/h3&gt;

&lt;p&gt;The conversation stayed on-chain. Blockstream escalated there too, with a 1,297-byte message that is a small masterpiece of operational security. It contains a payload encrypted &lt;em&gt;to the key behind the attacker's own address&lt;/em&gt; (Electrum BIE1 ECIES — meaning only whoever controls that address can read it), plus a detached PGP signature, plus &lt;strong&gt;instructions for the whole world to verify it&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;btc-toolkit opreturn bd81219691eb1e22475c5985d847fa888c38f1b6d2cb2b7193f54d0cfa72394c
&lt;span class="go"&gt;
  └─ Message:  Encrypted to the key behind bc1ql4mfu6aundtkksxklfajs2h3t9nzcd6gyqjlte
               (Electrum BIE1 ECIES): QklFMQLaSmCm5qeNvxcJnaVGKqIVzH5Y3oL2OrBYayfMegxjx…

               Detached signature by security@blockstream.com.
               Public key: https://blockstream.com/pgp.txt
               Fingerprint: 1176 542D A98E 71E1 3372 2EF7 4AC8 CC88 6844 A2D6
               Verify: gpg --import pgp.txt &amp;amp;&amp;amp; gpg --verify msg.asc msg.b64

               -----BEGIN PGP SIGNATURE-----
               …
               =HAck
               -----END PGP SIGNATURE-----
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yes — the signature's armor checksum happens to read &lt;strong&gt;&lt;code&gt;=HAck&lt;/code&gt;&lt;/strong&gt;. Whether that's a one-in-millions coincidence of base64 or someone at Blockstream grinding signatures for style, the chain does not say.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The offer — block 965,869
&lt;/h3&gt;

&lt;p&gt;The attacker replied by moving the entire ~3,998.5 BTC balance again — each of their negotiation messages rode a transaction moving the full amount — this time asking, in 95 bytes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;btc-toolkit opreturn 3a3eac4a26395b8c2563aaf1eb8b1b77798c81c7d6337f51321827a244a480aa
&lt;span class="go"&gt;
  └─ Message:  sending most back to bc1qdlld6antmv4xug242ed83q7k4rqw50cwfns38szx4qu2f4jwaxxsuhwxxr, is that ok
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That destination is Liquid's federation peg address. "Most," it would turn out, was doing a lot of work in that sentence.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. The condition — block 965,875
&lt;/h3&gt;

&lt;p&gt;Then came the twist that gave the "whitehat" claim some weight. Before returning anything, the attacker demanded the fix — in a 1,512-byte message with the vulnerability details encrypted to Blockstream's public key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;btc-toolkit opreturn 83825b2135dd0abac12c9dfe17f29ab81b3427e1ae864947b0bebce5e47c3c4b
&lt;span class="go"&gt;
  └─ Message:  Please fix the bug first. The chain is under risk at latest commit
               right now. Make sure every node is patched. Then we will transfer
               the money back safely after confirming the fix. The detail is as
               follows (encrypted using https://blockstream.com/pgp.txt).
               -----BEGIN PGP MESSAGE-----
               …
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A thief doesn't usually audit your remediation. Blockstream's reply, in the same block — 897 bytes, PGP-signed, to say three words:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;btc-toolkit opreturn 8a444eed65c4584f138e08ee138f61490ef73e84f71e14dac3ca66c230cf7e97
&lt;span class="go"&gt;
  └─ Message:  -----BEGIN PGP SIGNED MESSAGE-----
               Hash: SHA512

               Yes, thank you.
               -----BEGIN PGP SIGNATURE-----
               …
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The next morning, a further signed message confirmed the bridge nodes were patched and it was safe to return the funds.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Settlement — block 965,950
&lt;/h3&gt;

&lt;p&gt;The return transaction confirmed on September 7: &lt;strong&gt;exactly 3,400.00000000 BTC&lt;/strong&gt; back to the Liquid federation address, with 598.5 BTC — about 15%, ~$47M — staying behind. No message in the negotiation ever named that figure, or called it a bounty.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;btc-toolkit tx a6d697a25266ce3c78774fd1d75f896b7af522ada209b0f6228ea497bc49a46d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Epilogue — block 965,973
&lt;/h3&gt;

&lt;p&gt;Encrypted messages went back and forth. And then, from the purported whitehats, what looked like the final word — all two bytes of it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;btc-toolkit opreturn d7e8837c51cc625c2c6365d371d376b035209fa01434d4933971d6428d6d6d52
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;  Output #&lt;/span&gt;0
&lt;span class="go"&gt;  ├─ Size:     2 bytes
  ├─ Hex:      3a28
  └─ Message:  :(
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whatever was said in those encrypted notes about the size of that 15%, it did not end warmly. When this was first published, the sad face was the last public word. It wasn't the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update — September 11: the whitehat turned
&lt;/h2&gt;

&lt;p&gt;Four days later, the conversation went public — and hostile.&lt;/p&gt;

&lt;p&gt;At block 966,087 the party holding the coins announced &lt;em&gt;"All messages will be in plaintext."&lt;/em&gt; At block 966,199, moving the full 598.5 BTC to carry it, came the ultimatum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;btc-toolkit opreturn f7055f6c8dd00f404e48c12483ae740180f658db206733505bb27b015e579588
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;  └─ Message:  Your dereliction of duty is obvious that you allocated only $&lt;/span&gt;1.5M
&lt;span class="gp"&gt;               (maybe even 0) to secure $&lt;/span&gt;5B assets. This is a flagrant neglect of
&lt;span class="go"&gt;               security and a sign of complete mismanagement. You SHALL pay 10%
               using your own money as bug bounty or you will cause all your
               holders a 15% loss for your irresponsibility and stinginess. […]
               Anyway we are going to publish the privatekey to decrypt our
               conversations afterwards.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read it carefully: the demand is not that users pay. It is that Blockstream pays 400 BTC (10% of the drain) from its own treasury — in which case, presumably, the 598.5 BTC come back and L-BTC holders are whole — or the coins stay put and every holder eats a 15% haircut. A bug bounty, in the sender's framing; a ransom, in everyone else's.&lt;/p&gt;

&lt;p&gt;Blockstream's answer came on X, not on-chain. An independent observer copied it into the ledger at block 966,502:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;btc-toolkit opreturn 4dc2002c630071ba863366dcc65fd3e83ff3a9aa91a3a5dd6639bb159a80c0e3
&lt;span class="go"&gt;
  └─ Message:  Blockstream message to the hacker, posted on X (relayed by an
               independent observer): […] Blockstream will not pay a ransom for
               the return of stolen funds. Taking assets without authorization
               and withholding their return is a crime, not responsible
               disclosure. It is not white-hat activity. It is theft. […]
               We will not pay for the return of stolen property. We will not
               abandon our users. […] Return the bitcoin.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As of this writing, the numbers on the chain are the whole story: the attacker's address holds &lt;strong&gt;598.50054683 BTC&lt;/strong&gt; — not one satoshi moved, and the trailing digits have &lt;em&gt;grown&lt;/em&gt; by about a thousandth of a bitcoin, which is the dust from beggars and spammers writing to it. The federation address holds &lt;strong&gt;3,601.47 BTC&lt;/strong&gt;. Add the two together and you get the roughly 4,200 BTC the federation held before the drain: the gap is, give or take rounding, what the other address holds. Nobody has filled it.&lt;/p&gt;

&lt;p&gt;One promise hangs over everything: the private key. If it is ever published, every encrypted message in this thread becomes readable — and the negotiation will have been public all along, just on a delay.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: after writing this update, I added one message to the thread myself — a how-to for decoding it, not a plea. It is transaction &lt;code&gt;c989336d708279ba99e89c647010826da0a46367597933dcfc00d75f9cbb34e5&lt;/code&gt;, and the tool above reads it like any other.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Meanwhile, the peanut gallery
&lt;/h2&gt;

&lt;p&gt;Here is the part no headline captured: because the negotiating table was public, the whole world pulled up a chair.&lt;/p&gt;

&lt;p&gt;Walk the attacker's address history and, between the PGP ceremonies, you'll find dozens of strangers' notes: pleading letters ("&lt;em&gt;if you truly are white hat and return this, you'll not have only saved my family that includes a few month old baby…&lt;/em&gt;"), haggling ("&lt;em&gt;Gift 8.5 odd BTC. No more, no less.&lt;/em&gt;"), career advice ("&lt;em&gt;Grant me 10BTC and I'll name my first born…&lt;/em&gt;"), waves of memecoin spam shilling a "Whitehat" token, classic doubler scams, and conspiracy graffiti accusing named executives — permanently, and permanently unverified. The blockchain doesn't fact-check; it only timestamps.&lt;/p&gt;

&lt;p&gt;A $320M negotiation, and the replies section came with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read it yourself — in two minutes
&lt;/h2&gt;

&lt;p&gt;You don't have to trust this article. That's the entire point of it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;btc-toolkit
btc-toolkit opreturn c103de95817b43f2df635ec6f35ff126ca26a7c6d20570c4b01866b2b3e69a19
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;btc-toolkit is a zero-dependency Python CLI (standard library only — nothing in your install to poison, which matters in a year of supply-chain attacks). No Bitcoin Core required; it talks to the Mempool.space public API by default, and with &lt;code&gt;--api-url&lt;/code&gt; it can point every query at your own node instead, so nobody sees what you verify. Seven commands, 123 tests, MIT licensed.&lt;/p&gt;

&lt;p&gt;Every transaction ID above is real. Decode them all, walk the address, find messages I didn't quote. You'll be reading the primary source — not my retelling of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  This didn't start yesterday
&lt;/h2&gt;

&lt;p&gt;People have been leaving permanent messages on Bitcoin for over a decade. A famous 2023 transaction carries 34 bytes declaring &lt;em&gt;"Craig Wright is a liar and a fraud."&lt;/em&gt; The learnmeabitcoin project embedded its name in a null-padded 75-byte note. (And no — Satoshi's &lt;em&gt;"Chancellor on brink of second bailout for banks"&lt;/em&gt; is &lt;strong&gt;not&lt;/strong&gt; an OP_RETURN: it lives in the coinbase scriptSig of the genesis block. Common misconception.)&lt;/p&gt;

&lt;p&gt;What changed this week is the stakes. OP_RETURN went from graffiti wall to negotiating table — and the table was public the entire time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The moral
&lt;/h2&gt;

&lt;p&gt;Two things were true at once this week.&lt;/p&gt;

&lt;p&gt;Bitcoin itself has never been hacked — the base layer processed every one of these transactions, the theft and the return alike, exactly as designed. And the ecosystem around Bitcoin had one of its worst weeks on record — because software at the periphery failed, as software does.&lt;/p&gt;

&lt;p&gt;The bridge between those truths is &lt;strong&gt;verifiability&lt;/strong&gt;. The reason the whole world could follow a $320M ransom negotiation in real time — check the signatures, count the coins, read the sad face — is that Bitcoin's ledger is public, and every claim about it can be checked by anyone, with modest tools, in seconds.&lt;/p&gt;

&lt;p&gt;That's not a slogan. It's a process. It's the only reason you didn't have to take my word for a single sentence above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't Trust. Verify.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;btc-toolkit is open source (MIT): &lt;a href="https://github.com/devdavidejesus/btc-toolkit" rel="noopener noreferrer"&gt;github.com/devdavidejesus/btc-toolkit&lt;/a&gt; · &lt;code&gt;pip install btc-toolkit&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>bitcoin</category>
      <category>python</category>
      <category>security</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
