github.com/ava-labs/avalanchego@v1.11.11/vms/platformvm/txs/fee/dynamic_calculator.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package fee 5 6 import ( 7 "errors" 8 "fmt" 9 10 "github.com/ava-labs/avalanchego/vms/components/gas" 11 "github.com/ava-labs/avalanchego/vms/platformvm/txs" 12 ) 13 14 var ( 15 _ Calculator = (*dynamicCalculator)(nil) 16 17 ErrCalculatingComplexity = errors.New("error calculating complexity") 18 ErrCalculatingGas = errors.New("error calculating gas") 19 ErrCalculatingCost = errors.New("error calculating cost") 20 ) 21 22 func NewDynamicCalculator( 23 weights gas.Dimensions, 24 price gas.Price, 25 ) Calculator { 26 return &dynamicCalculator{ 27 weights: weights, 28 price: price, 29 } 30 } 31 32 type dynamicCalculator struct { 33 weights gas.Dimensions 34 price gas.Price 35 } 36 37 func (c *dynamicCalculator) CalculateFee(tx txs.UnsignedTx) (uint64, error) { 38 complexity, err := TxComplexity(tx) 39 if err != nil { 40 return 0, fmt.Errorf("%w: %w", ErrCalculatingComplexity, err) 41 } 42 gas, err := complexity.ToGas(c.weights) 43 if err != nil { 44 return 0, fmt.Errorf( 45 "%w with complexity (%v) and weights (%v): %w", 46 ErrCalculatingGas, 47 complexity, 48 c.weights, 49 err, 50 ) 51 } 52 fee, err := gas.Cost(c.price) 53 if err != nil { 54 return 0, fmt.Errorf( 55 "%w with gas (%d) and price (%d): %w", 56 ErrCalculatingCost, 57 gas, 58 c.price, 59 err, 60 ) 61 } 62 return fee, nil 63 }