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