|
|
|
@ -44,15 +44,13 @@ func TestUnpack(t *testing.T) { |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("invalid hex %s: %v", test.packed, err) |
|
|
|
|
} |
|
|
|
|
outptr := reflect.New(reflect.TypeOf(test.unpacked)) |
|
|
|
|
err = abi.Unpack(outptr.Interface(), "method", encb) |
|
|
|
|
out, err := abi.Unpack("method", encb) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Errorf("test %d (%v) failed: %v", i, test.def, err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
out := outptr.Elem().Interface() |
|
|
|
|
if !reflect.DeepEqual(test.unpacked, out) { |
|
|
|
|
t.Errorf("test %d (%v) failed: expected %v, got %v", i, test.def, test.unpacked, out) |
|
|
|
|
if !reflect.DeepEqual(test.unpacked, ConvertType(out[0], test.unpacked)) { |
|
|
|
|
t.Errorf("test %d (%v) failed: expected %v, got %v", i, test.def, test.unpacked, out[0]) |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
@ -221,7 +219,7 @@ func TestLocalUnpackTests(t *testing.T) { |
|
|
|
|
t.Fatalf("invalid hex %s: %v", test.enc, err) |
|
|
|
|
} |
|
|
|
|
outptr := reflect.New(reflect.TypeOf(test.want)) |
|
|
|
|
err = abi.Unpack(outptr.Interface(), "method", encb) |
|
|
|
|
err = abi.UnpackIntoInterface(outptr.Interface(), "method", encb) |
|
|
|
|
if err := test.checkError(err); err != nil { |
|
|
|
|
t.Errorf("test %d (%v) failed: %v", i, test.def, err) |
|
|
|
|
return |
|
|
|
@ -234,7 +232,7 @@ func TestLocalUnpackTests(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestUnpackSetDynamicArrayOutput(t *testing.T) { |
|
|
|
|
func TestUnpackIntoInterfaceSetDynamicArrayOutput(t *testing.T) { |
|
|
|
|
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"}]`)) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
@ -249,7 +247,7 @@ func TestUnpackSetDynamicArrayOutput(t *testing.T) { |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
// test 32
|
|
|
|
|
err = abi.Unpack(&out32, "testDynamicFixedBytes32", marshalledReturn32) |
|
|
|
|
err = abi.UnpackIntoInterface(&out32, "testDynamicFixedBytes32", marshalledReturn32) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
@ -266,7 +264,7 @@ func TestUnpackSetDynamicArrayOutput(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// test 15
|
|
|
|
|
err = abi.Unpack(&out15, "testDynamicFixedBytes32", marshalledReturn15) |
|
|
|
|
err = abi.UnpackIntoInterface(&out15, "testDynamicFixedBytes32", marshalledReturn15) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
@ -367,7 +365,7 @@ func TestMethodMultiReturn(t *testing.T) { |
|
|
|
|
tc := tc |
|
|
|
|
t.Run(tc.name, func(t *testing.T) { |
|
|
|
|
require := require.New(t) |
|
|
|
|
err := abi.Unpack(tc.dest, "multi", data) |
|
|
|
|
err := abi.UnpackIntoInterface(tc.dest, "multi", data) |
|
|
|
|
if tc.error == "" { |
|
|
|
|
require.Nil(err, "Should be able to unpack method outputs.") |
|
|
|
|
require.Equal(tc.expected, tc.dest) |
|
|
|
@ -390,7 +388,7 @@ func TestMultiReturnWithArray(t *testing.T) { |
|
|
|
|
|
|
|
|
|
ret1, ret1Exp := new([3]uint64), [3]uint64{9, 9, 9} |
|
|
|
|
ret2, ret2Exp := new(uint64), uint64(8) |
|
|
|
|
if err := abi.Unpack(&[]interface{}{ret1, ret2}, "multi", buff.Bytes()); err != nil { |
|
|
|
|
if err := abi.UnpackIntoInterface(&[]interface{}{ret1, ret2}, "multi", buff.Bytes()); err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
if !reflect.DeepEqual(*ret1, ret1Exp) { |
|
|
|
@ -414,7 +412,7 @@ func TestMultiReturnWithStringArray(t *testing.T) { |
|
|
|
|
ret2, ret2Exp := new(common.Address), common.HexToAddress("ab1257528b3782fb40d7ed5f72e624b744dffb2f") |
|
|
|
|
ret3, ret3Exp := new([2]string), [2]string{"Ethereum", "Hello, Ethereum!"} |
|
|
|
|
ret4, ret4Exp := new(bool), false |
|
|
|
|
if err := abi.Unpack(&[]interface{}{ret1, ret2, ret3, ret4}, "multi", buff.Bytes()); err != nil { |
|
|
|
|
if err := abi.UnpackIntoInterface(&[]interface{}{ret1, ret2, ret3, ret4}, "multi", buff.Bytes()); err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
if !reflect.DeepEqual(*ret1, ret1Exp) { |
|
|
|
@ -452,7 +450,7 @@ func TestMultiReturnWithStringSlice(t *testing.T) { |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000065")) // output[1][1] value
|
|
|
|
|
ret1, ret1Exp := new([]string), []string{"ethereum", "go-ethereum"} |
|
|
|
|
ret2, ret2Exp := new([]*big.Int), []*big.Int{big.NewInt(100), big.NewInt(101)} |
|
|
|
|
if err := abi.Unpack(&[]interface{}{ret1, ret2}, "multi", buff.Bytes()); err != nil { |
|
|
|
|
if err := abi.UnpackIntoInterface(&[]interface{}{ret1, ret2}, "multi", buff.Bytes()); err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
if !reflect.DeepEqual(*ret1, ret1Exp) { |
|
|
|
@ -492,7 +490,7 @@ func TestMultiReturnWithDeeplyNestedArray(t *testing.T) { |
|
|
|
|
{{0x411, 0x412, 0x413}, {0x421, 0x422, 0x423}}, |
|
|
|
|
} |
|
|
|
|
ret2, ret2Exp := new(uint64), uint64(0x9876) |
|
|
|
|
if err := abi.Unpack(&[]interface{}{ret1, ret2}, "multi", buff.Bytes()); err != nil { |
|
|
|
|
if err := abi.UnpackIntoInterface(&[]interface{}{ret1, ret2}, "multi", buff.Bytes()); err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
if !reflect.DeepEqual(*ret1, ret1Exp) { |
|
|
|
@ -531,7 +529,7 @@ func TestUnmarshal(t *testing.T) { |
|
|
|
|
buff.Write(common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000a")) |
|
|
|
|
buff.Write(common.Hex2Bytes("0102000000000000000000000000000000000000000000000000000000000000")) |
|
|
|
|
|
|
|
|
|
err = abi.Unpack(&mixedBytes, "mixedBytes", buff.Bytes()) |
|
|
|
|
err = abi.UnpackIntoInterface(&mixedBytes, "mixedBytes", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} else { |
|
|
|
@ -546,7 +544,7 @@ func TestUnmarshal(t *testing.T) { |
|
|
|
|
|
|
|
|
|
// marshal int
|
|
|
|
|
var Int *big.Int |
|
|
|
|
err = abi.Unpack(&Int, "int", common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) |
|
|
|
|
err = abi.UnpackIntoInterface(&Int, "int", common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
@ -557,7 +555,7 @@ func TestUnmarshal(t *testing.T) { |
|
|
|
|
|
|
|
|
|
// marshal bool
|
|
|
|
|
var Bool bool |
|
|
|
|
err = abi.Unpack(&Bool, "bool", common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) |
|
|
|
|
err = abi.UnpackIntoInterface(&Bool, "bool", common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
@ -574,7 +572,7 @@ func TestUnmarshal(t *testing.T) { |
|
|
|
|
buff.Write(bytesOut) |
|
|
|
|
|
|
|
|
|
var Bytes []byte |
|
|
|
|
err = abi.Unpack(&Bytes, "bytes", buff.Bytes()) |
|
|
|
|
err = abi.UnpackIntoInterface(&Bytes, "bytes", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
@ -590,7 +588,7 @@ func TestUnmarshal(t *testing.T) { |
|
|
|
|
bytesOut = common.RightPadBytes([]byte("hello"), 64) |
|
|
|
|
buff.Write(bytesOut) |
|
|
|
|
|
|
|
|
|
err = abi.Unpack(&Bytes, "bytes", buff.Bytes()) |
|
|
|
|
err = abi.UnpackIntoInterface(&Bytes, "bytes", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
@ -606,7 +604,7 @@ func TestUnmarshal(t *testing.T) { |
|
|
|
|
bytesOut = common.RightPadBytes([]byte("hello"), 64) |
|
|
|
|
buff.Write(bytesOut) |
|
|
|
|
|
|
|
|
|
err = abi.Unpack(&Bytes, "bytes", buff.Bytes()) |
|
|
|
|
err = abi.UnpackIntoInterface(&Bytes, "bytes", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
@ -616,7 +614,7 @@ func TestUnmarshal(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// marshal dynamic bytes output empty
|
|
|
|
|
err = abi.Unpack(&Bytes, "bytes", nil) |
|
|
|
|
err = abi.UnpackIntoInterface(&Bytes, "bytes", nil) |
|
|
|
|
if err == nil { |
|
|
|
|
t.Error("expected error") |
|
|
|
|
} |
|
|
|
@ -627,7 +625,7 @@ func TestUnmarshal(t *testing.T) { |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000005")) |
|
|
|
|
buff.Write(common.RightPadBytes([]byte("hello"), 32)) |
|
|
|
|
|
|
|
|
|
err = abi.Unpack(&Bytes, "bytes", buff.Bytes()) |
|
|
|
|
err = abi.UnpackIntoInterface(&Bytes, "bytes", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
@ -641,7 +639,7 @@ func TestUnmarshal(t *testing.T) { |
|
|
|
|
buff.Write(common.RightPadBytes([]byte("hello"), 32)) |
|
|
|
|
|
|
|
|
|
var hash common.Hash |
|
|
|
|
err = abi.Unpack(&hash, "fixed", buff.Bytes()) |
|
|
|
|
err = abi.UnpackIntoInterface(&hash, "fixed", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
@ -654,12 +652,12 @@ func TestUnmarshal(t *testing.T) { |
|
|
|
|
// marshal error
|
|
|
|
|
buff.Reset() |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020")) |
|
|
|
|
err = abi.Unpack(&Bytes, "bytes", buff.Bytes()) |
|
|
|
|
err = abi.UnpackIntoInterface(&Bytes, "bytes", buff.Bytes()) |
|
|
|
|
if err == nil { |
|
|
|
|
t.Error("expected error") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err = abi.Unpack(&Bytes, "multi", make([]byte, 64)) |
|
|
|
|
err = abi.UnpackIntoInterface(&Bytes, "multi", make([]byte, 64)) |
|
|
|
|
if err == nil { |
|
|
|
|
t.Error("expected error") |
|
|
|
|
} |
|
|
|
@ -670,7 +668,7 @@ func TestUnmarshal(t *testing.T) { |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000003")) |
|
|
|
|
// marshal int array
|
|
|
|
|
var intArray [3]*big.Int |
|
|
|
|
err = abi.Unpack(&intArray, "intArraySingle", buff.Bytes()) |
|
|
|
|
err = abi.UnpackIntoInterface(&intArray, "intArraySingle", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
@ -691,7 +689,7 @@ func TestUnmarshal(t *testing.T) { |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000100000000000000000000000000000000000000")) |
|
|
|
|
|
|
|
|
|
var outAddr []common.Address |
|
|
|
|
err = abi.Unpack(&outAddr, "addressSliceSingle", buff.Bytes()) |
|
|
|
|
err = abi.UnpackIntoInterface(&outAddr, "addressSliceSingle", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatal("didn't expect error:", err) |
|
|
|
|
} |
|
|
|
@ -718,7 +716,7 @@ func TestUnmarshal(t *testing.T) { |
|
|
|
|
A []common.Address |
|
|
|
|
B []common.Address |
|
|
|
|
} |
|
|
|
|
err = abi.Unpack(&outAddrStruct, "addressSliceDouble", buff.Bytes()) |
|
|
|
|
err = abi.UnpackIntoInterface(&outAddrStruct, "addressSliceDouble", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatal("didn't expect error:", err) |
|
|
|
|
} |
|
|
|
@ -746,7 +744,7 @@ func TestUnmarshal(t *testing.T) { |
|
|
|
|
buff.Reset() |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000100")) |
|
|
|
|
|
|
|
|
|
err = abi.Unpack(&outAddr, "addressSliceSingle", buff.Bytes()) |
|
|
|
|
err = abi.UnpackIntoInterface(&outAddr, "addressSliceSingle", buff.Bytes()) |
|
|
|
|
if err == nil { |
|
|
|
|
t.Fatal("expected error:", err) |
|
|
|
|
} |
|
|
|
@ -769,7 +767,7 @@ func TestUnpackTuple(t *testing.T) { |
|
|
|
|
B *big.Int |
|
|
|
|
}{new(big.Int), new(big.Int)} |
|
|
|
|
|
|
|
|
|
err = abi.Unpack(&v, "tuple", buff.Bytes()) |
|
|
|
|
err = abi.UnpackIntoInterface(&v, "tuple", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} else { |
|
|
|
@ -841,7 +839,7 @@ func TestUnpackTuple(t *testing.T) { |
|
|
|
|
A: big.NewInt(1), |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err = abi.Unpack(&ret, "tuple", buff.Bytes()) |
|
|
|
|
err = abi.UnpackIntoInterface(&ret, "tuple", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
|