ConfirmationTime::Unconfirmed { last_seen } => (None, Some(last_seen)),
};
- let changeset: ChangeSet = self.indexed_graph.insert_tx(&tx, anchor, last_seen).into();
+ let mut changeset = ChangeSet::default();
+ let txid = tx.txid();
+ changeset.append(self.indexed_graph.insert_tx(tx).into());
+ if let Some(anchor) = anchor {
+ changeset.append(self.indexed_graph.insert_anchor(txid, anchor).into());
+ }
+ if let Some(last_seen) = last_seen {
+ changeset.append(self.indexed_graph.insert_seen_at(txid, last_seen).into());
+ }
+
let changed = !changeset.is_empty();
self.persist.stage(changeset);
Ok(changed)
//! This is essentially a [`TxGraph`] combined with an indexer.
use alloc::vec::Vec;
-use bitcoin::{Block, OutPoint, Transaction, TxOut};
+use bitcoin::{Block, OutPoint, Transaction, TxOut, Txid};
use crate::{
keychain,
}
/// Insert and index a transaction into the graph.
- ///
- /// `anchors` can be provided to anchor the transaction to various blocks. `seen_at` is a
- /// unix timestamp of when the transaction is last seen.
- pub fn insert_tx(
- &mut self,
- tx: &Transaction,
- anchors: impl IntoIterator<Item = A>,
- seen_at: Option<u64>,
- ) -> ChangeSet<A, I::ChangeSet> {
- let txid = tx.txid();
-
- let mut graph = tx_graph::ChangeSet::default();
- if self.graph.get_tx(txid).is_none() {
- graph.append(self.graph.insert_tx(tx.clone()));
- }
- for anchor in anchors.into_iter() {
- graph.append(self.graph.insert_anchor(txid, anchor));
- }
- if let Some(seen_at) = seen_at {
- graph.append(self.graph.insert_seen_at(txid, seen_at));
- }
-
+ pub fn insert_tx(&mut self, tx: Transaction) -> ChangeSet<A, I::ChangeSet> {
+ let graph = self.graph.insert_tx(tx);
let indexer = self.index_tx_graph_changeset(&graph);
ChangeSet { graph, indexer }
}
+ /// Insert an `anchor` for a given transaction.
+ pub fn insert_anchor(&mut self, txid: Txid, anchor: A) -> ChangeSet<A, I::ChangeSet> {
+ self.graph.insert_anchor(txid, anchor).into()
+ }
+
+ /// Insert a unix timestamp of when a transaction is seen in the mempool.
+ ///
+ /// This is used for transaction conflict resolution in [`TxGraph`] where the transaction with
+ /// the later last-seen is prioritized.
+ pub fn insert_seen_at(&mut self, txid: Txid, seen_at: u64) -> ChangeSet<A, I::ChangeSet> {
+ self.graph.insert_seen_at(txid, seen_at).into()
+ }
+
/// Batch insert transactions, filtering out those that are irrelevant.
///
/// Relevancy is determined by the [`Indexer::is_tx_relevant`] implementation of `I`. Irrelevant
Ok(_) => {
println!("Broadcasted Tx : {}", transaction.txid());
- let keychain_changeset =
- graph.lock().unwrap().insert_tx(&transaction, None, None);
+ let keychain_changeset = graph.lock().unwrap().insert_tx(transaction);
// We know the tx is at least unconfirmed now. Note if persisting here fails,
// it's not a big deal since we can always find it again form