The Background

I had some forced closed funds that went "missing" in Blixt wallet last year due to my early time's inexperienced and reckless - I want to restore it in another phone to see how things work, and I didn't know I should close all the channels before, so once you input the seeds to another wallet, it automatically forces close ALL channels! But one good thing I did was swap out most sats before the experiment - having curiosity and willing to try things is good, but always minimize the potential loss before being reckless!

I patiently waited for more than one day, and the strange thing was it did show some confirmed tx, but the sats weren't showing onchain... so where are my missing sats again?

Double Problem, Double Fun

The first thing I tried was exporting the seeds into Blue wallet to see if the sats would show up there, but little did I know that the onchian address type in Blixt is Taproot, and Blue wallet doesn't support that.

My knowledge back then was quite limited, so after a few trials, I wrote down what I did wrong and reminded myself never do that again, but the back of my mind was still trying to see if I could find the missing sats one day, so I kept the old Blixt with the seeds. ( really important! ) I have learned quite a lot about Bitcoin in the past few months, and given such nice low fee time recently, so I'm digging back into the old problems to see if I'm capable of solving them now; also, after solving the previous gap limit issue, I'm now more confident in dealing with challenging ones.

Identifying the problem is the first step in solving any problem.

Is the gap limit problem again? At first, I wondered if it was due to the gap limit problem I had solved before, then I tried to increase it, but no, it's not the same problem. However, I've learned something new this time: to increase the gap limit, you only need to input the master key instead of the seeds.

And I was a bit naughtily curious - I wanted to see if the wallet address really is no limit, so I tested with a gap limit of 1000, 2000, then to 10,000, and wow it really kept syncing, I'm really amazed that with only 12 or 24 words you can generate unlimited address! 😲

How?

-- in Electrum: view - console

>>> wallet.change_gap_limit(10000)
True
>>> wallet.gap_limit
10000
>>>

-- in Sparrow: keystores page—advanced setting—adjust the gap limit, and done, but you can only set the max 999 there.

These are the fresh learned tricks, but I haven't started to solve the new problem yet! And as I kept reading and digging, I found out that there are actually two problems I needed to solve:

1. The Seed Format

The Blixt node's seed format is aezeed

This is different than the typical BIP39 format you see in most Bitcoin wallets, although it may appear to be similar. aezeed includes some extra data including the birth date of the wallet that will help rescans during recovery happen more efficiently.

So, if you put the aezeed into an unsupported wallet, e.g., if you put the aezeed directly into the Sparrow wallet, it shows an invalid checksum. The solution is to decode the seeds first or use the tool that natively supports this type of seeds—currently, both Zeus and Blixt support aezeed.

2. Taproot Address

There are not many wallets that support Taproot addresses at the moment, so when you import the seeds into the unsupported wallets, no problem here, but it can't be "read", so it's not showing any sats. However, not showing doesn't mean that your sats are gone! The solution is to use the wallet that supports the Taproot addresses.

Testing Time

I read few times of this guide from @Darth, and I decided that Zeus should be the easiest solution, I also tested the other two methods just to see which one worked the best, and here was my experience on finding my missing sats from a dead Blixt node:

🧪 Zeus

I entered the seeds in a fresh Zeus in another phone, as you can only have one embedded LND node in each phone, and you can't delete the current one - the only way to try with the restoring process is to uninstall and install it again ( but if you do this, it will force closed all your existing channels ). Hence, it's better if you have another phone in hand.

How

Step 1. Open a fresh Zeus—Settings—Advanced setup—add a new embedded LND node.

Step 2. Enter the 24 seed words in the Recovery Cipher Seed (aezeed) then click restore mainnet wallet.

You can optionally provide a static backup string in the field labeled 'Disaster recovery data (SCB, Base64)' , but in my case, all I need is to enter the seeds because all the channels are already FC.

Step 3. Patiently wait, as it can take quite some time.

My Restoring Experience

First trial: it didn't load anything.

Second trial: I uninstalled and reinstalled it and tried again, it kept loading, but it was really slow, then I looked around and saw this

Alternatively, if you want a more manual approach, you may be able to spam the create on-chain address function to get all your addresses  indexed in LND's DB and restore your balances. You will likely have to generate both Taproot and SegWit addresses for this approach to work. Since new addresses are generated every time you create an invoice, you may have to generate several hundred addresses of each type.

