diff --git a/crates/transaction-pool/src/validate/mod.rs b/crates/transaction-pool/src/validate/mod.rs index 5c4a2f831..1645af524 100644 --- a/crates/transaction-pool/src/validate/mod.rs +++ b/crates/transaction-pool/src/validate/mod.rs @@ -5,6 +5,7 @@ use crate::{ identifier::{SenderId, TransactionId}, traits::{PoolTransaction, TransactionOrigin}, }; +use futures_util::future::Either; use reth_primitives::{ Address, BlobTransactionSidecar, IntoRecoveredTransaction, PooledTransactionsElementEcRecovered, SealedBlock, TransactionSignedEcRecovered, TxHash, B256, @@ -209,6 +210,42 @@ pub trait TransactionValidator: Send + Sync { fn on_new_head_block(&self, _new_tip_block: &SealedBlock) {} } +impl TransactionValidator for Either +where + A: TransactionValidator, + B: TransactionValidator, +{ + type Transaction = A::Transaction; + + async fn validate_transaction( + &self, + origin: TransactionOrigin, + transaction: Self::Transaction, + ) -> TransactionValidationOutcome { + match self { + Self::Left(v) => v.validate_transaction(origin, transaction).await, + Self::Right(v) => v.validate_transaction(origin, transaction).await, + } + } + + async fn validate_transactions( + &self, + transactions: Vec<(TransactionOrigin, Self::Transaction)>, + ) -> Vec> { + match self { + Self::Left(v) => v.validate_transactions(transactions).await, + Self::Right(v) => v.validate_transactions(transactions).await, + } + } + + fn on_new_head_block(&self, new_tip_block: &SealedBlock) { + match self { + Self::Left(v) => v.on_new_head_block(new_tip_block), + Self::Right(v) => v.on_new_head_block(new_tip_block), + } + } +} + /// A valid transaction in the pool. /// /// This is used as the internal representation of a transaction inside the pool.