refactor(distribution)!: use collections for validator accumulated commission state (#16571)
Co-authored-by: unknown unknown <unknown@unknown>
This commit is contained in:
parent
822e715852
commit
99913cdce0
@ -51,6 +51,8 @@ Ref: https://keepachangelog.com/en/1.0.0/
|
||||
* (x/authz) [#16509](https://github.com/cosmos/cosmos-sdk/pull/16509) `AcceptResponse` has been moved to sdk/types/authz and the `Updated` field is now of the type `sdk.Msg` instead of `authz.Authorization`.
|
||||
* (x/distribution) [#16483](https://github.com/cosmos/cosmos-sdk/pull/16483) use collections for `DelegatorStartingInfo` state management:
|
||||
* remove `Keeper`: `IterateDelegatorStartingInfo`, `GetDelegatorStartingInfo`, `SetDelegatorStartingInfo`, `DeleteDelegatorStartingInfo`, `HasDelegatorStartingInfo`
|
||||
* (x/distribution) [#16571](https://github.com/cosmos/cosmos-sdk/pull/16571) use collections for `ValidatorAccumulatedCommission` state management:
|
||||
* remove `Keeper`: `IterateValidatorAccumulatedCommission`, `GetValidatorAccumulatedCommission`, `SetValidatorAccumulatedCommission`, `DeleteValidatorAccumulatedCommission`
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
|
||||
@ -173,7 +173,7 @@ func TestGRPCValidatorCommission(t *testing.T) {
|
||||
tstaking.CreateValidator(f.valAddr, valConsPk0, sdk.NewInt(initialStake), true)
|
||||
|
||||
commission := sdk.DecCoins{sdk.DecCoin{Denom: "token1", Amount: math.LegacyNewDec(4)}, {Denom: "token2", Amount: math.LegacyNewDec(2)}}
|
||||
assert.NilError(t, f.distrKeeper.SetValidatorAccumulatedCommission(f.sdkCtx, f.valAddr, types.ValidatorAccumulatedCommission{Commission: commission}))
|
||||
assert.NilError(t, f.distrKeeper.ValidatorsAccumulatedCommission.Set(f.sdkCtx, f.valAddr, types.ValidatorAccumulatedCommission{Commission: commission}))
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
|
||||
@ -481,7 +481,7 @@ func TestMsgWithdrawValidatorCommission(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
// set commission
|
||||
err = f.distrKeeper.SetValidatorAccumulatedCommission(f.sdkCtx, f.valAddr, distrtypes.ValidatorAccumulatedCommission{Commission: valCommission})
|
||||
err = f.distrKeeper.ValidatorsAccumulatedCommission.Set(f.sdkCtx, f.valAddr, distrtypes.ValidatorAccumulatedCommission{Commission: valCommission})
|
||||
require.NoError(t, err)
|
||||
|
||||
testCases := []struct {
|
||||
@ -542,7 +542,8 @@ func TestMsgWithdrawValidatorCommission(t *testing.T) {
|
||||
), balance)
|
||||
|
||||
// check remainder
|
||||
remainder, _ := f.distrKeeper.GetValidatorAccumulatedCommission(f.sdkCtx, f.valAddr)
|
||||
remainder, err := f.distrKeeper.ValidatorsAccumulatedCommission.Get(f.sdkCtx, f.valAddr)
|
||||
require.NoError(t, err)
|
||||
assert.DeepEqual(t, sdk.DecCoins{
|
||||
sdk.NewDecCoinFromDec("mytoken", math.LegacyNewDec(1).Quo(math.LegacyNewDec(4))),
|
||||
sdk.NewDecCoinFromDec("stake", math.LegacyNewDec(1).Quo(math.LegacyNewDec(2))),
|
||||
|
||||
@ -95,13 +95,13 @@ func (k Keeper) AllocateTokensToValidator(ctx context.Context, val stakingtypes.
|
||||
sdk.NewAttribute(types.AttributeKeyValidator, val.GetOperator().String()),
|
||||
),
|
||||
)
|
||||
currentCommission, err := k.GetValidatorAccumulatedCommission(ctx, val.GetOperator())
|
||||
if err != nil {
|
||||
currentCommission, err := k.ValidatorsAccumulatedCommission.Get(ctx, val.GetOperator())
|
||||
if err != nil && !errors.Is(err, collections.ErrNotFound) {
|
||||
return err
|
||||
}
|
||||
|
||||
currentCommission.Commission = currentCommission.Commission.Add(commission...)
|
||||
err = k.SetValidatorAccumulatedCommission(ctx, val.GetOperator(), currentCommission)
|
||||
err = k.ValidatorsAccumulatedCommission.Set(ctx, val.GetOperator(), currentCommission)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@ -66,7 +66,7 @@ func TestAllocateTokensToValidatorWithCommission(t *testing.T) {
|
||||
{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDec(5)},
|
||||
}
|
||||
|
||||
valCommission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, val.GetOperator())
|
||||
valCommission, err := distrKeeper.ValidatorsAccumulatedCommission.Get(ctx, val.GetOperator())
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, expected, valCommission.Commission)
|
||||
|
||||
@ -142,13 +142,11 @@ func TestAllocateTokensToManyValidators(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.True(t, feePool.CommunityPool.IsZero())
|
||||
|
||||
val0Commission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr0)
|
||||
require.NoError(t, err)
|
||||
require.True(t, val0Commission.Commission.IsZero())
|
||||
_, err = distrKeeper.ValidatorsAccumulatedCommission.Get(ctx, valAddr0)
|
||||
require.ErrorIs(t, err, collections.ErrNotFound)
|
||||
|
||||
val1Commission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr1)
|
||||
require.NoError(t, err)
|
||||
require.True(t, val1Commission.Commission.IsZero())
|
||||
_, err = distrKeeper.ValidatorsAccumulatedCommission.Get(ctx, valAddr1)
|
||||
require.ErrorIs(t, err, collections.ErrNotFound)
|
||||
|
||||
_, err = distrKeeper.ValidatorCurrentRewards.Get(ctx, valAddr0)
|
||||
require.ErrorIs(t, err, collections.ErrNotFound) // require no rewards
|
||||
@ -186,12 +184,12 @@ func TestAllocateTokensToManyValidators(t *testing.T) {
|
||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDec(2)}}, feePool.CommunityPool)
|
||||
|
||||
// 50% commission for first proposer, (0.5 * 98%) * 100 / 2 = 23.25
|
||||
val0Commission, err = distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr0)
|
||||
val0Commission, err := distrKeeper.ValidatorsAccumulatedCommission.Get(ctx, valAddr0)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecWithPrec(2450, 2)}}, val0Commission.Commission)
|
||||
|
||||
// zero commission for second proposer
|
||||
val1Commission, err = distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr1)
|
||||
val1Commission, err := distrKeeper.ValidatorsAccumulatedCommission.Get(ctx, valAddr1)
|
||||
require.NoError(t, err)
|
||||
require.True(t, val1Commission.Commission.IsZero())
|
||||
|
||||
@ -283,13 +281,11 @@ func TestAllocateTokensTruncation(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.True(t, feePool.CommunityPool.IsZero())
|
||||
|
||||
val0Commission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr0)
|
||||
require.NoError(t, err)
|
||||
require.True(t, val0Commission.Commission.IsZero())
|
||||
_, err = distrKeeper.ValidatorsAccumulatedCommission.Get(ctx, valAddr0)
|
||||
require.ErrorIs(t, err, collections.ErrNotFound)
|
||||
|
||||
val1Commission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr1)
|
||||
require.NoError(t, err)
|
||||
require.True(t, val1Commission.Commission.IsZero())
|
||||
_, err = distrKeeper.ValidatorsAccumulatedCommission.Get(ctx, valAddr1)
|
||||
require.ErrorIs(t, err, collections.ErrNotFound)
|
||||
|
||||
_, err = distrKeeper.ValidatorCurrentRewards.Get(ctx, valAddr0)
|
||||
require.ErrorIs(t, err, collections.ErrNotFound) // require no rewards
|
||||
|
||||
@ -100,7 +100,7 @@ func TestCalculateRewardsBasic(t *testing.T) {
|
||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDec(initial / 2)}}, rewards)
|
||||
|
||||
// commission should be the other half
|
||||
valCommission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr)
|
||||
valCommission, err := distrKeeper.ValidatorsAccumulatedCommission.Get(ctx, valAddr)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDec(initial / 2)}}, valCommission.Commission)
|
||||
}
|
||||
@ -199,7 +199,7 @@ func TestCalculateRewardsAfterSlash(t *testing.T) {
|
||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecFromInt(initial.QuoRaw(2))}}, rewards)
|
||||
|
||||
// commission should be the other half
|
||||
valCommission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr)
|
||||
valCommission, err := distrKeeper.ValidatorsAccumulatedCommission.Get(ctx, valAddr)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecFromInt(initial.QuoRaw(2))}},
|
||||
valCommission.Commission)
|
||||
@ -319,7 +319,7 @@ func TestCalculateRewardsAfterManySlashes(t *testing.T) {
|
||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecFromInt(initial)}}, rewards)
|
||||
|
||||
// commission should be the other half
|
||||
valCommission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr)
|
||||
valCommission, err := distrKeeper.ValidatorsAccumulatedCommission.Get(ctx, valAddr)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDecFromInt(initial)}},
|
||||
valCommission.Commission)
|
||||
@ -415,7 +415,7 @@ func TestCalculateRewardsMultiDelegator(t *testing.T) {
|
||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDec(initial * 1 / 4)}}, rewards)
|
||||
|
||||
// commission should be equal to initial (50% twice)
|
||||
valCommission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr)
|
||||
valCommission, err := distrKeeper.ValidatorsAccumulatedCommission.Get(ctx, valAddr)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDec(initial)}}, valCommission.Commission)
|
||||
}
|
||||
@ -600,7 +600,7 @@ func TestCalculateRewardsAfterManySlashesInSameBlock(t *testing.T) {
|
||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial}}, rewards)
|
||||
|
||||
// commission should be the other half
|
||||
valCommission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr)
|
||||
valCommission, err := distrKeeper.ValidatorsAccumulatedCommission.Get(ctx, valAddr)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial}}, valCommission.Commission)
|
||||
}
|
||||
@ -732,7 +732,7 @@ func TestCalculateRewardsMultiDelegatorMultiSlash(t *testing.T) {
|
||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial.QuoInt64(3)}}, rewards)
|
||||
|
||||
// commission should be equal to initial (twice 50% commission, unaffected by slashing)
|
||||
valCommission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr)
|
||||
valCommission, err := distrKeeper.ValidatorsAccumulatedCommission.Get(ctx, valAddr)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial}}, valCommission.Commission)
|
||||
}
|
||||
@ -860,7 +860,7 @@ func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) {
|
||||
require.True(t, rewards.IsZero())
|
||||
|
||||
// commission should be zero
|
||||
valCommission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr)
|
||||
valCommission, err := distrKeeper.ValidatorsAccumulatedCommission.Get(ctx, valAddr)
|
||||
require.NoError(t, err)
|
||||
require.True(t, valCommission.Commission.IsZero())
|
||||
|
||||
@ -894,7 +894,7 @@ func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) {
|
||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDec(initial / 4)}}, rewards)
|
||||
|
||||
// commission should be half initial
|
||||
valCommission, err = distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr)
|
||||
valCommission, err = distrKeeper.ValidatorsAccumulatedCommission.Get(ctx, valAddr)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDec(initial / 2)}}, valCommission.Commission)
|
||||
|
||||
@ -928,7 +928,7 @@ func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) {
|
||||
require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDec(initial / 2)}}, rewards)
|
||||
|
||||
// commission should be zero
|
||||
valCommission, err = distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr)
|
||||
valCommission, err = distrKeeper.ValidatorsAccumulatedCommission.Get(ctx, valAddr)
|
||||
require.NoError(t, err)
|
||||
require.True(t, valCommission.Commission.IsZero())
|
||||
}
|
||||
|
||||
@ -64,7 +64,7 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data types.GenesisState) {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
err = k.SetValidatorAccumulatedCommission(ctx, valAddr, acc.Accumulated)
|
||||
err = k.ValidatorsAccumulatedCommission.Set(ctx, valAddr, acc.Accumulated)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
@ -175,15 +175,16 @@ func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState {
|
||||
)
|
||||
|
||||
acc := make([]types.ValidatorAccumulatedCommissionRecord, 0)
|
||||
k.IterateValidatorAccumulatedCommissions(ctx,
|
||||
func(addr sdk.ValAddress, commission types.ValidatorAccumulatedCommission) (stop bool) {
|
||||
acc = append(acc, types.ValidatorAccumulatedCommissionRecord{
|
||||
ValidatorAddress: addr.String(),
|
||||
Accumulated: commission,
|
||||
})
|
||||
return false
|
||||
},
|
||||
)
|
||||
err = k.ValidatorsAccumulatedCommission.Walk(ctx, nil, func(addr sdk.ValAddress, commission types.ValidatorAccumulatedCommission) (stop bool, err error) {
|
||||
acc = append(acc, types.ValidatorAccumulatedCommissionRecord{
|
||||
ValidatorAddress: addr.String(),
|
||||
Accumulated: commission,
|
||||
})
|
||||
return false, nil
|
||||
})
|
||||
if err != nil && !errors.Is(err, collections.ErrInvalidIterator) {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
his := make([]types.ValidatorHistoricalRewardsRecord, 0)
|
||||
k.IterateValidatorHistoricalRewards(ctx,
|
||||
|
||||
@ -3,6 +3,7 @@ package keeper
|
||||
import (
|
||||
"context"
|
||||
|
||||
"cosmossdk.io/collections"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
|
||||
@ -77,8 +78,8 @@ func (k Querier) ValidatorDistributionInfo(c context.Context, req *types.QueryVa
|
||||
}
|
||||
|
||||
// validator's commission
|
||||
validatorCommission, err := k.GetValidatorAccumulatedCommission(ctx, valAdr)
|
||||
if err != nil {
|
||||
validatorCommission, err := k.ValidatorsAccumulatedCommission.Get(ctx, valAdr)
|
||||
if err != nil && !errors.IsOf(err, collections.ErrNotFound) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@ -140,8 +141,8 @@ func (k Querier) ValidatorCommission(c context.Context, req *types.QueryValidato
|
||||
if validator == nil {
|
||||
return nil, errors.Wrapf(types.ErrNoValidatorExists, valAdr.String())
|
||||
}
|
||||
commission, err := k.GetValidatorAccumulatedCommission(ctx, valAdr)
|
||||
if err != nil {
|
||||
commission, err := k.ValidatorsAccumulatedCommission.Get(ctx, valAdr)
|
||||
if err != nil && !errors.IsOf(err, collections.ErrNotFound) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,9 @@
|
||||
package keeper
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"cosmossdk.io/collections"
|
||||
sdkmath "cosmossdk.io/math"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
@ -35,8 +38,8 @@ func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, _ sdk.ConsAddress, valAddr
|
||||
}
|
||||
|
||||
// force-withdraw commission
|
||||
valCommission, err := h.k.GetValidatorAccumulatedCommission(ctx, valAddr)
|
||||
if err != nil {
|
||||
valCommission, err := h.k.ValidatorsAccumulatedCommission.Get(ctx, valAddr)
|
||||
if err != nil && !errors.Is(err, collections.ErrNotFound) {
|
||||
return err
|
||||
}
|
||||
|
||||
@ -96,7 +99,7 @@ func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, _ sdk.ConsAddress, valAddr
|
||||
}
|
||||
|
||||
// remove commission record
|
||||
err = h.k.DeleteValidatorAccumulatedCommission(ctx, valAddr)
|
||||
err = h.k.ValidatorsAccumulatedCommission.Remove(ctx, valAddr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@ -9,6 +9,7 @@ import (
|
||||
"cosmossdk.io/core/store"
|
||||
errorsmod "cosmossdk.io/errors"
|
||||
"cosmossdk.io/log"
|
||||
"github.com/cockroachdb/errors"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
@ -27,12 +28,13 @@ type Keeper struct {
|
||||
// should be the x/gov module account.
|
||||
authority string
|
||||
|
||||
Schema collections.Schema
|
||||
Params collections.Item[types.Params]
|
||||
FeePool collections.Item[types.FeePool]
|
||||
DelegatorsWithdrawAddress collections.Map[sdk.AccAddress, sdk.AccAddress]
|
||||
ValidatorCurrentRewards collections.Map[sdk.ValAddress, types.ValidatorCurrentRewards]
|
||||
DelegatorStartingInfo collections.Map[collections.Pair[sdk.ValAddress, sdk.AccAddress], types.DelegatorStartingInfo]
|
||||
Schema collections.Schema
|
||||
Params collections.Item[types.Params]
|
||||
FeePool collections.Item[types.FeePool]
|
||||
DelegatorsWithdrawAddress collections.Map[sdk.AccAddress, sdk.AccAddress]
|
||||
ValidatorCurrentRewards collections.Map[sdk.ValAddress, types.ValidatorCurrentRewards]
|
||||
DelegatorStartingInfo collections.Map[collections.Pair[sdk.ValAddress, sdk.AccAddress], types.DelegatorStartingInfo]
|
||||
ValidatorsAccumulatedCommission collections.Map[sdk.ValAddress, types.ValidatorAccumulatedCommission]
|
||||
|
||||
feeCollectorName string // name of the FeeCollector ModuleAccount
|
||||
}
|
||||
@ -80,6 +82,13 @@ func NewKeeper(
|
||||
collections.PairKeyCodec(sdk.ValAddressKey, sdk.LengthPrefixedAddressKey(sdk.AccAddressKey)), // nolint: staticcheck // sdk.LengthPrefixedAddressKey is needed to retain state compatibility
|
||||
codec.CollValue[types.DelegatorStartingInfo](cdc),
|
||||
),
|
||||
ValidatorsAccumulatedCommission: collections.NewMap(
|
||||
sb,
|
||||
types.ValidatorAccumulatedCommissionPrefix,
|
||||
"validators_accumulated_commission",
|
||||
sdk.LengthPrefixedAddressKey(sdk.ValAddressKey), // nolint: staticcheck // sdk.LengthPrefixedAddressKey is needed to retain state compatibility
|
||||
codec.CollValue[types.ValidatorAccumulatedCommission](cdc),
|
||||
),
|
||||
}
|
||||
|
||||
schema, err := sb.Build()
|
||||
@ -157,8 +166,8 @@ func (k Keeper) WithdrawDelegationRewards(ctx context.Context, delAddr sdk.AccAd
|
||||
// withdraw validator commission
|
||||
func (k Keeper) WithdrawValidatorCommission(ctx context.Context, valAddr sdk.ValAddress) (sdk.Coins, error) {
|
||||
// fetch validator accumulated commission
|
||||
accumCommission, err := k.GetValidatorAccumulatedCommission(ctx, valAddr)
|
||||
if err != nil {
|
||||
accumCommission, err := k.ValidatorsAccumulatedCommission.Get(ctx, valAddr)
|
||||
if err != nil && !errors.Is(err, collections.ErrNotFound) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@ -167,8 +176,10 @@ func (k Keeper) WithdrawValidatorCommission(ctx context.Context, valAddr sdk.Val
|
||||
}
|
||||
|
||||
commission, remainder := accumCommission.Commission.TruncateDecimal()
|
||||
k.SetValidatorAccumulatedCommission(ctx, valAddr, types.ValidatorAccumulatedCommission{Commission: remainder}) // leave remainder to withdraw later
|
||||
|
||||
err = k.ValidatorsAccumulatedCommission.Set(ctx, valAddr, types.ValidatorAccumulatedCommission{Commission: remainder}) // leave remainder to withdraw later
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// update outstanding
|
||||
outstanding, err := k.GetValidatorOutstandingRewards(ctx, valAddr)
|
||||
if err != nil {
|
||||
|
||||
@ -109,7 +109,7 @@ func TestWithdrawValidatorCommission(t *testing.T) {
|
||||
require.NoError(t, distrKeeper.SetValidatorOutstandingRewards(ctx, valAddr, types.ValidatorOutstandingRewards{Rewards: valCommission}))
|
||||
|
||||
// set commission
|
||||
require.NoError(t, distrKeeper.SetValidatorAccumulatedCommission(ctx, valAddr, types.ValidatorAccumulatedCommission{Commission: valCommission}))
|
||||
require.NoError(t, distrKeeper.ValidatorsAccumulatedCommission.Set(ctx, valAddr, types.ValidatorAccumulatedCommission{Commission: valCommission}))
|
||||
|
||||
// withdraw commission
|
||||
coins := sdk.NewCoins(sdk.NewCoin("mytoken", math.NewInt(1)), sdk.NewCoin("stake", math.NewInt(1)))
|
||||
@ -120,7 +120,7 @@ func TestWithdrawValidatorCommission(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
// check remainder
|
||||
remainderValCommission, err := distrKeeper.GetValidatorAccumulatedCommission(ctx, valAddr)
|
||||
remainderValCommission, err := distrKeeper.ValidatorsAccumulatedCommission.Get(ctx, valAddr)
|
||||
require.NoError(t, err)
|
||||
remainder := remainderValCommission.Commission
|
||||
require.Equal(t, sdk.DecCoins{
|
||||
|
||||
@ -129,67 +129,6 @@ func (k Keeper) GetValidatorHistoricalReferenceCount(ctx context.Context) (count
|
||||
return
|
||||
}
|
||||
|
||||
// get accumulated commission for a validator
|
||||
func (k Keeper) GetValidatorAccumulatedCommission(ctx context.Context, val sdk.ValAddress) (commission types.ValidatorAccumulatedCommission, err error) {
|
||||
store := k.storeService.OpenKVStore(ctx)
|
||||
b, err := store.Get(types.GetValidatorAccumulatedCommissionKey(val))
|
||||
if err != nil {
|
||||
return types.ValidatorAccumulatedCommission{}, err
|
||||
}
|
||||
|
||||
if b == nil {
|
||||
return types.ValidatorAccumulatedCommission{}, nil
|
||||
}
|
||||
|
||||
err = k.cdc.Unmarshal(b, &commission)
|
||||
if err != nil {
|
||||
return types.ValidatorAccumulatedCommission{}, err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// set accumulated commission for a validator
|
||||
func (k Keeper) SetValidatorAccumulatedCommission(ctx context.Context, val sdk.ValAddress, commission types.ValidatorAccumulatedCommission) error {
|
||||
var (
|
||||
bz []byte
|
||||
err error
|
||||
)
|
||||
|
||||
store := k.storeService.OpenKVStore(ctx)
|
||||
if commission.Commission.IsZero() {
|
||||
bz, err = k.cdc.Marshal(&types.ValidatorAccumulatedCommission{})
|
||||
} else {
|
||||
bz, err = k.cdc.Marshal(&commission)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return store.Set(types.GetValidatorAccumulatedCommissionKey(val), bz)
|
||||
}
|
||||
|
||||
// delete accumulated commission for a validator
|
||||
func (k Keeper) DeleteValidatorAccumulatedCommission(ctx context.Context, val sdk.ValAddress) error {
|
||||
store := k.storeService.OpenKVStore(ctx)
|
||||
return store.Delete(types.GetValidatorAccumulatedCommissionKey(val))
|
||||
}
|
||||
|
||||
// iterate over accumulated commissions
|
||||
func (k Keeper) IterateValidatorAccumulatedCommissions(ctx context.Context, handler func(val sdk.ValAddress, commission types.ValidatorAccumulatedCommission) (stop bool)) {
|
||||
store := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx))
|
||||
iter := storetypes.KVStorePrefixIterator(store, types.ValidatorAccumulatedCommissionPrefix)
|
||||
defer iter.Close()
|
||||
for ; iter.Valid(); iter.Next() {
|
||||
var commission types.ValidatorAccumulatedCommission
|
||||
k.cdc.MustUnmarshal(iter.Value(), &commission)
|
||||
addr := types.GetValidatorAccumulatedCommissionAddress(iter.Key())
|
||||
if handler(addr, commission) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// get validator outstanding rewards
|
||||
func (k Keeper) GetValidatorOutstandingRewards(ctx context.Context, val sdk.ValAddress) (rewards types.ValidatorOutstandingRewards, err error) {
|
||||
store := k.storeService.OpenKVStore(ctx)
|
||||
|
||||
@ -29,7 +29,7 @@ func (k Keeper) initializeValidator(ctx context.Context, val stakingtypes.Valida
|
||||
}
|
||||
|
||||
// set accumulated commission
|
||||
err = k.SetValidatorAccumulatedCommission(ctx, val.GetOperator(), types.InitialValidatorAccumulatedCommission())
|
||||
err = k.ValidatorsAccumulatedCommission.Set(ctx, val.GetOperator(), types.InitialValidatorAccumulatedCommission())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@ -73,7 +73,7 @@ func TestStoreMigration(t *testing.T) {
|
||||
{
|
||||
"ValidatorAccumulatedCommission",
|
||||
v1.GetValidatorAccumulatedCommissionKey(valAddr),
|
||||
types.GetValidatorAccumulatedCommissionKey(valAddr),
|
||||
append(types.ValidatorAccumulatedCommissionPrefix, address.MustLengthPrefix(valAddr.Bytes())...),
|
||||
},
|
||||
{
|
||||
"ValidatorSlashEvent",
|
||||
|
||||
@ -32,7 +32,6 @@ func TestDecodeDistributionStore(t *testing.T) {
|
||||
feePool := types.InitialFeePool()
|
||||
feePool.CommunityPool = decCoins
|
||||
outstanding := types.ValidatorOutstandingRewards{Rewards: decCoins}
|
||||
commission := types.ValidatorAccumulatedCommission{Commission: decCoins}
|
||||
historicalRewards := types.NewValidatorHistoricalRewards(decCoins, 100)
|
||||
slashEvent := types.NewValidatorSlashEvent(10, math.LegacyOneDec())
|
||||
|
||||
@ -42,7 +41,6 @@ func TestDecodeDistributionStore(t *testing.T) {
|
||||
{Key: types.ProposerKey, Value: consAddr1.Bytes()},
|
||||
{Key: types.GetValidatorOutstandingRewardsKey(valAddr1), Value: cdc.MustMarshal(&outstanding)},
|
||||
{Key: types.GetValidatorHistoricalRewardsKey(valAddr1, 100), Value: cdc.MustMarshal(&historicalRewards)},
|
||||
{Key: types.GetValidatorAccumulatedCommissionKey(valAddr1), Value: cdc.MustMarshal(&commission)},
|
||||
{Key: types.GetValidatorSlashEventKeyPrefix(valAddr1, 13), Value: cdc.MustMarshal(&slashEvent)},
|
||||
{Key: []byte{0x99}, Value: []byte{0x99}},
|
||||
},
|
||||
@ -56,7 +54,6 @@ func TestDecodeDistributionStore(t *testing.T) {
|
||||
{"Proposer", fmt.Sprintf("%v\n%v", consAddr1, consAddr1)},
|
||||
{"ValidatorOutstandingRewards", fmt.Sprintf("%v\n%v", outstanding, outstanding)},
|
||||
{"ValidatorHistoricalRewards", fmt.Sprintf("%v\n%v", historicalRewards, historicalRewards)},
|
||||
{"ValidatorAccumulatedCommission", fmt.Sprintf("%v\n%v", commission, commission)},
|
||||
{"ValidatorSlashEvent", fmt.Sprintf("%v\n%v", slashEvent, slashEvent)},
|
||||
{"other", ""},
|
||||
}
|
||||
|
||||
@ -4,6 +4,7 @@ import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
|
||||
"cosmossdk.io/collections"
|
||||
"github.com/cosmos/cosmos-sdk/baseapp"
|
||||
"github.com/cosmos/cosmos-sdk/client"
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
@ -13,6 +14,7 @@ import (
|
||||
"github.com/cosmos/cosmos-sdk/x/distribution/keeper"
|
||||
"github.com/cosmos/cosmos-sdk/x/distribution/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/simulation"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// Simulation operation weights constants
|
||||
@ -171,8 +173,8 @@ func SimulateMsgWithdrawValidatorCommission(txConfig client.TxConfig, ak types.A
|
||||
return simtypes.NoOpMsg(types.ModuleName, msgType, "random validator is not ok"), nil, nil
|
||||
}
|
||||
|
||||
commission, err := k.GetValidatorAccumulatedCommission(ctx, validator.GetOperator())
|
||||
if err != nil {
|
||||
commission, err := k.ValidatorsAccumulatedCommission.Get(ctx, validator.GetOperator())
|
||||
if err != nil && !errors.Is(err, collections.ErrNotFound) {
|
||||
return simtypes.NoOpMsg(types.ModuleName, msgType, "error getting validator commission"), nil, err
|
||||
}
|
||||
|
||||
|
||||
@ -172,8 +172,8 @@ func (suite *SimTestSuite) testSimulateMsgWithdrawValidatorCommission(tokenName
|
||||
suite.distrKeeper.SetValidatorOutstandingRewards(suite.ctx, suite.genesisVals[0].GetOperator(), types.ValidatorOutstandingRewards{Rewards: valCommission})
|
||||
|
||||
// setup validator accumulated commission
|
||||
suite.distrKeeper.SetValidatorAccumulatedCommission(suite.ctx, validator0.GetOperator(), types.ValidatorAccumulatedCommission{Commission: valCommission})
|
||||
suite.distrKeeper.SetValidatorAccumulatedCommission(suite.ctx, suite.genesisVals[0].GetOperator(), types.ValidatorAccumulatedCommission{Commission: valCommission})
|
||||
suite.Require().NoError(suite.distrKeeper.ValidatorsAccumulatedCommission.Set(suite.ctx, validator0.GetOperator(), types.ValidatorAccumulatedCommission{Commission: valCommission}))
|
||||
suite.Require().NoError(suite.distrKeeper.ValidatorsAccumulatedCommission.Set(suite.ctx, suite.genesisVals[0].GetOperator(), types.ValidatorAccumulatedCommission{Commission: valCommission}))
|
||||
|
||||
suite.app.FinalizeBlock(&abci.RequestFinalizeBlock{
|
||||
Height: suite.app.LastBlockHeight() + 1,
|
||||
|
||||
@ -50,9 +50,9 @@ var (
|
||||
|
||||
DelegatorWithdrawAddrPrefix = collections.NewPrefix(3) // key for delegator withdraw address
|
||||
DelegatorStartingInfoPrefix = collections.NewPrefix(4) // key for delegator starting info
|
||||
ValidatorHistoricalRewardsPrefix = collections.NewPrefix(5) // key for historical validators rewards / stake
|
||||
ValidatorCurrentRewardsPrefix = []byte{0x06} // key for current validator rewards
|
||||
ValidatorAccumulatedCommissionPrefix = []byte{0x07} // key for accumulated validator commission
|
||||
ValidatorHistoricalRewardsPrefix = []byte{0x05} // key for historical validators rewards / stake
|
||||
ValidatorCurrentRewardsPrefix = collections.NewPrefix(6) // key for current validator rewards
|
||||
ValidatorAccumulatedCommissionPrefix = collections.NewPrefix(7) // key for accumulated validator commission
|
||||
ValidatorSlashEventPrefix = []byte{0x08} // key for validator slash fraction
|
||||
|
||||
ParamsKey = collections.NewPrefix(9) // key for distribution module params
|
||||
@ -130,11 +130,6 @@ func GetValidatorHistoricalRewardsKey(v sdk.ValAddress, k uint64) []byte {
|
||||
return append(append(ValidatorHistoricalRewardsPrefix, address.MustLengthPrefix(v.Bytes())...), b...)
|
||||
}
|
||||
|
||||
// GetValidatorAccumulatedCommissionKey creates the key for a validator's current commission.
|
||||
func GetValidatorAccumulatedCommissionKey(v sdk.ValAddress) []byte {
|
||||
return append(ValidatorAccumulatedCommissionPrefix, address.MustLengthPrefix(v.Bytes())...)
|
||||
}
|
||||
|
||||
// GetValidatorSlashEventPrefix creates the prefix key for a validator's slash fractions.
|
||||
func GetValidatorSlashEventPrefix(v sdk.ValAddress) []byte {
|
||||
return append(ValidatorSlashEventPrefix, address.MustLengthPrefix(v.Bytes())...)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user