github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/app/ante/GasLimitDecorator.go (about)

     1  package ante
     2  
     3  import (
     4  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     5  	sdkerrors "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/errors"
     6  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/innertx"
     7  	evmtypes "github.com/fibonacci-chain/fbc/x/evm/types"
     8  )
     9  
    10  // EVMKeeper defines the expected keeper interface used on the Eth AnteHandler
    11  type EVMKeeper interface {
    12  	innertx.InnerTxKeeper
    13  	GetParams(ctx sdk.Context) evmtypes.Params
    14  	IsAddressBlocked(ctx sdk.Context, addr sdk.AccAddress) bool
    15  }
    16  
    17  // NewGasLimitDecorator creates a new GasLimitDecorator.
    18  func NewGasLimitDecorator(evm EVMKeeper) GasLimitDecorator {
    19  	return GasLimitDecorator{
    20  		evm: evm,
    21  	}
    22  }
    23  
    24  type GasLimitDecorator struct {
    25  	evm EVMKeeper
    26  }
    27  
    28  func (g GasLimitDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) {
    29  	pinAnte(ctx.AnteTracer(), "GasLimitDecorator")
    30  
    31  	currentGasMeter := ctx.GasMeter() // avoid race
    32  	infGasMeter := sdk.GetReusableInfiniteGasMeter()
    33  	ctx.SetGasMeter(infGasMeter)
    34  	if tx.GetGas() > g.evm.GetParams(ctx).MaxGasLimitPerTx {
    35  		ctx.SetGasMeter(currentGasMeter)
    36  		sdk.ReturnInfiniteGasMeter(infGasMeter)
    37  		return ctx, sdkerrors.Wrapf(sdkerrors.ErrTxTooLarge, "too large gas limit, it must be less than %d", g.evm.GetParams(ctx).MaxGasLimitPerTx)
    38  	}
    39  
    40  	ctx.SetGasMeter(currentGasMeter)
    41  	sdk.ReturnInfiniteGasMeter(infGasMeter)
    42  	return next(ctx, tx, simulate)
    43  }