Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions crates/wallet/src/wallet/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -551,7 +551,9 @@ impl Wallet {
}
let signers = Arc::new(SignersContainer::build(external_keymap, &descriptor, &secp));

let (mut change_descriptor, mut change_signers) = (None, Arc::new(SignersContainer::new()));
let mut change_descriptor = None;
let mut internal_keymap = params.change_descriptor_keymap;

match (changeset.change_descriptor, params.check_change_descriptor) {
// empty signer
(None, None) => {}
Expand Down Expand Up @@ -592,17 +594,23 @@ impl Wallet {
expected: Some(exp_desc),
}));
}
let mut internal_keymap = params.change_descriptor_keymap;
if params.extract_keys {
internal_keymap.extend(keymap);
}
change_signers =
Arc::new(SignersContainer::build(internal_keymap, &desc, &secp));
change_descriptor = Some(desc);
}
},
}

let change_signers = match change_descriptor {
Some(ref change_descriptor) => Arc::new(SignersContainer::build(
internal_keymap,
change_descriptor,
&secp,
)),
None => Arc::new(SignersContainer::new()),
};

let index = create_indexer(descriptor, change_descriptor, params.lookahead)
.map_err(LoadError::Descriptor)?;

Expand Down
23 changes: 22 additions & 1 deletion crates/wallet/tests/wallet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ use bitcoin::{
absolute, transaction, Address, Amount, BlockHash, FeeRate, Network, OutPoint, ScriptBuf,
Sequence, Transaction, TxIn, TxOut, Txid, Weight,
};
use miniscript::{descriptor::KeyMap, Descriptor, DescriptorPublicKey};
use rand::rngs::StdRng;
use rand::SeedableRng;

Expand Down Expand Up @@ -99,6 +100,11 @@ fn insert_seen_at(wallet: &mut Wallet, txid: Txid, seen_at: u64) {
.unwrap();
}

fn parse_descriptor(s: &str) -> (Descriptor<DescriptorPublicKey>, KeyMap) {
<Descriptor<DescriptorPublicKey>>::parse_descriptor(&Secp256k1::new(), s)
.expect("failed to parse descriptor")
}

// The satisfaction size of a P2WPKH is 112 WU =
// 1 (elements in witness) + 1 (OP_PUSH) + 33 (pk) + 1 (OP_PUSH) + 72 (signature + sighash) + 1*4 (script len)
// On the witness itself, we have to push once for the pk (33WU) and once for signature + sighash (72WU), for
Expand Down Expand Up @@ -251,7 +257,22 @@ fn wallet_load_checks() -> anyhow::Result<()> {
))),
"unexpected descriptors check result",
);

// check setting keymaps
let (_, external_keymap) = parse_descriptor(external_desc);
let (_, internal_keymap) = parse_descriptor(internal_desc);
let wallet = Wallet::load()
.keymap(KeychainKind::External, external_keymap)
.keymap(KeychainKind::Internal, internal_keymap)
.load_wallet(&mut open_db(&file_path)?)
.expect("db should not fail")
.expect("wallet was persisted");
for keychain in [KeychainKind::External, KeychainKind::Internal] {
let keymap = wallet.get_signers(keychain).as_key_map(wallet.secp_ctx());
assert!(
!keymap.is_empty(),
"load should populate keymap for keychain {keychain:?}"
);
}
Ok(())
}

Expand Down