diff --git a/gui/src/installer/step/descriptor.rs b/gui/src/installer/step/descriptor.rs index 79e3606c5..e82082c26 100644 --- a/gui/src/installer/step/descriptor.rs +++ b/gui/src/installer/step/descriptor.rs @@ -1241,6 +1241,7 @@ pub struct ImportDescriptor { change_network: bool, data_dir: Option, imported_descriptor: form::Value, + wrong_network: bool, error: Option, } @@ -1252,21 +1253,35 @@ impl ImportDescriptor { network_valid: true, data_dir: None, imported_descriptor: form::Value::default(), + wrong_network: false, error: None, } } - fn check_descriptor(&mut self) { + fn check_descriptor(&mut self, network: Network) -> Option { if !self.imported_descriptor.value.is_empty() { if let Ok(desc) = LianaDescriptor::from_str(&self.imported_descriptor.value) { - if self.network == Network::Bitcoin { - self.imported_descriptor.valid = desc.all_xpubs_net_is(self.network); + if network == Network::Bitcoin { + self.imported_descriptor.valid = desc.all_xpubs_net_is(network); } else { self.imported_descriptor.valid = desc.all_xpubs_net_is(Network::Testnet); } + if self.imported_descriptor.valid { + self.wrong_network = false; + Some(desc) + } else { + self.wrong_network = true; + None + } } else { self.imported_descriptor.valid = false; + self.wrong_network = false; + None } + } else { + self.wrong_network = false; + self.imported_descriptor.valid = true; + None } } } @@ -1281,11 +1296,11 @@ impl Step for ImportDescriptor { let mut network_datadir = self.data_dir.clone().unwrap(); network_datadir.push(self.network.to_string()); self.network_valid = !network_datadir.exists(); - self.check_descriptor(); + self.check_descriptor(self.network); } Message::DefineDescriptor(message::DefineDescriptor::ImportDescriptor(desc)) => { self.imported_descriptor.value = desc; - self.check_descriptor(); + self.check_descriptor(self.network); } _ => {} }; @@ -1293,6 +1308,9 @@ impl Step for ImportDescriptor { } fn load_context(&mut self, ctx: &Context) { + if ctx.bitcoin_config.network != self.network { + self.check_descriptor(ctx.bitcoin_config.network); + } self.network = ctx.bitcoin_config.network; self.data_dir = Some(ctx.data_dir.clone()); let mut network_datadir = ctx.data_dir.clone(); @@ -1305,23 +1323,9 @@ impl Step for ImportDescriptor { // Set to true in order to force the registration process to be shown to user. ctx.hw_is_used = true; // descriptor forms for import or creation cannot be both empty or filled. - if !self.imported_descriptor.value.is_empty() { - if let Ok(desc) = LianaDescriptor::from_str(&self.imported_descriptor.value) { - if self.network == Network::Bitcoin { - self.imported_descriptor.valid = desc.all_xpubs_net_is(self.network); - } else { - self.imported_descriptor.valid = desc.all_xpubs_net_is(Network::Testnet); - } - if self.imported_descriptor.valid { - ctx.descriptor = Some(desc); - true - } else { - false - } - } else { - self.imported_descriptor.valid = false; - false - } + if let Some(desc) = self.check_descriptor(self.network) { + ctx.descriptor = Some(desc); + true } else { false } @@ -1334,6 +1338,7 @@ impl Step for ImportDescriptor { self.network, self.network_valid, &self.imported_descriptor, + self.wrong_network, self.error.as_ref(), ) } diff --git a/gui/src/installer/view.rs b/gui/src/installer/view.rs index 81a0939e9..ab19c6035 100644 --- a/gui/src/installer/view.rs +++ b/gui/src/installer/view.rs @@ -364,6 +364,7 @@ pub fn import_descriptor<'a>( network: bitcoin::Network, network_valid: bool, imported_descriptor: &form::Value, + wrong_network: bool, error: Option<&String>, ) -> Element<'a, Message> { let row_network = Row::new() @@ -392,7 +393,11 @@ pub fn import_descriptor<'a>( form::Form::new_trimmed("Descriptor", imported_descriptor, |msg| { Message::DefineDescriptor(message::DefineDescriptor::ImportDescriptor(msg)) }) - .warning("Incompatible descriptor.") + .warning(if wrong_network { + "The descriptor is for another network" + } else { + "Failed to read the descriptor" + }) .size(20) .padding(10), )