diff --git a/crates/bdk/src/wallet/mod.rs b/crates/bdk/src/wallet/mod.rs index 090a9ca6..659da90a 100644 --- a/crates/bdk/src/wallet/mod.rs +++ b/crates/bdk/src/wallet/mod.rs @@ -738,7 +738,16 @@ impl Wallet { 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) diff --git a/crates/chain/src/indexed_tx_graph.rs b/crates/chain/src/indexed_tx_graph.rs index e65b6868..0e2620e0 100644 --- a/crates/chain/src/indexed_tx_graph.rs +++ b/crates/chain/src/indexed_tx_graph.rs @@ -3,7 +3,7 @@ //! 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, @@ -103,32 +103,25 @@ where } /// 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, - seen_at: Option, - ) -> 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 { + 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 { + 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 { + 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 diff --git a/example-crates/example_cli/src/lib.rs b/example-crates/example_cli/src/lib.rs index 1982c30c..9e572a89 100644 --- a/example-crates/example_cli/src/lib.rs +++ b/example-crates/example_cli/src/lib.rs @@ -624,8 +624,7 @@ where 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