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)