Skip to content

Commit

Permalink
Merge PR #4207: Add rewards and commission tags in txs
Browse files Browse the repository at this point in the history
  • Loading branch information
alexanderbez committed May 3, 2019
1 parent 5f59b70 commit 9ac4730
Show file tree
Hide file tree
Showing 10 changed files with 50 additions and 45 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ actually work offline.

* [\#4219](https://github.com/cosmos/cosmos-sdk/issues/4219) Return an error when an empty mnemonic is provided during key recovery.

### New features

#### SDK

* [\#3850](https://github.com/cosmos/cosmos-sdk/issues/3850) Add `rewards` and `commission` to distribution tx tags.

## 0.34.3

### Bug Fixes
Expand Down
4 changes: 2 additions & 2 deletions cmd/gaia/app/export.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,14 +84,14 @@ func (app *GaiaApp) prepForZeroHeightGenesis(ctx sdk.Context, jailWhiteList []st

// withdraw all validator commission
app.stakingKeeper.IterateValidators(ctx, func(_ int64, val sdk.Validator) (stop bool) {
_ = app.distrKeeper.WithdrawValidatorCommission(ctx, val.GetOperator())
_, _ = app.distrKeeper.WithdrawValidatorCommission(ctx, val.GetOperator())
return false
})

// withdraw all delegator rewards
dels := app.stakingKeeper.GetAllDelegations(ctx)
for _, delegation := range dels {
_ = app.distrKeeper.WithdrawDelegationRewards(ctx, delegation.DelegatorAddress, delegation.ValidatorAddress)
_, _ = app.distrKeeper.WithdrawDelegationRewards(ctx, delegation.DelegatorAddress, delegation.ValidatorAddress)
}

// clear validator slash events
Expand Down
14 changes: 5 additions & 9 deletions docs/spec/distribution/06_tags.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,20 @@ The distribution module emits the following events/tags:
### MsgSetWithdrawAddress

| Key | Value |
|-----------|---------------------------|
| delegator | {delegatorAccountAddress} |

### MsgWithdrawDelegatorRewardsAll

| Key | Value |
|-----------|---------------------------|
| --------- | ------------------------- |
| delegator | {delegatorAccountAddress} |

### MsgWithdrawDelegatorReward

| Key | Value |
|------------------|---------------------------|
| ---------------- | ------------------------- |
| rewards | {rewards} |
| delegator | {delegatorAccountAddress} |
| source-validator | {srcOperatorAddress} |

### MsgWithdrawValidatorRewardsAll

| Key | Value |
|------------------|----------------------|
| ---------------- | -------------------- |
| commission | {commission} |
| source-validator | {srcOperatorAddress} |
24 changes: 11 additions & 13 deletions x/distribution/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,32 +41,30 @@ func handleMsgModifyWithdrawAddress(ctx sdk.Context, msg types.MsgSetWithdrawAdd
}

func handleMsgWithdrawDelegatorReward(ctx sdk.Context, msg types.MsgWithdrawDelegatorReward, k keeper.Keeper) sdk.Result {

err := k.WithdrawDelegationRewards(ctx, msg.DelegatorAddress, msg.ValidatorAddress)
rewards, err := k.WithdrawDelegationRewards(ctx, msg.DelegatorAddress, msg.ValidatorAddress)
if err != nil {
return err.Result()
}

tags := sdk.NewTags(
tags.Delegator, []byte(msg.DelegatorAddress.String()),
tags.Validator, []byte(msg.ValidatorAddress.String()),
)
return sdk.Result{
Tags: tags,
Tags: sdk.NewTags(
tags.Rewards, rewards.String(),
tags.Delegator, []byte(msg.DelegatorAddress.String()),
tags.Validator, []byte(msg.ValidatorAddress.String()),
),
}
}

func handleMsgWithdrawValidatorCommission(ctx sdk.Context, msg types.MsgWithdrawValidatorCommission, k keeper.Keeper) sdk.Result {

err := k.WithdrawValidatorCommission(ctx, msg.ValidatorAddress)
commission, err := k.WithdrawValidatorCommission(ctx, msg.ValidatorAddress)
if err != nil {
return err.Result()
}

tags := sdk.NewTags(
tags.Validator, []byte(msg.ValidatorAddress.String()),
)
return sdk.Result{
Tags: tags,
Tags: sdk.NewTags(
tags.Commission, commission.String(),
tags.Validator, []byte(msg.ValidatorAddress.String()),
),
}
}
9 changes: 4 additions & 5 deletions x/distribution/keeper/delegation.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,11 +115,10 @@ func (k Keeper) calculateDelegationRewards(ctx sdk.Context, val sdk.Validator, d
return rewards
}

func (k Keeper) withdrawDelegationRewards(ctx sdk.Context, val sdk.Validator, del sdk.Delegation) sdk.Error {

func (k Keeper) withdrawDelegationRewards(ctx sdk.Context, val sdk.Validator, del sdk.Delegation) (sdk.Coins, sdk.Error) {
// check existence of delegator starting info
if !k.HasDelegatorStartingInfo(ctx, del.GetValidatorAddr(), del.GetDelegatorAddr()) {
return types.ErrNoDelegationDistInfo(k.codespace)
return nil, types.ErrNoDelegationDistInfo(k.codespace)
}

// end current period and calculate rewards
Expand Down Expand Up @@ -154,12 +153,12 @@ func (k Keeper) withdrawDelegationRewards(ctx sdk.Context, val sdk.Validator, de
if !coins.IsZero() {
withdrawAddr := k.GetDelegatorWithdrawAddr(ctx, del.GetDelegatorAddr())
if _, _, err := k.bankKeeper.AddCoins(ctx, withdrawAddr, coins); err != nil {
return err
return nil, err
}
}

// remove delegator starting info
k.DeleteDelegatorStartingInfo(ctx, del.GetValidatorAddr(), del.GetDelegatorAddr())

return nil
return coins, nil
}
6 changes: 4 additions & 2 deletions x/distribution/keeper/delegation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,8 @@ func TestWithdrawDelegationRewardsBasic(t *testing.T) {
require.Equal(t, uint64(2), k.GetValidatorHistoricalReferenceCount(ctx))

// withdraw rewards
require.Nil(t, k.WithdrawDelegationRewards(ctx, sdk.AccAddress(valOpAddr1), valOpAddr1))
_, err := k.WithdrawDelegationRewards(ctx, sdk.AccAddress(valOpAddr1), valOpAddr1)
require.Nil(t, err)

// historical count should still be 2 (added one record, cleared one)
require.Equal(t, uint64(2), k.GetValidatorHistoricalReferenceCount(ctx))
Expand All @@ -316,7 +317,8 @@ func TestWithdrawDelegationRewardsBasic(t *testing.T) {
)

// withdraw commission
require.Nil(t, k.WithdrawValidatorCommission(ctx, valOpAddr1))
_, err = k.WithdrawValidatorCommission(ctx, valOpAddr1)
require.Nil(t, err)

// assert correct balance
exp = balanceTokens.Sub(valTokens).Add(initial)
Expand Down
2 changes: 1 addition & 1 deletion x/distribution/keeper/hooks.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ func (h Hooks) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAd
del := h.k.stakingKeeper.Delegation(ctx, delAddr, valAddr)

// withdraw delegation rewards (which also increments period)
if err := h.k.withdrawDelegationRewards(ctx, val, del); err != nil {
if _, err := h.k.withdrawDelegationRewards(ctx, val, del); err != nil {
panic(err)
}
}
Expand Down
4 changes: 2 additions & 2 deletions x/distribution/keeper/invariants.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,12 @@ func CanWithdrawInvariant(k Keeper, sk types.StakingKeeper) sdk.Invariant {

// iterate over all validators
sk.IterateValidators(ctx, func(_ int64, val sdk.Validator) (stop bool) {
_ = k.WithdrawValidatorCommission(ctx, val.GetOperator())
_, _ = k.WithdrawValidatorCommission(ctx, val.GetOperator())

delegationAddrs, ok := valDelegationAddrs[val.GetOperator().String()]
if ok {
for _, delAddr := range delegationAddrs {
if err := k.WithdrawDelegationRewards(ctx, delAddr, val.GetOperator()); err != nil {
if _, err := k.WithdrawDelegationRewards(ctx, delAddr, val.GetOperator()); err != nil {
panic(err)
}
}
Expand Down
22 changes: 11 additions & 11 deletions x/distribution/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,35 +47,35 @@ func (k Keeper) SetWithdrawAddr(ctx sdk.Context, delegatorAddr sdk.AccAddress, w
}

// withdraw rewards from a delegation
func (k Keeper) WithdrawDelegationRewards(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) sdk.Error {
func (k Keeper) WithdrawDelegationRewards(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) (sdk.Coins, sdk.Error) {
val := k.stakingKeeper.Validator(ctx, valAddr)
if val == nil {
return types.ErrNoValidatorDistInfo(k.codespace)
return nil, types.ErrNoValidatorDistInfo(k.codespace)
}

del := k.stakingKeeper.Delegation(ctx, delAddr, valAddr)
if del == nil {
return types.ErrNoDelegationDistInfo(k.codespace)
return nil, types.ErrNoDelegationDistInfo(k.codespace)
}

// withdraw rewards
if err := k.withdrawDelegationRewards(ctx, val, del); err != nil {
return err
rewards, err := k.withdrawDelegationRewards(ctx, val, del)
if err != nil {
return nil, err
}

// reinitialize the delegation
k.initializeDelegation(ctx, valAddr, delAddr)

return nil
return rewards, nil
}

// withdraw validator commission
func (k Keeper) WithdrawValidatorCommission(ctx sdk.Context, valAddr sdk.ValAddress) sdk.Error {

func (k Keeper) WithdrawValidatorCommission(ctx sdk.Context, valAddr sdk.ValAddress) (sdk.Coins, sdk.Error) {
// fetch validator accumulated commission
commission := k.GetValidatorAccumulatedCommission(ctx, valAddr)
if commission.IsZero() {
return types.ErrNoValidatorCommission(k.codespace)
return nil, types.ErrNoValidatorCommission(k.codespace)
}

coins, remainder := commission.TruncateDecimal()
Expand All @@ -90,9 +90,9 @@ func (k Keeper) WithdrawValidatorCommission(ctx sdk.Context, valAddr sdk.ValAddr
withdrawAddr := k.GetDelegatorWithdrawAddr(ctx, accAddr)

if _, _, err := k.bankKeeper.AddCoins(ctx, withdrawAddr, coins); err != nil {
return err
return nil, err
}
}

return nil
return coins, nil
}
4 changes: 4 additions & 0 deletions x/distribution/tags/tags.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
)

// Distribution tx tags
var (
Rewards = "rewards"
Commission = "commission"

Validator = sdk.TagSrcValidator
Delegator = sdk.TagDelegator
)

0 comments on commit 9ac4730

Please sign in to comment.