From 4febeda516d442160ee16ff94873c3fef7e1432f Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Thu, 12 Sep 2019 20:47:23 -0700 Subject: [PATCH] Option to print only unspent notes and utxos --- rust-lightclient/src/commands.rs | 23 ++++++++++++++++---- rust-lightclient/src/lightclient.rs | 33 ++++++++++++++++++----------- 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/rust-lightclient/src/commands.rs b/rust-lightclient/src/commands.rs index c5b75f7..e24876d 100644 --- a/rust-lightclient/src/commands.rs +++ b/rust-lightclient/src/commands.rs @@ -176,7 +176,6 @@ impl Command for TransactionsCommand { let txns = lightclient.do_list_transactions(); println!("{}", txns.pretty(2)); } - } @@ -190,11 +189,27 @@ impl Command for NotesCommand { "List all sapling notes in the wallet".to_string() } - fn exec(&self, _args: &[&str], lightclient: &mut LightClient) { - let txns = lightclient.do_list_notes(); + fn exec(&self, args: &[&str], lightclient: &mut LightClient) { + // Parse the args. + if args.len() > 1 { + self.help(); + return; + } + + // Make sure we can parse the amount + let all_notes = if args.len() == 1 { + match args[0] { + "all" => true, + _ => { println!("Invalid argument. Specify 'all' to include unspent notes"); + return; } + } + } else { + false + }; + + let txns = lightclient.do_list_notes(all_notes); println!("{}", txns.pretty(2)); } - } diff --git a/rust-lightclient/src/lightclient.rs b/rust-lightclient/src/lightclient.rs index 99e3474..20154b4 100644 --- a/rust-lightclient/src/lightclient.rs +++ b/rust-lightclient/src/lightclient.rs @@ -157,7 +157,7 @@ impl LightClient { } // Return a list of all notes, spent and unspent - pub fn do_list_notes(&self) -> JsonValue { + pub fn do_list_notes(&self, all_notes: bool) -> JsonValue { let mut unspent_notes: Vec = vec![]; let mut spent_notes : Vec = vec![]; let mut pending_notes: Vec = vec![]; @@ -165,15 +165,19 @@ impl LightClient { // Collect Sapling notes self.wallet.txs.read().unwrap().iter() .flat_map( |(txid, wtx)| { - wtx.notes.iter().map(move |nd| - object!{ - "created_in_block" => wtx.block, - "created_in_txid" => format!("{}", txid), - "value" => nd.note.value, - "is_change" => nd.is_change, - "address" => LightWallet::address_from_extfvk(&nd.extfvk, nd.diversifier), - "spent" => nd.spent.map(|spent_txid| format!("{}", spent_txid)), - "unconfirmed_spent" => nd.unconfirmed_spent.map(|spent_txid| format!("{}", spent_txid)), + wtx.notes.iter().filter_map(move |nd| + if !all_notes && nd.spent.is_some() { + None + } else { + Some(object!{ + "created_in_block" => wtx.block, + "created_in_txid" => format!("{}", txid), + "value" => nd.note.value, + "is_change" => nd.is_change, + "address" => LightWallet::address_from_extfvk(&nd.extfvk, nd.diversifier), + "spent" => nd.spent.map(|spent_txid| format!("{}", spent_txid)), + "unconfirmed_spent" => nd.unconfirmed_spent.map(|spent_txid| format!("{}", spent_txid)), + }) } ) }) @@ -205,12 +209,17 @@ impl LightClient { }) .collect::>(); - object!{ - "spent_notes" => spent_notes, + let mut res = object!{ "unspent_notes" => unspent_notes, "pending_notes" => pending_notes, "utxos" => utxos, + }; + + if all_notes { + res["spent_notes"] = JsonValue::Array(spent_notes); } + + res } pub fn do_list_transactions(&self) -> JsonValue {