diff --git a/x/gov/keeper/msg_server.go b/x/gov/keeper/msg_server.go index 86490944..df4036b7 100644 --- a/x/gov/keeper/msg_server.go +++ b/x/gov/keeper/msg_server.go @@ -13,6 +13,7 @@ import ( type msgServer struct { sdkv1.MsgServer + keeper *Keeper } // NewMsgServerImpl returns an implementation of the gov MsgServer interface @@ -20,11 +21,27 @@ type msgServer struct { // We return an private type, as we do not want to do type casting in module. // Making it public adds no benefits. func NewMsgServerImpl(k *Keeper) *msgServer { - return &msgServer{MsgServer: govkeeper.NewMsgServerImpl(k.Keeper)} + return &msgServer{ + MsgServer: govkeeper.NewMsgServerImpl(k.Keeper), + keeper: k, + } } var _ v1.MsgServer = msgServer{} +func mergeLegacyParamsWithSDKParams(current sdkv1.Params, legacy *v1.Params) sdkv1.Params { + updated := v1.ConvertAtomOneParamsToSDK(legacy) + if updated == nil { + return current + } + + // atomone.gov.v1 cannot express these SDK-only fields, so preserve the live values. + updated.ProposalCancelRatio = current.ProposalCancelRatio + updated.ProposalCancelDest = current.ProposalCancelDest + + return *updated +} + // SubmitProposal implements the MsgServer.SubmitProposal method. func (k msgServer) SubmitProposal(ctx context.Context, msg *v1.MsgSubmitProposal) (*v1.MsgSubmitProposalResponse, error) { result, err := k.MsgServer.SubmitProposal(ctx, &sdkv1.MsgSubmitProposal{ @@ -103,9 +120,14 @@ func (k msgServer) Deposit(ctx context.Context, msg *v1.MsgDeposit) (*v1.MsgDepo // UpdateParams implements the MsgServer.UpdateParams method. func (k msgServer) UpdateParams(ctx context.Context, msg *v1.MsgUpdateParams) (*v1.MsgUpdateParamsResponse, error) { - _, err := k.MsgServer.UpdateParams(ctx, &sdkv1.MsgUpdateParams{ + currentParams, err := k.keeper.Params.Get(ctx) + if err != nil { + return nil, err + } + + _, err = k.MsgServer.UpdateParams(ctx, &sdkv1.MsgUpdateParams{ Authority: msg.GetAuthority(), - Params: *v1.ConvertAtomOneParamsToSDK(&msg.Params), + Params: mergeLegacyParamsWithSDKParams(currentParams, &msg.Params), }) if err != nil { return nil, err diff --git a/x/gov/keeper/msg_server_test.go b/x/gov/keeper/msg_server_test.go new file mode 100644 index 00000000..e17b88c8 --- /dev/null +++ b/x/gov/keeper/msg_server_test.go @@ -0,0 +1,24 @@ +package keeper + +import ( + "testing" + + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + sdkv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + "github.com/stretchr/testify/require" + + v1 "github.com/atomone-hub/atomone/x/gov/types/v1" +) + +func TestMergeLegacyParamsWithSDKParamsPreservesSDKOnlyFields(t *testing.T) { + current := sdkv1.DefaultParams() + current.ProposalCancelRatio = "0.42" + current.ProposalCancelDest = authtypes.NewModuleAddress("distribution").String() + legacy := v1.DefaultParams() + + merged := mergeLegacyParamsWithSDKParams(current, &legacy) + + require.Equal(t, current.ProposalCancelRatio, merged.ProposalCancelRatio) + require.Equal(t, current.ProposalCancelDest, merged.ProposalCancelDest) + require.NoError(t, merged.ValidateBasic()) +} diff --git a/x/gov/types/v1/wrapper.go b/x/gov/types/v1/wrapper.go index 9b79ebcb..c58d63d0 100644 --- a/x/gov/types/v1/wrapper.go +++ b/x/gov/types/v1/wrapper.go @@ -424,6 +424,8 @@ func ConvertAtomOneParamsToSDK(atomoneParams *Params) *sdkv1.Params { return nil } + defaultParams := sdkv1.DefaultParams() + return &sdkv1.Params{ MinDeposit: atomoneParams.MinDeposit, MaxDepositPeriod: atomoneParams.MaxDepositPeriod, @@ -431,6 +433,8 @@ func ConvertAtomOneParamsToSDK(atomoneParams *Params) *sdkv1.Params { Quorum: atomoneParams.Quorum, Threshold: atomoneParams.Threshold, MinInitialDepositRatio: atomoneParams.MinInitialDepositRatio, + ProposalCancelRatio: defaultParams.ProposalCancelRatio, + ProposalCancelDest: defaultParams.ProposalCancelDest, BurnVoteQuorum: atomoneParams.BurnVoteQuorum, BurnProposalDepositPrevote: atomoneParams.BurnProposalDepositPrevote, MinDepositRatio: atomoneParams.MinDepositRatio, diff --git a/x/gov/types/v1/wrapper_test.go b/x/gov/types/v1/wrapper_test.go new file mode 100644 index 00000000..0561b0af --- /dev/null +++ b/x/gov/types/v1/wrapper_test.go @@ -0,0 +1,19 @@ +package v1 + +import ( + "testing" + + sdkv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + "github.com/stretchr/testify/require" +) + +func TestConvertAtomOneParamsToSDKUsesSDKCancelDefaults(t *testing.T) { + params := DefaultParams() + + sdkParams := ConvertAtomOneParamsToSDK(¶ms) + defaultParams := sdkv1.DefaultParams() + + require.Equal(t, defaultParams.ProposalCancelRatio, sdkParams.ProposalCancelRatio) + require.Equal(t, defaultParams.ProposalCancelDest, sdkParams.ProposalCancelDest) + require.NoError(t, sdkParams.ValidateBasic()) +}