event.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Copyright 2016 The go-ethereum Authors
  2. // This file is part of the go-ethereum library.
  3. //
  4. // The go-ethereum library is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // The go-ethereum library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU Lesser General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU Lesser General Public License
  15. // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
  16. package abi
  17. import (
  18. "fmt"
  19. "strings"
  20. "github.com/ethereum/go-ethereum/common"
  21. "github.com/ethereum/go-ethereum/crypto"
  22. )
  23. // Event is an event potentially triggered by the EVM's LOG mechanism. The Event
  24. // holds type information (inputs) about the yielded output. Anonymous events
  25. // don't get the signature canonical representation as the first LOG topic.
  26. type Event struct {
  27. // Name is the event name used for internal representation. It's derived from
  28. // the raw name and a suffix will be added in the case of a event overload.
  29. //
  30. // e.g.
  31. // These are two events that have the same name:
  32. // * foo(int,int)
  33. // * foo(uint,uint)
  34. // The event name of the first one wll be resolved as foo while the second one
  35. // will be resolved as foo0.
  36. Name string
  37. // RawName is the raw event name parsed from ABI.
  38. RawName string
  39. Anonymous bool
  40. Inputs Arguments
  41. str string
  42. // Sig contains the string signature according to the ABI spec.
  43. // e.g. event foo(uint32 a, int b) = "foo(uint32,int256)"
  44. // Please note that "int" is substitute for its canonical representation "int256"
  45. Sig string
  46. // ID returns the canonical representation of the event's signature used by the
  47. // abi definition to identify event names and types.
  48. ID common.Hash
  49. }
  50. // NewEvent creates a new Event.
  51. // It sanitizes the input arguments to remove unnamed arguments.
  52. // It also precomputes the id, signature and string representation
  53. // of the event.
  54. func NewEvent(name, rawName string, anonymous bool, inputs Arguments) Event {
  55. // sanitize inputs to remove inputs without names
  56. // and precompute string and sig representation.
  57. names := make([]string, len(inputs))
  58. types := make([]string, len(inputs))
  59. for i, input := range inputs {
  60. if input.Name == "" {
  61. inputs[i] = Argument{
  62. Name: fmt.Sprintf("arg%d", i),
  63. Indexed: input.Indexed,
  64. Type: input.Type,
  65. }
  66. } else {
  67. inputs[i] = input
  68. }
  69. // string representation
  70. names[i] = fmt.Sprintf("%v %v", input.Type, inputs[i].Name)
  71. if input.Indexed {
  72. names[i] = fmt.Sprintf("%v indexed %v", input.Type, inputs[i].Name)
  73. }
  74. // sig representation
  75. types[i] = input.Type.String()
  76. }
  77. str := fmt.Sprintf("event %v(%v)", rawName, strings.Join(names, ", "))
  78. sig := fmt.Sprintf("%v(%v)", rawName, strings.Join(types, ","))
  79. id := common.BytesToHash(crypto.Keccak256([]byte(sig)))
  80. return Event{
  81. Name: name,
  82. RawName: rawName,
  83. Anonymous: anonymous,
  84. Inputs: inputs,
  85. str: str,
  86. Sig: sig,
  87. ID: id,
  88. }
  89. }
  90. func (e Event) String() string {
  91. return e.str
  92. }