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  }