Skip to content

Commit 6fbd167

Browse files
committed
alternate approach using try_get_chain_position
1 parent 11d02a6 commit 6fbd167

File tree

3 files changed

+44
-39
lines changed

3 files changed

+44
-39
lines changed

crates/chain/src/tx_graph.rs

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

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

10091015
/// 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
@@ -961,11 +961,10 @@ fn test_chain_spends() {
961961
}))
962962
);
963963

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

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

crates/wallet/tests/wallet.rs

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ fn receive_output_in_latest_block(wallet: &mut Wallet, value: u64) -> OutPoint {
5151
let latest_cp = wallet.latest_checkpoint();
5252
let height = latest_cp.height();
5353
let anchor = if height == 0 {
54-
ConfirmationTime::Unconfirmed { last_seen: None }
54+
ConfirmationTime::Unconfirmed { last_seen: Some(1) }
5555
} else {
5656
ConfirmationTime::Confirmed { height, time: 0 }
5757
};
@@ -1066,7 +1066,7 @@ fn test_create_tx_add_utxo() {
10661066
wallet
10671067
.insert_tx(
10681068
small_output_tx.clone(),
1069-
ConfirmationTime::Unconfirmed { last_seen: None },
1069+
ConfirmationTime::Unconfirmed { last_seen: Some(1) },
10701070
)
10711071
.unwrap();
10721072

@@ -1117,7 +1117,7 @@ fn test_create_tx_manually_selected_insufficient() {
11171117
wallet
11181118
.insert_tx(
11191119
small_output_tx.clone(),
1120-
ConfirmationTime::Unconfirmed { last_seen: None },
1120+
ConfirmationTime::Unconfirmed { last_seen: Some(1) },
11211121
)
11221122
.unwrap();
11231123

@@ -1167,7 +1167,7 @@ fn test_create_tx_policy_path_no_csv() {
11671167
}],
11681168
};
11691169
wallet
1170-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1170+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
11711171
.unwrap();
11721172

11731173
let external_policy = wallet.policies(KeychainKind::External).unwrap().unwrap();
@@ -1541,7 +1541,7 @@ fn test_bump_fee_irreplaceable_tx() {
15411541
let tx = psbt.extract_tx().expect("failed to extract tx");
15421542
let txid = tx.txid();
15431543
wallet
1544-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1544+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
15451545
.unwrap();
15461546
wallet.build_fee_bump(txid).unwrap().finish().unwrap();
15471547
}
@@ -1586,7 +1586,7 @@ fn test_bump_fee_low_fee_rate() {
15861586
let txid = tx.txid();
15871587

15881588
wallet
1589-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1589+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
15901590
.unwrap();
15911591

15921592
let mut builder = wallet.build_fee_bump(txid).unwrap();
@@ -1619,7 +1619,7 @@ fn test_bump_fee_low_abs() {
16191619
let txid = tx.txid();
16201620

16211621
wallet
1622-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1622+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
16231623
.unwrap();
16241624

16251625
let mut builder = wallet.build_fee_bump(txid).unwrap();
@@ -1641,7 +1641,7 @@ fn test_bump_fee_zero_abs() {
16411641
let tx = psbt.extract_tx().expect("failed to extract tx");
16421642
let txid = tx.txid();
16431643
wallet
1644-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1644+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
16451645
.unwrap();
16461646

16471647
let mut builder = wallet.build_fee_bump(txid).unwrap();
@@ -1667,7 +1667,7 @@ fn test_bump_fee_reduce_change() {
16671667
let tx = psbt.extract_tx().expect("failed to extract tx");
16681668
let txid = tx.txid();
16691669
wallet
1670-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1670+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
16711671
.unwrap();
16721672

16731673
let feerate = FeeRate::from_sat_per_kwu(625); // 2.5 sat/vb
@@ -1765,7 +1765,7 @@ fn test_bump_fee_reduce_single_recipient() {
17651765
let original_fee = check_fee!(wallet, psbt);
17661766
let txid = tx.txid();
17671767
wallet
1768-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1768+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
17691769
.unwrap();
17701770

17711771
let feerate = FeeRate::from_sat_per_kwu(625); // 2.5 sat/vb
@@ -1809,7 +1809,7 @@ fn test_bump_fee_absolute_reduce_single_recipient() {
18091809
let original_sent_received = wallet.sent_and_received(&tx);
18101810
let txid = tx.txid();
18111811
wallet
1812-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1812+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
18131813
.unwrap();
18141814

18151815
let mut builder = wallet.build_fee_bump(txid).unwrap();
@@ -1879,7 +1879,7 @@ fn test_bump_fee_drain_wallet() {
18791879

18801880
let txid = tx.txid();
18811881
wallet
1882-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1882+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
18831883
.unwrap();
18841884
assert_eq!(original_sent_received.0, Amount::from_sat(25_000));
18851885

@@ -1949,7 +1949,7 @@ fn test_bump_fee_remove_output_manually_selected_only() {
19491949
let original_sent_received = wallet.sent_and_received(&tx);
19501950
let txid = tx.txid();
19511951
wallet
1952-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1952+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
19531953
.unwrap();
19541954
assert_eq!(original_sent_received.0, Amount::from_sat(25_000));
19551955

@@ -1996,7 +1996,7 @@ fn test_bump_fee_add_input() {
19961996
let original_details = wallet.sent_and_received(&tx);
19971997
let txid = tx.txid();
19981998
wallet
1999-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
1999+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
20002000
.unwrap();
20012001

20022002
let mut builder = wallet.build_fee_bump(txid).unwrap();
@@ -2053,7 +2053,7 @@ fn test_bump_fee_absolute_add_input() {
20532053
let original_sent_received = wallet.sent_and_received(&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
let mut builder = wallet.build_fee_bump(txid).unwrap();
@@ -2119,7 +2119,7 @@ fn test_bump_fee_no_change_add_input_and_change() {
21192119
let tx = psbt.extract_tx().expect("failed to extract tx");
21202120
let txid = tx.txid();
21212121
wallet
2122-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
2122+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
21232123
.unwrap();
21242124

21252125
// now bump the fees without using `allow_shrinking`. the wallet should add an
@@ -2190,7 +2190,7 @@ fn test_bump_fee_add_input_change_dust() {
21902190
assert_eq!(tx.output.len(), 2);
21912191
let txid = tx.txid();
21922192
wallet
2193-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
2193+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
21942194
.unwrap();
21952195

21962196
let mut builder = wallet.build_fee_bump(txid).unwrap();
@@ -2263,7 +2263,7 @@ fn test_bump_fee_force_add_input() {
22632263
wallet
22642264
.insert_tx(
22652265
tx.clone(),
2266-
ConfirmationTime::Unconfirmed { last_seen: None },
2266+
ConfirmationTime::Unconfirmed { last_seen: Some(1) },
22672267
)
22682268
.unwrap();
22692269
// the new fee_rate is low enough that just reducing the change would be fine, but we force
@@ -2333,7 +2333,7 @@ fn test_bump_fee_absolute_force_add_input() {
23332333
wallet
23342334
.insert_tx(
23352335
tx.clone(),
2336-
ConfirmationTime::Unconfirmed { last_seen: None },
2336+
ConfirmationTime::Unconfirmed { last_seen: Some(1) },
23372337
)
23382338
.unwrap();
23392339

@@ -2402,15 +2402,15 @@ fn test_bump_fee_unconfirmed_inputs_only() {
24022402
receive_output(
24032403
&mut wallet,
24042404
25_000,
2405-
ConfirmationTime::Unconfirmed { last_seen: None },
2405+
ConfirmationTime::Unconfirmed { last_seen: Some(1) },
24062406
);
24072407
let mut tx = psbt.extract_tx().expect("failed to extract tx");
24082408
let txid = tx.txid();
24092409
for txin in &mut tx.input {
24102410
txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
24112411
}
24122412
wallet
2413-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
2413+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
24142414
.unwrap();
24152415
let mut builder = wallet.build_fee_bump(txid).unwrap();
24162416
builder.fee_rate(FeeRate::from_sat_per_vb_unchecked(25));
@@ -2443,7 +2443,7 @@ fn test_bump_fee_unconfirmed_input() {
24432443
txin.witness.push([0x00; P2WPKH_FAKE_WITNESS_SIZE]); // fake signature
24442444
}
24452445
wallet
2446-
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: None })
2446+
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: Some(1) })
24472447
.unwrap();
24482448

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

0 commit comments

Comments
 (0)