reth_transaction_pool/test_utils/
okvalidator.rs

1use std::marker::PhantomData;
2
3use crate::{
4    validate::ValidTransaction, EthPooledTransaction, PoolTransaction, TransactionOrigin,
5    TransactionValidationOutcome, TransactionValidator,
6};
7use reth_ethereum_primitives::Block;
8
9/// A transaction validator that determines all transactions to be valid.
10#[derive(Debug)]
11#[non_exhaustive]
12pub struct OkValidator<T = EthPooledTransaction> {
13    _phantom: PhantomData<T>,
14    /// Whether to mark transactions as propagatable.
15    propagate: bool,
16}
17
18impl<T> OkValidator<T> {
19    /// Determines whether transactions should be allowed to be propagated
20    pub const fn set_propagate_transactions(mut self, propagate: bool) -> Self {
21        self.propagate = propagate;
22        self
23    }
24}
25
26impl<T> Default for OkValidator<T> {
27    fn default() -> Self {
28        Self { _phantom: Default::default(), propagate: false }
29    }
30}
31
32impl<T> TransactionValidator for OkValidator<T>
33where
34    T: PoolTransaction,
35{
36    type Transaction = T;
37    type Block = Block;
38
39    async fn validate_transaction(
40        &self,
41        _origin: TransactionOrigin,
42        transaction: Self::Transaction,
43    ) -> TransactionValidationOutcome<Self::Transaction> {
44        // Always return valid
45        let authorities = transaction.authorization_list().map(|auths| {
46            auths.iter().flat_map(|auth| auth.recover_authority()).collect::<Vec<_>>()
47        });
48        TransactionValidationOutcome::Valid {
49            balance: *transaction.cost(),
50            state_nonce: transaction.nonce(),
51            bytecode_hash: None,
52            transaction: ValidTransaction::Valid(transaction),
53            propagate: self.propagate,
54            authorities,
55        }
56    }
57}