From 71541c69bae7f8f33659337ad66e7ca161cbcef4 Mon Sep 17 00:00:00 2001 From: Michael Mallan Date: Wed, 16 Apr 2025 11:03:10 +0100 Subject: [PATCH] feat: support outpoints recovery parameter This changes the GUI daemon trait's create_recovery method to support passing an outpoints parameter. For now, however, this method is called with an empty outpoints slice, meaning that all recoverable coins will be used. --- liana-gui/src/app/state/recovery.rs | 2 +- liana-gui/src/daemon/client/mod.rs | 3 ++- liana-gui/src/daemon/embedded.rs | 3 ++- liana-gui/src/daemon/mod.rs | 1 + liana-gui/src/lianalite/client/backend/api.rs | 5 ++++- liana-gui/src/lianalite/client/backend/mod.rs | 2 ++ 6 files changed, 12 insertions(+), 4 deletions(-) diff --git a/liana-gui/src/app/state/recovery.rs b/liana-gui/src/app/state/recovery.rs index 3f50dedc..daa63b43 100644 --- a/liana-gui/src/app/state/recovery.rs +++ b/liana-gui/src/app/state/recovery.rs @@ -156,7 +156,7 @@ impl State for RecoveryPanel { return Task::perform( async move { let psbt = daemon - .create_recovery(address, feerate_vb, sequence) + .create_recovery(address, &[], feerate_vb, sequence) .await?; let outpoints: Vec<_> = psbt .unsigned_tx diff --git a/liana-gui/src/daemon/client/mod.rs b/liana-gui/src/daemon/client/mod.rs index d08abc5d..266dbb07 100644 --- a/liana-gui/src/daemon/client/mod.rs +++ b/liana-gui/src/daemon/client/mod.rs @@ -182,12 +182,13 @@ impl Daemon for Lianad { async fn create_recovery( &self, address: Address, + coins_outpoints: &[OutPoint], feerate_vb: u64, sequence: Option, ) -> Result { - // The `outpoints` parameter is omitted, which means all recoverable coins will be used. let mut params = serde_json::Map::new(); params.insert("address".to_string(), json!(address)); + params.insert("outpoints".to_string(), json!(coins_outpoints)); params.insert("feerate".to_string(), json!(feerate_vb)); if let Some(sequence) = sequence { params.insert("timelock".to_string(), json!(sequence)); diff --git a/liana-gui/src/daemon/embedded.rs b/liana-gui/src/daemon/embedded.rs index 113c22a7..e87bbb24 100644 --- a/liana-gui/src/daemon/embedded.rs +++ b/liana-gui/src/daemon/embedded.rs @@ -212,12 +212,13 @@ impl Daemon for EmbeddedDaemon { async fn create_recovery( &self, address: Address, + coins_outpoints: &[OutPoint], feerate_vb: u64, sequence: Option, ) -> Result { self.command(|daemon| { daemon - .create_recovery(address, &[], feerate_vb, sequence) + .create_recovery(address, coins_outpoints, feerate_vb, sequence) .map(|res| res.psbt) .map_err(|e| DaemonError::Unexpected(e.to_string())) }) diff --git a/liana-gui/src/daemon/mod.rs b/liana-gui/src/daemon/mod.rs index 63a88232..5b961c3b 100644 --- a/liana-gui/src/daemon/mod.rs +++ b/liana-gui/src/daemon/mod.rs @@ -138,6 +138,7 @@ pub trait Daemon: Debug { async fn create_recovery( &self, address: Address, + coins_outpoints: &[OutPoint], feerate_vb: u64, sequence: Option, ) -> Result; diff --git a/liana-gui/src/lianalite/client/backend/api.rs b/liana-gui/src/lianalite/client/backend/api.rs index 3f4c5d06..f795bd0e 100644 --- a/liana-gui/src/lianalite/client/backend/api.rs +++ b/liana-gui/src/lianalite/client/backend/api.rs @@ -418,9 +418,12 @@ pub mod payload { } #[derive(Serialize)] - pub struct GenerateRecoveryPsbt { + pub struct GenerateRecoveryPsbt<'a> { /// The address to sweep funds to. pub address: bitcoin::Address, + /// The outpoints of coins to use as transaction inputs. If empty, all + /// coins that are recoverable on the chosen recovery path will be used. + pub inputs: &'a [bitcoin::OutPoint], // The feerate to use for this transaction. pub feerate: u64, /// Timelock of the recovery path to use. diff --git a/liana-gui/src/lianalite/client/backend/mod.rs b/liana-gui/src/lianalite/client/backend/mod.rs index 7b1ffaf2..db0cf3d9 100644 --- a/liana-gui/src/lianalite/client/backend/mod.rs +++ b/liana-gui/src/lianalite/client/backend/mod.rs @@ -912,6 +912,7 @@ impl Daemon for BackendWalletClient { async fn create_recovery( &self, address: Address, + coins_outpoints: &[OutPoint], feerate_vb: u64, sequence: Option, ) -> Result { @@ -931,6 +932,7 @@ impl Daemon for BackendWalletClient { timelock: sequence .ok_or(DaemonError::Unexpected("Missing sequence".to_string()))?, address, + inputs: coins_outpoints, }) .send() .await?;