github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/fvm/meter/event_meter.go (about)

     1  package meter
     2  
     3  import (
     4  	"math"
     5  
     6  	"github.com/onflow/flow-go/fvm/errors"
     7  )
     8  
     9  type EventMeterParameters struct {
    10  	eventEmitByteLimit uint64
    11  }
    12  
    13  func DefaultEventMeterParameters() EventMeterParameters {
    14  	return EventMeterParameters{
    15  		eventEmitByteLimit: math.MaxUint64,
    16  	}
    17  }
    18  
    19  func (params MeterParameters) WithEventEmitByteLimit(
    20  	byteLimit uint64,
    21  ) MeterParameters {
    22  	newParams := params
    23  	newParams.eventEmitByteLimit = byteLimit
    24  	return newParams
    25  }
    26  
    27  type EventMeter struct {
    28  	params EventMeterParameters
    29  
    30  	totalEmittedEventBytes uint64
    31  }
    32  
    33  func NewEventMeter(params EventMeterParameters) EventMeter {
    34  	return EventMeter{
    35  		params: params,
    36  	}
    37  }
    38  
    39  func (m *EventMeter) MeterEmittedEvent(byteSize uint64) error {
    40  	m.totalEmittedEventBytes += byteSize
    41  
    42  	if m.totalEmittedEventBytes > m.params.eventEmitByteLimit {
    43  		return errors.NewEventLimitExceededError(
    44  			m.totalEmittedEventBytes,
    45  			m.params.eventEmitByteLimit)
    46  	}
    47  	return nil
    48  }
    49  
    50  func (m *EventMeter) TotalEmittedEventBytes() uint64 {
    51  	return m.totalEmittedEventBytes
    52  }
    53  
    54  func (m *EventMeter) Merge(child EventMeter) {
    55  	m.totalEmittedEventBytes += child.TotalEmittedEventBytes()
    56  }