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 }