From 6c7ca2ccaebd8acd6629c7faf8e418cb50128677 Mon Sep 17 00:00:00 2001 From: jp1ac4 <121959000+jp1ac4@users.noreply.github.com> Date: Mon, 5 Feb 2024 17:23:22 +0000 Subject: [PATCH] gui(daemon): add optional filter to `list_coins` --- gui/src/app/mod.rs | 2 +- gui/src/app/state/coins.rs | 4 ++-- gui/src/app/state/mod.rs | 2 +- gui/src/app/state/psbt.rs | 2 +- gui/src/app/state/recovery.rs | 4 ++-- gui/src/app/state/spend/mod.rs | 4 ++-- gui/src/app/state/transactions.rs | 4 ++-- gui/src/daemon/client/mod.rs | 16 +++++++++++++--- gui/src/daemon/embedded.rs | 10 +++++++--- gui/src/daemon/mod.rs | 16 ++++++++++------ gui/src/loader.rs | 2 +- 11 files changed, 42 insertions(+), 24 deletions(-) diff --git a/gui/src/app/mod.rs b/gui/src/app/mod.rs index 097b077f..66b80066 100644 --- a/gui/src/app/mod.rs +++ b/gui/src/app/mod.rs @@ -240,7 +240,7 @@ impl App { let info = daemon.get_info()?; // todo: filter coins to only have current coins. - let coins = daemon.list_coins()?; + let coins = daemon.list_coins(&[], &[])?; Ok(Cache { datadir_path, coins: coins.coins, diff --git a/gui/src/app/state/coins.rs b/gui/src/app/state/coins.rs index e5f2c1b8..9783d2ba 100644 --- a/gui/src/app/state/coins.rs +++ b/gui/src/app/state/coins.rs @@ -162,7 +162,7 @@ impl State for CoinsPanel { Command::perform( async move { daemon1 - .list_coins() + .list_coins(&[], &[]) .map(|res| res.coins) .map_err(|e| e.into()) }, @@ -171,7 +171,7 @@ impl State for CoinsPanel { Command::perform( async move { let coins = daemon2 - .list_coins() + .list_coins(&[], &[]) .map(|res| res.coins) .map_err(Error::from)?; let mut targets = HashSet::::new(); diff --git a/gui/src/app/state/mod.rs b/gui/src/app/state/mod.rs index 2daba35e..1ef261a4 100644 --- a/gui/src/app/state/mod.rs +++ b/gui/src/app/state/mod.rs @@ -295,7 +295,7 @@ impl State for Home { Command::perform( async move { daemon2 - .list_coins() + .list_coins(&[], &[]) .map(|res| res.coins) .map_err(|e| e.into()) }, diff --git a/gui/src/app/state/psbt.rs b/gui/src/app/state/psbt.rs index bfbf0b89..175a1892 100644 --- a/gui/src/app/state/psbt.rs +++ b/gui/src/app/state/psbt.rs @@ -173,7 +173,7 @@ impl PsbtState { daemon // TODO: filter for the outpoints in `tx.coins` when this is possible: // https://github.com/wizardsardine/liana/issues/677 - .list_coins() + .list_coins(&[], &[]) .map(|res| { res.coins .iter() diff --git a/gui/src/app/state/recovery.rs b/gui/src/app/state/recovery.rs index bd8325cc..8b20f661 100644 --- a/gui/src/app/state/recovery.rs +++ b/gui/src/app/state/recovery.rs @@ -155,7 +155,7 @@ impl State for RecoveryPanel { return Command::perform( async move { let psbt = daemon.create_recovery(address, feerate_vb, sequence)?; - let coins = daemon.list_coins().map(|res| res.coins)?; + let coins = daemon.list_coins(&[], &[]).map(|res| res.coins)?; let coins = coins .into_iter() .filter(|coin| { @@ -207,7 +207,7 @@ impl State for RecoveryPanel { Command::perform( async move { daemon - .list_coins() + .list_coins(&[], &[]) .map(|res| res.coins) .map_err(|e| e.into()) }, diff --git a/gui/src/app/state/spend/mod.rs b/gui/src/app/state/spend/mod.rs index 953d684b..1cd82ea3 100644 --- a/gui/src/app/state/spend/mod.rs +++ b/gui/src/app/state/spend/mod.rs @@ -123,7 +123,7 @@ impl State for CreateSpendPanel { Command::perform( async move { daemon1 - .list_coins() + .list_coins(&[], &[]) .map(|res| res.coins) .map_err(|e| e.into()) }, @@ -132,7 +132,7 @@ impl State for CreateSpendPanel { Command::perform( async move { let coins = daemon - .list_coins() + .list_coins(&[], &[]) .map(|res| res.coins) .map_err(Error::from)?; let mut targets = HashSet::::new(); diff --git a/gui/src/app/state/transactions.rs b/gui/src/app/state/transactions.rs index a5198a1d..6737471c 100644 --- a/gui/src/app/state/transactions.rs +++ b/gui/src/app/state/transactions.rs @@ -152,7 +152,7 @@ impl State for TransactionsPanel { daemon // TODO: filter for spending coins when this is possible: // https://github.com/wizardsardine/liana/issues/677 - .list_coins() + .list_coins(&[], &[]) .map(|res| { res.coins .iter() @@ -271,7 +271,7 @@ impl State for TransactionsPanel { Command::perform( async move { daemon2 - .list_coins() + .list_coins(&[], &[]) .map(|res| res.coins) .map_err(|e| e.into()) }, diff --git a/gui/src/daemon/client/mod.rs b/gui/src/daemon/client/mod.rs index eed29071..7f354a28 100644 --- a/gui/src/daemon/client/mod.rs +++ b/gui/src/daemon/client/mod.rs @@ -2,7 +2,7 @@ use std::collections::{HashMap, HashSet}; use std::fmt::Debug; use std::iter::FromIterator; -use liana::commands::CreateRecoveryResult; +use liana::commands::{CoinStatus, CreateRecoveryResult}; use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; use serde_json::json; @@ -77,8 +77,18 @@ impl Daemon for Lianad { self.call("getnewaddress", Option::::None) } - fn list_coins(&self) -> Result { - self.call("listcoins", Option::::None) + fn list_coins( + &self, + statuses: &[CoinStatus], + outpoints: &[OutPoint], + ) -> Result { + self.call( + "listcoins", + Some(vec![ + json!(statuses.iter().map(|s| s.to_arg()).collect::>()), + json!(outpoints), + ]), + ) } fn list_spend_txs(&self) -> Result { diff --git a/gui/src/daemon/embedded.rs b/gui/src/daemon/embedded.rs index 0ccf16b1..ec4942f7 100644 --- a/gui/src/daemon/embedded.rs +++ b/gui/src/daemon/embedded.rs @@ -3,7 +3,7 @@ use std::sync::Mutex; use super::{model::*, Daemon, DaemonError}; use liana::{ - commands::LabelItem, + commands::{CoinStatus, LabelItem}, config::Config, miniscript::bitcoin::{address, psbt::Psbt, Address, OutPoint, Txid}, DaemonControl, DaemonHandle, @@ -87,8 +87,12 @@ impl Daemon for EmbeddedDaemon { self.command(|daemon| Ok(daemon.get_new_address())) } - fn list_coins(&self) -> Result { - self.command(|daemon| Ok(daemon.list_coins(&[], &[]))) + fn list_coins( + &self, + statuses: &[CoinStatus], + outpoints: &[OutPoint], + ) -> Result { + self.command(|daemon| Ok(daemon.list_coins(statuses, outpoints))) } fn list_spend_txs(&self) -> Result { diff --git a/gui/src/daemon/mod.rs b/gui/src/daemon/mod.rs index 5edbc9b0..f33ceb56 100644 --- a/gui/src/daemon/mod.rs +++ b/gui/src/daemon/mod.rs @@ -8,7 +8,7 @@ use std::io::ErrorKind; use std::iter::FromIterator; use liana::{ - commands::LabelItem, + commands::{CoinStatus, LabelItem}, config::Config, miniscript::bitcoin::{address, psbt::Psbt, secp256k1, Address, OutPoint, Txid}, StartupError, @@ -56,7 +56,11 @@ pub trait Daemon: Debug { fn stop(&self) -> Result<(), DaemonError>; fn get_info(&self) -> Result; fn get_new_address(&self) -> Result; - fn list_coins(&self) -> Result; + fn list_coins( + &self, + statuses: &[CoinStatus], + outpoints: &[OutPoint], + ) -> Result; fn list_spend_txs(&self) -> Result; fn create_spend_tx( &self, @@ -102,7 +106,7 @@ pub trait Daemon: Debug { txids: Option<&[Txid]>, ) -> Result, DaemonError> { let info = self.get_info()?; - let coins = self.list_coins()?.coins; + let coins = self.list_coins(&[], &[])?.coins; let mut spend_txs = Vec::new(); let curve = secp256k1::Secp256k1::verification_only(); for tx in self.list_spend_txs()?.spend_txs { @@ -152,7 +156,7 @@ pub trait Daemon: Debug { limit: u64, ) -> Result, DaemonError> { let info = self.get_info()?; - let coins = self.list_coins()?.coins; + let coins = self.list_coins(&[], &[])?.coins; let txs = self.list_confirmed_txs(start, end, limit)?.transactions; let mut txs = txs .into_iter() @@ -190,7 +194,7 @@ pub trait Daemon: Debug { txids: &[Txid], ) -> Result, DaemonError> { let info = self.get_info()?; - let coins = self.list_coins()?.coins; + let coins = self.list_coins(&[], &[])?.coins; let txs = self.list_txs(txids)?.transactions; let mut txs = txs .into_iter() @@ -225,7 +229,7 @@ pub trait Daemon: Debug { fn list_pending_txs(&self) -> Result, DaemonError> { let info = self.get_info()?; - let coins = self.list_coins()?.coins; + let coins = self.list_coins(&[], &[])?.coins; let mut txids: Vec = Vec::new(); for coin in &coins { if coin.block_height.is_none() && !txids.contains(&coin.outpoint.txid) { diff --git a/gui/src/loader.rs b/gui/src/loader.rs index 0716485f..af175b6d 100644 --- a/gui/src/loader.rs +++ b/gui/src/loader.rs @@ -370,7 +370,7 @@ pub async fn load_application( let wallet = Wallet::new(info.descriptors.main).load_settings(&gui_config, &datadir_path, network)?; - let coins = daemon.list_coins().map(|res| res.coins)?; + let coins = daemon.list_coins(&[], &[]).map(|res| res.coins)?; let cache = Cache { datadir_path,