]> Untitled Git - bdk/commitdiff
test(wallet): check keymaps can be set when loading wallet
authorvalued mammal <valuedmammal@protonmail.com>
Tue, 22 Oct 2024 14:29:07 +0000 (10:29 -0400)
committervalued mammal <valuedmammal@protonmail.com>
Mon, 28 Oct 2024 13:01:07 +0000 (09:01 -0400)
crates/wallet/tests/wallet.rs

index 44b194a83d2e3ee48d5ac42249b159d0deb6b90f..d51af3352d7b63f1f65a2ef5789808b8cc60395d 100644 (file)
@@ -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;
 
@@ -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
@@ -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(())
     }