|
|
|
@ -394,6 +394,7 @@ func TestBytes(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
func TestReturn(t *testing.T) { |
|
|
|
|
const definition = `[ |
|
|
|
|
{ "type" : "function", "name" : "balance", "const" : true, "inputs" : [], "outputs" : [ { "name": "", "type": "hash" } ] }, |
|
|
|
@ -422,6 +423,7 @@ func TestReturn(t *testing.T) { |
|
|
|
|
t.Errorf("expected type common.Address, got %T", r) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
func TestDefaultFunctionParsing(t *testing.T) { |
|
|
|
|
const definition = `[{ "name" : "balance" }]` |
|
|
|
@ -458,3 +460,234 @@ func TestBareEvents(t *testing.T) { |
|
|
|
|
t.Error("expected 'name' event to be present") |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestMultiReturnWithStruct(t *testing.T) { |
|
|
|
|
const definition = `[ |
|
|
|
|
{ "name" : "multi", "const" : false, "outputs": [ { "name": "Int", "type": "uint256" }, { "name": "String", "type": "string" } ] }]` |
|
|
|
|
|
|
|
|
|
abi, err := JSON(strings.NewReader(definition)) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// using buff to make the code readable
|
|
|
|
|
buff := new(bytes.Buffer) |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040")) |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000005")) |
|
|
|
|
stringOut := "hello" |
|
|
|
|
buff.Write(common.RightPadBytes([]byte(stringOut), 32)) |
|
|
|
|
|
|
|
|
|
var inter struct { |
|
|
|
|
Int *big.Int |
|
|
|
|
String string |
|
|
|
|
} |
|
|
|
|
err = abi.unmarshal(&inter, "multi", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if inter.Int == nil || inter.Int.Cmp(big.NewInt(1)) != 0 { |
|
|
|
|
t.Error("expected Int to be 1 got", inter.Int) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if inter.String != stringOut { |
|
|
|
|
t.Error("expected String to be", stringOut, "got", inter.String) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var reversed struct { |
|
|
|
|
String string |
|
|
|
|
Int *big.Int |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err = abi.unmarshal(&reversed, "multi", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if reversed.Int == nil || reversed.Int.Cmp(big.NewInt(1)) != 0 { |
|
|
|
|
t.Error("expected Int to be 1 got", reversed.Int) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if reversed.String != stringOut { |
|
|
|
|
t.Error("expected String to be", stringOut, "got", reversed.String) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestMultiReturnWithSlice(t *testing.T) { |
|
|
|
|
const definition = `[ |
|
|
|
|
{ "name" : "multi", "const" : false, "outputs": [ { "name": "Int", "type": "uint256" }, { "name": "String", "type": "string" } ] }]` |
|
|
|
|
|
|
|
|
|
abi, err := JSON(strings.NewReader(definition)) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// using buff to make the code readable
|
|
|
|
|
buff := new(bytes.Buffer) |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040")) |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000005")) |
|
|
|
|
stringOut := "hello" |
|
|
|
|
buff.Write(common.RightPadBytes([]byte(stringOut), 32)) |
|
|
|
|
|
|
|
|
|
var inter []interface{} |
|
|
|
|
err = abi.unmarshal(&inter, "multi", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if len(inter) != 2 { |
|
|
|
|
t.Fatal("expected 2 results got", len(inter)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if num, ok := inter[0].(*big.Int); !ok || num.Cmp(big.NewInt(1)) != 0 { |
|
|
|
|
t.Error("expected index 0 to be 1 got", num) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if str, ok := inter[1].(string); !ok || str != stringOut { |
|
|
|
|
t.Error("expected index 1 to be", stringOut, "got", str) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestUnmarshal(t *testing.T) { |
|
|
|
|
const definition = `[ |
|
|
|
|
{ "name" : "int", "const" : false, "outputs": [ { "type": "uint256" } ] }, |
|
|
|
|
{ "name" : "bool", "const" : false, "outputs": [ { "type": "bool" } ] }, |
|
|
|
|
{ "name" : "bytes", "const" : false, "outputs": [ { "type": "bytes" } ] }, |
|
|
|
|
{ "name" : "multi", "const" : false, "outputs": [ { "type": "bytes" }, { "type": "bytes" } ] }, |
|
|
|
|
{ "name" : "mixedBytes", "const" : true, "outputs": [ { "name": "a", "type": "bytes" }, { "name": "b", "type": "bytes32" } ] }]` |
|
|
|
|
|
|
|
|
|
abi, err := JSON(strings.NewReader(definition)) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// marshal int
|
|
|
|
|
var Int *big.Int |
|
|
|
|
err = abi.unmarshal(&Int, "int", common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if Int == nil || Int.Cmp(big.NewInt(1)) != 0 { |
|
|
|
|
t.Error("expected Int to be 1 got", Int) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// marshal bool
|
|
|
|
|
var Bool bool |
|
|
|
|
err = abi.unmarshal(&Bool, "bool", common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if !Bool { |
|
|
|
|
t.Error("expected Bool to be true") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// marshal dynamic bytes max length 32
|
|
|
|
|
buff := new(bytes.Buffer) |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020")) |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020")) |
|
|
|
|
bytesOut := common.RightPadBytes([]byte("hello"), 32) |
|
|
|
|
buff.Write(bytesOut) |
|
|
|
|
|
|
|
|
|
var Bytes []byte |
|
|
|
|
err = abi.unmarshal(&Bytes, "bytes", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if !bytes.Equal(Bytes, bytesOut) { |
|
|
|
|
t.Errorf("expected %x got %x", bytesOut, Bytes) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// marshall dynamic bytes max length 64
|
|
|
|
|
buff.Reset() |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020")) |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040")) |
|
|
|
|
bytesOut = common.RightPadBytes([]byte("hello"), 64) |
|
|
|
|
buff.Write(bytesOut) |
|
|
|
|
|
|
|
|
|
err = abi.unmarshal(&Bytes, "bytes", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if !bytes.Equal(Bytes, bytesOut) { |
|
|
|
|
t.Errorf("expected %x got %x", bytesOut, Bytes) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// marshall dynamic bytes max length 63
|
|
|
|
|
buff.Reset() |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020")) |
|
|
|
|
buff.Write(common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000003f")) |
|
|
|
|
bytesOut = common.RightPadBytes([]byte("hello"), 63) |
|
|
|
|
buff.Write(bytesOut) |
|
|
|
|
|
|
|
|
|
err = abi.unmarshal(&Bytes, "bytes", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if !bytes.Equal(Bytes, bytesOut) { |
|
|
|
|
t.Errorf("expected %x got %x", bytesOut, Bytes) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// marshal dynamic bytes output empty
|
|
|
|
|
err = abi.unmarshal(&Bytes, "bytes", nil) |
|
|
|
|
if err == nil { |
|
|
|
|
t.Error("expected error") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// marshal dynamic bytes length 5
|
|
|
|
|
buff.Reset() |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020")) |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000005")) |
|
|
|
|
buff.Write(common.RightPadBytes([]byte("hello"), 32)) |
|
|
|
|
|
|
|
|
|
err = abi.unmarshal(&Bytes, "bytes", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if !bytes.Equal(Bytes, []byte("hello")) { |
|
|
|
|
t.Errorf("expected %x got %x", bytesOut, Bytes) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// marshal error
|
|
|
|
|
buff.Reset() |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020")) |
|
|
|
|
err = abi.unmarshal(&Bytes, "bytes", buff.Bytes()) |
|
|
|
|
if err == nil { |
|
|
|
|
t.Error("expected error") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err = abi.unmarshal(&Bytes, "multi", make([]byte, 64)) |
|
|
|
|
if err == nil { |
|
|
|
|
t.Error("expected error") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// marshal mixed bytes
|
|
|
|
|
buff.Reset() |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040")) |
|
|
|
|
fixed := common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001") |
|
|
|
|
buff.Write(fixed) |
|
|
|
|
buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000020")) |
|
|
|
|
bytesOut = common.RightPadBytes([]byte("hello"), 32) |
|
|
|
|
buff.Write(bytesOut) |
|
|
|
|
|
|
|
|
|
var out []interface{} |
|
|
|
|
err = abi.unmarshal(&out, "mixedBytes", buff.Bytes()) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatal("didn't expect error:", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if !bytes.Equal(bytesOut, out[0].([]byte)) { |
|
|
|
|
t.Errorf("expected %x, got %x", bytesOut, out[0]) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if !bytes.Equal(fixed, out[1].([]byte)) { |
|
|
|
|
t.Errorf("expected %x, got %x", fixed, out[1]) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|