github.com/KiraCore/sekai@v0.3.43/app/posthandler/exec.go (about)

     1  package posthandler
     2  
     3  import (
     4  	kiratypes "github.com/KiraCore/sekai/types"
     5  	feeprocessingkeeper "github.com/KiraCore/sekai/x/feeprocessing/keeper"
     6  	customgovkeeper "github.com/KiraCore/sekai/x/gov/keeper"
     7  	sdk "github.com/cosmos/cosmos-sdk/types"
     8  	sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
     9  )
    10  
    11  // ExecutionDecorator stores execution status
    12  type ExecutionDecorator struct {
    13  	customGovKeeper     customgovkeeper.Keeper
    14  	feeprocessingKeeper feeprocessingkeeper.Keeper
    15  }
    16  
    17  func NewExecutionDecorator(
    18  	customGovKeeper customgovkeeper.Keeper,
    19  	feeprocessingKeeper feeprocessingkeeper.Keeper,
    20  ) sdk.PostDecorator {
    21  	return &ExecutionDecorator{
    22  		customGovKeeper:     customGovKeeper,
    23  		feeprocessingKeeper: feeprocessingKeeper,
    24  	}
    25  }
    26  
    27  func (d ExecutionDecorator) PostHandle(ctx sdk.Context, tx sdk.Tx, simulate, success bool, next sdk.PostHandler) (sdk.Context, error) {
    28  	feeTx, ok := tx.(sdk.FeeTx)
    29  	if !ok {
    30  		return ctx, sdkerrors.Wrap(sdkerrors.ErrTxDecode, "Tx must be a FeeTx")
    31  	}
    32  
    33  	// execution fee should be prepaid
    34  	for _, msg := range feeTx.GetMsgs() {
    35  		fee := d.customGovKeeper.GetExecutionFee(ctx, kiratypes.MsgType(msg))
    36  		if fee == nil {
    37  			return next(ctx, tx, simulate, success)
    38  		}
    39  
    40  		d.feeprocessingKeeper.SetExecutionStatusSuccess(ctx, msg)
    41  	}
    42  
    43  	return next(ctx, tx, simulate, success)
    44  }