1use alloy_rpc_client::RpcClient;
2use reth_db::DatabaseEnv;
3pub use reth_node_api::{FullNodeTypes, NodeTypes};
5
6use crate::{
7 components::NodeComponentsBuilder, rpc::RethRpcAddOns, NodeAdapter, NodeAddOns, NodeHandle,
8 RethFullAdapter,
9};
10use reth_node_api::{FullNodeComponents, PayloadTypes};
11use reth_node_core::{
12 dirs::{ChainPath, DataDirPath},
13 node_config::NodeConfig,
14};
15use reth_payload_builder::PayloadBuilderHandle;
16use reth_provider::ChainSpecProvider;
17use reth_rpc_builder::{auth::AuthServerHandle, RpcServerHandle};
18use reth_tasks::TaskExecutor;
19use std::{
20 fmt::Debug,
21 marker::PhantomData,
22 ops::{Deref, DerefMut},
23 sync::Arc,
24};
25
26pub type ComponentsFor<N> = <<<N as FullNodeTypes>::Types as Node<N>>::ComponentsBuilder as NodeComponentsBuilder<N>>::Components;
29
30pub trait Node<N: FullNodeTypes>: NodeTypes {
34 type ComponentsBuilder: NodeComponentsBuilder<N>;
36
37 type AddOns: NodeAddOns<
39 NodeAdapter<N, <Self::ComponentsBuilder as NodeComponentsBuilder<N>>::Components>,
40 >;
41
42 fn components_builder(&self) -> Self::ComponentsBuilder;
44
45 fn add_ons(&self) -> Self::AddOns;
47
48 fn disabled_stages() -> &'static [reth_stages::StageId] {
50 &[]
51 }
52}
53
54#[derive(Clone, Default, Debug)]
56pub struct AnyNode<N = (), C = (), AO = ()>(PhantomData<N>, C, AO);
57
58impl<N, C, AO> AnyNode<N, C, AO> {
59 pub fn types<T>(self) -> AnyNode<T, C, AO> {
61 AnyNode(PhantomData, self.1, self.2)
62 }
63
64 pub fn components_builder<T>(self, value: T) -> AnyNode<N, T, AO> {
66 AnyNode(PhantomData, value, self.2)
67 }
68
69 pub fn add_ons<T>(self, value: T) -> AnyNode<N, C, T> {
71 AnyNode(PhantomData, self.1, value)
72 }
73}
74
75impl<N, C, AO> NodeTypes for AnyNode<N, C, AO>
76where
77 N: FullNodeTypes,
78 C: Clone + Debug + Send + Sync + Unpin + 'static,
79 AO: Clone + Debug + Send + Sync + Unpin + 'static,
80{
81 type Primitives = <N::Types as NodeTypes>::Primitives;
82
83 type ChainSpec = <N::Types as NodeTypes>::ChainSpec;
84
85 type Storage = <N::Types as NodeTypes>::Storage;
86
87 type Payload = <N::Types as NodeTypes>::Payload;
88}
89
90impl<N, C, AO> Node<N> for AnyNode<N, C, AO>
91where
92 N: FullNodeTypes,
93 C: NodeComponentsBuilder<N> + Clone + Debug + Sync + Unpin + 'static,
94 AO: NodeAddOns<NodeAdapter<N, C::Components>> + Clone + Debug + Sync + Unpin + 'static,
95{
96 type ComponentsBuilder = C;
97 type AddOns = AO;
98
99 fn components_builder(&self) -> Self::ComponentsBuilder {
100 self.1.clone()
101 }
102
103 fn add_ons(&self) -> Self::AddOns {
104 self.2.clone()
105 }
106}
107
108#[derive(Debug)]
112pub struct FullNode<Node: FullNodeComponents, AddOns: NodeAddOns<Node>> {
113 pub evm_config: Node::Evm,
115 pub pool: Node::Pool,
117 pub network: Node::Network,
119 pub provider: Node::Provider,
121 pub payload_builder_handle: PayloadBuilderHandle<<Node::Types as NodeTypes>::Payload>,
123 pub task_executor: TaskExecutor,
125 pub config: NodeConfig<<Node::Types as NodeTypes>::ChainSpec>,
127 pub data_dir: ChainPath<DataDirPath>,
129 pub add_ons_handle: AddOns::Handle,
131}
132
133impl<Node: FullNodeComponents, AddOns: NodeAddOns<Node>> Clone for FullNode<Node, AddOns> {
134 fn clone(&self) -> Self {
135 Self {
136 evm_config: self.evm_config.clone(),
137 pool: self.pool.clone(),
138 network: self.network.clone(),
139 provider: self.provider.clone(),
140 payload_builder_handle: self.payload_builder_handle.clone(),
141 task_executor: self.task_executor.clone(),
142 config: self.config.clone(),
143 data_dir: self.data_dir.clone(),
144 add_ons_handle: self.add_ons_handle.clone(),
145 }
146 }
147}
148
149impl<Payload, Node, AddOns> FullNode<Node, AddOns>
150where
151 Payload: PayloadTypes,
152 Node: FullNodeComponents<Types: NodeTypes<Payload = Payload>>,
153 AddOns: NodeAddOns<Node>,
154{
155 pub fn chain_spec(&self) -> Arc<<Node::Types as NodeTypes>::ChainSpec> {
157 self.provider.chain_spec()
158 }
159}
160
161impl<Payload, Node, AddOns> FullNode<Node, AddOns>
162where
163 Payload: PayloadTypes,
164 Node: FullNodeComponents<Types: NodeTypes<Payload = Payload>>,
165 AddOns: RethRpcAddOns<Node>,
166{
167 pub const fn rpc_server_handle(&self) -> &RpcServerHandle {
169 &self.add_ons_handle.rpc_server_handles.rpc
170 }
171
172 pub const fn auth_server_handle(&self) -> &AuthServerHandle {
174 &self.add_ons_handle.rpc_server_handles.auth
175 }
176}
177
178impl<Node, AddOns> FullNode<Node, AddOns>
179where
180 Node: FullNodeComponents,
181 AddOns: RethRpcAddOns<Node>,
182{
183 pub fn engine_http_client(&self) -> RpcClient {
187 self.auth_server_handle().http_client()
188 }
189
190 pub async fn engine_ws_client(&self) -> RpcClient {
194 self.auth_server_handle().ws_client().await
195 }
196
197 #[cfg(unix)]
201 pub async fn engine_ipc_client(&self) -> Option<RpcClient> {
202 self.auth_server_handle().ipc_client().await
203 }
204}
205
206impl<Node: FullNodeComponents, AddOns: NodeAddOns<Node>> Deref for FullNode<Node, AddOns> {
207 type Target = AddOns::Handle;
208
209 fn deref(&self) -> &Self::Target {
210 &self.add_ons_handle
211 }
212}
213
214impl<Node: FullNodeComponents, AddOns: NodeAddOns<Node>> DerefMut for FullNode<Node, AddOns> {
215 fn deref_mut(&mut self) -> &mut Self::Target {
216 &mut self.add_ons_handle
217 }
218}
219
220pub type FullNodeFor<N, DB = DatabaseEnv> =
222 FullNode<NodeAdapter<RethFullAdapter<DB, N>>, <N as Node<RethFullAdapter<DB, N>>>::AddOns>;
223
224pub type NodeHandleFor<N, DB = DatabaseEnv> =
226 NodeHandle<NodeAdapter<RethFullAdapter<DB, N>>, <N as Node<RethFullAdapter<DB, N>>>::AddOns>;