export: allow to import a backup from a simple descriptor

This commit is contained in:
pythcoiner 2025-06-24 12:35:12 +02:00
parent 54c83615b0
commit 31798b7e43
No known key found for this signature in database
GPG Key ID: C1048AEEDF303B88
3 changed files with 66 additions and 12 deletions

View File

@ -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

View File

@ -246,7 +246,7 @@ pub enum Progress {
WalletFromBackup(
(
LianaDescriptor,
Network,
Option<Network>,
HashMap<Fingerprint, settings::KeySetting>,
Backup,
),
@ -1045,13 +1045,33 @@ pub async fn wallet_from_backup(
let backup: Result<Backup, _> = 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 => {

View File

@ -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) => {