diff options
-rw-r--r-- | accounts/abi/reflect.go | 2 | ||||
-rw-r--r-- | accounts/abi/unpack_test.go | 15 |
2 files changed, 16 insertions, 1 deletions
diff --git a/accounts/abi/reflect.go b/accounts/abi/reflect.go index 1b0bb0049..ccc6a6593 100644 --- a/accounts/abi/reflect.go +++ b/accounts/abi/reflect.go @@ -74,7 +74,7 @@ func mustArrayToByteSlice(value reflect.Value) reflect.Value { func set(dst, src reflect.Value) error { dstType, srcType := dst.Type(), src.Type() switch { - case dstType.Kind() == reflect.Interface: + case dstType.Kind() == reflect.Interface && dst.Elem().IsValid(): return set(dst.Elem(), src) case dstType.Kind() == reflect.Ptr && dstType.Elem() != derefbigT: return set(dst.Elem(), src) diff --git a/accounts/abi/unpack_test.go b/accounts/abi/unpack_test.go index ff88be3d3..fa8a69d05 100644 --- a/accounts/abi/unpack_test.go +++ b/accounts/abi/unpack_test.go @@ -512,6 +512,11 @@ func TestMethodMultiReturn(t *testing.T) { Int *big.Int } + newInterfaceSlice := func(len int) interface{} { + slice := make([]interface{}, len) + return &slice + } + abi, data, expected := methodMultiReturn(require.New(t)) bigint := new(big.Int) var testCases = []struct { @@ -540,6 +545,16 @@ func TestMethodMultiReturn(t *testing.T) { "", "Can unpack into an array", }, { + &[2]interface{}{}, + &[2]interface{}{expected.Int, expected.String}, + "", + "Can unpack into interface array", + }, { + newInterfaceSlice(2), + &[]interface{}{expected.Int, expected.String}, + "", + "Can unpack into interface slice", + }, { &[]interface{}{new(int), new(int)}, &[]interface{}{&expected.Int, &expected.String}, "abi: cannot unmarshal *big.Int in to int", |