mirror of https://github.com/ethereum/go-ethereum
accounts/abi: added abi test cases, minor bug fixes (#20903)
* accounts/abi: added documentation * accounts/abi: reduced usage of arguments.LengthNonIndexed * accounts/abi: simplified reflection logic * accounts/abi: moved testjson data into global declaration * accounts/abi: removed duplicate test cases * accounts/abi: reworked abi tests * accounts/abi: added more tests for abi packing * accounts/abi/bind: refactored base tests * accounts/abi: run pack tests as subtests * accounts/abi: removed duplicate tests * accounts/abi: removed unnused arguments.LengthNonIndexed Due to refactors to the code, we do not need the arguments.LengthNonIndexed function anymore. You can still get the length by calling len(arguments.NonIndexed()) * accounts/abi: added type test * accounts/abi: modified unpack test to pack test * accounts/abi: length check on arrayTy * accounts/abi: test invalid abi * accounts/abi: fixed rebase error * accounts/abi: fixed rebase errors * accounts/abi: removed unused definition * accounts/abi: merged packing/unpacking tests * accounts/abi: fixed [][][32]bytes encoding * accounts/abi: added tuple test cases * accounts/abi: renamed getMockLog -> newMockLog * accounts/abi: removed duplicate test * accounts/abi: bools -> booleanspull/20992/head
parent
40283d0522
commit
e32ee6ac05
@ -0,0 +1,988 @@ |
|||||||
|
// Copyright 2020 The go-ethereum Authors
|
||||||
|
// This file is part of the go-ethereum library.
|
||||||
|
//
|
||||||
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public License
|
||||||
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
package abi |
||||||
|
|
||||||
|
import ( |
||||||
|
"math/big" |
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/common" |
||||||
|
) |
||||||
|
|
||||||
|
type packUnpackTest struct { |
||||||
|
def string |
||||||
|
unpacked interface{} |
||||||
|
packed string |
||||||
|
} |
||||||
|
|
||||||
|
var packUnpackTests = []packUnpackTest{ |
||||||
|
// Booleans
|
||||||
|
{ |
||||||
|
def: `[{ "type": "bool" }]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001", |
||||||
|
unpacked: true, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{ "type": "bool" }]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000000", |
||||||
|
unpacked: false, |
||||||
|
}, |
||||||
|
// Integers
|
||||||
|
{ |
||||||
|
def: `[{ "type": "uint8" }]`, |
||||||
|
unpacked: uint8(2), |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{ "type": "uint8[]" }]`, |
||||||
|
unpacked: []uint8{1, 2}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{ "type": "uint16" }]`, |
||||||
|
unpacked: uint16(2), |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{ "type": "uint16[]" }]`, |
||||||
|
unpacked: []uint16{1, 2}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint17"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001", |
||||||
|
unpacked: big.NewInt(1), |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint32"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001", |
||||||
|
unpacked: uint32(1), |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint32[]"}]`, |
||||||
|
unpacked: []uint32{1, 2}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint64"}]`, |
||||||
|
unpacked: uint64(2), |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint64[]"}]`, |
||||||
|
unpacked: []uint64{1, 2}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint256"}]`, |
||||||
|
unpacked: big.NewInt(2), |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint256[]"}]`, |
||||||
|
unpacked: []*big.Int{big.NewInt(1), big.NewInt(2)}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int8"}]`, |
||||||
|
unpacked: int8(2), |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int8[]"}]`, |
||||||
|
unpacked: []int8{1, 2}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int16"}]`, |
||||||
|
unpacked: int16(2), |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int16[]"}]`, |
||||||
|
unpacked: []int16{1, 2}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int17"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001", |
||||||
|
unpacked: big.NewInt(1), |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int32"}]`, |
||||||
|
unpacked: int32(2), |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int32"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001", |
||||||
|
unpacked: int32(1), |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int32[]"}]`, |
||||||
|
unpacked: []int32{1, 2}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int64"}]`, |
||||||
|
unpacked: int64(2), |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int64[]"}]`, |
||||||
|
unpacked: []int64{1, 2}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int256"}]`, |
||||||
|
unpacked: big.NewInt(2), |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int256"}]`, |
||||||
|
packed: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", |
||||||
|
unpacked: big.NewInt(-1), |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int256[]"}]`, |
||||||
|
unpacked: []*big.Int{big.NewInt(1), big.NewInt(2)}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
}, |
||||||
|
// Address
|
||||||
|
{ |
||||||
|
def: `[{"type": "address"}]`, |
||||||
|
packed: "0000000000000000000000000100000000000000000000000000000000000000", |
||||||
|
unpacked: common.Address{1}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "address[]"}]`, |
||||||
|
unpacked: []common.Address{{1}, {2}}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000100000000000000000000000000000000000000" + |
||||||
|
"0000000000000000000000000200000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
// Bytes
|
||||||
|
{ |
||||||
|
def: `[{"type": "bytes1"}]`, |
||||||
|
unpacked: [1]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes2"}]`, |
||||||
|
unpacked: [2]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes3"}]`, |
||||||
|
unpacked: [3]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes4"}]`, |
||||||
|
unpacked: [4]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes5"}]`, |
||||||
|
unpacked: [5]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes6"}]`, |
||||||
|
unpacked: [6]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes7"}]`, |
||||||
|
unpacked: [7]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes8"}]`, |
||||||
|
unpacked: [8]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes9"}]`, |
||||||
|
unpacked: [9]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes10"}]`, |
||||||
|
unpacked: [10]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes11"}]`, |
||||||
|
unpacked: [11]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes12"}]`, |
||||||
|
unpacked: [12]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes13"}]`, |
||||||
|
unpacked: [13]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes14"}]`, |
||||||
|
unpacked: [14]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes15"}]`, |
||||||
|
unpacked: [15]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes16"}]`, |
||||||
|
unpacked: [16]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes17"}]`, |
||||||
|
unpacked: [17]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes18"}]`, |
||||||
|
unpacked: [18]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes19"}]`, |
||||||
|
unpacked: [19]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes20"}]`, |
||||||
|
unpacked: [20]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes21"}]`, |
||||||
|
unpacked: [21]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes22"}]`, |
||||||
|
unpacked: [22]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes23"}]`, |
||||||
|
unpacked: [23]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes24"}]`, |
||||||
|
unpacked: [24]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes25"}]`, |
||||||
|
unpacked: [25]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes26"}]`, |
||||||
|
unpacked: [26]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes27"}]`, |
||||||
|
unpacked: [27]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes28"}]`, |
||||||
|
unpacked: [28]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes29"}]`, |
||||||
|
unpacked: [29]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes30"}]`, |
||||||
|
unpacked: [30]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes31"}]`, |
||||||
|
unpacked: [31]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes32"}]`, |
||||||
|
unpacked: [32]byte{1}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes32"}]`, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
unpacked: [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}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
unpacked: common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"), |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes32"}]`, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
unpacked: [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}, |
||||||
|
}, |
||||||
|
// Functions
|
||||||
|
{ |
||||||
|
def: `[{"type": "function"}]`, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000", |
||||||
|
unpacked: [24]byte{1}, |
||||||
|
}, |
||||||
|
// Slice and Array
|
||||||
|
{ |
||||||
|
def: `[{"type": "uint8[]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: []uint8{1, 2}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint8[]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000", |
||||||
|
unpacked: []uint8{}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint256[]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000", |
||||||
|
unpacked: []*big.Int{}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint8[2]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: [2]uint8{1, 2}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int8[2]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: [2]int8{1, 2}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int16[]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: []int16{1, 2}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int16[2]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: [2]int16{1, 2}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int32[]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: []int32{1, 2}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int32[2]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: [2]int32{1, 2}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int64[]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: []int64{1, 2}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int64[2]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: [2]int64{1, 2}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int256[]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: []*big.Int{big.NewInt(1), big.NewInt(2)}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "int256[3]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000003", |
||||||
|
unpacked: [3]*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}, |
||||||
|
}, |
||||||
|
// multi dimensional, if these pass, all types that don't require length prefix should pass
|
||||||
|
{ |
||||||
|
def: `[{"type": "uint8[][]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000", |
||||||
|
unpacked: [][]uint8{}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint8[][]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000040" + |
||||||
|
"00000000000000000000000000000000000000000000000000000000000000a0" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: [][]uint8{{1, 2}, {1, 2}}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint8[][]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000040" + |
||||||
|
"00000000000000000000000000000000000000000000000000000000000000a0" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000003" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000003", |
||||||
|
unpacked: [][]uint8{{1, 2}, {1, 2, 3}}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint8[2][2]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: [2][2]uint8{{1, 2}, {1, 2}}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint8[][2]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000040" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000060" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000", |
||||||
|
unpacked: [2][]uint8{{}, {}}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint8[][2]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000040" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000080" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001", |
||||||
|
unpacked: [2][]uint8{{1}, {1}}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint8[2][]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000", |
||||||
|
unpacked: [][2]uint8{}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint8[2][]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: [][2]uint8{{1, 2}}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint8[2][]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: [][2]uint8{{1, 2}, {1, 2}}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint16[]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: []uint16{1, 2}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint16[2]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: [2]uint16{1, 2}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint32[]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: []uint32{1, 2}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint32[2][3][4]"}]`, |
||||||
|
unpacked: [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}}}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000003" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000004" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000005" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000006" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000007" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000008" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000009" + |
||||||
|
"000000000000000000000000000000000000000000000000000000000000000a" + |
||||||
|
"000000000000000000000000000000000000000000000000000000000000000b" + |
||||||
|
"000000000000000000000000000000000000000000000000000000000000000c" + |
||||||
|
"000000000000000000000000000000000000000000000000000000000000000d" + |
||||||
|
"000000000000000000000000000000000000000000000000000000000000000e" + |
||||||
|
"000000000000000000000000000000000000000000000000000000000000000f" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000010" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000011" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000012" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000013" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000014" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000015" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000016" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000017" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000018", |
||||||
|
}, |
||||||
|
|
||||||
|
{ |
||||||
|
def: `[{"type": "bytes32[]"}]`, |
||||||
|
unpacked: []common.Hash{{1}, {2}}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0100000000000000000000000000000000000000000000000000000000000000" + |
||||||
|
"0200000000000000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint32[2]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: [2]uint32{1, 2}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint64[]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: []uint64{1, 2}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint64[2]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: [2]uint64{1, 2}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint256[]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: []*big.Int{big.NewInt(1), big.NewInt(2)}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint256[3]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000003", |
||||||
|
unpacked: [3]*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "string[4]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000080" + |
||||||
|
"00000000000000000000000000000000000000000000000000000000000000c0" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000100" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000140" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000005" + |
||||||
|
"48656c6c6f000000000000000000000000000000000000000000000000000000" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000005" + |
||||||
|
"576f726c64000000000000000000000000000000000000000000000000000000" + |
||||||
|
"000000000000000000000000000000000000000000000000000000000000000b" + |
||||||
|
"476f2d657468657265756d000000000000000000000000000000000000000000" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000008" + |
||||||
|
"457468657265756d000000000000000000000000000000000000000000000000", |
||||||
|
unpacked: [4]string{"Hello", "World", "Go-ethereum", "Ethereum"}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "string[]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000040" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000080" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000008" + |
||||||
|
"457468657265756d000000000000000000000000000000000000000000000000" + |
||||||
|
"000000000000000000000000000000000000000000000000000000000000000b" + |
||||||
|
"676f2d657468657265756d000000000000000000000000000000000000000000", |
||||||
|
unpacked: []string{"Ethereum", "go-ethereum"}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes[]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000040" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000080" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000003" + |
||||||
|
"f0f0f00000000000000000000000000000000000000000000000000000000000" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000003" + |
||||||
|
"f0f0f00000000000000000000000000000000000000000000000000000000000", |
||||||
|
unpacked: [][]byte{{0xf0, 0xf0, 0xf0}, {0xf0, 0xf0, 0xf0}}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "uint256[2][][]"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000040" + |
||||||
|
"00000000000000000000000000000000000000000000000000000000000000e0" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"00000000000000000000000000000000000000000000000000000000000000c8" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"00000000000000000000000000000000000000000000000000000000000003e8" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"00000000000000000000000000000000000000000000000000000000000000c8" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"00000000000000000000000000000000000000000000000000000000000003e8", |
||||||
|
unpacked: [][][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)}}}, |
||||||
|
}, |
||||||
|
// struct outputs
|
||||||
|
{ |
||||||
|
def: `[{"name":"int1","type":"int256"},{"name":"int2","type":"int256"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: struct { |
||||||
|
Int1 *big.Int |
||||||
|
Int2 *big.Int |
||||||
|
}{big.NewInt(1), big.NewInt(2)}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"name":"int_one","type":"int256"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001", |
||||||
|
unpacked: struct { |
||||||
|
IntOne *big.Int |
||||||
|
}{big.NewInt(1)}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"name":"int__one","type":"int256"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001", |
||||||
|
unpacked: struct { |
||||||
|
IntOne *big.Int |
||||||
|
}{big.NewInt(1)}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"name":"int_one_","type":"int256"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001", |
||||||
|
unpacked: struct { |
||||||
|
IntOne *big.Int |
||||||
|
}{big.NewInt(1)}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"name":"int_one","type":"int256"}, {"name":"intone","type":"int256"}]`, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", |
||||||
|
unpacked: struct { |
||||||
|
IntOne *big.Int |
||||||
|
Intone *big.Int |
||||||
|
}{big.NewInt(1), big.NewInt(2)}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "string"}]`, |
||||||
|
unpacked: "foobar", |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000006" + |
||||||
|
"666f6f6261720000000000000000000000000000000000000000000000000000", |
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "string[]"}]`, |
||||||
|
unpacked: []string{"hello", "foobar"}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + // len(array) = 2
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000040" + // offset 64 to i = 0
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000080" + // offset 128 to i = 1
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000005" + // len(str[0]) = 5
|
||||||
|
"68656c6c6f000000000000000000000000000000000000000000000000000000" + // str[0]
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000006" + // len(str[1]) = 6
|
||||||
|
"666f6f6261720000000000000000000000000000000000000000000000000000", // str[1]
|
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "string[2]"}]`, |
||||||
|
unpacked: [2]string{"hello", "foobar"}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000040" + // offset to i = 0
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000080" + // offset to i = 1
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000005" + // len(str[0]) = 5
|
||||||
|
"68656c6c6f000000000000000000000000000000000000000000000000000000" + // str[0]
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000006" + // len(str[1]) = 6
|
||||||
|
"666f6f6261720000000000000000000000000000000000000000000000000000", // str[1]
|
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes32[][]"}]`, |
||||||
|
unpacked: [][][32]byte{{{1}, {2}}, {{3}, {4}, {5}}}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + // len(array) = 2
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000040" + // offset 64 to i = 0
|
||||||
|
"00000000000000000000000000000000000000000000000000000000000000a0" + // offset 160 to i = 1
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + // len(array[0]) = 2
|
||||||
|
"0100000000000000000000000000000000000000000000000000000000000000" + // array[0][0]
|
||||||
|
"0200000000000000000000000000000000000000000000000000000000000000" + // array[0][1]
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000003" + // len(array[1]) = 3
|
||||||
|
"0300000000000000000000000000000000000000000000000000000000000000" + // array[1][0]
|
||||||
|
"0400000000000000000000000000000000000000000000000000000000000000" + // array[1][1]
|
||||||
|
"0500000000000000000000000000000000000000000000000000000000000000", // array[1][2]
|
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes32[][2]"}]`, |
||||||
|
unpacked: [2][][32]byte{{{1}, {2}}, {{3}, {4}, {5}}}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000040" + // offset 64 to i = 0
|
||||||
|
"00000000000000000000000000000000000000000000000000000000000000a0" + // offset 160 to i = 1
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + // len(array[0]) = 2
|
||||||
|
"0100000000000000000000000000000000000000000000000000000000000000" + // array[0][0]
|
||||||
|
"0200000000000000000000000000000000000000000000000000000000000000" + // array[0][1]
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000003" + // len(array[1]) = 3
|
||||||
|
"0300000000000000000000000000000000000000000000000000000000000000" + // array[1][0]
|
||||||
|
"0400000000000000000000000000000000000000000000000000000000000000" + // array[1][1]
|
||||||
|
"0500000000000000000000000000000000000000000000000000000000000000", // array[1][2]
|
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"type": "bytes32[3][2]"}]`, |
||||||
|
unpacked: [2][3][32]byte{{{1}, {2}, {3}}, {{3}, {4}, {5}}}, |
||||||
|
packed: "0100000000000000000000000000000000000000000000000000000000000000" + // array[0][0]
|
||||||
|
"0200000000000000000000000000000000000000000000000000000000000000" + // array[0][1]
|
||||||
|
"0300000000000000000000000000000000000000000000000000000000000000" + // array[0][2]
|
||||||
|
"0300000000000000000000000000000000000000000000000000000000000000" + // array[1][0]
|
||||||
|
"0400000000000000000000000000000000000000000000000000000000000000" + // array[1][1]
|
||||||
|
"0500000000000000000000000000000000000000000000000000000000000000", // array[1][2]
|
||||||
|
}, |
||||||
|
{ |
||||||
|
// static tuple
|
||||||
|
def: `[{"name":"a","type":"int64"},
|
||||||
|
{"name":"b","type":"int256"},
|
||||||
|
{"name":"c","type":"int256"},
|
||||||
|
{"name":"d","type":"bool"}, |
||||||
|
{"name":"e","type":"bytes32[3][2]"}]`, |
||||||
|
unpacked: struct { |
||||||
|
A int64 |
||||||
|
B *big.Int |
||||||
|
C *big.Int |
||||||
|
D bool |
||||||
|
E [2][3][32]byte |
||||||
|
}{1, big.NewInt(1), big.NewInt(-1), true, [2][3][32]byte{{{1}, {2}, {3}}, {{3}, {4}, {5}}}}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000001" + // struct[a]
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + // struct[b]
|
||||||
|
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + // struct[c]
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + // struct[d]
|
||||||
|
"0100000000000000000000000000000000000000000000000000000000000000" + // struct[e] array[0][0]
|
||||||
|
"0200000000000000000000000000000000000000000000000000000000000000" + // struct[e] array[0][1]
|
||||||
|
"0300000000000000000000000000000000000000000000000000000000000000" + // struct[e] array[0][2]
|
||||||
|
"0300000000000000000000000000000000000000000000000000000000000000" + // struct[e] array[1][0]
|
||||||
|
"0400000000000000000000000000000000000000000000000000000000000000" + // struct[e] array[1][1]
|
||||||
|
"0500000000000000000000000000000000000000000000000000000000000000", // struct[e] array[1][2]
|
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"name":"a","type":"string"},
|
||||||
|
{"name":"b","type":"int64"},
|
||||||
|
{"name":"c","type":"bytes"},
|
||||||
|
{"name":"d","type":"string[]"}, |
||||||
|
{"name":"e","type":"int256[]"}, |
||||||
|
{"name":"f","type":"address[]"}]`, |
||||||
|
unpacked: struct { |
||||||
|
FieldA string `abi:"a"` // Test whether abi tag works
|
||||||
|
FieldB int64 `abi:"b"` |
||||||
|
C []byte |
||||||
|
D []string |
||||||
|
E []*big.Int |
||||||
|
F []common.Address |
||||||
|
}{"foobar", 1, []byte{1}, []string{"foo", "bar"}, []*big.Int{big.NewInt(1), big.NewInt(-1)}, []common.Address{{1}, {2}}}, |
||||||
|
packed: "00000000000000000000000000000000000000000000000000000000000000c0" + // struct[a] offset
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + // struct[b]
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000100" + // struct[c] offset
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000140" + // struct[d] offset
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000220" + // struct[e] offset
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000280" + // struct[f] offset
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000006" + // struct[a] length
|
||||||
|
"666f6f6261720000000000000000000000000000000000000000000000000000" + // struct[a] "foobar"
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + // struct[c] length
|
||||||
|
"0100000000000000000000000000000000000000000000000000000000000000" + // []byte{1}
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + // struct[d] length
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000040" + // foo offset
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000080" + // bar offset
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000003" + // foo length
|
||||||
|
"666f6f0000000000000000000000000000000000000000000000000000000000" + // foo
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000003" + // bar offset
|
||||||
|
"6261720000000000000000000000000000000000000000000000000000000000" + // bar
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + // struct[e] length
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + // 1
|
||||||
|
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + // -1
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + // struct[f] length
|
||||||
|
"0000000000000000000000000100000000000000000000000000000000000000" + // common.Address{1}
|
||||||
|
"0000000000000000000000000200000000000000000000000000000000000000", // common.Address{2}
|
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"components": [{"name": "a","type": "uint256"},
|
||||||
|
{"name": "b","type": "uint256[]"}],
|
||||||
|
"name": "a","type": "tuple"}, |
||||||
|
{"name": "b","type": "uint256[]"}]`, |
||||||
|
unpacked: struct { |
||||||
|
A struct { |
||||||
|
FieldA *big.Int `abi:"a"` |
||||||
|
B []*big.Int |
||||||
|
} |
||||||
|
B []*big.Int |
||||||
|
}{ |
||||||
|
A: struct { |
||||||
|
FieldA *big.Int `abi:"a"` // Test whether abi tag works for nested tuple
|
||||||
|
B []*big.Int |
||||||
|
}{big.NewInt(1), []*big.Int{big.NewInt(1), big.NewInt(2)}}, |
||||||
|
B: []*big.Int{big.NewInt(1), big.NewInt(2)}}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000040" + // a offset
|
||||||
|
"00000000000000000000000000000000000000000000000000000000000000e0" + // b offset
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + // a.a value
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000040" + // a.b offset
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + // a.b length
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + // a.b[0] value
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + // a.b[1] value
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + // b length
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + // b[0] value
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002", // b[1] value
|
||||||
|
}, |
||||||
|
|
||||||
|
{ |
||||||
|
def: `[{"components": [{"name": "a","type": "int256"},
|
||||||
|
{"name": "b","type": "int256[]"}],
|
||||||
|
"name": "a","type": "tuple[]"}]`, |
||||||
|
unpacked: []struct { |
||||||
|
A *big.Int |
||||||
|
B []*big.Int |
||||||
|
}{ |
||||||
|
{big.NewInt(-1), []*big.Int{big.NewInt(1), big.NewInt(3)}}, |
||||||
|
{big.NewInt(1), []*big.Int{big.NewInt(2), big.NewInt(-1)}}, |
||||||
|
}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + // tuple length
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000040" + // tuple[0] offset
|
||||||
|
"00000000000000000000000000000000000000000000000000000000000000e0" + // tuple[1] offset
|
||||||
|
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + // tuple[0].A
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000040" + // tuple[0].B offset
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + // tuple[0].B length
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + // tuple[0].B[0] value
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000003" + // tuple[0].B[1] value
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + // tuple[1].A
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000040" + // tuple[1].B offset
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + // tuple[1].B length
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + // tuple[1].B[0] value
|
||||||
|
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", // tuple[1].B[1] value
|
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"components": [{"name": "a","type": "int256"},
|
||||||
|
{"name": "b","type": "int256"}],
|
||||||
|
"name": "a","type": "tuple[2]"}]`, |
||||||
|
unpacked: [2]struct { |
||||||
|
A *big.Int |
||||||
|
B *big.Int |
||||||
|
}{ |
||||||
|
{big.NewInt(-1), big.NewInt(1)}, |
||||||
|
{big.NewInt(1), big.NewInt(-1)}, |
||||||
|
}, |
||||||
|
packed: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + // tuple[0].a
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + // tuple[0].b
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + // tuple[1].a
|
||||||
|
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", // tuple[1].b
|
||||||
|
}, |
||||||
|
{ |
||||||
|
def: `[{"components": [{"name": "a","type": "int256[]"}], |
||||||
|
"name": "a","type": "tuple[2]"}]`, |
||||||
|
unpacked: [2]struct { |
||||||
|
A []*big.Int |
||||||
|
}{ |
||||||
|
{[]*big.Int{big.NewInt(-1), big.NewInt(1)}}, |
||||||
|
{[]*big.Int{big.NewInt(1), big.NewInt(-1)}}, |
||||||
|
}, |
||||||
|
packed: "0000000000000000000000000000000000000000000000000000000000000020" + |
||||||
|
"0000000000000000000000000000000000000000000000000000000000000040" + // tuple[0] offset
|
||||||
|
"00000000000000000000000000000000000000000000000000000000000000c0" + // tuple[1] offset
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000020" + // tuple[0].A offset
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + // tuple[0].A length
|
||||||
|
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + // tuple[0].A[0]
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + // tuple[0].A[1]
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000020" + // tuple[1].A offset
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000002" + // tuple[1].A length
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000001" + // tuple[1].A[0]
|
||||||
|
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", // tuple[1].A[1]
|
||||||
|
}, |
||||||
|
} |
Loading…
Reference in new issue