diff --git a/gui/src/installer/step/descriptor.rs b/gui/src/installer/step/descriptor.rs index daf02b1d..1e56da76 100644 --- a/gui/src/installer/step/descriptor.rs +++ b/gui/src/installer/step/descriptor.rs @@ -4,7 +4,10 @@ use iced::{pure::Element, Command}; use minisafe::{ descriptors::MultipathDescriptor, miniscript::{ - bitcoin::util::bip32::{DerivationPath, Fingerprint}, + bitcoin::{ + util::bip32::{DerivationPath, Fingerprint}, + Network, + }, descriptor::{Descriptor, DescriptorMultiXKey, DescriptorPublicKey, Wildcard}, }, }; @@ -20,6 +23,7 @@ use crate::{ }; pub struct DefineDescriptor { + network: Network, imported_descriptor: form::Value, user_xpub: form::Value, heir_xpub: form::Value, @@ -32,6 +36,7 @@ pub struct DefineDescriptor { impl DefineDescriptor { pub fn new() -> Self { Self { + network: Network::Bitcoin, imported_descriptor: form::Value::default(), user_xpub: form::Value::default(), heir_xpub: form::Value::default(), @@ -100,6 +105,10 @@ impl Step for DefineDescriptor { Command::none() } + fn load_context(&mut self, ctx: &Context) { + self.network = ctx.bitcoin_config.network; + } + fn apply(&mut self, ctx: &mut Context) -> bool { // descriptor forms for import or creation cannot be both empty or filled. if self.imported_descriptor.value.is_empty() @@ -108,14 +117,29 @@ impl Step for DefineDescriptor { || self.sequence.value.is_empty()) { if !self.user_xpub.value.is_empty() { - self.user_xpub.valid = DescriptorPublicKey::from_str(&self.user_xpub.value).is_ok(); + let key = DescriptorPublicKey::from_str(&self.user_xpub.value); + self.user_xpub.valid = key.is_ok(); + // Check the Network + if let Ok(key) = &key { + self.user_xpub.valid = check_key_network(&key, ctx.bitcoin_config.network); + } } + if !self.heir_xpub.value.is_empty() { - self.heir_xpub.valid = DescriptorPublicKey::from_str(&self.heir_xpub.value).is_ok(); + let key = DescriptorPublicKey::from_str(&self.heir_xpub.value); + self.heir_xpub.valid = key.is_ok(); + // Check the Network + if let Ok(key) = &key { + self.heir_xpub.valid = check_key_network(&key, ctx.bitcoin_config.network); + } } + if !self.sequence.value.is_empty() { self.sequence.valid = self.sequence.value.parse::().is_ok(); + } else { + self.sequence.valid = false; } + if !self.imported_descriptor.value.is_empty() { self.imported_descriptor.valid = Descriptor::::from_str(&self.imported_descriptor.value) @@ -133,9 +157,15 @@ impl Step for DefineDescriptor { } else { let user_key = DescriptorPublicKey::from_str(&self.user_xpub.value); self.user_xpub.valid = user_key.is_ok(); + if let Ok(key) = &user_key { + self.user_xpub.valid = check_key_network(&key, ctx.bitcoin_config.network); + } let heir_key = DescriptorPublicKey::from_str(&self.heir_xpub.value); - self.user_xpub.valid = user_key.is_ok(); + self.heir_xpub.valid = heir_key.is_ok(); + if let Ok(key) = &heir_key { + self.heir_xpub.valid = check_key_network(&key, ctx.bitcoin_config.network); + } let sequence = self.sequence.value.parse::(); self.sequence.valid = sequence.is_ok(); @@ -166,6 +196,7 @@ impl Step for DefineDescriptor { modal.view() } else { view::define_descriptor( + self.network, &self.imported_descriptor, &self.user_xpub, &self.heir_xpub, @@ -176,6 +207,26 @@ impl Step for DefineDescriptor { } } +fn check_key_network(key: &DescriptorPublicKey, network: Network) -> bool { + match key { + DescriptorPublicKey::XPub(key) => { + if network == Network::Bitcoin { + key.xkey.network == Network::Bitcoin + } else { + key.xkey.network == Network::Testnet + } + } + DescriptorPublicKey::MultiXPub(key) => { + if network == Network::Bitcoin { + key.xkey.network == Network::Bitcoin + } else { + key.xkey.network == Network::Testnet + } + } + _ => true, + } +} + impl Default for DefineDescriptor { fn default() -> Self { Self::new() diff --git a/gui/src/installer/view.rs b/gui/src/installer/view.rs index 6940dbea..8d7a9cf9 100644 --- a/gui/src/installer/view.rs +++ b/gui/src/installer/view.rs @@ -56,6 +56,7 @@ pub fn welcome(network: &bitcoin::Network, valid: bool) -> Element { } pub fn define_descriptor<'a>( + network: bitcoin::Network, imported_descriptor: &form::Value, user_xpub: &form::Value, heir_xpub: &form::Value, @@ -82,7 +83,11 @@ pub fn define_descriptor<'a>( form::Form::new("Xpub", user_xpub, |msg| { Message::DefineDescriptor(message::DefineDescriptor::UserXpubEdited(msg)) }) - .warning("Please enter correct xpub") + .warning(if network == bitcoin::Network::Bitcoin { + "Please enter correct xpub" + } else { + "Please enter correct tpub" + }) .size(20) .padding(10), ) @@ -102,7 +107,11 @@ pub fn define_descriptor<'a>( form::Form::new("Xpub", heir_xpub, |msg| { Message::DefineDescriptor(message::DefineDescriptor::HeirXpubEdited(msg)) }) - .warning("Please enter correct xpub") + .warning(if network == bitcoin::Network::Bitcoin { + "Please enter correct xpub" + } else { + "Please enter correct tpub" + }) .size(20) .padding(10), )