diff --git a/accounts/abi/abi.go b/accounts/abi/abi.go index 3336be456f..e3687968a5 100644 --- a/accounts/abi/abi.go +++ b/accounts/abi/abi.go @@ -148,7 +148,6 @@ func (abi *ABI) MethodById(sigdata []byte) (*Method, error) { return nil, fmt.Errorf("no method with id: %#x", sigdata[:4]) } - // revertSelector is a special function selector for revert reason unpacking. var revertSelector = crypto.Keccak256([]byte("Error(string)"))[:4] diff --git a/accounts/abi/argument.go b/accounts/abi/argument.go index a45885c948..5ff473f624 100644 --- a/accounts/abi/argument.go +++ b/accounts/abi/argument.go @@ -290,7 +290,7 @@ func capitalise(input string) string { return strings.ToUpper(input[:1]) + input[1:] } -//unpackStruct extracts each argument into its corresponding struct field +// unpackStruct extracts each argument into its corresponding struct field func unpackStruct(value, reflectValue reflect.Value, arg Argument) error { name := capitalise(arg.Name) typ := value.Type() diff --git a/accounts/abi/bind/base.go b/accounts/abi/bind/base.go index 56bf28530d..1b5c71701c 100644 --- a/accounts/abi/bind/base.go +++ b/accounts/abi/bind/base.go @@ -30,6 +30,10 @@ import ( "github.com/XinFinOrg/XDPoSChain/event" ) +var ( + errNoEventSignature = errors.New("no event signature") +) + // SignerFn is a signer function callback when a contract requires a method to // sign the transaction before submission. type SignerFn func(types.Signer, common.Address, *types.Transaction) (*types.Transaction, error) @@ -326,6 +330,13 @@ 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 { + // Anonymous events are not supported. + if len(log.Topics) == 0 { + return errNoEventSignature + } + if log.Topics[0] != c.abi.Events[event].Id() { + return fmt.Errorf("event signature mismatch") + } if len(log.Data) > 0 { if err := c.abi.Unpack(out, event, log.Data); err != nil { return err