diff --git a/etherclient/backoff.go b/etherclient/backoff.go index 3bd881b..951d609 100644 --- a/etherclient/backoff.go +++ b/etherclient/backoff.go @@ -69,10 +69,14 @@ func (ec *etherClient) withBackoff( // Move onto the next provider. ec.provider.Next() } - return handleRetryErr(ctx, method, opErr) + return handleRetryErr(ctx, method, ec.chainID, opErr) }, bo) if err != nil { - logrus.WithError(err).WithField("method", method).Error("retry failed with error") + logger := logrus.WithError(err).WithField("method", method) + if ec.chainID != nil { + logger = logger.WithField("chainID", ec.chainID.String()) + } + logger.Error("retry failed with error") } return err } diff --git a/etherclient/client.go b/etherclient/client.go index eaa6cd9..14733a8 100644 --- a/etherclient/client.go +++ b/etherclient/client.go @@ -58,6 +58,7 @@ type EtherClient interface { SetRetryInterval(d time.Duration) SetMetricsHandler(h func(rpcHost, clientMethod string, err error)) + SetChainID(chainID *big.Int) } type Extras interface { @@ -86,6 +87,8 @@ type etherClient struct { retryInterval time.Duration metricsHandler func(rpcHost, clientMethod string, err error) + + chainID *big.Int } var _ EtherClient = ðerClient{} @@ -111,10 +114,12 @@ func DialContext(ctx context.Context, rawurls ...string) (*etherClient, error) { } clients = append(clients, ðClientWrapper{url: rawurl, Client: c}) } - return ðerClient{ + ec := ðerClient{ provider: provider.NewRingProvider(clients...), retryInterval: defaultRetryInterval, - }, nil + } + + return ec, nil } func (ec *etherClient) SetRetryInterval(d time.Duration) { @@ -125,6 +130,10 @@ func (ec *etherClient) SetMetricsHandler(h func(rpcHost, clientMethod string, er ec.metricsHandler = h } +func (ec *etherClient) SetChainID(chainID *big.Int) { + ec.chainID = chainID +} + func (ec *etherClient) Client() *rpc.Client { return ec.provider.Provide().Client.Client() } diff --git a/etherclient/errors.go b/etherclient/errors.go index 182a584..a9dc275 100644 --- a/etherclient/errors.go +++ b/etherclient/errors.go @@ -2,6 +2,7 @@ package etherclient import ( "context" + "math/big" "strings" "github.com/cenkalti/backoff" @@ -32,7 +33,7 @@ func isPermanentError(err error) bool { return false } -func handleRetryErr(ctx context.Context, method string, err error) error { +func handleRetryErr(ctx context.Context, method string, chainID *big.Int, err error) error { if err == nil { return nil } @@ -40,6 +41,9 @@ func handleRetryErr(ctx context.Context, method string, err error) error { if len(method) > 0 { logger = logger.WithField("method", method) } + if chainID != nil { + logger = logger.WithField("chainID", chainID.String()) + } if isPermanentError(err) { logger.WithError(err).Error("backoff permanent error") return backoff.Permanent(err) diff --git a/etherclient/mocks/mock_client.go b/etherclient/mocks/mock_client.go index 325dac2..ce9e8ac 100644 --- a/etherclient/mocks/mock_client.go +++ b/etherclient/mocks/mock_client.go @@ -1192,6 +1192,18 @@ func (mr *MockEtherClientMockRecorder) SendTransaction(ctx, tx interface{}) *gom return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendTransaction", reflect.TypeOf((*MockEtherClient)(nil).SendTransaction), ctx, tx) } +// SetChainID mocks base method. +func (m *MockEtherClient) SetChainID(chainID *big.Int) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetChainID", chainID) +} + +// SetChainID indicates an expected call of SetChainID. +func (mr *MockEtherClientMockRecorder) SetChainID(chainID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetChainID", reflect.TypeOf((*MockEtherClient)(nil).SetChainID), chainID) +} + // SetMetricsHandler mocks base method. func (m *MockEtherClient) SetMetricsHandler(h func(string, string, error)) { m.ctrl.T.Helper()