Skip to content

Commit 51fe7f9

Browse files
committed
test(wallet): add test to verify wallet::get_tx TransactionDetails amounts"
1 parent 8f38e96 commit 51fe7f9

File tree

2 files changed

+83
-11
lines changed

2 files changed

+83
-11
lines changed

crates/bdk/tests/common.rs

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,53 @@
11
#![allow(unused)]
2+
23
use bdk::{wallet::AddressIndex, Wallet};
34
use bdk_chain::{BlockId, ConfirmationTime};
45
use bitcoin::hashes::Hash;
5-
use bitcoin::{BlockHash, Network, Transaction, TxOut};
6+
use bitcoin::{Address, BlockHash, Network, OutPoint, Transaction, TxIn, TxOut};
7+
use std::str::FromStr;
68

79
/// Return a fake wallet that appears to be funded for testing.
810
pub fn get_funded_wallet_with_change(
911
descriptor: &str,
1012
change: Option<&str>,
1113
) -> (Wallet, bitcoin::Txid) {
1214
let mut wallet = Wallet::new_no_persist(descriptor, change, Network::Regtest).unwrap();
13-
let address = wallet.get_address(AddressIndex::New).address;
15+
let change_address = wallet.get_address(AddressIndex::New).address;
16+
let sendto_address =
17+
Address::from_str("tb1qeua3n9t076zntxj64cz7qywwtwxd0lwvmtcmtd").expect("address");
1418

15-
let tx = Transaction {
19+
let tx0 = Transaction {
1620
version: 1,
1721
lock_time: bitcoin::PackedLockTime(0),
1822
input: vec![],
1923
output: vec![TxOut {
20-
value: 50_000,
21-
script_pubkey: address.script_pubkey(),
24+
value: 76_000,
25+
script_pubkey: change_address.script_pubkey(),
26+
}],
27+
};
28+
29+
let tx1 = Transaction {
30+
version: 1,
31+
lock_time: bitcoin::PackedLockTime(0),
32+
input: vec![TxIn {
33+
previous_output: OutPoint {
34+
txid: tx0.txid(),
35+
vout: 0,
36+
},
37+
script_sig: Default::default(),
38+
sequence: Default::default(),
39+
witness: Default::default(),
2240
}],
41+
output: vec![
42+
TxOut {
43+
value: 50_000,
44+
script_pubkey: change_address.script_pubkey(),
45+
},
46+
TxOut {
47+
value: 25_000,
48+
script_pubkey: sendto_address.script_pubkey(),
49+
},
50+
],
2351
};
2452

2553
wallet
@@ -28,17 +56,32 @@ pub fn get_funded_wallet_with_change(
2856
hash: BlockHash::all_zeros(),
2957
})
3058
.unwrap();
59+
wallet
60+
.insert_checkpoint(BlockId {
61+
height: 2_000,
62+
hash: BlockHash::all_zeros(),
63+
})
64+
.unwrap();
3165
wallet
3266
.insert_tx(
33-
tx.clone(),
67+
tx0,
3468
ConfirmationTime::Confirmed {
3569
height: 1_000,
3670
time: 100,
3771
},
3872
)
3973
.unwrap();
74+
wallet
75+
.insert_tx(
76+
tx1.clone(),
77+
ConfirmationTime::Confirmed {
78+
height: 2_000,
79+
time: 200,
80+
},
81+
)
82+
.unwrap();
4083

41-
(wallet, tx.txid())
84+
(wallet, tx1.txid())
4285
}
4386

4487
pub fn get_funded_wallet(descriptor: &str) -> (Wallet, bitcoin::Txid) {

crates/bdk/tests/wallet.rs

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@ use bdk::signer::{SignOptions, SignerError};
44
use bdk::wallet::coin_selection::LargestFirstCoinSelection;
55
use bdk::wallet::AddressIndex::*;
66
use bdk::wallet::{AddressIndex, AddressInfo, Balance, Wallet};
7-
use bdk::Error;
87
use bdk::FeeRate;
98
use bdk::KeychainKind;
10-
use bdk_chain::BlockId;
11-
use bdk_chain::ConfirmationTime;
9+
use bdk::{Error, TransactionDetails};
1210
use bdk_chain::COINBASE_MATURITY;
11+
use bdk_chain::{BlockId, ConfirmationTime};
1312
use bitcoin::hashes::Hash;
1413
use bitcoin::BlockHash;
1514
use bitcoin::Script;
@@ -84,6 +83,36 @@ fn test_get_funded_wallet_balance() {
8483
assert_eq!(wallet.get_balance().confirmed, 50000);
8584
}
8685

86+
#[test]
87+
fn test_get_funded_wallet_tx_details() {
88+
let (wallet, _) = get_funded_wallet(get_test_wpkh());
89+
assert_eq!(wallet.get_balance().confirmed, 50000);
90+
let mut tx_details: Vec<TransactionDetails> = wallet
91+
.transactions()
92+
.map(|ct| {
93+
wallet
94+
.get_tx(ct.node.txid, false)
95+
.expect("transaction details")
96+
})
97+
.collect();
98+
tx_details.sort();
99+
100+
assert_eq!(tx_details.len(), 2);
101+
assert_matches!(
102+
tx_details.get(1),
103+
Some(TransactionDetails {
104+
received: 50_000,
105+
sent: 76_000,
106+
fee: Some(1000),
107+
confirmation_time: ConfirmationTime::Confirmed {
108+
height: 2000,
109+
time: 200,
110+
},
111+
..
112+
})
113+
)
114+
}
115+
87116
macro_rules! assert_fee_rate {
88117
($psbt:expr, $fees:expr, $fee_rate:expr $( ,@dust_change $( $dust_change:expr )* )* $( ,@add_signature $( $add_signature:expr )* )* ) => ({
89118
let psbt = $psbt.clone();
@@ -207,7 +236,7 @@ fn test_create_tx_default_locktime_is_last_sync_height() {
207236

208237
// Since we never synced the wallet we don't have a last_sync_height
209238
// we could use to try to prevent fee sniping. We default to 0.
210-
assert_eq!(psbt.unsigned_tx.lock_time.0, 1_000);
239+
assert_eq!(psbt.unsigned_tx.lock_time.0, 2_000);
211240
}
212241

213242
#[test]

0 commit comments

Comments
 (0)