|
|
|
@ -49,7 +49,9 @@ const jsondata2 = ` |
|
|
|
|
{ "type" : "function", "name" : "foo", "const" : false, "inputs" : [ { "name" : "inputs", "type" : "uint32" } ] }, |
|
|
|
|
{ "type" : "function", "name" : "bar", "const" : false, "inputs" : [ { "name" : "inputs", "type" : "uint32" }, { "name" : "string", "type" : "uint16" } ] }, |
|
|
|
|
{ "type" : "function", "name" : "slice", "const" : false, "inputs" : [ { "name" : "inputs", "type" : "uint32[2]" } ] }, |
|
|
|
|
{ "type" : "function", "name" : "slice256", "const" : false, "inputs" : [ { "name" : "inputs", "type" : "uint256[2]" } ] } |
|
|
|
|
{ "type" : "function", "name" : "slice256", "const" : false, "inputs" : [ { "name" : "inputs", "type" : "uint256[2]" } ] }, |
|
|
|
|
{ "type" : "function", "name" : "sliceAddress", "const" : false, "inputs" : [ { "name" : "inputs", "type" : "address[]" } ] }, |
|
|
|
|
{ "type" : "function", "name" : "sliceMultiAddress", "const" : false, "inputs" : [ { "name" : "a", "type" : "address[]" }, { "name" : "b", "type" : "address[]" } ] } |
|
|
|
|
]` |
|
|
|
|
|
|
|
|
|
func TestType(t *testing.T) { |
|
|
|
@ -68,7 +70,7 @@ func TestType(t *testing.T) { |
|
|
|
|
if typ.Kind != reflect.Slice { |
|
|
|
|
t.Error("expected uint32[] to have type slice") |
|
|
|
|
} |
|
|
|
|
if typ.Type != ubig_ts { |
|
|
|
|
if typ.Type != ubig_t { |
|
|
|
|
t.Error("expcted uith32[] to have type uint64") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -79,7 +81,7 @@ func TestType(t *testing.T) { |
|
|
|
|
if typ.Kind != reflect.Slice { |
|
|
|
|
t.Error("expected uint32[2] to have kind slice") |
|
|
|
|
} |
|
|
|
|
if typ.Type != ubig_ts { |
|
|
|
|
if typ.Type != ubig_t { |
|
|
|
|
t.Error("expcted uith32[2] to have type uint64") |
|
|
|
|
} |
|
|
|
|
if typ.Size != 2 { |
|
|
|
@ -202,16 +204,6 @@ func TestTestSlice(t *testing.T) { |
|
|
|
|
t.FailNow() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
addr := make([]byte, 20) |
|
|
|
|
if _, err := abi.Pack("address", addr); err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
addr = make([]byte, 21) |
|
|
|
|
if _, err := abi.Pack("address", addr); err == nil { |
|
|
|
|
t.Error("expected address of 21 width to throw") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
slice := make([]byte, 2) |
|
|
|
|
if _, err := abi.Pack("uint64[2]", slice); err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
@ -222,19 +214,6 @@ func TestTestSlice(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestTestAddress(t *testing.T) { |
|
|
|
|
abi, err := JSON(strings.NewReader(jsondata2)) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
t.FailNow() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
addr := make([]byte, 20) |
|
|
|
|
if _, err := abi.Pack("address", addr); err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestMethodSignature(t *testing.T) { |
|
|
|
|
String, _ := NewType("string") |
|
|
|
|
String32, _ := NewType("string32") |
|
|
|
@ -310,44 +289,69 @@ func TestPackSlice(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sig := crypto.Keccak256([]byte("slice(uint32[2])"))[:4] |
|
|
|
|
sig = append(sig, make([]byte, 64)...) |
|
|
|
|
sig[35] = 1 |
|
|
|
|
sig[67] = 2 |
|
|
|
|
sig = append(sig, common.LeftPadBytes([]byte{32}, 32)...) |
|
|
|
|
sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) |
|
|
|
|
sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) |
|
|
|
|
sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) |
|
|
|
|
|
|
|
|
|
packed, err := abi.Pack("slice", []uint32{1, 2}) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
t.FailNow() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if !bytes.Equal(packed, sig) { |
|
|
|
|
t.Errorf("expected %x got %x", sig, packed) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestPackSliceBig(t *testing.T) { |
|
|
|
|
abi, err := JSON(strings.NewReader(jsondata2)) |
|
|
|
|
var addrA, addrB = common.Address{1}, common.Address{2} |
|
|
|
|
sig = abi.Methods["sliceAddress"].Id() |
|
|
|
|
sig = append(sig, common.LeftPadBytes([]byte{32}, 32)...) |
|
|
|
|
sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) |
|
|
|
|
sig = append(sig, common.LeftPadBytes(addrA[:], 32)...) |
|
|
|
|
sig = append(sig, common.LeftPadBytes(addrB[:], 32)...) |
|
|
|
|
|
|
|
|
|
packed, err = abi.Pack("sliceAddress", []common.Address{addrA, addrB}) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
t.FailNow() |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
if !bytes.Equal(packed, sig) { |
|
|
|
|
t.Errorf("expected %x got %x", sig, packed) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sig := crypto.Keccak256([]byte("slice256(uint256[2])"))[:4] |
|
|
|
|
sig = append(sig, make([]byte, 64)...) |
|
|
|
|
sig[35] = 1 |
|
|
|
|
sig[67] = 2 |
|
|
|
|
var addrC, addrD = common.Address{3}, common.Address{4} |
|
|
|
|
sig = abi.Methods["sliceMultiAddress"].Id() |
|
|
|
|
sig = append(sig, common.LeftPadBytes([]byte{64}, 32)...) |
|
|
|
|
sig = append(sig, common.LeftPadBytes([]byte{160}, 32)...) |
|
|
|
|
sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) |
|
|
|
|
sig = append(sig, common.LeftPadBytes(addrA[:], 32)...) |
|
|
|
|
sig = append(sig, common.LeftPadBytes(addrB[:], 32)...) |
|
|
|
|
sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) |
|
|
|
|
sig = append(sig, common.LeftPadBytes(addrC[:], 32)...) |
|
|
|
|
sig = append(sig, common.LeftPadBytes(addrD[:], 32)...) |
|
|
|
|
|
|
|
|
|
packed, err = abi.Pack("sliceMultiAddress", []common.Address{addrA, addrB}, []common.Address{addrC, addrD}) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
if !bytes.Equal(packed, sig) { |
|
|
|
|
t.Errorf("expected %x got %x", sig, packed) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
packed, err := abi.Pack("slice256", []*big.Int{big.NewInt(1), big.NewInt(2)}) |
|
|
|
|
sig = crypto.Keccak256([]byte("slice256(uint256[2])"))[:4] |
|
|
|
|
sig = append(sig, common.LeftPadBytes([]byte{32}, 32)...) |
|
|
|
|
sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) |
|
|
|
|
sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) |
|
|
|
|
sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) |
|
|
|
|
|
|
|
|
|
packed, err = abi.Pack("slice256", []*big.Int{big.NewInt(1), big.NewInt(2)}) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
t.FailNow() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if !bytes.Equal(packed, sig) { |
|
|
|
|
t.Errorf("expected %x got %x", sig, packed) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func ExampleJSON() { |
|
|
|
|
const definition = `[{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isBar","outputs":[{"name":"","type":"bool"}],"type":"function"}]` |
|
|
|
|
|
|
|
|
@ -370,7 +374,7 @@ func TestInputVariableInputLength(t *testing.T) { |
|
|
|
|
{ "type" : "function", "name" : "strOne", "const" : true, "inputs" : [ { "name" : "str", "type" : "string" } ] }, |
|
|
|
|
{ "type" : "function", "name" : "bytesOne", "const" : true, "inputs" : [ { "name" : "str", "type" : "bytes" } ] }, |
|
|
|
|
{ "type" : "function", "name" : "strTwo", "const" : true, "inputs" : [ { "name" : "str", "type" : "string" }, { "name" : "str1", "type" : "string" } ] } |
|
|
|
|
]` |
|
|
|
|
]` |
|
|
|
|
|
|
|
|
|
abi, err := JSON(strings.NewReader(definition)) |
|
|
|
|
if err != nil { |
|
|
|
@ -493,35 +497,6 @@ func TestInputVariableInputLength(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestBytes(t *testing.T) { |
|
|
|
|
const definition = `[ |
|
|
|
|
{ "type" : "function", "name" : "balance", "const" : true, "inputs" : [ { "name" : "address", "type" : "bytes20" } ] }, |
|
|
|
|
{ "type" : "function", "name" : "send", "const" : false, "inputs" : [ { "name" : "amount", "type" : "uint256" } ] } |
|
|
|
|
]` |
|
|
|
|
|
|
|
|
|
abi, err := JSON(strings.NewReader(definition)) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
ok := make([]byte, 20) |
|
|
|
|
_, err = abi.Pack("balance", ok) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
toosmall := make([]byte, 19) |
|
|
|
|
_, err = abi.Pack("balance", toosmall) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
toobig := make([]byte, 21) |
|
|
|
|
_, err = abi.Pack("balance", toobig) |
|
|
|
|
if err == nil { |
|
|
|
|
t.Error("expected error") |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestDefaultFunctionParsing(t *testing.T) { |
|
|
|
|
const definition = `[{ "name" : "balance" }]` |
|
|
|
|
|
|
|
|
|