arb_node/
pool.rs

1//! Arbitrum transaction pool builder.
2
3use arb_primitives::ArbTransactionSigned;
4use arb_txpool::ArbPooledTransaction;
5use reth_chainspec::EthereumHardforks;
6use reth_node_builder::{
7    components::{PoolBuilder, TxPoolBuilder},
8    BuilderContext, FullNodeTypes, NodeTypes,
9};
10use reth_primitives_traits::NodePrimitives;
11use reth_transaction_pool::{
12    CoinbaseTipOrdering, EthTransactionPool, TransactionValidationTaskExecutor,
13};
14use tracing::{debug, info};
15
16/// Arbitrum transaction pool type alias.
17pub type ArbTransactionPool<Client, Evm> =
18    EthTransactionPool<Client, reth_transaction_pool::blobstore::DiskFileBlobStore, Evm>;
19
20/// Builder for the Arbitrum transaction pool.
21#[derive(Debug, Default, Clone, Copy)]
22pub struct ArbPoolBuilder;
23
24impl<Types, Node, Evm> PoolBuilder<Node, Evm> for ArbPoolBuilder
25where
26    Types: NodeTypes<
27        ChainSpec: EthereumHardforks,
28        Primitives: NodePrimitives<SignedTx = ArbTransactionSigned>,
29    >,
30    Node: FullNodeTypes<Types = Types>,
31    Evm: reth_evm::ConfigureEvm<Primitives = Types::Primitives> + Clone + 'static,
32{
33    type Pool = reth_transaction_pool::Pool<
34        TransactionValidationTaskExecutor<
35            reth_transaction_pool::EthTransactionValidator<
36                Node::Provider,
37                ArbPooledTransaction,
38                Evm,
39            >,
40        >,
41        CoinbaseTipOrdering<ArbPooledTransaction>,
42        reth_transaction_pool::blobstore::DiskFileBlobStore,
43    >;
44
45    async fn build_pool(
46        self,
47        ctx: &BuilderContext<Node>,
48        evm_config: Evm,
49    ) -> eyre::Result<Self::Pool> {
50        let pool_config = ctx.pool_config();
51
52        let blob_store = reth_node_builder::components::create_blob_store_with_cache(ctx, Some(0))?;
53
54        let validator =
55            TransactionValidationTaskExecutor::eth_builder(ctx.provider().clone(), evm_config)
56                .set_eip4844(false)
57                .with_max_tx_input_bytes(ctx.config().txpool.max_tx_input_bytes)
58                .with_local_transactions_config(pool_config.local_transactions_config.clone())
59                .set_tx_fee_cap(ctx.config().rpc.rpc_tx_fee_cap)
60                .with_max_tx_gas_limit(ctx.config().txpool.max_tx_gas_limit)
61                .with_minimum_priority_fee(ctx.config().txpool.minimum_priority_fee)
62                .with_additional_tasks(ctx.config().txpool.additional_validation_tasks)
63                .build_with_tasks(ctx.task_executor().clone(), blob_store.clone());
64
65        let transaction_pool = TxPoolBuilder::new(ctx)
66            .with_validator(validator)
67            .build_and_spawn_maintenance_task(blob_store, pool_config)?;
68
69        info!(target: "reth::cli", "Transaction pool initialized");
70        debug!(target: "reth::cli", "Spawned txpool maintenance task");
71
72        Ok(transaction_pool)
73    }
74}