gui(daemon): add optional filter to list_coins

This commit is contained in:
jp1ac4 2024-02-05 17:23:22 +00:00
parent 771bf16b58
commit 6c7ca2ccae
No known key found for this signature in database
GPG Key ID: A7ACD32423568D7B
11 changed files with 42 additions and 24 deletions

View File

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

View File

@ -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::<LabelItem>::new();

View File

@ -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())
},

View File

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

View File

@ -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())
},

View File

@ -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::<LabelItem>::new();

View File

@ -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())
},

View File

@ -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<C: Client + Debug> Daemon for Lianad<C> {
self.call("getnewaddress", Option::<Request>::None)
}
fn list_coins(&self) -> Result<ListCoinsResult, DaemonError> {
self.call("listcoins", Option::<Request>::None)
fn list_coins(
&self,
statuses: &[CoinStatus],
outpoints: &[OutPoint],
) -> Result<ListCoinsResult, DaemonError> {
self.call(
"listcoins",
Some(vec![
json!(statuses.iter().map(|s| s.to_arg()).collect::<Vec<&str>>()),
json!(outpoints),
]),
)
}
fn list_spend_txs(&self) -> Result<ListSpendResult, DaemonError> {

View File

@ -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<ListCoinsResult, DaemonError> {
self.command(|daemon| Ok(daemon.list_coins(&[], &[])))
fn list_coins(
&self,
statuses: &[CoinStatus],
outpoints: &[OutPoint],
) -> Result<ListCoinsResult, DaemonError> {
self.command(|daemon| Ok(daemon.list_coins(statuses, outpoints)))
}
fn list_spend_txs(&self) -> Result<ListSpendResult, DaemonError> {

View File

@ -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<model::GetInfoResult, DaemonError>;
fn get_new_address(&self) -> Result<model::GetAddressResult, DaemonError>;
fn list_coins(&self) -> Result<model::ListCoinsResult, DaemonError>;
fn list_coins(
&self,
statuses: &[CoinStatus],
outpoints: &[OutPoint],
) -> Result<model::ListCoinsResult, DaemonError>;
fn list_spend_txs(&self) -> Result<model::ListSpendResult, DaemonError>;
fn create_spend_tx(
&self,
@ -102,7 +106,7 @@ pub trait Daemon: Debug {
txids: Option<&[Txid]>,
) -> Result<Vec<model::SpendTx>, 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<Vec<model::HistoryTransaction>, 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<Vec<model::HistoryTransaction>, 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<Vec<model::HistoryTransaction>, DaemonError> {
let info = self.get_info()?;
let coins = self.list_coins()?.coins;
let coins = self.list_coins(&[], &[])?.coins;
let mut txids: Vec<Txid> = Vec::new();
for coin in &coins {
if coin.block_height.is_none() && !txids.contains(&coin.outpoint.txid) {

View File

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