From 7770aec306152c226eb22bbfe95652553460e746 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Sat, 20 Oct 2018 00:13:44 +0200 Subject: [PATCH] Withdraw rewards on bonded to unbonding --- cmd/gaia/app/app.go | 4 ++-- docs/spec/staking/hooks.md | 2 +- types/stake.go | 4 ++-- x/distribution/keeper/hooks.go | 14 ++++++++++++-- x/slashing/hooks.go | 6 +++--- x/slashing/hooks_test.go | 2 +- x/stake/keeper/hooks.go | 4 ++-- x/stake/keeper/val_state_change.go | 2 +- 8 files changed, 24 insertions(+), 14 deletions(-) diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index 8fba41f60..6c02b7aaa 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -343,8 +343,8 @@ func (h Hooks) OnValidatorRemoved(ctx sdk.Context, addr sdk.ValAddress) { func (h Hooks) OnValidatorBonded(ctx sdk.Context, addr sdk.ConsAddress) { h.sh.OnValidatorBonded(ctx, addr) } -func (h Hooks) OnValidatorBeginUnbonding(ctx sdk.Context, addr sdk.ConsAddress) { - h.sh.OnValidatorBeginUnbonding(ctx, addr) +func (h Hooks) OnValidatorBeginUnbonding(ctx sdk.Context, addr sdk.ConsAddress, operator sdk.ValAddress) { + h.sh.OnValidatorBeginUnbonding(ctx, addr, operator) } func (h Hooks) OnDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { h.dh.OnDelegationCreated(ctx, delAddr, valAddr) diff --git a/docs/spec/staking/hooks.md b/docs/spec/staking/hooks.md index bcc496e3d..60359b431 100644 --- a/docs/spec/staking/hooks.md +++ b/docs/spec/staking/hooks.md @@ -10,7 +10,7 @@ type StakingHooks interface { OnValidatorRemoved(ctx Context, address ValAddress) // called when a validator is deleted OnValidatorBonded(ctx Context, address ConsAddress) // called when a validator is bonded - OnValidatorBeginUnbonding(ctx Context, address ConsAddress) // called when a validator begins unbonding + OnValidatorBeginUnbonding(ctx Context, address ConsAddress, operator ValAddress) // called when a validator begins unbonding OnDelegationCreated(ctx Context, delAddr AccAddress, valAddr ValAddress) // called when a delegation is created OnDelegationSharesModified(ctx Context, delAddr AccAddress, valAddr ValAddress) // called when a delegation's shares are modified diff --git a/types/stake.go b/types/stake.go index d529fa179..b6e48bde7 100644 --- a/types/stake.go +++ b/types/stake.go @@ -115,8 +115,8 @@ type StakingHooks interface { OnValidatorCommissionChange(ctx Context, address ValAddress) // Must be called when a validator's commission is modified OnValidatorRemoved(ctx Context, address ValAddress) // Must be called when a validator is deleted - OnValidatorBonded(ctx Context, address ConsAddress) // Must be called when a validator is bonded - OnValidatorBeginUnbonding(ctx Context, address ConsAddress) // Must be called when a validator begins unbonding + OnValidatorBonded(ctx Context, address ConsAddress) // Must be called when a validator is bonded + OnValidatorBeginUnbonding(ctx Context, address ConsAddress, operator ValAddress) // Must be called when a validator begins unbonding OnDelegationCreated(ctx Context, delAddr AccAddress, valAddr ValAddress) // Must be called when a delegation is created OnDelegationSharesModified(ctx Context, delAddr AccAddress, valAddr ValAddress) // Must be called when a delegation's shares are modified diff --git a/x/distribution/keeper/hooks.go b/x/distribution/keeper/hooks.go index 6031d056b..630404607 100644 --- a/x/distribution/keeper/hooks.go +++ b/x/distribution/keeper/hooks.go @@ -33,6 +33,13 @@ func (k Keeper) onValidatorRemoved(ctx sdk.Context, addr sdk.ValAddress) { k.RemoveValidatorDistInfo(ctx, addr) } +// Withdraw all validator rewards +func (k Keeper) onValidatorBeginUnbonding(ctx sdk.Context, addr sdk.ValAddress) { + if err := k.WithdrawValidatorRewardsAll(ctx, addr); err != nil { + panic(err) + } +} + //_________________________________________________________________________________________ // Create a new delegator distribution record @@ -96,6 +103,9 @@ func (h Hooks) OnDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valA h.k.onDelegationRemoved(ctx, delAddr, valAddr) } +func (h Hooks) OnValidatorBeginUnbonding(ctx sdk.Context, _ sdk.ConsAddress, addr sdk.ValAddress) { + h.k.onValidatorBeginUnbonding(ctx, addr) +} + // nolint - unused hooks for interface -func (h Hooks) OnValidatorBonded(ctx sdk.Context, addr sdk.ConsAddress) {} -func (h Hooks) OnValidatorBeginUnbonding(ctx sdk.Context, addr sdk.ConsAddress) {} +func (h Hooks) OnValidatorBonded(ctx sdk.Context, addr sdk.ConsAddress) {} diff --git a/x/slashing/hooks.go b/x/slashing/hooks.go index ed07bc0c7..d91c69579 100644 --- a/x/slashing/hooks.go +++ b/x/slashing/hooks.go @@ -30,7 +30,7 @@ func (k Keeper) onValidatorBonded(ctx sdk.Context, address sdk.ConsAddress) { } // Mark the slashing period as having ended when a validator begins unbonding -func (k Keeper) onValidatorBeginUnbonding(ctx sdk.Context, address sdk.ConsAddress) { +func (k Keeper) onValidatorBeginUnbonding(ctx sdk.Context, address sdk.ConsAddress, _ sdk.ValAddress) { slashingPeriod := k.getValidatorSlashingPeriodForHeight(ctx, address, ctx.BlockHeight()) slashingPeriod.EndHeight = ctx.BlockHeight() k.addOrUpdateValidatorSlashingPeriod(ctx, slashingPeriod) @@ -56,8 +56,8 @@ func (h Hooks) OnValidatorBonded(ctx sdk.Context, address sdk.ConsAddress) { } // Implements sdk.ValidatorHooks -func (h Hooks) OnValidatorBeginUnbonding(ctx sdk.Context, address sdk.ConsAddress) { - h.k.onValidatorBeginUnbonding(ctx, address) +func (h Hooks) OnValidatorBeginUnbonding(ctx sdk.Context, address sdk.ConsAddress, operator sdk.ValAddress) { + h.k.onValidatorBeginUnbonding(ctx, address, operator) } // nolint - unused hooks diff --git a/x/slashing/hooks_test.go b/x/slashing/hooks_test.go index 951e3637f..96dfab653 100644 --- a/x/slashing/hooks_test.go +++ b/x/slashing/hooks_test.go @@ -20,7 +20,7 @@ func TestHookOnValidatorBeginUnbonding(t *testing.T) { ctx, _, _, _, keeper := createTestInput(t, DefaultParams()) addr := sdk.ConsAddress(addrs[0]) keeper.onValidatorBonded(ctx, addr) - keeper.onValidatorBeginUnbonding(ctx, addr) + keeper.onValidatorBeginUnbonding(ctx, addr, sdk.ValAddress(addrs[0])) period := keeper.getValidatorSlashingPeriodForHeight(ctx, addr, ctx.BlockHeight()) require.Equal(t, ValidatorSlashingPeriod{addr, ctx.BlockHeight(), ctx.BlockHeight(), sdk.ZeroDec()}, period) } diff --git a/x/stake/keeper/hooks.go b/x/stake/keeper/hooks.go index 81bf5594b..060c84f51 100644 --- a/x/stake/keeper/hooks.go +++ b/x/stake/keeper/hooks.go @@ -29,9 +29,9 @@ func (k Keeper) OnValidatorBonded(ctx sdk.Context, address sdk.ConsAddress) { } } -func (k Keeper) OnValidatorBeginUnbonding(ctx sdk.Context, address sdk.ConsAddress) { +func (k Keeper) OnValidatorBeginUnbonding(ctx sdk.Context, address sdk.ConsAddress, operator sdk.ValAddress) { if k.hooks != nil { - k.hooks.OnValidatorBeginUnbonding(ctx, address) + k.hooks.OnValidatorBeginUnbonding(ctx, address, operator) } } diff --git a/x/stake/keeper/val_state_change.go b/x/stake/keeper/val_state_change.go index 89d3f681f..e123bb2b0 100644 --- a/x/stake/keeper/val_state_change.go +++ b/x/stake/keeper/val_state_change.go @@ -219,7 +219,7 @@ func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validat // call the unbond hook if present if k.hooks != nil { - k.hooks.OnValidatorBeginUnbonding(ctx, validator.ConsAddress()) + k.hooks.OnValidatorBeginUnbonding(ctx, validator.ConsAddress(), validator.OperatorAddr) } return validator