installer: check xpub network

This commit is contained in:
edouard 2022-11-11 15:24:43 +01:00
parent 5595e91e57
commit 25056d0d5e
2 changed files with 66 additions and 6 deletions

View File

@ -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<String>,
user_xpub: form::Value<String>,
heir_xpub: form::Value<String>,
@ -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::<u32>().is_ok();
} else {
self.sequence.valid = false;
}
if !self.imported_descriptor.value.is_empty() {
self.imported_descriptor.valid =
Descriptor::<DescriptorPublicKey>::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::<u16>();
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()

View File

@ -56,6 +56,7 @@ pub fn welcome(network: &bitcoin::Network, valid: bool) -> Element<Message> {
}
pub fn define_descriptor<'a>(
network: bitcoin::Network,
imported_descriptor: &form::Value<String>,
user_xpub: &form::Value<String>,
heir_xpub: &form::Value<String>,
@ -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),
)