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

     1  package keeper
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     8  	tmtypes "github.com/fibonacci-chain/fbc/libs/tendermint/types"
     9  	"github.com/fibonacci-chain/fbc/x/distribution/types"
    10  	govTypes "github.com/fibonacci-chain/fbc/x/gov/types"
    11  )
    12  
    13  // withdraw rewards from a delegation
    14  func (k Keeper) WithdrawDelegationRewards(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) (sdk.Coins, error) {
    15  	val := k.stakingKeeper.Validator(ctx, valAddr)
    16  	if val == nil {
    17  		return nil, types.ErrCodeEmptyValidatorDistInfo()
    18  	}
    19  	logger := k.Logger(ctx)
    20  
    21  	del := k.stakingKeeper.Delegator(ctx, delAddr)
    22  	if del == nil {
    23  		return nil, types.ErrCodeEmptyDelegationDistInfo()
    24  	}
    25  
    26  	valAddressArray := del.GetShareAddedValidatorAddresses()
    27  	exist := false
    28  	for _, valAddress := range valAddressArray {
    29  		if valAddress.Equals(valAddr) {
    30  			exist = true
    31  			break
    32  		}
    33  	}
    34  	if !exist {
    35  		return nil, types.ErrCodeEmptyDelegationVoteValidator()
    36  	}
    37  
    38  	// withdraw rewards
    39  	rewards, err := k.withdrawDelegationRewards(ctx, val, delAddr)
    40  	if err != nil {
    41  		return nil, err
    42  	}
    43  
    44  	ctx.EventManager().EmitEvent(
    45  		sdk.NewEvent(
    46  			types.EventTypeWithdrawRewards,
    47  			sdk.NewAttribute(sdk.AttributeKeyAmount, rewards.String()),
    48  			sdk.NewAttribute(types.AttributeKeyValidator, valAddr.String()),
    49  		),
    50  	)
    51  
    52  	// reinitialize the delegation
    53  	k.initializeDelegation(ctx, valAddr, delAddr)
    54  	logger.Debug("WithdrawDelegationRewards", "Validator", valAddr, "Delegator", delAddr)
    55  	return rewards, nil
    56  }
    57  
    58  // withdraw all rewards
    59  func (k Keeper) WithdrawDelegationAllRewards(ctx sdk.Context, delAddr sdk.AccAddress) error {
    60  	del := k.stakingKeeper.Delegator(ctx, delAddr)
    61  	if del == nil {
    62  		return types.ErrCodeEmptyDelegationDistInfo()
    63  	}
    64  
    65  	valAddressArray := del.GetShareAddedValidatorAddresses()
    66  	if len(valAddressArray) == 0 {
    67  		return types.ErrCodeEmptyDelegationVoteValidator()
    68  	}
    69  
    70  	logger := k.Logger(ctx)
    71  	for _, valAddr := range valAddressArray {
    72  		val := k.stakingKeeper.Validator(ctx, valAddr)
    73  		if val == nil {
    74  			return types.ErrCodeEmptyValidatorDistInfo()
    75  		}
    76  		// withdraw rewards
    77  		rewards, err := k.withdrawDelegationRewards(ctx, val, delAddr)
    78  		if err != nil {
    79  			return err
    80  		}
    81  
    82  		ctx.EventManager().EmitEvent(
    83  			sdk.NewEvent(
    84  				types.EventTypeWithdrawRewards,
    85  				sdk.NewAttribute(sdk.AttributeKeyAmount, rewards.String()),
    86  				sdk.NewAttribute(types.AttributeKeyValidator, valAddr.String()),
    87  			),
    88  		)
    89  
    90  		// reinitialize the delegation
    91  		k.initializeDelegation(ctx, valAddr, delAddr)
    92  		logger.Debug("WithdrawDelegationAllRewards", "Validator", valAddr, "Delegator", delAddr)
    93  	}
    94  
    95  	return nil
    96  }
    97  
    98  // GetTotalRewards returns the total amount of fee distribution rewards held in the store
    99  func (k Keeper) GetTotalRewards(ctx sdk.Context) (totalRewards sdk.DecCoins) {
   100  	k.IterateValidatorOutstandingRewards(ctx,
   101  		func(_ sdk.ValAddress, rewards types.ValidatorOutstandingRewards) (stop bool) {
   102  			totalRewards = totalRewards.Add(rewards...)
   103  			return false
   104  		},
   105  	)
   106  
   107  	return totalRewards
   108  }
   109  
   110  // SetGovKeeper sets keeper of gov
   111  func (k *Keeper) SetGovKeeper(gk types.GovKeeper) {
   112  	k.govKeeper = gk
   113  }
   114  
   115  func (k Keeper) CheckDistributionProposalValid(ctx sdk.Context) bool {
   116  	return tmtypes.HigherThanVenus2(ctx.BlockHeight()) && k.CheckInitExistedValidatorFlag(ctx)
   117  }
   118  
   119  // CheckMsgSubmitProposal validates MsgSubmitProposal
   120  func (k Keeper) CheckMsgSubmitProposal(ctx sdk.Context, msg govTypes.MsgSubmitProposal) sdk.Error {
   121  	err := k.govKeeper.CheckMsgSubmitProposal(ctx, msg)
   122  	if err != nil {
   123  		return err
   124  	}
   125  
   126  	log := ctx.Logger()
   127  	switch content := msg.Content.(type) {
   128  	case types.WithdrawRewardEnabledProposal, types.ChangeDistributionTypeProposal, types.RewardTruncatePrecisionProposal:
   129  		log.Debug(fmt.Sprintf("proposal content type: %T", content))
   130  		if !k.stakingKeeper.IsValidator(ctx, msg.Proposer) {
   131  			return types.ErrCodeProposerMustBeValidator()
   132  		}
   133  	case types.CommunityPoolSpendProposal:
   134  		return nil
   135  	default:
   136  		return sdk.ErrUnknownRequest(fmt.Sprintf("unrecognized %s proposal content type: %T", types.DefaultCodespace, content))
   137  	}
   138  
   139  	return nil
   140  }
   141  
   142  // nolint
   143  func (keeper Keeper) GetMinDeposit(ctx sdk.Context, content govTypes.Content) (minDeposit sdk.SysCoins) {
   144  	return keeper.govKeeper.GetDepositParams(ctx).MinDeposit
   145  }
   146  
   147  // nolint
   148  func (keeper Keeper) GetMaxDepositPeriod(ctx sdk.Context, content govTypes.Content) time.Duration {
   149  	return keeper.govKeeper.GetDepositParams(ctx).MaxDepositPeriod
   150  }
   151  
   152  // nolint
   153  func (keeper Keeper) GetVotingPeriod(ctx sdk.Context, content govTypes.Content) time.Duration {
   154  	return keeper.govKeeper.GetVotingParams(ctx).VotingPeriod
   155  }
   156  
   157  // nolint
   158  func (k Keeper) AfterSubmitProposalHandler(_ sdk.Context, _ govTypes.Proposal) {}
   159  func (k Keeper) AfterDepositPeriodPassed(_ sdk.Context, _ govTypes.Proposal)   {}
   160  func (k Keeper) RejectedHandler(_ sdk.Context, _ govTypes.Content)             {}
   161  func (k Keeper) VoteHandler(_ sdk.Context, _ govTypes.Proposal, _ govTypes.Vote) (string, sdk.Error) {
   162  	return "", nil
   163  }