1use reth_db::DatabaseEnv;
2pub use reth_node_api::{FullNodeTypes, NodeTypes};
4
5use crate::{
6 components::NodeComponentsBuilder, rpc::RethRpcAddOns, NodeAdapter, NodeAddOns, NodeHandle,
7 RethFullAdapter,
8};
9use reth_node_api::{EngineTypes, FullNodeComponents, PayloadTypes};
10use reth_node_core::{
11 dirs::{ChainPath, DataDirPath},
12 node_config::NodeConfig,
13};
14use reth_payload_builder::PayloadBuilderHandle;
15use reth_provider::ChainSpecProvider;
16use reth_rpc_api::EngineApiClient;
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 + Clone {
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
49#[derive(Clone, Default, Debug)]
51pub struct AnyNode<N = (), C = (), AO = ()>(PhantomData<N>, C, AO);
52
53impl<N, C, AO> AnyNode<N, C, AO> {
54 pub fn types<T>(self) -> AnyNode<T, C, AO> {
56 AnyNode(PhantomData, self.1, self.2)
57 }
58
59 pub fn components_builder<T>(self, value: T) -> AnyNode<N, T, AO> {
61 AnyNode(PhantomData, value, self.2)
62 }
63
64 pub fn add_ons<T>(self, value: T) -> AnyNode<N, C, T> {
66 AnyNode(PhantomData, self.1, value)
67 }
68}
69
70impl<N, C, AO> NodeTypes for AnyNode<N, C, AO>
71where
72 N: FullNodeTypes,
73 C: Clone + Debug + Send + Sync + Unpin + 'static,
74 AO: Clone + Debug + Send + Sync + Unpin + 'static,
75{
76 type Primitives = <N::Types as NodeTypes>::Primitives;
77
78 type ChainSpec = <N::Types as NodeTypes>::ChainSpec;
79
80 type Storage = <N::Types as NodeTypes>::Storage;
81
82 type Payload = <N::Types as NodeTypes>::Payload;
83}
84
85impl<N, C, AO> Node<N> for AnyNode<N, C, AO>
86where
87 N: FullNodeTypes + Clone,
88 C: NodeComponentsBuilder<N> + Clone + Debug + Sync + Unpin + 'static,
89 AO: NodeAddOns<NodeAdapter<N, C::Components>> + Clone + Debug + Sync + Unpin + 'static,
90{
91 type ComponentsBuilder = C;
92 type AddOns = AO;
93
94 fn components_builder(&self) -> Self::ComponentsBuilder {
95 self.1.clone()
96 }
97
98 fn add_ons(&self) -> Self::AddOns {
99 self.2.clone()
100 }
101}
102
103#[derive(Debug)]
107pub struct FullNode<Node: FullNodeComponents, AddOns: NodeAddOns<Node>> {
108 pub evm_config: Node::Evm,
110 pub pool: Node::Pool,
112 pub network: Node::Network,
114 pub provider: Node::Provider,
116 pub payload_builder_handle: PayloadBuilderHandle<<Node::Types as NodeTypes>::Payload>,
118 pub task_executor: TaskExecutor,
120 pub config: NodeConfig<<Node::Types as NodeTypes>::ChainSpec>,
122 pub data_dir: ChainPath<DataDirPath>,
124 pub add_ons_handle: AddOns::Handle,
126}
127
128impl<Node: FullNodeComponents, AddOns: NodeAddOns<Node>> Clone for FullNode<Node, AddOns> {
129 fn clone(&self) -> Self {
130 Self {
131 evm_config: self.evm_config.clone(),
132 pool: self.pool.clone(),
133 network: self.network.clone(),
134 provider: self.provider.clone(),
135 payload_builder_handle: self.payload_builder_handle.clone(),
136 task_executor: self.task_executor.clone(),
137 config: self.config.clone(),
138 data_dir: self.data_dir.clone(),
139 add_ons_handle: self.add_ons_handle.clone(),
140 }
141 }
142}
143
144impl<Payload, Node, AddOns> FullNode<Node, AddOns>
145where
146 Payload: PayloadTypes,
147 Node: FullNodeComponents<Types: NodeTypes<Payload = Payload>>,
148 AddOns: NodeAddOns<Node>,
149{
150 pub fn chain_spec(&self) -> Arc<<Node::Types as NodeTypes>::ChainSpec> {
152 self.provider.chain_spec()
153 }
154}
155
156impl<Payload, Node, AddOns> FullNode<Node, AddOns>
157where
158 Payload: PayloadTypes,
159 Node: FullNodeComponents<Types: NodeTypes<Payload = Payload>>,
160 AddOns: RethRpcAddOns<Node>,
161{
162 pub const fn rpc_server_handle(&self) -> &RpcServerHandle {
164 &self.add_ons_handle.rpc_server_handles.rpc
165 }
166
167 pub const fn auth_server_handle(&self) -> &AuthServerHandle {
169 &self.add_ons_handle.rpc_server_handles.auth
170 }
171}
172
173impl<Engine, Node, AddOns> FullNode<Node, AddOns>
174where
175 Engine: EngineTypes,
176 Node: FullNodeComponents<Types: NodeTypes<Payload = Engine>>,
177 AddOns: RethRpcAddOns<Node>,
178{
179 pub fn engine_http_client(&self) -> impl EngineApiClient<Engine> {
183 self.auth_server_handle().http_client()
184 }
185
186 pub async fn engine_ws_client(&self) -> impl EngineApiClient<Engine> {
190 self.auth_server_handle().ws_client().await
191 }
192
193 #[cfg(unix)]
197 pub async fn engine_ipc_client(&self) -> Option<impl EngineApiClient<Engine>> {
198 self.auth_server_handle().ipc_client().await
199 }
200}
201
202impl<Node: FullNodeComponents, AddOns: NodeAddOns<Node>> Deref for FullNode<Node, AddOns> {
203 type Target = AddOns::Handle;
204
205 fn deref(&self) -> &Self::Target {
206 &self.add_ons_handle
207 }
208}
209
210impl<Node: FullNodeComponents, AddOns: NodeAddOns<Node>> DerefMut for FullNode<Node, AddOns> {
211 fn deref_mut(&mut self) -> &mut Self::Target {
212 &mut self.add_ons_handle
213 }
214}
215
216pub type FullNodeFor<N, DB = Arc<DatabaseEnv>> =
218 FullNode<NodeAdapter<RethFullAdapter<DB, N>>, <N as Node<RethFullAdapter<DB, N>>>::AddOns>;
219
220pub type NodeHandleFor<N, DB = Arc<DatabaseEnv>> =
222 NodeHandle<NodeAdapter<RethFullAdapter<DB, N>>, <N as Node<RethFullAdapter<DB, N>>>::AddOns>;