1use alloy_rpc_types_engine::PayloadAttributes;
4use node::NodeTestContext;
5use reth_chainspec::ChainSpec;
6use reth_db::{test_utils::TempDatabase, DatabaseEnv};
7use reth_network_api::test_utils::PeersHandleProvider;
8use reth_node_builder::{
9 components::NodeComponentsBuilder,
10 rpc::{EngineValidatorAddOn, RethRpcAddOns},
11 FullNodeTypesAdapter, Node, NodeAdapter, NodeComponents, NodeTypes, NodeTypesWithDBAdapter,
12 PayloadTypes,
13};
14use reth_provider::providers::{BlockchainProvider, NodeTypesForProvider};
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>::PayloadAttributes
53 + Send
54 + Sync
55 + Copy
56 + 'static,
57) -> eyre::Result<(Vec<NodeHelperType<N>>, Wallet)>
58where
59 N: NodeBuilderHelper,
60{
61 E2ETestSetupBuilder::new(num_nodes, chain_spec, attributes_generator)
62 .with_node_config_modifier(move |config| config.set_dev(is_dev))
63 .build()
64 .await
65}
66
67pub async fn setup_engine<N>(
69 num_nodes: usize,
70 chain_spec: Arc<N::ChainSpec>,
71 is_dev: bool,
72 tree_config: reth_node_api::TreeConfig,
73 attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadAttributes
74 + Send
75 + Sync
76 + Copy
77 + 'static,
78) -> eyre::Result<(
79 Vec<NodeHelperType<N, BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>>>,
80 Wallet,
81)>
82where
83 N: NodeBuilderHelper,
84{
85 setup_engine_with_connection::<N>(
86 num_nodes,
87 chain_spec,
88 is_dev,
89 tree_config,
90 attributes_generator,
91 true,
92 )
93 .await
94}
95
96pub async fn setup_engine_with_connection<N>(
98 num_nodes: usize,
99 chain_spec: Arc<N::ChainSpec>,
100 is_dev: bool,
101 tree_config: reth_node_api::TreeConfig,
102 attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadAttributes
103 + Send
104 + Sync
105 + Copy
106 + 'static,
107 connect_nodes: bool,
108) -> eyre::Result<(
109 Vec<NodeHelperType<N, BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>>>,
110 Wallet,
111)>
112where
113 N: NodeBuilderHelper,
114{
115 E2ETestSetupBuilder::new(num_nodes, chain_spec, attributes_generator)
116 .with_tree_config_modifier(move |base| {
117 tree_config.clone().with_cross_block_cache_size(base.cross_block_cache_size())
119 })
120 .with_node_config_modifier(move |config| config.set_dev(is_dev))
121 .with_connect_nodes(connect_nodes)
122 .build()
123 .await
124}
125
126pub type TmpDB = Arc<TempDatabase<DatabaseEnv>>;
130type TmpNodeAdapter<N, Provider = BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>> =
131 FullNodeTypesAdapter<N, TmpDB, Provider>;
132
133pub type Adapter<N, Provider = BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>> = NodeAdapter<
135 TmpNodeAdapter<N, Provider>,
136 <<N as Node<TmpNodeAdapter<N, Provider>>>::ComponentsBuilder as NodeComponentsBuilder<
137 TmpNodeAdapter<N, Provider>,
138 >>::Components,
139>;
140
141pub type NodeHelperType<N, Provider = BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>> =
143 NodeTestContext<Adapter<N, Provider>, <N as Node<TmpNodeAdapter<N, Provider>>>::AddOns>;
144
145pub trait NodeBuilderHelper
147where
148 Self: Default
149 + NodeTypesForProvider<Payload: PayloadTypes<PayloadAttributes: From<PayloadAttributes>>>
150 + Node<
151 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
152 ComponentsBuilder: NodeComponentsBuilder<
153 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
154 Components: NodeComponents<
155 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
156 Network: PeersHandleProvider,
157 >,
158 >,
159 AddOns: RethRpcAddOns<
160 Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
161 > + EngineValidatorAddOn<
162 Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
163 >,
164 ChainSpec: From<ChainSpec> + Clone,
165 >,
166{
167}
168
169impl<T> NodeBuilderHelper for T where
170 Self: Default
171 + NodeTypesForProvider<Payload: PayloadTypes<PayloadAttributes: From<PayloadAttributes>>>
172 + Node<
173 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
174 ComponentsBuilder: NodeComponentsBuilder<
175 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
176 Components: NodeComponents<
177 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
178 Network: PeersHandleProvider,
179 >,
180 >,
181 AddOns: RethRpcAddOns<
182 Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
183 > + EngineValidatorAddOn<
184 Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
185 >,
186 ChainSpec: From<ChainSpec> + Clone,
187 >
188{
189}