diff --git a/liana-gui/src/backup.rs b/liana-gui/src/backup.rs index cbfcb901..bb3b09d8 100644 --- a/liana-gui/src/backup.rs +++ b/liana-gui/src/backup.rs @@ -1,7 +1,10 @@ use chrono::{Duration, Utc}; -use liana::miniscript::{ - self, - bitcoin::{bip32::Fingerprint, Network, Txid}, +use liana::{ + descriptors::LianaDescriptor, + miniscript::{ + self, + bitcoin::{bip32::Fingerprint, Network, Txid}, + }, }; use lianad::{ bip329, @@ -111,6 +114,23 @@ impl Debug for Backup { } impl Backup { + /// Create a Backup from a descriptor + /// + /// # Arguments + /// * `descriptor` - the descriptor + /// * `network` - the network + pub fn from_descriptor(descriptor: LianaDescriptor, network: Network) -> Self { + let account = Account::new(descriptor.to_string()); + Backup { + name: None, + alias: None, + accounts: vec![account], + network, + date: None, + proprietary: Default::default(), + version: default_version(), + } + } /// Create a Backup from the Installer context /// /// # Arguments diff --git a/liana-gui/src/export.rs b/liana-gui/src/export.rs index c4aee741..fd4e74ee 100644 --- a/liana-gui/src/export.rs +++ b/liana-gui/src/export.rs @@ -246,7 +246,7 @@ pub enum Progress { WalletFromBackup( ( LianaDescriptor, - Network, + Option, HashMap, Backup, ), @@ -1045,13 +1045,33 @@ pub async fn wallet_from_backup( let backup: Result = serde_json::from_str(&backup_str); let backup = match backup { - Ok(psbt) => psbt, + Ok(b) => b, Err(e) => { - return Err(Error::BackupImport(format!("{:?}", e))); + // try to import as bare descriptor + let descr = LianaDescriptor::from_str(&backup_str); + match descr { + Ok(descr) => { + let network = if descr.all_xpubs_net_is(Network::Bitcoin) { + Network::Bitcoin + } else { + Network::Signet + }; + Backup::from_descriptor(descr, network) + } + Err(e2) => { + return Err(Error::BackupImport(format!( + "A backup or descriptor file is expected: {e}, {e2}" + ))); + } + } } }; - let network = backup.network; + let network = if backup.network == Network::Bitcoin { + Some(backup.network) + } else { + None + }; let account = match backup.accounts.len() { 0 => { diff --git a/liana-gui/src/installer/step/descriptor/mod.rs b/liana-gui/src/installer/step/descriptor/mod.rs index 223576a1..cea59a7b 100644 --- a/liana-gui/src/installer/step/descriptor/mod.rs +++ b/liana-gui/src/installer/step/descriptor/mod.rs @@ -120,12 +120,26 @@ impl Step for ImportDescriptor { } Message::ImportExport(ImportExportMessage::Progress(Progress::WalletFromBackup(r))) => { let (descriptor, network, aliases, backup) = r; - if self.network == network { - self.imported_backup = Some(backup); - self.imported_descriptor.value = descriptor.to_string(); - self.imported_aliases = Some(aliases); + if let Some(n) = network { + if self.network == n { + self.imported_backup = Some(backup); + self.imported_descriptor.value = descriptor.to_string(); + self.imported_aliases = Some(aliases); + } else { + self.error = + Some("Backup network do not match the selected network!".into()); + } } else { - self.error = Some("Backup network do not match the selected network!".into()); + // The backup have been inferred from a bare descriptor, we check whether + // the descriptor match any test network + if self.network != Network::Bitcoin { + self.imported_backup = Some(backup); + self.imported_descriptor.value = descriptor.to_string(); + self.imported_aliases = Some(aliases); + } else { + self.error = + Some("Backup network do not match the selected network!".into()); + } } } Message::ImportExport(m) => {