edicted Blog Banner

edicted

Trial by Fire: Testing UTXOs on my Doxxed Wallet

condenser-consolidate.jpg

UTXO Deep Dive

Two weeks ago I did a post on UTXO consolidation. For the last 5 days I've been running a test on my Trezor. Turns out the Trezor allows for intimate UTXO manipulations. I can pick and choose which ones to spend and which ones to leave alone using the "Coin Control" option.

image.png image.png

Once Coin Control is selected...

A list of all Bitcoin UTXOs will show up that are associated with the given wallet. This is a doxxed wallet of mine nicknamed WASD because the swd2 at the end reminded me of wasd movement in video games. Looking at the history of this wallet anyone can see that I've already used it far too much so I may have to retire it soon... especially after writing this post. Although maybe I just keep using it as a doxxed wallet. Who knows.

The goal here was to consolidate all four of my UTXOs on this wallet into a single UTXO for a very cheap price. So I set up a transaction to send all the Bitcoin in the wallet back into the same wallet. This would then liquify the four UTXOs and combine them into a single UTXO.

condenser-consolidate2.jpg image.png

Boo!

I thought I was going to be able to get away with the minimum fee of 1 sat per byte. However, that didn't work. My transaction has been sitting in the mempool for FIVE DAYS. This is actually weird because the Internet has advised me a couple of times that nodes are often configured to drop a transaction after around two days in the mempool.

image.png image.png

https://mempool.space/tx/52a077b042e10e5207503175a8da782ea347251b03f764ec9970664cdda7a9d6

Checking https://mempool.space, I was able to see a visualization of my transaction. It appeared to still be in the mempool... but why? My theory is that Trezor's Bitcoin node would not allow my transaction to die. I think that when the Bitcoin network dropped this transaction Trezor's node rebroadcasted it automatically (perhaps even more than once).

There are a few reasons why I came to this conclusion. First and foremost, the operation refused to die. The secondary reason was that there were places on the Trezor frontend that said the operation had been "last seen" 1-2 days ago when it had been in the mempool for 3 to 5 days.

If I'm wrong about this it could be even worse. It's possible that the nodes that actually create blocks (mining pool nodes) dropped my operation so there'd be a 0% chance of it getting into a block. However, if Trezor's node refuse to drop the operation it would look like it was still in the mempool when it wasn't in the mempools that actually matter (the ones that mint blocks). So I decided today after 5 days in the mempool that enough was enough. I wanted to do my next test: invalidating the operation.

Weaknesses of the Trezor frontend

Even though Trezor's Coin Control option was very nifty, their UI is far from perfect. It's clearly not for advanced users. As soon as I broadcasted that operation to consolidate my UTXOs for 1 sat/byte I no longer had access to any of those UTXOs. My ONLY option on the Trezor frontend was to increase the fee... which was immensely annoying because that's not what I wanted to do. What I wanted was to wait out the mempool timeout and get my operation dropped from the network, but Trezor nodes would not allow that to happen. Super annoying.

image.png

TERRIFYING IN FACT

Look above. Trezor has the WORST UX IMAGINABLE for UXTO consolidation. Their frontend was telling me in certain places that I was only receiving 22 cents. It was making me think I made and error and I was about to lose $24k doing this stupid test. I talked to two different highly educated Bitcoin maximalists I follow on Twitter to confirm that nothing was wrong, and even they were a little confused.

The conclusion we all came to is that the geniuses at Trezor decided that because the wallet is losing $24k BTC and gaining $24k BTC in the same operation these two ops negate each other on the frontend, showing only the fee. Terrible Terrible Terrible Terrible UX. Just awful. Honestly this is embarrassing considering transfer anxiety and the fact that if you mess something up on Bitcoin you just lose all your money forever.

Because Trezor was giving me no recourse except to increase the fee using RBF (Replace By Fee) I asked for some advice as to how I could proceed. Both maximalists told me to download the Sparrow wallet; a Bitcoin-only application.

I was not disappointed.

image.png image.png

Sparrow is a badass wallet.

It might look like a Windows app from 20 years ago, but this wallet is seriously amazing for anyone looking to do advanced operations on Bitcoin. It has access to multiple public nodes and also encourages you to connect to your own private node for security and privacy reasons. After downloading this wallet I actually want to run a Bitcoin node for the first time ever.

I was able to easily link my Trezor to Sparrow wallet without having to input my 12 word seed. One of the maximalists was worried I would input my seed... which is funny because I would never do that considering all my experience with Metamask and using my Trezor by proxy to sign operations. I told him shitcoining saves the day. He was not amused.

image.png

Creating a new transaction.

The very first UTXO I sent to this wallet was a test operation just to make sure everything was all good and I actually had access to the private key. I sent in 100k sats worth about $70 at the time. I decided I would liquidate this UTXO and send it to MEXC exchange. This would in turn completely invalidate my UTXO consolidation of the 4 UTXOs. Because one of those UTXOs had been spent, this action should create a double-spend conflict and destroy the operation that had been sitting in the mempool for 5 days.

image.png

https://mempool.space/tx/68702f7cf87538d2ea6d55bd329032a5165dd9d398d10d7cd348054e5a3ad635

It all worked out exactly as planned.

image.png image.png image.png

Mempool not dropping old op

The interesting thing here is that the mempool.space website refuses to invalidate and drop my old operation even though it will never ever be able to process. The Trezor node dropped it immediately and now has no idea of it's existence. This leads me to believe that the mempool.space node is a very special and custom frontend that saves a lot more information than a traditional node would. Interesting.

image.png

Back on the Sparrow wallet...

We can see that my wallet now only has 3 UTXOs (the big ones) just like it should. The 98475 sats (100k minus the fee) was also received on the exchange. It all worked out.

image.png

Follow up questions

There's an option on Trezor to "FINALIZE" a transaction. This turns RBF off. What would happen if I selected this option? Would the Bitcoin network have not allowed me to invalidate the old operation in the way that I did? Would Trezor actually allow the operation to drop after 2 days? This is still unclear and requires more testing.

Child Pays For Parent (CPFP)

The other way to speed up a transaction and get it put into a block is to create a new transaction that pays for the previous one it depends on. Trezor documentation says this option exists within their frontend but I could not find it in Coin Control where they said it would be. It's possible I'd have to create the operation first and then add CPFP after the fact. I'll leave these tests to another day and another post.

Conclusion

After thinking I might lose $24k worth of Bitcoin just testing out my new knowledge of UTXOs... it all worked out in the end. I learned a lot from this experience and I now have a newfound interest in running a Bitcoin node and continuing my adventures with the hyper advanced Bitcoin-only Sparrow wallet.

As we forge ahead into this institutional bull market it becomes clear that intimate knowledge of UTXOs and the Bitcoin network is going to be of critical importance. If my predictions are correct, this is the run where Bitcoin pumps so hard that anyone who didn't get in before $100k is going to be left in the dust and forced to use Bitcoin derivatives instead of being able to use the chain itself. Personally I want a window seat on the real thing; not the paper airplane version.


Return from Trial by Fire: Testing UTXOs on my Doxxed Wallet to edicted's Web3 Blog

Trial by Fire: Testing UTXOs on my Doxxed Wallet was published on and last updated on 02 Apr 2024.