diff --git a/execution/evm/abi/abi.go b/execution/evm/abi/abi.go index bced18f48b6661593e16c09a0ed163d287fccdd3..0dea5213413516524b8f34bb248a80806938723f 100644 --- a/execution/evm/abi/abi.go +++ b/execution/evm/abi/abi.go @@ -212,22 +212,21 @@ func (e EVMUint) unpack(data []byte, offset int, v interface{}) (int, error) { *v = b.String() case *big.Int: b := new(big.Int) - b.SetBytes(data[0:ElementSize]) - v = b + *v = *b.SetBytes(data[0:ElementSize]) case *uint64: - maxLen := int(unsafe.Sizeof(new(uint64))) + maxLen := int(unsafe.Sizeof(*v)) if length > maxLen { return 0, fmt.Errorf("value to large for uint64") } *v = binary.BigEndian.Uint64(data[ElementSize-maxLen : ElementSize]) case *uint32: - maxLen := int(unsafe.Sizeof(new(uint32))) + maxLen := int(unsafe.Sizeof(*v)) if length > maxLen { return 0, fmt.Errorf("value to large for uint64") } *v = binary.BigEndian.Uint32(data[ElementSize-maxLen : ElementSize]) case *uint16: - maxLen := int(unsafe.Sizeof(new(uint16))) + maxLen := int(unsafe.Sizeof(*v)) if length > maxLen { return 0, fmt.Errorf("value to large for uint16") } @@ -239,19 +238,19 @@ func (e EVMUint) unpack(data []byte, offset int, v interface{}) (int, error) { } *v = uint8(data[31]) case *int64: - maxLen := int(unsafe.Sizeof(new(int64))) + maxLen := int(unsafe.Sizeof(*v)) if length > maxLen || (data[ElementSize-maxLen]&0x80) != 0 { return 0, fmt.Errorf("value to large for int64") } *v = int64(binary.BigEndian.Uint64(data[ElementSize-maxLen : ElementSize])) case *int32: - maxLen := int(unsafe.Sizeof(new(int32))) + maxLen := int(unsafe.Sizeof(*v)) if length > maxLen || (data[ElementSize-maxLen]&0x80) != 0 { return 0, fmt.Errorf("value to large for int64") } *v = int32(binary.BigEndian.Uint32(data[ElementSize-maxLen : ElementSize])) case *int16: - maxLen := int(unsafe.Sizeof(new(uint16))) + maxLen := int(unsafe.Sizeof(*v)) if length > maxLen || (data[ElementSize-maxLen]&0x80) != 0 { return 0, fmt.Errorf("value to large for int16") } diff --git a/execution/evm/abi/core_test.go b/execution/evm/abi/core_test.go index b4b987762a01820f41568ec33c26b49a25736e29..54a933a00de0c03e63b623075b055ee054a975bb 100644 --- a/execution/evm/abi/core_test.go +++ b/execution/evm/abi/core_test.go @@ -419,6 +419,48 @@ func TestUnpacker(t *testing.T) { return x }(), }, + { + EVMUint{M: 256}, + pad([]byte{42}, 32, true), + new(int64), + func() *int64 { var v int64; v = 42; return &v }(), + }, + { + EVMUint{M: 256}, + pad([]byte{42}, 32, true), + new(int32), + func() *int32 { var v int32; v = 42; return &v }(), + }, + { + EVMUint{M: 256}, + pad([]byte{0x7f, 0xff}, 32, true), + new(int16), + func() *int16 { var v int16; v = 0x7fff; return &v }(), + }, + { + EVMUint{M: 256}, + pad([]byte{0xfd, 0xca}, 32, true), + new(uint16), + func() *uint16 { var v uint16; v = 0xfdca; return &v }(), + }, + { + EVMUint{M: 256}, + pad([]byte{0xfd, 0xca}, 32, true), + new(uint32), + func() *uint32 { var v uint32; v = 0xfdca; return &v }(), + }, + { + EVMUint{M: 256}, + pad([]byte{0xfd, 0xca, 0, 0, 0, 0, 0, 0}, 32, true), + new(uint64), + func() *uint64 { var v uint64; v = 0xfdca000000000000; return &v }(), + }, + { + EVMUint{M: 256}, + pad([]byte{42}, 32, true), + new(big.Int), + big.NewInt(42), + }, } { //t.Log(test.name) t.Log(test.packed)