github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/smartcontract/manifest/event.go (about)

     1  package manifest
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  
     7  	"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
     8  )
     9  
    10  // Event is a description of a single event.
    11  type Event struct {
    12  	Name       string      `json:"name"`
    13  	Parameters []Parameter `json:"parameters"`
    14  }
    15  
    16  // IsValid checks Event consistency and correctness.
    17  func (e *Event) IsValid() error {
    18  	if e.Name == "" {
    19  		return errors.New("empty or absent name")
    20  	}
    21  	return Parameters(e.Parameters).AreValid()
    22  }
    23  
    24  // ToStackItem converts Event to stackitem.Item.
    25  func (e *Event) ToStackItem() stackitem.Item {
    26  	params := make([]stackitem.Item, len(e.Parameters))
    27  	for i := range e.Parameters {
    28  		params[i] = e.Parameters[i].ToStackItem()
    29  	}
    30  	return stackitem.NewStruct([]stackitem.Item{
    31  		stackitem.Make(e.Name),
    32  		stackitem.Make(params),
    33  	})
    34  }
    35  
    36  // FromStackItem converts stackitem.Item to Event.
    37  func (e *Event) FromStackItem(item stackitem.Item) error {
    38  	var err error
    39  	if item.Type() != stackitem.StructT {
    40  		return errors.New("invalid Event stackitem type")
    41  	}
    42  	event := item.Value().([]stackitem.Item)
    43  	if len(event) != 2 {
    44  		return errors.New("invalid Event stackitem length")
    45  	}
    46  	e.Name, err = stackitem.ToString(event[0])
    47  	if err != nil {
    48  		return err
    49  	}
    50  	if event[1].Type() != stackitem.ArrayT {
    51  		return errors.New("invalid Params stackitem type")
    52  	}
    53  	params := event[1].Value().([]stackitem.Item)
    54  	e.Parameters = make([]Parameter, len(params))
    55  	for i := range params {
    56  		p := new(Parameter)
    57  		if err := p.FromStackItem(params[i]); err != nil {
    58  			return err
    59  		}
    60  		e.Parameters[i] = *p
    61  	}
    62  	return nil
    63  }
    64  
    65  // CheckCompliance checks compliance of the given array of items with the
    66  // current event.
    67  func (e *Event) CheckCompliance(items []stackitem.Item) error {
    68  	if len(items) != len(e.Parameters) {
    69  		return fmt.Errorf("mismatch between the number of parameters and items: %d vs %d", len(e.Parameters), len(items))
    70  	}
    71  	for i := range items {
    72  		if !e.Parameters[i].Type.Match(items[i]) {
    73  			return fmt.Errorf("parameter %d type mismatch: %s (manifest) vs %s (notification)", i, e.Parameters[i].Type.String(), items[i].Type().String())
    74  		}
    75  	}
    76  	return nil
    77  }