From efe1a2d82b789886705ebeee7652fb7be3198014 Mon Sep 17 00:00:00 2001
From: Sean Young <sean.young@monax.io>
Date: Wed, 12 Sep 2018 13:26:37 +0100
Subject: [PATCH] Add some EVMUint tests

Signed-off-by: Sean Young <sean.young@monax.io>
---
 execution/evm/abi/abi.go       | 15 ++++++------
 execution/evm/abi/core_test.go | 42 ++++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 8 deletions(-)

diff --git a/execution/evm/abi/abi.go b/execution/evm/abi/abi.go
index bced18f4..0dea5213 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 b4b98776..54a933a0 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)
-- 
GitLab