From 109e6ea2e731de58c688dcef40f847cdc543c667 Mon Sep 17 00:00:00 2001 From: Pantani Date: Wed, 18 Mar 2026 03:32:08 -0300 Subject: [PATCH 1/2] fix(gov): preserve SDK-only params in legacy updates and use SDK cancel defaults in v4 --- app/upgrades/v4/upgrades.go | 18 ++++++++++-------- app/upgrades/v4/upgrades_test.go | 22 ++++++++++++++++++++++ x/gov/keeper/msg_server.go | 28 +++++++++++++++++++++++++--- x/gov/keeper/msg_server_test.go | 24 ++++++++++++++++++++++++ x/gov/types/v1/wrapper.go | 4 ++++ x/gov/types/v1/wrapper_test.go | 19 +++++++++++++++++++ 6 files changed, 104 insertions(+), 11 deletions(-) create mode 100644 app/upgrades/v4/upgrades_test.go create mode 100644 x/gov/keeper/msg_server_test.go create mode 100644 x/gov/types/v1/wrapper_test.go diff --git a/app/upgrades/v4/upgrades.go b/app/upgrades/v4/upgrades.go index 4565d3c93..c99c04105 100644 --- a/app/upgrades/v4/upgrades.go +++ b/app/upgrades/v4/upgrades.go @@ -14,7 +14,6 @@ import ( "github.com/cosmos/cosmos-sdk/runtime" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" sdkgov "github.com/cosmos/cosmos-sdk/x/gov/types" sdkgovv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" @@ -108,13 +107,7 @@ func migrateParams(ctx context.Context, cdc codec.Codec, govKeeper *govkeeper.Ke return fmt.Errorf("failed to get params: %w", err) } - // Set new params fields to default values - defaultParams := sdkgovv1.DefaultParams() - params.ProposalCancelRatio = defaultParams.ProposalCancelRatio - params.ProposalCancelDest = authtypes.NewModuleAddress(sdkgov.ModuleName).String() - params.MinDepositRatio = defaultParams.MinDepositRatio - params.GovernorStatusChangePeriod = defaultParams.GovernorStatusChangePeriod - params.MinGovernorSelfDelegation = math.NewInt(10000_000000).String() // to be eligible as governor must have 10K ATONE staked + setNewGovParamDefaults(¶ms) if err := govKeeper.Params.Set(ctx, params); err != nil { return fmt.Errorf("failed to set gov params: %w", err) @@ -123,6 +116,15 @@ func migrateParams(ctx context.Context, cdc codec.Codec, govKeeper *govkeeper.Ke return nil } +func setNewGovParamDefaults(params *sdkgovv1.Params) { + defaultParams := sdkgovv1.DefaultParams() + params.ProposalCancelRatio = defaultParams.ProposalCancelRatio + params.ProposalCancelDest = defaultParams.ProposalCancelDest + params.MinDepositRatio = defaultParams.MinDepositRatio + params.GovernorStatusChangePeriod = defaultParams.GovernorStatusChangePeriod + params.MinGovernorSelfDelegation = math.NewInt(10000_000000).String() // to be eligible as governor must have 10K ATONE staked +} + // migrateDeposits migrates Deposits from atomone.gov.v1 to cosmos.gov.v1. func migrateDeposits(ctx context.Context, cdc codec.Codec, govKeeper *govkeeper.Keeper, sb *collections.SchemaBuilder) error { depositsMap := collections.NewMap( diff --git a/app/upgrades/v4/upgrades_test.go b/app/upgrades/v4/upgrades_test.go new file mode 100644 index 000000000..307d73281 --- /dev/null +++ b/app/upgrades/v4/upgrades_test.go @@ -0,0 +1,22 @@ +package v4 + +import ( + "testing" + + "cosmossdk.io/math" + sdkgovv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + "github.com/stretchr/testify/require" +) + +func TestSetNewGovParamDefaultsUsesSDKDefaults(t *testing.T) { + var params sdkgovv1.Params + + setNewGovParamDefaults(¶ms) + + defaultParams := sdkgovv1.DefaultParams() + require.Equal(t, defaultParams.ProposalCancelRatio, params.ProposalCancelRatio) + require.Equal(t, defaultParams.ProposalCancelDest, params.ProposalCancelDest) + require.Equal(t, defaultParams.MinDepositRatio, params.MinDepositRatio) + require.Equal(t, defaultParams.GovernorStatusChangePeriod, params.GovernorStatusChangePeriod) + require.Equal(t, math.NewInt(10000_000000).String(), params.MinGovernorSelfDelegation) +} diff --git a/x/gov/keeper/msg_server.go b/x/gov/keeper/msg_server.go index 864909441..df4036b78 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 000000000..e17b88c82 --- /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 9b79ebcb0..c58d63d00 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 000000000..0561b0afe --- /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()) +} From 435cb13e419bb07324d572bd2ede52055e76b958 Mon Sep 17 00:00:00 2001 From: Pantani Date: Wed, 25 Mar 2026 20:37:31 -0300 Subject: [PATCH 2/2] rollback `app/upgrades/v4/` --- app/upgrades/v4/upgrades.go | 18 ++++++++---------- app/upgrades/v4/upgrades_test.go | 22 ---------------------- 2 files changed, 8 insertions(+), 32 deletions(-) delete mode 100644 app/upgrades/v4/upgrades_test.go diff --git a/app/upgrades/v4/upgrades.go b/app/upgrades/v4/upgrades.go index c99c04105..4565d3c93 100644 --- a/app/upgrades/v4/upgrades.go +++ b/app/upgrades/v4/upgrades.go @@ -14,6 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/runtime" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" sdkgov "github.com/cosmos/cosmos-sdk/x/gov/types" sdkgovv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" @@ -107,7 +108,13 @@ func migrateParams(ctx context.Context, cdc codec.Codec, govKeeper *govkeeper.Ke return fmt.Errorf("failed to get params: %w", err) } - setNewGovParamDefaults(¶ms) + // Set new params fields to default values + defaultParams := sdkgovv1.DefaultParams() + params.ProposalCancelRatio = defaultParams.ProposalCancelRatio + params.ProposalCancelDest = authtypes.NewModuleAddress(sdkgov.ModuleName).String() + params.MinDepositRatio = defaultParams.MinDepositRatio + params.GovernorStatusChangePeriod = defaultParams.GovernorStatusChangePeriod + params.MinGovernorSelfDelegation = math.NewInt(10000_000000).String() // to be eligible as governor must have 10K ATONE staked if err := govKeeper.Params.Set(ctx, params); err != nil { return fmt.Errorf("failed to set gov params: %w", err) @@ -116,15 +123,6 @@ func migrateParams(ctx context.Context, cdc codec.Codec, govKeeper *govkeeper.Ke return nil } -func setNewGovParamDefaults(params *sdkgovv1.Params) { - defaultParams := sdkgovv1.DefaultParams() - params.ProposalCancelRatio = defaultParams.ProposalCancelRatio - params.ProposalCancelDest = defaultParams.ProposalCancelDest - params.MinDepositRatio = defaultParams.MinDepositRatio - params.GovernorStatusChangePeriod = defaultParams.GovernorStatusChangePeriod - params.MinGovernorSelfDelegation = math.NewInt(10000_000000).String() // to be eligible as governor must have 10K ATONE staked -} - // migrateDeposits migrates Deposits from atomone.gov.v1 to cosmos.gov.v1. func migrateDeposits(ctx context.Context, cdc codec.Codec, govKeeper *govkeeper.Keeper, sb *collections.SchemaBuilder) error { depositsMap := collections.NewMap( diff --git a/app/upgrades/v4/upgrades_test.go b/app/upgrades/v4/upgrades_test.go deleted file mode 100644 index 307d73281..000000000 --- a/app/upgrades/v4/upgrades_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package v4 - -import ( - "testing" - - "cosmossdk.io/math" - sdkgovv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - "github.com/stretchr/testify/require" -) - -func TestSetNewGovParamDefaultsUsesSDKDefaults(t *testing.T) { - var params sdkgovv1.Params - - setNewGovParamDefaults(¶ms) - - defaultParams := sdkgovv1.DefaultParams() - require.Equal(t, defaultParams.ProposalCancelRatio, params.ProposalCancelRatio) - require.Equal(t, defaultParams.ProposalCancelDest, params.ProposalCancelDest) - require.Equal(t, defaultParams.MinDepositRatio, params.MinDepositRatio) - require.Equal(t, defaultParams.GovernorStatusChangePeriod, params.GovernorStatusChangePeriod) - require.Equal(t, math.NewInt(10000_000000).String(), params.MinGovernorSelfDelegation) -}