1use node::NodeTestContext;
4use reth_chainspec::ChainSpec;
5use reth_db::{test_utils::TempDatabase, DatabaseEnv};
6use reth_network_api::test_utils::PeersHandleProvider;
7use reth_node_builder::{
8 components::NodeComponentsBuilder,
9 rpc::{EngineValidatorAddOn, RethRpcAddOns},
10 FullNodeTypesAdapter, Node, NodeAdapter, NodeComponents, NodeTypes, NodeTypesWithDBAdapter,
11 PayloadTypes,
12};
13use reth_provider::providers::{BlockchainProvider, NodeTypesForProvider};
14use reth_tasks::TaskManager;
15use std::sync::Arc;
16use wallet::Wallet;
17
18pub mod node;
20pub mod testsuite;
21
22pub mod transaction;
24
25pub mod wallet;
27
28mod payload;
30
31pub mod setup_import;
33
34mod network;
36
37mod rpc;
39
40pub mod test_rlp_utils;
42
43mod setup_builder;
45pub use setup_builder::E2ETestSetupBuilder;
46
47pub async fn setup<N>(
49 num_nodes: usize,
50 chain_spec: Arc<N::ChainSpec>,
51 is_dev: bool,
52 attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadBuilderAttributes + Send + Sync + Copy + 'static,
53) -> eyre::Result<(Vec<NodeHelperType<N>>, TaskManager, Wallet)>
54where
55 N: NodeBuilderHelper,
56{
57 E2ETestSetupBuilder::new(num_nodes, chain_spec, attributes_generator)
58 .with_node_config_modifier(move |config| config.set_dev(is_dev))
59 .build()
60 .await
61}
62
63pub async fn setup_engine<N>(
65 num_nodes: usize,
66 chain_spec: Arc<N::ChainSpec>,
67 is_dev: bool,
68 tree_config: reth_node_api::TreeConfig,
69 attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadBuilderAttributes + Send + Sync + Copy + 'static,
70) -> eyre::Result<(
71 Vec<NodeHelperType<N, BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>>>,
72 TaskManager,
73 Wallet,
74)>
75where
76 N: NodeBuilderHelper,
77{
78 setup_engine_with_connection::<N>(
79 num_nodes,
80 chain_spec,
81 is_dev,
82 tree_config,
83 attributes_generator,
84 true,
85 )
86 .await
87}
88
89pub async fn setup_engine_with_connection<N>(
91 num_nodes: usize,
92 chain_spec: Arc<N::ChainSpec>,
93 is_dev: bool,
94 tree_config: reth_node_api::TreeConfig,
95 attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadBuilderAttributes + Send + Sync + Copy + 'static,
96 connect_nodes: bool,
97) -> eyre::Result<(
98 Vec<NodeHelperType<N, BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>>>,
99 TaskManager,
100 Wallet,
101)>
102where
103 N: NodeBuilderHelper,
104{
105 E2ETestSetupBuilder::new(num_nodes, chain_spec, attributes_generator)
106 .with_tree_config_modifier(move |_| tree_config.clone())
107 .with_node_config_modifier(move |config| config.set_dev(is_dev))
108 .with_connect_nodes(connect_nodes)
109 .build()
110 .await
111}
112
113pub type TmpDB = Arc<TempDatabase<DatabaseEnv>>;
117type TmpNodeAdapter<N, Provider = BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>> =
118 FullNodeTypesAdapter<N, TmpDB, Provider>;
119
120pub type Adapter<N, Provider = BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>> = NodeAdapter<
122 TmpNodeAdapter<N, Provider>,
123 <<N as Node<TmpNodeAdapter<N, Provider>>>::ComponentsBuilder as NodeComponentsBuilder<
124 TmpNodeAdapter<N, Provider>,
125 >>::Components,
126>;
127
128pub type NodeHelperType<N, Provider = BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>> =
130 NodeTestContext<Adapter<N, Provider>, <N as Node<TmpNodeAdapter<N, Provider>>>::AddOns>;
131
132pub trait NodeBuilderHelper
134where
135 Self: Default
136 + NodeTypesForProvider<
137 Payload: PayloadTypes<
138 PayloadBuilderAttributes: From<reth_payload_builder::EthPayloadBuilderAttributes>,
139 >,
140 > + Node<
141 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
142 ComponentsBuilder: NodeComponentsBuilder<
143 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
144 Components: NodeComponents<
145 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
146 Network: PeersHandleProvider,
147 >,
148 >,
149 AddOns: RethRpcAddOns<
150 Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
151 > + EngineValidatorAddOn<
152 Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
153 >,
154 ChainSpec: From<ChainSpec> + Clone,
155 >,
156{
157}
158
159impl<T> NodeBuilderHelper for T where
160 Self: Default
161 + NodeTypesForProvider<
162 Payload: PayloadTypes<
163 PayloadBuilderAttributes: From<reth_payload_builder::EthPayloadBuilderAttributes>,
164 >,
165 > + Node<
166 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
167 ComponentsBuilder: NodeComponentsBuilder<
168 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
169 Components: NodeComponents<
170 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
171 Network: PeersHandleProvider,
172 >,
173 >,
174 AddOns: RethRpcAddOns<
175 Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
176 > + EngineValidatorAddOn<
177 Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
178 >,
179 ChainSpec: From<ChainSpec> + Clone,
180 >
181{
182}