github.com/daeglee/go-ethereum@v0.0.0-20190504220456-cad3e8d18e9b/accounts/abi/unpack_test.go (about)

     1  // Copyright 2017 The go-ethereum Authors
     2  // This file is part of the go-ethereum library.
     3  //
     4  // The go-ethereum library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The go-ethereum library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package abi
    18  
    19  import (
    20  	"bytes"
    21  	"encoding/hex"
    22  	"fmt"
    23  	"math/big"
    24  	"reflect"
    25  	"strconv"
    26  	"strings"
    27  	"testing"
    28  
    29  	"github.com/ethereum/go-ethereum/common"
    30  	"github.com/stretchr/testify/require"
    31  )
    32  
    33  type unpackTest struct {
    34  	def  string      // ABI definition JSON
    35  	enc  string      // evm return data
    36  	want interface{} // the expected output
    37  	err  string      // empty or error if expected
    38  }
    39  
    40  func (test unpackTest) checkError(err error) error {
    41  	if err != nil {
    42  		if len(test.err) == 0 {
    43  			return fmt.Errorf("expected no err but got: %v", err)
    44  		} else if err.Error() != test.err {
    45  			return fmt.Errorf("expected err: '%v' got err: %q", test.err, err)
    46  		}
    47  	} else if len(test.err) > 0 {
    48  		return fmt.Errorf("expected err: %v but got none", test.err)
    49  	}
    50  	return nil
    51  }
    52  
    53  var unpackTests = []unpackTest{
    54  	{
    55  		def:  `[{ "type": "bool" }]`,
    56  		enc:  "0000000000000000000000000000000000000000000000000000000000000001",
    57  		want: true,
    58  	},
    59  	{
    60  		def:  `[{ "type": "bool" }]`,
    61  		enc:  "0000000000000000000000000000000000000000000000000000000000000000",
    62  		want: false,
    63  	},
    64  	{
    65  		def:  `[{ "type": "bool" }]`,
    66  		enc:  "0000000000000000000000000000000000000000000000000001000000000001",
    67  		want: false,
    68  		err:  "abi: improperly encoded boolean value",
    69  	},
    70  	{
    71  		def:  `[{ "type": "bool" }]`,
    72  		enc:  "0000000000000000000000000000000000000000000000000000000000000003",
    73  		want: false,
    74  		err:  "abi: improperly encoded boolean value",
    75  	},
    76  	{
    77  		def:  `[{"type": "uint32"}]`,
    78  		enc:  "0000000000000000000000000000000000000000000000000000000000000001",
    79  		want: uint32(1),
    80  	},
    81  	{
    82  		def:  `[{"type": "uint32"}]`,
    83  		enc:  "0000000000000000000000000000000000000000000000000000000000000001",
    84  		want: uint16(0),
    85  		err:  "abi: cannot unmarshal uint32 in to uint16",
    86  	},
    87  	{
    88  		def:  `[{"type": "uint17"}]`,
    89  		enc:  "0000000000000000000000000000000000000000000000000000000000000001",
    90  		want: uint16(0),
    91  		err:  "abi: cannot unmarshal *big.Int in to uint16",
    92  	},
    93  	{
    94  		def:  `[{"type": "uint17"}]`,
    95  		enc:  "0000000000000000000000000000000000000000000000000000000000000001",
    96  		want: big.NewInt(1),
    97  	},
    98  	{
    99  		def:  `[{"type": "int32"}]`,
   100  		enc:  "0000000000000000000000000000000000000000000000000000000000000001",
   101  		want: int32(1),
   102  	},
   103  	{
   104  		def:  `[{"type": "int32"}]`,
   105  		enc:  "0000000000000000000000000000000000000000000000000000000000000001",
   106  		want: int16(0),
   107  		err:  "abi: cannot unmarshal int32 in to int16",
   108  	},
   109  	{
   110  		def:  `[{"type": "int17"}]`,
   111  		enc:  "0000000000000000000000000000000000000000000000000000000000000001",
   112  		want: int16(0),
   113  		err:  "abi: cannot unmarshal *big.Int in to int16",
   114  	},
   115  	{
   116  		def:  `[{"type": "int17"}]`,
   117  		enc:  "0000000000000000000000000000000000000000000000000000000000000001",
   118  		want: big.NewInt(1),
   119  	},
   120  	{
   121  		def:  `[{"type": "int256"}]`,
   122  		enc:  "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
   123  		want: big.NewInt(-1),
   124  	},
   125  	{
   126  		def:  `[{"type": "address"}]`,
   127  		enc:  "0000000000000000000000000100000000000000000000000000000000000000",
   128  		want: common.Address{1},
   129  	},
   130  	{
   131  		def:  `[{"type": "bytes32"}]`,
   132  		enc:  "0100000000000000000000000000000000000000000000000000000000000000",
   133  		want: [32]byte{1, 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},
   134  	},
   135  	{
   136  		def:  `[{"type": "bytes"}]`,
   137  		enc:  "000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200100000000000000000000000000000000000000000000000000000000000000",
   138  		want: common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   139  	},
   140  	{
   141  		def:  `[{"type": "bytes"}]`,
   142  		enc:  "000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200100000000000000000000000000000000000000000000000000000000000000",
   143  		want: [32]byte{},
   144  		err:  "abi: cannot unmarshal []uint8 in to [32]uint8",
   145  	},
   146  	{
   147  		def:  `[{"type": "bytes32"}]`,
   148  		enc:  "000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200100000000000000000000000000000000000000000000000000000000000000",
   149  		want: []byte(nil),
   150  		err:  "abi: cannot unmarshal [32]uint8 in to []uint8",
   151  	},
   152  	{
   153  		def:  `[{"type": "bytes32"}]`,
   154  		enc:  "0100000000000000000000000000000000000000000000000000000000000000",
   155  		want: [32]byte{1, 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},
   156  	},
   157  	{
   158  		def:  `[{"type": "function"}]`,
   159  		enc:  "0100000000000000000000000000000000000000000000000000000000000000",
   160  		want: [24]byte{1},
   161  	},
   162  	// slices
   163  	{
   164  		def:  `[{"type": "uint8[]"}]`,
   165  		enc:  "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   166  		want: []uint8{1, 2},
   167  	},
   168  	{
   169  		def:  `[{"type": "uint8[2]"}]`,
   170  		enc:  "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   171  		want: [2]uint8{1, 2},
   172  	},
   173  	// multi dimensional, if these pass, all types that don't require length prefix should pass
   174  	{
   175  		def:  `[{"type": "uint8[][]"}]`,
   176  		enc:  "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   177  		want: [][]uint8{{1, 2}, {1, 2}},
   178  	},
   179  	{
   180  		def:  `[{"type": "uint8[][]"}]`,
   181  		enc:  "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003",
   182  		want: [][]uint8{{1, 2}, {1, 2, 3}},
   183  	},
   184  	{
   185  		def:  `[{"type": "uint8[2][2]"}]`,
   186  		enc:  "0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   187  		want: [2][2]uint8{{1, 2}, {1, 2}},
   188  	},
   189  	{
   190  		def:  `[{"type": "uint8[][2]"}]`,
   191  		enc:  "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001",
   192  		want: [2][]uint8{{1}, {1}},
   193  	},
   194  	{
   195  		def:  `[{"type": "uint8[2][]"}]`,
   196  		enc:  "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   197  		want: [][2]uint8{{1, 2}},
   198  	},
   199  	{
   200  		def:  `[{"type": "uint8[2][]"}]`,
   201  		enc:  "000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   202  		want: [][2]uint8{{1, 2}, {1, 2}},
   203  	},
   204  	{
   205  		def:  `[{"type": "uint16[]"}]`,
   206  		enc:  "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   207  		want: []uint16{1, 2},
   208  	},
   209  	{
   210  		def:  `[{"type": "uint16[2]"}]`,
   211  		enc:  "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   212  		want: [2]uint16{1, 2},
   213  	},
   214  	{
   215  		def:  `[{"type": "uint32[]"}]`,
   216  		enc:  "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   217  		want: []uint32{1, 2},
   218  	},
   219  	{
   220  		def:  `[{"type": "uint32[2]"}]`,
   221  		enc:  "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   222  		want: [2]uint32{1, 2},
   223  	},
   224  	{
   225  		def:  `[{"type": "uint32[2][3][4]"}]`,
   226  		enc:  "000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000018",
   227  		want: [4][3][2]uint32{{{1, 2}, {3, 4}, {5, 6}}, {{7, 8}, {9, 10}, {11, 12}}, {{13, 14}, {15, 16}, {17, 18}}, {{19, 20}, {21, 22}, {23, 24}}},
   228  	},
   229  	{
   230  		def:  `[{"type": "uint64[]"}]`,
   231  		enc:  "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   232  		want: []uint64{1, 2},
   233  	},
   234  	{
   235  		def:  `[{"type": "uint64[2]"}]`,
   236  		enc:  "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   237  		want: [2]uint64{1, 2},
   238  	},
   239  	{
   240  		def:  `[{"type": "uint256[]"}]`,
   241  		enc:  "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   242  		want: []*big.Int{big.NewInt(1), big.NewInt(2)},
   243  	},
   244  	{
   245  		def:  `[{"type": "uint256[3]"}]`,
   246  		enc:  "000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003",
   247  		want: [3]*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)},
   248  	},
   249  	{
   250  		def:  `[{"type": "string[4]"}]`,
   251  		enc:  "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000548656c6c6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005576f726c64000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b476f2d657468657265756d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008457468657265756d000000000000000000000000000000000000000000000000",
   252  		want: [4]string{"Hello", "World", "Go-ethereum", "Ethereum"},
   253  	},
   254  	{
   255  		def:  `[{"type": "string[]"}]`,
   256  		enc:  "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000008457468657265756d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b676f2d657468657265756d000000000000000000000000000000000000000000",
   257  		want: []string{"Ethereum", "go-ethereum"},
   258  	},
   259  	{
   260  		def:  `[{"type": "bytes[]"}]`,
   261  		enc:  "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003f0f0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f0f0f00000000000000000000000000000000000000000000000000000000000",
   262  		want: [][]byte{{0xf0, 0xf0, 0xf0}, {0xf0, 0xf0, 0xf0}},
   263  	},
   264  	{
   265  		def:  `[{"type": "uint256[2][][]"}]`,
   266  		enc:  "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000003e8",
   267  		want: [][][2]*big.Int{{{big.NewInt(1), big.NewInt(200)}, {big.NewInt(1), big.NewInt(1000)}}, {{big.NewInt(1), big.NewInt(200)}, {big.NewInt(1), big.NewInt(1000)}}},
   268  	},
   269  	{
   270  		def:  `[{"type": "int8[]"}]`,
   271  		enc:  "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   272  		want: []int8{1, 2},
   273  	},
   274  	{
   275  		def:  `[{"type": "int8[2]"}]`,
   276  		enc:  "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   277  		want: [2]int8{1, 2},
   278  	},
   279  	{
   280  		def:  `[{"type": "int16[]"}]`,
   281  		enc:  "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   282  		want: []int16{1, 2},
   283  	},
   284  	{
   285  		def:  `[{"type": "int16[2]"}]`,
   286  		enc:  "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   287  		want: [2]int16{1, 2},
   288  	},
   289  	{
   290  		def:  `[{"type": "int32[]"}]`,
   291  		enc:  "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   292  		want: []int32{1, 2},
   293  	},
   294  	{
   295  		def:  `[{"type": "int32[2]"}]`,
   296  		enc:  "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   297  		want: [2]int32{1, 2},
   298  	},
   299  	{
   300  		def:  `[{"type": "int64[]"}]`,
   301  		enc:  "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   302  		want: []int64{1, 2},
   303  	},
   304  	{
   305  		def:  `[{"type": "int64[2]"}]`,
   306  		enc:  "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   307  		want: [2]int64{1, 2},
   308  	},
   309  	{
   310  		def:  `[{"type": "int256[]"}]`,
   311  		enc:  "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   312  		want: []*big.Int{big.NewInt(1), big.NewInt(2)},
   313  	},
   314  	{
   315  		def:  `[{"type": "int256[3]"}]`,
   316  		enc:  "000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003",
   317  		want: [3]*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)},
   318  	},
   319  	// struct outputs
   320  	{
   321  		def: `[{"name":"int1","type":"int256"},{"name":"int2","type":"int256"}]`,
   322  		enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   323  		want: struct {
   324  			Int1 *big.Int
   325  			Int2 *big.Int
   326  		}{big.NewInt(1), big.NewInt(2)},
   327  	},
   328  	{
   329  		def: `[{"name":"int_one","type":"int256"}]`,
   330  		enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   331  		want: struct {
   332  			IntOne *big.Int
   333  		}{big.NewInt(1)},
   334  	},
   335  	{
   336  		def: `[{"name":"int__one","type":"int256"}]`,
   337  		enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   338  		want: struct {
   339  			IntOne *big.Int
   340  		}{big.NewInt(1)},
   341  	},
   342  	{
   343  		def: `[{"name":"int_one_","type":"int256"}]`,
   344  		enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   345  		want: struct {
   346  			IntOne *big.Int
   347  		}{big.NewInt(1)},
   348  	},
   349  	{
   350  		def: `[{"name":"int_one","type":"int256"}, {"name":"intone","type":"int256"}]`,
   351  		enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   352  		want: struct {
   353  			IntOne *big.Int
   354  			Intone *big.Int
   355  		}{big.NewInt(1), big.NewInt(2)},
   356  	},
   357  	{
   358  		def: `[{"name":"___","type":"int256"}]`,
   359  		enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   360  		want: struct {
   361  			IntOne *big.Int
   362  			Intone *big.Int
   363  		}{},
   364  		err: "abi: purely underscored output cannot unpack to struct",
   365  	},
   366  	{
   367  		def: `[{"name":"int_one","type":"int256"},{"name":"IntOne","type":"int256"}]`,
   368  		enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   369  		want: struct {
   370  			Int1 *big.Int
   371  			Int2 *big.Int
   372  		}{},
   373  		err: "abi: multiple outputs mapping to the same struct field 'IntOne'",
   374  	},
   375  	{
   376  		def: `[{"name":"int","type":"int256"},{"name":"Int","type":"int256"}]`,
   377  		enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   378  		want: struct {
   379  			Int1 *big.Int
   380  			Int2 *big.Int
   381  		}{},
   382  		err: "abi: multiple outputs mapping to the same struct field 'Int'",
   383  	},
   384  	{
   385  		def: `[{"name":"int","type":"int256"},{"name":"_int","type":"int256"}]`,
   386  		enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   387  		want: struct {
   388  			Int1 *big.Int
   389  			Int2 *big.Int
   390  		}{},
   391  		err: "abi: multiple outputs mapping to the same struct field 'Int'",
   392  	},
   393  	{
   394  		def: `[{"name":"Int","type":"int256"},{"name":"_int","type":"int256"}]`,
   395  		enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   396  		want: struct {
   397  			Int1 *big.Int
   398  			Int2 *big.Int
   399  		}{},
   400  		err: "abi: multiple outputs mapping to the same struct field 'Int'",
   401  	},
   402  	{
   403  		def: `[{"name":"Int","type":"int256"},{"name":"_","type":"int256"}]`,
   404  		enc: "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002",
   405  		want: struct {
   406  			Int1 *big.Int
   407  			Int2 *big.Int
   408  		}{},
   409  		err: "abi: purely underscored output cannot unpack to struct",
   410  	},
   411  }
   412  
   413  func TestUnpack(t *testing.T) {
   414  	for i, test := range unpackTests {
   415  		t.Run(strconv.Itoa(i), func(t *testing.T) {
   416  			def := fmt.Sprintf(`[{ "name" : "method", "outputs": %s}]`, test.def)
   417  			abi, err := JSON(strings.NewReader(def))
   418  			if err != nil {
   419  				t.Fatalf("invalid ABI definition %s: %v", def, err)
   420  			}
   421  			encb, err := hex.DecodeString(test.enc)
   422  			if err != nil {
   423  				t.Fatalf("invalid hex: %s" + test.enc)
   424  			}
   425  			outptr := reflect.New(reflect.TypeOf(test.want))
   426  			err = abi.Unpack(outptr.Interface(), "method", encb)
   427  			if err := test.checkError(err); err != nil {
   428  				t.Errorf("test %d (%v) failed: %v", i, test.def, err)
   429  				return
   430  			}
   431  			out := outptr.Elem().Interface()
   432  			if !reflect.DeepEqual(test.want, out) {
   433  				t.Errorf("test %d (%v) failed: expected %v, got %v", i, test.def, test.want, out)
   434  			}
   435  		})
   436  	}
   437  }
   438  
   439  func TestUnpackSetDynamicArrayOutput(t *testing.T) {
   440  	abi, err := JSON(strings.NewReader(`[{"constant":true,"inputs":[],"name":"testDynamicFixedBytes15","outputs":[{"name":"","type":"bytes15[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"testDynamicFixedBytes32","outputs":[{"name":"","type":"bytes32[]"}],"payable":false,"stateMutability":"view","type":"function"}]`))
   441  	if err != nil {
   442  		t.Fatal(err)
   443  	}
   444  
   445  	var (
   446  		marshalledReturn32 = common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000230783132333435363738393000000000000000000000000000000000000000003078303938373635343332310000000000000000000000000000000000000000")
   447  		marshalledReturn15 = common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000230783031323334350000000000000000000000000000000000000000000000003078393837363534000000000000000000000000000000000000000000000000")
   448  
   449  		out32 [][32]byte
   450  		out15 [][15]byte
   451  	)
   452  
   453  	// test 32
   454  	err = abi.Unpack(&out32, "testDynamicFixedBytes32", marshalledReturn32)
   455  	if err != nil {
   456  		t.Fatal(err)
   457  	}
   458  	if len(out32) != 2 {
   459  		t.Fatalf("expected array with 2 values, got %d", len(out32))
   460  	}
   461  	expected := common.Hex2Bytes("3078313233343536373839300000000000000000000000000000000000000000")
   462  	if !bytes.Equal(out32[0][:], expected) {
   463  		t.Errorf("expected %x, got %x\n", expected, out32[0])
   464  	}
   465  	expected = common.Hex2Bytes("3078303938373635343332310000000000000000000000000000000000000000")
   466  	if !bytes.Equal(out32[1][:], expected) {
   467  		t.Errorf("expected %x, got %x\n", expected, out32[1])
   468  	}
   469  
   470  	// test 15
   471  	err = abi.Unpack(&out15, "testDynamicFixedBytes32", marshalledReturn15)
   472  	if err != nil {
   473  		t.Fatal(err)
   474  	}
   475  	if len(out15) != 2 {
   476  		t.Fatalf("expected array with 2 values, got %d", len(out15))
   477  	}
   478  	expected = common.Hex2Bytes("307830313233343500000000000000")
   479  	if !bytes.Equal(out15[0][:], expected) {
   480  		t.Errorf("expected %x, got %x\n", expected, out15[0])
   481  	}
   482  	expected = common.Hex2Bytes("307839383736353400000000000000")
   483  	if !bytes.Equal(out15[1][:], expected) {
   484  		t.Errorf("expected %x, got %x\n", expected, out15[1])
   485  	}
   486  }
   487  
   488  type methodMultiOutput struct {
   489  	Int    *big.Int
   490  	String string
   491  }
   492  
   493  func methodMultiReturn(require *require.Assertions) (ABI, []byte, methodMultiOutput) {
   494  	const definition = `[
   495  	{ "name" : "multi", "constant" : false, "outputs": [ { "name": "Int", "type": "uint256" }, { "name": "String", "type": "string" } ] }]`
   496  	var expected = methodMultiOutput{big.NewInt(1), "hello"}
   497  
   498  	abi, err := JSON(strings.NewReader(definition))
   499  	require.NoError(err)
   500  	// using buff to make the code readable
   501  	buff := new(bytes.Buffer)
   502  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"))
   503  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040"))
   504  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000005"))
   505  	buff.Write(common.RightPadBytes([]byte(expected.String), 32))
   506  	return abi, buff.Bytes(), expected
   507  }
   508  
   509  func TestMethodMultiReturn(t *testing.T) {
   510  	type reversed struct {
   511  		String string
   512  		Int    *big.Int
   513  	}
   514  
   515  	newInterfaceSlice := func(len int) interface{} {
   516  		slice := make([]interface{}, len)
   517  		return &slice
   518  	}
   519  
   520  	abi, data, expected := methodMultiReturn(require.New(t))
   521  	bigint := new(big.Int)
   522  	var testCases = []struct {
   523  		dest     interface{}
   524  		expected interface{}
   525  		error    string
   526  		name     string
   527  	}{{
   528  		&methodMultiOutput{},
   529  		&expected,
   530  		"",
   531  		"Can unpack into structure",
   532  	}, {
   533  		&reversed{},
   534  		&reversed{expected.String, expected.Int},
   535  		"",
   536  		"Can unpack into reversed structure",
   537  	}, {
   538  		&[]interface{}{&bigint, new(string)},
   539  		&[]interface{}{&expected.Int, &expected.String},
   540  		"",
   541  		"Can unpack into a slice",
   542  	}, {
   543  		&[2]interface{}{&bigint, new(string)},
   544  		&[2]interface{}{&expected.Int, &expected.String},
   545  		"",
   546  		"Can unpack into an array",
   547  	}, {
   548  		&[2]interface{}{},
   549  		&[2]interface{}{expected.Int, expected.String},
   550  		"",
   551  		"Can unpack into interface array",
   552  	}, {
   553  		newInterfaceSlice(2),
   554  		&[]interface{}{expected.Int, expected.String},
   555  		"",
   556  		"Can unpack into interface slice",
   557  	}, {
   558  		&[]interface{}{new(int), new(int)},
   559  		&[]interface{}{&expected.Int, &expected.String},
   560  		"abi: cannot unmarshal *big.Int in to int",
   561  		"Can not unpack into a slice with wrong types",
   562  	}, {
   563  		&[]interface{}{new(int)},
   564  		&[]interface{}{},
   565  		"abi: insufficient number of elements in the list/array for unpack, want 2, got 1",
   566  		"Can not unpack into a slice with wrong types",
   567  	}}
   568  	for _, tc := range testCases {
   569  		tc := tc
   570  		t.Run(tc.name, func(t *testing.T) {
   571  			require := require.New(t)
   572  			err := abi.Unpack(tc.dest, "multi", data)
   573  			if tc.error == "" {
   574  				require.Nil(err, "Should be able to unpack method outputs.")
   575  				require.Equal(tc.expected, tc.dest)
   576  			} else {
   577  				require.EqualError(err, tc.error)
   578  			}
   579  		})
   580  	}
   581  }
   582  
   583  func TestMultiReturnWithArray(t *testing.T) {
   584  	const definition = `[{"name" : "multi", "outputs": [{"type": "uint64[3]"}, {"type": "uint64"}]}]`
   585  	abi, err := JSON(strings.NewReader(definition))
   586  	if err != nil {
   587  		t.Fatal(err)
   588  	}
   589  	buff := new(bytes.Buffer)
   590  	buff.Write(common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000009"))
   591  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000008"))
   592  
   593  	ret1, ret1Exp := new([3]uint64), [3]uint64{9, 9, 9}
   594  	ret2, ret2Exp := new(uint64), uint64(8)
   595  	if err := abi.Unpack(&[]interface{}{ret1, ret2}, "multi", buff.Bytes()); err != nil {
   596  		t.Fatal(err)
   597  	}
   598  	if !reflect.DeepEqual(*ret1, ret1Exp) {
   599  		t.Error("array result", *ret1, "!= Expected", ret1Exp)
   600  	}
   601  	if *ret2 != ret2Exp {
   602  		t.Error("int result", *ret2, "!= Expected", ret2Exp)
   603  	}
   604  }
   605  
   606  func TestMultiReturnWithStringArray(t *testing.T) {
   607  	const definition = `[{"name" : "multi", "outputs": [{"name": "","type": "uint256[3]"},{"name": "","type": "address"},{"name": "","type": "string[2]"},{"name": "","type": "bool"}]}]`
   608  	abi, err := JSON(strings.NewReader(definition))
   609  	if err != nil {
   610  		t.Fatal(err)
   611  	}
   612  	buff := new(bytes.Buffer)
   613  	buff.Write(common.Hex2Bytes("000000000000000000000000000000000000000000000000000000005c1b78ea0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000001a055690d9db80000000000000000000000000000ab1257528b3782fb40d7ed5f72e624b744dffb2f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000008457468657265756d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001048656c6c6f2c20457468657265756d2100000000000000000000000000000000"))
   614  	temp, _ := big.NewInt(0).SetString("30000000000000000000", 10)
   615  	ret1, ret1Exp := new([3]*big.Int), [3]*big.Int{big.NewInt(1545304298), big.NewInt(6), temp}
   616  	ret2, ret2Exp := new(common.Address), common.HexToAddress("ab1257528b3782fb40d7ed5f72e624b744dffb2f")
   617  	ret3, ret3Exp := new([2]string), [2]string{"Ethereum", "Hello, Ethereum!"}
   618  	ret4, ret4Exp := new(bool), false
   619  	if err := abi.Unpack(&[]interface{}{ret1, ret2, ret3, ret4}, "multi", buff.Bytes()); err != nil {
   620  		t.Fatal(err)
   621  	}
   622  	if !reflect.DeepEqual(*ret1, ret1Exp) {
   623  		t.Error("big.Int array result", *ret1, "!= Expected", ret1Exp)
   624  	}
   625  	if !reflect.DeepEqual(*ret2, ret2Exp) {
   626  		t.Error("address result", *ret2, "!= Expected", ret2Exp)
   627  	}
   628  	if !reflect.DeepEqual(*ret3, ret3Exp) {
   629  		t.Error("string array result", *ret3, "!= Expected", ret3Exp)
   630  	}
   631  	if !reflect.DeepEqual(*ret4, ret4Exp) {
   632  		t.Error("bool result", *ret4, "!= Expected", ret4Exp)
   633  	}
   634  }
   635  
   636  func TestMultiReturnWithStringSlice(t *testing.T) {
   637  	const definition = `[{"name" : "multi", "outputs": [{"name": "","type": "string[]"},{"name": "","type": "uint256[]"}]}]`
   638  	abi, err := JSON(strings.NewReader(definition))
   639  	if err != nil {
   640  		t.Fatal(err)
   641  	}
   642  	buff := new(bytes.Buffer)
   643  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040")) // output[0] offset
   644  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000120")) // output[1] offset
   645  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")) // output[0] length
   646  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040")) // output[0][0] offset
   647  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000080")) // output[0][1] offset
   648  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000008")) // output[0][0] length
   649  	buff.Write(common.Hex2Bytes("657468657265756d000000000000000000000000000000000000000000000000")) // output[0][0] value
   650  	buff.Write(common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000b")) // output[0][1] length
   651  	buff.Write(common.Hex2Bytes("676f2d657468657265756d000000000000000000000000000000000000000000")) // output[0][1] value
   652  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")) // output[1] length
   653  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000064")) // output[1][0] value
   654  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000065")) // output[1][1] value
   655  	ret1, ret1Exp := new([]string), []string{"ethereum", "go-ethereum"}
   656  	ret2, ret2Exp := new([]*big.Int), []*big.Int{big.NewInt(100), big.NewInt(101)}
   657  	if err := abi.Unpack(&[]interface{}{ret1, ret2}, "multi", buff.Bytes()); err != nil {
   658  		t.Fatal(err)
   659  	}
   660  	if !reflect.DeepEqual(*ret1, ret1Exp) {
   661  		t.Error("string slice result", *ret1, "!= Expected", ret1Exp)
   662  	}
   663  	if !reflect.DeepEqual(*ret2, ret2Exp) {
   664  		t.Error("uint256 slice result", *ret2, "!= Expected", ret2Exp)
   665  	}
   666  }
   667  
   668  func TestMultiReturnWithDeeplyNestedArray(t *testing.T) {
   669  	// Similar to TestMultiReturnWithArray, but with a special case in mind:
   670  	//  values of nested static arrays count towards the size as well, and any element following
   671  	//  after such nested array argument should be read with the correct offset,
   672  	//  so that it does not read content from the previous array argument.
   673  	const definition = `[{"name" : "multi", "outputs": [{"type": "uint64[3][2][4]"}, {"type": "uint64"}]}]`
   674  	abi, err := JSON(strings.NewReader(definition))
   675  	if err != nil {
   676  		t.Fatal(err)
   677  	}
   678  	buff := new(bytes.Buffer)
   679  	// construct the test array, each 3 char element is joined with 61 '0' chars,
   680  	// to from the ((3 + 61) * 0.5) = 32 byte elements in the array.
   681  	buff.Write(common.Hex2Bytes(strings.Join([]string{
   682  		"", //empty, to apply the 61-char separator to the first element as well.
   683  		"111", "112", "113", "121", "122", "123",
   684  		"211", "212", "213", "221", "222", "223",
   685  		"311", "312", "313", "321", "322", "323",
   686  		"411", "412", "413", "421", "422", "423",
   687  	}, "0000000000000000000000000000000000000000000000000000000000000")))
   688  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000009876"))
   689  
   690  	ret1, ret1Exp := new([4][2][3]uint64), [4][2][3]uint64{
   691  		{{0x111, 0x112, 0x113}, {0x121, 0x122, 0x123}},
   692  		{{0x211, 0x212, 0x213}, {0x221, 0x222, 0x223}},
   693  		{{0x311, 0x312, 0x313}, {0x321, 0x322, 0x323}},
   694  		{{0x411, 0x412, 0x413}, {0x421, 0x422, 0x423}},
   695  	}
   696  	ret2, ret2Exp := new(uint64), uint64(0x9876)
   697  	if err := abi.Unpack(&[]interface{}{ret1, ret2}, "multi", buff.Bytes()); err != nil {
   698  		t.Fatal(err)
   699  	}
   700  	if !reflect.DeepEqual(*ret1, ret1Exp) {
   701  		t.Error("array result", *ret1, "!= Expected", ret1Exp)
   702  	}
   703  	if *ret2 != ret2Exp {
   704  		t.Error("int result", *ret2, "!= Expected", ret2Exp)
   705  	}
   706  }
   707  
   708  func TestUnmarshal(t *testing.T) {
   709  	const definition = `[
   710  	{ "name" : "int", "constant" : false, "outputs": [ { "type": "uint256" } ] },
   711  	{ "name" : "bool", "constant" : false, "outputs": [ { "type": "bool" } ] },
   712  	{ "name" : "bytes", "constant" : false, "outputs": [ { "type": "bytes" } ] },
   713  	{ "name" : "fixed", "constant" : false, "outputs": [ { "type": "bytes32" } ] },
   714  	{ "name" : "multi", "constant" : false, "outputs": [ { "type": "bytes" }, { "type": "bytes" } ] },
   715  	{ "name" : "intArraySingle", "constant" : false, "outputs": [ { "type": "uint256[3]" } ] },
   716  	{ "name" : "addressSliceSingle", "constant" : false, "outputs": [ { "type": "address[]" } ] },
   717  	{ "name" : "addressSliceDouble", "constant" : false, "outputs": [ { "name": "a", "type": "address[]" }, { "name": "b", "type": "address[]" } ] },
   718  	{ "name" : "mixedBytes", "constant" : true, "outputs": [ { "name": "a", "type": "bytes" }, { "name": "b", "type": "bytes32" } ] }]`
   719  
   720  	abi, err := JSON(strings.NewReader(definition))
   721  	if err != nil {
   722  		t.Fatal(err)
   723  	}
   724  	buff := new(bytes.Buffer)
   725  
   726  	// marshall mixed bytes (mixedBytes)
   727  	p0, p0Exp := []byte{}, common.Hex2Bytes("01020000000000000000")
   728  	p1, p1Exp := [32]byte{}, common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000ddeeff")
   729  	mixedBytes := []interface{}{&p0, &p1}
   730  
   731  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040"))
   732  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000ddeeff"))
   733  	buff.Write(common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000a"))
   734  	buff.Write(common.Hex2Bytes("0102000000000000000000000000000000000000000000000000000000000000"))
   735  
   736  	err = abi.Unpack(&mixedBytes, "mixedBytes", buff.Bytes())
   737  	if err != nil {
   738  		t.Error(err)
   739  	} else {
   740  		if !bytes.Equal(p0, p0Exp) {
   741  			t.Errorf("unexpected value unpacked: want %x, got %x", p0Exp, p0)
   742  		}
   743  
   744  		if !bytes.Equal(p1[:], p1Exp) {
   745  			t.Errorf("unexpected value unpacked: want %x, got %x", p1Exp, p1)
   746  		}
   747  	}
   748  
   749  	// marshal int
   750  	var Int *big.Int
   751  	err = abi.Unpack(&Int, "int", common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"))
   752  	if err != nil {
   753  		t.Error(err)
   754  	}
   755  
   756  	if Int == nil || Int.Cmp(big.NewInt(1)) != 0 {
   757  		t.Error("expected Int to be 1 got", Int)
   758  	}
   759  
   760  	// marshal bool
   761  	var Bool bool
   762  	err = abi.Unpack(&Bool, "bool", common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"))
   763  	if err != nil {
   764  		t.Error(err)
   765  	}
   766  
   767  	if !Bool {
   768  		t.Error("expected Bool to be true")
   769  	}
   770  
   771  	// marshal dynamic bytes max length 32
   772  	buff.Reset()
   773  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020"))
   774  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020"))
   775  	bytesOut := common.RightPadBytes([]byte("hello"), 32)
   776  	buff.Write(bytesOut)
   777  
   778  	var Bytes []byte
   779  	err = abi.Unpack(&Bytes, "bytes", buff.Bytes())
   780  	if err != nil {
   781  		t.Error(err)
   782  	}
   783  
   784  	if !bytes.Equal(Bytes, bytesOut) {
   785  		t.Errorf("expected %x got %x", bytesOut, Bytes)
   786  	}
   787  
   788  	// marshall dynamic bytes max length 64
   789  	buff.Reset()
   790  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020"))
   791  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040"))
   792  	bytesOut = common.RightPadBytes([]byte("hello"), 64)
   793  	buff.Write(bytesOut)
   794  
   795  	err = abi.Unpack(&Bytes, "bytes", buff.Bytes())
   796  	if err != nil {
   797  		t.Error(err)
   798  	}
   799  
   800  	if !bytes.Equal(Bytes, bytesOut) {
   801  		t.Errorf("expected %x got %x", bytesOut, Bytes)
   802  	}
   803  
   804  	// marshall dynamic bytes max length 64
   805  	buff.Reset()
   806  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020"))
   807  	buff.Write(common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000003f"))
   808  	bytesOut = common.RightPadBytes([]byte("hello"), 64)
   809  	buff.Write(bytesOut)
   810  
   811  	err = abi.Unpack(&Bytes, "bytes", buff.Bytes())
   812  	if err != nil {
   813  		t.Error(err)
   814  	}
   815  
   816  	if !bytes.Equal(Bytes, bytesOut[:len(bytesOut)-1]) {
   817  		t.Errorf("expected %x got %x", bytesOut[:len(bytesOut)-1], Bytes)
   818  	}
   819  
   820  	// marshal dynamic bytes output empty
   821  	err = abi.Unpack(&Bytes, "bytes", nil)
   822  	if err == nil {
   823  		t.Error("expected error")
   824  	}
   825  
   826  	// marshal dynamic bytes length 5
   827  	buff.Reset()
   828  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020"))
   829  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000005"))
   830  	buff.Write(common.RightPadBytes([]byte("hello"), 32))
   831  
   832  	err = abi.Unpack(&Bytes, "bytes", buff.Bytes())
   833  	if err != nil {
   834  		t.Error(err)
   835  	}
   836  
   837  	if !bytes.Equal(Bytes, []byte("hello")) {
   838  		t.Errorf("expected %x got %x", bytesOut, Bytes)
   839  	}
   840  
   841  	// marshal dynamic bytes length 5
   842  	buff.Reset()
   843  	buff.Write(common.RightPadBytes([]byte("hello"), 32))
   844  
   845  	var hash common.Hash
   846  	err = abi.Unpack(&hash, "fixed", buff.Bytes())
   847  	if err != nil {
   848  		t.Error(err)
   849  	}
   850  
   851  	helloHash := common.BytesToHash(common.RightPadBytes([]byte("hello"), 32))
   852  	if hash != helloHash {
   853  		t.Errorf("Expected %x to equal %x", hash, helloHash)
   854  	}
   855  
   856  	// marshal error
   857  	buff.Reset()
   858  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020"))
   859  	err = abi.Unpack(&Bytes, "bytes", buff.Bytes())
   860  	if err == nil {
   861  		t.Error("expected error")
   862  	}
   863  
   864  	err = abi.Unpack(&Bytes, "multi", make([]byte, 64))
   865  	if err == nil {
   866  		t.Error("expected error")
   867  	}
   868  
   869  	buff.Reset()
   870  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"))
   871  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"))
   872  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000003"))
   873  	// marshal int array
   874  	var intArray [3]*big.Int
   875  	err = abi.Unpack(&intArray, "intArraySingle", buff.Bytes())
   876  	if err != nil {
   877  		t.Error(err)
   878  	}
   879  	var testAgainstIntArray [3]*big.Int
   880  	testAgainstIntArray[0] = big.NewInt(1)
   881  	testAgainstIntArray[1] = big.NewInt(2)
   882  	testAgainstIntArray[2] = big.NewInt(3)
   883  
   884  	for i, Int := range intArray {
   885  		if Int.Cmp(testAgainstIntArray[i]) != 0 {
   886  			t.Errorf("expected %v, got %v", testAgainstIntArray[i], Int)
   887  		}
   888  	}
   889  	// marshal address slice
   890  	buff.Reset()
   891  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020")) // offset
   892  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) // size
   893  	buff.Write(common.Hex2Bytes("0000000000000000000000000100000000000000000000000000000000000000"))
   894  
   895  	var outAddr []common.Address
   896  	err = abi.Unpack(&outAddr, "addressSliceSingle", buff.Bytes())
   897  	if err != nil {
   898  		t.Fatal("didn't expect error:", err)
   899  	}
   900  
   901  	if len(outAddr) != 1 {
   902  		t.Fatal("expected 1 item, got", len(outAddr))
   903  	}
   904  
   905  	if outAddr[0] != (common.Address{1}) {
   906  		t.Errorf("expected %x, got %x", common.Address{1}, outAddr[0])
   907  	}
   908  
   909  	// marshal multiple address slice
   910  	buff.Reset()
   911  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040")) // offset
   912  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000080")) // offset
   913  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) // size
   914  	buff.Write(common.Hex2Bytes("0000000000000000000000000100000000000000000000000000000000000000"))
   915  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")) // size
   916  	buff.Write(common.Hex2Bytes("0000000000000000000000000200000000000000000000000000000000000000"))
   917  	buff.Write(common.Hex2Bytes("0000000000000000000000000300000000000000000000000000000000000000"))
   918  
   919  	var outAddrStruct struct {
   920  		A []common.Address
   921  		B []common.Address
   922  	}
   923  	err = abi.Unpack(&outAddrStruct, "addressSliceDouble", buff.Bytes())
   924  	if err != nil {
   925  		t.Fatal("didn't expect error:", err)
   926  	}
   927  
   928  	if len(outAddrStruct.A) != 1 {
   929  		t.Fatal("expected 1 item, got", len(outAddrStruct.A))
   930  	}
   931  
   932  	if outAddrStruct.A[0] != (common.Address{1}) {
   933  		t.Errorf("expected %x, got %x", common.Address{1}, outAddrStruct.A[0])
   934  	}
   935  
   936  	if len(outAddrStruct.B) != 2 {
   937  		t.Fatal("expected 1 item, got", len(outAddrStruct.B))
   938  	}
   939  
   940  	if outAddrStruct.B[0] != (common.Address{2}) {
   941  		t.Errorf("expected %x, got %x", common.Address{2}, outAddrStruct.B[0])
   942  	}
   943  	if outAddrStruct.B[1] != (common.Address{3}) {
   944  		t.Errorf("expected %x, got %x", common.Address{3}, outAddrStruct.B[1])
   945  	}
   946  
   947  	// marshal invalid address slice
   948  	buff.Reset()
   949  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000100"))
   950  
   951  	err = abi.Unpack(&outAddr, "addressSliceSingle", buff.Bytes())
   952  	if err == nil {
   953  		t.Fatal("expected error:", err)
   954  	}
   955  }
   956  
   957  func TestUnpackTuple(t *testing.T) {
   958  	const simpleTuple = `[{"name":"tuple","constant":false,"outputs":[{"type":"tuple","name":"ret","components":[{"type":"int256","name":"a"},{"type":"int256","name":"b"}]}]}]`
   959  	abi, err := JSON(strings.NewReader(simpleTuple))
   960  	if err != nil {
   961  		t.Fatal(err)
   962  	}
   963  	buff := new(bytes.Buffer)
   964  
   965  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) // ret[a] = 1
   966  	buff.Write(common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")) // ret[b] = -1
   967  
   968  	v := struct {
   969  		Ret struct {
   970  			A *big.Int
   971  			B *big.Int
   972  		}
   973  	}{Ret: struct {
   974  		A *big.Int
   975  		B *big.Int
   976  	}{new(big.Int), new(big.Int)}}
   977  
   978  	err = abi.Unpack(&v, "tuple", buff.Bytes())
   979  	if err != nil {
   980  		t.Error(err)
   981  	} else {
   982  		if v.Ret.A.Cmp(big.NewInt(1)) != 0 {
   983  			t.Errorf("unexpected value unpacked: want %x, got %x", 1, v.Ret.A)
   984  		}
   985  		if v.Ret.B.Cmp(big.NewInt(-1)) != 0 {
   986  			t.Errorf("unexpected value unpacked: want %x, got %x", v.Ret.B, -1)
   987  		}
   988  	}
   989  
   990  	// Test nested tuple
   991  	const nestedTuple = `[{"name":"tuple","constant":false,"outputs":[
   992  		{"type":"tuple","name":"s","components":[{"type":"uint256","name":"a"},{"type":"uint256[]","name":"b"},{"type":"tuple[]","name":"c","components":[{"name":"x", "type":"uint256"},{"name":"y","type":"uint256"}]}]},
   993  		{"type":"tuple","name":"t","components":[{"name":"x", "type":"uint256"},{"name":"y","type":"uint256"}]},
   994  		{"type":"uint256","name":"a"}
   995  	]}]`
   996  
   997  	abi, err = JSON(strings.NewReader(nestedTuple))
   998  	if err != nil {
   999  		t.Fatal(err)
  1000  	}
  1001  	buff.Reset()
  1002  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000080")) // s offset
  1003  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000")) // t.X = 0
  1004  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) // t.Y = 1
  1005  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) // a = 1
  1006  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) // s.A = 1
  1007  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000060")) // s.B offset
  1008  	buff.Write(common.Hex2Bytes("00000000000000000000000000000000000000000000000000000000000000c0")) // s.C offset
  1009  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")) // s.B length
  1010  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) // s.B[0] = 1
  1011  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")) // s.B[0] = 2
  1012  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")) // s.C length
  1013  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) // s.C[0].X
  1014  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")) // s.C[0].Y
  1015  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002")) // s.C[1].X
  1016  	buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) // s.C[1].Y
  1017  
  1018  	type T struct {
  1019  		X *big.Int `abi:"x"`
  1020  		Z *big.Int `abi:"y"` // Test whether the abi tag works.
  1021  	}
  1022  
  1023  	type S struct {
  1024  		A *big.Int
  1025  		B []*big.Int
  1026  		C []T
  1027  	}
  1028  
  1029  	type Ret struct {
  1030  		FieldS S `abi:"s"`
  1031  		FieldT T `abi:"t"`
  1032  		A      *big.Int
  1033  	}
  1034  	var ret Ret
  1035  	var expected = Ret{
  1036  		FieldS: S{
  1037  			A: big.NewInt(1),
  1038  			B: []*big.Int{big.NewInt(1), big.NewInt(2)},
  1039  			C: []T{
  1040  				{big.NewInt(1), big.NewInt(2)},
  1041  				{big.NewInt(2), big.NewInt(1)},
  1042  			},
  1043  		},
  1044  		FieldT: T{
  1045  			big.NewInt(0), big.NewInt(1),
  1046  		},
  1047  		A: big.NewInt(1),
  1048  	}
  1049  
  1050  	err = abi.Unpack(&ret, "tuple", buff.Bytes())
  1051  	if err != nil {
  1052  		t.Error(err)
  1053  	}
  1054  	if reflect.DeepEqual(ret, expected) {
  1055  		t.Error("unexpected unpack value")
  1056  	}
  1057  }
  1058  
  1059  func TestOOMMaliciousInput(t *testing.T) {
  1060  	oomTests := []unpackTest{
  1061  		{
  1062  			def: `[{"type": "uint8[]"}]`,
  1063  			enc: "0000000000000000000000000000000000000000000000000000000000000020" + // offset
  1064  				"0000000000000000000000000000000000000000000000000000000000000003" + // num elems
  1065  				"0000000000000000000000000000000000000000000000000000000000000001" + // elem 1
  1066  				"0000000000000000000000000000000000000000000000000000000000000002", // elem 2
  1067  		},
  1068  		{ // Length larger than 64 bits
  1069  			def: `[{"type": "uint8[]"}]`,
  1070  			enc: "0000000000000000000000000000000000000000000000000000000000000020" + // offset
  1071  				"00ffffffffffffffffffffffffffffffffffffffffffffff0000000000000002" + // num elems
  1072  				"0000000000000000000000000000000000000000000000000000000000000001" + // elem 1
  1073  				"0000000000000000000000000000000000000000000000000000000000000002", // elem 2
  1074  		},
  1075  		{ // Offset very large (over 64 bits)
  1076  			def: `[{"type": "uint8[]"}]`,
  1077  			enc: "00ffffffffffffffffffffffffffffffffffffffffffffff0000000000000020" + // offset
  1078  				"0000000000000000000000000000000000000000000000000000000000000002" + // num elems
  1079  				"0000000000000000000000000000000000000000000000000000000000000001" + // elem 1
  1080  				"0000000000000000000000000000000000000000000000000000000000000002", // elem 2
  1081  		},
  1082  		{ // Offset very large (below 64 bits)
  1083  			def: `[{"type": "uint8[]"}]`,
  1084  			enc: "0000000000000000000000000000000000000000000000007ffffffffff00020" + // offset
  1085  				"0000000000000000000000000000000000000000000000000000000000000002" + // num elems
  1086  				"0000000000000000000000000000000000000000000000000000000000000001" + // elem 1
  1087  				"0000000000000000000000000000000000000000000000000000000000000002", // elem 2
  1088  		},
  1089  		{ // Offset negative (as 64 bit)
  1090  			def: `[{"type": "uint8[]"}]`,
  1091  			enc: "000000000000000000000000000000000000000000000000f000000000000020" + // offset
  1092  				"0000000000000000000000000000000000000000000000000000000000000002" + // num elems
  1093  				"0000000000000000000000000000000000000000000000000000000000000001" + // elem 1
  1094  				"0000000000000000000000000000000000000000000000000000000000000002", // elem 2
  1095  		},
  1096  
  1097  		{ // Negative length
  1098  			def: `[{"type": "uint8[]"}]`,
  1099  			enc: "0000000000000000000000000000000000000000000000000000000000000020" + // offset
  1100  				"000000000000000000000000000000000000000000000000f000000000000002" + // num elems
  1101  				"0000000000000000000000000000000000000000000000000000000000000001" + // elem 1
  1102  				"0000000000000000000000000000000000000000000000000000000000000002", // elem 2
  1103  		},
  1104  		{ // Very large length
  1105  			def: `[{"type": "uint8[]"}]`,
  1106  			enc: "0000000000000000000000000000000000000000000000000000000000000020" + // offset
  1107  				"0000000000000000000000000000000000000000000000007fffffffff000002" + // num elems
  1108  				"0000000000000000000000000000000000000000000000000000000000000001" + // elem 1
  1109  				"0000000000000000000000000000000000000000000000000000000000000002", // elem 2
  1110  		},
  1111  	}
  1112  	for i, test := range oomTests {
  1113  		def := fmt.Sprintf(`[{ "name" : "method", "outputs": %s}]`, test.def)
  1114  		abi, err := JSON(strings.NewReader(def))
  1115  		if err != nil {
  1116  			t.Fatalf("invalid ABI definition %s: %v", def, err)
  1117  		}
  1118  		encb, err := hex.DecodeString(test.enc)
  1119  		if err != nil {
  1120  			t.Fatalf("invalid hex: %s" + test.enc)
  1121  		}
  1122  		_, err = abi.Methods["method"].Outputs.UnpackValues(encb)
  1123  		if err == nil {
  1124  			t.Fatalf("Expected error on malicious input, test %d", i)
  1125  		}
  1126  	}
  1127  }