Skip to content

Commit c1c23a7

Browse files
authored
fix: ensure withdraw_rewards events are always emitted on reward withdrawal (#13323)
1 parent 412e2fc commit c1c23a7

File tree

6 files changed

+44
-43
lines changed

6 files changed

+44
-43
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
5454

5555
### Improvements
5656

57+
* [#13323](https://github.com/cosmos/cosmos-sdk/pull/13323) Ensure `withdraw_rewards` rewards are emitted from all actions that result in rewards being withdrawn.
5758
* [#13214](https://github.com/cosmos/cosmos-sdk/pull/13214) Add `withdraw-proposal` command to group module's CLI transaction commands.
5859
* [#13070](https://github.com/cosmos/cosmos-sdk/pull/13070) Migrate from `gogo/protobuf` to `cosmos/gogoproto`.
5960
* [#12981](https://github.com/cosmos/cosmos-sdk/pull/12981) Return proper error when parsing telemetry configuration.

tests/integration/distribution/keeper/delegation_test.go

+5-9
Original file line numberDiff line numberDiff line change
@@ -804,19 +804,15 @@ func Test100PercentCommissionReward(t *testing.T) {
804804
rewards, err := distrKeeper.WithdrawDelegationRewards(ctx, sdk.AccAddress(valAddrs[0]), valAddrs[0])
805805
require.NoError(t, err)
806806

807-
denom, _ := sdk.GetBaseDenom()
808-
zeroRewards := sdk.Coins{
809-
sdk.Coin{
810-
Denom: denom,
811-
Amount: math.ZeroInt(),
812-
},
813-
}
807+
zeroRewards := sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, math.ZeroInt())}
814808
require.True(t, rewards.IsEqual(zeroRewards))
809+
815810
events := ctx.EventManager().Events()
816811
lastEvent := events[len(events)-1]
817-
hasValue := false
812+
813+
var hasValue bool
818814
for _, attr := range lastEvent.Attributes {
819-
if string(attr.Key) == "amount" && string(attr.Value) == "0" {
815+
if attr.Key == "amount" && attr.Value == "0stake" {
820816
hasValue = true
821817
}
822818
}

testutil/sims/app_helpers.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"cosmossdk.io/depinject"
1616
"cosmossdk.io/math"
17+
1718
"github.com/cosmos/cosmos-sdk/client/flags"
1819
"github.com/cosmos/cosmos-sdk/codec"
1920
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
@@ -186,8 +187,11 @@ func SetupWithConfiguration(appConfig depinject.Config, startupConfig StartupCon
186187
}
187188

188189
// GenesisStateWithValSet returns a new genesis state with the validator set
189-
func GenesisStateWithValSet(codec codec.Codec, genesisState map[string]json.RawMessage,
190-
valSet *tmtypes.ValidatorSet, genAccs []authtypes.GenesisAccount,
190+
func GenesisStateWithValSet(
191+
codec codec.Codec,
192+
genesisState map[string]json.RawMessage,
193+
valSet *tmtypes.ValidatorSet,
194+
genAccs []authtypes.GenesisAccount,
191195
balances ...banktypes.Balance,
192196
) (map[string]json.RawMessage, error) {
193197
// set genesis accounts
@@ -227,6 +231,7 @@ func GenesisStateWithValSet(codec codec.Codec, genesisState map[string]json.RawM
227231
delegations = append(delegations, stakingtypes.NewDelegation(genAccs[0].GetAddress(), val.Address.Bytes(), math.LegacyOneDec()))
228232

229233
}
234+
230235
// set validators and delegations
231236
stakingGenesis := stakingtypes.NewGenesisState(stakingtypes.DefaultParams(), validators, delegations)
232237
genesisState[stakingtypes.ModuleName] = codec.MustMarshalJSON(stakingGenesis)

x/distribution/keeper/delegation.go

+25-6
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import (
44
"fmt"
55

66
"cosmossdk.io/math"
7-
sdk "github.com/cosmos/cosmos-sdk/types"
87

8+
sdk "github.com/cosmos/cosmos-sdk/types"
99
"github.com/cosmos/cosmos-sdk/x/distribution/types"
1010
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
1111
)
@@ -163,13 +163,13 @@ func (k Keeper) withdrawDelegationRewards(ctx sdk.Context, val stakingtypes.Vali
163163
)
164164
}
165165

166-
// truncate coins, return remainder to community pool
167-
coins, remainder := rewards.TruncateDecimal()
166+
// truncate reward dec coins, return remainder to community pool
167+
finalRewards, remainder := rewards.TruncateDecimal()
168168

169169
// add coins to user account
170-
if !coins.IsZero() {
170+
if !finalRewards.IsZero() {
171171
withdrawAddr := k.GetDelegatorWithdrawAddr(ctx, del.GetDelegatorAddr())
172-
err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, withdrawAddr, coins)
172+
err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, withdrawAddr, finalRewards)
173173
if err != nil {
174174
return nil, err
175175
}
@@ -190,5 +190,24 @@ func (k Keeper) withdrawDelegationRewards(ctx sdk.Context, val stakingtypes.Vali
190190
// remove delegator starting info
191191
k.DeleteDelegatorStartingInfo(ctx, del.GetValidatorAddr(), del.GetDelegatorAddr())
192192

193-
return coins, nil
193+
if finalRewards.IsZero() {
194+
baseDenom, _ := sdk.GetBaseDenom()
195+
if baseDenom == "" {
196+
baseDenom = sdk.DefaultBondDenom
197+
}
198+
199+
// Note, we do not call the NewCoins constructor as we do not want the zero
200+
// coin removed.
201+
finalRewards = sdk.Coins{sdk.NewCoin(baseDenom, math.ZeroInt())}
202+
}
203+
204+
ctx.EventManager().EmitEvent(
205+
sdk.NewEvent(
206+
types.EventTypeWithdrawRewards,
207+
sdk.NewAttribute(sdk.AttributeKeyAmount, finalRewards.String()),
208+
sdk.NewAttribute(types.AttributeKeyValidator, val.GetOperator().String()),
209+
),
210+
)
211+
212+
return finalRewards, nil
194213
}

x/distribution/keeper/delegation_test.go

+6-9
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
99

1010
"cosmossdk.io/math"
11+
1112
"github.com/cosmos/cosmos-sdk/testutil"
1213
sdk "github.com/cosmos/cosmos-sdk/types"
1314
moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
@@ -959,19 +960,15 @@ func Test100PercentCommissionReward(t *testing.T) {
959960
rewards, err := distrKeeper.WithdrawDelegationRewards(ctx, sdk.AccAddress(addr), valAddr)
960961
require.NoError(t, err)
961962

962-
denom, _ := sdk.GetBaseDenom()
963-
zeroRewards := sdk.Coins{
964-
sdk.Coin{
965-
Denom: denom,
966-
Amount: math.ZeroInt(),
967-
},
968-
}
963+
zeroRewards := sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, math.ZeroInt())}
969964
require.True(t, rewards.IsEqual(zeroRewards))
965+
970966
events := ctx.EventManager().Events()
971967
lastEvent := events[len(events)-1]
972-
hasValue := false
968+
969+
var hasValue bool
973970
for _, attr := range lastEvent.Attributes {
974-
if string(attr.Key) == "amount" && string(attr.Value) == "0" {
971+
if attr.Key == "amount" && attr.Value == "0stake" {
975972
hasValue = true
976973
}
977974
}

x/distribution/keeper/keeper.go

-17
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package keeper
33
import (
44
"fmt"
55

6-
"cosmossdk.io/math"
76
"github.com/tendermint/tendermint/libs/log"
87

98
"github.com/cosmos/cosmos-sdk/codec"
@@ -98,22 +97,6 @@ func (k Keeper) WithdrawDelegationRewards(ctx sdk.Context, delAddr sdk.AccAddres
9897
return nil, err
9998
}
10099

101-
if rewards.IsZero() {
102-
baseDenom, _ := sdk.GetBaseDenom()
103-
rewards = sdk.Coins{sdk.Coin{
104-
Denom: baseDenom,
105-
Amount: math.ZeroInt(),
106-
}}
107-
}
108-
109-
ctx.EventManager().EmitEvent(
110-
sdk.NewEvent(
111-
types.EventTypeWithdrawRewards,
112-
sdk.NewAttribute(sdk.AttributeKeyAmount, rewards.String()),
113-
sdk.NewAttribute(types.AttributeKeyValidator, valAddr.String()),
114-
),
115-
)
116-
117100
// reinitialize the delegation
118101
k.initializeDelegation(ctx, valAddr, delAddr)
119102
return rewards, nil

0 commit comments

Comments
 (0)