aboutsummaryrefslogtreecommitdiffstats
path: root/accounts/abi/event.go
diff options
context:
space:
mode:
Diffstat (limited to 'accounts/abi/event.go')
-rw-r--r--accounts/abi/event.go23
1 files changed, 10 insertions, 13 deletions
diff --git a/accounts/abi/event.go b/accounts/abi/event.go
index 0d3c3c4fa..b67bc96a8 100644
--- a/accounts/abi/event.go
+++ b/accounts/abi/event.go
@@ -59,16 +59,19 @@ func (e Event) tupleUnpack(v interface{}, output []byte) error {
var (
value = valueOf.Elem()
typ = value.Type()
+ kind = value.Kind()
)
-
- if value.Kind() != reflect.Struct {
- return fmt.Errorf("abi: cannot unmarshal tuple in to %v", typ)
+ if err := requireUnpackKind(value, typ, kind, e.Inputs, true); err != nil {
+ return err
}
+ // `i` counts the nonindexed arguments.
+ // `j` counts the number of complex types.
+ // both `i` and `j` are used to to correctly compute `data` offset.
i, j := -1, 0
for _, input := range e.Inputs {
if input.Indexed {
- // can't read, continue
+ // Indexed arguments are not packed into data
continue
}
i++
@@ -83,7 +86,7 @@ func (e Event) tupleUnpack(v interface{}, output []byte) error {
}
reflectValue := reflect.ValueOf(marshalledValue)
- switch value.Kind() {
+ switch kind {
case reflect.Struct:
for j := 0; j < typ.NumField(); j++ {
field := typ.Field(j)
@@ -95,19 +98,13 @@ func (e Event) tupleUnpack(v interface{}, output []byte) error {
}
}
case reflect.Slice, reflect.Array:
- if value.Len() < i {
- return fmt.Errorf("abi: insufficient number of arguments for unpack, want %d, got %d", i, value.Len())
- }
v := value.Index(i)
- if v.Kind() != reflect.Ptr && v.Kind() != reflect.Interface {
- return fmt.Errorf("abi: cannot unmarshal %v in to %v", v.Type(), reflectValue.Type())
+ if err := requireAssignable(v, reflectValue); err != nil {
+ return err
}
- reflectValue := reflect.ValueOf(marshalledValue)
if err := set(v.Elem(), reflectValue, input); err != nil {
return err
}
- default:
- return fmt.Errorf("abi: cannot unmarshal tuple in to %v", typ)
}
}
return nil