From b178493fd6578b8cc628b68abce022df16f0dad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BF=97=E5=AE=87?= Date: Mon, 2 Sep 2024 17:59:09 +0800 Subject: [PATCH] feat(chain)!: change `IndexedTxGraph` methods that take in `&Transaction` to take in generic with bound `Into>` instead of `&'t Transaction`. --- crates/chain/src/indexed_tx_graph.rs | 31 +++++++++++---------- crates/chain/tests/test_indexed_tx_graph.rs | 9 +++--- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/crates/chain/src/indexed_tx_graph.rs b/crates/chain/src/indexed_tx_graph.rs index 5ec895a50..f0e04d379 100644 --- a/crates/chain/src/indexed_tx_graph.rs +++ b/crates/chain/src/indexed_tx_graph.rs @@ -157,9 +157,9 @@ where /// /// Relevancy is determined by the [`Indexer::is_tx_relevant`] implementation of `I`. Irrelevant /// transactions in `txs` will be ignored. `txs` do not need to be in topological order. - pub fn batch_insert_relevant<'t>( + pub fn batch_insert_relevant>>( &mut self, - txs: impl IntoIterator)>, + txs: impl IntoIterator)>, ) -> ChangeSet { // The algorithm below allows for non-topologically ordered transactions by using two loops. // This is achieved by: @@ -167,28 +167,28 @@ where // not store anything about them. // 2. decide whether to insert them into the graph depending on whether `is_tx_relevant` // returns true or not. (in a second loop). - let txs = txs.into_iter().collect::>(); + let txs = txs + .into_iter() + .map(|(tx, anchors)| (>>::into(tx), anchors)) + .collect::>(); let mut indexer = I::ChangeSet::default(); for (tx, _) in &txs { indexer.merge(self.index.index_tx(tx)); } - let mut graph = tx_graph::ChangeSet::default(); + let mut tx_graph = tx_graph::ChangeSet::default(); for (tx, anchors) in txs { - if self.index.is_tx_relevant(tx) { + if self.index.is_tx_relevant(&tx) { let txid = tx.compute_txid(); - graph.merge(self.graph.insert_tx(tx.clone())); + tx_graph.merge(self.graph.insert_tx(tx.clone())); for anchor in anchors { - graph.merge(self.graph.insert_anchor(txid, anchor)); + tx_graph.merge(self.graph.insert_anchor(txid, anchor)); } } } - ChangeSet { - tx_graph: graph, - indexer, - } + ChangeSet { tx_graph, indexer } } /// Batch insert unconfirmed transactions, filtering out those that are irrelevant. @@ -199,9 +199,9 @@ where /// Items of `txs` are tuples containing the transaction and a *last seen* timestamp. The /// *last seen* communicates when the transaction is last seen in the mempool which is used for /// conflict-resolution in [`TxGraph`] (refer to [`TxGraph::insert_seen_at`] for details). - pub fn batch_insert_relevant_unconfirmed<'t>( + pub fn batch_insert_relevant_unconfirmed>>( &mut self, - unconfirmed_txs: impl IntoIterator, + unconfirmed_txs: impl IntoIterator, ) -> ChangeSet { // The algorithm below allows for non-topologically ordered transactions by using two loops. // This is achieved by: @@ -209,7 +209,10 @@ where // not store anything about them. // 2. decide whether to insert them into the graph depending on whether `is_tx_relevant` // returns true or not. (in a second loop). - let txs = unconfirmed_txs.into_iter().collect::>(); + let txs = unconfirmed_txs + .into_iter() + .map(|(tx, last_seen)| (>>::into(tx), last_seen)) + .collect::>(); let mut indexer = I::ChangeSet::default(); for (tx, _) in &txs { diff --git a/crates/chain/tests/test_indexed_tx_graph.rs b/crates/chain/tests/test_indexed_tx_graph.rs index 361e5ab5c..1fbbcd0df 100644 --- a/crates/chain/tests/test_indexed_tx_graph.rs +++ b/crates/chain/tests/test_indexed_tx_graph.rs @@ -81,7 +81,7 @@ fn insert_relevant_txs() { }; assert_eq!( - graph.batch_insert_relevant(txs.iter().map(|tx| (tx, None))), + graph.batch_insert_relevant(txs.iter().cloned().map(|tx| (tx, None))), changeset, ); @@ -237,10 +237,10 @@ fn test_list_owned_txouts() { // Insert unconfirmed txs with a last_seen timestamp let _ = - graph.batch_insert_relevant([&tx1, &tx2, &tx3, &tx6].iter().enumerate().map(|(i, tx)| { + graph.batch_insert_relevant([&tx1, &tx2, &tx3, &tx6].iter().enumerate().map(|(i, &tx)| { let height = i as u32; ( - *tx, + tx.clone(), local_chain .get(height) .map(|cp| cp.block_id()) @@ -251,7 +251,8 @@ fn test_list_owned_txouts() { ) })); - let _ = graph.batch_insert_relevant_unconfirmed([&tx4, &tx5].iter().map(|tx| (*tx, 100))); + let _ = + graph.batch_insert_relevant_unconfirmed([&tx4, &tx5].iter().map(|&tx| (tx.clone(), 100))); // A helper lambda to extract and filter data from the graph. let fetch =