|
@@ -394,6 +394,7 @@ func TestBytes(t *testing.T) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/*
|
|
|
func TestReturn(t *testing.T) {
|
|
func TestReturn(t *testing.T) {
|
|
|
const definition = `[
|
|
const definition = `[
|
|
|
{ "type" : "function", "name" : "balance", "const" : true, "inputs" : [], "outputs" : [ { "name": "", "type": "hash" } ] },
|
|
{ "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)
|
|
t.Errorf("expected type common.Address, got %T", r)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+*/
|
|
|
|
|
|
|
|
func TestDefaultFunctionParsing(t *testing.T) {
|
|
func TestDefaultFunctionParsing(t *testing.T) {
|
|
|
const definition = `[{ "name" : "balance" }]`
|
|
const definition = `[{ "name" : "balance" }]`
|
|
@@ -458,3 +460,234 @@ func TestBareEvents(t *testing.T) {
|
|
|
t.Error("expected 'name' event to be present")
|
|
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])
|
|
|
|
|
+ }
|
|
|
|
|
+}
|