aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbas-vk <bas-vk@users.noreply.github.com>2016-12-22 08:51:20 +0800
committerFelix Lange <fjl@users.noreply.github.com>2016-12-22 08:51:20 +0800
commit6d15d00ac4b5f162737a27dfa6f8e9976383776e (patch)
tree59fd8d8ae13451b7e830b79e84fb0083e150c3d2
parentbdaa43510b294bf49bbac1392d5518611c06eedc (diff)
downloadgo-tangerine-6d15d00ac4b5f162737a27dfa6f8e9976383776e.tar.gz
go-tangerine-6d15d00ac4b5f162737a27dfa6f8e9976383776e.tar.zst
go-tangerine-6d15d00ac4b5f162737a27dfa6f8e9976383776e.zip
accounts/abi: add support for "anonymous" and "indexed" for events (#3464)
-rw-r--r--accounts/abi/abi.go18
-rw-r--r--accounts/abi/abi_test.go53
-rw-r--r--accounts/abi/argument.go2
-rw-r--r--accounts/abi/event.go8
4 files changed, 61 insertions, 20 deletions
diff --git a/accounts/abi/abi.go b/accounts/abi/abi.go
index 2efac1307..4e02ae5f1 100644
--- a/accounts/abi/abi.go
+++ b/accounts/abi/abi.go
@@ -345,12 +345,13 @@ func (abi ABI) Unpack(v interface{}, name string, output []byte) error {
func (abi *ABI) UnmarshalJSON(data []byte) error {
var fields []struct {
- Type string
- Name string
- Constant bool
- Indexed bool
- Inputs []Argument
- Outputs []Argument
+ Type string
+ Name string
+ Constant bool
+ Indexed bool
+ Anonymous bool
+ Inputs []Argument
+ Outputs []Argument
}
if err := json.Unmarshal(data, &fields); err != nil {
@@ -375,8 +376,9 @@ func (abi *ABI) UnmarshalJSON(data []byte) error {
}
case "event":
abi.Events[field.Name] = Event{
- Name: field.Name,
- Inputs: field.Inputs,
+ Name: field.Name,
+ Anonymous: field.Anonymous,
+ Inputs: field.Inputs,
}
}
}
diff --git a/accounts/abi/abi_test.go b/accounts/abi/abi_test.go
index 85e25f9ea..99c46df0d 100644
--- a/accounts/abi/abi_test.go
+++ b/accounts/abi/abi_test.go
@@ -752,23 +752,58 @@ func TestDefaultFunctionParsing(t *testing.T) {
func TestBareEvents(t *testing.T) {
const definition = `[
{ "type" : "event", "name" : "balance" },
- { "type" : "event", "name" : "name" }]`
+ { "type" : "event", "name" : "anon", "anonymous" : true},
+ { "type" : "event", "name" : "args", "inputs" : [{ "indexed":false, "name":"arg0", "type":"uint256" }, { "indexed":true, "name":"arg1", "type":"address" }] }
+ ]`
+
+ arg0, _ := NewType("uint256")
+ arg1, _ := NewType("address")
+
+ expectedEvents := map[string]struct {
+ Anonymous bool
+ Args []Argument
+ }{
+ "balance": {false, nil},
+ "anon": {true, nil},
+ "args": {false, []Argument{
+ Argument{Name: "arg0", Type: arg0, Indexed: false},
+ Argument{Name: "arg1", Type: arg1, Indexed: true},
+ }},
+ }
abi, err := JSON(strings.NewReader(definition))
if err != nil {
t.Fatal(err)
}
- if len(abi.Events) != 2 {
- t.Error("expected 2 events")
- }
-
- if _, ok := abi.Events["balance"]; !ok {
- t.Error("expected 'balance' event to be present")
+ if len(abi.Events) != len(expectedEvents) {
+ t.Fatalf("invalid number of events after parsing, want %d, got %d", len(expectedEvents), len(abi.Events))
}
- if _, ok := abi.Events["name"]; !ok {
- t.Error("expected 'name' event to be present")
+ for name, exp := range expectedEvents {
+ got, ok := abi.Events[name]
+ if !ok {
+ t.Errorf("could not found event %s", name)
+ continue
+ }
+ if got.Anonymous != exp.Anonymous {
+ t.Errorf("invalid anonymous indication for event %s, want %v, got %v", name, exp.Anonymous, got.Anonymous)
+ }
+ if len(got.Inputs) != len(exp.Args) {
+ t.Errorf("invalid number of args, want %d, got %d", len(exp.Args), len(got.Inputs))
+ continue
+ }
+ for i, arg := range exp.Args {
+ if arg.Name != got.Inputs[i].Name {
+ t.Errorf("events[%s].Input[%d] has an invalid name, want %s, got %s", name, i, arg.Name, got.Inputs[i].Name)
+ }
+ if arg.Indexed != got.Inputs[i].Indexed {
+ t.Errorf("events[%s].Input[%d] has an invalid indexed indication, want %v, got %v", name, i, arg.Indexed, got.Inputs[i].Indexed)
+ }
+ if arg.Type.T != got.Inputs[i].Type.T {
+ t.Errorf("events[%s].Input[%d] has an invalid type, want %x, got %x", name, i, arg.Type.T, got.Inputs[i].Type.T)
+ }
+ }
}
}
diff --git a/accounts/abi/argument.go b/accounts/abi/argument.go
index 188203a5d..4faafdd3b 100644
--- a/accounts/abi/argument.go
+++ b/accounts/abi/argument.go
@@ -33,6 +33,7 @@ func (a *Argument) UnmarshalJSON(data []byte) error {
var extarg struct {
Name string
Type string
+ Indexed bool
}
err := json.Unmarshal(data, &extarg)
if err != nil {
@@ -44,6 +45,7 @@ func (a *Argument) UnmarshalJSON(data []byte) error {
return err
}
a.Name = extarg.Name
+ a.Indexed = extarg.Indexed
return nil
}
diff --git a/accounts/abi/event.go b/accounts/abi/event.go
index e74c7c732..51ab84241 100644
--- a/accounts/abi/event.go
+++ b/accounts/abi/event.go
@@ -25,10 +25,12 @@ import (
)
// Event is an event potentially triggered by the EVM's LOG mechanism. The Event
-// holds type information (inputs) about the yielded output
+// holds type information (inputs) about the yielded output. Anonymous events
+// don't get the signature canonical representation as the first LOG topic.
type Event struct {
- Name string
- Inputs []Argument
+ Name string
+ Anonymous bool
+ Inputs []Argument
}
// Id returns the canonical representation of the event's signature used by the