Skip to content

Commit 2b85d1f

Browse files
authored
refactor(common): make ProviderBuilder generic over Network (#13250)
* refactor(common): make `ProviderBuilder` generic over `Network` - Updated `ProviderBuilder` helper to be generic, which will facilate `FoundryNetwork` rollout - Adjusted the instantiation of `ProviderBuilder` in various locations to use `AnyNetwork`. - Enhanced the `build` and `build_with_wallet` methods to accommodate the new generic structure. * fix: relax trait bound on `N::TransactionRequest` * fix: comment * fix: comment
1 parent 6939eda commit 2b85d1f

File tree

2 files changed

+35
-29
lines changed

2 files changed

+35
-29
lines changed

crates/cheatcodes/src/evm/fork.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::{
33
json::json_value_to_token,
44
};
55
use alloy_dyn_abi::DynSolValue;
6+
use alloy_network::AnyNetwork;
67
use alloy_primitives::{B256, U256};
78
use alloy_provider::Provider;
89
use alloy_rpc_types::Filter;
@@ -238,7 +239,7 @@ impl Cheatcode for eth_getLogsCall {
238239
.database
239240
.active_fork_url()
240241
.ok_or_else(|| fmt_err!("no active fork URL found"))?;
241-
let provider = ProviderBuilder::new(&url).build()?;
242+
let provider = ProviderBuilder::<AnyNetwork>::new(&url).build()?;
242243
let mut filter = Filter::new().address(*target).from_block(from_block).to_block(to_block);
243244
for (i, &topic) in topics.iter().enumerate() {
244245
filter.topics[i] = topic.into();
@@ -275,7 +276,7 @@ impl Cheatcode for getRawBlockHeaderCall {
275276
.database
276277
.active_fork_url()
277278
.ok_or_else(|| fmt_err!("no active fork"))?;
278-
let provider = ProviderBuilder::new(&url).build()?;
279+
let provider = ProviderBuilder::<AnyNetwork>::new(&url).build()?;
279280
let block_number = u64::try_from(blockNumber)
280281
.map_err(|_| fmt_err!("block number must be less than 2^64"))?;
281282
let block =
@@ -397,7 +398,7 @@ fn persist_caller(ccx: &mut CheatsCtxt) {
397398

398399
/// Performs an Ethereum JSON-RPC request to the given endpoint.
399400
fn rpc_call(url: &str, method: &str, params: &str) -> Result {
400-
let provider = ProviderBuilder::new(url).build()?;
401+
let provider = ProviderBuilder::<AnyNetwork>::new(url).build()?;
401402
let params_json: serde_json::Value = serde_json::from_str(params)?;
402403
let result =
403404
foundry_common::block_on(provider.raw_request(method.to_string().into(), params_json))

crates/common/src/provider/mod.rs

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,18 @@ use crate::{
88
provider::{curl_transport::CurlTransport, runtime_transport::RuntimeTransportBuilder},
99
};
1010
use alloy_chains::NamedChain;
11+
use alloy_network::{Network, NetworkWallet};
1112
use alloy_provider::{
1213
Identity, ProviderBuilder as AlloyProviderBuilder, RootProvider,
13-
fillers::{ChainIdFiller, FillProvider, GasFiller, JoinFill, NonceFiller, WalletFiller},
14+
fillers::{FillProvider, JoinFill, RecommendedFillers, WalletFiller},
1415
network::{AnyNetwork, EthereumWallet},
1516
};
1617
use alloy_rpc_client::ClientBuilder;
1718
use alloy_transport::{layers::RetryBackoffLayer, utils::guess_local_url};
1819
use eyre::{Result, WrapErr};
1920
use reqwest::Url;
2021
use std::{
22+
marker::PhantomData,
2123
net::SocketAddr,
2224
path::{Path, PathBuf},
2325
str::FromStr,
@@ -36,20 +38,8 @@ const POLL_INTERVAL_BLOCK_TIME_SCALE_FACTOR: f32 = 0.6;
3638
pub type RetryProvider<N = AnyNetwork> = RootProvider<N>;
3739

3840
/// Helper type alias for a retry provider with a signer
39-
pub type RetryProviderWithSigner<N = AnyNetwork> = FillProvider<
40-
JoinFill<
41-
JoinFill<
42-
Identity,
43-
JoinFill<
44-
GasFiller,
45-
JoinFill<
46-
alloy_provider::fillers::BlobGasFiller,
47-
JoinFill<NonceFiller, ChainIdFiller>,
48-
>,
49-
>,
50-
>,
51-
WalletFiller<EthereumWallet>,
52-
>,
41+
pub type RetryProviderWithSigner<N = AnyNetwork, W = EthereumWallet> = FillProvider<
42+
JoinFill<JoinFill<Identity, <N as RecommendedFillers>::RecommendedFillers>, WalletFiller<W>>,
5343
RootProvider<N>,
5444
N,
5545
>;
@@ -84,8 +74,10 @@ pub fn try_get_http_provider(builder: impl AsRef<str>) -> Result<RetryProvider>
8474
}
8575

8676
/// Helper type to construct a `RetryProvider`
77+
///
78+
/// This builder is generic over the network type `N`, defaulting to `AnyNetwork`.
8779
#[derive(Debug)]
88-
pub struct ProviderBuilder {
80+
pub struct ProviderBuilder<N: Network = AnyNetwork> {
8981
// Note: this is a result, so we can easily chain builder calls
9082
url: Result<Url>,
9183
chain: NamedChain,
@@ -104,10 +96,12 @@ pub struct ProviderBuilder {
10496
no_proxy: bool,
10597
/// Whether to output curl commands instead of making requests.
10698
curl_mode: bool,
99+
/// Phantom data for the network type.
100+
_network: PhantomData<N>,
107101
}
108102

109-
impl ProviderBuilder {
110-
/// Creates a new builder instance
103+
impl<N: Network> ProviderBuilder<N> {
104+
/// Creates a new ProviderBuilder helper instance.
111105
pub fn new(url_str: &str) -> Self {
112106
// a copy is needed for the next lines to work
113107
let mut url_str = url_str;
@@ -156,6 +150,7 @@ impl ProviderBuilder {
156150
accept_invalid_certs: false,
157151
no_proxy: false,
158152
curl_mode: false,
153+
_network: PhantomData,
159154
}
160155
}
161156

@@ -278,7 +273,7 @@ impl ProviderBuilder {
278273
}
279274

280275
/// Constructs the `RetryProvider` taking all configs into account.
281-
pub fn build(self) -> Result<RetryProvider> {
276+
pub fn build(self) -> Result<RetryProvider<N>> {
282277
let Self {
283278
url,
284279
chain,
@@ -292,6 +287,7 @@ impl ProviderBuilder {
292287
accept_invalid_certs,
293288
no_proxy,
294289
curl_mode,
290+
..
295291
} = self;
296292
let url = url?;
297293

@@ -303,7 +299,7 @@ impl ProviderBuilder {
303299
let transport = CurlTransport::new(url).with_headers(headers).with_jwt(jwt);
304300
let client = ClientBuilder::default().layer(retry_layer).transport(transport, is_local);
305301

306-
let provider = AlloyProviderBuilder::<_, _, AnyNetwork>::default()
302+
let provider = AlloyProviderBuilder::<_, _, N>::default()
307303
.connect_provider(RootProvider::new(client));
308304

309305
return Ok(provider);
@@ -330,14 +326,22 @@ impl ProviderBuilder {
330326
);
331327
}
332328

333-
let provider = AlloyProviderBuilder::<_, _, AnyNetwork>::default()
334-
.connect_provider(RootProvider::new(client));
329+
let provider =
330+
AlloyProviderBuilder::<_, _, N>::default().connect_provider(RootProvider::new(client));
335331

336332
Ok(provider)
337333
}
334+
}
338335

336+
impl<N: Network> ProviderBuilder<N> {
339337
/// Constructs the `RetryProvider` with a wallet.
340-
pub fn build_with_wallet(self, wallet: EthereumWallet) -> Result<RetryProviderWithSigner> {
338+
pub fn build_with_wallet<W: NetworkWallet<N> + Clone>(
339+
self,
340+
wallet: W,
341+
) -> Result<RetryProviderWithSigner<N, W>>
342+
where
343+
N: RecommendedFillers,
344+
{
341345
let Self {
342346
url,
343347
chain,
@@ -351,6 +355,7 @@ impl ProviderBuilder {
351355
accept_invalid_certs,
352356
no_proxy,
353357
curl_mode,
358+
..
354359
} = self;
355360
let url = url?;
356361

@@ -362,7 +367,7 @@ impl ProviderBuilder {
362367
let transport = CurlTransport::new(url).with_headers(headers).with_jwt(jwt);
363368
let client = ClientBuilder::default().layer(retry_layer).transport(transport, is_local);
364369

365-
let provider = AlloyProviderBuilder::<_, _, AnyNetwork>::default()
370+
let provider = AlloyProviderBuilder::<_, _, N>::default()
366371
.with_recommended_fillers()
367372
.wallet(wallet)
368373
.connect_provider(RootProvider::new(client));
@@ -392,7 +397,7 @@ impl ProviderBuilder {
392397
);
393398
}
394399

395-
let provider = AlloyProviderBuilder::<_, _, AnyNetwork>::default()
400+
let provider = AlloyProviderBuilder::<_, _, N>::default()
396401
.with_recommended_fillers()
397402
.wallet(wallet)
398403
.connect_provider(RootProvider::new(client));
@@ -426,7 +431,7 @@ mod tests {
426431

427432
#[test]
428433
fn can_auto_correct_missing_prefix() {
429-
let builder = ProviderBuilder::new("localhost:8545");
434+
let builder = ProviderBuilder::<AnyNetwork>::new("localhost:8545");
430435
assert!(builder.url.is_ok());
431436

432437
let url = builder.url.unwrap();

0 commit comments

Comments
 (0)