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 }