From 1b264595e32a7e4341acd15fb3aba3f5a68121c1 Mon Sep 17 00:00:00 2001 From: Quentin Le Sceller Date: Mon, 12 Nov 2018 19:18:54 +0100 Subject: [PATCH] Add retrieve by tx_id in owner_api --- doc/api/wallet_owner_api.md | 10 ++++++---- src/bin/cmd/wallet.rs | 2 +- wallet/src/libwallet/api.rs | 4 +++- wallet/src/libwallet/controller.rs | 12 +++++++++--- wallet/src/libwallet/internal/tx.rs | 4 ++-- wallet/src/libwallet/internal/updater.rs | 9 +++++++++ wallet/tests/accounts.rs | 14 +++++++------- wallet/tests/restore.rs | 4 ++-- wallet/tests/transaction.rs | 20 ++++++++++---------- 9 files changed, 49 insertions(+), 30 deletions(-) diff --git a/doc/api/wallet_owner_api.md b/doc/api/wallet_owner_api.md index 85dd7abef..fd0653767 100644 --- a/doc/api/wallet_owner_api.md +++ b/doc/api/wallet_owner_api.md @@ -189,8 +189,9 @@ Return whether the outputs were validated against a node and an array of TxLogEn * **URL** - */v1/wallet/owner/retrieve_txs - */v1/wallet/owner/retrieve_txs?refresh?id=x + * /v1/wallet/owner/retrieve_txs + * /v1/wallet/owner/retrieve_txs?refresh&id=x + * /v1/wallet/owner/retrieve_txs?tx_id=x * **Method:** @@ -200,8 +201,9 @@ Return whether the outputs were validated against a node and an array of TxLogEn **Optional:** - `refresh` to refresh from node - `tx_id=[number]` to retrieve only the specified output + * `refresh` to refresh from node + * `id=[number]` to retrieve only the specified output by id + * `tx_id=[string]` to retrieve only the specified output by tx id * **Data Params** diff --git a/src/bin/cmd/wallet.rs b/src/bin/cmd/wallet.rs index 8d5b026e4..553b3bb3b 100644 --- a/src/bin/cmd/wallet.rs +++ b/src/bin/cmd/wallet.rs @@ -524,7 +524,7 @@ pub fn wallet_command(wallet_args: &ArgMatches, config: GlobalWalletConfig) -> i }, }; let (height, _) = api.node_height()?; - let (validated, txs) = api.retrieve_txs(true, tx_id)?; + let (validated, txs) = api.retrieve_txs(true, tx_id, None)?; let include_status = !tx_id.is_some(); display::txs( account, diff --git a/wallet/src/libwallet/api.rs b/wallet/src/libwallet/api.rs index 19e95acc0..920559fb5 100644 --- a/wallet/src/libwallet/api.rs +++ b/wallet/src/libwallet/api.rs @@ -22,6 +22,7 @@ use std::io::{Read, Write}; use std::marker::PhantomData; use std::sync::Arc; use util::Mutex; +use uuid::Uuid; use serde_json as json; @@ -102,6 +103,7 @@ where &self, refresh_from_node: bool, tx_id: Option, + tx_slate_id: Option, ) -> Result<(bool, Vec), Error> { let mut w = self.wallet.lock(); w.open_with_credentials()?; @@ -114,7 +116,7 @@ where let res = Ok(( validated, - updater::retrieve_txs(&mut *w, tx_id, &parent_key_id)?, + updater::retrieve_txs(&mut *w, tx_id, tx_slate_id, &parent_key_id)?, )); w.close()?; diff --git a/wallet/src/libwallet/controller.rs b/wallet/src/libwallet/controller.rs index dc9b87504..d35f25f50 100644 --- a/wallet/src/libwallet/controller.rs +++ b/wallet/src/libwallet/controller.rs @@ -198,7 +198,8 @@ where req: &Request, api: APIOwner, ) -> Result<(bool, Vec), Error> { - let mut id = None; + let mut tx_id = None; + let mut tx_slate_id = None; let mut update_from_node = false; let params = parse_params(req); @@ -208,10 +209,15 @@ where } if let Some(ids) = params.get("id") { for i in ids { - id = Some(i.parse().unwrap()); + tx_id = Some(i.parse().unwrap()); } } - api.retrieve_txs(update_from_node, id) + if let Some(tx_slate_ids) = params.get("tx_id") { + for i in tx_slate_ids { + tx_slate_id = Some(i.parse().unwrap()); + } + } + api.retrieve_txs(update_from_node, tx_id, tx_slate_id) } fn dump_stored_tx( diff --git a/wallet/src/libwallet/internal/tx.rs b/wallet/src/libwallet/internal/tx.rs index 23e419a45..3aa5a3fec 100644 --- a/wallet/src/libwallet/internal/tx.rs +++ b/wallet/src/libwallet/internal/tx.rs @@ -160,7 +160,7 @@ where C: WalletClient, K: Keychain, { - let tx_vec = updater::retrieve_txs(wallet, Some(tx_id), &parent_key_id)?; + let tx_vec = updater::retrieve_txs(wallet, Some(tx_id), None, &parent_key_id)?; if tx_vec.len() != 1 { return Err(ErrorKind::TransactionDoesntExist(tx_id))?; } @@ -190,7 +190,7 @@ where C: WalletClient, K: Keychain, { - let tx_vec = updater::retrieve_txs(wallet, Some(tx_id), parent_key_id)?; + let tx_vec = updater::retrieve_txs(wallet, Some(tx_id), None, parent_key_id)?; if tx_vec.len() != 1 { return Err(ErrorKind::TransactionDoesntExist(tx_id))?; } diff --git a/wallet/src/libwallet/internal/updater.rs b/wallet/src/libwallet/internal/updater.rs index 3e2baa52e..188106250 100644 --- a/wallet/src/libwallet/internal/updater.rs +++ b/wallet/src/libwallet/internal/updater.rs @@ -17,6 +17,7 @@ use failure::ResultExt; use std::collections::HashMap; +use uuid::Uuid; use core::consensus::reward; use core::core::{Output, TxKernel}; @@ -80,6 +81,7 @@ where pub fn retrieve_txs( wallet: &mut T, tx_id: Option, + tx_slate_id: Option, parent_key_id: &Identifier, ) -> Result, Error> where @@ -95,6 +97,13 @@ where } else { vec![] } + } else if tx_slate_id.is_some() { + let tx = wallet.tx_log_iter().find(|t| t.tx_slate_id == tx_slate_id); + if let Some(t) = tx { + vec![t] + } else { + vec![] + } } else { wallet .tx_log_iter() diff --git a/wallet/tests/accounts.rs b/wallet/tests/accounts.rs index e6eb47197..4c1d8cdcc 100644 --- a/wallet/tests/accounts.rs +++ b/wallet/tests/accounts.rs @@ -134,7 +134,7 @@ fn accounts_test_impl(test_dir: &str) -> Result<(), libwallet::Error> { assert_eq!(wallet1_info.total, 5 * reward); assert_eq!(wallet1_info.amount_currently_spendable, (5 - cm) * reward); // check tx log as well - let (_, txs) = api.retrieve_txs(true, None)?; + let (_, txs) = api.retrieve_txs(true, None, None)?; assert_eq!(txs.len(), 5); Ok(()) })?; @@ -153,7 +153,7 @@ fn accounts_test_impl(test_dir: &str) -> Result<(), libwallet::Error> { assert_eq!(wallet1_info.total, 7 * reward); assert_eq!(wallet1_info.amount_currently_spendable, 7 * reward); // check tx log as well - let (_, txs) = api.retrieve_txs(true, None)?; + let (_, txs) = api.retrieve_txs(true, None, None)?; assert_eq!(txs.len(), 7); Ok(()) })?; @@ -172,7 +172,7 @@ fn accounts_test_impl(test_dir: &str) -> Result<(), libwallet::Error> { assert_eq!(wallet1_info.total, 0,); assert_eq!(wallet1_info.amount_currently_spendable, 0,); // check tx log as well - let (_, txs) = api.retrieve_txs(true, None)?; + let (_, txs) = api.retrieve_txs(true, None, None)?; assert_eq!(txs.len(), 0); Ok(()) })?; @@ -200,7 +200,7 @@ fn accounts_test_impl(test_dir: &str) -> Result<(), libwallet::Error> { let (wallet1_refreshed, wallet1_info) = api.retrieve_summary_info(true)?; assert!(wallet1_refreshed); assert_eq!(wallet1_info.last_confirmed_height, 13); - let (_, txs) = api.retrieve_txs(true, None)?; + let (_, txs) = api.retrieve_txs(true, None, None)?; assert_eq!(txs.len(), 9); Ok(()) })?; @@ -215,7 +215,7 @@ fn accounts_test_impl(test_dir: &str) -> Result<(), libwallet::Error> { assert_eq!(wallet1_info.last_confirmed_height, 12); let (_, wallet1_info) = api.retrieve_summary_info(true)?; assert_eq!(wallet1_info.last_confirmed_height, 13); - let (_, txs) = api.retrieve_txs(true, None)?; + let (_, txs) = api.retrieve_txs(true, None, None)?; println!("{:?}", txs); assert_eq!(txs.len(), 5); Ok(()) @@ -226,7 +226,7 @@ fn accounts_test_impl(test_dir: &str) -> Result<(), libwallet::Error> { let (wallet2_refreshed, wallet2_info) = api.retrieve_summary_info(true)?; assert!(wallet2_refreshed); assert_eq!(wallet2_info.last_confirmed_height, 13); - let (_, txs) = api.retrieve_txs(true, None)?; + let (_, txs) = api.retrieve_txs(true, None, None)?; assert_eq!(txs.len(), 1); Ok(()) })?; @@ -244,7 +244,7 @@ fn accounts_test_impl(test_dir: &str) -> Result<(), libwallet::Error> { assert_eq!(wallet2_info.total, 0,); assert_eq!(wallet2_info.amount_currently_spendable, 0,); // check tx log as well - let (_, txs) = api.retrieve_txs(true, None)?; + let (_, txs) = api.retrieve_txs(true, None, None)?; assert_eq!(txs.len(), 0); Ok(()) })?; diff --git a/wallet/tests/restore.rs b/wallet/tests/restore.rs index eb786bae4..618429735 100644 --- a/wallet/tests/restore.rs +++ b/wallet/tests/restore.rs @@ -136,14 +136,14 @@ fn compare_wallet_restore( // Overall wallet info should be the same wallet::controller::owner_single_use(wallet_source.clone(), |api| { src_info = Some(api.retrieve_summary_info(true)?.1); - src_txs = Some(api.retrieve_txs(true, None)?.1); + src_txs = Some(api.retrieve_txs(true, None, None)?.1); src_accts = Some(api.accounts()?); Ok(()) })?; wallet::controller::owner_single_use(wallet_dest.clone(), |api| { dest_info = Some(api.retrieve_summary_info(true)?.1); - dest_txs = Some(api.retrieve_txs(true, None)?.1); + dest_txs = Some(api.retrieve_txs(true, None, None)?.1); dest_accts = Some(api.accounts()?); Ok(()) })?; diff --git a/wallet/tests/transaction.rs b/wallet/tests/transaction.rs index 4a70f3b0c..2e1b372c7 100644 --- a/wallet/tests/transaction.rs +++ b/wallet/tests/transaction.rs @@ -118,7 +118,7 @@ fn basic_transaction_api(test_dir: &str) -> Result<(), libwallet::Error> { // Check transaction log for wallet 1 wallet::controller::owner_single_use(wallet1.clone(), |api| { let (_, wallet1_info) = api.retrieve_summary_info(true)?; - let (refreshed, txs) = api.retrieve_txs(true, None)?; + let (refreshed, txs) = api.retrieve_txs(true, None, None)?; assert!(refreshed); let fee = wallet::libtx::tx_fee( wallet1_info.last_confirmed_height as usize - cm as usize, @@ -139,7 +139,7 @@ fn basic_transaction_api(test_dir: &str) -> Result<(), libwallet::Error> { // Check transaction log for wallet 2 wallet::controller::owner_single_use(wallet2.clone(), |api| { - let (refreshed, txs) = api.retrieve_txs(true, None)?; + let (refreshed, txs) = api.retrieve_txs(true, None, None)?; assert!(refreshed); // we should have a transaction entry for this slate let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id)); @@ -185,7 +185,7 @@ fn basic_transaction_api(test_dir: &str) -> Result<(), libwallet::Error> { assert_eq!(wallet1_info.amount_immature, cm * reward + fee); // check tx log entry is confirmed - let (refreshed, txs) = api.retrieve_txs(true, None)?; + let (refreshed, txs) = api.retrieve_txs(true, None, None)?; assert!(refreshed); let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id)); assert!(tx.is_some()); @@ -221,7 +221,7 @@ fn basic_transaction_api(test_dir: &str) -> Result<(), libwallet::Error> { assert_eq!(wallet2_info.amount_currently_spendable, amount); // check tx log entry is confirmed - let (refreshed, txs) = api.retrieve_txs(true, None)?; + let (refreshed, txs) = api.retrieve_txs(true, None, None)?; assert!(refreshed); let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id)); assert!(tx.is_some()); @@ -249,7 +249,7 @@ fn basic_transaction_api(test_dir: &str) -> Result<(), libwallet::Error> { wallet::controller::owner_single_use(wallet1.clone(), |sender_api| { let (refreshed, _wallet1_info) = sender_api.retrieve_summary_info(true)?; assert!(refreshed); - let (_, txs) = sender_api.retrieve_txs(true, None)?; + let (_, txs) = sender_api.retrieve_txs(true, None, None)?; // find the transaction let tx = txs @@ -276,7 +276,7 @@ fn basic_transaction_api(test_dir: &str) -> Result<(), libwallet::Error> { assert_eq!(wallet2_info.amount_currently_spendable, amount * 3); // check tx log entry is confirmed - let (refreshed, txs) = api.retrieve_txs(true, None)?; + let (refreshed, txs) = api.retrieve_txs(true, None, None)?; assert!(refreshed); let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id)); assert!(tx.is_some()); @@ -346,7 +346,7 @@ fn tx_rollback(test_dir: &str) -> Result<(), libwallet::Error> { wallet1_info.last_confirmed_height ); assert!(refreshed); - let (_, txs) = api.retrieve_txs(true, None)?; + let (_, txs) = api.retrieve_txs(true, None, None)?; // we should have a transaction entry for this slate let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id)); assert!(tx.is_some()); @@ -371,7 +371,7 @@ fn tx_rollback(test_dir: &str) -> Result<(), libwallet::Error> { // Check transaction log for wallet 2 wallet::controller::owner_single_use(wallet2.clone(), |api| { - let (refreshed, txs) = api.retrieve_txs(true, None)?; + let (refreshed, txs) = api.retrieve_txs(true, None, None)?; assert!(refreshed); let mut unconfirmed_count = 0; let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id)); @@ -400,7 +400,7 @@ fn tx_rollback(test_dir: &str) -> Result<(), libwallet::Error> { // can't roll back coinbase let res = api.cancel_tx(1); assert!(res.is_err()); - let (_, txs) = api.retrieve_txs(true, None)?; + let (_, txs) = api.retrieve_txs(true, None, None)?; let tx = txs .iter() .find(|t| t.tx_slate_id == Some(slate.id)) @@ -427,7 +427,7 @@ fn tx_rollback(test_dir: &str) -> Result<(), libwallet::Error> { // Wallet 2 rolls back wallet::controller::owner_single_use(wallet2.clone(), |api| { - let (_, txs) = api.retrieve_txs(true, None)?; + let (_, txs) = api.retrieve_txs(true, None, None)?; let tx = txs .iter() .find(|t| t.tx_slate_id == Some(slate.id))