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

     1  package ante
     2  
     3  import (
     4  	"github.com/fibonacci-chain/fbc/app/crypto/ethsecp256k1"
     5  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     6  	sdkerrors "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/errors"
     7  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
     8  	authante "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/ante"
     9  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/types"
    10  	ibc "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core"
    11  	ibcante "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core/ante"
    12  	"github.com/fibonacci-chain/fbc/libs/system/trace"
    13  	tmcrypto "github.com/fibonacci-chain/fbc/libs/tendermint/crypto"
    14  	govante "github.com/fibonacci-chain/fbc/x/gov/ante"
    15  	"github.com/fibonacci-chain/fbc/x/params"
    16  	"github.com/fibonacci-chain/fbc/x/staking"
    17  
    18  	wasmkeeper "github.com/fibonacci-chain/fbc/x/wasm/keeper"
    19  )
    20  
    21  func init() {
    22  	ethsecp256k1.RegisterCodec(types.ModuleCdc)
    23  }
    24  
    25  const (
    26  	// TODO: Use this cost per byte through parameter or overriding NewConsumeGasForTxSizeDecorator
    27  	// which currently defaults at 10, if intended
    28  	// memoCostPerByte     sdk.Gas = 3
    29  	secp256k1VerifyCost uint64 = 21000
    30  )
    31  
    32  // NewAnteHandler returns an ante handler responsible for attempting to route an
    33  // Ethereum or SDK transaction to an internal ante handler for performing
    34  // transaction-level processing (e.g. fee payment, signature verification) before
    35  // being passed onto it's respective handler.
    36  func NewAnteHandler(ak auth.AccountKeeper, evmKeeper EVMKeeper, sk types.SupplyKeeper, validateMsgHandler ValidateMsgHandler, option wasmkeeper.HandlerOption, ibcChannelKeepr *ibc.Keeper, s staking.Keeper, pk params.Keeper) sdk.AnteHandler {
    37  	var stdTxAnteHandler, evmTxAnteHandler sdk.AnteHandler
    38  
    39  	stdTxAnteHandler = sdk.ChainAnteDecorators(
    40  		authante.NewSetUpContextDecorator(),                                             // outermost AnteDecorator. SetUpContext must be called first
    41  		wasmkeeper.NewLimitSimulationGasDecorator(option.WasmConfig.SimulationGasLimit), // after setup context to enforce limits early
    42  		wasmkeeper.NewCountTXDecorator(option.TXCounterStoreKey),
    43  		NewAccountBlockedVerificationDecorator(evmKeeper), //account blocked check AnteDecorator
    44  		authante.NewMempoolFeeDecorator(),
    45  		authante.NewValidateBasicDecorator(),
    46  		authante.NewValidateMemoDecorator(ak),
    47  		authante.NewConsumeGasForTxSizeDecorator(ak),
    48  		authante.NewSetPubKeyDecorator(ak), // SetPubKeyDecorator must be called before all signature verification decorators
    49  		authante.NewValidateSigCountDecorator(ak),
    50  		authante.NewDeductFeeDecorator(ak, sk),
    51  		authante.NewSigGasConsumeDecorator(ak, sigGasConsumer),
    52  		authante.NewSigVerificationDecorator(ak),
    53  		authante.NewIncrementSequenceDecorator(ak), // innermost AnteDecorator
    54  		NewValidateMsgHandlerDecorator(validateMsgHandler),
    55  		ibcante.NewAnteDecorator(ibcChannelKeepr),
    56  		govante.NewAnteDecorator(s, ak, pk),
    57  	)
    58  
    59  	evmTxAnteHandler = sdk.ChainAnteDecorators(
    60  		NewEthSetupContextDecorator(), // outermost AnteDecorator. EthSetUpContext must be called first
    61  		NewGasLimitDecorator(evmKeeper),
    62  		NewEthMempoolFeeDecorator(evmKeeper),
    63  		authante.NewValidateBasicDecorator(),
    64  		NewEthSigVerificationDecorator(),
    65  		NewAccountBlockedVerificationDecorator(evmKeeper), //account blocked check AnteDecorator
    66  		NewAccountAnteDecorator(ak, evmKeeper, sk),
    67  	)
    68  
    69  	return func(
    70  		ctx sdk.Context, tx sdk.Tx, sim bool,
    71  	) (newCtx sdk.Context, err error) {
    72  		var anteHandler sdk.AnteHandler
    73  		switch tx.GetType() {
    74  		case sdk.StdTxType:
    75  			anteHandler = stdTxAnteHandler
    76  
    77  		case sdk.EvmTxType:
    78  			if ctx.IsWrappedCheckTx() {
    79  				anteHandler = sdk.ChainAnteDecorators(
    80  					NewNonceVerificationDecorator(ak),
    81  					NewIncrementSenderSequenceDecorator(ak),
    82  				)
    83  			} else {
    84  				anteHandler = evmTxAnteHandler
    85  			}
    86  
    87  		default:
    88  			return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "invalid transaction type: %T", tx)
    89  		}
    90  
    91  		return anteHandler(ctx, tx, sim)
    92  	}
    93  }
    94  
    95  // sigGasConsumer overrides the DefaultSigVerificationGasConsumer from the x/auth
    96  // module on the SDK. It doesn't allow ed25519 nor multisig thresholds.
    97  func sigGasConsumer(
    98  	meter sdk.GasMeter, _ []byte, pubkey tmcrypto.PubKey, _ types.Params,
    99  ) error {
   100  	switch pubkey.(type) {
   101  	case ethsecp256k1.PubKey:
   102  		meter.ConsumeGas(secp256k1VerifyCost, "ante verify: secp256k1")
   103  		return nil
   104  	case tmcrypto.PubKey:
   105  		meter.ConsumeGas(secp256k1VerifyCost, "ante verify: tendermint secp256k1")
   106  		return nil
   107  	default:
   108  		return sdkerrors.Wrapf(sdkerrors.ErrInvalidPubKey, "unrecognized public key type: %T", pubkey)
   109  	}
   110  }
   111  
   112  func pinAnte(trc *trace.Tracer, tag string) {
   113  	if trc != nil {
   114  		trc.RepeatingPin(tag)
   115  	}
   116  }