From 16d36c75113147343949b6641f887d79461b8123 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Sat, 8 Apr 2023 01:07:06 +0200 Subject: [PATCH 1/5] refactor(distribution): move `ValidateBasic` logic to `msgServer` --- x/distribution/keeper/msg_server.go | 109 +++++++++++++++++++--------- x/distribution/types/msg.go | 79 -------------------- x/distribution/types/msg_test.go | 95 ------------------------ 3 files changed, 74 insertions(+), 209 deletions(-) delete mode 100644 x/distribution/types/msg_test.go diff --git a/x/distribution/keeper/msg_server.go b/x/distribution/keeper/msg_server.go index aaec35b5277c..b2ea2eaa98fe 100644 --- a/x/distribution/keeper/msg_server.go +++ b/x/distribution/keeper/msg_server.go @@ -3,13 +3,12 @@ package keeper import ( "context" + "cosmossdk.io/errors" "github.com/armon/go-metrics" - errorsmod "cosmossdk.io/errors" - "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/errors" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/distribution/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" ) @@ -27,16 +26,17 @@ func NewMsgServerImpl(keeper Keeper) types.MsgServer { } func (k msgServer) SetWithdrawAddress(goCtx context.Context, msg *types.MsgSetWithdrawAddress) (*types.MsgSetWithdrawAddressResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - delegatorAddress, err := k.authKeeper.StringToBytes(msg.DelegatorAddress) if err != nil { - return nil, err + return nil, sdkerrors.ErrInvalidAddress.Wrapf("invalid delegator address: %s", err) } + withdrawAddress, err := k.authKeeper.StringToBytes(msg.WithdrawAddress) if err != nil { - return nil, err + return nil, sdkerrors.ErrInvalidAddress.Wrapf("invalid withdraw address: %s", err) } + + ctx := sdk.UnwrapSDKContext(goCtx) err = k.SetWithdrawAddr(ctx, delegatorAddress, withdrawAddress) if err != nil { return nil, err @@ -46,16 +46,17 @@ func (k msgServer) SetWithdrawAddress(goCtx context.Context, msg *types.MsgSetWi } func (k msgServer) WithdrawDelegatorReward(goCtx context.Context, msg *types.MsgWithdrawDelegatorReward) (*types.MsgWithdrawDelegatorRewardResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) if err != nil { - return nil, err + return nil, sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) } + delegatorAddress, err := k.authKeeper.StringToBytes(msg.DelegatorAddress) if err != nil { - return nil, err + return nil, sdkerrors.ErrInvalidAddress.Wrapf("invalid delegator address: %s", err) } + + ctx := sdk.UnwrapSDKContext(goCtx) amount, err := k.WithdrawDelegationRewards(ctx, delegatorAddress, valAddr) if err != nil { return nil, err @@ -77,12 +78,12 @@ func (k msgServer) WithdrawDelegatorReward(goCtx context.Context, msg *types.Msg } func (k msgServer) WithdrawValidatorCommission(goCtx context.Context, msg *types.MsgWithdrawValidatorCommission) (*types.MsgWithdrawValidatorCommissionResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) if err != nil { - return nil, err + return nil, sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) } + + ctx := sdk.UnwrapSDKContext(goCtx) amount, err := k.Keeper.WithdrawValidatorCommission(ctx, valAddr) if err != nil { return nil, err @@ -104,71 +105,85 @@ func (k msgServer) WithdrawValidatorCommission(goCtx context.Context, msg *types } func (k msgServer) FundCommunityPool(goCtx context.Context, msg *types.MsgFundCommunityPool) (*types.MsgFundCommunityPoolResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - - depositer, err := k.authKeeper.StringToBytes(msg.Depositor) + depositor, err := k.authKeeper.StringToBytes(msg.Depositor) if err != nil { + return nil, sdkerrors.ErrInvalidAddress.Wrapf("invalid depositor address: %s", err) + } + + if err := validateAmount(msg.Amount); err != nil { return nil, err } - if err := k.Keeper.FundCommunityPool(ctx, msg.Amount, depositer); err != nil { + + ctx := sdk.UnwrapSDKContext(goCtx) + if err := k.Keeper.FundCommunityPool(ctx, msg.Amount, depositor); err != nil { return nil, err } return &types.MsgFundCommunityPoolResponse{}, nil } -func (k msgServer) UpdateParams(goCtx context.Context, req *types.MsgUpdateParams) (*types.MsgUpdateParamsResponse, error) { - if k.authority != req.Authority { - return nil, errorsmod.Wrapf(govtypes.ErrInvalidSigner, "invalid authority; expected %s, got %s", k.authority, req.Authority) +func (k msgServer) UpdateParams(goCtx context.Context, msg *types.MsgUpdateParams) (*types.MsgUpdateParamsResponse, error) { + if err := k.validateAuthority(msg.Authority); err != nil { + return nil, err + } + + if (!msg.Params.BaseProposerReward.IsNil() && !msg.Params.BaseProposerReward.IsZero()) || //nolint:staticcheck // deprecated but kept for backwards compatibility + (!msg.Params.BonusProposerReward.IsNil() && !msg.Params.BonusProposerReward.IsZero()) { //nolint:staticcheck // deprecated but kept for backwards compatibility + return nil, errors.Wrapf(sdkerrors.ErrInvalidRequest, "cannot update base or bonus proposer reward because these are deprecated fields") } - if (!req.Params.BaseProposerReward.IsNil() && !req.Params.BaseProposerReward.IsZero()) || //nolint:staticcheck // deprecated but kept for backwards compatibility - (!req.Params.BonusProposerReward.IsNil() && !req.Params.BonusProposerReward.IsZero()) { //nolint:staticcheck // deprecated but kept for backwards compatibility - return nil, errorsmod.Wrapf(errors.ErrInvalidRequest, "cannot update base or bonus proposer reward because these are deprecated fields") + if err := msg.Params.ValidateBasic(); err != nil { + return nil, err } ctx := sdk.UnwrapSDKContext(goCtx) - if err := k.SetParams(ctx, req.Params); err != nil { + if err := k.SetParams(ctx, msg.Params); err != nil { return nil, err } return &types.MsgUpdateParamsResponse{}, nil } -func (k msgServer) CommunityPoolSpend(goCtx context.Context, req *types.MsgCommunityPoolSpend) (*types.MsgCommunityPoolSpendResponse, error) { - if k.authority != req.Authority { - return nil, errorsmod.Wrapf(govtypes.ErrInvalidSigner, "invalid authority; expected %s, got %s", k.authority, req.Authority) +func (k msgServer) CommunityPoolSpend(goCtx context.Context, msg *types.MsgCommunityPoolSpend) (*types.MsgCommunityPoolSpendResponse, error) { + if err := k.validateAuthority(msg.Authority); err != nil { + return nil, err } - ctx := sdk.UnwrapSDKContext(goCtx) + if err := validateAmount(msg.Amount); err != nil { + return nil, err + } - recipient, err := k.authKeeper.StringToBytes(req.Recipient) + recipient, err := k.authKeeper.StringToBytes(msg.Recipient) if err != nil { return nil, err } if k.bankKeeper.BlockedAddr(recipient) { - return nil, errorsmod.Wrapf(errors.ErrUnauthorized, "%s is not allowed to receive external funds", req.Recipient) + return nil, errors.Wrapf(sdkerrors.ErrUnauthorized, "%s is not allowed to receive external funds", msg.Recipient) } - if err := k.DistributeFromFeePool(ctx, req.Amount, recipient); err != nil { + ctx := sdk.UnwrapSDKContext(goCtx) + if err := k.DistributeFromFeePool(ctx, msg.Amount, recipient); err != nil { return nil, err } logger := k.Logger(ctx) - logger.Info("transferred from the community pool to recipient", "amount", req.Amount.String(), "recipient", req.Recipient) + logger.Info("transferred from the community pool to recipient", "amount", msg.Amount.String(), "recipient", msg.Recipient) return &types.MsgCommunityPoolSpendResponse{}, nil } func (k msgServer) DepositValidatorRewardsPool(goCtx context.Context, req *types.MsgDepositValidatorRewardsPool) (*types.MsgDepositValidatorRewardsPoolResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) + if err := k.validateAuthority(req.Authority); err != nil { + return nil, err + } authority, err := k.authKeeper.StringToBytes(req.Authority) if err != nil { return nil, err } + ctx := sdk.UnwrapSDKContext(goCtx) // deposit coins from sender's account to the distribution module if err := k.bankKeeper.SendCoinsFromAccountToModule(ctx, authority, types.ModuleName, req.Amount); err != nil { return nil, err @@ -181,7 +196,7 @@ func (k msgServer) DepositValidatorRewardsPool(goCtx context.Context, req *types validator := k.stakingKeeper.Validator(ctx, valAddr) if validator == nil { - return nil, errorsmod.Wrapf(types.ErrNoValidatorExists, valAddr.String()) + return nil, errors.Wrapf(types.ErrNoValidatorExists, valAddr.String()) } // Allocate tokens from the distribution module to the validator, which are @@ -199,3 +214,27 @@ func (k msgServer) DepositValidatorRewardsPool(goCtx context.Context, req *types return &types.MsgDepositValidatorRewardsPoolResponse{}, nil } + +func (k *Keeper) validateAuthority(authority string) error { + if _, err := k.authKeeper.StringToBytes(authority); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid authority address: %s", err) + } + + if k.authority != authority { + return errors.Wrapf(govtypes.ErrInvalidSigner, "invalid authority; expected %s, got %s", k.authority, authority) + } + + return nil +} + +func validateAmount(amount sdk.Coins) error { + if amount == nil { + return errors.Wrap(sdkerrors.ErrInvalidCoins, "amount cannot be nil") + } + + if err := amount.Validate(); err != nil { + return errors.Wrap(sdkerrors.ErrInvalidCoins, amount.String()) + } + + return nil +} diff --git a/x/distribution/types/msg.go b/x/distribution/types/msg.go index 9e5038664b32..83ac822ab0c4 100644 --- a/x/distribution/types/msg.go +++ b/x/distribution/types/msg.go @@ -1,12 +1,7 @@ package types import ( - "errors" - - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx" ) @@ -46,18 +41,6 @@ func (msg MsgSetWithdrawAddress) GetSignBytes() []byte { return sdk.MustSortJSON(bz) } -// quick validity check -func (msg MsgSetWithdrawAddress) ValidateBasic() error { - if _, err := sdk.AccAddressFromBech32(msg.DelegatorAddress); err != nil { - return sdkerrors.ErrInvalidAddress.Wrapf("invalid delegator address: %s", err) - } - if _, err := sdk.AccAddressFromBech32(msg.WithdrawAddress); err != nil { - return sdkerrors.ErrInvalidAddress.Wrapf("invalid withdraw address: %s", err) - } - - return nil -} - func NewMsgWithdrawDelegatorReward(delAddr sdk.AccAddress, valAddr sdk.ValAddress) *MsgWithdrawDelegatorReward { return &MsgWithdrawDelegatorReward{ DelegatorAddress: delAddr.String(), @@ -77,17 +60,6 @@ func (msg MsgWithdrawDelegatorReward) GetSignBytes() []byte { return sdk.MustSortJSON(bz) } -// quick validity check -func (msg MsgWithdrawDelegatorReward) ValidateBasic() error { - if _, err := sdk.AccAddressFromBech32(msg.DelegatorAddress); err != nil { - return sdkerrors.ErrInvalidAddress.Wrapf("invalid delegator address: %s", err) - } - if _, err := sdk.ValAddressFromBech32(msg.ValidatorAddress); err != nil { - return sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) - } - return nil -} - func NewMsgWithdrawValidatorCommission(valAddr sdk.ValAddress) *MsgWithdrawValidatorCommission { return &MsgWithdrawValidatorCommission{ ValidatorAddress: valAddr.String(), @@ -106,14 +78,6 @@ func (msg MsgWithdrawValidatorCommission) GetSignBytes() []byte { return sdk.MustSortJSON(bz) } -// quick validity check -func (msg MsgWithdrawValidatorCommission) ValidateBasic() error { - if _, err := sdk.ValAddressFromBech32(msg.ValidatorAddress); err != nil { - return sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) - } - return nil -} - // NewMsgFundCommunityPool returns a new MsgFundCommunityPool with a sender and // a funding amount. func NewMsgFundCommunityPool(amount sdk.Coins, depositor sdk.AccAddress) *MsgFundCommunityPool { @@ -137,17 +101,6 @@ func (msg MsgFundCommunityPool) GetSignBytes() []byte { return sdk.MustSortJSON(bz) } -// ValidateBasic performs basic MsgFundCommunityPool message validation. -func (msg MsgFundCommunityPool) ValidateBasic() error { - if !msg.Amount.IsValid() { - return errorsmod.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String()) - } - if _, err := sdk.AccAddressFromBech32(msg.Depositor); err != nil { - return sdkerrors.ErrInvalidAddress.Wrapf("invalid depositor address: %s", err) - } - return nil -} - // GetSigners returns the signer addresses that are expected to sign the result // of GetSignBytes. func (msg MsgUpdateParams) GetSigners() []sdk.AccAddress { @@ -162,20 +115,6 @@ func (msg MsgUpdateParams) GetSignBytes() []byte { return sdk.MustSortJSON(bz) } -// ValidateBasic performs basic MsgUpdateParams message validation. -func (msg MsgUpdateParams) ValidateBasic() error { - if (!msg.Params.BaseProposerReward.IsNil() && !msg.Params.BaseProposerReward.IsZero()) || - (!msg.Params.BonusProposerReward.IsNil() && !msg.Params.BonusProposerReward.IsZero()) { - return errors.New("base and bonus proposer reward are deprecated fields and should not be used") - } - - if _, err := sdk.AccAddressFromBech32(msg.Authority); err != nil { - return sdkerrors.ErrInvalidAddress.Wrapf("invalid authority address: %s", err) - } - - return msg.Params.ValidateBasic() -} - // GetSigners returns the signer addresses that are expected to sign the result // of GetSignBytes, which is the authority. func (msg MsgCommunityPoolSpend) GetSigners() []sdk.AccAddress { @@ -190,15 +129,6 @@ func (msg MsgCommunityPoolSpend) GetSignBytes() []byte { return sdk.MustSortJSON(bz) } -// ValidateBasic performs basic MsgCommunityPoolSpend message validation. -func (msg MsgCommunityPoolSpend) ValidateBasic() error { - if _, err := sdk.AccAddressFromBech32(msg.Authority); err != nil { - return sdkerrors.ErrInvalidAddress.Wrapf("invalid authority address: %s", err) - } - - return msg.Amount.Validate() -} - // NewMsgDepositValidatorRewardsPool returns a new MsgDepositValidatorRewardsPool // with a sender and a funding amount. func NewMsgDepositValidatorRewardsPool(depositor sdk.AccAddress, valAddr sdk.ValAddress, amount sdk.Coins) *MsgDepositValidatorRewardsPool { @@ -222,12 +152,3 @@ func (msg MsgDepositValidatorRewardsPool) GetSignBytes() []byte { bz := ModuleCdc.MustMarshalJSON(&msg) return sdk.MustSortJSON(bz) } - -// ValidateBasic performs basic MsgDepositValidatorRewardsPool message validation. -func (msg MsgDepositValidatorRewardsPool) ValidateBasic() error { - if _, err := sdk.AccAddressFromBech32(msg.Authority); err != nil { - return sdkerrors.ErrInvalidAddress.Wrapf("invalid authority address: %s", err) - } - - return msg.Amount.Validate() -} diff --git a/x/distribution/types/msg_test.go b/x/distribution/types/msg_test.go deleted file mode 100644 index 324626178d04..000000000000 --- a/x/distribution/types/msg_test.go +++ /dev/null @@ -1,95 +0,0 @@ -package types - -import ( - "testing" - - "github.com/stretchr/testify/require" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// test ValidateBasic for MsgSetWithdrawAddress -func TestMsgSetWithdrawAddress(t *testing.T) { - tests := []struct { - delegatorAddr sdk.AccAddress - withdrawAddr sdk.AccAddress - expectPass bool - }{ - {delAddr1, delAddr2, true}, - {delAddr1, delAddr1, true}, - {emptyDelAddr, delAddr1, false}, - {delAddr1, emptyDelAddr, false}, - {emptyDelAddr, emptyDelAddr, false}, - } - - for i, tc := range tests { - msg := NewMsgSetWithdrawAddress(tc.delegatorAddr, tc.withdrawAddr) - if tc.expectPass { - require.Nil(t, msg.ValidateBasic(), "test index: %v", i) - } else { - require.NotNil(t, msg.ValidateBasic(), "test index: %v", i) - } - } -} - -// test ValidateBasic for MsgWithdrawDelegatorReward -func TestMsgWithdrawDelegatorReward(t *testing.T) { - tests := []struct { - delegatorAddr sdk.AccAddress - validatorAddr sdk.ValAddress - expectPass bool - }{ - {delAddr1, valAddr1, true}, - {emptyDelAddr, valAddr1, false}, - {delAddr1, emptyValAddr, false}, - {emptyDelAddr, emptyValAddr, false}, - } - for i, tc := range tests { - msg := NewMsgWithdrawDelegatorReward(tc.delegatorAddr, tc.validatorAddr) - if tc.expectPass { - require.Nil(t, msg.ValidateBasic(), "test index: %v", i) - } else { - require.NotNil(t, msg.ValidateBasic(), "test index: %v", i) - } - } -} - -// test ValidateBasic for MsgWithdrawValidatorCommission -func TestMsgWithdrawValidatorCommission(t *testing.T) { - tests := []struct { - validatorAddr sdk.ValAddress - expectPass bool - }{ - {valAddr1, true}, - {emptyValAddr, false}, - } - for i, tc := range tests { - msg := NewMsgWithdrawValidatorCommission(tc.validatorAddr) - if tc.expectPass { - require.Nil(t, msg.ValidateBasic(), "test index: %v", i) - } else { - require.NotNil(t, msg.ValidateBasic(), "test index: %v", i) - } - } -} - -// test ValidateBasic for MsgDepositIntoCommunityPool -func TestMsgDepositIntoCommunityPool(t *testing.T) { - tests := []struct { - amount sdk.Coins - depositor sdk.AccAddress - expectPass bool - }{ - {sdk.NewCoins(sdk.NewInt64Coin("uatom", 10000)), sdk.AccAddress{}, false}, - {sdk.Coins{sdk.NewInt64Coin("uatom", 10), sdk.NewInt64Coin("uatom", 10)}, delAddr1, false}, - {sdk.NewCoins(sdk.NewInt64Coin("uatom", 1000)), delAddr1, true}, - } - for i, tc := range tests { - msg := NewMsgFundCommunityPool(tc.amount, tc.depositor) - if tc.expectPass { - require.Nil(t, msg.ValidateBasic(), "test index: %v", i) - } else { - require.NotNil(t, msg.ValidateBasic(), "test index: %v", i) - } - } -} From dec84fc24c4f1f57097c441f8ac9988158cd10f3 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Sat, 8 Apr 2023 22:29:46 +0200 Subject: [PATCH 2/5] test parity and renaming --- api/cosmos/distribution/v1beta1/tx.pulsar.go | 60 +++--- proto/cosmos/distribution/v1beta1/tx.proto | 4 +- .../distribution/keeper/msg_server_test.go | 177 +++++++++++++++++- x/distribution/keeper/msg_server.go | 12 +- x/distribution/types/common_test.go | 18 -- x/distribution/types/msg.go | 10 +- x/distribution/types/tx.pb.go | 47 ++--- 7 files changed, 238 insertions(+), 90 deletions(-) delete mode 100644 x/distribution/types/common_test.go diff --git a/api/cosmos/distribution/v1beta1/tx.pulsar.go b/api/cosmos/distribution/v1beta1/tx.pulsar.go index ca4df29996d9..c9edc6f59342 100644 --- a/api/cosmos/distribution/v1beta1/tx.pulsar.go +++ b/api/cosmos/distribution/v1beta1/tx.pulsar.go @@ -5549,7 +5549,7 @@ func (x *_MsgDepositValidatorRewardsPool_3_list) IsValid() bool { var ( md_MsgDepositValidatorRewardsPool protoreflect.MessageDescriptor - fd_MsgDepositValidatorRewardsPool_authority protoreflect.FieldDescriptor + fd_MsgDepositValidatorRewardsPool_depositor protoreflect.FieldDescriptor fd_MsgDepositValidatorRewardsPool_validator_address protoreflect.FieldDescriptor fd_MsgDepositValidatorRewardsPool_amount protoreflect.FieldDescriptor ) @@ -5557,7 +5557,7 @@ var ( func init() { file_cosmos_distribution_v1beta1_tx_proto_init() md_MsgDepositValidatorRewardsPool = File_cosmos_distribution_v1beta1_tx_proto.Messages().ByName("MsgDepositValidatorRewardsPool") - fd_MsgDepositValidatorRewardsPool_authority = md_MsgDepositValidatorRewardsPool.Fields().ByName("authority") + fd_MsgDepositValidatorRewardsPool_depositor = md_MsgDepositValidatorRewardsPool.Fields().ByName("depositor") fd_MsgDepositValidatorRewardsPool_validator_address = md_MsgDepositValidatorRewardsPool.Fields().ByName("validator_address") fd_MsgDepositValidatorRewardsPool_amount = md_MsgDepositValidatorRewardsPool.Fields().ByName("amount") } @@ -5627,9 +5627,9 @@ func (x *fastReflection_MsgDepositValidatorRewardsPool) Interface() protoreflect // While iterating, mutating operations may only be performed // on the current field descriptor. func (x *fastReflection_MsgDepositValidatorRewardsPool) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { - if x.Authority != "" { - value := protoreflect.ValueOfString(x.Authority) - if !f(fd_MsgDepositValidatorRewardsPool_authority, value) { + if x.Depositor != "" { + value := protoreflect.ValueOfString(x.Depositor) + if !f(fd_MsgDepositValidatorRewardsPool_depositor, value) { return } } @@ -5660,8 +5660,8 @@ func (x *fastReflection_MsgDepositValidatorRewardsPool) Range(f func(protoreflec // a repeated field is populated if it is non-empty. func (x *fastReflection_MsgDepositValidatorRewardsPool) Has(fd protoreflect.FieldDescriptor) bool { switch fd.FullName() { - case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.authority": - return x.Authority != "" + case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.depositor": + return x.Depositor != "" case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.validator_address": return x.ValidatorAddress != "" case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.amount": @@ -5682,8 +5682,8 @@ func (x *fastReflection_MsgDepositValidatorRewardsPool) Has(fd protoreflect.Fiel // Clear is a mutating operation and unsafe for concurrent use. func (x *fastReflection_MsgDepositValidatorRewardsPool) Clear(fd protoreflect.FieldDescriptor) { switch fd.FullName() { - case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.authority": - x.Authority = "" + case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.depositor": + x.Depositor = "" case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.validator_address": x.ValidatorAddress = "" case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.amount": @@ -5704,8 +5704,8 @@ func (x *fastReflection_MsgDepositValidatorRewardsPool) Clear(fd protoreflect.Fi // of the value; to obtain a mutable reference, use Mutable. func (x *fastReflection_MsgDepositValidatorRewardsPool) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { switch descriptor.FullName() { - case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.authority": - value := x.Authority + case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.depositor": + value := x.Depositor return protoreflect.ValueOfString(value) case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.validator_address": value := x.ValidatorAddress @@ -5736,8 +5736,8 @@ func (x *fastReflection_MsgDepositValidatorRewardsPool) Get(descriptor protorefl // Set is a mutating operation and unsafe for concurrent use. func (x *fastReflection_MsgDepositValidatorRewardsPool) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { switch fd.FullName() { - case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.authority": - x.Authority = value.Interface().(string) + case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.depositor": + x.Depositor = value.Interface().(string) case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.validator_address": x.ValidatorAddress = value.Interface().(string) case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.amount": @@ -5770,8 +5770,8 @@ func (x *fastReflection_MsgDepositValidatorRewardsPool) Mutable(fd protoreflect. } value := &_MsgDepositValidatorRewardsPool_3_list{list: &x.Amount} return protoreflect.ValueOfList(value) - case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.authority": - panic(fmt.Errorf("field authority of message cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool is not mutable")) + case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.depositor": + panic(fmt.Errorf("field depositor of message cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool is not mutable")) case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.validator_address": panic(fmt.Errorf("field validator_address of message cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool is not mutable")) default: @@ -5787,7 +5787,7 @@ func (x *fastReflection_MsgDepositValidatorRewardsPool) Mutable(fd protoreflect. // For lists, maps, and messages, this returns a new, empty, mutable value. func (x *fastReflection_MsgDepositValidatorRewardsPool) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { switch fd.FullName() { - case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.authority": + case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.depositor": return protoreflect.ValueOfString("") case "cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool.validator_address": return protoreflect.ValueOfString("") @@ -5863,7 +5863,7 @@ func (x *fastReflection_MsgDepositValidatorRewardsPool) ProtoMethods() *protoifa var n int var l int _ = l - l = len(x.Authority) + l = len(x.Depositor) if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) } @@ -5929,10 +5929,10 @@ func (x *fastReflection_MsgDepositValidatorRewardsPool) ProtoMethods() *protoifa i-- dAtA[i] = 0x12 } - if len(x.Authority) > 0 { - i -= len(x.Authority) - copy(dAtA[i:], x.Authority) - i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Authority))) + if len(x.Depositor) > 0 { + i -= len(x.Depositor) + copy(dAtA[i:], x.Depositor) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Depositor))) i-- dAtA[i] = 0xa } @@ -5987,7 +5987,7 @@ func (x *fastReflection_MsgDepositValidatorRewardsPool) ProtoMethods() *protoifa switch fieldNum { case 1: if wireType != 2 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Authority", wireType) + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Depositor", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -6015,7 +6015,7 @@ func (x *fastReflection_MsgDepositValidatorRewardsPool) ProtoMethods() *protoifa if postIndex > l { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF } - x.Authority = string(dAtA[iNdEx:postIndex]) + x.Depositor = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { @@ -6966,7 +6966,7 @@ type MsgDepositValidatorRewardsPool struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` + Depositor string `protobuf:"bytes,1,opt,name=depositor,proto3" json:"depositor,omitempty"` ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty"` Amount []*v1beta1.Coin `protobuf:"bytes,3,rep,name=amount,proto3" json:"amount,omitempty"` } @@ -6991,9 +6991,9 @@ func (*MsgDepositValidatorRewardsPool) Descriptor() ([]byte, []int) { return file_cosmos_distribution_v1beta1_tx_proto_rawDescGZIP(), []int{12} } -func (x *MsgDepositValidatorRewardsPool) GetAuthority() string { +func (x *MsgDepositValidatorRewardsPool) GetDepositor() string { if x != nil { - return x.Authority + return x.Depositor } return "" } @@ -7180,10 +7180,10 @@ var file_cosmos_distribution_v1beta1_tx_proto_rawDesc = []byte{ 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdc, 0x02, 0x0a, 0x1e, 0x4d, 0x73, 0x67, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x36, - 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0a, 0x09, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x09, 0x61, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x45, 0x0a, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x09, 0x64, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x12, 0x45, 0x0a, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x10, 0x76, 0x61, 0x6c, @@ -7196,7 +7196,7 @@ var file_cosmos_distribution_v1beta1_tx_proto_rawDesc = []byte{ 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x69, 0x6e, 0x73, 0x9a, 0xe7, 0xb0, 0x2a, 0x0c, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x63, 0x6f, 0x69, 0x6e, 0x73, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x40, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, - 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x1f, 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x09, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x25, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x2f, 0x4d, 0x73, 0x67, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x56, 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x22, 0x28, 0x0a, 0x26, 0x4d, 0x73, diff --git a/proto/cosmos/distribution/v1beta1/tx.proto b/proto/cosmos/distribution/v1beta1/tx.proto index 6a69bcca7c9c..ebc47eaab9c1 100644 --- a/proto/cosmos/distribution/v1beta1/tx.proto +++ b/proto/cosmos/distribution/v1beta1/tx.proto @@ -193,12 +193,12 @@ message MsgCommunityPoolSpendResponse {} // Since: cosmos-sdk 0.48 message MsgDepositValidatorRewardsPool { option (amino.name) = "cosmos-sdk/distr/MsgDepositValRewards"; - option (cosmos.msg.v1.signer) = "authority"; + option (cosmos.msg.v1.signer) = "depositor"; option (gogoproto.equal) = false; option (gogoproto.goproto_getters) = false; - string authority = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + string depositor = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; string validator_address = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"]; repeated cosmos.base.v1beta1.Coin amount = 3 [ (gogoproto.nullable) = false, diff --git a/tests/integration/distribution/keeper/msg_server_test.go b/tests/integration/distribution/keeper/msg_server_test.go index 4d0411ed00ce..004f67459d5e 100644 --- a/tests/integration/distribution/keeper/msg_server_test.go +++ b/tests/integration/distribution/keeper/msg_server_test.go @@ -11,8 +11,178 @@ import ( minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" stakingtestutil "github.com/cosmos/cosmos-sdk/x/staking/testutil" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/stretchr/testify/require" ) +var ( + emptyDelAddr sdk.AccAddress + emptyValAddr sdk.ValAddress +) + +func TestMsgSetWithdrawAddress(t *testing.T) { + t.Parallel() + f := initFixture(t) + + tests := []struct { + name string + delegatorAddr sdk.AccAddress + withdrawAddr sdk.AccAddress + expErr bool + }{ + { + name: "valid case", + delegatorAddr: f.addrs[0], + withdrawAddr: f.addrs[1], + expErr: false, + }, + { + name: "valid case, same delegator and withdraw address", + delegatorAddr: f.addrs[0], + withdrawAddr: f.addrs[0], + expErr: false, + }, + { + name: "empty delegator address", + delegatorAddr: emptyDelAddr, + withdrawAddr: f.addrs[0], + expErr: true, + }, + { + name: "empty withdraw address", + delegatorAddr: f.addrs[0], + withdrawAddr: emptyDelAddr, + expErr: true, + }, + { + name: "both empty addresses", + delegatorAddr: emptyDelAddr, + withdrawAddr: emptyDelAddr, + expErr: true, + }, + } + + for _, tc := range tests { + msg := types.NewMsgSetWithdrawAddress(tc.delegatorAddr, tc.withdrawAddr) + _, err := f.msgServer.SetWithdrawAddress(f.ctx, msg) + if tc.expErr { + require.NotNil(t, err) + } else { + require.Nil(t, err) + } + } +} + +func TestMsgWithdrawDelegatorReward(t *testing.T) { + t.Parallel() + f := initFixture(t) + + tests := []struct { + name string + delegatorAddr sdk.AccAddress + validatorAddr sdk.ValAddress + expErr bool + }{ + { + name: "empty delegator address", + delegatorAddr: emptyDelAddr, + validatorAddr: f.valAddrs[0], + expErr: true, + }, + { + name: "empty validator address", + delegatorAddr: f.addrs[0], + validatorAddr: emptyValAddr, + expErr: true, + }, + { + name: "both empty addresses", + delegatorAddr: emptyDelAddr, + validatorAddr: emptyValAddr, + expErr: true, + }, + } + for _, tc := range tests { + msg := types.NewMsgWithdrawDelegatorReward(tc.delegatorAddr, tc.validatorAddr) + _, err := f.msgServer.WithdrawDelegatorReward(f.ctx, msg) + if tc.expErr { + require.NotNil(t, err) + } else { + require.Nil(t, err) + } + } +} + +func TestMsgWithdrawValidatorCommission(t *testing.T) { + t.Parallel() + f := initFixture(t) + + tests := []struct { + name string + validatorAddr sdk.ValAddress + expErr bool + }{ + { + name: "valid withdraw", + validatorAddr: f.valAddrs[0], + expErr: true, + }, + { + name: "empty validator address", + validatorAddr: emptyValAddr, + expErr: true, + }, + } + for _, tc := range tests { + msg := types.NewMsgWithdrawValidatorCommission(tc.validatorAddr) + _, err := f.msgServer.WithdrawValidatorCommission(f.ctx, msg) + if tc.expErr { + require.NotNil(t, err) + } else { + require.Nil(t, err) + } + } +} + +func TestMsgFundCommunityPool(t *testing.T) { + t.Parallel() + f := initFixture(t) + + tests := []struct { + name string + amount sdk.Coins + depositor sdk.AccAddress + expErr bool + }{ + { + name: "no depositor", + amount: sdk.NewCoins(sdk.NewInt64Coin("stake", 10000)), + depositor: sdk.AccAddress{}, + expErr: true, + }, + { + name: "invalid coin", + amount: sdk.Coins{sdk.NewInt64Coin("stake", 10), sdk.NewInt64Coin("stake", 10)}, + depositor: f.addrs[0], + expErr: true, + }, + { + name: "valid deposit", + amount: sdk.NewCoins(sdk.NewInt64Coin("stake", 1000)), + depositor: f.addrs[0], + expErr: false, + }, + } + for _, tc := range tests { + msg := types.NewMsgFundCommunityPool(tc.amount, tc.depositor) + _, err := f.msgServer.FundCommunityPool(f.ctx, msg) + if tc.expErr { + require.NotNil(t, err) + } else { + require.Nil(t, err) + } + } +} + func TestMsgUpdateParams(t *testing.T) { t.Parallel() f := initFixture(t) @@ -116,7 +286,6 @@ func TestMsgUpdateParams(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { _, err := f.msgServer.UpdateParams(f.ctx, tc.input) - if tc.expErr { assert.ErrorContains(t, err, tc.expErrMsg) } else { @@ -211,7 +380,7 @@ func TestMsgDepositValidatorRewardsPool(t *testing.T) { { name: "happy path (staking token)", input: &types.MsgDepositValidatorRewardsPool{ - Authority: f.addrs[0].String(), + Depositor: f.addrs[0].String(), ValidatorAddress: f.valAddrs[1].String(), Amount: sdk.NewCoins(sdk.NewCoin(f.stakingKeeper.BondDenom(f.ctx), sdk.NewInt(100))), }, @@ -219,7 +388,7 @@ func TestMsgDepositValidatorRewardsPool(t *testing.T) { { name: "happy path (non-staking token)", input: &types.MsgDepositValidatorRewardsPool{ - Authority: f.addrs[0].String(), + Depositor: f.addrs[0].String(), ValidatorAddress: f.valAddrs[1].String(), Amount: amt, }, @@ -227,7 +396,7 @@ func TestMsgDepositValidatorRewardsPool(t *testing.T) { { name: "invalid validator", input: &types.MsgDepositValidatorRewardsPool{ - Authority: f.addrs[0].String(), + Depositor: f.addrs[0].String(), ValidatorAddress: sdk.ValAddress([]byte("addr1_______________")).String(), Amount: sdk.NewCoins(sdk.NewCoin(f.stakingKeeper.BondDenom(f.ctx), sdk.NewInt(100))), }, diff --git a/x/distribution/keeper/msg_server.go b/x/distribution/keeper/msg_server.go index b2ea2eaa98fe..c855b352dbcf 100644 --- a/x/distribution/keeper/msg_server.go +++ b/x/distribution/keeper/msg_server.go @@ -174,18 +174,14 @@ func (k msgServer) CommunityPoolSpend(goCtx context.Context, msg *types.MsgCommu } func (k msgServer) DepositValidatorRewardsPool(goCtx context.Context, req *types.MsgDepositValidatorRewardsPool) (*types.MsgDepositValidatorRewardsPoolResponse, error) { - if err := k.validateAuthority(req.Authority); err != nil { - return nil, err - } - - authority, err := k.authKeeper.StringToBytes(req.Authority) + depositor, err := k.authKeeper.StringToBytes(req.Depositor) if err != nil { return nil, err } ctx := sdk.UnwrapSDKContext(goCtx) - // deposit coins from sender's account to the distribution module - if err := k.bankKeeper.SendCoinsFromAccountToModule(ctx, authority, types.ModuleName, req.Amount); err != nil { + // deposit coins from depositor's account to the distribution module + if err := k.bankKeeper.SendCoinsFromAccountToModule(ctx, depositor, types.ModuleName, req.Amount); err != nil { return nil, err } @@ -207,7 +203,7 @@ func (k msgServer) DepositValidatorRewardsPool(goCtx context.Context, req *types logger := k.Logger(ctx) logger.Info( "transferred from rewards to validator rewards pool", - "authority", req.Authority, + "depositor", req.Depositor, "amount", req.Amount.String(), "validator", req.ValidatorAddress, ) diff --git a/x/distribution/types/common_test.go b/x/distribution/types/common_test.go deleted file mode 100644 index fd74434eee98..000000000000 --- a/x/distribution/types/common_test.go +++ /dev/null @@ -1,18 +0,0 @@ -package types - -import ( - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -var ( - delPk1 = ed25519.GenPrivKey().PubKey() - delPk2 = ed25519.GenPrivKey().PubKey() - delAddr1 = sdk.AccAddress(delPk1.Address()) - delAddr2 = sdk.AccAddress(delPk2.Address()) - emptyDelAddr sdk.AccAddress - - valPk1 = ed25519.GenPrivKey().PubKey() - valAddr1 = sdk.ValAddress(valPk1.Address()) - emptyValAddr sdk.ValAddress -) diff --git a/x/distribution/types/msg.go b/x/distribution/types/msg.go index 83ac822ab0c4..0e6337769f34 100644 --- a/x/distribution/types/msg.go +++ b/x/distribution/types/msg.go @@ -130,20 +130,20 @@ func (msg MsgCommunityPoolSpend) GetSignBytes() []byte { } // NewMsgDepositValidatorRewardsPool returns a new MsgDepositValidatorRewardsPool -// with a sender and a funding amount. +// with a depositor and a funding amount. func NewMsgDepositValidatorRewardsPool(depositor sdk.AccAddress, valAddr sdk.ValAddress, amount sdk.Coins) *MsgDepositValidatorRewardsPool { return &MsgDepositValidatorRewardsPool{ Amount: amount, - Authority: depositor.String(), + Depositor: depositor.String(), ValidatorAddress: valAddr.String(), } } // GetSigners returns the signer addresses that are expected to sign the result -// of GetSignBytes, which is the authority. +// of GetSignBytes, which is the depositor. func (msg MsgDepositValidatorRewardsPool) GetSigners() []sdk.AccAddress { - authority, _ := sdk.AccAddressFromBech32(msg.Authority) - return []sdk.AccAddress{authority} + depositor, _ := sdk.AccAddressFromBech32(msg.Depositor) + return []sdk.AccAddress{depositor} } // GetSignBytes returns the raw bytes for a MsgDepositValidatorRewardsPool message diff --git a/x/distribution/types/tx.pb.go b/x/distribution/types/tx.pb.go index bc421dddc7ab..bf6a4caaf175 100644 --- a/x/distribution/types/tx.pb.go +++ b/x/distribution/types/tx.pb.go @@ -573,7 +573,7 @@ var xxx_messageInfo_MsgCommunityPoolSpendResponse proto.InternalMessageInfo // // Since: cosmos-sdk 0.48 type MsgDepositValidatorRewardsPool struct { - Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` + Depositor string `protobuf:"bytes,1,opt,name=depositor,proto3" json:"depositor,omitempty"` ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty"` Amount github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,3,rep,name=amount,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"amount"` } @@ -675,7 +675,7 @@ func init() { } var fileDescriptor_ed4f433d965e58ca = []byte{ - // 912 bytes of a gzipped FileDescriptorProto + // 913 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0xb1, 0x6f, 0xf3, 0x44, 0x14, 0xcf, 0xa5, 0xa2, 0x28, 0xf7, 0x7d, 0xd2, 0xd7, 0x44, 0x45, 0x6d, 0xfd, 0x15, 0xa7, 0x72, 0xa1, 0x44, 0x11, 0xb5, 0x95, 0x80, 0x40, 0x0d, 0x03, 0x90, 0xb4, 0x91, 0x18, 0x22, 0xaa, 0x54, @@ -719,20 +719,21 @@ var fileDescriptor_ed4f433d965e58ca = []byte{ 0x05, 0xaf, 0xc3, 0x9c, 0xa5, 0x76, 0x91, 0x89, 0x54, 0x83, 0xba, 0x17, 0xda, 0x9e, 0x2c, 0x04, 0x9c, 0xb6, 0xf0, 0x1f, 0x3b, 0xad, 0xb6, 0x13, 0x55, 0x70, 0x6b, 0x5a, 0x41, 0x29, 0x56, 0x0b, 0x36, 0x4b, 0xa2, 0x1b, 0xbe, 0x8c, 0xbf, 0x64, 0x9d, 0x8e, 0xb5, 0xeb, 0xda, 0xd0, 0x7f, 0xfe, - 0x6e, 0x4b, 0x25, 0xce, 0x1b, 0xbb, 0xab, 0x9e, 0xf7, 0x33, 0x40, 0x1e, 0x52, 0xf8, 0xb7, 0x42, - 0x4f, 0x35, 0x74, 0x01, 0x2f, 0xc6, 0x5d, 0xc0, 0x44, 0x45, 0xa6, 0x9f, 0x50, 0x72, 0xba, 0x6b, - 0x82, 0xba, 0xde, 0x45, 0x54, 0xff, 0x7a, 0x16, 0x2e, 0xb4, 0x88, 0x56, 0xf8, 0x1c, 0xc0, 0x42, - 0xcc, 0x87, 0x4e, 0x35, 0xf1, 0xf5, 0xc5, 0x7e, 0x2f, 0x70, 0xb5, 0xf9, 0x31, 0x7e, 0xb3, 0xff, - 0x06, 0xc0, 0x95, 0x59, 0x1f, 0x18, 0xaf, 0xa7, 0xe5, 0x9d, 0x01, 0xe4, 0xde, 0xbc, 0x23, 0xd0, - 0x67, 0x75, 0x06, 0xe0, 0xd3, 0xa4, 0xe1, 0xfa, 0xc6, 0x6d, 0x0f, 0x88, 0x01, 0x73, 0x8d, 0x7f, - 0x01, 0xf6, 0x19, 0x7e, 0x0a, 0x60, 0x3e, 0x3a, 0xa6, 0x2a, 0x69, 0xa9, 0x23, 0x10, 0x6e, 0x67, - 0x6e, 0x88, 0xcf, 0xc1, 0x82, 0x8f, 0x43, 0x13, 0xe0, 0xe5, 0xb4, 0x54, 0xc1, 0x68, 0xee, 0xd5, - 0x79, 0xa2, 0xfd, 0x33, 0x6d, 0xdb, 0xc6, 0xf4, 0xe2, 0x54, 0xdb, 0x46, 0x31, 0xe9, 0xb6, 0x9d, - 0xdd, 0xce, 0x1c, 0x83, 0x24, 0xf5, 0xb2, 0x54, 0x83, 0x24, 0x80, 0xd3, 0x0d, 0x72, 0x8b, 0x77, - 0xce, 0x3d, 0xf3, 0x89, 0xdd, 0x62, 0xea, 0xef, 0x5e, 0x8e, 0x78, 0x70, 0x35, 0xe2, 0xc1, 0xf5, - 0x88, 0x07, 0xbf, 0x8f, 0x78, 0xf0, 0xf5, 0x0d, 0x9f, 0xb9, 0xbe, 0xe1, 0x33, 0x3f, 0xdf, 0xf0, - 0x99, 0x0f, 0x2b, 0x89, 0x0d, 0xec, 0x34, 0x3c, 0x34, 0x9d, 0x7e, 0xd6, 0x59, 0x74, 0xfe, 0x55, - 0x7a, 0xe5, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0d, 0xb6, 0xd1, 0xb4, 0x1c, 0x0e, 0x00, 0x00, + 0x6e, 0x4b, 0x25, 0xce, 0x1b, 0x0b, 0x19, 0x1d, 0xdc, 0xda, 0xe8, 0xf7, 0x34, 0x40, 0x1e, 0x52, + 0xf8, 0xb7, 0x66, 0x3f, 0xd5, 0x17, 0xe3, 0x2e, 0x60, 0xa2, 0x22, 0xd3, 0x4f, 0x28, 0x39, 0xdd, + 0x35, 0x41, 0x5d, 0xef, 0x22, 0xaa, 0x7f, 0x3d, 0x0b, 0x17, 0x5a, 0x44, 0x2b, 0x7c, 0x0e, 0x60, + 0x21, 0xe6, 0x43, 0xa7, 0x9a, 0xf8, 0xfa, 0x62, 0xbf, 0x17, 0xb8, 0xda, 0xfc, 0x18, 0xbf, 0xd9, + 0x7f, 0x03, 0xe0, 0xca, 0xac, 0x0f, 0x8c, 0xd7, 0xd3, 0xf2, 0xce, 0x00, 0x72, 0x6f, 0xde, 0x11, + 0xe8, 0xb3, 0x3a, 0x03, 0xf0, 0x69, 0xd2, 0x70, 0x7d, 0xe3, 0xb6, 0x07, 0xc4, 0x80, 0xb9, 0xc6, + 0xbf, 0x00, 0xfb, 0x0c, 0x3f, 0x05, 0x30, 0x1f, 0x1d, 0x53, 0x95, 0xb4, 0xd4, 0x11, 0x08, 0xb7, + 0x33, 0x37, 0xc4, 0xe7, 0x60, 0xc1, 0xc7, 0xa1, 0x09, 0xf0, 0x72, 0x5a, 0xaa, 0x60, 0x34, 0xf7, + 0xea, 0x3c, 0xd1, 0xfe, 0x99, 0xb6, 0x6d, 0x63, 0x7a, 0x71, 0xaa, 0x6d, 0xa3, 0x98, 0x74, 0xdb, + 0xce, 0x6e, 0x67, 0x8e, 0x41, 0x92, 0x7a, 0x59, 0xaa, 0x41, 0x12, 0xc0, 0xe9, 0x06, 0xb9, 0xc5, + 0x3b, 0xe7, 0x9e, 0xf9, 0xc4, 0x6e, 0x31, 0xf5, 0x77, 0x2f, 0x47, 0x3c, 0xb8, 0x1a, 0xf1, 0xe0, + 0x7a, 0xc4, 0x83, 0xdf, 0x47, 0x3c, 0xf8, 0xfa, 0x86, 0xcf, 0x5c, 0xdf, 0xf0, 0x99, 0x9f, 0x6f, + 0xf8, 0xcc, 0x87, 0x95, 0xc4, 0x06, 0x76, 0x1a, 0x1e, 0x9a, 0x4e, 0x3f, 0xeb, 0x2c, 0x3a, 0xff, + 0x2a, 0xbd, 0xf2, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd7, 0x20, 0xf3, 0xc2, 0x1c, 0x0e, 0x00, + 0x00, } func (this *MsgSetWithdrawAddressResponse) Equal(that interface{}) bool { @@ -1747,10 +1748,10 @@ func (m *MsgDepositValidatorRewardsPool) MarshalToSizedBuffer(dAtA []byte) (int, i-- dAtA[i] = 0x12 } - if len(m.Authority) > 0 { - i -= len(m.Authority) - copy(dAtA[i:], m.Authority) - i = encodeVarintTx(dAtA, i, uint64(len(m.Authority))) + if len(m.Depositor) > 0 { + i -= len(m.Depositor) + copy(dAtA[i:], m.Depositor) + i = encodeVarintTx(dAtA, i, uint64(len(m.Depositor))) i-- dAtA[i] = 0xa } @@ -1967,7 +1968,7 @@ func (m *MsgDepositValidatorRewardsPool) Size() (n int) { } var l int _ = l - l = len(m.Authority) + l = len(m.Depositor) if l > 0 { n += 1 + l + sovTx(uint64(l)) } @@ -3087,7 +3088,7 @@ func (m *MsgDepositValidatorRewardsPool) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Authority", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Depositor", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -3115,7 +3116,7 @@ func (m *MsgDepositValidatorRewardsPool) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Authority = string(dAtA[iNdEx:postIndex]) + m.Depositor = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { From d8484b0105302bcfdcaa96fb4919b7312b328558 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Sat, 8 Apr 2023 22:57:19 +0200 Subject: [PATCH 3/5] add api replace in tests --- tests/go.mod | 1 + tests/go.sum | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/go.mod b/tests/go.mod index e520f8438104..0ea28cc0de72 100644 --- a/tests/go.mod +++ b/tests/go.mod @@ -190,6 +190,7 @@ require ( // Replace here are pending PRs, or version to be tagged. // It must be in sync with SimApp temporary replaces replace ( + cosmossdk.io/api => ../api // TODO tag all extracted modules after SDK refactor cosmossdk.io/store => ../store cosmossdk.io/x/evidence => ../x/evidence diff --git a/tests/go.sum b/tests/go.sum index 9e4699084d8b..785532b7693c 100644 --- a/tests/go.sum +++ b/tests/go.sum @@ -188,8 +188,6 @@ cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xX cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cosmossdk.io/api v0.4.0 h1:x90DmdidP6EhzktAa/6/IofSHidDnPjahdlrUvyQZQw= -cosmossdk.io/api v0.4.0/go.mod h1:TWDzBhUBhI1LhSf2XSYpfIBf6D4mbLu/fvzvDfhcaYM= cosmossdk.io/client/v2 v2.0.0-20230309163709-87da587416ba h1:LuPHCncU2KLMNPItFECs709uo46I9wSu2fAWYVCx+/U= cosmossdk.io/client/v2 v2.0.0-20230309163709-87da587416ba/go.mod h1:SXdwqO7cN5htalh/lhXWP8V4zKtBrhhcSTU+ytuEtmM= cosmossdk.io/collections v0.0.0-20230309163709-87da587416ba h1:S4PYij/tX3Op/hwenVEN9D+M27JRcwSwVqE3UA0BnwM= From 0ad383d6545f59d9785b0f07ccf962ec3ed4b1b1 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Mon, 10 Apr 2023 22:45:40 +0200 Subject: [PATCH 4/5] updates --- x/distribution/keeper/msg_server.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/x/distribution/keeper/msg_server.go b/x/distribution/keeper/msg_server.go index c855b352dbcf..4e7bbb8e24d7 100644 --- a/x/distribution/keeper/msg_server.go +++ b/x/distribution/keeper/msg_server.go @@ -173,19 +173,19 @@ func (k msgServer) CommunityPoolSpend(goCtx context.Context, msg *types.MsgCommu return &types.MsgCommunityPoolSpendResponse{}, nil } -func (k msgServer) DepositValidatorRewardsPool(goCtx context.Context, req *types.MsgDepositValidatorRewardsPool) (*types.MsgDepositValidatorRewardsPoolResponse, error) { - depositor, err := k.authKeeper.StringToBytes(req.Depositor) +func (k msgServer) DepositValidatorRewardsPool(goCtx context.Context, msg *types.MsgDepositValidatorRewardsPool) (*types.MsgDepositValidatorRewardsPoolResponse, error) { + depositor, err := k.authKeeper.StringToBytes(msg.Depositor) if err != nil { return nil, err } ctx := sdk.UnwrapSDKContext(goCtx) // deposit coins from depositor's account to the distribution module - if err := k.bankKeeper.SendCoinsFromAccountToModule(ctx, depositor, types.ModuleName, req.Amount); err != nil { + if err := k.bankKeeper.SendCoinsFromAccountToModule(ctx, depositor, types.ModuleName, msg.Amount); err != nil { return nil, err } - valAddr, err := sdk.ValAddressFromBech32(req.ValidatorAddress) + valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) if err != nil { return nil, err } @@ -197,15 +197,15 @@ func (k msgServer) DepositValidatorRewardsPool(goCtx context.Context, req *types // Allocate tokens from the distribution module to the validator, which are // then distributed to the validator's delegators. - reward := sdk.NewDecCoinsFromCoins(req.Amount...) + reward := sdk.NewDecCoinsFromCoins(msg.Amount...) k.AllocateTokensToValidator(ctx, validator, reward) logger := k.Logger(ctx) logger.Info( "transferred from rewards to validator rewards pool", - "depositor", req.Depositor, - "amount", req.Amount.String(), - "validator", req.ValidatorAddress, + "depositor", msg.Depositor, + "amount", msg.Amount.String(), + "validator", msg.ValidatorAddress, ) return &types.MsgDepositValidatorRewardsPoolResponse{}, nil From 3c3e07fbdb30691d2008ee640475de04595632f3 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Tue, 11 Apr 2023 09:17:48 +0200 Subject: [PATCH 5/5] update tests --- .../distribution/keeper/msg_server_test.go | 84 ++++++++++++------- 1 file changed, 55 insertions(+), 29 deletions(-) diff --git a/tests/integration/distribution/keeper/msg_server_test.go b/tests/integration/distribution/keeper/msg_server_test.go index 004f67459d5e..2e30a936ff4d 100644 --- a/tests/integration/distribution/keeper/msg_server_test.go +++ b/tests/integration/distribution/keeper/msg_server_test.go @@ -28,6 +28,7 @@ func TestMsgSetWithdrawAddress(t *testing.T) { delegatorAddr sdk.AccAddress withdrawAddr sdk.AccAddress expErr bool + expErrMsg string }{ { name: "valid case", @@ -46,29 +47,35 @@ func TestMsgSetWithdrawAddress(t *testing.T) { delegatorAddr: emptyDelAddr, withdrawAddr: f.addrs[0], expErr: true, + expErrMsg: "invalid delegator address", }, { name: "empty withdraw address", delegatorAddr: f.addrs[0], withdrawAddr: emptyDelAddr, expErr: true, + expErrMsg: "invalid withdraw address", }, { name: "both empty addresses", delegatorAddr: emptyDelAddr, withdrawAddr: emptyDelAddr, expErr: true, + expErrMsg: "invalid delegator address", }, } for _, tc := range tests { - msg := types.NewMsgSetWithdrawAddress(tc.delegatorAddr, tc.withdrawAddr) - _, err := f.msgServer.SetWithdrawAddress(f.ctx, msg) - if tc.expErr { - require.NotNil(t, err) - } else { - require.Nil(t, err) - } + tc := tc + t.Run(tc.name, func(t *testing.T) { + msg := types.NewMsgSetWithdrawAddress(tc.delegatorAddr, tc.withdrawAddr) + _, err := f.msgServer.SetWithdrawAddress(f.ctx, msg) + if tc.expErr { + require.ErrorContains(t, err, tc.expErrMsg) + } else { + require.Nil(t, err) + } + }) } } @@ -81,34 +88,41 @@ func TestMsgWithdrawDelegatorReward(t *testing.T) { delegatorAddr sdk.AccAddress validatorAddr sdk.ValAddress expErr bool + expErrMsg string }{ { name: "empty delegator address", delegatorAddr: emptyDelAddr, validatorAddr: f.valAddrs[0], expErr: true, + expErrMsg: "invalid delegator address", }, { name: "empty validator address", delegatorAddr: f.addrs[0], validatorAddr: emptyValAddr, expErr: true, + expErrMsg: "invalid validator address", }, { name: "both empty addresses", delegatorAddr: emptyDelAddr, validatorAddr: emptyValAddr, expErr: true, + expErrMsg: "invalid validator address", }, } for _, tc := range tests { - msg := types.NewMsgWithdrawDelegatorReward(tc.delegatorAddr, tc.validatorAddr) - _, err := f.msgServer.WithdrawDelegatorReward(f.ctx, msg) - if tc.expErr { - require.NotNil(t, err) - } else { - require.Nil(t, err) - } + tc := tc + t.Run(tc.name, func(t *testing.T) { + msg := types.NewMsgWithdrawDelegatorReward(tc.delegatorAddr, tc.validatorAddr) + _, err := f.msgServer.WithdrawDelegatorReward(f.ctx, msg) + if tc.expErr { + require.ErrorContains(t, err, tc.expErrMsg) + } else { + require.Nil(t, err) + } + }) } } @@ -120,26 +134,32 @@ func TestMsgWithdrawValidatorCommission(t *testing.T) { name string validatorAddr sdk.ValAddress expErr bool + expErrMsg string }{ { - name: "valid withdraw", + name: "valid withdraw (but validator has no commission)", validatorAddr: f.valAddrs[0], expErr: true, + expErrMsg: "no validator commission to withdraw", }, { name: "empty validator address", validatorAddr: emptyValAddr, expErr: true, + expErrMsg: "invalid validator address", }, } for _, tc := range tests { - msg := types.NewMsgWithdrawValidatorCommission(tc.validatorAddr) - _, err := f.msgServer.WithdrawValidatorCommission(f.ctx, msg) - if tc.expErr { - require.NotNil(t, err) - } else { - require.Nil(t, err) - } + tc := tc + t.Run(tc.name, func(t *testing.T) { + msg := types.NewMsgWithdrawValidatorCommission(tc.validatorAddr) + _, err := f.msgServer.WithdrawValidatorCommission(f.ctx, msg) + if tc.expErr { + require.ErrorContains(t, err, tc.expErrMsg) + } else { + require.Nil(t, err) + } + }) } } @@ -152,18 +172,21 @@ func TestMsgFundCommunityPool(t *testing.T) { amount sdk.Coins depositor sdk.AccAddress expErr bool + expErrMsg string }{ { name: "no depositor", amount: sdk.NewCoins(sdk.NewInt64Coin("stake", 10000)), depositor: sdk.AccAddress{}, expErr: true, + expErrMsg: "invalid depositor address", }, { name: "invalid coin", amount: sdk.Coins{sdk.NewInt64Coin("stake", 10), sdk.NewInt64Coin("stake", 10)}, depositor: f.addrs[0], expErr: true, + expErrMsg: "10stake,10stake: invalid coins", }, { name: "valid deposit", @@ -173,13 +196,16 @@ func TestMsgFundCommunityPool(t *testing.T) { }, } for _, tc := range tests { - msg := types.NewMsgFundCommunityPool(tc.amount, tc.depositor) - _, err := f.msgServer.FundCommunityPool(f.ctx, msg) - if tc.expErr { - require.NotNil(t, err) - } else { - require.Nil(t, err) - } + tc := tc + t.Run(tc.name, func(t *testing.T) { + msg := types.NewMsgFundCommunityPool(tc.amount, tc.depositor) + _, err := f.msgServer.FundCommunityPool(f.ctx, msg) + if tc.expErr { + require.ErrorContains(t, err, tc.expErrMsg) + } else { + require.Nil(t, err) + } + }) } }