From 7ed09ed0bc2eac51a0b8b491fa23794b096e5704 Mon Sep 17 00:00:00 2001 From: Dmitry Shulyak Date: Thu, 30 Nov 2017 11:52:19 +0200 Subject: [PATCH] accounts/abi: count array fields after unpacking In current codebase array fields are counted before unpacking output. So, if we have array with 2 fields: toGoType function will try to unpack values from 64 till 64 + 2*32 which is not correct in my opinion. I shifted counting to be done after processing array, so in case array is the first field, and it has 2 elements: we will read it from 0 till 2*32. Additionally array doesnt require length prefix, so field that follows array should be read from 64 byte. This is why i made additional substitution in this change. --- accounts/abi/event.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/accounts/abi/event.go b/accounts/abi/event.go index 44ed7b8df2..860db06096 100644 --- a/accounts/abi/event.go +++ b/accounts/abi/event.go @@ -71,14 +71,15 @@ func (e Event) tupleUnpack(v interface{}, output []byte) error { if input.Indexed { // can't read, continue continue - } else if input.Type.T == ArrayTy { - // need to move this up because they read sequentially - j += input.Type.Size } marshalledValue, err := toGoType((i+j)*32, input.Type, output) if err != nil { return err } + if input.Type.T == ArrayTy { + // need to move this up because they read sequentially + j += input.Type.Size - 1 + } reflectValue := reflect.ValueOf(marshalledValue) switch value.Kind() {