diff options
author | sommerfeld <sommerfeld@sommerfeld.dev> | 2024-04-30 11:21:44 +0100 |
---|---|---|
committer | sommerfeld <sommerfeld@sommerfeld.dev> | 2024-04-30 11:21:44 +0100 |
commit | 39df428117484b447258cf697b1ea3fb48082e42 (patch) | |
tree | ec150fd0303239e34e548150bd844e73d60888a5 /src | |
parent | 93326aa3f96963415bc1950eadda471b6bf326f4 (diff) | |
download | sentrum-39df428117484b447258cf697b1ea3fb48082e42.tar.gz sentrum-39df428117484b447258cf697b1ea3fb48082e42.tar.bz2 sentrum-39df428117484b447258cf697b1ea3fb48082e42.zip |
Improve wallet descriptor support
Diffstat (limited to 'src')
-rw-r--r-- | src/wallets.rs | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/src/wallets.rs b/src/wallets.rs index 9ee702c..b7b6886 100644 --- a/src/wallets.rs +++ b/src/wallets.rs @@ -14,6 +14,7 @@ use bdk::{ KeychainKind, SyncOptions, TransactionDetails, Wallet, }; use log::{debug, error, warn}; +use regex::Regex; use serde::Deserialize; use crate::blockchain::{get_blockchain, ElectrumConfig}; @@ -48,11 +49,11 @@ impl XpubSpec { } } -#[derive(Deserialize, Debug, Hash)] +#[derive(Deserialize, Debug, Hash, Clone)] pub struct DescriptorsSpec { name: String, - primary: String, - change: Option<String>, + descriptor: String, + change_descriptor: Option<String>, } impl DescriptorsSpec { @@ -62,12 +63,12 @@ impl DescriptorsSpec { s.finish().to_string() } - pub fn primary(&self) -> &str { - &self.primary + pub fn descriptor(&self) -> &str { + &self.descriptor } - pub fn change(&self) -> Option<&String> { - self.change.as_ref() + pub fn change_descriptor(&self) -> Option<&str> { + self.change_descriptor.as_deref() } pub fn name(&self) -> &str { @@ -75,6 +76,23 @@ impl DescriptorsSpec { } } +fn handle_multipart_descritor(desc_spec: &DescriptorsSpec) -> Result<DescriptorsSpec> { + if !desc_spec.descriptor().contains("<0;1>") { + return Ok(desc_spec.clone()); + } + + let desc_no_checksum = Regex::new("#[A-Za-z0-9]+$")?.replace(desc_spec.descriptor(), ""); + + let desc = desc_no_checksum.replace("<0;1>", "0"); + let change_desc = desc_no_checksum.replace("<0;1>", "1"); + + Ok(DescriptorsSpec { + name: desc_spec.name().to_string(), + descriptor: desc, + change_descriptor: Some(change_desc), + }) +} + #[derive(Deserialize, Debug)] #[serde(untagged)] pub enum WalletConfig { @@ -136,9 +154,10 @@ fn get_descriptors_wallet( network: Network, ) -> Result<Wallet<sled::Tree>> { let sled = sled::open(get_cache_dir(&descriptors_spec.get_hash()))?.open_tree("wallet")?; + let desc_spec_no_multi = handle_multipart_descritor(descriptors_spec)?; Wallet::new( - descriptors_spec.primary(), - descriptors_spec.change().map(String::as_ref), + desc_spec_no_multi.descriptor(), + desc_spec_no_multi.change_descriptor(), network, sled, ) |