feat(tx_graph): Add method txs_with_no_anchor_or_last_seen

This commit is contained in:
valued mammal 2024-06-25 12:46:53 -04:00
parent 496601b8b1
commit 6204d2c766
No known key found for this signature in database
3 changed files with 25 additions and 1 deletions

View File

@ -258,6 +258,19 @@ impl<A> TxGraph<A> {
}) })
} }
/// Iterate over graph transactions with no anchors or last-seen.
pub fn txs_with_no_anchor_or_last_seen(
&self,
) -> impl Iterator<Item = TxNode<'_, Arc<Transaction>, A>> {
self.full_txs().filter_map(|tx| {
if tx.anchors.is_empty() && tx.last_seen_unconfirmed.is_none() {
Some(tx)
} else {
None
}
})
}
/// Get a transaction by txid. This only returns `Some` for full transactions. /// Get a transaction by txid. This only returns `Some` for full transactions.
/// ///
/// Refer to [`get_txout`] for getting a specific [`TxOut`]. /// Refer to [`get_txout`] for getting a specific [`TxOut`].

View File

@ -1127,6 +1127,8 @@ fn transactions_inserted_into_tx_graph_are_not_canonical_until_they_have_an_anch
let mut graph = TxGraph::<BlockId>::new(txs); let mut graph = TxGraph::<BlockId>::new(txs);
let full_txs: Vec<_> = graph.full_txs().collect(); let full_txs: Vec<_> = graph.full_txs().collect();
assert_eq!(full_txs.len(), 2); assert_eq!(full_txs.len(), 2);
let unseen_txs: Vec<_> = graph.txs_with_no_anchor_or_last_seen().collect();
assert_eq!(unseen_txs.len(), 2);
// chain // chain
let blocks: BTreeMap<u32, BlockHash> = [(0, h!("g")), (1, h!("A")), (2, h!("B"))] let blocks: BTreeMap<u32, BlockHash> = [(0, h!("g")), (1, h!("A")), (2, h!("B"))]
@ -1154,6 +1156,7 @@ fn transactions_inserted_into_tx_graph_are_not_canonical_until_they_have_an_anch
.map(|tx| tx.tx_node.txid) .map(|tx| tx.tx_node.txid)
.collect(); .collect();
assert!(canonical_txids.contains(&txids[1])); assert!(canonical_txids.contains(&txids[1]));
assert!(graph.txs_with_no_anchor_or_last_seen().next().is_none());
} }
#[test] #[test]

View File

@ -27,7 +27,7 @@ use bdk_chain::{
self, ApplyHeaderError, CannotConnectError, CheckPoint, CheckPointIter, LocalChain, self, ApplyHeaderError, CannotConnectError, CheckPoint, CheckPointIter, LocalChain,
}, },
spk_client::{FullScanRequest, FullScanResult, SyncRequest, SyncResult}, spk_client::{FullScanRequest, FullScanResult, SyncRequest, SyncResult},
tx_graph::{CanonicalTx, TxGraph}, tx_graph::{CanonicalTx, TxGraph, TxNode},
Append, BlockId, ChainPosition, ConfirmationTime, ConfirmationTimeHeightAnchor, FullTxOut, Append, BlockId, ChainPosition, ConfirmationTime, ConfirmationTimeHeightAnchor, FullTxOut,
Indexed, IndexedTxGraph, Indexed, IndexedTxGraph,
}; };
@ -2250,6 +2250,14 @@ impl Wallet {
self.indexed_graph.graph() self.indexed_graph.graph()
} }
/// Iterate over transactions in the wallet that are unseen and unanchored likely
/// because they haven't been broadcast.
pub fn unbroadcast_transactions(
&self,
) -> impl Iterator<Item = TxNode<'_, Arc<Transaction>, ConfirmationTimeHeightAnchor>> {
self.tx_graph().txs_with_no_anchor_or_last_seen()
}
/// Get a reference to the inner [`KeychainTxOutIndex`]. /// Get a reference to the inner [`KeychainTxOutIndex`].
pub fn spk_index(&self) -> &KeychainTxOutIndex<KeychainKind> { pub fn spk_index(&self) -> &KeychainTxOutIndex<KeychainKind> {
&self.indexed_graph.index &self.indexed_graph.index