mirror of
https://github.com/mimblewimble/grin.git
synced 2025-02-01 08:51:08 +03:00
Add retrieve by tx_id in owner_api
This commit is contained in:
parent
1b65738504
commit
1b264595e3
9 changed files with 49 additions and 30 deletions
|
@ -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**
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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<u32>,
|
||||
tx_slate_id: Option<Uuid>,
|
||||
) -> Result<(bool, Vec<TxLogEntry>), 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()?;
|
||||
|
|
|
@ -198,7 +198,8 @@ where
|
|||
req: &Request<Body>,
|
||||
api: APIOwner<T, C, K>,
|
||||
) -> Result<(bool, Vec<TxLogEntry>), 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(
|
||||
|
|
|
@ -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))?;
|
||||
}
|
||||
|
|
|
@ -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<T: ?Sized, C, K>(
|
||||
wallet: &mut T,
|
||||
tx_id: Option<u32>,
|
||||
tx_slate_id: Option<Uuid>,
|
||||
parent_key_id: &Identifier,
|
||||
) -> Result<Vec<TxLogEntry>, 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()
|
||||
|
|
|
@ -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(())
|
||||
})?;
|
||||
|
|
|
@ -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(())
|
||||
})?;
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in a new issue