github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/crisis/handler.go (about)

     1  package crisis
     2  
     3  import (
     4  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     5  	sdkerrors "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/errors"
     6  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/crisis/internal/keeper"
     7  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/crisis/internal/types"
     8  )
     9  
    10  // RouterKey
    11  const RouterKey = types.ModuleName
    12  
    13  func NewHandler(k keeper.Keeper) sdk.Handler {
    14  	return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
    15  		ctx.SetEventManager(sdk.NewEventManager())
    16  
    17  		switch msg := msg.(type) {
    18  		//case types.MsgVerifyInvariant:
    19  		//	return handleMsgVerifyInvariant(ctx, msg, k)
    20  
    21  		default:
    22  			return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized crisis message type: %T", msg)
    23  		}
    24  	}
    25  }
    26  
    27  func handleMsgVerifyInvariant(ctx sdk.Context, msg types.MsgVerifyInvariant, k keeper.Keeper) (*sdk.Result, error) {
    28  	constantFee := sdk.NewCoins(k.GetConstantFee(ctx))
    29  
    30  	if err := k.SendCoinsFromAccountToFeeCollector(ctx, msg.Sender, constantFee); err != nil {
    31  		return nil, err
    32  	}
    33  
    34  	// use a cached context to avoid gas costs during invariants
    35  	cacheCtx, _ := ctx.CacheContext()
    36  
    37  	found := false
    38  	msgFullRoute := msg.FullInvariantRoute()
    39  
    40  	var res string
    41  	var stop bool
    42  	for _, invarRoute := range k.Routes() {
    43  		if invarRoute.FullRoute() == msgFullRoute {
    44  			res, stop = invarRoute.Invar(cacheCtx)
    45  			found = true
    46  			break
    47  		}
    48  	}
    49  
    50  	if !found {
    51  		return nil, types.ErrUnknownInvariant
    52  	}
    53  
    54  	if stop {
    55  		// NOTE currently, because the chain halts here, this transaction will never be included
    56  		// in the blockchain thus the constant fee will have never been deducted. Thus no
    57  		// refund is required.
    58  
    59  		// TODO uncomment the following code block with implementation of the circuit breaker
    60  		//// refund constant fee
    61  		//err := k.distrKeeper.DistributeFromFeePool(ctx, constantFee, msg.Sender)
    62  		//if err != nil {
    63  		//// if there are insufficient coins to refund, log the error,
    64  		//// but still halt the chain.
    65  		//logger := ctx.Logger().With("module", "x/crisis")
    66  		//logger.Error(fmt.Sprintf(
    67  		//"WARNING: insufficient funds to allocate to sender from fee pool, err: %s", err))
    68  		//}
    69  
    70  		// TODO replace with circuit breaker
    71  		panic(res)
    72  	}
    73  
    74  	ctx.EventManager().EmitEvents(sdk.Events{
    75  		sdk.NewEvent(
    76  			types.EventTypeInvariant,
    77  			sdk.NewAttribute(types.AttributeKeyRoute, msg.InvariantRoute),
    78  		),
    79  		sdk.NewEvent(
    80  			sdk.EventTypeMessage,
    81  			sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCrisis),
    82  			sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender.String()),
    83  		),
    84  	})
    85  
    86  	return &sdk.Result{Events: ctx.EventManager().Events()}, nil
    87  }