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 }