From 8596ca76f3547c77cf64c556966ee1651550f231 Mon Sep 17 00:00:00 2001 From: Antoine Poinsot Date: Tue, 27 Feb 2024 12:14:23 +0100 Subject: [PATCH] bitcoind: compare descriptors, not their string representation. It's more robust and bitcoind serializes `wsh()` descriptors using `'` as hardened marker and `tr()` descriptors using `h`.. --- src/bitcoin/d/mod.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/bitcoin/d/mod.rs b/src/bitcoin/d/mod.rs index f77c6666..41e25216 100644 --- a/src/bitcoin/d/mod.rs +++ b/src/bitcoin/d/mod.rs @@ -754,13 +754,27 @@ impl BitcoinD { // Check our main descriptor is imported in this wallet. let receive_desc = main_descriptor.receive_descriptor(); let change_desc = main_descriptor.change_descriptor(); - let desc_list: Vec = self + let desc_list: Vec<_> = self .list_descriptors() .into_iter() - .map(|entry| entry.desc) + .filter_map(|entry| { + match descriptor::Descriptor::::from_str( + &entry.desc, + ) { + Ok(desc) => Some(desc), + Err(e) => { + log::error!( + "Error deserializing descriptor: {}. Descriptor: {}.", + e, + entry.desc + ); + None + } + } + }) .collect(); - if !desc_list.contains(&receive_desc.to_string()) - || !desc_list.contains(&change_desc.to_string()) + if !desc_list.iter().any(|desc| *receive_desc == *desc) + || !desc_list.iter().any(|desc| *change_desc == *desc) { return Err(BitcoindError::Wallet( self.watchonly_wallet_path.clone(),