diff --git a/accounts/abi/abi.go b/accounts/abi/abi.go index e7cf4aac7..cce89de1b 100644 --- a/accounts/abi/abi.go +++ b/accounts/abi/abi.go @@ -316,6 +316,8 @@ func set(dst, src reflect.Value, output Argument) error { return fmt.Errorf("abi: cannot unmarshal src (len=%d) in to dst (len=%d)", output.Type.SliceSize, dst.Len()) } reflect.Copy(dst, src) + case dstType.Kind() == reflect.Interface: + dst.Set(src) default: return fmt.Errorf("abi: cannot unmarshal %v in to %v", src.Type(), dst.Type()) } diff --git a/accounts/abi/abi_test.go b/accounts/abi/abi_test.go index 249d37dca..4b41d2eee 100644 --- a/accounts/abi/abi_test.go +++ b/accounts/abi/abi_test.go @@ -161,6 +161,13 @@ func TestSimpleMethodUnpack(t *testing.T) { "hash", nil, }, + { + `[ { "type": "bytes32" } ]`, + pad([]byte{1}, 32, false), + pad([]byte{1}, 32, false), + "interface", + nil, + }, } { abiDefinition := fmt.Sprintf(`[{ "name" : "method", "outputs": %s}]`, test.def) abi, err := JSON(strings.NewReader(abiDefinition)) @@ -203,6 +210,8 @@ func TestSimpleMethodUnpack(t *testing.T) { var v common.Hash err = abi.Unpack(&v, "method", test.marshalledOutput) outvar = v + case "interface": + err = abi.Unpack(&outvar, "method", test.marshalledOutput) default: t.Errorf("unsupported type '%v' please add it to the switch statement in this test", test.outVar) continue