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 }