//! Payload component configuration for the Ethereum node. use reth_basic_payload_builder::{BasicPayloadJobGenerator, BasicPayloadJobGeneratorConfig}; use reth_chainspec::ChainSpec; use reth_ethereum_engine_primitives::{ EthBuiltPayload, EthPayloadAttributes, EthPayloadBuilderAttributes, }; use reth_ethereum_payload_builder::EthereumBuilderConfig; use reth_ethereum_primitives::EthPrimitives; use reth_evm::ConfigureEvmFor; use reth_evm_ethereum::EthEvmConfig; use reth_node_api::{FullNodeTypes, NodeTypesWithEngine, PrimitivesTy, TxTy}; use reth_node_builder::{ components::PayloadServiceBuilder, BuilderContext, PayloadBuilderConfig, PayloadTypes, }; use reth_payload_builder::{PayloadBuilderHandle, PayloadBuilderService}; use reth_provider::CanonStateSubscriptions; use reth_transaction_pool::{PoolTransaction, TransactionPool}; /// A basic ethereum payload service. #[derive(Clone, Default, Debug)] #[non_exhaustive] pub struct EthereumPayloadBuilder; impl EthereumPayloadBuilder { /// A helper method initializing [`PayloadBuilderService`] with the given EVM config. pub fn spawn( self, evm_config: Evm, ctx: &BuilderContext, pool: Pool, ) -> eyre::Result> where Types: NodeTypesWithEngine, Node: FullNodeTypes, Evm: ConfigureEvmFor>, Pool: TransactionPool>> + Unpin + 'static, Types::Engine: PayloadTypes< BuiltPayload = EthBuiltPayload, PayloadAttributes = EthPayloadAttributes, PayloadBuilderAttributes = EthPayloadBuilderAttributes, >, { let conf = ctx.payload_builder_config(); let payload_builder = reth_ethereum_payload_builder::EthereumPayloadBuilder::new( evm_config, EthereumBuilderConfig::new(conf.extra_data_bytes()).with_gas_limit(conf.gas_limit()), ); let payload_job_config = BasicPayloadJobGeneratorConfig::default() .interval(conf.interval()) .deadline(conf.deadline()) .max_payload_tasks(conf.max_payload_tasks()); let payload_generator = BasicPayloadJobGenerator::with_builder( ctx.provider().clone(), pool, ctx.task_executor().clone(), payload_job_config, payload_builder, ); let (payload_service, payload_builder) = PayloadBuilderService::new(payload_generator, ctx.provider().canonical_state_stream()); ctx.task_executor().spawn_critical("payload builder service", Box::pin(payload_service)); Ok(payload_builder) } } impl PayloadServiceBuilder for EthereumPayloadBuilder where Types: NodeTypesWithEngine, Node: FullNodeTypes, Pool: TransactionPool>> + Unpin + 'static, Types::Engine: PayloadTypes< BuiltPayload = EthBuiltPayload, PayloadAttributes = EthPayloadAttributes, PayloadBuilderAttributes = EthPayloadBuilderAttributes, >, { async fn spawn_payload_service( self, ctx: &BuilderContext, pool: Pool, ) -> eyre::Result> { self.spawn(EthEvmConfig::new(ctx.chain_spec()), ctx, pool) } }