github.com/benorgera/go-ethereum@v1.10.18-0.20220401011646-b3f57b1a73ba/accounts/abi/event.go (about)

     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  
    17  package abi
    18  
    19  import (
    20  	"fmt"
    21  	"strings"
    22  
    23  	"github.com/ethereum/go-ethereum/common"
    24  	"github.com/ethereum/go-ethereum/crypto"
    25  )
    26  
    27  // Event is an event potentially triggered by the EVM's LOG mechanism. The Event
    28  // holds type information (inputs) about the yielded output. Anonymous events
    29  // don't get the signature canonical representation as the first LOG topic.
    30  type Event struct {
    31  	// Name is the event name used for internal representation. It's derived from
    32  	// the raw name and a suffix will be added in the case of a event overload.
    33  	//
    34  	// e.g.
    35  	// These are two events that have the same name:
    36  	// * foo(int,int)
    37  	// * foo(uint,uint)
    38  	// The event name of the first one wll be resolved as foo while the second one
    39  	// will be resolved as foo0.
    40  	Name string
    41  	// RawName is the raw event name parsed from ABI.
    42  	RawName   string
    43  	Anonymous bool
    44  	Inputs    Arguments
    45  	str       string
    46  	// Sig contains the string signature according to the ABI spec.
    47  	// e.g.	 event foo(uint32 a, int b) = "foo(uint32,int256)"
    48  	// Please note that "int" is substitute for its canonical representation "int256"
    49  	Sig string
    50  	// ID returns the canonical representation of the event's signature used by the
    51  	// abi definition to identify event names and types.
    52  	ID common.Hash
    53  }
    54  
    55  // NewEvent creates a new Event.
    56  // It sanitizes the input arguments to remove unnamed arguments.
    57  // It also precomputes the id, signature and string representation
    58  // of the event.
    59  func NewEvent(name, rawName string, anonymous bool, inputs Arguments) Event {
    60  	// sanitize inputs to remove inputs without names
    61  	// and precompute string and sig representation.
    62  	names := make([]string, len(inputs))
    63  	types := make([]string, len(inputs))
    64  	for i, input := range inputs {
    65  		if input.Name == "" {
    66  			inputs[i] = Argument{
    67  				Name:    fmt.Sprintf("arg%d", i),
    68  				Indexed: input.Indexed,
    69  				Type:    input.Type,
    70  			}
    71  		} else {
    72  			inputs[i] = input
    73  		}
    74  		// string representation
    75  		names[i] = fmt.Sprintf("%v %v", input.Type, inputs[i].Name)
    76  		if input.Indexed {
    77  			names[i] = fmt.Sprintf("%v indexed %v", input.Type, inputs[i].Name)
    78  		}
    79  		// sig representation
    80  		types[i] = input.Type.String()
    81  	}
    82  
    83  	str := fmt.Sprintf("event %v(%v)", rawName, strings.Join(names, ", "))
    84  	sig := fmt.Sprintf("%v(%v)", rawName, strings.Join(types, ","))
    85  	id := common.BytesToHash(crypto.Keccak256([]byte(sig)))
    86  
    87  	return Event{
    88  		Name:      name,
    89  		RawName:   rawName,
    90  		Anonymous: anonymous,
    91  		Inputs:    inputs,
    92  		str:       str,
    93  		Sig:       sig,
    94  		ID:        id,
    95  	}
    96  }
    97  
    98  func (e Event) String() string {
    99  	return e.str
   100  }