diff --git a/call.go b/call.go index 8929516..6fa5567 100644 --- a/call.go +++ b/call.go @@ -108,8 +108,14 @@ func (call *Call) Unpack(b []byte) error { } fieldCount := t.NumField() + if fieldCount > len(out) { + return fmt.Errorf("struct has %d fields but ABI returned %d values", fieldCount, len(out)) + } for i := 0; i < fieldCount; i++ { field := t.Field(i) + if !field.CanSet() { + return fmt.Errorf("field %d (%s) is not settable (unexported?)", i, t.Type().Field(i).Name) + } converted := abi.ConvertType(out[i], field.Interface()) field.Set(reflect.ValueOf(converted)) } diff --git a/caller.go b/caller.go index bb6ced4..96e4d64 100644 --- a/caller.go +++ b/caller.go @@ -85,6 +85,7 @@ func (caller *Caller) calls(opts *bind.CallOpts, calls ...*Call) ([]*Call, error call.Failed = !result.Success if err := call.Unpack(result.ReturnData); err != nil { if call.CanFail { + call.Failed = true // mark as failed so callers don't need to inspect Outputs log.Println(fmt.Errorf("failed to unpack call outputs at index [%d]: %v", i, err)) continue }