github.com/ava-labs/avalanchego@v1.11.11/vms/components/avax/flow_checker.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package avax
     5  
     6  import (
     7  	"errors"
     8  
     9  	"github.com/ava-labs/avalanchego/ids"
    10  	"github.com/ava-labs/avalanchego/utils/math"
    11  	"github.com/ava-labs/avalanchego/utils/wrappers"
    12  )
    13  
    14  var ErrInsufficientFunds = errors.New("insufficient funds")
    15  
    16  type FlowChecker struct {
    17  	consumed, produced map[ids.ID]uint64
    18  	errs               wrappers.Errs
    19  }
    20  
    21  func NewFlowChecker() *FlowChecker {
    22  	return &FlowChecker{
    23  		consumed: make(map[ids.ID]uint64),
    24  		produced: make(map[ids.ID]uint64),
    25  	}
    26  }
    27  
    28  func (fc *FlowChecker) Consume(assetID ids.ID, amount uint64) {
    29  	fc.add(fc.consumed, assetID, amount)
    30  }
    31  
    32  func (fc *FlowChecker) Produce(assetID ids.ID, amount uint64) {
    33  	fc.add(fc.produced, assetID, amount)
    34  }
    35  
    36  func (fc *FlowChecker) add(value map[ids.ID]uint64, assetID ids.ID, amount uint64) {
    37  	var err error
    38  	value[assetID], err = math.Add(value[assetID], amount)
    39  	fc.errs.Add(err)
    40  }
    41  
    42  func (fc *FlowChecker) Verify() error {
    43  	if !fc.errs.Errored() {
    44  		for assetID, producedAssetAmount := range fc.produced {
    45  			consumedAssetAmount := fc.consumed[assetID]
    46  			if producedAssetAmount > consumedAssetAmount {
    47  				fc.errs.Add(ErrInsufficientFunds)
    48  				break
    49  			}
    50  		}
    51  	}
    52  	return fc.errs.Err
    53  }