mirror of
https://github.com/mimblewimble/grin.git
synced 2025-02-08 04:11: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**
|
* **URL**
|
||||||
|
|
||||||
*/v1/wallet/owner/retrieve_txs
|
* /v1/wallet/owner/retrieve_txs
|
||||||
*/v1/wallet/owner/retrieve_txs?refresh?id=x
|
* /v1/wallet/owner/retrieve_txs?refresh&id=x
|
||||||
|
* /v1/wallet/owner/retrieve_txs?tx_id=x
|
||||||
|
|
||||||
* **Method:**
|
* **Method:**
|
||||||
|
|
||||||
|
@ -200,8 +201,9 @@ Return whether the outputs were validated against a node and an array of TxLogEn
|
||||||
|
|
||||||
**Optional:**
|
**Optional:**
|
||||||
|
|
||||||
`refresh` to refresh from node
|
* `refresh` to refresh from node
|
||||||
`tx_id=[number]` to retrieve only the specified output
|
* `id=[number]` to retrieve only the specified output by id
|
||||||
|
* `tx_id=[string]` to retrieve only the specified output by tx id
|
||||||
|
|
||||||
* **Data Params**
|
* **Data Params**
|
||||||
|
|
||||||
|
|
|
@ -524,7 +524,7 @@ pub fn wallet_command(wallet_args: &ArgMatches, config: GlobalWalletConfig) -> i
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
let (height, _) = api.node_height()?;
|
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();
|
let include_status = !tx_id.is_some();
|
||||||
display::txs(
|
display::txs(
|
||||||
account,
|
account,
|
||||||
|
|
|
@ -22,6 +22,7 @@ use std::io::{Read, Write};
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use util::Mutex;
|
use util::Mutex;
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
use serde_json as json;
|
use serde_json as json;
|
||||||
|
|
||||||
|
@ -102,6 +103,7 @@ where
|
||||||
&self,
|
&self,
|
||||||
refresh_from_node: bool,
|
refresh_from_node: bool,
|
||||||
tx_id: Option<u32>,
|
tx_id: Option<u32>,
|
||||||
|
tx_slate_id: Option<Uuid>,
|
||||||
) -> Result<(bool, Vec<TxLogEntry>), Error> {
|
) -> Result<(bool, Vec<TxLogEntry>), Error> {
|
||||||
let mut w = self.wallet.lock();
|
let mut w = self.wallet.lock();
|
||||||
w.open_with_credentials()?;
|
w.open_with_credentials()?;
|
||||||
|
@ -114,7 +116,7 @@ where
|
||||||
|
|
||||||
let res = Ok((
|
let res = Ok((
|
||||||
validated,
|
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()?;
|
w.close()?;
|
||||||
|
|
|
@ -198,7 +198,8 @@ where
|
||||||
req: &Request<Body>,
|
req: &Request<Body>,
|
||||||
api: APIOwner<T, C, K>,
|
api: APIOwner<T, C, K>,
|
||||||
) -> Result<(bool, Vec<TxLogEntry>), Error> {
|
) -> 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 mut update_from_node = false;
|
||||||
|
|
||||||
let params = parse_params(req);
|
let params = parse_params(req);
|
||||||
|
@ -208,10 +209,15 @@ where
|
||||||
}
|
}
|
||||||
if let Some(ids) = params.get("id") {
|
if let Some(ids) = params.get("id") {
|
||||||
for i in ids {
|
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(
|
fn dump_stored_tx(
|
||||||
|
|
|
@ -160,7 +160,7 @@ where
|
||||||
C: WalletClient,
|
C: WalletClient,
|
||||||
K: Keychain,
|
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 {
|
if tx_vec.len() != 1 {
|
||||||
return Err(ErrorKind::TransactionDoesntExist(tx_id))?;
|
return Err(ErrorKind::TransactionDoesntExist(tx_id))?;
|
||||||
}
|
}
|
||||||
|
@ -190,7 +190,7 @@ where
|
||||||
C: WalletClient,
|
C: WalletClient,
|
||||||
K: Keychain,
|
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 {
|
if tx_vec.len() != 1 {
|
||||||
return Err(ErrorKind::TransactionDoesntExist(tx_id))?;
|
return Err(ErrorKind::TransactionDoesntExist(tx_id))?;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
use failure::ResultExt;
|
use failure::ResultExt;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
use core::consensus::reward;
|
use core::consensus::reward;
|
||||||
use core::core::{Output, TxKernel};
|
use core::core::{Output, TxKernel};
|
||||||
|
@ -80,6 +81,7 @@ where
|
||||||
pub fn retrieve_txs<T: ?Sized, C, K>(
|
pub fn retrieve_txs<T: ?Sized, C, K>(
|
||||||
wallet: &mut T,
|
wallet: &mut T,
|
||||||
tx_id: Option<u32>,
|
tx_id: Option<u32>,
|
||||||
|
tx_slate_id: Option<Uuid>,
|
||||||
parent_key_id: &Identifier,
|
parent_key_id: &Identifier,
|
||||||
) -> Result<Vec<TxLogEntry>, Error>
|
) -> Result<Vec<TxLogEntry>, Error>
|
||||||
where
|
where
|
||||||
|
@ -95,6 +97,13 @@ where
|
||||||
} else {
|
} else {
|
||||||
vec![]
|
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 {
|
} else {
|
||||||
wallet
|
wallet
|
||||||
.tx_log_iter()
|
.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.total, 5 * reward);
|
||||||
assert_eq!(wallet1_info.amount_currently_spendable, (5 - cm) * reward);
|
assert_eq!(wallet1_info.amount_currently_spendable, (5 - cm) * reward);
|
||||||
// check tx log as well
|
// 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);
|
assert_eq!(txs.len(), 5);
|
||||||
Ok(())
|
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.total, 7 * reward);
|
||||||
assert_eq!(wallet1_info.amount_currently_spendable, 7 * reward);
|
assert_eq!(wallet1_info.amount_currently_spendable, 7 * reward);
|
||||||
// check tx log as well
|
// 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);
|
assert_eq!(txs.len(), 7);
|
||||||
Ok(())
|
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.total, 0,);
|
||||||
assert_eq!(wallet1_info.amount_currently_spendable, 0,);
|
assert_eq!(wallet1_info.amount_currently_spendable, 0,);
|
||||||
// check tx log as well
|
// 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);
|
assert_eq!(txs.len(), 0);
|
||||||
Ok(())
|
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)?;
|
let (wallet1_refreshed, wallet1_info) = api.retrieve_summary_info(true)?;
|
||||||
assert!(wallet1_refreshed);
|
assert!(wallet1_refreshed);
|
||||||
assert_eq!(wallet1_info.last_confirmed_height, 13);
|
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);
|
assert_eq!(txs.len(), 9);
|
||||||
Ok(())
|
Ok(())
|
||||||
})?;
|
})?;
|
||||||
|
@ -215,7 +215,7 @@ fn accounts_test_impl(test_dir: &str) -> Result<(), libwallet::Error> {
|
||||||
assert_eq!(wallet1_info.last_confirmed_height, 12);
|
assert_eq!(wallet1_info.last_confirmed_height, 12);
|
||||||
let (_, wallet1_info) = api.retrieve_summary_info(true)?;
|
let (_, wallet1_info) = api.retrieve_summary_info(true)?;
|
||||||
assert_eq!(wallet1_info.last_confirmed_height, 13);
|
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);
|
println!("{:?}", txs);
|
||||||
assert_eq!(txs.len(), 5);
|
assert_eq!(txs.len(), 5);
|
||||||
Ok(())
|
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)?;
|
let (wallet2_refreshed, wallet2_info) = api.retrieve_summary_info(true)?;
|
||||||
assert!(wallet2_refreshed);
|
assert!(wallet2_refreshed);
|
||||||
assert_eq!(wallet2_info.last_confirmed_height, 13);
|
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);
|
assert_eq!(txs.len(), 1);
|
||||||
Ok(())
|
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.total, 0,);
|
||||||
assert_eq!(wallet2_info.amount_currently_spendable, 0,);
|
assert_eq!(wallet2_info.amount_currently_spendable, 0,);
|
||||||
// check tx log as well
|
// 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);
|
assert_eq!(txs.len(), 0);
|
||||||
Ok(())
|
Ok(())
|
||||||
})?;
|
})?;
|
||||||
|
|
|
@ -136,14 +136,14 @@ fn compare_wallet_restore(
|
||||||
// Overall wallet info should be the same
|
// Overall wallet info should be the same
|
||||||
wallet::controller::owner_single_use(wallet_source.clone(), |api| {
|
wallet::controller::owner_single_use(wallet_source.clone(), |api| {
|
||||||
src_info = Some(api.retrieve_summary_info(true)?.1);
|
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()?);
|
src_accts = Some(api.accounts()?);
|
||||||
Ok(())
|
Ok(())
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
wallet::controller::owner_single_use(wallet_dest.clone(), |api| {
|
wallet::controller::owner_single_use(wallet_dest.clone(), |api| {
|
||||||
dest_info = Some(api.retrieve_summary_info(true)?.1);
|
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()?);
|
dest_accts = Some(api.accounts()?);
|
||||||
Ok(())
|
Ok(())
|
||||||
})?;
|
})?;
|
||||||
|
|
|
@ -118,7 +118,7 @@ fn basic_transaction_api(test_dir: &str) -> Result<(), libwallet::Error> {
|
||||||
// Check transaction log for wallet 1
|
// Check transaction log for wallet 1
|
||||||
wallet::controller::owner_single_use(wallet1.clone(), |api| {
|
wallet::controller::owner_single_use(wallet1.clone(), |api| {
|
||||||
let (_, wallet1_info) = api.retrieve_summary_info(true)?;
|
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);
|
assert!(refreshed);
|
||||||
let fee = wallet::libtx::tx_fee(
|
let fee = wallet::libtx::tx_fee(
|
||||||
wallet1_info.last_confirmed_height as usize - cm as usize,
|
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
|
// Check transaction log for wallet 2
|
||||||
wallet::controller::owner_single_use(wallet2.clone(), |api| {
|
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);
|
assert!(refreshed);
|
||||||
// we should have a transaction entry for this slate
|
// we should have a transaction entry for this slate
|
||||||
let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id));
|
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);
|
assert_eq!(wallet1_info.amount_immature, cm * reward + fee);
|
||||||
|
|
||||||
// check tx log entry is confirmed
|
// 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);
|
assert!(refreshed);
|
||||||
let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id));
|
let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id));
|
||||||
assert!(tx.is_some());
|
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);
|
assert_eq!(wallet2_info.amount_currently_spendable, amount);
|
||||||
|
|
||||||
// check tx log entry is confirmed
|
// 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);
|
assert!(refreshed);
|
||||||
let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id));
|
let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id));
|
||||||
assert!(tx.is_some());
|
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| {
|
wallet::controller::owner_single_use(wallet1.clone(), |sender_api| {
|
||||||
let (refreshed, _wallet1_info) = sender_api.retrieve_summary_info(true)?;
|
let (refreshed, _wallet1_info) = sender_api.retrieve_summary_info(true)?;
|
||||||
assert!(refreshed);
|
assert!(refreshed);
|
||||||
let (_, txs) = sender_api.retrieve_txs(true, None)?;
|
let (_, txs) = sender_api.retrieve_txs(true, None, None)?;
|
||||||
|
|
||||||
// find the transaction
|
// find the transaction
|
||||||
let tx = txs
|
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);
|
assert_eq!(wallet2_info.amount_currently_spendable, amount * 3);
|
||||||
|
|
||||||
// check tx log entry is confirmed
|
// 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);
|
assert!(refreshed);
|
||||||
let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id));
|
let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id));
|
||||||
assert!(tx.is_some());
|
assert!(tx.is_some());
|
||||||
|
@ -346,7 +346,7 @@ fn tx_rollback(test_dir: &str) -> Result<(), libwallet::Error> {
|
||||||
wallet1_info.last_confirmed_height
|
wallet1_info.last_confirmed_height
|
||||||
);
|
);
|
||||||
assert!(refreshed);
|
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
|
// we should have a transaction entry for this slate
|
||||||
let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id));
|
let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id));
|
||||||
assert!(tx.is_some());
|
assert!(tx.is_some());
|
||||||
|
@ -371,7 +371,7 @@ fn tx_rollback(test_dir: &str) -> Result<(), libwallet::Error> {
|
||||||
|
|
||||||
// Check transaction log for wallet 2
|
// Check transaction log for wallet 2
|
||||||
wallet::controller::owner_single_use(wallet2.clone(), |api| {
|
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);
|
assert!(refreshed);
|
||||||
let mut unconfirmed_count = 0;
|
let mut unconfirmed_count = 0;
|
||||||
let tx = txs.iter().find(|t| t.tx_slate_id == Some(slate.id));
|
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
|
// can't roll back coinbase
|
||||||
let res = api.cancel_tx(1);
|
let res = api.cancel_tx(1);
|
||||||
assert!(res.is_err());
|
assert!(res.is_err());
|
||||||
let (_, txs) = api.retrieve_txs(true, None)?;
|
let (_, txs) = api.retrieve_txs(true, None, None)?;
|
||||||
let tx = txs
|
let tx = txs
|
||||||
.iter()
|
.iter()
|
||||||
.find(|t| t.tx_slate_id == Some(slate.id))
|
.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 2 rolls back
|
||||||
wallet::controller::owner_single_use(wallet2.clone(), |api| {
|
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
|
let tx = txs
|
||||||
.iter()
|
.iter()
|
||||||
.find(|t| t.tx_slate_id == Some(slate.id))
|
.find(|t| t.tx_slate_id == Some(slate.id))
|
||||||
|
|
Loading…
Reference in a new issue