reth_node_ethereum/
payload.rs

1//! Payload component configuration for the Ethereum node.
2
3use reth_chainspec::ChainSpec;
4use reth_ethereum_engine_primitives::{
5    EthBuiltPayload, EthPayloadAttributes, EthPayloadBuilderAttributes,
6};
7use reth_ethereum_payload_builder::EthereumBuilderConfig;
8use reth_ethereum_primitives::EthPrimitives;
9use reth_evm::ConfigureEvm;
10use reth_evm_ethereum::EthEvmConfig;
11use reth_node_api::{FullNodeTypes, NodeTypesWithEngine, PrimitivesTy, TxTy};
12use reth_node_builder::{
13    components::PayloadBuilderBuilder, BuilderContext, PayloadBuilderConfig, PayloadTypes,
14};
15use reth_transaction_pool::{PoolTransaction, TransactionPool};
16
17/// A basic ethereum payload service.
18#[derive(Clone, Default, Debug)]
19#[non_exhaustive]
20pub struct EthereumPayloadBuilder;
21
22impl EthereumPayloadBuilder {
23    /// A helper method initializing [`reth_ethereum_payload_builder::EthereumPayloadBuilder`] with
24    /// the given EVM config.
25    pub fn build<Types, Node, Evm, Pool>(
26        self,
27        evm_config: Evm,
28        ctx: &BuilderContext<Node>,
29        pool: Pool,
30    ) -> eyre::Result<
31        reth_ethereum_payload_builder::EthereumPayloadBuilder<Pool, Node::Provider, Evm>,
32    >
33    where
34        Types: NodeTypesWithEngine<ChainSpec = ChainSpec, Primitives = EthPrimitives>,
35        Node: FullNodeTypes<Types = Types>,
36        Evm: ConfigureEvm<Primitives = PrimitivesTy<Types>>,
37        Pool: TransactionPool<Transaction: PoolTransaction<Consensus = TxTy<Node::Types>>>
38            + Unpin
39            + 'static,
40        Types::Engine: PayloadTypes<
41            BuiltPayload = EthBuiltPayload,
42            PayloadAttributes = EthPayloadAttributes,
43            PayloadBuilderAttributes = EthPayloadBuilderAttributes,
44        >,
45    {
46        let conf = ctx.payload_builder_config();
47        Ok(reth_ethereum_payload_builder::EthereumPayloadBuilder::new(
48            ctx.provider().clone(),
49            pool,
50            evm_config,
51            EthereumBuilderConfig::new().with_gas_limit(conf.gas_limit()),
52        ))
53    }
54}
55
56impl<Types, Node, Pool> PayloadBuilderBuilder<Node, Pool> for EthereumPayloadBuilder
57where
58    Types: NodeTypesWithEngine<ChainSpec = ChainSpec, Primitives = EthPrimitives>,
59    Node: FullNodeTypes<Types = Types>,
60    Pool: TransactionPool<Transaction: PoolTransaction<Consensus = TxTy<Node::Types>>>
61        + Unpin
62        + 'static,
63    Types::Engine: PayloadTypes<
64        BuiltPayload = EthBuiltPayload,
65        PayloadAttributes = EthPayloadAttributes,
66        PayloadBuilderAttributes = EthPayloadBuilderAttributes,
67    >,
68{
69    type PayloadBuilder =
70        reth_ethereum_payload_builder::EthereumPayloadBuilder<Pool, Node::Provider, EthEvmConfig>;
71
72    async fn build_payload_builder(
73        self,
74        ctx: &BuilderContext<Node>,
75        pool: Pool,
76    ) -> eyre::Result<Self::PayloadBuilder> {
77        self.build(EthEvmConfig::new(ctx.chain_spec()), ctx, pool)
78    }
79}