github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/execution/evm/abi/abi_test.go (about)

     1  package abi
     2  
     3  import (
     4  	"bytes"
     5  	"math/big"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/tmthrgd/go-hex"
    10  
    11  	"github.com/hyperledger/burrow/crypto"
    12  	"github.com/hyperledger/burrow/logging"
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  //To Test:
    18  //Bools, Arrays, Addresses, Hashes
    19  //Test Packing different things
    20  //After that, should be good to go
    21  
    22  func TestPacker(t *testing.T) {
    23  	for _, test := range []struct {
    24  		ABI            string
    25  		args           []interface{}
    26  		name           string
    27  		expectedOutput []byte
    28  	}{
    29  		// Test string address
    30  		{
    31  			`[{"constant":false,"inputs":[{"internalType":"address payable","name":"friend","type":"address"}],"name":"sendToAFriend","outputs":[],"payable":true,"stateMutability":"payable","type":"function"}]`,
    32  			[]interface{}{"C42DEED84BDF2CA695F2E91F4E6395D191CF35FC"},
    33  			"sendToAFriend",
    34  			pad([]byte{196, 45, 238, 216, 75, 223, 44, 166, 149, 242, 233, 31, 78, 99, 149, 209, 145, 207, 53, 252}, 32, true),
    35  		},
    36  		// From: https://github.com/hyperledger/burrow/issues/1326
    37  		{
    38  			`[{"constant":false,"inputs":[{"internalType":"address payable","name":"friend","type":"address"}],"name":"sendToAFriend","outputs":[],"payable":true,"stateMutability":"payable","type":"function"}]`,
    39  			[]interface{}{crypto.Address{1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4}},
    40  			"sendToAFriend",
    41  			pad([]byte{1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4}, 32, true),
    42  		},
    43  		{
    44  			`[{"constant":false,"inputs":[{"name":"","type":"uint256"}],"name":"UInt","outputs":[],"payable":false,"type":"function"}]`,
    45  			[]interface{}{"1"},
    46  			"UInt",
    47  			pad([]byte{1}, 32, true),
    48  		},
    49  		{
    50  			`[{"constant":false,"inputs":[{"name":"","type":"int256"}],"name":"Int","outputs":[],"payable":false,"type":"function"}]`,
    51  			[]interface{}{"-1"},
    52  			"Int",
    53  			[]byte{255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    54  		},
    55  		{
    56  			`[{"constant":false,"inputs":[{"name":"","type":"bool"}],"name":"Bool","outputs":[],"payable":false,"type":"function"}]`,
    57  			[]interface{}{"true"},
    58  			"Bool",
    59  			pad([]byte{1}, 32, true),
    60  		},
    61  		{
    62  			`[{"constant":false,"inputs":[{"name":"","type":"string"}],"name":"String","outputs":[],"payable":false,"type":"function"}]`,
    63  			[]interface{}{"marmots"},
    64  			"String",
    65  			append(hexToBytes(t, "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000007"), pad([]byte("marmots"), 32, false)...),
    66  		},
    67  		{
    68  			`[{"constant":false,"inputs":[{"name":"x","type":"bytes32"}],"name":"Bytes32","outputs":[],"payable":false,"type":"function"}]`,
    69  			[]interface{}{"marmatoshi"},
    70  			"Bytes32",
    71  			pad([]byte("marmatoshi"), 32, false),
    72  		},
    73  		{
    74  			`[{"constant":false,"inputs":[{"name":"","type":"uint8"}],"name":"UInt8","outputs":[],"payable":false,"type":"function"}]`,
    75  			[]interface{}{"1"},
    76  			"UInt8",
    77  			pad([]byte{1}, 32, true),
    78  		},
    79  		{
    80  			`[{"constant":false,"inputs":[{"name":"","type":"int8"}],"name":"Int8","outputs":[],"payable":false,"type":"function"}]`,
    81  			[]interface{}{"-1"},
    82  			"Int8",
    83  			[]byte{255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
    84  		},
    85  		{
    86  			`[{"constant":false,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"multiPackUInts","outputs":[],"payable":false,"type":"function"}]`,
    87  			[]interface{}{"1", "1"},
    88  			"multiPackUInts",
    89  			append(pad([]byte{1}, 32, true), pad([]byte{1}, 32, true)...),
    90  		},
    91  		{
    92  			`[{"constant":false,"inputs":[{"name":"","type":"bool"},{"name":"","type":"bool"}],"name":"multiPackBools","outputs":[],"payable":false,"type":"function"}]`,
    93  			[]interface{}{"true", "false"},
    94  			"multiPackBools",
    95  			append(pad([]byte{1}, 32, true), pad([]byte{0}, 32, true)...),
    96  		},
    97  		{
    98  			`[{"constant":false,"inputs":[{"name":"","type":"int256"},{"name":"","type":"int256"}],"name":"multiPackInts","outputs":[],"payable":false,"type":"function"}]`,
    99  			[]interface{}{"-1", "-1"},
   100  			"multiPackInts",
   101  			[]byte{255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
   102  		},
   103  
   104  		{
   105  			`[{"constant":false,"inputs":[{"name":"","type":"string"},{"name":"","type":"string"}],"name":"multiPackStrings","outputs":[],"payable":false,"type":"function"}]`,
   106  			[]interface{}{"hello", "world"},
   107  			"multiPackStrings",
   108  			append(
   109  				hexToBytes(t, "000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000005"),
   110  				append(pad([]byte("hello"), 32, false),
   111  					append(hexToBytes(t, "0000000000000000000000000000000000000000000000000000000000000005"),
   112  						pad([]byte("world"), 32, false)...)...)...,
   113  			),
   114  		},
   115  		{
   116  			`[{"constant":false,"inputs":[],"name":"arrayOfBytes32Pack","inputs":[{"name":"","type":"bytes32[3]"}],"payable":false,"type":"function"}]`,
   117  			[]interface{}{`[den,of,marmots]`},
   118  			"arrayOfBytes32Pack",
   119  			append(
   120  				pad([]byte("den"), 32, false),
   121  				append(pad([]byte("of"), 32, false), pad([]byte("marmots"), 32, false)...)...,
   122  			),
   123  		},
   124  		{
   125  			`[{"constant":false,"inputs":[{"name":"","type":"uint256[3]"}],"name":"arrayOfUIntsPack","outputs":[],"payable":false,"type":"function"}]`,
   126  			[]interface{}{"[1,2,3]"},
   127  			"arrayOfUIntsPack",
   128  			hexToBytes(t, "000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003"),
   129  		},
   130  		{
   131  			`[{"constant":false,"inputs":[{"name":"","type":"int256[3]"}],"name":"arrayOfIntsPack","outputs":[],"payable":false,"type":"function"}]`,
   132  			[]interface{}{"[-1,-2,-3]"},
   133  			"arrayOfIntsPack",
   134  			[]byte{255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253},
   135  		},
   136  		{
   137  			`[{"constant":false,"inputs":[{"name":"","type":"bool[2]"}],"name":"arrayOfBoolsPack","outputs":[],"payable":false,"type":"function"}]`,
   138  			[]interface{}{"[true,false]"},
   139  			"arrayOfBoolsPack",
   140  			append(pad([]byte{1}, 32, true), pad([]byte{0}, 32, true)...),
   141  		},
   142  		// test dynamic objet  uint[]
   143  		{
   144  			`[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"string","name":"_uri","type":"string"}],"name":"increase","outputs":[],"stateMutability":"nonpayable","type":"function"}]`,
   145  			[]interface{}{[]string{"201", "202", "203"}, "hello"},
   146  			"increase",
   147  			[]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 104, 101, 108, 108, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
   148  		},
   149  	} {
   150  		t.Log(test.args)
   151  		if output, _, err := EncodeFunctionCall(test.ABI, test.name, logging.NewNoopLogger(), test.args...); err != nil {
   152  			t.Errorf("Unexpected error in %s: %v", test.name, err)
   153  		} else {
   154  			if !bytes.Equal(output[4:], test.expectedOutput) {
   155  				t.Errorf("Incorrect output,\n\t expected %v,\n\t got %v", test.expectedOutput, output[4:])
   156  			}
   157  		}
   158  	}
   159  }
   160  
   161  func TestUnpackerString(t *testing.T) {
   162  	for _, test := range []struct {
   163  		abi            string
   164  		packed         []byte
   165  		name           string
   166  		expectedOutput []Variable
   167  	}{
   168  		{
   169  			`[{"constant":true,"inputs":[],"name":"String","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"}]`,
   170  			append(pad(hexToBytes(t, "0000000000000000000000000000000000000000000000000000000000000020"), 32, true), append(pad(hexToBytes(t, "0000000000000000000000000000000000000000000000000000000000000005"), 32, true), pad([]byte("Hello"), 32, false)...)...),
   171  			"String",
   172  			[]Variable{
   173  				{
   174  					Name:  "0",
   175  					Value: "Hello",
   176  				},
   177  			},
   178  		},
   179  		{
   180  			`[{"constant":true,"inputs":[],"name":"UInt","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"}]`,
   181  			hexToBytes(t, "0000000000000000000000000000000000000000000000000000000000000001"),
   182  			"UInt",
   183  			[]Variable{
   184  				{
   185  					Name:  "0",
   186  					Value: "1",
   187  				},
   188  			},
   189  		},
   190  		{
   191  			`[{"constant":false,"inputs":[],"name":"Int","outputs":[{"name":"retVal","type":"int256"}],"payable":false,"type":"function"}]`,
   192  			[]byte{255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
   193  			"Int",
   194  			[]Variable{
   195  				{
   196  					Name:  "retVal",
   197  					Value: "-1",
   198  				},
   199  			},
   200  		},
   201  		{
   202  			`[{"constant":true,"inputs":[],"name":"Bool","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"}]`,
   203  			hexToBytes(t, "0000000000000000000000000000000000000000000000000000000000000001"),
   204  			"Bool",
   205  			[]Variable{
   206  				{
   207  					Name:  "0",
   208  					Value: "true",
   209  				},
   210  			},
   211  		},
   212  		{
   213  			`[{"constant":true,"inputs":[],"name":"Address","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"}]`,
   214  			hexToBytes(t, "0000000000000000000000001040E6521541DAB4E7EE57F21226DD17CE9F0FB7"),
   215  			"Address",
   216  			[]Variable{
   217  				{
   218  					Name:  "0",
   219  					Value: "1040E6521541DAB4E7EE57F21226DD17CE9F0FB7",
   220  				},
   221  			},
   222  		},
   223  		{
   224  			`[{"constant":false,"inputs":[],"name":"Bytes32","outputs":[{"name":"retBytes","type":"bytes32"}],"payable":false,"type":"function"}]`,
   225  			pad([]byte("marmatoshi"), 32, true),
   226  			"Bytes32",
   227  			[]Variable{
   228  				{
   229  					Name:  "retBytes",
   230  					Value: "marmatoshi",
   231  				},
   232  			},
   233  		},
   234  		{
   235  			`[{"constant":false,"inputs":[],"name":"multiReturnUIntInt","outputs":[{"name":"","type":"uint256"},{"name":"","type":"int256"}],"payable":false,"type":"function"}]`,
   236  			append(
   237  				hexToBytes(t, "0000000000000000000000000000000000000000000000000000000000000001"),
   238  				[]byte{255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}...,
   239  			),
   240  			"multiReturnUIntInt",
   241  			[]Variable{
   242  				{
   243  					Name:  "0",
   244  					Value: "1",
   245  				},
   246  				{
   247  					Name:  "1",
   248  					Value: "-1",
   249  				},
   250  			},
   251  		},
   252  		{
   253  			`[{"constant":false,"inputs":[],"name":"multiReturnMixed","outputs":[{"name":"","type":"string"},{"name":"","type":"uint256"}],"payable":false,"type":"function"}]`,
   254  			append(
   255  				hexToBytes(t, "00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001"),
   256  				append(hexToBytes(t, "0000000000000000000000000000000000000000000000000000000000000005"), pad([]byte("Hello"), 32, false)...)...,
   257  			),
   258  			"multiReturnMixed",
   259  			[]Variable{
   260  				{
   261  					Name:  "0",
   262  					Value: "Hello",
   263  				},
   264  				{
   265  					Name:  "1",
   266  					Value: "1",
   267  				},
   268  			},
   269  		},
   270  		{
   271  			`[{"constant":false,"inputs":[],"name":"multiPackBytes32","outputs":[{"name":"","type":"bytes32"},{"name":"","type":"bytes32"},{"name":"","type":"bytes32"}],"payable":false,"type":"function"}]`,
   272  			append(
   273  				pad([]byte("den"), 32, true),
   274  				append(pad([]byte("of"), 32, true), pad([]byte("marmots"), 32, true)...)...,
   275  			),
   276  			"multiPackBytes32",
   277  			[]Variable{
   278  				{
   279  					Name:  "0",
   280  					Value: "den",
   281  				},
   282  				{
   283  					Name:  "1",
   284  					Value: "of",
   285  				},
   286  				{
   287  					Name:  "2",
   288  					Value: "marmots",
   289  				},
   290  			},
   291  		},
   292  		{
   293  			`[{"constant":false,"inputs":[],"name":"arrayReturnBytes32","outputs":[{"name":"","type":"bytes32[3]"}],"payable":false,"type":"function"}]`,
   294  			append(
   295  				pad([]byte("den"), 32, true),
   296  				append(pad([]byte("of"), 32, true), pad([]byte("marmots"), 32, true)...)...,
   297  			),
   298  			"arrayReturnBytes32",
   299  			[]Variable{
   300  				{
   301  					Name:  "0",
   302  					Value: "[den,of,marmots]",
   303  				},
   304  			},
   305  		},
   306  		{
   307  			`[{"constant":false,"inputs":[],"name":"arrayReturnUInt","outputs":[{"name":"","type":"uint256[3]"}],"payable":false,"type":"function"}]`,
   308  			hexToBytes(t, "000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003"),
   309  			"arrayReturnUInt",
   310  			[]Variable{
   311  				{
   312  					Name:  "0",
   313  					Value: "[1,2,3]",
   314  				},
   315  			},
   316  		},
   317  		{
   318  			`[{"constant":false,"inputs":[],"name":"arrayReturnInt","outputs":[{"name":"","type":"int256[2]"}],"payable":false,"type":"function"}]`,
   319  			[]byte{255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254},
   320  			"arrayReturnInt",
   321  			[]Variable{
   322  				{
   323  					Name:  "0",
   324  					Value: "[-3,-2]",
   325  				},
   326  			},
   327  		},
   328  	} {
   329  		//t.Log(test.name)
   330  		t.Log(test.packed)
   331  		output, err := DecodeFunctionReturn(test.abi, test.name, test.packed)
   332  		if err != nil {
   333  			t.Errorf("Unpacker failed: %v", err)
   334  		}
   335  		for i, expectedOutput := range test.expectedOutput {
   336  
   337  			if output[i].Name != expectedOutput.Name {
   338  				t.Errorf("Unpacker failed: Incorrect Name, got %v expected %v", output[i].Name, expectedOutput.Name)
   339  			}
   340  			//t.Log("Test: ", output[i].Value)
   341  			//t.Log("Test: ", expectedOutput.Value)
   342  			if strings.Compare(output[i].Value, expectedOutput.Value) != 0 {
   343  				t.Errorf("Unpacker failed: Incorrect value, got %v expected %v", output[i].Value, expectedOutput.Value)
   344  			}
   345  		}
   346  	}
   347  }
   348  
   349  func TestUnpacker(t *testing.T) {
   350  	for _, test := range []struct {
   351  		evm            EVMType
   352  		packed         []byte
   353  		data           interface{}
   354  		expectedOutput interface{}
   355  	}{
   356  		/* positive numbers */
   357  		{
   358  			EVMInt{M: 256},
   359  			pad([]byte{42}, 32, true),
   360  			new(int64),
   361  			func() *int64 { var v int64 = 42; return &v }(),
   362  		},
   363  		{
   364  			EVMInt{M: 256},
   365  			pad([]byte{42}, 32, true),
   366  			new(int32),
   367  			func() *int32 { var v int32; v = 42; return &v }(),
   368  		},
   369  		{
   370  			EVMInt{M: 256},
   371  			pad([]byte{0x7f, 0xff}, 32, true),
   372  			new(int16),
   373  			func() *int16 { var v int16; v = 0x7fff; return &v }(),
   374  		},
   375  		{
   376  			EVMInt{M: 256},
   377  			pad([]byte{0xfd, 0xca}, 32, true),
   378  			new(uint16),
   379  			func() *uint16 { var v uint16; v = 0xfdca; return &v }(),
   380  		},
   381  		{
   382  			EVMInt{M: 256},
   383  			pad([]byte{0xfd, 0xca}, 32, true),
   384  			new(uint32),
   385  			func() *uint32 { var v uint32; v = 0xfdca; return &v }(),
   386  		},
   387  		{
   388  			EVMInt{M: 256},
   389  			pad([]byte{0xfd, 0xca, 0, 0, 0, 0, 0, 0}, 32, true),
   390  			new(uint64),
   391  			func() *uint64 { var v uint64 = 0xfdca000000000000; return &v }(),
   392  		},
   393  		{
   394  			EVMInt{M: 256},
   395  			pad([]byte{42}, 32, true),
   396  			new(big.Int),
   397  			big.NewInt(42),
   398  		},
   399  		/* Negative numbers */
   400  		{
   401  			EVMInt{M: 256},
   402  			hexToBytes(t, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6"),
   403  			new(int64),
   404  			func() *int64 { var v int64 = -42; return &v }(),
   405  		},
   406  		{
   407  			EVMInt{M: 256},
   408  			hexToBytes(t, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6"),
   409  			new(int32),
   410  			func() *int32 { var v int32; v = -42; return &v }(),
   411  		},
   412  		{
   413  			EVMInt{M: 256},
   414  			hexToBytes(t, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8001"),
   415  			new(int16),
   416  			func() *int16 { var v int16; v = -0x7fff; return &v }(),
   417  		},
   418  		{
   419  			EVMInt{M: 256},
   420  			hexToBytes(t, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6C20"),
   421  			new(int32),
   422  			func() *int32 { var v int32; v = -300000; return &v }(),
   423  		},
   424  		{
   425  			EVMInt{M: 256},
   426  			hexToBytes(t, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35010124111"),
   427  			new(int64),
   428  			func() *int64 { var v int64 = -0xcafefedbeef; return &v }(),
   429  		},
   430  		{
   431  			EVMInt{M: 256},
   432  			hexToBytes(t, "80000000000000000000000000000000000000000000000000000CAFEFEDBEEF"),
   433  			new(big.Int),
   434  			func() *big.Int {
   435  				v := new(big.Int)
   436  				x, _ := v.SetString("-57896044618658097711785492504343953926634992332820282019728791990006780674321", 10)
   437  				return x
   438  			}(),
   439  		},
   440  		{
   441  			EVMUint{M: 256},
   442  			pad([]byte{42}, 32, true),
   443  			new(int64),
   444  			func() *int64 { var v int64 = 42; return &v }(),
   445  		},
   446  		{
   447  			EVMUint{M: 256},
   448  			pad([]byte{42}, 32, true),
   449  			new(int32),
   450  			func() *int32 { var v int32 = 42; return &v }(),
   451  		},
   452  		{
   453  			EVMUint{M: 256},
   454  			pad([]byte{0x7f, 0xff}, 32, true),
   455  			new(int16),
   456  			func() *int16 { var v int16 = 0x7fff; return &v }(),
   457  		},
   458  		{
   459  			EVMUint{M: 256},
   460  			pad([]byte{0xfd, 0xca}, 32, true),
   461  			new(uint16),
   462  			func() *uint16 { var v uint16 = 0xfdca; return &v }(),
   463  		},
   464  		{
   465  			EVMUint{M: 256},
   466  			pad([]byte{0xfd, 0xca}, 32, true),
   467  			new(uint32),
   468  			func() *uint32 { var v uint32 = 0xfdca; return &v }(),
   469  		},
   470  		{
   471  			EVMUint{M: 256},
   472  			pad([]byte{0xfd, 0xca, 0, 0, 0, 0, 0, 0}, 32, true),
   473  			new(uint64),
   474  			func() *uint64 { var v uint64 = 0xfdca000000000000; return &v }(),
   475  		},
   476  		{
   477  			EVMUint{M: 256},
   478  			pad([]byte{42}, 32, true),
   479  			new(big.Int),
   480  			big.NewInt(42),
   481  		},
   482  	} {
   483  		//t.Log(test.name)
   484  		t.Log(test.packed)
   485  		_, err := test.evm.unpack(test.packed, 0, test.data)
   486  		if err != nil {
   487  			t.Errorf("Unpacker failed: %v", err)
   488  		}
   489  		assert.EqualValues(t, test.expectedOutput, test.data)
   490  	}
   491  }
   492  
   493  func hexToBytes(t testing.TB, hexString string) []byte {
   494  	bs, err := hex.DecodeString(hexString)
   495  	require.NoError(t, err)
   496  	return bs
   497  }