From 31c1e0292100b4b6c5b9076780b88aebf5dac07b Mon Sep 17 00:00:00 2001 From: Rader Date: Thu, 24 May 2018 14:40:02 +0800 Subject: [PATCH] bind: report error if event not not found by name when processing log --- accounts/abi/bind/base.go | 31 +++++++++++++++++++++++++------ accounts/abi/bind/base_test.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 accounts/abi/bind/base_test.go diff --git a/accounts/abi/bind/base.go b/accounts/abi/bind/base.go index 83ad1c8ae7..ace18cb8af 100644 --- a/accounts/abi/bind/base.go +++ b/accounts/abi/bind/base.go @@ -251,8 +251,14 @@ func (c *BoundContract) FilterLogs(opts *FilterOpts, name string, query ...[]int if opts == nil { opts = new(FilterOpts) } - // Append the event selector to the query parameters and construct the topic set - query = append([][]interface{}{{c.abi.Events[name].Id()}}, query...) + + var e abi.Event + var exist bool + if e, exist = c.abi.Events[name]; !exist { + return nil, nil, fmt.Errorf("abi: event [%v] not found", name) + } + // Append the event selector to the query parameters and construct the topic seft + query = append([][]interface{}{{e.Id()}}, query...) topics, err := makeTopics(query...) if err != nil { @@ -300,8 +306,14 @@ func (c *BoundContract) WatchLogs(opts *WatchOpts, name string, query ...[]inter if opts == nil { opts = new(WatchOpts) } + var e abi.Event + var exist bool + if e, exist = c.abi.Events[name]; !exist { + return nil, nil, fmt.Errorf("abi: event [%v] not found", name) + } + // Append the event selector to the query parameters and construct the topic set - query = append([][]interface{}{{c.abi.Events[name].Id()}}, query...) + query = append([][]interface{}{{e.Id()}}, query...) topics, err := makeTopics(query...) if err != nil { @@ -325,14 +337,21 @@ func (c *BoundContract) WatchLogs(opts *WatchOpts, name string, query ...[]inter } // UnpackLog unpacks a retrieved log into the provided output structure. -func (c *BoundContract) UnpackLog(out interface{}, event string, log types.Log) error { +func (c *BoundContract) UnpackLog(out interface{}, eventName string, log types.Log) error { if len(log.Data) > 0 { - if err := c.abi.Unpack(out, event, log.Data); err != nil { + if err := c.abi.Unpack(out, eventName, log.Data); err != nil { return err } } + + var e abi.Event + var exist bool + if e, exist = c.abi.Events[eventName]; !exist { + return fmt.Errorf("abi: event [%v] not found", eventName) + } + var indexed abi.Arguments - for _, arg := range c.abi.Events[event].Inputs { + for _, arg := range e.Inputs { if arg.Indexed { indexed = append(indexed, arg) } diff --git a/accounts/abi/bind/base_test.go b/accounts/abi/bind/base_test.go new file mode 100644 index 0000000000..0d13702ffc --- /dev/null +++ b/accounts/abi/bind/base_test.go @@ -0,0 +1,29 @@ +package bind + +import ( + "strings" + "testing" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/core/types" +) + +func TestUnkownEventName(t *testing.T) { + errorPrefix := "abi: event" + c := &BoundContract{} + c.abi.Events = make(map[string]abi.Event) + c.abi.Events["event1"] = abi.Event{} + if _, _, err := c.FilterLogs(nil, "event_not_exist"); err == nil || !strings.HasPrefix(err.Error(), errorPrefix) { + t.Fatal("should report error if event not found") + } + + if _, _, err := c.WatchLogs(nil, "event_not_exist"); err == nil || !strings.HasPrefix(err.Error(), errorPrefix) { + t.Fatal("should report error if event not found") + } + + var v interface{} + elog := types.Log{} + if err := c.UnpackLog(v, "event_not_exist", elog); err == nil || !strings.HasPrefix(err.Error(), errorPrefix) { + t.Fatal("should report error if event not found") + } +}