Skip to content

Commit 03d0515

Browse files
committed
alternate approach using try_get_chain_position
1 parent 007beaf commit 03d0515

File tree

3 files changed

+44
-39
lines changed

3 files changed

+44
-39
lines changed

crates/bdk/tests/wallet.rs

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ fn receive_output_in_latest_block(wallet: &mut Wallet, value: u64) -> OutPoint {
4949
let latest_cp = wallet.latest_checkpoint();
5050
let height = latest_cp.height();
5151
let anchor = if height == 0 {
52-
ConfirmationTime::Unconfirmed { last_seen: None }
52+
ConfirmationTime::Unconfirmed { last_seen: Some(1) }
5353
} else {
5454
ConfirmationTime::Confirmed { height, time: 0 }
5555
};
@@ -1009,7 +1009,7 @@ fn test_create_tx_add_utxo() {
10091009
wallet
10101010
.insert_tx(
10111011
small_output_tx.clone(),
1012-
ConfirmationTime::Unconfirmed { last_seen: None },
1012+
ConfirmationTime::Unconfirmed { last_seen: Some(1) },
10131013
)
10141014
.unwrap();
10151015

@@ -1059,7 +1059,7 @@ fn test_create_tx_manually_selected_insufficient() {
10591059
wallet
10601060
.insert_tx(
10611061
small_output_tx.clone(),
1062-
ConfirmationTime::Unconfirmed { last_seen: None },
1062+
ConfirmationTime::Unconfirmed { last_seen: Some(1) },
10631063
)
10641064
.unwrap();
10651065

@@ -1109,7 +1109,7 @@ fn test_create_tx_policy_path_no_csv() {
11091109
}],
11101110
};
11111111
wallet
1112-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1112+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
11131113
.unwrap();
11141114

11151115
let external_policy = wallet.policies(KeychainKind::External).unwrap().unwrap();
@@ -1483,7 +1483,7 @@ fn test_bump_fee_irreplaceable_tx() {
14831483
let tx = psbt.extract_tx().expect("failed to extract tx");
14841484
let txid = tx.txid();
14851485
wallet
1486-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1486+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
14871487
.unwrap();
14881488
wallet.build_fee_bump(txid).unwrap().finish().unwrap();
14891489
}
@@ -1528,7 +1528,7 @@ fn test_bump_fee_low_fee_rate() {
15281528
let txid = tx.txid();
15291529

15301530
wallet
1531-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1531+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
15321532
.unwrap();
15331533

15341534
let mut builder = wallet.build_fee_bump(txid).unwrap();
@@ -1561,7 +1561,7 @@ fn test_bump_fee_low_abs() {
15611561
let txid = tx.txid();
15621562

15631563
wallet
1564-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1564+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
15651565
.unwrap();
15661566

15671567
let mut builder = wallet.build_fee_bump(txid).unwrap();
@@ -1583,7 +1583,7 @@ fn test_bump_fee_zero_abs() {
15831583
let tx = psbt.extract_tx().expect("failed to extract tx");
15841584
let txid = tx.txid();
15851585
wallet
1586-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1586+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
15871587
.unwrap();
15881588

15891589
let mut builder = wallet.build_fee_bump(txid).unwrap();
@@ -1609,7 +1609,7 @@ fn test_bump_fee_reduce_change() {
16091609
let tx = psbt.extract_tx().expect("failed to extract tx");
16101610
let txid = tx.txid();
16111611
wallet
1612-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1612+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
16131613
.unwrap();
16141614

16151615
let feerate = FeeRate::from_sat_per_kwu(625); // 2.5 sat/vb
@@ -1709,7 +1709,7 @@ fn test_bump_fee_reduce_single_recipient() {
17091709
let original_fee = check_fee!(wallet, psbt);
17101710
let txid = tx.txid();
17111711
wallet
1712-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1712+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
17131713
.unwrap();
17141714

17151715
let feerate = FeeRate::from_sat_per_kwu(625); // 2.5 sat/vb
@@ -1753,7 +1753,7 @@ fn test_bump_fee_absolute_reduce_single_recipient() {
17531753
let original_sent_received = wallet.sent_and_received(&tx);
17541754
let txid = tx.txid();
17551755
wallet
1756-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1756+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
17571757
.unwrap();
17581758

17591759
let mut builder = wallet.build_fee_bump(txid).unwrap();
@@ -1823,7 +1823,7 @@ fn test_bump_fee_drain_wallet() {
18231823

18241824
let txid = tx.txid();
18251825
wallet
1826-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1826+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
18271827
.unwrap();
18281828
assert_eq!(original_sent_received.0, 25_000);
18291829

@@ -1893,7 +1893,7 @@ fn test_bump_fee_remove_output_manually_selected_only() {
18931893
let original_sent_received = wallet.sent_and_received(&tx);
18941894
let txid = tx.txid();
18951895
wallet
1896-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1896+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
18971897
.unwrap();
18981898
assert_eq!(original_sent_received.0, 25_000);
18991899

@@ -1940,7 +1940,7 @@ fn test_bump_fee_add_input() {
19401940
let original_details = wallet.sent_and_received(&tx);
19411941
let txid = tx.txid();
19421942
wallet
1943-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1943+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
19441944
.unwrap();
19451945

19461946
let mut builder = wallet.build_fee_bump(txid).unwrap();
@@ -1992,7 +1992,7 @@ fn test_bump_fee_absolute_add_input() {
19921992
let original_sent_received = wallet.sent_and_received(&tx);
19931993
let txid = tx.txid();
19941994
wallet
1995-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1995+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
19961996
.unwrap();
19971997

19981998
let mut builder = wallet.build_fee_bump(txid).unwrap();
@@ -2053,7 +2053,7 @@ fn test_bump_fee_no_change_add_input_and_change() {
20532053
let tx = psbt.extract_tx().expect("failed to extract tx");
20542054
let txid = tx.txid();
20552055
wallet
2056-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
2056+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
20572057
.unwrap();
20582058

20592059
// now bump the fees without using `allow_shrinking`. the wallet should add an
@@ -2121,7 +2121,7 @@ fn test_bump_fee_add_input_change_dust() {
21212121
assert_eq!(tx.output.len(), 2);
21222122
let txid = tx.txid();
21232123
wallet
2124-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
2124+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
21252125
.unwrap();
21262126

21272127
let mut builder = wallet.build_fee_bump(txid).unwrap();
@@ -2188,7 +2188,7 @@ fn test_bump_fee_force_add_input() {
21882188
wallet
21892189
.insert_tx(
21902190
tx.clone(),
2191-
ConfirmationTime::Unconfirmed { last_seen: None },
2191+
ConfirmationTime::Unconfirmed { last_seen: Some(1) },
21922192
)
21932193
.unwrap();
21942194
// the new fee_rate is low enough that just reducing the change would be fine, but we force
@@ -2253,7 +2253,7 @@ fn test_bump_fee_absolute_force_add_input() {
22532253
wallet
22542254
.insert_tx(
22552255
tx.clone(),
2256-
ConfirmationTime::Unconfirmed { last_seen: None },
2256+
ConfirmationTime::Unconfirmed { last_seen: Some(1) },
22572257
)
22582258
.unwrap();
22592259

@@ -2317,15 +2317,15 @@ fn test_bump_fee_unconfirmed_inputs_only() {
23172317
receive_output(
23182318
&mut wallet,
23192319
25_000,
2320-
ConfirmationTime::Unconfirmed { last_seen: None },
2320+
ConfirmationTime::Unconfirmed { last_seen: Some(1) },
23212321
);
23222322
let mut tx = psbt.extract_tx().expect("failed to extract tx");
23232323
let txid = tx.txid();
23242324
for txin in &mut tx.input {
23252325
txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
23262326
}
23272327
wallet
2328-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
2328+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
23292329
.unwrap();
23302330
let mut builder = wallet.build_fee_bump(txid).unwrap();
23312331
builder.fee_rate(FeeRate::from_sat_per_vb_unchecked(25));
@@ -2358,7 +2358,7 @@ fn test_bump_fee_unconfirmed_input() {
23582358
txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
23592359
}
23602360
wallet
2361-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
2361+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
23622362
.unwrap();
23632363

23642364
let mut builder = wallet.build_fee_bump(txid).unwrap();

crates/chain/src/tx_graph.rs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -793,7 +793,15 @@ impl<A: Anchor> TxGraph<A> {
793793
txid: Txid,
794794
) -> Result<Option<ChainPosition<&A>>, C::Error> {
795795
let (tx_node, anchors, last_seen) = match self.txs.get(&txid) {
796-
Some(v) => v,
796+
Some(val) => {
797+
let (_, anchors, last_seen) = val;
798+
if anchors.is_empty() && last_seen.is_none() {
799+
// We don't consider unanchored, unseen transactions
800+
// to have a chain position.
801+
return Ok(None);
802+
}
803+
val
804+
}
797805
None => return Ok(None),
798806
};
799807

@@ -991,18 +999,16 @@ impl<A: Anchor> TxGraph<A> {
991999
chain: &'a C,
9921000
chain_tip: BlockId,
9931001
) -> impl Iterator<Item = Result<CanonicalTx<'a, Arc<Transaction>, A>, C::Error>> {
994-
self.full_txs()
995-
.filter(|tx| !tx.anchors.is_empty() || tx.last_seen_unconfirmed.is_some())
996-
.filter_map(move |tx| {
997-
self.try_get_chain_position(chain, chain_tip, tx.txid)
998-
.map(|v| {
999-
v.map(|observed_in| CanonicalTx {
1000-
chain_position: observed_in,
1001-
tx_node: tx,
1002-
})
1002+
self.full_txs().filter_map(move |tx| {
1003+
self.try_get_chain_position(chain, chain_tip, tx.txid)
1004+
.map(|v| {
1005+
v.map(|observed_in| CanonicalTx {
1006+
chain_position: observed_in,
1007+
tx_node: tx,
10031008
})
1004-
.transpose()
1005-
})
1009+
})
1010+
.transpose()
1011+
})
10061012
}
10071013

10081014
/// List graph transactions that are in `chain` with `chain_tip`.

crates/chain/tests/test_tx_graph.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -959,11 +959,10 @@ fn test_chain_spends() {
959959
}))
960960
);
961961

962-
// Even if unconfirmed tx has a last_seen of None, it can still be part of a chain spend.
963-
assert_eq!(
964-
graph.get_chain_spend(&local_chain, tip.block_id(), OutPoint::new(tx_0.txid(), 1)),
965-
Some((ChainPosition::Unconfirmed(None), tx_2.txid())),
966-
);
962+
// An unconfirmed and unseen tx cannot be part of a chain spend.
963+
assert!(graph
964+
.get_chain_spend(&local_chain, tip.block_id(), OutPoint::new(tx_0.txid(), 1))
965+
.is_none());
967966

968967
// Mark the unconfirmed as seen and check correct ObservedAs status is returned.
969968
let _ = graph.insert_seen_at(tx_2.txid(), 1234567);

0 commit comments

Comments
 (0)