export: allow to import a backup from a simple descriptor
This commit is contained in:
parent
54c83615b0
commit
31798b7e43
@ -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
|
||||
|
||||
@ -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 => {
|
||||
|
||||
@ -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) => {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user