github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/app/ante/IncrementSeqDecorator.go (about) 1 package ante 2 3 import ( 4 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/baseapp" 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 evmtypes "github.com/fibonacci-chain/fbc/x/evm/types" 9 ) 10 11 // IncrementSenderSequenceDecorator increments the sequence of the signers. The 12 // main difference with the SDK's IncrementSequenceDecorator is that the MsgEthereumTx 13 // doesn't implement the SigVerifiableTx interface. 14 // 15 // CONTRACT: must be called after msg.VerifySig in order to cache the sender address. 16 type IncrementSenderSequenceDecorator struct { 17 ak auth.AccountKeeper 18 } 19 20 // NewIncrementSenderSequenceDecorator creates a new IncrementSenderSequenceDecorator. 21 func NewIncrementSenderSequenceDecorator(ak auth.AccountKeeper) IncrementSenderSequenceDecorator { 22 return IncrementSenderSequenceDecorator{ 23 ak: ak, 24 } 25 } 26 27 // AnteHandle handles incrementing the sequence of the sender. 28 func (issd IncrementSenderSequenceDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) { 29 pinAnte(ctx.AnteTracer(), "IncrementSenderSequenceDecorator") 30 31 // always incrementing the sequence when ctx is recheckTx mode (when mempool in disableRecheck mode, we will also has force recheck period), 32 // when just in check mode: 33 // A、when mempool is in enableRecheck mode, we will need to increase the nonce [means will not support tx replace with same nonce]. 34 // B、when mempool is in disableRecheck mode [now support tx replace with same nonce], we should just return 35 36 // when IsCheckTx() is true, it will means checkTx and recheckTx mode, but IsReCheckTx() is true it must be recheckTx mode 37 // if IsTraceMode is true, sequence must be set. 38 if ctx.IsCheckTx() && !ctx.IsReCheckTx() && !baseapp.IsMempoolEnableRecheck() && !ctx.IsTraceTx() { 39 return next(ctx, tx, simulate) 40 } 41 42 // get and set account must be called with an infinite gas meter in order to prevent 43 // additional gas from being deducted. 44 gasMeter := ctx.GasMeter() 45 ctx.SetGasMeter(sdk.NewInfiniteGasMeter()) 46 47 msgEthTx, ok := tx.(*evmtypes.MsgEthereumTx) 48 if !ok { 49 ctx.SetGasMeter(gasMeter) 50 return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "invalid transaction type: %T", tx) 51 } 52 53 if ctx.From() != "" { 54 msgEthTx.SetFrom(ctx.From()) 55 } 56 // increment sequence of all signers 57 for _, addr := range msgEthTx.GetSigners() { 58 acc := issd.ak.GetAccount(ctx, addr) 59 seq := acc.GetSequence() 60 if !baseapp.IsMempoolEnablePendingPool() { 61 seq++ 62 } else if msgEthTx.Data.AccountNonce == seq { 63 seq++ 64 } 65 if err := acc.SetSequence(seq); err != nil { 66 panic(err) 67 } 68 issd.ak.SetAccount(ctx, acc) 69 } 70 71 // set the original gas meter 72 ctx.SetGasMeter(gasMeter) 73 74 return next(ctx, tx, simulate) 75 }