55 "crypto/ecdsa"
66 verr "errors"
77 "fmt"
8+ "github.com/ethereum/go-ethereum/rpc"
89 "math/big"
10+ "net/http"
911 "path/filepath"
1012 "strconv"
1113 "strings"
@@ -133,7 +135,7 @@ func NewClientWithConfig(cfg *Config) (*Client, error) {
133135 if len (cfg .Network .URLs ) == 0 {
134136 return nil , fmt .Errorf ("at least one url should be present in config in 'secret_urls = []'" )
135137 }
136- tr , err := NewTracer (cfg . Network . URLs [ 0 ], cs , & abiFinder , cfg , contractAddressToNameMap , addrs )
138+ tr , err := NewTracer (cs , & abiFinder , cfg , contractAddressToNameMap , addrs )
137139 if err != nil {
138140 return nil , errors .Wrap (err , ErrCreateTracer )
139141 }
@@ -215,6 +217,10 @@ func ValidateConfig(cfg *Config) error {
215217 return fmt .Errorf ("KeyFileSource is set to 'file' but the path to the key file is not set" )
216218 }
217219
220+ if cfg .Network .DialTimeout == nil {
221+ cfg .Network .DialTimeout = & Duration {D : DefaultDialTimeout }
222+ }
223+
218224 return nil
219225}
220226
@@ -240,11 +246,19 @@ func NewClientRaw(
240246 if len (cfg .Network .URLs ) > 1 {
241247 L .Warn ().Msg ("Multiple RPC URLs provided, only the first one will be used" )
242248 }
243-
244- client , err := ethclient .Dial (cfg .Network .URLs [0 ])
249+ ctx , cancel := context .WithTimeout (context .Background (), cfg .Network .DialTimeout .Duration ())
250+ defer cancel ()
251+ rpcClient , err := rpc .DialOptions (ctx ,
252+ cfg .FirstNetworkURL (),
253+ rpc .WithHeaders (cfg .RPCHeaders ),
254+ rpc .WithHTTPClient (& http.Client {
255+ Transport : NewLoggingTransport (),
256+ }),
257+ )
245258 if err != nil {
246- return nil , fmt .Errorf ("failed to connect to '%s' due to: %w" , cfg .Network . URLs [ 0 ] , err )
259+ return nil , fmt .Errorf ("failed to connect RPC client to '%s' due to: %w" , cfg .FirstNetworkURL () , err )
247260 }
261+ client := ethclient .NewClient (rpcClient )
248262
249263 chainId , err := client .ChainID (context .Background ())
250264 if err != nil {
@@ -255,16 +269,16 @@ func NewClientRaw(
255269 if err != nil {
256270 return nil , err
257271 }
258- ctx , cancel := context .WithCancel (context .Background ())
272+ ctx , cancelFunc := context .WithCancel (context .Background ())
259273 c := & Client {
260274 Cfg : cfg ,
261275 Client : client ,
262276 Addresses : addrs ,
263277 PrivateKeys : pkeys ,
264- URL : cfg .Network . URLs [ 0 ] ,
278+ URL : cfg .FirstNetworkURL () ,
265279 ChainID : int64 (cID ),
266280 Context : ctx ,
267- CancelFunc : cancel ,
281+ CancelFunc : cancelFunc ,
268282 }
269283 for _ , o := range opts {
270284 o (c )
@@ -320,7 +334,7 @@ func NewClientRaw(
320334 L .Info ().
321335 Str ("NetworkName" , cfg .Network .Name ).
322336 Interface ("Addresses" , addrs ).
323- Str ("RPC" , cfg .Network . URLs [ 0 ] ).
337+ Str ("RPC" , cfg .FirstNetworkURL () ).
324338 Str ("ChainID" , cfg .Network .ChainID ).
325339 Int64 ("Ephemeral keys" , * cfg .EphemeralAddrs ).
326340 Msg ("Created new client" )
@@ -364,7 +378,7 @@ func NewClientRaw(
364378 abiFinder := NewABIFinder (c .ContractAddressToNameMap , c .ContractStore )
365379 c .ABIFinder = & abiFinder
366380 }
367- tr , err := NewTracer (cfg . Network . URLs [ 0 ], c .ContractStore , c .ABIFinder , cfg , c .ContractAddressToNameMap , addrs )
381+ tr , err := NewTracer (c .ContractStore , c .ABIFinder , cfg , c .ContractAddressToNameMap , addrs )
368382 if err != nil {
369383 return nil , errors .Wrap (err , ErrCreateTracer )
370384 }
0 commit comments