From 7470129121cca94930e3fe610c5ffa1c5d573b85 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Fri, 18 Nov 2016 11:13:09 +0100 Subject: [PATCH] accounts/abi: Index output for slices and arrays correctly --- accounts/abi/abi.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/accounts/abi/abi.go b/accounts/abi/abi.go index 2efac1307d..fb9be71c56 100644 --- a/accounts/abi/abi.go +++ b/accounts/abi/abi.go @@ -274,12 +274,21 @@ func (abi ABI) Unpack(v interface{}, name string, output []byte) error { // struct will match named return values to the struct's field // names case reflect.Struct: + idx := 0 for i := 0; i < len(method.Outputs); i++ { - marshalledValue, err := toGoType(i, method.Outputs[i], output) + marshalledValue, err := toGoType(idx, method.Outputs[i], output) if err != nil { return err } reflectValue := reflect.ValueOf(marshalledValue) + kind := reflectValue.Type().Kind() + if (kind == reflect.Array || kind == reflect.Slice) && + reflectValue.Type().Elem().Kind() != reflect.Uint8 { + // This is a slice of something other than bytes. + idx += reflectValue.Len() + } else { + idx++ + } for j := 0; j < typ.NumField(); j++ { field := typ.Field(j)