1use crate::{
8 backfill::PipelineSync,
9 chain::ChainOrchestrator,
10 download::BasicBlockDownloader,
11 engine::{EngineApiKind, EngineApiRequest, EngineApiRequestHandler, EngineHandler},
12 persistence::PersistenceHandle,
13 tree::{EngineApiTreeHandler, EngineValidator, TreeConfig, WaitForCaches},
14};
15use futures::Stream;
16use reth_consensus::FullConsensus;
17use reth_engine_primitives::BeaconEngineMessage;
18use reth_evm::ConfigureEvm;
19use reth_network_p2p::{BlockAccessListsClient, BlockClient};
20use reth_payload_builder::PayloadBuilderHandle;
21use reth_primitives_traits::NodePrimitives;
22use reth_provider::{
23 providers::{BlockchainProvider, ProviderNodeTypes},
24 ProviderFactory,
25};
26use reth_prune::PrunerWithFactory;
27use reth_stages_api::{MetricEventsSender, Pipeline};
28use reth_storage_overlay::OverlayManager;
29use reth_tasks::Runtime;
30use std::sync::Arc;
31
32pub type EngineOrchestrator<T, N, Client, S, B> = ChainOrchestrator<
34 EngineHandler<
35 EngineApiRequestHandler<EngineApiRequest<T, N>, N>,
36 S,
37 BasicBlockDownloader<Client, <N as NodePrimitives>::Block>,
38 >,
39 B,
40>;
41
42#[derive(Debug)]
61pub struct EngineOrchestratorBuilder<N, Client, S, V, C>
62where
63 N: ProviderNodeTypes,
64{
65 pub engine_kind: EngineApiKind,
67 pub consensus: Arc<dyn FullConsensus<N::Primitives>>,
69 pub client: Client,
71 pub incoming_requests: S,
73 pub pipeline: Pipeline<N>,
75 pub pipeline_task_spawner: Runtime,
77 pub provider: ProviderFactory<N>,
79 pub blockchain_db: BlockchainProvider<N>,
81 pub pruner: PrunerWithFactory<ProviderFactory<N>>,
83 pub payload_builder: PayloadBuilderHandle<N::Payload>,
85 pub payload_validator: V,
87 pub overlay_manager: OverlayManager<N::Primitives>,
89 pub tree_config: TreeConfig,
91 pub sync_metrics_tx: MetricEventsSender,
93 pub evm_config: C,
95 pub runtime: Runtime,
97}
98
99impl<N, Client, S, V, C> EngineOrchestratorBuilder<N, Client, S, V, C>
100where
101 N: ProviderNodeTypes,
102 Client: BlockClient<Block = <N::Primitives as NodePrimitives>::Block>
103 + BlockAccessListsClient
104 + 'static,
105 S: Stream<Item = BeaconEngineMessage<N::Payload>> + Send + Sync + Unpin + 'static,
106 V: EngineValidator<N::Payload> + WaitForCaches,
107 C: ConfigureEvm<Primitives = N::Primitives> + 'static,
108{
109 pub fn build(
111 self,
112 ) -> EngineOrchestrator<N::Payload, N::Primitives, Client, S, PipelineSync<N>> {
113 let Self {
114 engine_kind,
115 consensus,
116 client,
117 incoming_requests,
118 pipeline,
119 pipeline_task_spawner,
120 provider,
121 blockchain_db,
122 pruner,
123 payload_builder,
124 payload_validator,
125 overlay_manager,
126 tree_config,
127 sync_metrics_tx,
128 evm_config,
129 runtime,
130 } = self;
131
132 let downloader = BasicBlockDownloader::new(client, consensus.clone());
133
134 let persistence_handle =
135 PersistenceHandle::<N::Primitives>::spawn_service(provider, pruner, sync_metrics_tx);
136
137 let canonical_in_memory_state = blockchain_db.canonical_in_memory_state();
138
139 let (to_tree_tx, from_tree) = EngineApiTreeHandler::spawn_new(
140 blockchain_db,
141 consensus,
142 payload_validator,
143 persistence_handle,
144 payload_builder,
145 canonical_in_memory_state,
146 overlay_manager,
147 tree_config,
148 engine_kind,
149 evm_config,
150 runtime,
151 );
152
153 let engine_handler = EngineApiRequestHandler::new(to_tree_tx, from_tree);
154 let handler = EngineHandler::new(engine_handler, downloader, incoming_requests);
155
156 let backfill_sync = PipelineSync::new(pipeline, pipeline_task_spawner);
157
158 ChainOrchestrator::new(handler, backfill_sync)
159 }
160}