diff --git a/ethrpc/multicall.go b/ethrpc/multicall.go index 7043533f..915b1352 100644 --- a/ethrpc/multicall.go +++ b/ethrpc/multicall.go @@ -158,8 +158,8 @@ func (p *Provider) BatchCall(ctx context.Context, calls []multicall.Call, option _, err := p.Do(ctx, calls_...) if err != nil { - if err, ok := err.(BatchError); ok { - for i, err := range err.ErrorMap() { + if batchErr, ok := err.(BatchError); ok { + for i, err := range batchErr.ErrorMap() { if err != nil { if calls[i].AllowFailure { if revertData, ok := revertDataFromError(err); ok { diff --git a/ethrpc/multicall_unit_test.go b/ethrpc/multicall_unit_test.go new file mode 100644 index 00000000..5b3d9e10 --- /dev/null +++ b/ethrpc/multicall_unit_test.go @@ -0,0 +1,34 @@ +package ethrpc + +import ( + "context" + "errors" + "net/http" + "testing" + + "github.com/0xsequence/ethkit/ethrpc/multicall" +) + +type failingHTTPClient struct { + err error +} + +func (c failingHTTPClient) Do(*http.Request) (*http.Response, error) { + return nil, c.err +} + +func TestBatchCallPreservesTransportError(t *testing.T) { + transportErr := errors.New("transport unavailable") + provider, err := NewProvider( + "http://example.invalid", + WithHTTPClient(failingHTTPClient{err: transportErr}), + ) + if err != nil { + t.Fatalf("NewProvider() error = %v", err) + } + + _, _, err = provider.BatchCall(context.Background(), []multicall.Call{{}}) + if !errors.Is(err, transportErr) { + t.Fatalf("BatchCall() error = %v, want it to wrap %v", err, transportErr) + } +}