github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/distribution/handler.go (about)

     1  package distribution
     2  
     3  import (
     4  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     5  	tmtypes "github.com/fibonacci-chain/fbc/libs/tendermint/types"
     6  
     7  	"github.com/fibonacci-chain/fbc/x/distribution/keeper"
     8  	"github.com/fibonacci-chain/fbc/x/distribution/types"
     9  	govtypes "github.com/fibonacci-chain/fbc/x/gov/types"
    10  )
    11  
    12  // NewHandler manages all distribution tx
    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  		if tmtypes.HigherThanVenus2(ctx.BlockHeight()) && !k.GetWithdrawRewardEnabled(ctx) {
    18  			return nil, types.ErrCodeDisabledWithdrawRewards()
    19  		}
    20  
    21  		switch msg := msg.(type) {
    22  		case types.MsgSetWithdrawAddress:
    23  			return handleMsgModifyWithdrawAddress(ctx, msg, k)
    24  
    25  		case types.MsgWithdrawValidatorCommission:
    26  			return handleMsgWithdrawValidatorCommission(ctx, msg, k)
    27  
    28  		case types.MsgWithdrawDelegatorReward:
    29  			if k.CheckDistributionProposalValid(ctx) {
    30  				return handleMsgWithdrawDelegatorReward(ctx, msg, k)
    31  			}
    32  			return nil, types.ErrUnknownDistributionMsgType()
    33  		case types.MsgWithdrawDelegatorAllRewards:
    34  			if k.CheckDistributionProposalValid(ctx) {
    35  				return handleMsgWithdrawDelegatorAllRewards(ctx, msg, k)
    36  			}
    37  			return nil, types.ErrUnknownDistributionMsgType()
    38  
    39  		default:
    40  			return nil, types.ErrUnknownDistributionMsgType()
    41  		}
    42  	}
    43  }
    44  
    45  // These functions assume everything has been authenticated (ValidateBasic passed, and signatures checked)
    46  func handleMsgModifyWithdrawAddress(ctx sdk.Context, msg types.MsgSetWithdrawAddress, k keeper.Keeper) (*sdk.Result, error) {
    47  	err := k.SetWithdrawAddr(ctx, msg.DelegatorAddress, msg.WithdrawAddress)
    48  	if err != nil {
    49  		return nil, err
    50  	}
    51  
    52  	ctx.EventManager().EmitEvent(
    53  		sdk.NewEvent(
    54  			sdk.EventTypeMessage,
    55  			sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
    56  			sdk.NewAttribute(sdk.AttributeKeySender, msg.DelegatorAddress.String()),
    57  		),
    58  	)
    59  
    60  	return &sdk.Result{Events: ctx.EventManager().Events()}, nil
    61  }
    62  
    63  func handleMsgWithdrawValidatorCommission(ctx sdk.Context, msg types.MsgWithdrawValidatorCommission, k keeper.Keeper) (*sdk.Result, error) {
    64  	_, err := k.WithdrawValidatorCommission(ctx, msg.ValidatorAddress)
    65  	if err != nil {
    66  		return nil, err
    67  	}
    68  
    69  	ctx.EventManager().EmitEvent(
    70  		sdk.NewEvent(
    71  			sdk.EventTypeMessage,
    72  			sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
    73  			sdk.NewAttribute(sdk.AttributeKeySender, msg.ValidatorAddress.String()),
    74  		),
    75  	)
    76  	return &sdk.Result{Events: ctx.EventManager().Events()}, nil
    77  }
    78  
    79  func NewDistributionProposalHandler(k Keeper) govtypes.Handler {
    80  	return func(ctx sdk.Context, content *govtypes.Proposal) error {
    81  		switch c := content.Content.(type) {
    82  		case types.CommunityPoolSpendProposal:
    83  			return keeper.HandleCommunityPoolSpendProposal(ctx, k, c)
    84  		case types.ChangeDistributionTypeProposal:
    85  			if tmtypes.HigherThanVenus2(ctx.BlockHeight()) {
    86  				return keeper.HandleChangeDistributionTypeProposal(ctx, k, c)
    87  			}
    88  			return types.ErrUnknownDistributionCommunityPoolProposaType()
    89  		case types.WithdrawRewardEnabledProposal:
    90  			if tmtypes.HigherThanVenus2(ctx.BlockHeight()) {
    91  				return keeper.HandleWithdrawRewardEnabledProposal(ctx, k, c)
    92  			}
    93  			return types.ErrUnknownDistributionCommunityPoolProposaType()
    94  		case types.RewardTruncatePrecisionProposal:
    95  			if tmtypes.HigherThanVenus2(ctx.BlockHeight()) {
    96  				return keeper.HandleRewardTruncatePrecisionProposal(ctx, k, c)
    97  			}
    98  			return types.ErrUnknownDistributionCommunityPoolProposaType()
    99  
   100  		default:
   101  			return types.ErrUnknownDistributionCommunityPoolProposaType()
   102  		}
   103  	}
   104  }