refactor(upgrade): move ValidateBasic logic to msgServer (#15752)

This commit is contained in:
Julien Robert 2023-04-08 11:05:43 +02:00 committed by GitHub
parent 22eb756e48
commit 722c3f935f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 35 additions and 135 deletions

View File

@ -13,7 +13,7 @@ require (
github.com/cometbft/cometbft v0.37.0
github.com/cosmos/cosmos-db v1.0.0-rc.1
github.com/cosmos/cosmos-proto v1.0.0-beta.3
github.com/cosmos/cosmos-sdk v0.46.0-beta2.0.20230330094838-d21f58c638d5
github.com/cosmos/cosmos-sdk v0.46.0-beta2.0.20230407193120-0a70647deaec
github.com/cosmos/gogoproto v1.4.7
github.com/golang/protobuf v1.5.3
github.com/grpc-ecosystem/grpc-gateway v1.16.0

View File

@ -346,8 +346,8 @@ github.com/cosmos/cosmos-db v1.0.0-rc.1 h1:SjnT8B6WKMW9WEIX32qMhnEEKcI7ZP0+G1Sa9
github.com/cosmos/cosmos-db v1.0.0-rc.1/go.mod h1:Dnmk3flSf5lkwCqvvjNpoxjpXzhxnCAFzKHlbaForso=
github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o=
github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I=
github.com/cosmos/cosmos-sdk v0.46.0-beta2.0.20230330094838-d21f58c638d5 h1:zO3mov9MaHWNnYZyQ8Wz/CZhrjfizMKvvLH41Ro/FYk=
github.com/cosmos/cosmos-sdk v0.46.0-beta2.0.20230330094838-d21f58c638d5/go.mod h1:aKJRE3RjbwJUFGKG+kTDLhrST9vzFr8FlsTlv4eD+80=
github.com/cosmos/cosmos-sdk v0.46.0-beta2.0.20230407193120-0a70647deaec h1:BE559vEyhAjljq+iyCGJsnVnpKl7QgYrJuzP4Ax1QDc=
github.com/cosmos/cosmos-sdk v0.46.0-beta2.0.20230407193120-0a70647deaec/go.mod h1:lD11e/GdgJ5z2KCSN0DkXr0LFLXUrYUGIoF9cVvPU28=
github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y=
github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY=
github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw=

View File

@ -26,10 +26,18 @@ var _ types.MsgServer = msgServer{}
// SoftwareUpgrade implements the Msg/SoftwareUpgrade Msg service.
func (k msgServer) SoftwareUpgrade(goCtx context.Context, req *types.MsgSoftwareUpgrade) (*types.MsgSoftwareUpgradeResponse, error) {
if _, err := sdk.AccAddressFromBech32(req.Authority); err != nil {
return nil, errors.Wrap(err, "authority")
}
if k.authority != req.Authority {
return nil, errors.Wrapf(gov.ErrInvalidSigner, "expected %s got %s", k.authority, req.Authority)
}
if err := req.Plan.ValidateBasic(); err != nil {
return nil, errors.Wrap(err, "plan")
}
ctx := sdk.UnwrapSDKContext(goCtx)
err := k.ScheduleUpgrade(ctx, req.Plan)
if err != nil {
@ -41,6 +49,10 @@ func (k msgServer) SoftwareUpgrade(goCtx context.Context, req *types.MsgSoftware
// CancelUpgrade implements the Msg/CancelUpgrade Msg service.
func (k msgServer) CancelUpgrade(goCtx context.Context, req *types.MsgCancelUpgrade) (*types.MsgCancelUpgradeResponse, error) {
if _, err := sdk.AccAddressFromBech32(req.Authority); err != nil {
return nil, errors.Wrap(err, "authority")
}
if k.authority != req.Authority {
return nil, errors.Wrapf(gov.ErrInvalidSigner, "expected %s got %s", k.authority, req.Authority)
}

View File

@ -15,6 +15,18 @@ func (s *KeeperTestSuite) TestSoftwareUpgrade() {
expectErr bool
errMsg string
}{
{
"invalid authority address",
&types.MsgSoftwareUpgrade{
Authority: "authority",
Plan: types.Plan{
Name: "all-good",
Height: 123450000,
},
},
true,
"authority: decoding bech32 failed",
},
{
"unauthorized authority address",
&types.MsgSoftwareUpgrade{
@ -85,6 +97,14 @@ func (s *KeeperTestSuite) TestCancelUpgrade() {
expectErr bool
errMsg string
}{
{
"invalid authority address",
&types.MsgCancelUpgrade{
Authority: "authority",
},
true,
"authority: decoding bech32 failed",
},
{
"unauthorized authority address",
&types.MsgCancelUpgrade{

View File

@ -1,8 +1,6 @@
package types
import (
errorsmod "cosmossdk.io/errors"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx"
)
@ -17,19 +15,6 @@ func (m MsgSoftwareUpgrade) GetSignBytes() []byte {
return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&m))
}
// ValidateBasic does a sanity check on the provided data.
func (m *MsgSoftwareUpgrade) ValidateBasic() error {
if _, err := sdk.AccAddressFromBech32(m.Authority); err != nil {
return errorsmod.Wrap(err, "authority")
}
if err := m.Plan.ValidateBasic(); err != nil {
return errorsmod.Wrap(err, "plan")
}
return nil
}
// GetSigners returns the expected signers for MsgSoftwareUpgrade.
func (m *MsgSoftwareUpgrade) GetSigners() []sdk.AccAddress {
addr, _ := sdk.AccAddressFromBech32(m.Authority)
@ -41,15 +26,6 @@ func (m MsgCancelUpgrade) GetSignBytes() []byte {
return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&m))
}
// ValidateBasic does a sanity check on the provided data.
func (m *MsgCancelUpgrade) ValidateBasic() error {
if _, err := sdk.AccAddressFromBech32(m.Authority); err != nil {
return errorsmod.Wrap(err, "authority")
}
return nil
}
// GetSigners returns the expected signers for MsgCancelUpgrade.
func (m *MsgCancelUpgrade) GetSigners() []sdk.AccAddress {
addr, _ := sdk.AccAddressFromBech32(m.Authority)

View File

@ -1,108 +0,0 @@
package types_test
import (
"testing"
"github.com/stretchr/testify/require"
"cosmossdk.io/x/upgrade/types"
sdk "github.com/cosmos/cosmos-sdk/types"
)
var authority = sdk.AccAddress("authority")
func TestMsgSoftwareUpgrade(t *testing.T) {
testCases := []struct {
name string
msg *types.MsgSoftwareUpgrade
expErr bool
errMsg string
}{
{
"invalid authority address",
&types.MsgSoftwareUpgrade{
Authority: "authority",
Plan: types.Plan{
Name: "all-good",
Height: 123450000,
},
},
true,
"authority: decoding bech32 failed",
},
{
"invalid plan",
&types.MsgSoftwareUpgrade{
Authority: authority.String(),
Plan: types.Plan{
Height: 123450000,
},
},
true,
"plan",
},
{
"all good",
&types.MsgSoftwareUpgrade{
Authority: authority.String(),
Plan: types.Plan{
Name: "all-good",
Height: 123450000,
},
},
false,
"",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
err := tc.msg.ValidateBasic()
if tc.expErr {
require.Error(t, err)
require.Contains(t, err.Error(), tc.errMsg)
} else {
require.NoError(t, err)
}
})
}
}
func TestMsgCancelUpgrade(t *testing.T) {
testCases := []struct {
name string
msg *types.MsgCancelUpgrade
expErr bool
errMsg string
}{
{
"invalid authority address",
&types.MsgCancelUpgrade{
Authority: "authority",
},
true,
"authority: decoding bech32 failed",
},
{
"all good",
&types.MsgCancelUpgrade{
Authority: authority.String(),
},
false,
"",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
err := tc.msg.ValidateBasic()
if tc.expErr {
require.Error(t, err)
require.Contains(t, err.Error(), tc.errMsg)
} else {
require.NoError(t, err)
}
})
}
}