From 2be19b9d339ff390765bde1aefa827c2a636e80b Mon Sep 17 00:00:00 2001 From: Hendrik Hofstadt Date: Wed, 19 Dec 2018 17:05:33 +0100 Subject: [PATCH] Merge PR #3163: Withdraw commission on self bond removal * Withdraw commission on self bond removal * Update PENDING.md --- PENDING.md | 2 ++ x/distribution/keeper/hooks.go | 4 ++++ x/distribution/keeper/validator.go | 17 +++++++++++++---- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/PENDING.md b/PENDING.md index 4d87301f0..3ed6d0746 100644 --- a/PENDING.md +++ b/PENDING.md @@ -10,6 +10,8 @@ BREAKING CHANGES * SDK + * \#3163 Withdraw commission on self bond removal + * Tendermint diff --git a/x/distribution/keeper/hooks.go b/x/distribution/keeper/hooks.go index e9d31b8a2..613419846 100644 --- a/x/distribution/keeper/hooks.go +++ b/x/distribution/keeper/hooks.go @@ -87,6 +87,10 @@ func (k Keeper) onDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddre // Withdrawal all validator distribution rewards and cleanup the distribution record func (k Keeper) onDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { + if valAddr.Equals(sdk.ValAddress(delAddr)) { + feePool, commission := k.withdrawValidatorCommission(ctx, valAddr) + k.WithdrawToDelegator(ctx, feePool, delAddr, commission) + } k.RemoveDelegationDistInfo(ctx, delAddr, valAddr) } diff --git a/x/distribution/keeper/validator.go b/x/distribution/keeper/validator.go index 4ce0834a7..8d861fef8 100644 --- a/x/distribution/keeper/validator.go +++ b/x/distribution/keeper/validator.go @@ -42,6 +42,9 @@ func (k Keeper) RemoveValidatorDistInfo(ctx sdk.Context, valAddr sdk.ValAddress) if vdi.DelAccum.Accum.IsPositive() { panic("Should not delete validator with unwithdrawn delegator accum") } + if !vdi.ValCommission.IsZero() { + panic("Should not delete validator with unwithdrawn validator commission") + } store := ctx.KVStore(k.storeKey) store.Delete(GetValidatorDistInfoKey(valAddr)) @@ -119,6 +122,15 @@ func (k Keeper) takeValidatorFeePoolRewards(ctx sdk.Context, operatorAddr sdk.Va return nil } +func (k Keeper) withdrawValidatorCommission(ctx sdk.Context, operatorAddr sdk.ValAddress) (types.FeePool, types.DecCoins) { + valInfo := k.GetValidatorDistInfo(ctx, operatorAddr) + wc := k.GetWithdrawContext(ctx, operatorAddr) + valInfo, feePool, commission := valInfo.WithdrawCommission(wc) + k.SetValidatorDistInfo(ctx, valInfo) + + return feePool, commission +} + // withdrawal all the validator rewards including the commission func (k Keeper) WithdrawValidatorRewardsAll(ctx sdk.Context, operatorAddr sdk.ValAddress) sdk.Error { if !k.HasValidatorDistInfo(ctx, operatorAddr) { @@ -130,11 +142,8 @@ func (k Keeper) WithdrawValidatorRewardsAll(ctx sdk.Context, operatorAddr sdk.Va withdraw := k.withdrawDelegationRewardsAll(ctx, accAddr) // withdrawal validator commission rewards - valInfo := k.GetValidatorDistInfo(ctx, operatorAddr) - wc := k.GetWithdrawContext(ctx, operatorAddr) - valInfo, feePool, commission := valInfo.WithdrawCommission(wc) + feePool, commission := k.withdrawValidatorCommission(ctx, operatorAddr) withdraw = withdraw.Plus(commission) - k.SetValidatorDistInfo(ctx, valInfo) k.WithdrawToDelegator(ctx, feePool, accAddr, withdraw) return nil