@@ -8,16 +8,18 @@ use crate::{
88 provider:: { curl_transport:: CurlTransport , runtime_transport:: RuntimeTransportBuilder } ,
99} ;
1010use alloy_chains:: NamedChain ;
11+ use alloy_network:: { Network , NetworkWallet } ;
1112use 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} ;
1617use alloy_rpc_client:: ClientBuilder ;
1718use alloy_transport:: { layers:: RetryBackoffLayer , utils:: guess_local_url} ;
1819use eyre:: { Result , WrapErr } ;
1920use reqwest:: Url ;
2021use 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;
3638pub 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