Then, after your addresses have been generated and indexed, use the 'Rescan' functionality under the Embedded Node settings.

so I manually created some Taproot addresses, clicked the rescan wallet and restarted it, and it did show some of the past onchain transactions, but then it kept crashing.

Third trial: I tried the same process one more time, and it loaded for a while, but no onchain transactions showed up.

Fourth trial:  I changed the neutrino peers in the hope of increasing the syncing speed: setting—embedded node—peers—Neutrino Peers—deselect the default "connect only to the specified peers", then restart and check again, and still, nothing showed up.

( One good hack for monitoring what Zeus is doing in the background is to go to settings—embedded node—LND logs. )

🧪 Blixt

I entered the seeds in a fresh Blixt too, as I wanted to keep the old Blixt with the seeds in its original state until I solved this problem - don't touch the "crime scene" until you solved the puzzle.

How

Step 1. Open a fresh Blixt and choose the restore

Step 2. Enter the 24 seed words

In my case, all I need is to enter the seeds because all the channels are already FC.

Step 3. Patiently wait, as it can take quite some time.

My Restoring Experience

First trial: the onchain sync is done, and the wallet was restored and loaded to 15%, and it started to show some onchain transactions; however, the syncing shut down in the middle of the process.

Second trial: the onchain sync is done, and the wallet was restored and loaded to 9%; however, the syncing shut down in the middle of the process.

Third trial: the onchain sync is done, and the wallet was restored and loaded to 21%; however, the syncing shut down in the middle of the process.

Fourth trial: it was already 1 am, so I left the phone running and came back to check in the morning; it kept loading but still failed to restore. I also changed the peer to see if it could improve the speed - setting - stop and delete Neutrino files, but it's the same: really slow syncing.

( One good hack to monitor what Blixt is doing in the background is to click the LND log on the syncing in progress page. Or, if you want to check if the node is well synced, go to settings—show node data—check the Synced to Chain and Synced to Graph; if it's false, then it means the node is still syncing. )

🧪 Sparrow

I decided to give it a try with Sparrow wallet while I was waiting for both Zeus and  Blixt to sync.

How

Step 1. Download this page and use it offline: right click and choose "save page as."

https://guggero.github.io/cryptography-toolkit/#!/aezeed

Step 2. Disconnect the internet and open the file that you downloaded

Go to the section "Decode mnemonic"—input the seeds into Mnemonic—choose "BTC (Bitcoin, Native SegWit, BIP84)"—copy the zprv showing in "HD node root key base58" for later use.

Step 3. Open Sparrow wallet—file—New wallet and name it—Create

  1. Choose "Tarpoot" in the setting script type
  2. Choose "New or Imported Software Wallet"
  3. Click Apply
  4. Click "Enter Private Key"

Paste the zprv that you created from the previous decoding, import keystore, and click Apply.

Step 4. Patiently wait, as it can take quite some time.

My Restoring Experience

Guess what! 165k sats showed up in less than 5 mins:)

🥁 Results

Zeus: I was expecting to see at least some of the past transactions in Zeus, but unfortunately, nothing showed up after all these tests.

Blixt: At least I can see some of the past transactions in Blixt, but still, it failed to sync fully.

Sparrow: it restored my sats within 5 minutes while Zeus and Blixt were still syncing!

Hence, my testing of restoring funds from Aezeed and Taproot addresses, Sparrow wallet was the fastest, while Zeus and Blixt were still syncing.  Also, other Bitcoiners recommended a great tool to restore onchain funds for any dead LND node, and you could also give it a try: chantools.

Takeaways

  • If you are facing any force closed problems from Blixt or Zeus and want to recover the onchain funds, I recommend using Sparrow. ( see the steps above )
  • It's better to empty most of the funds for experiments before you know what you're doing—risk control is important, and every sats is precious!
  • ALWAYS keep the seeds well because your Bitcoin NEVER leaves you, and stay calm if you have any "missing sats" because high chance is that you only lack the knowledge to "locate" it.
  • Keep testing and learning - patience you must have, and these troubleshooting experiences are really empowering! Especially in times when people just want to buy ETFs without dealing with any self-custody, but they will never be free, because freedom is self-responsibility.

May the sats always be with you!