What you need
From the vault’s page in the Recovery Kit:Reading the descriptor
A 2-of-2 vault, with the extended keys shortened so the shape is visible:The checksum is a safety net, not decoration. Change any character of the descriptor and the
checksum no longer matches, and a wallet rejects the import outright instead of quietly building a
different wallet at a different address. Always keep the
# and the eight characters after it. If
an importer says the checksum is invalid, you have a transcription error. Find it rather than
stripping the checksum off.Your own key inside the vault
Your cosigner key is not your personal Bitcoin wallet key. It lives under BIP-48:2' is the BIP-48 script type for P2WSH. {account} is the vault’s account index, read
off the Recovery Kit, not your Bitcoin wallet number. Signing keys sit beneath that account at
/0/{n} for receive addresses and /1/{n} for change.
When you add your seed to a restored vault as a signing keystore, this is the derivation the wallet
must use. Check the master fingerprint it reports against the one in the Recovery Kit: they match
only if the phrase and the path are both right.
Sparrow
Sparrow reads the multipath descriptor directly and is the least painful of the three.Sparrow: importing a vault descriptor
The full procedure, including the birthday step and adding your seed as a signing keystore
Specter Desktop
Specter also takes the multipath descriptor.1
Add a new wallet from an existing descriptor
Specter’s add-wallet flow includes an option to import a wallet that already exists, given its
descriptor. Choose that rather than creating a new multisig from devices.
2
Paste the descriptor
One unbroken line, checksum included.
3
Associate your device
Specter organises signing around devices. Add your seed as a device with the BIP-48 account
derivation so that Specter can match it to one of the descriptor’s keys by fingerprint.
4
Set the rescan start height
Specter drives Bitcoin Core’s rescan. Give it the birthday height rather than letting it start
from genesis.
5
Verify the addresses against the Recovery Kit
Vault address and first receive address, both exactly.
Bitcoin Core
Core is the most literal route and the one that will still work in ten years.1
Create a watch-only descriptor wallet
2
Convert the birthday height to a timestamp
importdescriptors takes a Unix timestamp, not a block height, so translate the Recovery Kit’s
Birthday block height first:0 scans the entire chain, and passing "now" skips scanning altogether.3
Import the receive and change descriptors separately
<0;1> form of the main descriptor depends on the
node version, which is exactly why the kit prints both single-path forms.4
Rescan if the import did not
5
Check the derived addresses
Vaults that cannot be imported at all
Such a vault is not lost. Everything needed is still printed: the witness script, the address, the threshold and every cosigner’s key. It can be rebuilt and spent by hand withbitcoin-cli, given
enough owners’ private keys. It just cannot be handed to a wallet as a descriptor.
If the descriptor is unreadable
The Witness script in the Recovery Kit is the script behind the vault address in hex. It contains the threshold and the cosigners’ public keys for that one address, so it is enough to spend that address’s funds by hand even with no working descriptor. It is a per-address fallback, not a replacement for the descriptor: it describes one address, not the ranged wallet. The cosigner rows (master fingerprint, derivation path, account xpub) are the other fallback. From them the descriptor can be reassembled by hand, as long as you keepsortedmulti, the threshold and
every cosigner’s origin and key.
The order you write the key expressions in does not change the addresses. sortedmulti sorts the
derived public keys at each index itself. The kit writes them in sorted order so that regenerating it
produces a byte-identical string, but that is for reproducibility, not correctness.
A reassembled descriptor needs a valid checksum before any importer will take it. Bitcoin Core
computes one for you, and returns the descriptor with the checksum appended: