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  }