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 std::sync::Arc;
15use wallet::Wallet;
16
17pub mod node;
19pub mod testsuite;
20
21pub mod transaction;
23
24pub mod wallet;
26
27mod payload;
29
30pub mod setup_import;
32
33mod network;
35
36mod rpc;
38
39pub mod test_rlp_utils;
41
42mod setup_builder;
44pub use setup_builder::E2ETestSetupBuilder;
45
46pub async fn setup<N>(
48 num_nodes: usize,
49 chain_spec: Arc<N::ChainSpec>,
50 is_dev: bool,
51 attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadBuilderAttributes + Send + Sync + Copy + 'static,
52) -> eyre::Result<(Vec<NodeHelperType<N>>, Wallet)>
53where
54 N: NodeBuilderHelper,
55{
56 E2ETestSetupBuilder::new(num_nodes, chain_spec, attributes_generator)
57 .with_node_config_modifier(move |config| config.set_dev(is_dev))
58 .build()
59 .await
60}
61
62pub async fn setup_engine<N>(
64 num_nodes: usize,
65 chain_spec: Arc<N::ChainSpec>,
66 is_dev: bool,
67 tree_config: reth_node_api::TreeConfig,
68 attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadBuilderAttributes + Send + Sync + Copy + 'static,
69) -> eyre::Result<(
70 Vec<NodeHelperType<N, BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>>>,
71 Wallet,
72)>
73where
74 N: NodeBuilderHelper,
75{
76 setup_engine_with_connection::<N>(
77 num_nodes,
78 chain_spec,
79 is_dev,
80 tree_config,
81 attributes_generator,
82 true,
83 )
84 .await
85}
86
87pub async fn setup_engine_with_connection<N>(
89 num_nodes: usize,
90 chain_spec: Arc<N::ChainSpec>,
91 is_dev: bool,
92 tree_config: reth_node_api::TreeConfig,
93 attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadBuilderAttributes + Send + Sync + Copy + 'static,
94 connect_nodes: bool,
95) -> eyre::Result<(
96 Vec<NodeHelperType<N, BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>>>,
97 Wallet,
98)>
99where
100 N: NodeBuilderHelper,
101{
102 E2ETestSetupBuilder::new(num_nodes, chain_spec, attributes_generator)
103 .with_tree_config_modifier(move |base| {
104 tree_config.clone().with_cross_block_cache_size(base.cross_block_cache_size())
106 })
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}